2012-04-23 17 views
6

definisco un operatore come segue:SWI-Prolog - Fail per affermare

:- op(500, xfx, =>). 

Quando cerco qualcosa di simile:

assert(a => b). 

Prolog genera un errore che dice 'Non hai il permesso di modificare static_procedure (=>)/2' .

Qualsiasi soluzione?

risposta

6

Come la sicurezza, è necessario mettere in guardia SWI che si sta per modificare un predicato in fase di esecuzione:

:- dynamic (=>)/2. 

messo nella parte superiore del file dovrebbe farlo.

+1

Nit: Sopra la sintassi non valida (provare GNU per vedere questo). Dovrebbe essere '(=>)/2' – false

+0

@false: oh, beh, non avevo nessun interprete disponibile per verificarlo. Grazie, modifico :) – m09

+1

È sempre così: un indicatore di predicato deve avere parentesi se ha una corrispondente definizione di operatore. Quindi è '(;)/2' e' (',')/2'. Le virgolette servono solo a delimitare un token, come "a b" sono necessari indipendentemente dalle dichiarazioni dell'operatore. – false

5

È necessario indicare un altro simbolo al posto di (=>)/2. Probabilmente (->)/2 che è un costrutto di controllo che non può essere modificato.

 
Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 6.1.3-116-gf1c7e06) 
... 
?- asserta((a -> b)). 
ERROR: asserta/1: No permission to modify static procedure `(->)/2' 
ERROR: Defined at /opt/gupu/pl-devel/lib/swipl-6.1.3/boot/init.pl:194 
?- op(500, xfx, =>). 
true. 

?- asserta(a => b). 
true. 
+0

Giusto ma penso che funzioni se stai utilizzando solo il Prolog in modo interattivo! Non funziona se si compila il file !! – saadtaame

+0

A quale sistema Prolog fa riferimento? SWI, YAP, B, GNU sono tutti uguali. – false

+0

È nel titolo (SWI-Prolog) – saadtaame

Problemi correlati