我正在试图弄清楚如何确定Prolog中两个列表的交集是否为空。据我所知,这是他们没有共同点。我是Prolog的新手(截至昨晚)。任何帮助是极大的赞赏。
这是我的尝试:
% returns true if head is not a member of List?
intersection([],_).
intersection([Head|Tail],List) :-
\+ member(Head,List),
intersection(Tail,List).
第二次尝试:
?- intersect([A,B,C,D],[E,F,G,H]).
intersect(L1,L2) :-
intersection(L1,L2,[]).
mbratch的决议解决了这个问题。
解决方案:
?-intersect([a,b,c,d],[e,f,g,h]).
intersect(L1,L2):-
intersection(L1,L2,[]).
答案 0 :(得分:3)
保持纯洁!它就像1,2,3一样简单:
maplist/2
和dif/2
(prolog-dif),我们定义list_nonmember/2
:list_nonmember(Xs,E) :- maplist(dif(E),Xs).
maplist/2
和list_nonmember/2
,我们定义none_intersect/2
:none_intersect(Xs,Ys) :- maplist(list_nonmember(Ys),Xs).
?- none_intersect([a,b,c,d],[e,f,g,h]). true. ?- none_intersect([a,b,c,d],[e,f,a,g,h]). false. ?- none_intersect([a,b,g,c,d],[e,f,g,h]). false.
答案 1 :(得分:2)
与计算两个列表的交集相比,一个更有效的解决方案(通常)只要找到一个公共元素就会失败:
empty_intersection(List1, List2) :-
\+ (member(Element, List1), member(Element, List2)).