我试图在 Prolog 的图中找到一条路径。我设法用我在网上找到的一些片段来解决这个问题。但是,它会跟踪节点以避免两次访问它们,而我需要它不要两次访问同一边缘。这可能在大多数图中归结为相同的事情,但是因为我想用它来计算从边缘上的点到边缘上其他点的路径,我不希望它返回从一个点到相邻节点的路径到相反的节点(比如,如果我们有一条从节点 A 到节点 C 的边 AC,中间有一个点 B,那么 ACB 将不是一条可接受的路径,因为它经过 AC 两次)。
这是我当前的代码:
path(A,B,Nodes,Edges) :- path1(A,[B],Nodes,Edges).
path1(A,[A|P1],[A|P1],[]).
path1(A,[Y|P1],Nodes,Edges) :-
connected(X,Y,Edge), \+ memberchk(X,[Y|P1]), path1(A,[X,Y|P1],N1,E1), append(E1,[Edge],Edges).
connected(a,c,ac). % connected(Node1,Node2,Edge) need not represent an edge:
connected(a,b,ac). % it may also refer to a point on the edge.
connected(b,c,ac).
对于上面的示例,这将返回例如:
path(a,b,[a,b],[ac])
path(a,b,[a,c,b],[ac,ac])
现在我想我可以简单地替换\+ memberchk(X,[Y|P1])
以\+ memberchk(Edge,S)
确保相同的边缘不会两次出现在路径中,这将解决问题。但是,当我这样做时,Prolog 说没有路径。
有人可以向我解释这是哪里出错了吗?