我试图演示如何实现你正在努力解决的问题,以便你能更好地理解它是如何工作的。因此,由于你的OP并不完整,我做了一些修改!以下是我所使用的事实:
road(birmingham,bristol, 9).
road(london,birmingham, 3).
road(london,bristol, 6).
road(london,plymouth, 5).
road(plymouth,london, 5).
road(portsmouth,london, 4).
road(portsmouth,plymouth, 8).
以下是需要调用的谓词,用于查找我们的路径:get_road/4。它基本上会调用工作谓词,该谓词具有两个累加器(一个用于已经访问过的点,另一个用于我们走过的距离)。
get_road(Start, End, Visited, Result) :-
get_road(Start, End, [Start], 0, Visited, Result).
这里是工作谓词,
get_road/6 : get_road(+起点, +终点, +途经点, +距离累计, -访问过的点, -总距离) :
第一个子句表明如果我们的第一个点和最后一个点之间有一条道路,我们可以在此结束。
get_road(Start, End, Waypoints, DistanceAcc, Visited, TotalDistance) :-
road(Start, End, Distance),
reverse([End|Waypoints], Visited),
TotalDistance is DistanceAcc + Distance.
第二条款说明了如果我们的第一个点和中间点之间有一条道路,我们可以沿着这条道路走,并解决get_road(intermediate, end)。
get_road(Start, End, Waypoints, DistanceAcc, Visited, TotalDistance) :-
road(Start, Waypoint, Distance),
\+ member(Waypoint, Waypoints),
NewDistanceAcc is DistanceAcc + Distance,
get_road(Waypoint, End, [Waypoint|Waypoints], NewDistanceAcc, Visited, TotalDistance).
使用方法如下:
?- get_road(portsmouth, plymouth, Visited, Distance).
并产生:
Visited = [portsmouth, plymouth],
Distance = 8 ;
Visited = [portsmouth, london, plymouth],
Distance = 9 ;
Visited = [portsmouth, plymouth, london, plymouth],
Distance = 18 ;
false.
我希望这对你有所帮助。