在不知道节点的情况下查找关系的所有路径

时间:2018-12-07 20:34:32

标签: graph prolog

我想获取某个关系中的所有路径,但是如果没有结束节点,我不知道该怎么做。我尝试了多种方法来实现这一点,这就是我目前拥有的...

  • 角色-关系
  • S-源节点(第一个),
  • T-目标节点(最后),
  • [S | Cons]-路径
  • N-长度
    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])。

1 个答案:

答案 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).