【发布时间】: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]:
- Prolog 不允许“或”(分离)事实或结论。
- Prolog 不允许“非”(负面)事实或结论。
- Prolog 不允许大多数事实或结论具有存在量化。
- 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