使用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的观点。如果您将列表视为集合,并且由于集合是“无序的”,那么您应该能够使用列表排序,这在处理方面是一个优势。