prolog - SWI序言: Cannot Define New Operator

标签 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, 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).

这给了我该确切行的错误:
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).

最佳答案

正如@lurker 在评论中所描述的,op/3是一个指令。它是这样工作的:

:- op(1111, xfx, mother).

关于prolog - SWI序言: Cannot Define New Operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52595123/

相关文章:

module - 如何在存在 meta_predicate 声明的情况下编写 rec/3 代码?

debugging - 如何调试 Prolog 程序

prolog - 为什么必须在 Prolog 中将事实组合在一起?

c++ - int/float/string值之间的操作,组合太多

python - 为什么 3<<1 == 6 在 python 中?

operators - 是否可以在 Raku 中定义一个新的运算符并控制其优先级?

performance - 这个质数相关谓词的瓶颈是什么?

algorithm - Prolog - 解决游戏,实现启发式

c++ - operator << friend 函数和模板

java - =+ Java 中的运算符