%	Taken from Clocksin & Mellish

run(A, B) :- go(A, B, [A], X), printsoln(X), nl, fail.

printsoln([X]) :- nl, prin(X).
printsoln([H | T]) :- printsoln(T), prin(" --> ", H).

goodnode(X, Y, T) :- a(X, Y), not(member(Y, T)).
goodnode(X, Y, T) :- a(Y, X), not(member(Y, T)).

go(X, X, L, L) :- !.
go(X, Y, T, L) :-
	bagof(Z, goodnode(X, Z, T), D),
	go_all(D, Y, T, L).

go_all([H | _], Y, T, L) :- go(H, Y, [H | T], L).
go_all([_ | L], Y, T, P) :- go_all(L, Y, T, P).

member(X, [X | _]).
member(X, [_ | L]) :- member(X, L).

a(g, h).
a(g, d).
a(e, d).
a(h, f).
a(e, f).
a(a, e).
a(a, b).
a(b, f).
a(b, c).
a(f, c).
