2014-03-31 51 views
1

我想知道如何確定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

感謝您的回覆。我仍然是虛假的,不知道我缺少什麼。我更新了這篇文章。謝謝。 – pdf2e

+0

你正在使用變量而不是原子。嘗試'intersect([a,b,c,d],[e,f,g,h])。'如果使用變量,Prolog會說他們可以相交,因爲它可以將'A'與'E '例如,他們是變數。變量以大寫字母開頭。原子(「常數」)以小寫字母開頭。 – lurker

+0

這是問題所在。謝謝。 – pdf2e

回答

2

一種更有效的解決方案(通常)與計算的兩個列表的交集相比是儘快失敗作爲共同的元件被發現:

empty_intersection(List1, List2) :- 
    \+ (member(Element, List1), member(Element, List2)). 
+0

糟糕。固定。謝謝。 –

3

保持純潔!這是一樣容易1,2,3:

  1. 使用maplist/2dif/2),我們定義list_nonmember/2
 
    list_nonmember(Xs,E) :- 
     maplist(dif(E),Xs). 
  • 使用maplist/2list_nonmember/2,我們定義爲none_intersect/2
  •  
        none_intersect(Xs,Ys) :- 
         maplist(list_nonmember(Ys),Xs). 
    
    1. 準備出發!讓我們運行一些查詢!
    ​​