2

我是这样写的。但它只成功地找到了祖父母,而不是更远的地方。我如何编写它以找到所有可能的祖先。也就是说,如果存在这样的事实,找到曾祖父母甚至更远?

 ancestor(X, Y) :- parent(X, Y); parent(X,Z), parent(Z,Y).

给定

parent(greatgrand_parent, grand_parent).
parent(grand_parent, parent).
parent(parent, child).

仅退货

?- ancestor(What, child).
What = parent ;
What = grand_parent ;
false.
4

2 回答 2

2

你忘记了递归调用:试试

ancestor(X, Y) :- parent(X, Y); parent(X,Z), ancestor(Z,Y).

你得到

?- ancestor(X,child).
X = parent ;
X = greatgrand_parent ;
X = grand_parent ;
false.
于 2016-03-25T07:22:47.250 回答
2

传递闭包是 Prolog 中经常出现的问题。那么,为什么不将特定关系(在您的情况下是关系parent/2与一般关系)分开closure/3

| ?- closure(parent, What, child).
What = greatgrand_parent ? ;
What = grand_parent ? ;
What = parent ? ;
no
于 2016-03-25T11:16:43.013 回答