Swi-Prolog:无权修改静态过程`(;)/ 2'

时间:2017-11-23 23:08:50

标签: prolog

嗨:)初学者到Prolog。

我有这段代码:

dog(rex). 
owns(bill,rex). 
animallover(X):-owns(X,Y),dog(Y).
not(beat(X,Y)):-animallover(X),isAnimal(Y). 
beat(bill,tom);beat(bull,tom). 
iscat(tom). 
isAnimal(X):-iscat(X).

这会产生错误:无权修改静态过程`(;)/ 2'

那里有什么问题?

感谢您的帮助。

dog(rex). 
owns(bill,rex). 
animallover(X):-owns(X,Y),dog(Y).
notbeat(X,Y):-animallover(X),isAnimal(Y). 
not(notbeat(bill,tom),notbeat(bull,tom)). 
iscat(tom). 
isAnimal(X):-iscat(X).

这解决了这个问题。但我们想回答一个问题“谁击中汤姆?”

这样我们只能问

?- nothit(X,tom).

这会产生账单

那么我们如何更改代码以便我们可以询问谁击中了Tom?

2 个答案:

答案 0 :(得分:3)

你的问题的根源是一些代码,这些代码在较小的语言中会产生语法错误,但在语法上有效,但绝对没有意义的Prolog。

这部分代码完全没问题:

dog(rex). 
owns(bill, rex). 
animallover(X) :- owns(X, Y), dog(Y).

空白是免费的。 :)

这是你的第一个问题:

not(beat(X,Y)) :- animallover(X), isAnimal(Y).

我不确定你在这里说的是什么,因为我一直在做Prolog太久了。但是你在这里说的有点不同,是:

not(Q) :- Q = beat(X, Y), ...

换句话说,您在此处定义的过程为not/1 ,而不是与beat/2有关。你头脑中有太多的东西。这对初学者来说是一个不寻常的问题;通常接触过其他语言的人会在:-的右侧而不是左侧做出太多任务的错误。

无论如何,阅读Q :- P的另一种方式是,“要证明Q,我必须首先证明P.”这就是Prolog对此的看法。或者,“如果P,那么我可以得出Q.”所以,你正在教Prolog如何得出一个叫not的结论,这几乎肯定不是你的意思。

现在,转到发生错误的下一行:

beat(bill, tom); beat(bull, tom).

Prolog处理所谓的Horn条款。通用的Horn子句看起来像Q :- P,但是如果省略:- P,你获得的通常称为事实。在这种情况下,你在这一行上的所有东西都是一个事实。那个表达式的头部结果是;,所以你实际写的就是:

 A ; B :- A = beat(bill, tom), B = beat(bull, tom).

你试图在这里重新定义;/2,本质上,Prolog不允许这样做,因为;太重要了。你在这里所说的只是将两个事实分开的时期:beat(bill, tom). beat(bull, tom).

我希望这有助于让你超越驼峰。

答案 1 :(得分:0)

在第

beat(bill,tom);beat(bull,tom).
你似乎的意思是“比尔击败汤姆或公牛击败汤姆”。

但是按照Prolog的规则,你试图重新定义;,这是不允许的,你不能写“比尔击败汤姆或公牛击败汤姆”作为事实。