Swi-Prolog:无权修改静态程序

JFo*_*eca 5 prolog

我是序言初学者。对于编译此示例的任何帮助,我将非常感谢。我猜规则的形式是“结果:-先行”

%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).
Run Code Online (Sandbox Code Playgroud)

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

swipl -s "pathofthecode.pl"
Run Code Online (Sandbox Code Playgroud)

Swi-Prolog为第二条规则抛出此错误:

'$record_clause'/2: No permission to modify static_procedure `(;)/2'
Run Code Online (Sandbox Code Playgroud)

谢谢azhrei,您说过:“我想您要说的是,即使X1是捕食者Y1的捕食者,因为X1是聪明的,X1也将无法捕获Y1。”

我发现序言有一些强大的约束[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).
Run Code Online (Sandbox Code Playgroud)

我也尝试使用:

 false :- predator(X),prey(Y),intelligent(Y),watch(X,Y),catch(X,Y).
Run Code Online (Sandbox Code Playgroud)

并且可以编译,但是当序言需要查找catch(X,Y)是否为true时,就不能这样做,因为谓词不在规则中。

-

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

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

azh*_*rei 5

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

你也不能改变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;,但不能在规则头中使用。