2017-03-05 12 views
2

ich die folgende Regel in Prolog definieren wollen:Wie definieren einfache Regel in Prolog

wenn X dürstet, X in die Bar gehen sollte.

nach, würde ich Prolog thirsty(X) stellen und Prolog sollte unterwegs (bar) zurück geben

ich es auf die folgende Art und Weise versucht habe:

go(Y). 
thirsty(X) :- go(bar). 

Aber wenn ich es teste mit

thirsty(bob). 

Das Ergebnis wird nur true sein. Kann mir jemand helfen, was ich ändern muss, um go(bar) als Ergebnis zu bekommen?

Antwort

1

wenn X ist durstig, X sollte in die Bar gehen.

am ersten Teil dieses Satzes der Suche „, wenn X durstig ist“, gibt es eindeutig eine Eigenschaft durstig, dass X haben kann, so klingt thirsty wie ein gutes Prädikat (thirsty(X) bedeutet X Durst).

Dann gibt es ein paar Möglichkeiten, um auf den zweiten Teil des Satzes zu schauen, "X sollte in die Bar gehen", werde ich einige unten in der Reihenfolge der zunehmenden Komplexität mit dem letzten was ich denke, Sie wollen:

  1. einer ist, dass „in die Bar gehen sollte“ ist eine Eigenschaft von X, in welchem ​​Fall man das Prädikat should_go_to_the_bar als Prädikat definieren kann, so dass should_go_to_the_bar(X) bedeutet X in die Bar gehen sollte.

Dann kann Ihr Programm sein:

thirsty(bob). 
should_go_to_the_bar(X) :- thirsty(X). 

?- should_go_to_the_bar(bob). 
True 
  1. Ein weiterer Grund ist, dass „gehen sollte, um“ eine Beziehung zwischen X sein kann und the_bar, so dass should_go_to(X, the_bar) bedeutet, dass X the_bar gehen sollte.

Dann können Sie Ihr Programm sein:

thirsty(bob). 
should_go_to_the_bar(X, the_bar) :- thirsty(X). 

?- should_go_to(bob, X). 
X = the_bar 
  1. Ein weiterer Grund ist, dass "sollte" eine Eigenschaft von Aktionen wie go_to(X, the_bar) sein können, so dass should(go_to(the_bar)), dass es bedeutet, sollte sei das go_to (X, the_bar).

Dann können Sie Ihr Programm sein:

thirsty(bob). 
should(go_to(X, the_bar)) :- thirsty(X). 

?- should(X). 
X = should(go_to(bob, the_bar)) 
  1. Lese ich in gehen, ist, dass "sollte" X eine Beziehung zwischen einer Person sein kann, und eine Aktion sie können wie go_to(X, the_bar) tun, so dass should(X, go_to(X, the_bar) bedeutet, dass X (X, the_bar), dh X go_to sollte sollte es wahr machen, dass „X an die Bar geht“

Dann können sie Ihr Programm sein.

thirsty(bob). 
should(X, go_to(X, the_bar)) :- thirsty(X). 

?- should(bob, Action). 
Action = go_to(bob, the_bar) 

Ich denke, dass diese letzte Interpretation am nächsten ist, was Sie wollen.

+1

Wenn ich dein letztes Programm versuche, bekomme ich immer eine Fehlermeldung: 'Undefined procedure: durstig/1' Kannst du mir helfen, das zu lösen? – BennoDual

+0

@Bennodual Ja Entschuldigung, ich habe einen Fehler gemacht, da 'durstig (bob)' eine Tatsache ist, von der Sie annehmen, dass sie wahr ist, sollte es im Programm sein (und nicht die Abfrage, wie ich vorher geschrieben hatte). Jetzt funktioniert es wie beabsichtigt. Es ist im Programm erklärt, dass Bob durstig ist und die erklärte Beziehung zu dem, was er tun soll, und die Abfrage fragt dann, was Bob tun soll. –

+0

- Vielen Dank für Ihre letzte Antwort. Es funktioniert jetzt auf diesem Weg. Noch eine kleine Frage: Kann ich das Programm (ohne 'durstig (bob)') mit consult() laden und nachträglich 'durstig (bob)' hinzufügen (und danach entfernen)? – BennoDual

3

go(Y). in der Regel nicht wirklich etwas bedeuten, außer überall vielleicht gehen. Wenn Sie Regeln in Prolog anwenden, sollten Sie ihnen eine semantische Bedeutung zuweisen können. Ihre Regel sagt, Wenn X ist durstig, dann ist die bar ist ein Ort zu gehen, die natürlich immer erfolgreich seit bar ist immer ein Ort zu gehen, als auch jeden anderen Ort, den Sie möglicherweise nach Ihrer Regel gehen möchten, go(Y). Da Sie X nirgendwo in Ihrem Prädikat-Klauselkörper thirsty(X) verwendet haben, wird es nie verwendet (also haben Sie wahrscheinlich eine Singleton Variable Warnung darüber gesehen).

Um eine gute Regel in Prolog zu definieren, müssen Sie zuerst Ihre Regel auf eine sinnvolle Weise definieren. Vielleicht eine vernünftige Regel eine Person beteiligt sein könnte:

Person geht an die Bar wennPerson durstig ist.

Dies könnte wie folgt ausgedrückt werden:

go_bar(Person) :- thirsty(Person). 

oder allgemeiner

goes(Person, bar) :- thirsty(Person). 
goes(Person, restaurant) :- hungry(Person). 

Dann brauchen Sie würden einige Fakten über die Person geltend zu machen (oder den Benutzer für diese Fakten abfragen):

thirsty(bob). 

Mit dieser Tatsache behauptet, die foll aufgrund Abfrage kann zur Folge haben:

?- goes(bob, X). 
X = bar 
Verwandte Themen