matrix(S, M) :- length(M, S), matrix1(M, S). matrix1([], _). matrix1([H|T], S) :- length(H, S), matrix1(T, S). next(A, B, A, B). next(1, 0, 0, 1). next(0, 1, -1, 0). next(-1, 0, 0, -1). next(0, -1, 1, 0). solve(N, M) :- N2 is N*N, numlist(1, N2, L), matrix(N, M), solve(L, -1, 0, 1, 0, M). solve([], _, _, _, _, _). solve([Ix|T], X, Y, Dx, Dy, M) :- next(Dx, Dy, Dx1, Dy1), Y1 is Y+Dy1, X1 is X+Dx1, nth0(Y1, M, Row), nth0(X1, Row, Ix), !, solve(T, X1, Y1, Dx1, Dy1, M). :- solve(5, M), writeln(M).