【问题标题】:finding path using prolog使用prolog寻找路径
【发布时间】:2012-04-20 11:21:22
【问题描述】:

我想知道是否有从一个点到另一个点的路径。

例如,2 -> 4 -> 7 1 -> 3 -> 2 -> 9 5 -> 1 -> 6 -> 8

这些是路径。 我想写一个谓词路径(开始,结束),弧由一组弧(From,To)事实表示。

例如,当给出 path(1, 7) 时,它必须返回 true。 当给出 path(6, 1) 时,这必须返回 false。因为弧是有方向的。

【问题讨论】:

    标签: path prolog path-finding


    【解决方案1】:
    1. 如果 X 和 Y 之间有弧,则 Path=arc(X,Y)。那是, 如果弧(X,Y)然后路径(X,Y))。或者,在 Prolog 中是:

      path(X,Y,[arc(X,Y)]) :- arc(X,Y).

    2. 否则,如果 X 和某个其他节点 Z 之间存在弧,并且存在 从 Z 到 Y 的路径,那么也有从 X 到 Y 的路径。那是, 如果弧(X,Z)和路径(Z,Y)然后路径(X,Y)。在 Prolog 中是:

      path(X,Y,[arc(X,Z)|P]) :- arc(X,Z),path(Z,Y,P)。

    取自this网站。

    您也可以将其捆绑到一个谓词中,该谓词只需要一个弧列表并递归搜索路径

    【讨论】:

    • 这似乎是真的,但我的路径只需要 2 个参数。此路径采用 3 个参数。
    • 只需用 path(From,To) 扩展它:- path(From,To,Path)
    • 是的,这个可以让你输入弧的列表。如果您想跳过该参数,只需在文档中定义弧线并像亚历山大所说的那样扩展它
    【解决方案2】:

    尝试将问题分解为基本问题。

    path(From, To) :-
      arc(From, Intermediate),
      path(Intermediate, To).
    

    但是,你知道路径应该停在哪里吗?如果有循环,会发生什么?

    什么是小事,说明path(X, X) 总是正确的。添加到上述规则:

    path(To, To).
    

    如果我们编写一个规则,使用 If Then Else 可能会更清楚

    path(From, To) :-
      (   From \= To
      ->  arc(From, Intermediate),
          path(Intermediate, To)
      ;   true
      ).
    

    【讨论】:

      猜你喜欢
      • 2013-04-03
      • 1970-01-01
      • 2010-10-15
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多