Path Prolog中的有向图
有人能详细说明旅行(A、B、访问、路径)和旅行(A、B、p、[B|p])的功能/条件吗。。此代码在图形中查找路径A和B之间的路径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
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或多个解决方案。
总而言之,第一条规则用于查找点之间的直接连接。第二条规则用于查找点之间的间接连接。请不要破坏您自己的帖子。