どのように作業しているのかを実証して、動作の仕方をよりよく理解できるようにしました。あなたの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を私たちのパスを検索するために呼び出す述語される:ここでは私が働いている事実があります。これは、基本的に2つのアキュムレータを持つ作業述語を呼び出します(すでに参照されている点と1つは距離をとっています)。ここで
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.
私はそれはあなたに役立つことを願っています。
あなたは、義務の呼び出しを越えて超えて行ってきました!これは信じられないほどです、それは完璧であり、実際には理にかなっています!申し訳ありませんが私はそんなダミーです、私はプロローグには本当に新しく、非常に多くのことが自然に起こっていますが、私は本当にこの仕事に苦労しました。ありがとうございますsooooo much:] –
このコードを理解するために再び苦労したら、私は他の人がコメントで答えます:) – m09