【问题标题】:Length and Path in Graphs Prolog (avoid infinite recursion for cycles)Graphs Prolog 中的长度和路径(避免循环的无限递归)
【发布时间】:2019-02-16 03:27:41
【问题描述】:
node(a).
node(b).
node(c).
node(d).
node(e).
node(f).
node(g).
node(h).
edge(a,b).
edge(b,c).
edge(c,a).
edge(c,e).
edge(c,d).
edge(d,e).
edge(d,h).
edge(e,g).
edge(g,e).
edge(e,f).
edge(f,g).
parent(X,Y):-edge(X,Y).
child(X,Y):-parent(Y,X).
path(X,Y):-edge(X,Y).
path(X,Y):-edge(X,Z),path(Z,Y).
path(X,Y,Z):- 
length_of_path(X,Y,1):-edge(X,Y).
length_of_path(X,Y,N):-edge(X,Z),length_of_path(Z,Y,N1),N is N1+1.
connected(X,Y):-path(X,Y); path(Y,X).
undirected_edge(X,Y):-edge(X,Y);edge(Y,X).
undirected_path(X,Y):-path(X,Y);path(Y,X).
tpath(Node1,Node2):-edge(Node1, SomeNode), edge(SomeNode,Node2).

Path(X,Y) 需要找到从节点 X 到节点 Y 的有向路径。但是,在我的例子中存在一个问题,因为存在无限递归(节点 e,f,g 是一个圆)。

Path(X,Y,Z) 需要找到从节点 X 到节点 Y 的有向路径并存储在 Z 中。

length_of_path(X,Y,Z),Z 是从 X 到 Y 的路径长度。

这 3 个问题的难点在于您需要考虑到图中有圆圈。我不知道如何解决这个问题。

【问题讨论】:

    标签: recursion path prolog graph-theory transitive-closure


    【解决方案1】:

    直截了当的方法是跟踪到目前为止的路径,而不是转到您已经访问过的节点。这是一种实现:Definition of a path/trail/walk

    如果我接受它并添加您的 node/1 和 edge/2 定义,我会得到:

    ?- path(edge, Path, e, X).
    Path = [e],
    X = e ;
    Path = [e, g],
    X = g ;
    Path = [e, f],
    X = f ;
    Path = [e, f, g],
    X = g ;
    false.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      相关资源
      最近更新 更多