2017-05-11 33 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

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