我有以下几点:
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
我不明白为什么......
答案 0 :(得分:2)
在Prolog中你不能在条款头中使用否定。
请记住,Prolog条款是明确的条款,即文字的连词,其中只有一个是正面的。这个正面文字称为该条款的 head ,是“:-
”之前的部分。
抽象一下,你的子句看起来像这样:
\+H :- B1, B2, B3
对应于以下条款:
\+H, \+B1, \+B2, \+B3
这不明确。
还要记住,Prolog否定不是逻辑否定,而是 否定为失败 。在这种意义上,\+(kill(X,Y))
应该被读作“在这个Prolog程序中,X
杀死Y
无法得出它。”
那么为什么会出现权限错误?由于\+/1
没有被解释为否定了子句头(因为Prolog语言不允许这样做),所以看起来你是重新定义 \+/1
。由于\+/1
是子句头的外部函子,看起来好像是在定义它。但是不允许重新定义这个谓词。