コードを分解しましょう。まず、あなたはいくつかの事実を持っている:
likes(alice, sports). % Alice likes sports
likes(alice, music). % Alice likes music
likes(carol, music). % Carol likes music
likes(david, animals). % David likes animals
はただ、これらの事実を考えると、あなたは基本的なクエリすることができます:だから
?- likes(alice, sports). % Does Alice like sports?
true ;
false. % no more solutions
を、はい、アリスは(結果はtrue
だった)、スポーツが好き。アリスは動物のようですか?
?- likes(alice, animals).
false.
明らかにそうではありません。少なくとも、私たちが持っているデータによれば、アリスは動物が好きであることを証明することはできません。 (覚えておいて、我々はこれまでの事実だけを持っていますが、以下に示すルールはありません。)
それでは、アリスは何をしているのですか?
?- likes(alice, X).
X = sports ;
X = music.
アリスはスポーツと音楽が好きです。
今度は、あなたのルールに追加してみましょう:
likes(david, X) :- likes(X, sports).
これは、誰かが(X
)スポーツが好きならばはダビデは誰か(X
を)好き、と述べています。
のは、ダビデが好きな人を/見てみましょう:
?- likes(david, X).
X = animals ;
X = alice ;
false % no more solutions
ので((実際はそう言うので)ダビデは動物が好きで、ダビデはアリスが好きな私たちは、Xはスポーツが好きならば、ダビデはXを好きというルールを持っているので、 Aliceはスポーツが好きです)。
あなたの他のルール:
likes(alice, X) :- likes(david, X).
は言う、ダビデがその同じ誰か(X
)が好きならばアリスは誰か(X
)が好きです。追加された新ルールで
、のは、アリスが好きな人/見てみましょう:(事実がそう言うので)
は ?- likes(alice, X).
X = sports ;
X = music ;
X = animals ;
X = alice ;
false
アリスはスポーツや音楽が好き。デイヴィッドがXを好きならば、アリスはXを好きだと言っている。第1のルールによれば、ダビデはアリスが好きであることを示しているからだ。第2のルールによれば、アリスはダビデが好きな人は誰もが好きです。したがって、アリスはアリスが好きです。
trace.
を実行してクエリを実行すると、ステップバイステップで実行できます。
これは、これらの単純なルールと事実によってかなりうまく動作することに注意してください。より複雑なケースでは、無限の論理ループにつながる可能性があるため、ルールとファクトを同じ方法で命名することに注意する必要があります。
変数は決して "インスタンス化"されません - **統一**です。 – Enigmativity
*ゴール*は「好き(ダビデ、スポーツ)」にはなりません。 'likes(alice、X)'の述語本体の* goal *は 'X'が' sports'で統一されたときにtrueになる 'likes(david、X)'なので 'X = sports'はまたは少なくとも "a")の解決策である 'likes(david、X) 'を返します。これが 'likes(alice、X)'の述語節の終わりなので 'likes(alice、X)'は 'X = sports'で成功します。 – lurker
@lurker - 明確にするかどうかは分かりません。変数は統一される前にすでに存在しています。統一の前には自由変数ですが、その後は単に既存の原子や変数と同じです。統一の時に実際にインスタンス化されるものはありません。変数がアトムで統一されていると、変数は事実上アトムへの参照になり、インスタンス化されません。変数が別の(自由な)変数で統一されていると、インスタンス化されたことを全く言わないほど複雑になります。 – Enigmativity