2017-05-11 36 views
1

所以我在我的Prolog程序大約有一個名字餐館和它的工作的人,其服務的餐點這個數據庫:在序言語言如何不重複的結果

restaurant(hardees,[abo_abdo,abo_ahmad,tahseen],[grilled_chicken,jambo_beef,grilled_cheese_sandwich,roast_beef]). 

restaurant(subway,[eftikar,tahseen,samer],[potato_salad,chicken_rice,jambo_beef,srevice_dish]). 

restaurant(mcDonalds,[amer,zaher,maher],[service_dish,beef_stew,potato_corn,grilled_chicken,roast_beef]). 

restaurant(kfc,[mufeed,mazen,izdihar,maher],[mushroom_rice,service_dish,jambo_beef]). 

,我想知道是否有多餐廳的餐點。

我有這樣的指令(和應該只有該指令一個參數):

multi_available(X):- restaurant(Y1,_,Z1),member(X,Z1), 
restaurant(Y2,_,Z2),Y1 \= Y2 ,member(X,Z2). 

而且它提出這些結果:

multi_available(X). 
X = grilled_chicken ; 
X = jambo_beef ; 
X = jambo_beef ; 
X = roast_beef ; 
X = jambo_beef ; 
X = jambo_beef ; 
X = service_dish ; 
X = grilled_chicken ; 
X = roast_beef ; 
X = service_dish ; 
X = jambo_beef ; 
X = jambo_beef ; 

我怎麼能有我的結果不重複。 非常感謝

+0

使用'setof/3' .. –

回答

0

傳統的方法是使用setof/3findall/3sort/2。然而,兩者都會導致首先計算所有答案,然後您會得到答案列表。您可以使用member/2再次將其轉換爲可滿足的目標。

SWI-Prolog的提供library(solution_sequences),它提供了從SQL已知的運營商,如distinct/1,2limit/2offset/2等利用這一點,你只需撥打

?- distinct(multi_available(X)). 

這確保了變化方案中被刪除,給出第一個答案,因爲它變得可用,並且不會在答案和列表之間切換,因此您可以輕鬆創建更復雜的查詢。

+0

非常感謝它完美的工作:) –