2016-04-23 7 views
1

Ich habe diese Frage gestellt zu haben:Wie mehrere Dinge in Prolog zurückzukehren

Erstellen Sie eine Regel Mahlzeit (X, Y), wobei X Mittag- oder Abendessen ist und Y ist das Essen, das serviert wird. Zum Beispiel, Mahlzeit (Mittagessen, X) sollte Sandwhich, Chips und Limonade zurückgeben.

Ich bin neu bei Prolog, was genau bedeutet es, etwas zurückzugeben? Ich wurde nicht gebeten, etwas zurückzugeben, geschweige denn mehrere Dinge.

Was ich habe:

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

Wenn Sie Ihre Fakten in Prolog eingeben, können Sie Anrufe versuchen und sehen, wie es „gibt“ Dinge. Probieren Sie "entry (lunch, X)" und Sie erhalten "X = Sandwich", so dass der Aufruf "X = Sandwich" zurückgibt. Wenn du 'meal (lunch, X) 'nennst, kann' meal/2' mit einer oder mehreren verschiedenen Instanzen von 'X' erfolgreich sein. In diesem speziellen Fall klingt es so, als würde "X" eine ganze * Mahlzeit * definieren, in diesem Fall könnte es entweder eine Liste sein (zum Beispiel "Sandwich, Chips, Limonade") oder ein benutzerdefinierter Begriff, wie "Portionen" (Sandwich, Pommes, Limonade). "Deine Wahl. – lurker

Antwort

2

Ich bin sehr neu Prolog mich, aber ich hoffe, helfen kann. Erstens, als Anmerkung zum Wortlaut sagt "Prolog" nichts wirklich "zurück". Sie haben Ziele, die entweder erfolgreich sind oder fehlschlagen. Wenn Sie jedoch einen Parameter übergeben, bei dem es sich um eine unifizierte Variable handelt (die Variable wurde nicht an irgendetwas gebunden), wird versucht, einen korrekten Wert für diese Variable zu finden. Wenn es erfolgreich ist, wird es den Wert "zurückgeben". Wenn das Ziel fehlschlägt, dann erhalten Sie ein "falsch" oder "nein" (ich glaube, die beiden meinen dasselbe und hängen nur davon ab, welche Version von Prolog Sie verwenden).

Wie lurker in seinem/ihrem Kommentar notiert, könnte die Antwort von in welcher Form Ihr Professor möchte, dass Sie das Essen, das serviert wird, zu präsentieren. Du könntest den Vorschlag von Lurker nehmen, X zu einer Liste oder einem benutzerdefinierten Begriff zu machen (ich kenne den Letzten nicht). Oder eine andere Art und Weise, dies zu tun wäre:

(korrigierte ich Ihre Schreibweise „Entree“, war es nur mich persönlich 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). 

Wenn Sie Ihr Prädikat nennen, manchmal gibt es mehrere mögliche Werte für die Variable, nach der Sie suchen. Wenn in diesem Fall der erste Wert für Ihre Variable gefunden wurde, sollten Sie das Semikolon eingeben können, um nach dem Rest zu suchen, bis keine weiteren Werte mehr vorhanden sind. Dies kann eine Möglichkeit sein, mehrere Werte "zurückzugeben".

Jetzt, wenn Sie meal(lunch, Y). aufrufen, wird dies zuerst Y finden, um "Sandwich" zu sein. Du bist zur ersten Regel gekommen und hast einen Wert für Y gefunden, da ein Vorspeise zum Mittagessen Sandwich ist. Sobald Sie drücken, wird es weiter versuchen, mehr Werte für Y zu finden. Für die erste Regel gibt es keine Werte mehr für Y - es gibt nur ein Hauptgericht für das Mittagessen, wenn Sie jedoch mehr hinzufügen (zB entree(lunch, pasta).) würde es finden mehr Vorspeisen. Es wird mit der zweiten Regel fortfahren und versuchen, die Seite für Y zu finden, danach das Getränk für Y, usw., auf genau die gleiche Weise. Unter Verwendung des obigen Code:

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