2011-04-23 24 views
2
/* e */ 
union([A|B], C, D) :- member(A,C), !, union(B,C,D). 
union([A|B], C, [A|D]) :- union(B,C,D). 
union([],Z,Z). 

/* f */ 
intersection([A|B], C, D) :- member(A,C), !, intersection(B,C,D). 
intersection([A|B], C, [A|D]) :- intersection(B,C,D). 
intersection([],Z,[]). 

你們可以清楚地解釋這些表達式,可能在一棵樹,多謝。我很新的Prolog的:)序言 - 需要解釋的聯盟和交集

回答

4

我的序言中的內存是有點生疏,但我認爲它是這樣的:

工會規則基本上需要兩個列表,並返回它們的結合,例如。聯盟(列表1,列表2,UnionOfList1AndList2)

第一規則

union([A|B], C, D) :- member(A, C), !, union(B, C, D) 

這將匹配如果member(A, C)匹配(大概member(A, C)比賽如果C是含有結合到A中的值列表),!是切割如此如果我們達到這一點,我們不能從這裏追溯。然後,我們解決左側列表的其餘部分。

基本上我們說的是,如果List1的HEAD在List2中,那麼結果是List1的尾部與List2聯合的尾部的聯合。 (這在技術上是發生了什麼事的不正確的描述,但我敢肯定它會做:d)

union([A|B], C, [A|D]) :- union(B, C, D) 

鑑於我們已經處理了其中A在列表2,我們知道的情況下,此時A不是在List2中,所以我們將它加入到union(B,C,D)的「結果」中。

最後union([], Z, Z)是說如果List1爲空,則List1和List2的並集是List2。

交集規則並沒有實質性的差異。

+0

感謝您的回答,我只是在IRC中得到一個很好的解釋,它與您的回答非常相似:) – nXqd 2011-04-23 03:08:58