Prolog:确定两个列表的交集是否为空

时间:2014-03-31 13:52:57

标签: prolog

我正在试图弄清楚如何确定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,[]).

2 个答案:

答案 0 :(得分:3)

保持纯洁!它就像1,2,3一样简单:

  1. 使用 maplist/2dif/2),我们定义list_nonmember/2
  2.     list_nonmember(Xs,E) :-
           maplist(dif(E),Xs).
    
    1. 使用maplist/2list_nonmember/2,我们定义none_intersect/2
    2.     none_intersect(Xs,Ys) :-
             maplist(list_nonmember(Ys),Xs).
      
      1. 准备好了!让我们运行一些查询!
      2.     ?- 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)).