2016-11-05 214 views
0

如果我想在序言中遞歸地推下一棵家族樹,並且只返回每個分支的孩子,我該如何開始?Prolog-兒童家庭樹

感謝

+1

我很確定這是我在學習Prolog的第一課時的一個例子。你嘗試過什麼嗎? – kay

回答

1

假設下面的樹,孩子們在紅色

enter image description here

一個簡單的解決辦法,然後是:

male(lennart). 
male(mike). 
male(donald). 
male(usain). 
male(joar). 
male(adam). 
male(dan). 
male(simon). 
female(hillary). 
female(elise). 
female(lisa). 
female(lena). 

parent(mike, lennart). 
parent(mike, lena). 
parent(lennart, donald). 
parent(lennart, hillary). 
parent(lennart, usain). 
parent(lena, adam). 
parent(lena, simon). 
parent(adam, dan). 
parent(donald, lisa). 
parent(hillary, joar). 
parent(hillary, elise). 


child(lisa). 
child(joar). 
child(elise). 
child(dan). 
child(simon). 

%% predicate rules 
father(X,Y) :- male(X),parent(X,Y). 
mother(X,Y) :- female(X),parent(X,Y). 
son(X,Y) :- male(X),parent(Y,X). 
daughter(X,Y) :- female(X),parent(Y,X). 

family_children(X, X):- 
    child(X). 

family_children(X, Child):- 
    parent(X,Y), 
    family_children(Y, Child). 

試運行:

[debug] ?- family_children(mike, Child). 
Child = lisa ; 
Child = joar ; 
Child = elise ; 
Child = dan ; 
Child = simon ; 
false. 

這是它如何做只是一個簡單的例子,例子依賴的假設,即孩子不能要一個孩子,但是這可能的解決方案可以很容易地提高,你可以像cousin/2grandfather/2sister/2添加規則,uncle/2等...

希望你現在有一些想法,祝你好運。