2012-04-23 2 views
6

Я определим оператор следующим образом:SWI-Prolog - Сбой в Утверждают

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

Когда я пытаюсь что-то вроде:

assert(a => b). 

Пролог выдает ошибку, что не говорит «Нет разрешения на изменение static_procedure (=>)/2' .

Любое решение?

ответ

6

В целях безопасности, вы должны предупредить SWI, что вы собираетесь изменить предикат во время выполнения:

:- dynamic (=>)/2. 

положить в верхней части файла должен сделать это.

+1

Nit: Выше недопустимый синтаксис (попробуйте GNU, чтобы это увидеть). Это должно быть '(=>)/2' – false

+0

@false: ну, у меня не было никакого переводчика, чтобы проверить это. Спасибо, я отредактирую :) – m09

+1

Это всегда так: индикатор предиката должен иметь скобки, если он имеет соответствующее определение оператора. Таким образом, это '(;)/2' и' (',')/2'. Кавычки служат только для того, чтобы разграничить токен, например '' a b'', которые необходимы независимо от объявлений операторов. – false

5

Вы должны иметь в виду еще один символ вместо (=>)/2. Вероятно, (->)/2, который является конструкцией управления, которая не может быть изменена.

 
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

Правильно, но я думаю, что это работает если вы используете Prolog только в интерактивном режиме! Это не сработает, если вы скомпилируете файл! – saadtaame

+0

В какой системе Пролога вы ссылаетесь? SWI, YAP, B, GNU - все те же. – false

+0

Это в названии (SWI-Prolog) – saadtaame

Смежные вопросы