在gprolog中声明动态谓词

在gprolog中声明动态谓词,prolog,prolog-directive-dynamic,Prolog,Prolog Directive Dynamic,我在Prolog中有以下代码: 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)时 我已经读过了,但我不知道如何

我在Prolog中有以下代码:

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中是这样。我遗漏了什么吗?

通过在前面加上
:-
:

:- dynamic(player_at/1).
如果没有
:-
该行将定义谓词
动态/1
,而不是执行现有的
动态
谓词

其他prolog实现(但不是gprolog)也支持这一点:

:- dynamic player_at/1.

我试过了-我得到语法错误:。表达式后应为or运算符。它不喜欢没有括号的动态。最终,在程序的查询过程中,您应该已经得到一个异常。它不应该允许动态的(u)事实。ISO标准只说dynamic是一个指令,但在大多数序言中它也是一个内置的,因此不能作为事实断言。