Объявление динамического предиката в gprolog

У меня есть этот код в Прологе:

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

Но я все еще получаю эту ошибку:

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

когда я выполняю goto(foo).

Я прочитал динамическую документацию, но не могу понять, как его использовать, по крайней мере, в gprolog. Я что-то упускаю?


person Kai    schedule 09.05.2009    source источник
comment
В конце концов вы уже должны получить исключение во время просмотра вашей программы. Он не должен допускать факта dynamic(_). В стандарте ISO только говорится, что dynamic — это директива, но в большинстве прологов она также является встроенной и, таким образом, не может утверждаться как факт.   -  person Mostowski Collapse    schedule 19.07.2011


Ответы (1)


Исправьте первую строку, добавив перед ней :-:

:- dynamic(player_at/1).

Без :- строка будет переопределять предикат dynamic/1 вместо выполнения существующего предиката dynamic.

Другие реализации пролога (но не gprolog) также поддерживают это:

:- dynamic player_at/1.
person pts    schedule 09.05.2009
comment
Я попробовал это - я получаю синтаксическую ошибку: . или оператор ожидается после выражения. Ему не нравится динамика без скобок. - person Kai; 10.05.2009