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?
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?
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ć.
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.
Nit: Powyżej jest nieprawidłowa składnia (spróbuj GNU, aby to zobaczyć). Powinien to być '(=>)/2' – false
@false: cóż, nie miałem żadnego tłumacza, żeby to sprawdzić. Dzięki, będę edytować :) – m09
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