忽略最后一项的两个列表的序言组合
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.
我正在尝试获取两个列表的组合,忽略两者的最后一个元素。
代码:
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.