Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在prolog语言中不重复结果_Prolog - Fatal编程技术网

如何在prolog语言中不重复结果

如何在prolog语言中不重复结果,prolog,Prolog,因此,在我的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,sre

因此,在我的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).
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 ;
我怎样才能在没有重复的情况下得到结果呢。
非常感谢传统的方法是使用
setof/3
findall/3
sort/2
。然而,这两种方法都会首先计算所有答案,然后得到答案列表。您可以使用
member/2
再次将其转化为可满足的目标

SWI Prolog提供了
库(解决方案序列)
,它提供了从SQL中已知的运算符,例如
distinct/1,2
limit/2
offset/2
,等等。使用它,您只需调用

?- distinct(multi_available(X)).

它可以确保各种解决方案被删除,在可用时给出第一个答案,并且不会在答案和答案列表之间切换,因此您可以轻松创建更复杂的查询。

传统方法是使用
setof/3
findall/3
sort/2
。然而,这两种方法都会首先计算所有答案,然后得到答案列表。您可以使用
member/2
再次将其转化为可满足的目标

SWI Prolog提供了
库(解决方案序列)
,它提供了从SQL中已知的运算符,例如
distinct/1,2
limit/2
offset/2
,等等。使用它,您只需调用

?- distinct(multi_available(X)).

它可以确保删除不同的解决方案,并在可用时给出第一个答案,并且不会在答案和答案列表之间切换,因此您可以轻松创建更复杂的查询。

使用
setof/3
。使用
setof/3
。。