我需要找到列表 S1 和 S2 中都存在的元素,并且需要打印出这些元素 (R)。
问题是,当我输入 bendri([a,b,c,d],[d,b,e],R)
时,它返回正确的结果 [b,d]
,但它并没有停止。如果您按 ;符号,然后它继续再次检查并返回 b
,之后 - d
。
为什么会发生这种情况?它应该只返回 [b,d]
并结束其工作。
bendri(S1,S2,R) :-
skaiciavimai(S1,S2,R).
skaiciavimai([],_,[]).
skaiciavimai([First|Tail], S2, [First|Rest]) :-
member(First, S2),
skaiciavimai(Tail, S2, Rest).
skaiciavimai([_|Tail], S2, Rest) :-
skaiciavimai(Tail, S2, Rest).
最佳答案
您的问题是,即使第二个子句成功,skaiciavimai/3
的第三个子句也会成功回溯。我猜如果第二个子句成功,您想跳过第三个子句。
为此,您可以在第三个子句中添加检查:
skaiciavimai([First|Tail], S2, Rest) :-
\+ (member(First, S2)),
skaiciavimai(Tail, S2, Rest).
如果在 S2
中找到第一个列表的头部,则第三个子句将失败。
关于Prolog 两个列表交集 - 为什么它不断检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34069283/