Wie implementiere ich interaktive Programme (wie Spiele / Simulationen) mit Logikprogrammierung?

20

Ich habe gehört, dass Logikprogrammierung als allgemeine Alternative zu anderen Programmierparadigmen wie OO oder funktionaler Programmierung dienen kann. (Da Prolog Turing-komplett ist, muss das so sein!)

Ich habe jedoch Probleme damit, ein interaktives Programm wie ein einfaches grafisches Konsolenspiel in Prolog oder einer ähnlichen Sprache zu implementieren. Sie haben Fakten, Regeln, die mehr Fakten ableiten können, und Abfragen, die Fakten abrufen. Es ist leicht zu erkennen, wie Sie diese grundlegenden Elemente verwenden können, um so etwas wie einen Sudoku-Löser zu erstellen. Aber wie wäre es mit Pac-Man oder einfacher Pong?

BITTE BEACHTEN SIE: Ich suche keine einfachen Details, sondern eine konzeptionelle Übersicht. (Zum Beispiel: Auf hoher Ebene, wie würden Sie mit I / O umgehen? Wie würden Sie den Spielstatus speichern? Wie würden Sie so etwas wie eine "Hauptschleife" implementieren? Wie würden Sie den Zeitablauf messen und darauf reagieren? )

Alex D
quelle
1
Ihre Frage gefällt mir sehr gut - ich habe vor langer Zeit einen Prolog gelesen und mir dieselbe Frage gestellt. Ich konnte mir nie vorstellen, wie ich das tun könnte.
Christian Sauer
Ich habe persönlich einen Logikprogrammierkurs durchgeführt, in dem ein Frozen Bubbles-Klon in SWI Prolog implementiert wurde. Arbeitete wie ein Zauber (nach dem zehnten Tag ging die Produktivität stark zurück, weil das Spielen mehr Spaß machte als das Hinzufügen von Funktionen). Der Link zur Uni-Website ist defekt, aber ich werde versuchen, den Code wieder verfügbar zu machen.
Kilian Foth
2
"Da Prolog Turing-komplett ist, muss das so sein!" - Nicht wirklich. Wenn Prolog vollständig ist, bedeutet dies, dass jede mathematische Funktion für natürliche Zahlen , die von einer Turing-Maschine berechnet werden kann, von Prolog berechnet werden kann. Aber es sagt nichts über Algorithmen aus, die keine mathematischen Funktionen für natürliche Zahlen sind. Zum Beispiel: Ist ein Betriebssystem eine mathematische Funktion für natürliche Zahlen? Ein Webserver? Ein Spiel? Auf die Konsole drucken? Roboter fahren? Ich habe keinen Zweifel, dass all dies in Prolog möglich ist, aber es muss nicht unbedingt daraus resultieren, dass Prolog vollständig ist.
Jörg W Mittag
@ JörgWMittag: Mit anderen Worten, es kann möglich sein, dass es einfach nicht praktikabel ist?
Robert Harvey
1
@ JörgWMittag - Ja, alle von ihnen sind in ihrem Herzen nur Mathematik und Speicherung von Zahlen.
Bobson

Antworten:

9

Das Verfolgen des Spielstatus unterscheidet sich nicht vom Verfolgungsstatus in einem anderen Prolog-Programm. Sie definieren Fakten und treffen anhand dieser Entscheidungen. Es ist ziemlich alt, aber der Artikel Exploring Prolog: Adventures, Objects, Animals und Taxes liefert eine gute Erklärung, wie dies in einem Spiel funktionieren könnte. Aus dem Artikel zusammengefasst:

% Set up - you start in a house
location(you, house).

% Move to a new location.
goto(X) :- 
    location(you, L), % Read your current location into L
    connect(L, X), % Check if you can reach the new location X from L
    retract( location(you, L) ), % Remove the old location fact
    assert( location(you, X) ). % Add a new location fact. You are in X now.
    write($ You are in the $), write(X), nl.

Darüber hinaus benötigen Sie eine Grafik- und E / A-Bibliothek. Es kann kommerzielle Prolog-Distributionen geben, die diese enthalten. Ich kenne SWI Prolog am besten , daher empfehle ich plOpenGL als Ausgangspunkt. Sie erhalten damit nicht nur Zugriff auf die Rendering-Funktionen von OpenGL, sondern auch Bindungen für Maus- und Tastaturereignisse. Um beispielsweise das Drücken der Escape-Taste zu handhaben, definieren Sie eine Tastaturregel wie folgt:

% 27 is ASCII Code for Escape
keyboard(27,_,_) :-
    write('Escape key was pressed...'),nl.

Schauen Sie sich das Moving Light-Beispiel von plOpenGL an , um ein paar weitere Details und ein Beispiel für die Handhabung der Mausbewegung zu erfahren .

Wenn Sie eine Grafikbibliothek verwenden, übernimmt diese wahrscheinlich die Spielschleife für Sie. Grundsätzlich kehren Sie die Steuerung der Bibliothek um und stellen Regeln zur Verfügung, die bei Bedarf ausgeführt werden: Einrichten, Neupainting, E / A-Ereignisse usw. Wenn Sie die FPS begrenzen oder den Code zeitabhängig ausführen möchten, können Sie die verstrichene Zeit mithilfe von Zeit / Datum verfolgen Prädikate und treffen Entscheidungen entsprechend.

Es gibt viele Prolog-Varianten, daher ist dies sicherlich nicht die einzige Möglichkeit, ein Spiel zu erstellen. Unterschiedliche Distributionen und verwandte Sprachen verwenden unterschiedliche Bibliotheken / Bindungen, die unterschiedliche Ansätze fördern können. Darüber hinaus empfehlen Ihnen Polyglot-Programmierer möglicherweise, eine "grafikfreundlichere" Hostsprache / -laufzeit zum Verwalten von Rendering und E / A zu verwenden, während Prolog zum Modellieren des Verhaltens von Spieleinheiten und zum Treffen von Entscheidungen verwendet wird.

Corbin March
quelle
1
Die gleiche Site, auf die Sie verlinkt haben, enthält auch ein längeres Tutorial, Adventure in Prolog , das ich als nützlich empfunden habe und das auch zur Entwicklung eines einfachen textbasierten Abenteuerspiels führt.
jscs
Groß! Das ist, wonach ich gesucht habe. Ich habe das Gefühl, dass das Einbeziehen von Operationen mit Nebenwirkungen (wie write) in ein "logisches Prädikat" das Konzept ziemlich weit verbiegt.
Alex D
2

Zusätzlich zu Corbins Antwort : Im Allgemeinen kann der Status in Prolog mithilfe der Assert / Retract-Prädikate gespeichert / abgerufen werden. Es gibt jedoch viele nicht standardmäßige Optionen wie das Speichern in RDF, XML, relationalen Datenbanken usw. Wenn Sie eine grafische Benutzeroberfläche wünschen, bietet SWI-Prolog beispielsweise XPCE an.

Beachten Sie, dass die Implementierung eines vollständigen Spiels in der Logikprogrammierung zwar eine gute Übung ist, die Leistung in der Praxis jedoch unzureichend ist. Aus diesem Grund bieten Anbieter wie SWI-Prolog Bindungen für untergeordnete Sprachen (z. B. Java, C ++ usw.) an. Selbst die Implementierung eines einfachen Sudoku-Lösers erfordert die Verwendung von CLP- Bibliotheken.

Sakisk
quelle