Recursion 获取每个递归的结果或将其写入列表。-谱系学

Recursion 获取每个递归的结果或将其写入列表。-谱系学,recursion,prolog,Recursion,Prolog,我有家谱。 分配下列声明: man(thomas, 1960). man(stefan, 1990). man(leon, 2012). woman(regine, 1965). woman(nina, 1992). born(thomas, 1960, regine, 1965, nina, 1992). born(stefan, 1990, nina, 1992, leon, 2012). born_2(Parent1, Bd1, Parent2, Bd2, Child, BdC) :-

我有家谱。 分配下列声明:

man(thomas, 1960).
man(stefan, 1990).
man(leon, 2012).
woman(regine, 1965).
woman(nina, 1992).
born(thomas, 1960, regine, 1965, nina, 1992).
born(stefan, 1990, nina, 1992, leon, 2012).

born_2(Parent1, Bd1, Parent2, Bd2, Child, BdC) :- setof(t,(born(Parent1, Bd1, Parent2, Bd2, Child, BdC); born(Parent2, Bd2, Parent1, Bd1, Child, BdC)),_).
parent(Parent, BdP, Child, BdC) :- born_2(Parent, BdP, _, _, Child, BdC).
ancestor(Ancestor, BdA, Person, BdP) :- parent(Ancestor, BdA, Person, BdP), ancestor(P, Bd, Ancestor, BdA).
我从
中得到了什么?-祖先(X,B,leon,2012)。
只是
错误。
当我把
write(祖先)
放在代码中时,它给了我正确的答案,但方式不对:
stefanthomasreginenina

我希望的结果是:

?- ancestor(X, B, leon, 2012).
X = stefan ;
B = 1990 ;
X = nina ;
B = 1992;
X = thomas ;
B = 1960 ;
X = regine ;
B = 1965.
我试过这样的方法:

ancestor(Ancestor, BdA, Person, BdP) :- List=[], parent(Ancestor, BdA, Person, BdP), append(List, [Ancestor, BdA], List), ancestor(P, Bd, Ancestor, BdA).
但没能成功

我该怎么办


(这不是我的原始代码。这只是翻译后的剪报。拼写错误可能来自翻译,很可能不是我需要结果的问题。)

该死。我自己找到了解决办法

祖先需要两行代码:

ancestor(Ancestor, BdA, Person, BdP) :- parent(Ancestor, BdA, Person, BdP).
ancestor(Ancestor, BdA, Person, BdP) :- parent(Ancestor, BdA, Child, BdC), ancestor(Child, BdC, Person, BdP).
这给了我正确的答案:

?- ancestor(X, B, leon, 2012).
X = stefan ;
B = 1990 ;
X = nina ;
B = 1992;
X = thomas ;
B = 1960 ;
X = regine ;
B = 1965.

在“递归4”中找到它。

write
不会自动追加换行符。使用
writeln
或在
write
之后放置
nl
write(Foo),nl
@mbrach:再次感谢您的帮助。我自己找到了答案。不好意思,我问了…不不好意思。你诚实地问。唯一比找到问题的解决方案更好的事情是自己解决问题。:)太好了!很高兴你找到了!