2009-03-24 3 views
8

私はそれをやったが、私は兄弟、姉妹、叔父について尋ねると、その答えはを示していない、これは間違っているものを、私が書いたものであるプロローグファミリーツリー

を叔母?

/*uncle(X, Y) :– male(X), sibling(X, Z), parent(Z, Y).*/ 
/*uncle(X, Y) :– male(X), spouse(X, W), sibling(W, Z), parent(Z, Y).*/ 

uncle(X,Y) :- 
    parent(Z,Y), brother(X,Z). 

aunt(X,Y) :- 
    parent(Z,Y), sister(X,Z). 

sibling(X, Y) :- 
     parent(Z, X), 
     parent(Z, Y), 
     X \= Y. 

sister(X, Y) :- 
     sibling(X, Y), 
     female(X). 

brother(X, Y) :- 
     sibling(X, Y), 
     male(X). 

parent(Z,Y) :- father(Z,Y). 
parent(Z,Y) :- mother(Z,Y). 

grandparent(C,D) :- parent(C,E), parent(E,D). 

aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

male(john). 
male(bob). 
male(bill). 
male(ron). 
male(jeff). 

female(mary). 
female(sue). 
female(nancy). 

mother(mary, sue). 
mother(mary, bill). 
mother(sue, nancy). 
mother(sue, jeff). 
mother(jane, ron). 

father(john, sue). 
father(john, bill). 
father(bob, nancy). 
father(bob, jeff). 
father(bill, ron). 

sibling(bob,bill). 
sibling(sue,bill). 
sibling(nancy,jeff). 
sibling(nancy,ron). 
sibling(jell,ron). 

さらにもう1つ、私は兄弟のルールを最適化して、Xが自分自身にとって兄弟でないようにします。

答えて

5

ダイアグラムを複製しようとすると、あなたの公理の一部が間違っているか不足しているように見えます。

行方不明:

female(jane). 

father(john, bob). 

間違っ:

father(john, sue). 

これは、競合の兄弟ルールが発生する可能性があります。しかし、私は、プロローグについて知って

+0

+1、私は長いダッシュが全角またはいくつかのスマートワープロ –

3

弟のあなたのルールはすでにそれが既に確認X \= Yを作るために、チェックをしている、sibling(X, Y)を呼び出すためbrother(bob, bob)が失敗することを確認します。すべては私のマシンに取り組んでいるかのように

はまた、それが見えますが、私はこれらの行のダッシュを変更する必要がありました:

aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

へ:

aunt(X, Y) :- female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :- female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

うん、彼らは同じに見えます、しかし、トップバージョンのダッシュはやや長くなります...ファイルを参照したときに問題を引き起こすように見えました。

私はNotepad ++のPrologカラースキームを作成したので、誰かが興味があればオンラインで投稿できます。

+0

をテストしていないええ、私はそれをコピー&ペーストした推測しています残りの部分が書かれた場所以外の場所から) –

+0

によって作成されたダッシュENがおそらくあるそれら –

1

Xの兄弟のルールを最適化するためには、それ自体に兄弟ではありません。

あなたは実行する必要があります。

brother(X, Y) :- 
     sibling(X, Y), 
     male(X), 
     not X=Y. 
1

あなたが事実の強力なデータベースとparent(X,Y)と呼ばれる非常に重要な述語を持っています。アプローチについて論理的に考えてみてください。これ
A)オス/メス、male(X)またはfemale(X)が述語
b)のX内でなければならず、Yは同じを持っていますが、使用するように注意してくださいいずれかmotherか:兄弟/姉妹である

  • father関数を使用します。そうしないと結果が2回表示されるためです。
    PS:X/=Yを必ずご確認ください。 =)

例:
brother(X,Y):- X/=Y, male(X), father(Father,X), father(Father,Y).

    叔父/叔母である
  • (ビットトリッキーではなくロット):
    a)は、オス/メスです。
    b)叔母は、兄弟のお母さんまたはお父さんの姉/兄弟です。

例:
aunt(X,Y):- female(X), parent(Parent,Y),sister(X,Parent).

PS:おばさんも兄弟のお母さんやお父さん(おじさんの妻)の兄の妻と見なすことができます。しかし、この場合は、married_coupleを表す新しい事実を導入する必要があります。

aunt(X,Y):- female(X),
parent(Parent,Y),
(sister(X,Parent); (brother(Parent,Uncle),married_couple(Uncle,X))).

・ホープ、この作品;)あなたの叔母/ 2述語が一緒に配置されていない

1

、したがって、Prologは祖父母/ 2は、叔母/ 2であると想定。下記のように一緒に配置するか使用する

:- discontiguous(aunt/2). 

配偶者/ 2は使用しますが、定義しないでください。さらに、Prologはどこかの兄弟/ 2述語があると仮定し、father/2を使用します。これは、KBの最下部に兄弟姉妹のリストを定義するためです。再び、以下のように一緒に配置します。

他の回答に記載されているように、not(X = Y)を使用できます。

parent(Z,Y) :- father(Z,Y) ; mother(Z,Y). 

sibling(bob,bill). 
sibling(sue,bill). 
sibling(nancy,jeff). 
sibling(nancy,ron). 
sibling(jell,ron). 

sibling(X,Y) :- 
    parent(A,X), 
    parent(A,Y), 
    not(X = Y). 


sister(X, Y) :- 
     sibling(X, Y), 
     female(X), 
     not(X = Y). 

brother(X, Y) :- 
     sibling(X, Y), 
     male(X), 
     not(X = Y). 

grandparent(C,D) :- parent(C,E), parent(E,D). 

aunt(X,Y) :- 
    parent(Z,Y), sister(X,Z). 
aunt(X, Y) :- female(X), sibling(X, Z), parent(Z, Y). 
% aunt(X, Y) :- female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

uncle(X,Y) :- 
    parent(Z,Y), brother(X,Z). 


male(john). 
male(bob). 
male(bill). 
male(ron). 
male(jeff). 

female(mary). 
female(sue). 
female(nancy). 
female(jane). 

mother(mary, sue). 
mother(mary, bill). 
mother(sue, nancy). 
mother(sue, jeff). 
mother(jane, ron). 

father(john, sue). 
father(john, bill). 
father(bob, nancy). 
father(bob, jeff). 
father(bill, ron). 
0

最初:

はあなたのコードのを開始であなたの事実を置きます!

と弟のため

equal(X,Y) :- 
    X=Y. 

different(X,Y):- 
    not(equal(X,Y)). 

brother(X, Y) :- 
    sibling(X, Y), 
    male(X), 
    different(X,Y).