SWI Prolog:无法定义新运算符

SWI Prolog:无法定义新运算符,prolog,operators,Prolog,Operators,我在Arch Linux上使用的是SWI Prolog 7.6.4版 我有一个事实数据库: female(mary). female(liz). female(mia). female(tina). female(ann). female(sue). male(mike). male(jack). male(fred). male(tom). male(joe). male(jim). parent(mary, mia). parent(mary, fred). parent(mary, tin

我在Arch Linux上使用的是SWI Prolog 7.6.4版

我有一个事实数据库:

female(mary). female(liz). female(mia). female(tina). female(ann). female(sue).
male(mike). male(jack). male(fred). male(tom). male(joe). male(jim).
parent(mary, mia). parent(mary, fred). parent(mary, tina).
parent(mike, mia). parent(mike, fred). parent(mike, tina).
parent(liz, tom). parent(liz, joe).
parent(jack, tom). parent(jack, joe).
parent(mia, ann).
parent(tina, sue). parent(tina, jim).
parent(tom, sue). parent(tom, jim).
我将
mother
谓词定义如下:

mother(M, C) :- parent(M, C), female(M).
谓词按预期工作:

?- mother(liz, tom).
true .

?- mother(liz, fred).
false.
现在我想定义一个操作符,比如优先级相对较低的
liz-mother-tom
,我这样做:

op(1111, xfx, mother).
:- op(1111, xfx, mother).
这给了我一个关于这一行的错误:

ERROR: /home/user/prolog/family.pl:13:
       No permission to modify static procedure `op/3'
我不知道我做错了什么

根据要求,以下是一个列表中的完整文件:

female(mary). female(liz). female(mia). female(tina). female(ann). female(sue).
male(mike). male(jack). male(fred). male(tom). male(joe). male(jim).
parent(mary, mia). parent(mary, fred). parent(mary, tina).
parent(mike, mia). parent(mike, fred). parent(mike, tina).
parent(liz, tom). parent(liz, joe).
parent(jack, tom). parent(jack, joe).
parent(mia, ann).
parent(tina, sue). parent(tina, jim).
parent(tom, sue). parent(tom, jim).

mother(M, C) :- parent(M, C), female(M).
op(1111, xfx, mother).

正如@潜伏者在评论中所描述的,
op/3
是一个指令。它的工作原理如下:

op(1111, xfx, mother).
:- op(1111, xfx, mother).

您能否共享完整文件(或至少部分触发此异常的文件?)。可能是顺序、间距等原因造成的。@WillemVanOnsem当然,请参见上面的
op/3
是一个指令。你是否在它前面写了
:-
<代码>:-op(1111,xfx,mother)。不幸的是,SWI Prolog文档在这一点上并不清楚。避免使用此类运算符,它们只会妨碍您学习language@false我将在我的下一次旅程中接受这个建议,但正如你所能想象的,这是家庭作业,教授希望我这样做。