我試圖證明你如何實現你正在做的事情,以便你能更好地理解它是如何工作的。所以,因爲你的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(+開始,結束+,+航點,+ DistanceAcc,-Visited,-TotalDistance):
第一個子句通知,如果我們的第一點和最後一點之間有一條路,我們可以在這裏結束。
get_road(Start, End, Waypoints, DistanceAcc, Visited, TotalDistance) :-
road(Start, End, Distance),
reverse([End|Waypoints], Visited),
TotalDistance is DistanceAcc + Distance.
第二子句通知,如果有我們的第一點和中間點之間的道路,我們可以把它再解決get_road(中間,結尾)。
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.
我希望這將是對你有所幫助。
你先生,已經超越了職責範圍!這是令人難以置信的,它是完美的,它實際上是有道理的!對不起,我是個假人,對於prolog來說我真的很陌生,雖然很多事情都很自然地發生,但我真的爲這個任務而努力。非常感謝你這麼sooooo much:] –
不要猶豫,如果你再次努力瞭解這個代碼,我或其他人會回答他們的評論:) – m09