私はちょうど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はどのように次のクエリに応答しますか?
wizard(ron). -> true
witch(ron). -> undefined procedure
wizard(hermione). -> false
witch(hermione). -> undefined procedure
wizard(harry). -> true
wizard(Y). -> Y = ron ; Y = harry.
witch(Y). -> undefined procedure
Ubuntuでswipl
を使用して、この練習用のナレッジベースをインポートします。まず、Prologが返すものを解読し、最後に自分でチェックします。
[OK]をかなり退屈なものは今まで、私はGitHubのオーバーこれらの演習(here、hereとthere)にいくつかの答えを見ている、と私は最初のものへの答えを理解していません:%% 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.
私はそれを得る方法を、最初のプロローグナレッジベースから最初の事実を返し、ルールヘッドを適用して、ロンに箒もワンドもないことを確認します。
これらすべてが私の質問につながります。この質問に対する回答としては、他の人たちには何が書かれていないのですか?
if_member/2
としてたとえば、あなたが書くことができ、それはすぐに次々とそこに書かれていないと文句を言い。 –
さらに、 'true' *を返す少なくとも1つのパスがあります。 –
あなたが指している 'exercise.pl'はあまり構造化されていません。これは 'wizard(ron).'を定義します。これは' wizard(X): - 'です。つまり、 'wizard'の定義は* discontiguous *であり、多くのPrologインタプリタはこの時点で' wizard(X) 'を無視します。すべての 'wizard(_)'定義を互いに隣り合わせにする必要があります。 – lurker