1
parent(_,_).
descendant(X,Y):- parent(Y,X).
descendant(edward,david).
descendant(malcolm,mark).
descendant(edward,therese).
descendant(malcolm,nathalie).
descendant(matthew,raymond).
descendant(matthew,nadine).
sibling(X,Y):- descendant(X,Z), descendant(Y,Z).
sibling(edward,kevin).
sibling(sean,vicky).
sibling(vicky,edward).
sibling(malcolm,claude).
sibling(matthew,stephania).
sibling(matthew,kurt).

ここでの問題は、何らかの理由でコードが機能しないことです。つまり、このコードに関して入力したクエリに関係なく、常に true が返されるということです (プログラムにすべてのアトムを含めているわけではありません。これは単純な男性 (X) または女性 (X) であり、すべてが含まれている人々の一部がカバーされているため、時間を節約できます) 私が言いたいことの例: ?- 兄弟(エドワード、デビッド)。真実。私が意味をなしていない場合は申し訳ありませんが、誰かが私がここで間違っていることを教えてくれたら、本当に感謝します...

parent/2 は直接述語であり (直接とは、他の述語に関して定義されていないことを意味します)、それに関する私の問題は、それを parent(X,Y) に変更すると、シングルトン エラーが発生することです。

4

1 に答える 1

3

コードの最初の行 ( parent(_,_).) は常に成功します。

sibling/sしたがって、どの使用descendant/sを使用する手順parent/sも、常に少なくとも 1 回は成功します。

この句 ( parent(_,_).) は、任意の 2 人が親であると述べているように見えるため、削除する必要があります。

于 2013-04-26T14:06:48.120 に答える