Prolog- children 的家谱
Prolog- family tree of children
如果我想在 prolog 中递归地沿着家谱向下走并且 return 只有每个分支的 children,我将如何开始?
谢谢
假设下面的树,children in red
一个简单的解决方案可以是:
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.
这只是一个如何完成的简单示例,该示例依赖于一个 child 不能有另一个 child 的假设,但是这个解决方案可以很容易地改进,您可以添加 cousin/2
、grandfather/2
、sister/2
、uncle/2
等规则...
希望你现在对这个想法有所了解,祝你好运。
如果我想在 prolog 中递归地沿着家谱向下走并且 return 只有每个分支的 children,我将如何开始?
谢谢
假设下面的树,children in red
一个简单的解决方案可以是:
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.
这只是一个如何完成的简单示例,该示例依赖于一个 child 不能有另一个 child 的假设,但是这个解决方案可以很容易地改进,您可以添加 cousin/2
、grandfather/2
、sister/2
、uncle/2
等规则...
希望你现在对这个想法有所了解,祝你好运。