Nach einer alten Sage soll die Welt untergehen, wenn jemand das Problem mit 100 Scheiben löst.
Die Ein- und Ausgabe soll zunächst im Hauptfenster von SWI-Prolog erfolgen, ohne die vielfältigen Möglichkeiten von Windows zu nutzen (wird später behandelt).
Für die Eingabe gibt es zwei Möglichkeiten:<
Die Ausgabe geschieht mit dem Prädikat write(A), wobei der Textinhalt des Parameters A im Hauptfenster ausgegeben wird. A kann auch direkt durch einen Text
ersetzt werden, der in ' eingeschlossen ist. write löst keinen Zeilenvorschub aus.
Soll der Rechner eine neue Zeile beginnen, so geschieht das mit dem Prädikat nl.
Hinweis: In SWI-Prolog gibt es weitere Varianten der Prädikate write und read, die u.a. die Bearbeitung von Dateien ermöglichen.
Um u.a. das Programm flexibler zu gestalten, werden wir Variablen verwenden, und zwar N für die Scheibenzahl, Q für die Bezeichnung des Quellstapels, von dem Scheiben genommen werden, Z für den Zielstapel, auf den
die Scheiben gelegt werden, und U für den dritten Stapel.
Es ist zudem N-1 zu berechnen. Berechnungen in Prolog geschehen in der Form
E is Term ,
wobei in der Variablen E das Ergebnis gespeichert wird.
|
ausg(N,Q,Z):-write('Scheibe '),write(N),write(' von '), write(Q),write(' nach '),write(Z),nl.
bewege(0,_,_,_).
hanoi(N) :- bewege(N,a,b,c). |
Ausgabe: Scheibe N von Stapel Q nach Stapel Z danach: neue Zeile
Prädikat bewege: Wenn 0 Scheiben, dann keine Aktion
Prädikat hanoi: Dient dem vereinfachten Progammstart, |
Hinweis: Rekursionen können in Prolog tückisch sein, da man vielfach nicht nachvollziehen kann, welche Klauseln wann benutzt werden.
Aufgabe: Man teste das Programm für verschiedene N und versuche, den Ablauf vorherzusagen.