Path Prolog中的有向图

Path Prolog中的有向图,path,prolog,graph-theory,transitive-closure,Path,Prolog,Graph Theory,Transitive Closure,有人能详细说明旅行(A、B、访问、路径)和旅行(A、B、p、[B|p])的功能/条件吗。。此代码在图形中查找路径A和B之间的路径 edge(a,b). edge(b,c). edge(b,d). edge(c,d). edge(d,b). edge(e,f). edge(e,g). edge(e,h). edge(h,i). edge(i,g). edge(b,e). connectedEdges(X,Y) :- edge(X,Y). connectedEdges(X,Y) :- edge(Y

有人能详细说明旅行(A、B、访问、路径)和旅行(A、B、p、[B|p])的功能/条件吗。。此代码在图形中查找路径A和B之间的路径

edge(a,b).
edge(b,c).
edge(b,d).
edge(c,d).
edge(d,b).
edge(e,f).
edge(e,g).
edge(e,h).
edge(h,i).
edge(i,g).
edge(b,e).

connectedEdges(X,Y) :- edge(X,Y).
connectedEdges(X,Y) :- edge(Y,X). 

path(A,B,Path) :-
       travel(A,B,[A],Q), 
       reverse(Q,Path).

travel(A,B,P,[B|P]) :- 
       connectedEdges(A,B).

travel(A,B,Visited,Path) :-
       connectedEdges(A,C),           
       C \== B,
       \+member(C,Visited),
       travel(C,B,[C|Visited],Path).

让我们从第一条
travel/4
规则开始:

travel(A,B,P,[B|P]) :- 
   connectedEdges(A,B).
travel(A,B,Visited,Path) :-
   connectedEdges(A,C),           
   C \== B,
   \+member(C,Visited),
   travel(C,B,[C|Visited],Path).
“如果点A和点B彼此直接连接,则我们找到了一条直接子路径,因此可以通过将点B添加到与我们迄今为止访问过的所有点统一的路径中来成功。”

换句话说,由于我们已经解决了一个子问题(通过找到与2个节点的直接连接),因此我们基本上可以声明
p
(我们到目前为止访问的所有内容)是路径列表的尾部
[B|p]
(总路径是我们访问过的最后一个节点……当前目标节点,位于我们访问过的所有前一个节点之前)。
现在来看下一条
travel/4
规则:

travel(A,B,P,[B|P]) :- 
   connectedEdges(A,B).
travel(A,B,Visited,Path) :-
   connectedEdges(A,C),           
   C \== B,
   \+member(C,Visited),
   travel(C,B,[C|Visited],Path).
需要注意的是,无论第一条规则是否成功,第二条规则始终会作为备选规则进行尝试。由于此实现的事实,这里的含义是此代码可能会找到多条路径(如果存在多条路径)

无论如何,在第二条规则中,我们会找到任何连接到
A
的节点,而不是
B
。为什么?这是因为上面的第一条规则已经尝试过了;在这条规则中,我们正在寻找替代方案。如果该节点
C
尚未被访问,我们只需尝试从该点开始(
C
)然后我们再次递归地查询/调用
travel/4
,直到找到完整的路径

请再次注意,此实现可能会为给定查询找到0、1或多个解决方案。

总而言之,第一条规则用于查找点之间的直接连接。第二条规则用于查找点之间的间接连接。

请不要破坏您自己的帖子。