SWI Prolog-无法断言

SWI Prolog-无法断言,prolog,prolog-assert,Prolog,Prolog Assert,我对运算符的定义如下: :- op(500, xfx, =>). 当我尝试类似于: assert(a => b). Prolog引发一个错误,该错误表示“没有修改静态\u过程(=>)/2的权限” 任何解决方案?作为一种安全措施,您必须警告SWI您将在运行时修改谓词: :- dynamic (=>)/2. 放在文件顶部就可以了。您一定是指另一个符号代替了(=>)/2。可能是(>)/2,这是一个无法修改的控件构造 Welcome to SWI-Prolog (Multi-th

我对运算符的定义如下:

:- op(500, xfx, =>).
当我尝试类似于:

assert(a => b).
Prolog引发一个错误,该错误表示“没有修改静态\u过程(=>)/2的权限”


任何解决方案?

作为一种安全措施,您必须警告SWI您将在运行时修改谓词:

:- dynamic (=>)/2.

放在文件顶部就可以了。

您一定是指另一个符号代替了
(=>)/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. 欢迎使用SWI Prolog(多线程,32位,版本6.1.3-116-gf1c7e06) ... -资产((a->b))。 错误:asserta/1:没有修改静态过程“(>)/2”的权限 错误:定义在/opt/gupu/pl-devel/lib/swipl-6.1.3/boot/init.pl:194 ?op(500,xfx,=>)。 对。 ?-asserta(a=>b)。 对。
Nit:上面的语法无效(请尝试GNU查看)。它应该是
(=>)/2
@false:哦,我没有任何翻译来检查。谢谢,我将编辑:)它总是这样:谓词指示符必须有括号,如果它有相应的运算符定义。所以它是
(;)/2
(',')/2
。引号仅用于分隔类似标记的
'ab'
它们是独立于运算符声明而需要的。@false:好!我在doc中遇到了这个符号,但不知道它是针对SWI还是norm的,谢谢你的澄清:)迟早你会需要这个标准-看看如何便宜地获得它。是的,但我认为如果你只是以交互方式使用Prolog,它是有效的!如果你编译这个文件,它就不起作用了!!你指的是哪种Prolog系统?SWI、YAP、B、GNU都是一样的。它在标题(SWI Prolog)中,但除此之外:使用动态声明是个好主意。