2017-07-20 8 views
2

私はちょうどPrologを学び始めました、そして、私はこのexerciseの最初の質問について疑問に思っています。今すぐPrologを学ぼう:エクササイズ1.5の最初の質問に答えるのはなぜですか?

%% Suppose we are working with the following knowledge base: 
wizard(ron). 
hasWand(harry). 
quidditchPlayer(harry). 
wizard(X) :- hasBroom(X), hasWand(X). 
hasBroom(X) :- quidditchPlayer(X). 

Prologはどのように次のクエリに応答しますか?

  1. wizard(ron). -> true
  2. witch(ron). -> undefined procedure
  3. wizard(hermione). -> false
  4. witch(hermione). -> undefined procedure
  5. wizard(harry). -> true
  6. wizard(Y). -> Y = ron ; Y = harry.
  7. witch(Y). -> undefined procedure

Ubuntuでswiplを使用して、この練習用のナレッジベースをインポートします。まず、Prologが返すものを解読し、最後に自分でチェックします。

[OK]をかなり退屈なものは今まで、私はGitHubのオーバーこれらの演習(hereherethere)にいくつかの答えを見ている、と私は最初のものへの答えを理解していません:%% 1. wizard(ron). -> trueを。

すべてのインタプリタの第wizardあるものの2つの定義文句を言っている:

第二
Warning: /tmp/prolog/ex15.pl:4: 
    Clauses of wizard/1 are not together in the source-file 
     Earlier definition at /tmp/prolog/ex15.pl:1 
     Current predicate: quidditchPlayer/1 
     Use :- discontiguous wizard/1. to suppress this message 

、私は入手問い合わせるとき:

?- wizard(ron). 
true ; 
false. 

私はそれを得る方法を、最初のプロローグナレッジベースから最初の事実を返し、ルールヘッドを適用して、ロンに箒もワンドもないことを確認します。

これらすべてが私の質問につながります。この質問に対する回答としては、他の人たちには何が書かれていないのですか?

+1

if_member/2として

たとえば、あなたが書くことができ、それはすぐに次々とそこに書かれていないと文句を言い。 –

+2

さらに、 'true' *を返す少なくとも1つのパスがあります。 –

+3

あなたが指している 'exercise.pl'はあまり構造化されていません。これは 'wizard(ron).'を定義します。これは' wizard(X): - 'です。つまり、 'wizard'の定義は* discontiguous *であり、多くのPrologインタプリタはこの時点で' wizard(X) 'を無視します。すべての 'wizard(_)'定義を互いに隣り合わせにする必要があります。 – lurker

答えて

2

このクエリの答えとして他の人が書いているのは間違っていますか?

`?- wizard(ron).` 
true; 
false 

あなたはKBで句(事実)wizard(ron).を持っています。

ルール句としても、事実を書くことができ、物事をより明確にするには、次の

wizard(ron) :- true.

を使用すると、これはかなり冗長な表記法が、一般的な事実の表現として、いくつかのケースで有用である見ることができるように。

次のようにだからあなたのクエリを解釈することができます:

ronと呼ばれるwizardありますか?あなたは事実を持っているので

wizard(ron) :- true.

プロローグは、最初の目標と頭を統一します。 あなたのケースでは、目標と頭に変数がないので、統一は簡単です。

次に、プロローグはボディを証明しようとします。本文には述語trueが組み込まれているので、すぐに回答を得ることができます。

[;]を押すと、代替ソリューションの検索を開始します。 クエリには、wizard(ron)の解決策が存在しないため、Prologはと書き込みます。

ドット演算子は、節の終わりを指定します。だからあなたの例に間違って入力したドット:

->演算子はif-then-else関係を意味します。それは節の本文内で使用できます。通訳が本当にウィザードのための2つの定義があるという事実に文句はありませんstd_member/2

std_member(X, [ X | _ ]). 
std_member(X, [ _ | Xs ]) :- 
    std_member(X, [ _ | Xs). 

if_member(X, [ Y | Xs ]) :- 
    X = Y -> true; 
     if_member(X, Xs). 
関連する問題