2014-06-23 19 views
5

Mi piacerebbe scrivere un piccolo gioco di avventura basato su testo usando Prolog (potrebbe essere un'idea stupida, ma non sono qui per discuterne).Come disattivare le uscite "true" e "false" in Prolog?

L'unico problema è che non riesco a stampare il testo sullo schermo senza che vengano visualizzati anche i valori "vero" e "falso".

Per esempio se cerco qualcosa di simile:

take(desk) :- write('This thing is way too heavy for me to carry!'). 

dove take è un unico luogo predicato e desk un nome ottengo come output:

?- take(desk). 
    This thing is way too heavy for me to carry! 
    true. 

Come posso liberarmi di questo uscite "vere" o "false"?

Giusto per dire che ho anche provato con il format/1 un posto predicato per una semplice output di testo e anche il format/2 due posto predicato (quando voglio uscita il nome di una variabile), ma dà esattamente lo stesso problema.

Ho anche visto this answer ma prima non è abbastanza dettagliato (almeno non per qualcuno come me) e in secondo luogo, spero in profondità che ci sia un modo più semplice per farlo.

E infine, sto usando SWI-Prolog.

Grazie.

+0

Sono un novizio prologo al meglio, ma se si utilizza l'opzione '--quiet' /' -q', funziona? fonte: http://www.swi-prolog.org/pldoc/doc_for?object=section(2,+%272.4%27,+swi(%27/doc/Manual/cmdline.html%27)) – Gray

+0

@Gray . Forse non lo uso correttamente ma fondamentalmente se lancio 'prolog -q game.pl', non funziona. – gatsu

risposta

9

Un metodo semplicistico sarebbe quello di creare un piccolo REPL (lettura, valutazione, ciclo di stampa) del proprio. Qualcosa del genere:

game :- 
    repeat, 
    write('> '), 
    read(X), 
    call(X), 
    fail. 

Questo richiederà solo ed eseguirà tutto ciò che si immette al prompt. In concomitanza con il take fatto (e un altro ho aggiunto per l'illustrazione):

take(desk) :- write('This thing is way too heavy for me to carry!'), nl. 
take(chair) :- write('This is easier to carry.'), nl. 

Si otterrebbe:

?- game. 
> take(desk). 
This thing is way too heavy for me to carry! 
> take(chair). 
This is easier to carry. 
> 

Non si ottiene la true o false perché l'obiettivo game non risolve fino a quando non esci dal ciclo in qualche modo. È possibile aggiungere assegni per uno quit o bye o qualsiasi altra cosa per uscire dal ciclo game. Ctrl-C o Ctrl-D possono essere usati anche per interrompere il ciclo. Potrebbe essere necessario aggiungere alcune "funzioni" per farlo funzionare secondo le tue esigenze o i tuoi gusti.

+0

Questa è una risposta sorprendente e semplice in più !! Ora, ho un piccolo problema perché sto usando i predicati dinamici per le cose. Uno di questi è "inventario (X)" che significa che X è nel mio inventario. Per renderlo conto, definisco il predicato 'take' come segue' take (X): - visible (X), write ('done'), assert (inventory (X)), retract (visible (X)); inventario (X), scrivi ('L'ho preso già') '. Il mio problema è che quando chiamato nel ciclo hai proposto di "prendere (X)", restituisce le due proposizioni nella disgiunzione indipendentemente dai loro valori di verità (che non fa al di fuori del ciclo). Perché? – gatsu

+0

Ok mio male, ho appena capito che scritto in questo ordine, cioè.prima (visibile -> inventario) e poi l'inventario farà sì che l'intera disgiunzione sia vera non appena un oggetto è visibile. Questo non dovrebbe accadere se cambio le due premesse. – gatsu

Problemi correlati