我想获取某个关系中的所有路径,但是如果没有结束节点,我不知道该怎么做。我尝试了多种方法来实现这一点,这就是我目前拥有的...
graph(Rel, S, T, [S|Cons], N) :- call(Rel, S, X), (X = T; graph(Rel, X, T, [X|Cons], N)).
当我用...进行测试时
graph(myRelation, _, _, _, _), false.
它无限循环。我假设这是因为除了关系之外,我没有得到任何术语变量,但我认为当我使用call时,它将分配X,这样我就可以以这种方式填充路径([S | Cons])。
答案 0 :(得分:1)
您在此处定义了一个谓词,每次调用时都会调用它(除非call(Rel, S, X)
失败,但是即使那样也永远不会有“检索”结果的方法),您需要一个条件来停止。
这种情况是源S
和目标T
相同时,在这种情况下,我们返回包含S
以及{{1 }}:
N=0
此外,在递归情况下,我们必须使用graph(_, S, S, [S], 0).
和“路径”进行适当的簿记:
N
因此,我们获得:
graph(Rel, S, T, [S|Rest], N) :-
call(Rel, S, X),
N1 #= N-1,
graph(Rel, X, T, Rest, N1).