【问题标题】:Swi-Prolog: No permission to modify static procedureSwi-Prolog:无权修改静态过程
【发布时间】:2012-07-19 04:02:53
【问题描述】:

我是序言初学者。我非常感谢编译此示例的任何帮助。我猜规则的形式是“后件:-前件”

%rules
prey(Y2), watch(X2,Y2) :- predator(X2).
false :- predator(X1),prey(Y1),intelligent(Y1),watch(X1,Y1),catch(X1,Y1).
catch(X3,Y3);hungry(X3) :- predator(X3),prey(Y3),watch(X3,Y3).

%facts
predator(shaki).
prey(pelusa).
intelligent(shaki).
intelligent(pelusa).
watch(shaki,pelusa).

我使用 SWI-Prolog 版本 5.10.4(i386,Ubuntu Natty Narwhal)编译了代码:

swipl -s "pathofthecode.pl"

Swi-Prolog 为第二条规则抛出了这个错误:

'$record_clause'/2: No permission to modify static_procedure `(;)/2'

谢谢 azhrei,你说:“我想你想说的是 X1 将无法抓住 Y1,即使 X1 是捕食者 Y1 观察猎物,因为 Y1 很聪明。”,是的。 !!

我发现prolog有一些强约束[1]:

  1. Prolog 不允许“或”(分离)事实或结论。
  2. Prolog 不允许“非”(负面)事实或结论。
  3. Prolog 不允许大多数事实或结论具有存在量化。
  4. Prolog 不直接允许二阶逻辑。

所以我像这样更改了代码:

%rules
predator(X) :- prey(Y), watch(X,Y).
catch(X,Y) :- predator(X),prey(Y),not(intelligent(Y)),watch(X,Y).
hungry(X) :- predator(X),prey(Y),watch(X,Y),not(catch(X,Y)).

%facts
prey(pelusa).
intelligent(shaki).
intelligent(pelusa).
watch(shaki,pelusa).

我也尝试过使用:

 false :- predator(X),prey(Y),intelligent(Y),watch(X,Y),catch(X,Y).

它可以编译,但是当prolog需要查找catch(X,Y)是否为真时,它不能,因为谓词不在规则结果中。

--

[1]。尼尔·C·罗,网址:http://faculty.nps.edu/ncrowe/book/chap14.html

注意:此示例取自哥斯达黎加 UCR 的 Yadira Solano 教授课程

【问题讨论】:

  • 干得好 - 我已经更新了我的答案,以免误导任何人。 :-) 不确定您的最后一个谓词是否正在编译!

标签: prolog


【解决方案1】:

错误消息是关于您对分号; 的使用。你不能重新定义它。

您也不能更改 false 谓词。所以我很惊讶你说这个编译:

false :- predator(X),prey(Y),intelligent(Y),watch(X,Y),catch(X,Y).

它不适合我。 :-) (SWI-Prolog)

在第二条规则中,我认为您想说的是: X1 将无法抓住 Y1,即使 X1 是捕食者,也在观察猎物 Y1,因为 Y1 很聪明。 在这种情况下,您需要:

catch(X,Y) :- ...,...,...,...,not(intelligent(Y)).

(正如您发现的那样,并在您的帖子中进行了编辑。:-)

注意:您提供的链接显示了一些逻辑上等价的语句,但这并不意味着您可以在代码中使用它们,因为它们在 Prolog 中在程序上不等价。您可以在查询中(在 prolog 提示符处)或规则正文中使用 false;,但不能在规则头中使用。

【讨论】:

    猜你喜欢
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2016-01-16
    相关资源
    最近更新 更多