如何在prolog中编写递归例程?

时间:2013-11-06 06:07:23

标签: prolog

我要编写一个例程,列出我写的所有后代

descend(X,Y) :- child(X,Y). 
descend(X,Y) :- child(X,Z), descend(Z,Y).

哪个工作正常所以任何后代我需要找到我只是下降(X,名字)。并且它一直以X = descend1,X = descend2的形式给我名字的后代 但要得到我必须按的结果;每次我正在尝试写的是一个例程的下降,它给出了所有下降的列表而没有按下;

descendb(X) :- descend(A,X), write(A).

这显然是错误的。

1 个答案:

答案 0 :(得分:1)

您可以通过“失败驱动”循环获得所有结果,即forall / 2

descendb(X) :- forall(descend(A,X), writeln(A)).

只有当我们必须对找到的每个解决方案都做一些“副作用”时才会有用,例如writeln(例如)。 既然你说你在'所有下降的列表'之后,请尝试使用findall / 3:

descendb(X, Ds) :- findall(D, descend(D,X), Ds).

由于我们有2个参数,因此您没有义务做出选择,descendb / 1和descendb / 2实际上是不同的谓词。