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. (Dal momento che Prolog è completato da Turing, deve essere così!)

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

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

    
posta Alex D 08.08.2013 - 09:42
fonte

2 risposte

9

Lo stato del monitoraggio del percorso non è diverso dallo stato del monitoraggio in qualsiasi altro programma Prolog. Definisci fatti e poi li usi per prendere decisioni. È piuttosto vecchio, ma l'articolo Esplorazione del Prolog: avventure, oggetti, animali e imposte fa un buon lavoro di spiegazione come potrebbe funzionare in un gioco. Riassunto 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 grafica e di una libreria di I / O. Potrebbero esserci distribuzioni Prolog commerciali che li includono. Sono più familiare con SWI Prolog , quindi suggerirò plOpenGL come punto di partenza. Non solo ti dà accesso alle funzionalità di rendering di OpenGL, ma include anche associazioni per eventi mouse e 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 al esempio di moving light di plOpenGL per qualche altro dettaglio e un esempio di gestione del movimento del mouse.

Se usi una libreria grafica, probabilmente gestirà il ciclo di gioco per te. In pratica, si inverte il controllo nella libreria e si forniscono le regole da eseguire quando appropriato: configurazione, ridisegno, 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 previsioni di ora / data e prendere decisioni di conseguenza.

Ci sono molti gusti Prolog, quindi questo non è certamente l'unico modo per costruire un gioco. Diverse distribuzioni e linguaggi correlati utilizzeranno librerie / associazioni diverse che potrebbero incoraggiare approcci diversi. Inoltre, i programmatori poliglotta potrebbero incoraggiarti a utilizzare un linguaggio / runtime host più "grafico" per gestire il rendering e l'IO mentre usi Prolog per modellare comportamenti e processi decisionali di gioco.

    
risposta data 09.08.2013 - 20:47
fonte
2

In cima a risposta di Corbin : in generale lo stato può essere memorizzato / recuperato in Prolog usando l'asserzione / ritiro predicati. Ma ci sono molte opzioni non standard come il salvataggio in RDF, XML, database relazionali, ecc. Se vuoi una GUI un esempio è XPCE offerto da SWI-Prolog.

Si noti che sebbene l'implementazione di un gioco completo in Programmazione logica 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 (ad esempio Java, C ++, ecc.) . Anche l'implementazione di un semplice solutore di Sudoku richiede l'uso delle CLP librerie.

    
risposta data 09.08.2013 - 22:40
fonte

Leggi altre domande sui tag