Comment implémenter des programmes interactifs (comme des jeux / simulations) en utilisant la programmation logique?

20

J'ai entendu dire que la programmation logique peut servir d'alternative polyvalente à d'autres paradigmes de programmation tels que l'OO ou la programmation fonctionnelle. (Puisque Prolog est Turing-complet, il doit en être ainsi!)

Cependant, j'ai du mal à voir comment on implémenterait un programme interactif, comme un jeu de console graphique simple dans Prolog ou un langage similaire. Vous avez des faits, des règles qui peuvent dériver plus de faits et des requêtes qui récupèrent des faits. Il est facile de voir comment vous pouvez utiliser ces éléments de base pour créer quelque chose comme un solveur sudoku. Mais qu'en est-il de Pac-man, ou plus simplement, de Pong?

VEUILLEZ NOTER: Je ne recherche pas de détails de bas niveau, mais un aperçu conceptuel. (Par exemple: en termes de haut niveau, comment géreriez-vous les E / S? Comment stockeriez-vous l'état du jeu? Comment implémenteriez-vous quelque chose comme une "boucle principale"? Comment mesureriez-vous et réagiriez-vous au temps qui passe? )

Alex D
la source
1
J'aime vraiment votre question - j'ai été Prolog il y a longtemps et je me suis posé la même question et je n'ai jamais pu penser à un moyen de le faire.
Christian Sauer
J'ai personnellement suivi un cours de programmation logique implémentant un clone Frozen Bubbles dans SWI Prolog. Fonctionné comme un charme (après le dixième jour, la productivité a chuté parce que le jouer était plus amusant que d'ajouter des fonctionnalités). Le lien du site Web uni est rompu, mais je vais essayer de voir si je peux rendre le code à nouveau disponible.
Kilian Foth du
2
"Puisque Prolog est Turing-complet, il doit en être ainsi!" - Pas vraiment. Prolog étant Turing-complete signifie que toute fonction mathématique sur des nombres naturels qui peut être calculée par une machine de Turing peut être calculée par Prolog. Mais cela ne dit rien sur les algorithmes qui ne sont pas des fonctions mathématiques sur les nombres naturels. Par exemple: un système d'exploitation est-il une fonction mathématique sur des nombres naturels? Un serveur web? Un jeu? Impression sur la console? Conduire un robot? Je ne doute pas que tout cela peut être fait dans Prolog, mais cela ne découle pas nécessairement du fait que Prolog est Turing-complete.
Jörg W Mittag
@ JörgWMittag: En d'autres termes, cela peut être possible, peut-être tout simplement pas pratique?
Robert Harvey
1
@ JörgWMittag - Oui, tous, dans leur cœur, ne sont que des mathématiques et du stockage sur des nombres.
Bobson

Réponses:

9

L'état du jeu de suivi n'est pas différent de l'état de suivi dans tout autre programme Prolog. Vous définissez des faits et les utilisez ensuite pour prendre des décisions. C'est assez vieux, mais l'article Exploring Prolog: Adventures, Objects, Animals, and Taxes explique bien comment cela pourrait fonctionner dans un jeu. Résumé de l'article:

% 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.

Au-delà de cela, vous avez besoin d'une bibliothèque graphique et IO. Il peut y avoir des distributions commerciales Prolog qui les incluent. Je connais bien SWI Prolog , donc je proposerai plOpenGL comme point de départ. Non seulement il vous donne accès aux capacités de rendu d'OpenGL, mais il comprend également des liaisons pour les événements de souris et de clavier. Par exemple, pour gérer une pression sur la touche Échap, vous définissez une règle de clavier comme suit:

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

Jetez un œil à l' exemple de la lumière mobile de plOpenGL pour quelques détails supplémentaires et un exemple de gestion des mouvements de la souris.

Si vous utilisez une bibliothèque graphique, elle gérera probablement la boucle du jeu pour vous. Fondamentalement, vous inversez le contrôle de la bibliothèque et fournissez des règles à exécuter le cas échéant: configuration, repeinture, événements d'E / S, etc. Si vous souhaitez limiter FPS ou exécuter le code de manière conditionnelle en fonction du temps, vous pouvez suivre le temps écoulé en utilisant l' heure / la date prédicats et prendre des décisions en conséquence.

Il existe de nombreuses versions de Prolog, ce n'est donc certainement pas le seul moyen de créer un jeu. Différentes distributions et langages associés utiliseront différentes bibliothèques / liaisons qui peuvent encourager différentes approches. De plus, les programmeurs polyglottes peuvent vous encourager à utiliser un langage / runtime hôte plus "graphique" pour gérer le rendu et les E / S tout en utilisant Prolog pour modéliser les comportements des entités de jeu et la prise de décision.

Marche de Corbin
la source
1
Le même site auquel vous avez lié contient également un didacticiel plus long, Adventure in Prolog , que j'ai trouvé utile, et qui se termine également par le développement d'un jeu d'aventure textuel simple.
jscs
Génial! C'est ce que je cherchais. Je pense que l'inclusion d'opérations avec des effets secondaires (comme write) dans un "prédicat logique" semble plier le concept assez loin.
Alex D
2

En plus de la réponse de Corbin : En général, l'état peut être stocké / récupéré dans Prolog en utilisant les prédicats assert / retract. Mais il existe de nombreuses options non standard telles que l'enregistrement dans RDF, XML, les bases de données relationnelles, etc. Si vous voulez une interface graphique, XPCE est proposé par SWI-Prolog.

Notez que bien que l'implémentation d'un jeu complet dans Logic Programming soit un bon exercice, dans la pratique, ses performances seraient insuffisantes et c'est pourquoi des fournisseurs comme SWI-Prolog proposent des liaisons vers des langages de niveau inférieur (par exemple Java, C ++, etc.). Même la mise en œuvre d'un simple solveur Sudoku nécessite l'utilisation de bibliothèques CLP .

sakisk
la source