Question

I understand the code up to minimal but after that there's too many variables and I keep losing track of what each one is doing. If someone could explain it or do it with renamed variables that would be an amazing help, as I think this code will probably come up on my Christmas exam and I want to be able to explain what's going on.

road(a, b, 1).
road(b, c, 1).
road(a, c, 13).
road(d, a, 1).

/*Getting from A to B through a list of places R in N kms*/
route(A,B,R,N) :- travel(A,B,[A],Q,N), reverse(Q,R).

/*Travelling from A to B through P a list of towns B|P of distance L*/
travel(A,B,P,[B|P],Dist) :- road(A,B,Dist).

/*Travelling from A to B through Visited, on your Route R with distance Distance*/
/*Find if there is a road from A to b and store the distance. Make sure C is not equal to B*/
travel(A,B,Visited,R,Distance) :-
    road(A,C,Dist), C \== B,

    /*Make sure C is not in Visited to avoid infinite loop,
      use recursion to find the full route and distance */
    \+member(C,Visited), travel(C,B,[C|Visited],R,Dist1), Distance is Dist + Dist1.

/*Find the shortest route from A to B*/
shortest(A,B,R,N) :-
    setof([Route,Dist],route(A,B,Route,Dist),Set),
    Set = [_|_], minimal(Set,[R,N]).

minimal([F|R],M) :- min(R,F,M).

/*The shortest path*/
min([],M,M).
min([[P,L]|R],[_,M],Min):- L < M, !, min(R,[P,L],Min).
min([_|R],M,Min) :- min(R,M,Min).
Was it helpful?

Solution

since setof gives a sorted list of solutions, it's sufficient to produce solutions of appropriate 'shape', placing first the value you want to minimize: try

shortest(A,B,R,N) :-
  setof((Dist,Route), route(A,B,Route,Dist), [(N,R)|_]).
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top