【问题标题】:Swi-Prolog: No permission to modify static procedure `(;)/2'Swi-Prolog:无权修改静态过程 `(;)/2'
【发布时间】:2018-05-07 22:36:58
【问题描述】:

嗨 :) 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).

这会产生错误:No permission to modify static procedure `(;)/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).

这将产生账单

那么我们如何更改代码,以便我们可以知道是谁打了汤姆?

【问题讨论】:

  • 您需要首先定义 hit 在此上下文中的含义。我看到了关于 is catis animaldogowns 甚至 notbeat的信息>。但是就这些谓词和事实而言,hit 意味着什么?就目前而言,这并没有多大意义。
  • 哦,我做错了。我想问?-notbeat(X,tom) 但无论如何。这意味着,X 不会击败/击中汤姆
  • not(notbeat(bill,tom),notbeat(bull,tom)). 是什么意思?

标签: prolog


【解决方案1】:

排队

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

您的意思似乎是“比尔击败汤姆或公牛击败汤姆”。

但是根据 Prolog 的规则,您正在尝试重新定义 ;,这是不允许的,并且您不能将“Bill beat Tom or Bull beat Tom”写成事实。

【讨论】:

  • 但是除了它我还能怎么做呢?
【解决方案2】:

你的问题的根源是一些代码,在较少的语言中,会产生语法错误,但在语法上是有效的,但绝对没有意义的 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).

我希望这能帮助你克服困难。

【讨论】:

  • 我想说,“比尔击败汤姆或公牛击败汤姆”。所以说beat(bill, tom). beat(bull, tom).在这里没有多大意义。
  • 你不能在谓词或查询之外这么说。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多