i have cartesian coordinates definition:
point(a, 5, 1). point(b, 4, 2). point(c, 3, 3). point(d, 2, 4). and "route" definition:
route(path1, [a, c, b, d]). then have function calculate distance between 2 points, this:
distance(p1, p2, d):-point(p1, x1, y1), point(p2, x2, y2), z ((x2-x1)*(x2-x1))+((y1-y2)*(y1-y2)), z >= 0, d sqrt(z). how can calculate full distance of route?
also, if have several routes how can find longest one?
edit: should correct now
first, find length of given route, using distance function have provided:
path_len(path, d) :- route(path, [first|points]), path_len(points, first, 0, d). path_len([], _last, dist, dist). path_len([p|points], prev, dacc, dist) :- distance(prev, p, d), ndacc dacc+d, path_len(points, p, ndacc, dist). where dacc accumulator distance far (initialized 0). can query with
?- path_len(path1, d). if have several routes defined (do understand correctly?), path_len/2 calculate total distance of of them backtracking. can build distance-path pairs , use keysort/2 sort them , maybe reverse/2 put last 1 first:
longest_path(path, dist) :- bagof(d-p, path_len(p, d), dppairs), keysort(dppairs, sorted), reverse(sorted, [dist-path|_]). you have used last/2 instead of reverse/2 on last line of predicate definition:
last(sorted, dist-path).
Comments
Post a Comment