无权修改静态过程`(\ +)/ 1'

时间:2014-12-23 22:56:23

标签: prolog

我有以下几点:

mother(grimalde).
daughter(biancaneve, grimalde).
love(X, Y) :- mother(X), daughter(Y, X).
\+(kill(X, Y)) :- mother(X), daughter(Y, X), love(X, Y).

当我运行consult('ex.pl').时,我得到:

?- consult('ex.pl').
ERROR: /home/antonio/Scrivania/ex.pl:4:
    No permission to modify static procedure `(\+)/1'
    Defined at /usr/lib/swi-prolog/boot/init.pl:242
% ex.pl compiled 0.00 sec, 0 clauses

我不明白为什么......

1 个答案:

答案 0 :(得分:2)

在Prolog中你不能在条款头中使用否定。

明确的条款

请记住,Prolog条款是明确的条款,即文字的连词,其中只有一个是正面的。这个正面文字称为该条款的 head ,是“:-”之前的部分。

抽象一下,你的子句看起来像这样:

\+H :- B1, B2, B3

对应于以下条款:

\+H, \+B1, \+B2, \+B3

这不明确。

否定为失败

还要记住,Prolog否定不是逻辑否定,而是 否定为失败 。在这种意义上,\+(kill(X,Y))应该被读作“在这个Prolog程序中,X杀死Y无法得出它。”

权限错误

那么为什么会出现权限错误?由于\+/1没有被解释为否定了子句头(因为Prolog语言不允许这样做),所以看起来你是重新定义 \+/1。由于\+/1是子句头的外部函子,看起来好像是在定义它。但是不允许重新定义这个谓词。