Come implementare programmi interattivi (come giochi / simulazioni) usando la programmazione logica?


20

Ho sentito che la programmazione logica può servire come alternativa generica ad altri paradigmi di programmazione come OO o programmazione funzionale. (Dato che Prolog è Turing-complete, deve essere così!)

Tuttavia, ho difficoltà a vedere come si implementerebbe un programma interattivo, come un semplice gioco grafico per console in Prolog o un linguaggio simile. Hai fatti, regole che possono derivare più fatti e domande che recuperano fatti. È facile vedere come è possibile utilizzare quegli elementi di base per creare qualcosa come un risolutore di sudoku. Ma che ne dici di Pac-man, o più semplicemente di Pong?

ATTENZIONE: non cerco dettagli di basso livello, ma una visione concettuale. (Ad esempio: in termini di alto livello, come gestiresti l'I / O? Come memorizzeresti lo stato del gioco? Come implementeresti qualcosa come un "ciclo principale"? Come misureresti e risponderesti al passare del tempo? )


1
Mi piace molto la tua domanda: ho avuto Prolog molto tempo fa e mi sono posto la stessa domanda e non sono mai stato in grado di pensare a un modo per farlo.
Christian Sauer,

Ho tenuto personalmente un corso di programmazione logica implementando un clone di Frozen Bubbles in SWI Prolog. Funzionava come un incantesimo (dopo il decimo giorno la produttività è diminuita perché semplicemente giocare è stato più divertente che aggiungere funzionalità). Il collegamento al sito Web uni è interrotto, ma proverò a vedere se riesco a rendere nuovamente disponibile il codice.
Kilian Foth

2
"Dato che Prolog è Turing completo, deve essere così!" - Non proprio. Prolog essendo Turing completo significa che qualsiasi funzione matematica su numeri naturali che può essere calcolata da una macchina di Turing può essere calcolata da Prolog. Ma non dice nulla sugli algoritmi che non sono funzioni matematiche sui numeri naturali. Ad esempio: un sistema operativo è una funzione matematica sui numeri naturali? Un web server? Un gioco? Stampa sulla console? Alla guida di un robot? Non ho dubbi sul fatto che tutto ciò possa essere fatto in Prolog, ma non deriva necessariamente dal fatto che Prolog sia Turing completo.
Jörg W Mittag,

@ JörgWMittag: In altre parole, potrebbe essere possibile, potrebbe non essere pratico?
Robert Harvey,

1
@ JörgWMittag - Sì, tutti loro, nel loro cuore, sono solo matematica e memorizzazione dei numeri.
Bobson,

Risposte:


9

Il monitoraggio dello stato del gioco non è diverso dal monitoraggio dello stato in qualsiasi altro programma Prolog. Definisci i fatti e poi li usi per prendere decisioni. È piuttosto vecchio, ma l'articolo Exploring Prolog: Adventures, Objects, Animals e Taxes fa un buon lavoro nel spiegare come ciò potrebbe funzionare in un gioco. Riassumendo dall'articolo:

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

Oltre a ciò, hai bisogno di una libreria grafica e IO. Potrebbero esserci distribuzioni commerciali di Prolog che li includono. Conosco molto bene SWI Prolog , quindi suggerirò come punto di partenza plOpenGL . Non solo ti dà accesso alle funzionalità di rendering di OpenGL, ma include anche associazioni per eventi del mouse e della tastiera. Ad esempio, per gestire una pressione del tasto Esc, si definisce una regola della tastiera in questo modo:

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

Dai un'occhiata all'esempio di luce mobile di plOpenGL per qualche dettaglio in più e un esempio di come maneggiare i movimenti del mouse.

Se usi una libreria grafica, probabilmente gestirà il loop di gioco per te. Fondamentalmente, si inverte il controllo nella libreria e si forniscono le regole da eseguire quando appropriato: impostazione, riverniciatura, eventi IO, ecc. Se si desidera limitare FPS o eseguire il codice in modo condizionale in base al tempo, è possibile tenere traccia del tempo trascorso utilizzando ora / data predicati e prendere decisioni di conseguenza.

Ci sono molti gusti Prolog, quindi questo non è certamente l'unico modo per costruire un gioco. Distribuzioni diverse e linguaggi correlati useranno librerie / associazioni diverse che potrebbero incoraggiare approcci diversi. Inoltre, i programmatori poliglotta potrebbero incoraggiarti a utilizzare un linguaggio / runtime host "più intuitivo per la grafica" per gestire il rendering e l'IO durante l'utilizzo di Prolog per modellare i comportamenti e il processo decisionale delle entità di gioco.


1
Lo stesso sito a cui hai collegato contiene anche un tutorial più lungo, Adventure in Prolog , che ho trovato utile e che termina anche nello sviluppo di un semplice gioco di avventura basato su testo.
jscs,

Grande! Questo è quello che stavo cercando. Sento che includere operazioni con effetti collaterali (come write) in un "predicato logico" sembra piegare il concetto piuttosto lontano.
Alex D

2

In cima alla risposta di Corbin : In generale lo stato può essere archiviato / recuperato in Prolog usando i predicati assert / retract. Ma ci sono molte opzioni non standard come il salvataggio in RDF, XML, database relazionali, ecc. Se si desidera la GUI, un esempio è XPCE offerto da SWI-Prolog.

Si noti che sebbene l'implementazione di un gioco completo in Logic Programming sia un buon esercizio, in pratica le sue prestazioni sarebbero inadeguate ed è per questo che venditori come SWI-Prolog offrono collegamenti a linguaggi di livello inferiore (es. Java, C ++, ecc.). Anche l'implementazione di un semplice risolutore di Sudoku richiede l'uso delle librerie CLP .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.