¿Cómo implementar programas interactivos (como juegos / simulaciones) usando programación lógica?

20

Escuché que la programación lógica puede servir como una alternativa de propósito general a otros paradigmas de programación como OO o programación funcional. (¡Ya que Prolog es Turing completo, esto debe ser así!)

Sin embargo, tengo problemas para ver cómo se implementaría un programa interactivo, como un simple juego gráfico de consola en Prolog o en un lenguaje similar. Tiene hechos, reglas que pueden derivar más hechos y consultas que recuperan hechos. Es fácil ver cómo puede usar esos elementos básicos para crear algo como un solucionador de sudoku. Pero, ¿qué hay de Pac-man, o más simplemente, Pong?

TENGA EN CUENTA: no estoy buscando detalles de bajo nivel, sino una descripción conceptual. (Por ejemplo: en términos de alto nivel, ¿cómo manejaría las E / S? ¿Cómo almacenaría el estado del juego? ¿Cómo implementaría algo como un "ciclo principal"? ¿Cómo mediría y respondería al paso del tiempo? )

Alex D
fuente
1
Realmente me gusta tu pregunta: me enseñaron Prolog hace mucho tiempo y me hice la misma pregunta y nunca pude pensar en una manera de hacer esto.
Christian Sauer
Personalmente, he realizado un curso de programación lógica que implementa un clon de Frozen Bubbles en SWI Prolog. Funcionó a las mil maravillas (después del décimo día, la productividad bajó mucho porque jugar era más divertido que agregar funcionalidad). El enlace del sitio web uni está roto, pero intentaré ver si puedo hacer que el código vuelva a estar disponible.
Kilian Foth
2
"Ya que Prolog es Turing completo, ¡debe ser así!" - Realmente no. Prolog siendo Turing completo significa que Prolog puede calcular cualquier función matemática sobre números naturales que pueda ser calculada por una máquina de Turing. Pero no dice nada sobre algoritmos que no son funciones matemáticas en números naturales. Por ejemplo: ¿es un sistema operativo una función matemática en números naturales? ¿Un servidor web? ¿Un juego? ¿Imprimir en la consola? ¿Conduciendo un robot? No tengo dudas de que todo esto se puede hacer en Prolog, pero no necesariamente se deduce de que Prolog sea Turing completo.
Jörg W Mittag
@ JörgWMittag: En otras palabras, puede ser posible, ¿puede no ser práctico?
Robert Harvey
1
@ JörgWMittag: sí, todos ellos, en esencia, son solo matemáticas y almacenamiento de números.
Bobson el

Respuestas:

9

El estado de seguimiento del juego no es diferente al estado de seguimiento en cualquier otro programa Prolog. Usted define hechos y luego los usa para tomar decisiones. Es bastante antiguo, pero el artículo Exploring Prolog: Adventures, Objects, Animals and Taxes hace un buen trabajo al explicar cómo podría funcionar esto en un juego. Resumido del artículo:

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

Más allá de eso, necesita una biblioteca de gráficos y E / S. Puede haber distribuciones comerciales de Prolog que las incluyan. Estoy más familiarizado con SWI Prolog , por lo que sugeriré plOpenGL como punto de partida. No solo le da acceso a las capacidades de renderizado de OpenGL, sino que también incluye enlaces para eventos de mouse y teclado. Por ejemplo, para manejar una pulsación de la tecla Escape, define una regla de teclado como esta:

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

Eche un vistazo al ejemplo de luz en movimiento de plOpenGL para obtener más detalles y un ejemplo del manejo del movimiento del mouse.

Si usa una biblioteca de gráficos, probablemente manejará el ciclo del juego por usted. Básicamente, invierte el control en la biblioteca y proporciona reglas para que se ejecuten cuando sea apropiado: configuración, repintado, eventos de E / S, etc. Si desea limitar FPS o ejecutar código condicionalmente en función del tiempo, puede realizar un seguimiento del tiempo transcurrido usando la hora / fecha predicados y tomar decisiones en consecuencia.

Hay muchos sabores de Prolog, por lo que esta no es la única forma de crear un juego. Las diferentes distribuciones y lenguajes relacionados utilizarán diferentes bibliotecas / enlaces que pueden fomentar diferentes enfoques. Además, los programadores políglotas pueden alentarlo a utilizar un lenguaje de host / tiempo de ejecución más "amigable con los gráficos" para administrar el renderizado y la E / S mientras usa Prolog para modelar los comportamientos de las entidades del juego y la toma de decisiones.

Corbin March
fuente
1
El mismo sitio al que se ha vinculado también contiene un tutorial más largo, Adventure in Prolog , que me pareció útil, y que también termina en el desarrollo de un simple juego de aventura basado en texto.
jscs
¡Excelente! Esto es lo que estaba buscando. Siento que incluir operaciones con efectos secundarios (como write) en un "predicado lógico" parece desviar el concepto bastante lejos.
Alex D
2

Además de la respuesta de Corbin : en general, el estado puede almacenarse / recuperarse en Prolog utilizando los predicados afirma / retraer. Pero hay muchas opciones no estándar como guardar en RDF, XML, bases de datos relacionales, etc. Si desea GUI, un ejemplo es XPCE ofrecido por SWI-Prolog.

Tenga en cuenta que aunque implementar un juego completo en Logic Programming es un buen ejercicio, en la práctica su rendimiento sería inadecuado y es por eso que proveedores como SWI-Prolog ofrecen enlaces a lenguajes de nivel inferior (por ejemplo, Java, C ++, etc.). Incluso implementar un simple solucionador de Sudoku requiere el uso de bibliotecas CLP .

sakisk
fuente