2012-04-23 9 views
6

zdefiniować operator następująco:SWI-Prolog - Fail dochodzić

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

Kiedy próbuję coś takiego:

assert(a => b). 

Prolog zgłasza błąd, który mówi „nie uprawnień do modyfikowania static_procedure (=>)/2 '.

Jakieś rozwiązanie?

Odpowiedz

6

Ze względów bezpieczeństwa, trzeba ostrzec SWI, że masz zamiar zmodyfikować predykat przy starcie:

:- dynamic (=>)/2. 

wstawiony na początku pliku powinno wystarczyć.

+1

Nit: Powyżej jest nieprawidłowa składnia (spróbuj GNU, aby to zobaczyć). Powinien to być '(=>)/2' – false

+0

@false: cóż, nie miałem żadnego tłumacza, żeby to sprawdzić. Dzięki, będę edytować :) – m09

+1

To zawsze tak: wskaźnik predykatu musi mieć nawiasy, jeśli ma odpowiednią definicję operatora. Tak więc jest to '(;)/2' i' (',')/2'. Cytaty służą tylko do ograniczenia tokenu - "b", które są potrzebne niezależnie od deklaracji operatora. – false

5

Musisz mieć na myśli inny symbol zamiast (=>)/2. Prawdopodobnie (->)/2, który jest konstruktem kontrolnym, którego nie można zmodyfikować.

 
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

Zgadza się, ale myślę, że działa jeśli używasz interaktywnie tylko Prolog! To nie działa, jeśli skompilujesz plik !! – saadtaame

+0

Który system Prolog, do którego się odnosisz? SWI, YAP, B, GNU są takie same. – false

+0

Jest w tytule (SWI-Prolog) – saadtaame