For an assignment we are asked to write a predicate route/3 that succeeds if there is a route from Start to Finish, visiting town in the list Visits.
I’ve come up with an idea for a solution but for some reason the Visits list is always empty after route terminates and I can’t figure out why that is. I’m not looking for a solution to the question, just something to point me in the right direction.
Here is my code so far:
Note that my calls to write are simply for debugging reasons.
road('Wellington', 'Palmerston North', 143).
road('Palmerston North', 'Wanganui', 74).
road('Palmerston North', 'Napier', 178).
road('Palmerston North', 'Taupo', 259).
road('Wanganui', 'Taupo', 231).
road('Wanganui', 'New Plymouth', 163).
road('Wanganui', 'Napier', 252).
road('Napier', 'Taupo', 147).
road('Napier', 'Gisborne', 215).
road('New Plymouth', 'Hamilton', 242).
road('New Plymouth', 'Taupo', 289).
road('Taupo', 'Hamilton', 153).
road('Taupo', 'Rotorua', 82).
road('Taupo', 'Gisborne', 334).
road('Gisborne', 'Rotorua', 291).
road('Rotorua', 'Hamilton', 109).
road('Hamilton', 'Auckland', 126).
route(Start, Start, Visits) :-
write(Visits), nl.
route(Start, Finish, Visits) :-
write(Visits),nl,
road(Finish, From, _),
route(Start, From, [From | Visits]).
test :-
Visits = [],
route('Auckland', 'Wellington', Visits),
write(Visits).
The output when running test.:
1 ?- test. [] [Palmerston North] [Wanganui,Palmerston North] [Taupo,Wanganui,Palmerston North] [Hamilton,Taupo,Wanganui,Palmerston North] [Auckland,Hamilton,Taupo,Wanganui,Palmerston North] [] true .
Variables in Prolog are unified, not assigned. Surely this argument is part of your course.
Then
Visitsintestkeeps the empty list (the accumulator) you ‘assigned’ when start. You should add (or better, insert) an argument toroute, that holds the built list. Something like