特定のマスを特定の歩数目で踏んで迷路を抜けるパズル

【迷路5】https://twitter.com/puzzlegiver_bot/status/277296210212163584
課題:
・入口が左上(0,0)であることをルールに入れているのがイマイチ
・10秒待て!
・’;’ で別解を求めると同じ解が4回表示されてしまう。

【迷路5】https://twitter.com/puzzlegiver_bot/status/277296210212163584
課題:
・入口が左上(0,0)であることをルールに入れているのがイマイチ
・10秒待て!
・’;’ で別解を求めると同じ解が4回表示されてしまう。

append( [], List, List ).
append( [Head|Tail], List, [Head|TailR] ) :- append(Tail, List, TailR).

at( [Head|Tail], (0, Y), Val ) :- at(Head, Y, Val).
at( [Head|Tail], (X, Y), Val ) :- X > 0, X1 is X - 1, at( Tail, (X1, Y), Val ).

at( [Head|Tail], 0, Head ).
at( [Head|Tail], Idx, Val ) :- number(Idx), Idx > 0, Idx1 is Idx - 1, at( Tail, Idx1, Val ).	
	?- at( [[1,2,3],[4,5],[6,7]], (0,2), 3 ).

% ルール
walk_maze(Q, A) :-
	Q = A,
	length(Q, M), Q = [H|_],
	length(H, N),
	walk_maze( Q, A, (M, N), (0, 0), 1 ).	% 左上を入口として入る
	
walk_maze( _, _, (M, N),      _, StepEnd ) :- StepEnd is M * N.
walk_maze( Q, A, (M, N), (X, Y), Step ) :-
%	number(M), number(N), number(X), number(Y), number(Step),
	0 =< X, X < M, 0 =< Y, Y < N,
	at( Q, (X, Y), Step ),
	StepNext is Step + 1,
	(	% 次の一歩
		X1 is X - 1, walk_maze( Q, A, (M, N), (X1, Y), StepNext );
		Y1 is Y - 1, walk_maze( Q, A, (M, N), (X, Y1), StepNext );
		X2 is X + 1, walk_maze( Q, A, (M, N), (X2, Y), StepNext );
		Y2 is Y + 1, walk_maze( Q, A, (M, N), (X, Y2), StepNext )
	).
	
% 例題
	?- walk_maze( [
		[ 1, _, _, _, _, 36 ],
		[ _, _, _, _, _, _ ],
		[ _, _, _, _, _, _ ],
		[ _, 9, _,27, _, _ ],
		[ _,18, _, _, _, _ ],
		[ _, _, _, _, _, _ ] ], Answer ).
/*
Answer = [
	[  1,  2,  3,  4, 35, 36 ],
	[ 12, 11,  6,  5, 34, 33 ],
	[ 13, 10,  7, 28, 29, 32 ],
	[ 14,  9,  8, 27, 30, 31 ],
	[ 15, 18, 19, 26, 25, 24 ],
	[ 16, 17, 20, 21, 22, 23 ]
]
*/