所有可达节点的祖先
Ancestor to all reachable node
我是这样写的。但它只成功地找到了祖父母,而没有找到更远的地方。我如何以找到所有可能祖先的方式编写它。也就是说,如果存在这样的事实,找到曾祖父母甚至更进一步?
ancestor(X, Y) :- parent(X, Y); parent(X,Z), parent(Z,Y).
给出
parent(greatgrand_parent, grand_parent).
parent(grand_parent, parent).
parent(parent, child).
Returns 仅
?- ancestor(What, child).
What = parent ;
What = grand_parent ;
false.
你忘了递归调用:try
ancestor(X, Y) :- parent(X, Y); parent(X,Z), ancestor(Z,Y).
你得到
?- ancestor(X,child).
X = parent ;
X = greatgrand_parent ;
X = grand_parent ;
false.
传递闭包是 Prolog 中经常出现的问题。那么为什么不将具体的 - 在你的情况下是关系 parent/2
与一般 - 关系 closure/3
.
分开
| ?- closure(parent, What, child).
What = greatgrand_parent ? ;
What = grand_parent ? ;
What = parent ? ;
no
我是这样写的。但它只成功地找到了祖父母,而没有找到更远的地方。我如何以找到所有可能祖先的方式编写它。也就是说,如果存在这样的事实,找到曾祖父母甚至更进一步?
ancestor(X, Y) :- parent(X, Y); parent(X,Z), parent(Z,Y).
给出
parent(greatgrand_parent, grand_parent).
parent(grand_parent, parent).
parent(parent, child).
Returns 仅
?- ancestor(What, child).
What = parent ;
What = grand_parent ;
false.
你忘了递归调用:try
ancestor(X, Y) :- parent(X, Y); parent(X,Z), ancestor(Z,Y).
你得到
?- ancestor(X,child).
X = parent ;
X = greatgrand_parent ;
X = grand_parent ;
false.
传递闭包是 Prolog 中经常出现的问题。那么为什么不将具体的 - 在你的情况下是关系 parent/2
与一般 - 关系 closure/3
.
| ?- closure(parent, What, child).
What = greatgrand_parent ? ;
What = grand_parent ? ;
What = parent ? ;
no