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? )
quelle
Antworten:
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:
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:
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.
quelle
write
) in ein "logisches Prädikat" das Konzept ziemlich weit verbiegt.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.
quelle