How is it now?
connect(warrenStreet, goodgeStreet, northern).
connect(goodgeStreet, tottenhamCourtRoad, northern).
connect(tottenhamCourtRoad, leicesterSquare, northern).
connect(leicesterSquare, charingCross, northern).
connect(charingCross, embankment, northern).
connect(euston, warrenStreet, victoria).
connect(warrenStreet, oxfordCircus, victoria).
connect(oxfordCircus, greenPark, victoria).
connect(greenPark, victoria, victoria).
connect(victoria, pimlico, victoria).
connect(bank, waterloo, waterlooCity).
connection(X, Y, Line) :-
connect(X, Y, Line)
;
connect(Y, X, Line).
go(X, X, []) :- !.
go(X, Y, R) :- go2(Y, X, [], R).
go2(X, Y, Acc, [[Y, X, Line] | Acc]) :-
connection(X, Y, Line).
go2(X, Y, Acc, R) :-
connection(X, Z, Line),
Z \= Y,
not(passed(Z, Acc)),
go2(Z, Y, [[Z, X, Line] | Acc], R).
passed(X, [[X, _, _]|_]) :- !.
passed(X, [[_, X, _]|_]) :- !.
passed(X, [_|L]) :- passed(X, L).
*** example ***
%%% in northern line
?- go(warrenStreet, charingCross, R).
R = [[warrenStreet,goodgeStreet,northern],
[goodgeStreet,tottenhamCourtRoad,northern],
[tottenhamCourtRoad,leicesterSquare,norhern],
[leicesterSquare,charingCross,northern]] ;
no
%%% not necessary to go
?- go(bank, bank, R).
R = '[]' ;
no
%%% no way
?- go(greenPark, waterlooCity, R).
no
%%% in northern and victoria line
?- go(goodgeStreet, greenPark, R).
R = [[goodgeStreet,warrenStreet,northern],
[warrenStreet,oxfordCircus,victoria],
[oxfordCircus,greenPark,victoria]] ;
no
%%% make a loop
?- assert(connection(goodgeStreet, greenPark, newline)).
yes
%%% two answers
?- go(warrenStreet, goodgeStreet, R).
R = [[warrenStreet,goodgeStreet,northern]] ;
R = [[warrenStreet,oxfordCircus,victoria],
[oxfordCircus,greenPark,victoria],
[greenPark,goodgeStreet,newline]] ;
no