忽略最后一项的两个列表的序言组合

Prolog combinatoric of two lists ignoring the last items

我正在尝试获取两个列表的组合,忽略两者的最后一个元素。

代码:

isady(_, [_]) :-
    write('stop here'),
    nl,
    false.

isady(E, [H|T]) :-
    write(E),
    write('-'),
    write(H),
    nl,
    isady(E, T).

ady([_], _) :-
    write('stop here'),
    nl,
    false.

ady([H|T], L2) :-
    isady(H, L2);
    ady(T, L2).

输出:

?- ady([a,b,c], [d,e,f]).
a-d
a-e
stop here
a-f
b-d
b-e
stop here
b-f
stop here
c-d
c-e
stop here
c-f

预期输出:

?- ady([a,b,c], [d,e,f]).
a-d
a-e
b-d
b-e

如您所见,它不会在必须停止时停止,有人知道为什么吗?

试试这个:

isady(_, [_]) :-
    write('stop here'),
    nl,
    false.

isady(E, [H|T]) :- 
    T\=[],
    write(E),
    write('-'),
    write(H),
    nl,
    isady(E, T).

ady([_], _) :-
    write('stop here'),
    nl,
    false.

ady([H|T], L2) :- 
    T\=[],
    isady(H, L2);
    ady(T, L2).

新条件 T \= [] 将阻止使用两个列表的最后一个元素。

[编辑] 您还可以显式地将模式用于长度至少为 2 的列表,以避免使用长度为 1 的列表执行“步骤案例”子句:

isady(_, [_]).
isady(E, [X,Y|T]) :-
    writeln(E-X),
    isady(E,[Y|T]).

ady([_], _).
ady([X,Y|T], L) :-
    isady(X, L),
    ady([Y|T], L).

结果:

?- ady([a,b,c], [d,e,f]).
a-d
a-e
b-d
b-e
true ;
false.