我是序言初学者。我非常感谢编译此示例的任何帮助。我猜规则的形式是“结果:-先行”
%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 教授课程