【发布时间】:2020-04-20 15:07:21
【问题描述】:
所以基本上,我有一个谓词common_elements(List1,List2),这个谓词的目的是检查List1是否至少有一个属于List2的元素。
例子:
?- common_elements([1,2,3,4,5,6],[6]).
true.
?- common_elements([1,2,3],[2]).
true.
?- common_elements([1,2,3],[6]).
false.
?- common_elements([P1,P2,P3,P4,P5,P6],[P7,P8,P6]).
true.
所以对于数字来说这很好用,但是如果我输入变量,它会统一变量而不是检查它们是否在第二个列表中。
例子:
?- common_elements([1,2,3],[2]).
true.
?- common_elements([1,2,3],[6]).
false.
?- common_elements([P1,P2,P3,P4,P5,P6],[P7,P8,P6]).
P1 = P7.
所以你可以看到数字它工作得很好,但是由于某种原因,如果类型变量它统一它们而不是仅仅比较它们并且似乎你不明白为什么。
程序:
common_elements(L1,L2) :- common_elements(L1,L2,[]).
common_elements([],_,AC) :- length(AC,C),
C >= 1.
common_elements([P|_],L2,AC) :- member(P,L2),!,
append(AC,[P],NAC),
common_elements([],L2,NAC).
common_elements([P|R],L2,AC) :- \+ member(P,L2),!,
common_elements(R,L2,AC).
【问题讨论】:
-
因为
member/2会统一元素。