プロローグ初心者です。この例をコンパイルするための助けをいただければ幸いです。ルールは「結果:-前件」という形式になっていると思います
%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 は、2 番目のルールに対して次のエラーをスローしました。
'$record_clause'/2: No permission to modify static_procedure `(;)/2'
ありがとう azhrei、あなたは言いました: "あなたが言おうとしているのは、Y1 は賢いので、X1 は獲物 Y1 を見ている捕食者であるにもかかわらず、X1 は Y1 を捕まえることができないということだと思います.", はい、そうです!!
プロローグにはいくつかの強い制約があることがわかりました [1]:
- Prolog では、"or" (論理和) の事実や結論を使用できません。
- Prolog では、「否定的」(否定的) な事実や結論は認められません。
- Prolog では、ほとんどの事実や結論が存在量化されることは許可されていません。
- Prolog では、2 次ロジックを直接使用することはできません。
だから私は次のようにコードを変更しました:
%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) が true かどうかを調べる必要がある場合、述語がルールの後件にないため、できません。
--
[1]。ニール C. ロウ、URL: http://faculty.nps.edu/ncrowe/book/chap14.html
注:この例は、コスタリカの UCR の Yadira Solano 教授コースから取得したものです。