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)。
在这里没有多大意义。你不能在一家公司外这么说