half_door(a,b).
half_door(b,c).
half_door(b,f).
half_door(c,g).
half_door(d,e).
half_door(d,h).
half_door(g,k).
half_door(h,i).
half_door(h,l).
half_door(i,m).
half_door(j,k).
half_door(j,n).
half_door(l,p).
half_door(m,q).
half_door(n,o).
half_door(o,p).
half_door(q,r).

door(X,Y) :- half_door(X,Y).
door(X,Y) :- half_door(Y,X).

maze(X, Y, Z) :- maze(X, [], Y, Z).

maze(X, W, X, [X]) :- not(member(X,W)).
maze(X, W, Y, [X|Z]) :- door(X, X1), not(member(X1,W)), maze(X1, [X|W], Y, Z).
