Aqui tengo yo el sudoku resuelto en prolog ( creo que mejor que lo que tienes ahi ), usando fd_domain.
/*
sudoku(L) se satisface si:
- L es una lista de nueve componentes, cada una de las cuáles es una lista de nueve elementos de {1,2,3,4,5,6,7,8,9},
- en cada componente (o fila) los nueve elementos son distintos (equivalentemente, en cada componente están todos),
- en cada una de las columnas, tal como se definen en el código, los nueve elementos son distintos, y
- en cada uno de los cuadrados, también definidos en el código, sucede lo mismo.
*/
/*
el predicado flatten convierte una lista de listas de términos en la lista de todos los términos, manteniendo el orden.
*/
flatten([],[]).
flatten([H|T],Vars):-
flatten(T,TVars),
append(H,TVars,Vars).
sudoku(L):-
flatten(L,Lista),
/* los valores de Lista, la lista aplanada, se instanciarán a los números 1,2,...,9 */
fd_domain(Lista,1,9),
/* L debe ser una lista de nueve componentes (filas) R1, ... R9 */
[R1,R2,R3,R4,R5,R6,R7,R8,R9] = L,
/* Cada fila es una lista de nueve términos (los 81 en orden forman Lista) */
[X11,X12,X13,X14,X15,X16,X17,X18,X19] = R1,
[X21,X22,X23,X24,X25,X26,X27,X28,X29] = R2,
[X31,X32,X33,X34,X35,X36,X37,X38,X39] = R3,
[X41,X42,X43,X44,X45,X46,X47,X48,X49] = R4,
[X51,X52,X53,X54,X55,X56,X57,X58,X59] = R5,
[X61,X62,X63,X64,X65,X66,X67,X68,X69] = R6,
[X71,X72,X73,X74,X75,X76,X77,X78,X79] = R7,
[X81,X82,X83,X84,X85,X86,X87,X88,X89] = R8,
[X91,X92,X93,X94,X95,X96,X97,X98,X99] = R9,
/* En cada fila todos sus miembros han de ser diferentes */
fd_all_different(R1), fd_all_different(R2), fd_all_different(R3),
fd_all_different(R4), fd_all_different(R5), fd_all_different(R6),
fd_all_different(R7), fd_all_different(R8), fd_all_different(R9),
/* En cada columna todos han de ser diferentes */
fd_all_different([X11,X21,X31,X41,X51,X61,X71,X81,X91]),
fd_all_different([X12,X22,X32,X42,X52,X62,X72,X82,X92]),
fd_all_different([X13,X23,X33,X43,X53,X63,X73,X83,X93]),
fd_all_different([X14,X24,X34,X44,X54,X64,X74,X84,X94]),
fd_all_different([X15,X25,X35,X45,X55,X65,X75,X85,X95]),
fd_all_different([X16,X26,X36,X46,X56,X66,X76,X86,X96]),
fd_all_different([X17,X27,X37,X47,X57,X67,X77,X87,X97]),
fd_all_different([X18,X28,X38,X48,X58,X68,X78,X88,X98]),
fd_all_different([X19,X29,X39,X49,X59,X69,X79,X89,X99]),
/*Por fin, en cada cuadrado pequeño, formados por las casillas que se indican en lo que sigue, los miembros son diferentes */
fd_all_different([X11,X12,X13,X21,X22,X23,X31,X32,X33]),
fd_all_different([X41,X42,X43,X51,X52,X53,X61,X62,X63]),
fd_all_different([X71,X72,X73,X81,X82,X83,X91,X92,X93]),
fd_all_different([X14,X15,X16,X24,X25,X26,X34,X35,X36]),
fd_all_different([X44,X45,X46,X54,X55,X56,X64,X65,X66]),
fd_all_different([X74,X75,X76,X84,X85,X86,X94,X95,X96]),
fd_all_different([X17,X18,X19,X27,X28,X29,X37,X38,X39]),
fd_all_different([X47,X48,X49,X57,X58,X59,X67,X68,X69]),
fd_all_different([X77,X78,X79,X87,X88,X89,X97,X98,X99]),
fd_labeling(Lista).
/* El predicado escribe(L) devuelve los términos de una lista saltando una línea después de cada uno */
escribe([]).
escribe([H|T]):-
write(H),
nl,
escribe(T).
/*
Si preguntamos " ?- read(_1),nl,sudoku(_1),escribe(_1). " debemos introducir la lista de nueve filas, " y tras <return>
nos devuelve el problema resuelto.
*/
/*
A continuación se dan 4 problemas como ejemplo. Preguntando "?-test#n." (#n = 1, 2, 3 ó 4) escribirá la solución.
*/
test1:-
L = [
[_,6,_,1,_,4,_,5,_],
[_,_,8,3,_,5,6,_,_],
[2,_,_,_,_,_,_,_,1],
[8,_,_,4,_,7,_,_,6],
[_,_,6,_,_,_,3,_,_],
[7,_,_,9,_,1,_,_,4],
[5,_,_,_,_,_,_,_,2],
[_,_,7,2,_,6,9,_,_],
[_,4,_,5,_,8,_,7,_]],
sudoku(L),
escribe(L).
test2:-
L = [
[_,_,4 ,_,_,3, _,7,_],
[_,8,_ ,_,7,_, _,_,_],
[_,7,_ ,_,_,8, 2,_,5],
[4,_,_ ,_,_,_, 3,1,_],
[9,_,_ ,_,_,_, _,_,8],
[_,1,5 ,_,_,_, _,_,4],
[1,_,6 ,9,_,_, _,3,_],
[_,_,_ ,_,2,_, _,6,_],
[_,2,_ ,4,_,_, 5,_,_]],
sudoku(L),
escribe(L).
test3:-
L=
[
[_,4,3,_,8,_,2,5,_],
[6,_,_,_,_,_,_,_,_],
[_,_,_,_,_,1,_,9,4],
[9,_,_,_,_,4,_,7,_],
[_,_,_,6,_,8,_,_,_],
[_,1,_,2,_,_,_,_,3],
[8,2,_,5,_,_,_,_,_],
[_,_,_,_,_,_,_,_,5],
[_,3,4,_,9,_,7,1,_]
],
sudoku(L),
escribe(L).
test4:-
L=
[
[_,1,4,_,_,8,2,_,_],
[2,8,5,4,9,3,6,7,1],
[_,3,7,_,_,_,4,_,8],
[8,2,_,6,_,_,_,4,_],
[_,4,_,_,_,_,_,6,_],
[_,_,6,_,_,4,_,_,2],
[1,_,2,_,4,6,3,8,_],
[_,6,3,8,1,_,_,2,4],
[4,9,8,5,3,2,7,1,6]
],
sudoku(L),
escribe(L).
/* el siguiente es el sudoku escargot presentado por Arto Inkala, su creador en 2006, como el más difícil del mundo */
test5:-
L=
[
[1,_,_,_,_,7,_,9,_],
[_,3,_,_,2,_,_,_,8],
[_,_,9,6,_,_,5,_,_],
[_,_,5,3,_,_,9,_,_],
[_,1,_,_,8,_,_,_,2],
[6,_,_,_,_,4,_,_,_],
[3,_,_,_,_,_,_,1,_],
[_,4,_,_,_,_,_,_,7],
[_,_,7,_,_,_,3,_,_]
],
sudoku(L),
escribe(L).
/* La siguiente plantilla puede venir bien para plantear sudokus nuevos:
[
[_,_,_, _,_,_, _,_,_],
[_,_,_ ,_,_,_, _,_,_],
[_,_,_ ,_,_,_, _,_,_],
[_,_,_ ,_,_,_, _,_,_],
[_,_,_ ,_,_,_, _,_,_],
[_,_,_ ,_,_,_, _,_,_],
[_,_,_ ,_,_,_, _,_,_],
[_,_,_ ,_,_,_, _,_,_],
[_,_,_ ,_,_,_, _,_,_]].
*/
Sobre sudokus tengo mas, y son las premisas que se tienen que cumplir:
S(i,j,k,l) = S(i,j',k,l') -> j = j' y l = l'
S(i,j,k,l) = S(i,j,k', l' ) -> k = k' y l = l'
S(i,j,k,l) = S(i',j,k', l ) -> k = k' y i=i'
Con esas tres ya vale.
PD : De lo que tienes ,el concatenar es un append normal, es concatenar. El resto no se muy bien que hace.. menudo follon :S