【问题标题】:Find all paths for a relation without knowing nodes Prolog在不知道节点的情况下查找关系的所有路径 Prolog
【发布时间】:2020-01-17 06:15:46
【问题描述】:

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

  • Rel - 关系,
  • S - 源节点(第一),
  • T - 目标节点(最后一个),
  • [S|Cons] - 路径,
  • N - 长度
图(相对,S,T,[S|Cons],N):- 呼叫(相对,S,X), (X = T;图(Rel,X,T,[X|Cons],N))。

当我用...测试它时

graph(myRelation, _, _, _, _), false.

它只是无限循环。我假设这是因为除了关系之外我没有得到任何术语变量,但我认为当我使用 call 时它会分配 X,所以我可以以这种方式填充路径 ([S|Cons])。

【问题讨论】:

  • TN 在这里做什么?
  • this

标签: prolog graph-theory


【解决方案1】:

您在这里定义了一个谓词,每次都会调用自己(除非call(Rel, S, X) 失败,但即便如此也永远无法“检索”结果),您需要一个停止条件。

该条件是当源S和目标T相同时,在这种情况下,我们返回一个包含SN=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).

因此,我们得到:

:- use_module(library(clpfd)).

graph(_, S, S, [S], 0).
graph(Rel, S, T, [S|Rest], N) :-
    N #> 0,
    call(Rel, S, X),
    N1 #= N-1,
    graph(Rel, X, T, Rest, N1).

【讨论】:

  • 如果我们不知道 N,但我们如何才能做出停止条件?
  • @SteveFreed:这里我们不需要知道N,注意我们使用clpfd,所以我们简单定义NN-1是如何关联的。这里的重点是,如果 ST 可以统一,我们生成它作为答案,这不会阻止回溯,因为我们可能对来自 Sall 路径感兴趣到T。如果我们只想要一个,使用once/1 调用graph/5 可能更有意义。
猜你喜欢
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
相关资源
最近更新 更多