2016-11-21 34 views
1

我必須在Prolog中創建一個「大數」關係來計算兩個人之間的曾祖父母的程度。例如,如果某人是另一個人的曾祖父母,它會返回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. 

但是,當第一個greatcount關係不匹配時,結果始終爲假(或否)。怎麼來的?

+0

請注意,您正在定義' - (great,grandparent)'形式的規則,因爲'( - )/ 2'是一箇中綴運算符。 – 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. 

也許你正在做的認爲的錯誤(用我給的例子),tostas應該是pedro的第二度曾祖,但沒有按」按照你給出的定義。請注意,根據曾祖父母/ 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感到困惑。正確的結果我要找的是 'greatcount(X,Y,N1): - 父(X,d), greatcount(d,Y,N2), N1爲N2 + 1.' – Digitox1n

+0

@ Digitox1n:好沒問題!這完全是一個偉大的祖父母:) –