我有一个双向谓词,告诉一个节点是否连接到另一个节点。 例如。
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,因为这是双向关系。
我是否正确地考虑了递归或者该问题必须以何种方式解决?
答案 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
作为可能的答案。这使得因为你从未明确声明你不想在两个步骤之后返回相同的元素。
如果您不想要这种行为,那么您还需要保留到目前为止访问过的元素列表(即累加器),并确认您没有重新访问元素。