2016-04-23 63 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;