2013-04-18 33 views
1

鑑於英國皇室, 只使用X父母(X)和母親(X,Y),其中X的父親是Y,如何創建連續線(X,Y),其中Y是確定舊的繼承序言序號

我已經定義了所有的男性和女性,父

我已經嘗試了這個問題,以及X在序言的繼任者:

son(X,Y) :- parent(X,Y), male(Y). 
daughter(X,Y) :- parent(X,Y), female(Y). 
successor(X,Y):- (son(X,Z);daughter(X,Z)) , (Y=Z;successor(Z,Y)). 

顯然這只是工作在louise之後,它應該去安妮而不是彼得。

我根據他們在父母(X,Y)的出生安排了事實。 事實就是我所詢問後繼(X,Y)時,到目前爲止得到

male(charles). 
male(william). 
male(peter). 
male(henry). 
male(andrew). 
male(edward). 
male(viscount). 
male(savanna). 

female(elizabeth). 
female(anne). 
female(zara). 
female(beatrice). 
female(eugenie). 
female(louise). 
female(isla). 

parent(elizabeth,charles). 
parent(elizabeth,anne). 
parent(elizabeth,andrew). 
parent(elizabeth,edward). 

parent(anne,peter). 
parent(anne,zara). 
parent(charles,william). 
parent(charles,henry). 
parent(andrew,beatrice). 
parent(andrew,eugenie). 
parent(edward,louise). 
parent(edward,viscount). 
parent(peter,savanna). 
parent(peter,isla). 

結果。

X = elizabeth, 
Y = charles ; 
X = elizabeth, 
Y = william ; 
X = elizabeth, 
Y = henry ; 
X = elizabeth, 
Y = andrew ; 
X = elizabeth, 
Y = beatrice ; 
X = elizabeth, 
Y = eugenie ; 
X = elizabeth, 
Y = edward ; 
X = elizabeth, 
Y = viscount ; 
X = elizabeth, 
Y = louise ; 

在此之後,當我嘗試去安妮家庭,它出錯了。

X = anne, 
Y = peter ; 
X = anne, 
Y = savanna ; 
X = anne, 
Y = isla ; 
X = charles, 
Y = william ; 
X = charles, 
Y = henry ; 
X = edward, 
Y = viscount ; 
X = peter, 
Y = savanna ; 
X = elizabeth, 
Y = anne ; 
X = elizabeth, 
Y = peter ; 
X = elizabeth, 
Y = savanna ; 
X = elizabeth, 
Y = isla ; 
X = elizabeth, 
Y = zara ; 
X = anne, 
Y = zara ; 
X = andrew, 
Y = beatrice ; 
X = andrew, 
Y = eugenie ; 
X = edward, 
Y = louise ; 
X = peter, 
Y = isla ; 

去,我想安妮樹時所需的輸出是

X = elizabeth, 
    Y = anne; 
    X = anne, 
    Y = peter ; 
    X = anne, 
    Y = savanna ; 
    X = anne, 
    Y = isla ; 

我一直在嘗試各種組合,這是我得到的最接近到目前爲止 X,同時父ÿ是父母(X,Y)中的孩子。

試圖接班人的組合:

successor(X,Y):- (son(X,Z);daughter(X,Z)) , (Y=Z;successor(Z,Y)). 
successor(X,Y):- parent(X,Z), (Y=Z ; successor(Z,Y)). 
successor(X,Y):- (male(Z);female(Z)) , (Y=Z;successor(Z,Y)). 
successor(X,Y):- (parent(X,Z),(male(Z);female(Z)), (Y=Z;successor(Z,Y)). 

他們都沒有工作。

顯示舊系繼承的實際結果是查爾斯的家人,安德魯的家人,愛德華的家人,最後是安妮的家人。

+0

「parent(X,Y)」的通常讀數是「'X'是'Y'的父親。它也與給定的代碼和數據庫一致(「伊麗莎白」不能有四個父母,我認爲)。 –

回答

2

您的問題是您使用的條件比需要更復雜,並且數據庫不完整。

具體來說,查爾斯和彼得小姐的性別,因爲這種代碼顯示

?- forall(((parent(P,_) ; parent(P,_)), \+(male(P);female(P))), writeln(P)). 
charles 
charles 
peter 
peter 
charles 
charles 
peter 
peter 
true. 

兒子和女兒取決於性別,讓你的條件失敗。您可以更正您的數據庫,或堅持更簡單:

successor(X,Y) :- parent(X,Z), (Y=Z ; successor(Z,Y)). 
+0

對於這一個,我已經嘗試過了。它依次給予charles,anne,andrew,edward家庭並重復其他家長條款。舊的繼任秩序是查爾斯,安德魯,愛德華,安妮家族,因爲安妮是一位女性,所以她的家庭分支將走到最後。 – user1771844