URGENTE!! : PROLOG

MaRaNeLL0

Saludos,
No lo postearia aquí no fuese estrictamente necesario, pero necesito saber con urgencia como trabaja el siguiente codigo en prolog:

concatena([],L,L).
concatena([X|L],M,[X|N]):-concatena(L,M,N).

crearRegions(R,X):- crearRegionsa(R,A,B,C),concatena(B,C,E),concatena(A,E,F),crearFiles(F,X).

% Creamos regiones de 3 x 9(Files de 3)
crearRegionsa([],[],[],[]).
crearRegionsa([X,Y,Z,W,Q,R,T,U,I|Zs],[X,Y,Z|Ts],[W,Q,R|Ds],[T,U,I|Fs]):- crearRegionsa(Zs,Ts,Ds,Fs).

Es parte de un programa que resuelve un sudoku.
Muchisimas gracias.

Puni

creo q por aqui no abundan los expertos en programacion declarativa xDDD

tengo mis apuntes de logica por aqui, pero me da una chapa infernal siquiera desempolvarlos, a parte de q lo mas complicado q creo q hice fue dibujitos vectoriales y aritmetica elemental xD

JuAn4k4

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

MaRaNeLL0

Flipa, gracias :)

dr_Rouman

La ostia, y lo más que llegamos a hacer nosotros es cosas de primos (familiares y eso)

Usuarios habituales

  • dr_Rouman
  • MaRaNeLL0
  • JuAn4k4
  • Puni