2016-04-06 12 views
0
likes(alice, sports). 
likes(alice, music). 
likes(carol, music). 
likes(david,animals). 
likes(david,X) :- likes(X,sports). 
likes(alice,X) :- likes(david,X). 

?- likes(alice,X). 

私は数日前にプロローグを勉強しようとしていましたが、この質問を試みると、変数がインスタンス化され使用された時期を完全には理解できませんでした。最初の目標はlikes(alice , X)です。その後、証明する次の目標はlikes(david , X)ですか?それはlikes(X, sports)です。次にXaliceになりますか?Prologはどのようにこのクエリに答えますか?

別ルート:

初期の目標は次のとおりです。likes(alice , X)。その後、証明する次の目標はlikes(david , X)ですか?その後、Xsportsになります。目標はlikes(david , sports)になります。それから私は知らない。

誰かが私の考えが間違っている場所を示してください。

+0

変数は決して "インスタンス化"されません - **統一**です。 – Enigmativity

+0

*ゴール*は「好き(ダビデ、スポーツ)」にはなりません。 '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

+0

@lurker - 明確にするかどうかは分かりません。変数は統一される前にすでに存在しています。統一の前には自由変数ですが、その後は単に既存の原子や変数と同じです。統一の時に実際にインスタンス化されるものはありません。変数がアトムで統一されていると、変数は事実上アトムへの参照になり、インスタンス化されません。変数が別の(自由な)変数で統一されていると、インスタンス化されたことを全く言わないほど複雑になります。 – Enigmativity

答えて

0

あなたのコードが与えられたら、Prologは最初の事実であるlikes(alice, sports).とのゴールを統一しようとし、成功するでしょう。 Xsportsと統合されます。

プロローグに続行するように依頼した場合は、次にXmusic(第2の事実)と統一します。

もう一度やり直したら、次の3つの事実/ルールをスキップして、likes(alice,X) :- likes(david,X).を証明しようとします。これは、likes(david,animals)と成功したlikes(david,X)を証明しようとするため、元の目標ではXanimalsと統合されます。

そして、あなたはそれがaliceX統一につながるので、当初の目標はalicelikesaliceことを示唆しているlikes(david,X) :- likes(X,sports).を証明しようとすることを見つけるだろう、再び継続することを求めた場合。私は私の目標でfail述語を持っていたので引き起こされ

 
sports 
music 
animals 
alice 
No. 

最終No.の場合:私は、この目標にあなたのコードを実行した

 
?- likes(alice,X), write(X), nl, fail. 

...私はこの出力を得ました。それはいつも失敗する目標だったが、中間結果をXとして出力することで副作用が生じた。

0

コードを分解しましょう。まず、あなたはいくつかの事実を持っている:

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.を実行してクエリを実行すると、ステップバイステップで実行できます。

これは、これらの単純なルールと事実によってかなりうまく動作することに注意してください。より複雑なケースでは、無限の論理ループにつながる可能性があるため、ルールとファクトを同じ方法で命名することに注意する必要があります。