1

以下の事実について考えられる状況を見ようとしています。

don likes cain
bob does not like don
cain does not like aron
nobody likes someone who does not like him
aron likes everyone who likes bob
don likes everyone bob likes
everybody likes somebody

私はプロローグの学習を始めたばかりで、これをプロローグに実装して、考えられる状況がいくつ発生するかを確認しようとしています。私はいくつかのプロローグ スレッドをここでスキャンしました。また、本「Learn prolog now」も使用しています。したがって、これがコードを思いつくための私の最善の試みです。

likes(don, cain).
likes(aron,W):- likes(W,bob).
likes(don,M):- likes(bob,M).


(likes(aron,aron);likes(aron,bob));(likes(aron,cain);likes(aron,don)).

(likes(bob,aron);likes(bob,bob));(likes(bob,cain);likes(bob,don)).

(likes(cain,aron);likes(cain,bob));(likes(cain,cain);likes(cain,don)).

(likes(don,aron);likes(don,bob));(likes(don,cain);likes(don,don)).



not(likes(bob,don)).
not(likes(cain,aron)).

not(likes(Y,X)) :- not(likes(X,Y)).

これを Ubuntu Linux (winxp 内の VirtualBox にある) の swipl コンパイラで実行すると、次のエラーが発生します。

?- [test].
ERROR: /home/test.pl:11:
    '$record_clause'/2: No permission to modify static_procedure `(;)/2'
ERROR: /home/test.pl:13:
    '$record_clause'/2: No permission to modify static_procedure `(;)/2'
ERROR: /home/test.pl:15:
    '$record_clause'/2: No permission to modify static_procedure `(;)/2'
ERROR: /home/test.pl:17:
    '$record_clause'/2: No permission to modify static_procedure `(;)/2'
% test compiled 0.00 sec, 1,616 bytes
true.

これで私を助けてもらえますか......私はnotここで述語として使用しました.ネット上のいくつかのスレッドはそれについて言及しているようです.

4

1 に答える 1

1

Prolog では、真実をかなり自然に表現できますが、否定的な情報 (否定など) に直面した場合、Prolog が提供する制限された計算モデルに直感を適応させる必要があります。

特に、プロローグのセマンティックは閉じた世界の仮定に基づいているため、 のような無関係な命題として省略したくなる可能性がありますbob does not like don。そのような不在は、Prolog プルーフ サーチでは実際に「吸収」され、not(Prolog でのみ利用可能ですが、「人間」の解釈をあまり連想させない演算子を使用して、つまり\+means not)の「手続き的」定義によって形式化されます。

\+ X :- call(X), !, fail.
\+ X.

についての詳しい解説はこちらのページをご覧ください。

「否定的な」知識を明示的に表すために not_like/2 を導入すると言うのは、このすべての紹介です。構文的には次のようになります。

likes(don, cain).
not_likes(bob, don).
not_likes(cain, aron).
not_likes(X, Y) :- \+ likes(Y, X).
likes(aron, X) :- likes(X, bob).
likes(don, X) :- likes(bob, X).
likes(_, _).

今、それらのステートメントは理にかなっていますか? Prolog は、ロジック プログラミングへの実用的なアプローチの観点から、プログラミング タスクにとって完全に理にかなっているようなに対してrunクエリを実行します...knowledge

コメントで提案された編集likes(_,_).、代わりに、のより良いコードeverybody likes somebody

likes(X, Y) :- \+ not_likes(X, Y).

これは最後の事実によって正当化されますが、スタンドアロンでは推論できませんnot_likes(cain, aron).

于 2012-10-06T12:36:51.753 に答える