Prolog 两个列表交集 - 为什么它不断检查?

标签 prolog

我需要找到列表 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/

相关文章:

list - 计算一个数字在列表中出现的次数

Prolog 和列表统一

list - 如何从两个已经排序的列表中创建一个排序列表

prolog - 最好的 Prolog 编程实践和风格指南是什么?

prolog - 在 prolog 中表示线性函数

prolog - 关于 Prolog 中的平等和统一,我缺少什么?

database - Prolog:类似事务的功能?

algorithm - Prolog中DPLL算法的实现

prolog - Swi-Prolog : No permission to modify static procedure

list - 是否可以反转只有两个参数的列表?