List Prolog在两点之间布线并列出

List Prolog在两点之间布线并列出,list,routes,prolog,point,List,Routes,Prolog,Point,我需要一个方法返回两点之间路线中使用的所有道路*,这是我的地图: 例如,要指向A到E,我需要使用的道路列表,如下所示: route(a, e, R). R = [1,5]. 我在标记我已经访问过的路线时遇到了问题,最重要的是,在列表中登记使用的道路编号 这是我到目前为止的代码: road(1,a,b). road(2,a,d). road(3,b,c). road(4,c,d). road(5,b,e). road(6,c,f). road(7,d,f). road(8,e,f). con

我需要一个方法返回两点之间路线中使用的所有道路*,这是我的地图:

例如,要指向
A
E
,我需要使用的道路列表,如下所示:

route(a, e, R).
R = [1,5].
我在标记我已经访问过的路线时遇到了问题,最重要的是,在列表中登记使用的道路编号

这是我到目前为止的代码:

road(1,a,b).
road(2,a,d).
road(3,b,c).
road(4,c,d).
road(5,b,e).
road(6,c,f).
road(7,d,f).
road(8,e,f).

connected(A,B) :- road(_,A,B).

route(A, B, R) :- road(R, A, B), road(R, B, A).
route(A, B, [R2|R]) :- route(A, C, R2), route(C, B, R2).
谢谢你的帮助! 我确实知道程序,但我发现在列表中添加道路很困难,以下是最终代码:

road(1,a,b).
road(2,a,d).
road(3,b,c).
road(4,c,d).
road(5,b,e).
road(6,c,f).
road(7,d,f).
road(8,e,f).

route(X,Y,[R]) :- road(R,X,Y).
route(X,Y,[R1|R2]) :- road(R1,X,Z), route(Z,Y, R2).
这是我想要的输出:

?- route(a,f,R).
R = [1, 3, 6] .
在路线的第二个定义中添加列表时,我感到很困惑,这些示例帮助了我。
谢谢你的帮助

您的解决方案仍然不能抵抗图中的循环,这里有一个方法可以记住它

route(A,A,R,R).
route(A,B,R,R2) :- road(Rx,A,C), \+ member(Rx,R) , route(C,B,[Rx|R],R2).
route(A,B,R) :- route(A,B,[],Rx), reverse(R,Rx).

不知道“标记”您访问过的路线是什么意思。你的第一个
路线(A,B,R)
子句总是失败的,不是吗?数据库中没有双向编号相同的道路。您的第二个子句可能也有问题,因为您要求两条路线具有相同的编号。如果您想生成一个列表,我希望是一个基本情况或一个初始谓词,它有一个空列表
[]
。在这里搜索类似于,
[prolog]的图形路径。您将发现与此相关的其他问题,这将有助于进一步了解。这类问题在这里已经讨论过很多次了。你的基本情况应该非常简单。如果已经有一条从
a
B
的道路,则路线是一个由该道路的编号组成的单一元素列表。您可能会发现下面的答案很有趣。