我想知道是否存在从一个点到另一个点的路径。
例如,2 -> 4 -> 7
1 -> 3 -> 2 -> 9
5 -> 1 -> 6 -> 8
这些是道路。 我想写一个谓词路径(开始,结束),并且弧由一组弧(From,To)事实表示。
例如,当给出路径(1,7)时,必须返回true。 当给出路径(6,1)时,必须返回false。因为弧是指向的。
答案 0 :(得分:1)
如果X和Y之间有弧,则Path = arc(X,Y)。那是, 如果是弧(X,Y),那么路径(X,Y))。或者,在Prolog中,这是:
路径(X,Y,[arc(X,Y)]): - arc(X,Y)。
否则,如果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)。
取自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
).