2009-05-09 11 views
6

Ho questo codice Prolog:Dichiarare un predicato dinamica gprolog

dynamic(player_at/1). 
player_at(house). 
goto(X) :- retract(player_at(house)), assert(player_at(X)). 

Ma ho ancora ottenere questo errore:

uncaught exception: error(permission_error(modify,static_procedure,player_at/1),retract/1) 

quando eseguo goto (foo).

Ho letto il dynamic documentation, ma non riesco a capire come usarlo, almeno in gprolog. Mi sto perdendo qualcosa?

+0

Alla fine si dovrebbe ottenere già un'eccezione durante la consultazione del programma. Non dovrebbe consentire un fatto dinamico (_). Lo standard ISO dice solo che la dinamica è una direttiva, ma nella maggior parte dei Prolog è anche un built-in, e non può quindi essere asserito come un dato di fatto. –

risposta

11

fissare la prima linea anteponendo :-:

:- dynamic(player_at/1). 

Senza :- la linea sarebbe dreefine predicato dynamic/1, invece di eseguire l'esistente dynamic predicato.

Altre implementazioni Prolog (ma non gprolog) supportano anche questo:

:- dynamic player_at/1. 
+0

L'ho provato - ottengo l'errore di sintassi:. o operatore previsto dopo l'espressione. Non ama la dinamica senza parentesi. – Kai

+0

Risolto il problema con la mia risposta. – pts

Problemi correlati