2016-04-23 64 views
1

我一直在考虑这个问题:如何返回多个事物的Prolog

创建一个规则餐(X,Y),其中X是午餐或晚餐和Y是要投放的食物。例如,餐(午餐,X)应该返回沙子,薯条和柠檬水。

我是Prolog的全新产品,那么返回什么意味着什么呢?我没有被要求回报任何东西,更不用说多个东西了。

我有什么:

/* facts */ 
entre(lunch, sandwich). 
entre(dinner, spaghetti). 

side(lunch, chips). 
side(dinner, bread). 

ingredient(chips, potato). 
ingredient(chips, salt). 
ingredient(bread, egg). 
ingredient(bread, flour). 

/* rules */ 
meal(X, Y) :- 
+2

如果你输入你的事实到Prolog,你可以尝试调用,看看它是如何“返回”的东西。尝试一下,“进入(午餐,X)”,你会得到'X =三明治',所以这个调用返回'X =三明治'。当你叫'饭(午餐,X)'时,'饭/ 2'可以通过一个或多个不同的'X'实例化。在这个特殊情况下,它听起来像'X'应该定义一个完整的餐点,在这种情况下,它可以是一个列表(例如'[sandwhich,chips,lemonade]'或者一个自定义的名词,例如'servings (三明治,薯片,柠檬水)'。您的选择。 – lurker

回答

2

非常新的Prolog自己,但我希望能有所帮助。首先,作为关于措辞的说明,Prolog并不真正“返回”任何东西。你有成功或失败的目标。这就是说,当你传入一个非统一变量的参数(变量没有被绑定到任何东西)时,它会尝试为该变量找到一个正确的值。如果成功,它似乎会“返回”价值。如果目标失败,那么您将收到“假”或“否”(我相信这两者意味着相同的事情,只取决于您使用的Prolog版本)。

正如lurker在他/她的评论中指出的那样,答案可能取决于您的教授希望您呈现将要送达的食物。你可以采取潜伏者的建议,让X成为一个列表或自定义术语(我不熟悉后者)。或者,另一种方式来做到这一点是:

(我纠正你的拼写“主菜”,它只是个人irking我)

/* facts */ 
entree(lunch, sandwich). 
entree(dinner, spaghetti). 

side(lunch, chips). 
side(dinner, bread). 

drink(lunch, lemonade). 
drink(dinner, water). 

/* rules */ 
meal(X, Y) :- entree(X, Y). 
meal(X, Y) :- side(X, Y). 
meal(X, Y) :- drink(X, Y). 

当你打电话给你的断言,有时有多个可能值对于你正在寻找的值的变量。在这种情况下,一旦找到变量的第一个值,您应该可以选择输入分号以继续搜索其余部分,直到没有更多可能的值。这可能是“返回”多个值的一种方式。

现在,如果你打电话meal(lunch, Y).这将首先发现Y是“三明治”。你已经达到了第一条规则,并且为Y找到了一个值,因为午餐的主菜是三明治。一旦你按下,它会继续尝试为Y找到更多的值。对于第一条规则,Y没有更多的值 - 午餐只有一个主菜,但如果你添加更多(例如entree(lunch, pasta).),它会发现更多的主菜。它会继续执行第二条规则,尝试为Y找到一面,然后以完全相同的方式找到Y等的饮料。使用上面的代码:

?- meal(lunch, Y). 
Y = sandwich ; 
Y = chips; 
Y = lemonade;