prolog中带宽度优先搜索的返回最短路径

prolog中带宽度优先搜索的返回最短路径,prolog,graph-theory,shortest-path,Prolog,Graph Theory,Shortest Path,我想在prolog中的双向图中找到从A站到B站的最短路径(如果A连接到B而不是B连接到A),该图在分支上没有权重。问题是这样贴出来的 solve(Start,End,Path). 启动启动站。 终点站。 通过最短路线的所有站点的路径列表。图中任意两个直接连接的站点之间的距离相等。 基本事实如下: fact("Staion1","metroline","Station2","metroline"). 地铁线路是直接连接两个楼梯的线路数量。如果第二个和第四个参数相同,则直接连接站点 line(

我想在prolog中的双向图中找到从A站到B站的最短路径(如果A连接到B而不是B连接到A),该图在分支上没有权重。问题是这样贴出来的

solve(Start,End,Path).
启动启动站。
终点站。
通过最短路线的所有站点的路径列表。图中任意两个直接连接的站点之间的距离相等。 基本事实如下:

fact("Staion1","metroline","Station2","metroline"). 
地铁线路是直接连接两个楼梯的线路数量。如果第二个和第四个参数相同,则直接连接站点

line("Abbesses","12","Pigalle","12").  
line("Abbesses","12","Lamarck Caulaincourt","12").  
line("Ale'sia","4","Mouton Duvernet","4").  
line("Ale'sia","4","Porte d'Orle'ans","4").  
line("Alexandre Dumas","2","Philippe Auguste","2").  
line("Alexandre Dumas","2","Avron","2").  
line("Alma Marcesu","9","Ie'na","9"). 
编辑: 我试图解决这个问题,我发现如果使用BFS,它会工作得更快。
以下是我写的解决方案:

solve(Start,End,Path):-solve1([Start],End,[Start],Path).   

solve1([P|O],End,Visited,[End|?]):-children(P,S),member(End,S),!.   
solve1([P|O],End,Visited,Path):-(not(member(P,Visited)),children(P,S),append(O,S,O1),solve1(O1,End,Visited,Path));  
(solve1(O,End,Visited,Path)).
?-应该是具有目标节点路径的列表
唯一的问题是我不知道如何返回到目标节点的路径。

谢谢,就在前面

您可以使用Dijkstra算法


“s_算法”

它引出了一个问题,广度优先算法是否比深度优先算法有任何优势。无论如何,您都可以通过member/2谓词检测循环,因此不存在完整性问题

假设我们有这个图,没有任何循环:

在序言中可以表示为以下事实:

% edge(-Vertex, -Vertex)
edge(a, b).         edge(a, c).
edge(a, d).         edge(b, c).
edge(c, d).         edge(c, e).
edge(d, e).
然后做这个工作:

% path(+Vertex, +Vertex, -Integer)
:- table path(_,_,min).
path(X, X, 0).
path(X, Y, N) :-
   edge(X, Z), path(Z, Y, M), N is M+1.
以下是一些运行示例:

?- path(a, e, X).
X = 2
?- path(a, e, 3).
No
您还可以修改代码,以便它检测循环和/或返回路径。对后者有帮助的是使用自定义聚合函数


免责声明:出于实际目的,您不会使用可以归结为Dijkstra算法的东西。您宁愿使用家庭中的东西。

告诉我们您是如何开始解决问题的,以及您在哪里遇到了问题。看起来你希望其他人完全为你解决这个问题。。。