列出所有可到达的节点

时间:2016-11-17 15:08:37

标签: prolog

我有一个双向谓词,告诉一个节点是否连接到另一个节点。 例如。

has(a, b).
has(b, c).
has(d, b).

现在我想列出所有可以通过给定步数到达的节点(来自特定节点)。

connected_nodes(a, T, 2). 
因此

应输出

T = c 
T = d

我目前的代码如下:

connected_nodes(A, B, 0) :- write(A).
connected_nodes(A, B, N) :- 
    N > 0, M is N - 1,
    has(A, X),
    connected_nodes(X, B, M).

这适用于T = c但不适用于T = d,因为这是双向关系。

我是否正确地考虑了递归或者该问题必须以何种方式解决?

1 个答案:

答案 0 :(得分:1)

您的connected谓词似乎很好。让基本案例依赖于has可能更有意义,但这取决于你。

但是,您您的has谓词是“双向的”,但您尚未明确创建表明此情况的规则。

以下代码是代码的“双向”版本:

has(a, b).
has(b, c).
has(d, b).

bi_has(X,Y) :- has(X,Y).
bi_has(X,Y) :- has(Y,X).

connected_nodes(A, B, 0) :- write(A).
connected_nodes(A, B, N) :- 
    N > 0, M is N - 1,
    bi_has(A, X),
    connected_nodes(X, B, M).

但请注意,您的查询现在也会返回a作为可能的答案。这使得因为你从未明确声明你不想在两个步骤之后返回相同的元素。

如果您不想要这种行为,那么您还需要保留到目前为止访问过的元素列表(即累加器),并确认您没有重新访问元素。