嗨:)初学者到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?
答案 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的规则,你试图重新定义;
,这是不允许的,你不能写“比尔击败汤姆或公牛击败汤姆”作为事实。