나는 당신이 일하는 방식을 달성 할 수있는 방법을 보여줌으로써 어떻게 작동하는지 더 잘 이해할 수 있도록 노력했습니다. 그래서 당신의 작전이 아주 완전하지 않았기 때문에, 나는 자유를 택했습니다! 여기
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 우리의 경로를 찾기 위해 호출 술어입니다 : 여기에 내가 함께 일하고 있어요 사실이다. 기본적으로 두 개의 누적기를 가진 작업 술어를 호출합니다 (이미 방문한 점과 우리가 통과 한 거리를 하나씩). (+ 시작 + 엔드, + 웨이 포인트, + DistanceAcc, -Visited, -TotalDistance) get_road : 여기
get_road(Start, End, Visited, Result) :-
get_road(Start, End, [Start], 0, Visited, Result).
는
get_road/6 작업 조건입니다
첫 번째 절은 말한다 경우 그 첫 번째 요점과 마지막 요점 사이에 도로가 있습니다. 여기서 끝낼 수 있습니다.
get_road(Start, End, Waypoints, DistanceAcc, Visited, TotalDistance) :-
road(Start, End, Distance),
reverse([End|Waypoints], Visited),
TotalDistance is DistanceAcc + Distance.
두 번째 절은 첫 번째 점과 중간 점 사이에 도로가있는 경우, 우리는 그것을 받아 다음 get_road (중간, 끝을) 해결할 수 있음을 알려줍니다.
?- 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.
을 다음과 같이
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).
사용이다.
당신은 선생님의 임무를 뛰어 넘었습니다! 이것은 믿을 수 없다, 그것은 완벽하고 실제로 이해가된다! 미안 해요. 나는 정말 거짓말 쟁이 야. 나는 프롤로그를 처음 접했고, 꽤 많은 것들이 매우 자연 스레 나왔지만, 나는 정말로이 일로 어려움을 겪었다. 너무 많이 sooooo 많이 고마워요 :] –
이 코드를 이해하기 위해 다시 고투하는 경우 추가 질문을 게시하는 것을 망설이지 말고, 나는 또는 다른 사람들이 코멘트에 대답 할 것입니다 :) – m09