祖先到所有可达节点

时间:2016-03-25 06:56:14

标签: prolog transitive-closure

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

 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.

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:2)

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

| ?- closure(parent, What, child).
What = greatgrand_parent ? ;
What = grand_parent ? ;
What = parent ? ;
no