使用Prolog查找相交列表

使用Prolog查找相交列表,prolog,intersection,Prolog,Intersection,我在调试我的代码以查找两个列表之间的交集时遇到问题 例如: List1=[3,4,5,6]和 List2=[5,1,0,2,4] 因此,相交线将存储在列表3中将[4,5] 下面是Prolog的代码 任何帮助都将不胜感激 setIntersection([], [], []). setIntersection([], _, []). setIntersection([X|Xs], Y, [Z|W]) :- keepDuplicates(X, Y, [Z|Zs]), setInte

我在调试我的代码以查找两个列表之间的交集时遇到问题

例如:
List1=[3,4,5,6]
List2=[5,1,0,2,4]

因此,相交线将存储在
列表3中
[4,5]

下面是Prolog的代码

任何帮助都将不胜感激

setIntersection([], [], []).
setIntersection([], _, []).

setIntersection([X|Xs], Y, [Z|W]) :-
    keepDuplicates(X, Y, [Z|Zs]),
    setIntersection(Xs, Y, W).

keepDuplicates(_, [], []).
keepDuplicates([], _, []).
keepDuplicates([], [], []).

% Check if the head of the first list is not a match to the
% first head of the second list
keepDuplicates(G, [H|Hs], Line) :-
    G \= H,
    keepDuplicates(G, Hs, Line).

% Check if the head of the first list
% Does match to the head of the second list
keepDuplicates(G, [G|Gs], [G|NewLine]) :-
    keepDuplicates(G, Gs, NewLine).

Prolog中的
集合通常用排序列表表示,这样就避免了在出现重复元素时出现的表示的模糊性。让我们忽略这个问题

这一事实
setIntersection([],[],[])。
setIntersection([],u,[])所包含。
,然后可以(应该!)删除。
keepDuplicates([],[],[])也一样。
(为什么在这里颠倒子句顺序?)

您有一个单例Zs:
…,保持重复(X,Y,[Z | Zs]),…
,您应该注意该警告(当然,如果编译器显示它),因为它通常是真正错误的征兆

此外,该谓词不能覆盖所有情况:当X不在Y中时,与Z关联的是什么

说实话,我认为你做的比要求的要复杂。忽略重复项,整个过程可能很简单

?- L1=[3,4,5,6],L2=[5,1,0,2,4],findall(C, (member(C,L1),memberchk(C,L2)), I).

Prolog中的
集合通常用排序列表表示,这样就避免了在出现重复元素时出现的表示的模糊性。让我们忽略这个问题

这一事实
setIntersection([],[],[])。
setIntersection([],u,[])所包含。
,然后可以(应该!)删除。
keepDuplicates([],[],[])也一样。
(为什么在这里颠倒子句顺序?)

您有一个单例Zs:
…,保持重复(X,Y,[Z | Zs]),…
,您应该注意该警告(当然,如果编译器显示它),因为它通常是真正错误的征兆

此外,该谓词不能覆盖所有情况:当X不在Y中时,与Z关联的是什么

说实话,我认为你做的比要求的要复杂。忽略重复项,整个过程可能很简单

?- L1=[3,4,5,6],L2=[5,1,0,2,4],findall(C, (member(C,L1),memberchk(C,L2)), I).

Prolog中的
集合通常用排序列表表示,这样就避免了在出现重复元素时出现的表示的模糊性。让我们忽略这个问题

这一事实
setIntersection([],[],[])。
setIntersection([],u,[])所包含。
,然后可以(应该!)删除。
keepDuplicates([],[],[])也一样。
(为什么在这里颠倒子句顺序?)

您有一个单例Zs:
…,保持重复(X,Y,[Z | Zs]),…
,您应该注意该警告(当然,如果编译器显示它),因为它通常是真正错误的征兆

此外,该谓词不能覆盖所有情况:当X不在Y中时,与Z关联的是什么

说实话,我认为你做的比要求的要复杂。忽略重复项,整个过程可能很简单

?- L1=[3,4,5,6],L2=[5,1,0,2,4],findall(C, (member(C,L1),memberchk(C,L2)), I).

Prolog中的
集合通常用排序列表表示,这样就避免了在出现重复元素时出现的表示的模糊性。让我们忽略这个问题

这一事实
setIntersection([],[],[])。
setIntersection([],u,[])所包含。
,然后可以(应该!)删除。
keepDuplicates([],[],[])也一样。
(为什么在这里颠倒子句顺序?)

您有一个单例Zs:
…,保持重复(X,Y,[Z | Zs]),…
,您应该注意该警告(当然,如果编译器显示它),因为它通常是真正错误的征兆

此外,该谓词不能覆盖所有情况:当X不在Y中时,与Z关联的是什么

说实话,我认为你做的比要求的要复杂。忽略重复项,整个过程可能很简单

?- L1=[3,4,5,6],L2=[5,1,0,2,4],findall(C, (member(C,L1),memberchk(C,L2)), I).

您可以在相关问题“”中找到两个逻辑上纯粹、单调的列表交集和并集实现

让我们看一个示例查询:

?- list_list_intersection([3,4,5,6],[5,1,0,2,4],Intersection). Intersection = [4,5]. % succeeds deterministically
您可以在相关问题“”中找到两个逻辑上纯粹、单调的列表交集和并集实现

让我们看一个示例查询:

?- list_list_intersection([3,4,5,6],[5,1,0,2,4],Intersection). Intersection = [4,5]. % succeeds deterministically
您可以在相关问题“”中找到两个逻辑上纯粹、单调的列表交集和并集实现

让我们看一个示例查询:

?- list_list_intersection([3,4,5,6],[5,1,0,2,4],Intersection). Intersection = [4,5]. % succeeds deterministically
您可以在相关问题“”中找到两个逻辑上纯粹、单调的列表交集和并集实现

让我们看一个示例查询:

?- list_list_intersection([3,4,5,6],[5,1,0,2,4],Intersection). Intersection = [4,5]. % succeeds deterministically
首先对两个列表进行排序可能更容易;在这里()可以找到一个非常惯用的解决方案来寻找有序列表的交集。我同意@Boris的观点。如果您将列表视为集合,并且由于集合是“无序的”,那么您应该能够使用列表排序,这在处理中是一个优势;在这里()可以找到一个非常惯用的解决方案来寻找有序列表的交集。我同意@Boris的观点。如果您将列表视为集合,并且由于集合是“无序的”,那么您应该能够使用列表排序,这在处理中是一个优势;在这里()可以找到一个非常惯用的解决方案来寻找有序列表的交集。我同意@Boris的观点。如果您将列表视为集合,并且由于集合是“无序的”,那么您应该能够使用列表排序,这在处理中是一个优势;在这里()可以找到一个非常惯用的解决方案来寻找有序列表的交集。我同意@Boris的观点。如果您将列表视为集合,并且由于集合是“无序的”,那么您应该能够使用列表排序,这在处理方面是一个优势。