Swi Prolog:不允许修改静态过程“(;)/2';

Swi Prolog:不允许修改静态过程“(;)/2';,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(bil

嗨:)序言初学者

我有以下代码:

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).
这将产生比尔

那么我们如何更改代码,以便我们可以询问是谁打了汤姆?在队列中

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

但根据Prolog的规则,您正试图重新定义
,这是不允许的,你不能写“比尔打败汤姆或公牛打败汤姆”作为事实

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


但根据Prolog的规则,您正试图重新定义
,这是不允许的,你不能写“Bill beat Tom或Bull beat Tom”作为事实。

你的问题的根源是一些代码,用较低的语言,它会产生语法错误,但在语法上是有效的,但绝对没有意义

这部分代码完全正确:

dog(rex). 
owns(bill, rex). 
animallover(X) :- owns(X, Y), dog(Y).
空白是免费的。:)

这是您的第一个问题:

not(beat(X,Y)) :- animallover(X), isAnimal(Y).
我不知道你想说什么,因为我已经做了太长时间的序言了。但你在这里说的,有点不同,是这样的:

not(Q) :- Q = beat(X, Y), ...
换句话说,您在这里定义的过程是
而不是/1
,而不是与
节拍/2
有关。你脑子里的东西太多了。对于初学者来说,这是一个不寻常的问题;通常,接触过其他语言的人会犯错误,在
:-
的右侧而不是左侧做太多作业

在任何情况下,阅读Q:-p的另一种方式是,“为了证明Q,我必须先证明p。”这就是Prolog的想法。或者,“如果P,那么我可以得出Q。”那么,你在教Prolog如何得出一个名为
而不是
的结论,这几乎肯定不是你的意思

现在,转到下一行,出现错误的地方:

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(比尔,汤姆)。击败(公牛,汤姆)。


我希望这能帮助您渡过难关。

问题的根源是一些代码,用较少的语言来说,这些代码会产生语法错误,但在语法上是有效的,但绝对没有意义

这部分代码完全正确:

dog(rex). 
owns(bill, rex). 
animallover(X) :- owns(X, Y), dog(Y).
空白是免费的。:)

这是您的第一个问题:

not(beat(X,Y)) :- animallover(X), isAnimal(Y).
我不知道你想说什么,因为我已经做了太长时间的序言了。但你在这里说的,有点不同,是这样的:

not(Q) :- Q = beat(X, Y), ...
换句话说,您在这里定义的过程是
而不是/1
,而不是与
节拍/2
有关。你脑子里的东西太多了。对于初学者来说,这是一个不寻常的问题;通常,接触过其他语言的人会犯错误,在
:-
的右侧而不是左侧做太多作业

在任何情况下,阅读Q:-p的另一种方式是,“为了证明Q,我必须先证明p。”这就是Prolog的想法。或者,“如果P,那么我可以得出Q。”那么,你在教Prolog如何得出一个名为
而不是
的结论,这几乎肯定不是你的意思

现在,转到下一行,出现错误的地方:

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(比尔,汤姆)。击败(公牛,汤姆)。


我希望这能帮助您渡过难关。

您首先需要定义hit在本文中的含义。我看到的信息是猫,是动物,是狗,拥有甚至不打。但是hit对于这些谓词和事实意味着什么呢?就目前而言,这没有多大意义。哦,我犯了一个错误。我想问一下
?-notbeat(X,tom)
,但无论如何。它应该意味着,X不击败/击中汤姆什么是
不(notbeat(比尔,汤姆),notbeat(bull,汤姆))。
的意思是什么?你需要首先定义hit在这个上下文中的含义。我看到的信息是猫,是动物,是狗,拥有甚至不打。但是hit对于这些谓词和事实意味着什么呢?就目前而言,这没有多大意义。哦,我犯了一个错误。我想问一下
?-notbeat(X,tom)
,但无论如何。它应该意味着,X不打汤姆什么不打(不打(比尔,汤姆),不打(牛,汤姆))是什么意思?我想说的是,“比尔打汤姆或牛打汤姆”。所以说
打败(比尔,汤姆)。beat(bull,tom)。
在这里没有多大意义。你不能在谓词或查询之外这样说。我想说的是,“Bill打败tom或bull打败tom”。所以说
打败(比尔,汤姆)。beat(bull,tom)。
在这里没有多大意义。你不能在一家公司外这么说