如何在Prolog中返回多个东西

时间:2016-04-23 22:19:01

标签: prolog return rules

我收到了这个问题:

创建规则餐(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) :-

1 个答案:

答案 0 :(得分:2)

我自己非常对Prolog很新,但我希望可以提供帮助。首先,作为一个关于措辞的说明,Prolog并没有真正"返回"任何东西。你有成功或失败的目标。话虽这么说,当你传入一个参数是一个未经统一的变量(该变量尚未绑定到任何东西)时,它将尝试为该变量找到一个正确的值。如果成功,它似乎会回归"价值。如果目标失败,那么你将收到一个" false"或"不" (我相信这两个意思相同,只取决于你正在使用的Prolog版本。)

潜伏者在评论中指出,答案可能取决于以什么形式,您的教授希望您提供将要服务的食物。你可以采取潜伏者的建议,使X成为一个列表或自定义术语(我不熟悉后者)。或者,另一种方法是:

(我更正了你的拼写#34;主菜,"这只是个人感激我)

/* 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;