2009-05-09 7 views
6

Je possède ce code Prolog:Déclarant un prédicat dynamique gprolog

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

Mais je reçois toujours cette erreur:

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

quand j'exécute goto (foo).

J'ai lu le dynamic documentation, mais je n'arrive pas à comprendre comment l'utiliser, au moins dans gprolog. Est-ce que je manque quelque chose?

+0

Finalement, vous devriez obtenir déjà une exception lors de la consultation de votre programme. Il ne devrait pas permettre un fait dynamique (_). La norme ISO dit seulement que dynamic est une directive, mais dans la plupart des Prologs c'est aussi un built-in, et ne peut donc pas être affirmé comme un fait. –

Répondre

11

Fixer la première ligne par préfixer :-:

:- dynamic(player_at/1). 

Sans :- la ligne serait dreefine prédicat dynamic/1, au lieu d'exécuter le prédicat dynamic existant.

D'autres implémentations Prolog (mais pas gprolog) appuient cette ainsi:

:- dynamic player_at/1. 
+0

J'ai essayé - j'ai une erreur de syntaxe:. ou opérateur attendu après l'expression. Il n'aime pas la dynamique sans parenthèse. – Kai

+0

Correction de ma réponse. – pts

Questions connexes