使用prolog寻找路径

时间:2012-04-20 11:21:22

标签: path prolog path-finding

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

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

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

例如,当给出路径(1,7)时,必须返回true。              当给出路径(6,1)时,必须返回false。因为弧是指向的。

2 个答案:

答案 0 :(得分:1)

  1. 如果X和Y之间有弧,则Path = arc(X,Y)。那是, 如果是弧(X,Y),那么路径(X,Y))。或者,在Prolog中,这是:

    路径(X,Y,[arc(X,Y)]): - arc(X,Y)。

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

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

  3. 取自this网站。

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

答案 1 :(得分:0)

尝试回答基本问题中的问题。

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