2016-11-21 6 views
1

Prologで2人の間の曾祖父の程度を数える "greatcount"リレーションシップを作成する必要があります。たとえば、ある人が他の誰かの偉大な祖父母であれば2を返します。Prologを使用して家族関係の祖父母の数をカウントする

私はXがYの親である親(X、Y)の事実しか持ちません。

私は次のように実装され、XがYの偉大-祖父母であるかどうかを確認するために偉大な - 祖父母(X、Y)述語を追加しました:

great-grandparent(X,Y) :- parent(X,D), parent(D,F), parent(F,Y). 

私はそうのような私greatcount述語実装:

greatcount(X,Y,1) :- great-grandparent(X,Y), !. 
greatcount(X,Y,N1) :- great-grandparent(X,Z), greatcount(Z,Y,N2), N1 is N2+1. 

ただし、最初の大小関係が一致しない場合、結果は常にfalse(またはNo)になります。どうして?

+0

'( - )/ 2'は中置演算子であるため、' - (great、grandparent) 'という形式のルールを定義していることに注意してください。 – mat

答えて

0

本当に間違いはありますか?ここで成功した例です:たぶん、あなたは(私が与えた例を使用して)ことを考えに間違いを作っている

parent(pedro, hugo). 
parent(hugo, herminia). 
parent(herminia, ze). 
parent(ze, quim). 
parent(quim, tostas). 
parent(tostas, faneca). 
parent(faneca, xico). 

?- greatcount(pedro, faneca, X) 
2 
true. 

tostaspedroの第二度の大きな-祖父母する必要がありますが、それは」doesnのあなたが与えた定義に従ってください。 great-grandparent/2に従うと、述部は再帰的なケースでZzeに統一し、親の親がzeであることを確認します。この場合、fanecaです。そうしないと、次のコードを使用する必要があります:

greatcount(X,Y,1) :- great-grandparent(X,Y), !. 

greatcount(X,Y,N1) :- 
    parent(X,D), 
    parent(D,F), 
    greatcount(F,Y,N2), 
    N1 is N2+1. 

?- greatcount(pedro, xico, X), 
3 
true. 

をしかし、これはまさに偉大-偉大-祖父母を構成し、そのための再帰ステップで親/ 2目標を調整するものに依存しますgreatcountが必要な場合があります。

+1

私に教えてくれてありがとう!私は本当に祖父母/ 2と混同していました。 N1はN2 + 1です。 – Digitox1n

+0

@ Digitox1n:「いいえ、私は、もちろん問題ありません!それはまさに偉大な祖父母であることのすべての問題です:) –

関連する問題