Hier ist ein anderer Ansatz, mit dem repeat/0
Prädikat zusammen mit fail/0
. repeat/0
ist einfach erfolgreich, was es ermöglicht, während des Backtracking nach Lösungen zu suchen. Und fail/0
schlägt immer fehl, was Backtracking erzwingt. Es ist eine gebräuchliche Art, eine kontinuierliche Wiederholungsschleife zu erstellen, und eignet sich gut zum Wiederholen eines Menüs. Ich habe auch die nl/0
Verwendung ein wenig angepasst, um die Ausgabe ein wenig sauberer zu machen, und ich habe time/2
umbenannt, da es einfach zu generisch ist und möglicherweise mit einem Systemprädikat kollidieren könnte.
item_time(office_hour,1).
item_time(office_hour,2).
menu1 :-
repeat,
nl, write('Input time'), nl,
read(Y),
item_time(Y, X),
write(X), nl,
fail.
Dies ergeben:
| ?- menu1.
Input time
office_hour.
1
2
Input time
foo.
Input time
...
Was hier passiert, ist, dass fail/0
wird das Prädikat Klausel verursachen die write(X), nl
und zum time(Y, X)
zurückzuverfolgen, durch die mit den alternativen Lösungen treffen werden, auf denen gelingen Lösungen, und dann wieder auf die write(X), nl
gehen. Wenn time(Y, X)
keine Lösungen mehr findet, schlägt es schließlich fehl und die Klausel rückt den gesamten Weg zurück zum repeat/0
Aufruf, der immer erfolgreich ist. Dies führt dazu, dass die Ausführung wieder auf nl, write('Input time'), ...
vorrückt.
Wie Sie sehen können, wird die Eingabe von etwas unerkannt nur noch einmal aufgefordert. Um dies zu vervollständigen, könnten Sie Atome hinzufügen, die als "ruhig" erkannt werden, und Sie könnten eine Diagnosemeldung schreiben, wenn Sie eine Eingabe erhalten, die in Ihrer Datenbank nicht existiert. Das wäre eine gute Übung zum Lernen.
Sie sollten auch ein Beispiel für das Verhalten posten. Vor allem, was gibst du ein? Wenn es nicht "office_hour" ist, wird "time/2" fehlschlagen, bevor es "menu1/0" aufruft. –
sry, ich habe meinen Beitrag bereits aktualisiert. Auch was ist das 'time/2' und' menu1/0'? Ich erinnere mich nicht an einen solchen Begriff von meinem Dozenten. – Kimchi
@Kimchi es ist in Prolog Dokumentation, wenn Sie es betrachten. Das '/ n' bedeutet' n' Argumente. Also ist "time/2" 'time' mit 2 Argumenten. Wenn es eine "Zeit" mit 3 Argumenten gäbe, wäre dies ein anderes Prädikat und wird als "time/3" beschrieben. – lurker