Zona HTML Zona Java Zona PHP Zona ASP Zona Bases de datos
Inicio > Foros > Prolog > juego sudoku
-Foros de debate

Prolog
Lista de foros | Lista de mensajes de este foro

Privacidad: Recuerde que la información escrita en los foros de programación es 100% pública y que su ip será registrada asociada a su mensaje. Si encuentra un mensaje fuera de lugar, por favor, notifiquelo para su revisión y eliminación.

juego sudoku
Enviado por valentina el día 12 de diciembre de 2005

Le agradeceria mucho al que me pueda ayudar estoy buscando el codigo del juego sudoku desarrollado en prolog. Si por casualidad lo tienes please no dudes en enviarmelo o responder.

 
Re: juego sudoku
Enviado por kurtces el día 14 de diciembre de 2005

Yo tambien lo necesito, apoder ser para visual prolog. Por favor, si alguien lo tiene que lo ponga en el foro o me lo mande al correo: becaskurtces@gmail.com

 
Re: Re: juego sudoku
Enviado por jrio el día 28 de diciembre de 2005

Hola, yo también lo necesito. Tengo que desarrollarlo y no se por donde empezar. Gracias

 
Re: Re: Re: juego sudoku
Enviado por esdra el día 3 de enero de 2006

yo tambien necesito el sudoku en prolog, si me lo pudieran facilitar porfa...

 
Re: Re: Re: Re: juego sudoku
Enviado por edu el día 12 de enero de 2006

Se necesita el SICStus Prolog. También recomiendo buscar veriones para SWI-Prolog que es freeware. Yo tengo una con el SWI pero tiene algun error, de momento...


% Author:
% Date: 12/01/2006

%TO convert to gnuprolog remove the following two lines.
:- use_module(library(clpfd)).
:- use_module(library(lists)).
%then search and replace all_different to fd_all_different

%It should all work.

%I got bored so I coded up a Su Doku solver in prolog using constraints.
%It took less than 30 minutes (mainly because I don't type that fast).
%Searching on the net people have produced 1.2mb visual basic monsters
%or Apple apps that took 8 hours to code.
%Constraint programming is fast and powerful. Of course there are no bells
%or whistles in this code.

%Look at test1,test2 and see how they are run.
%This is the sicstus version.
/*
To Run the code in sicstus,either do it via emacs or
from a shell type
sicstus

The sicstus prompt is then | ?-

So
| ?- [sudoku].

This loads the program

| ?- test1.
This calls test1.

It should be pretty obvious how to modify it to for you current puzzel.



*/
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),
pretty_print(L).

%Fiendish puzzel April 21,2005 Times London
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),
pretty_print(L).


test3 :-
%This is supposed to be hard.
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),
pretty_print(L).

test4 :-
%Diaboloical puzzel 104 Sunday Torygraph.
L=
[
[8,_,3,_,2,9,7,1,6],
[_,_,6,_,1,8,5,_,4],
[_,_,_,_,6,_,_,_,8],
[_,_,5,_,4,6,_,8,_],
[7,_,9,_,3,5,6,4,2],
[_,6,_,_,9,_,1,_,5],
[6,_,_,_,7,_,_,5,1],
[_,_,1,6,5,_,8,_,_],
[5,_,_,9,8,1,4,6,3]
],
sudoku(L),
pretty_print(L).

test5 :-
%An easy sudoku from the web.
L=[
[_,_,_,1,5,_,_,7,_],
[1,_,6,_,_,_,8,2,_],
[3,_,_,8,6,_,_,4,_],
[9,_,_,4,_,_,5,6,7],
[_,_,4,7,_,8,3,_,_],
[7,3,2,_,_,6,_,_,4],
[_,4,_,_,8,1,_,_,9],
[_,1,7,_,_,_,2,_,8],
[_,5,_,_,3,7,_,_,_]
],
sudoku(L),
pretty_print(L).

%Expects a list of lists 9 by 9 grid.
sudoku(L) :-
flatten(L,AllVars),
domain(AllVars,1,9),
[R1,R2,R3,R4,R5,R6,R7,R8,R9] = L,
%Each row is different.
all_different(R1), all_different(R2), all_different(R3),
all_different(R4), all_different(R5), all_different(R6),
all_different(R7), all_different(R8), all_different(R9),
transpose(L,TL),
%Each column is different.
[C1,C2,C3,C4,C5,C6,C7,C8,C9] = TL,
all_different(C1), all_different(C2), all_different(C3),
all_different(C4), all_different(C5), all_different(C6),
all_different(C7), all_different(C8), all_different(C9),
%Need to put the code in to do each 3x3 square all different.
%There is a much more elegant way of coding this. But for
%illustrative purposes it is fine.
[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,

all_different([X11,X12,X13,X21,X22,X23,X31,X32,X33]),
all_different([X41,X42,X43,X51,X52,X53,X61,X62,X63]),
all_different([X71,X72,X73,X81,X82,X83,X91,X92,X93]),

all_different([X14,X15,X16,X24,X25,X26,X34,X35,X36]),
all_different([X44,X45,X46,X54,X55,X56,X64,X65,X66]),
all_different([X74,X75,X76,X84,X85,X86,X94,X95,X96]),

all_different([X17,X18,X19,X27,X28,X29,X37,X38,X39]),
all_different([X47,X48,X49,X57,X58,X59,X67,X68,X69]),
all_different([X77,X78,X79,X87,X88,X89,X97,X98,X99]),


labeling([ffc],AllVars).


flatten([],[]).
flatten([H|T],Vars) :-
flatten(T,TVars),
append(H,TVars,Vars).


/* Transpose a list of lists. */
/* This is modfied from code by Naoyuki Tamura (tamura@kobe-u.ac.jp) *.
/* Used without permisson. */

transpose([Word], Cs) :- !,
/* reverse(Word, R), */
R = Word,
list2columns(R, Cs).
transpose([Word|Words], Cs) :- !,
transpose(Words, Cs0),
/* reverse(Word, R), */
R=Word,
put_columns(R, Cs0, Cs).

list2columns([], []).
list2columns([X|Xs], [[X]|Zs]) :- list2columns(Xs, Zs).

put_columns([], Cs, Cs).
put_columns([X|Xs], [C|Cs0], [[X|C]|Cs]) :- put_columns(Xs, Cs0, Cs).



/* Pretty Print L */

pretty_print([]).
pretty_print([H|T]) :-
write(H),nl,
pretty_print(T).

 
Re: Re: Re: Re: Re: juego sudoku
Enviado por jrm el día 18 de enero de 2006

¿Algún código para N valores? es decir para sudokus de 2x2, 4x4 ó 5x5... y no el 3x3 clásico?

Gracias!

 
Re: Re: Re: Re: Re: Re: juego sudoku
Enviado por José Lorenzo el día 26 de enero de 2006

Yo hice una hace un par de días para una tablero NxN generico, ademas de un alfabeto generico, no solamente numeros. Esta hecho basado en reglas que determinan si un tablero sudoku está bien resuelto. Pero debería funcionar hacia atrás de manera que resuelva el tablero.
Recibe una entrada para tablero como una lista de listas. Y el alfabeto es una lista.
Aquí va:

%esSudoku(N,S,Tablero)
% Devuelve True si Tablero es un tablero Sudoku llenado completamente según las reglas de Sudoku.
% S representa el alfabeto con que e tiene que llenar
% N es la raiz cuadrada del tamaño de una fila o columna del tablero.

esSudoku(N,S,Tablero) :-
verificacionFila(S,Tablero),
traspuesta(Tablero,Traspuesta),
verificacionFila(S,Traspuesta),
seccionador(Tablero,S,N,N).

%-----------------
%traspuesta(Lista_de_Listas,Traspuesta)
%Traspone la Lista_de_Listas y se obtiene Traspuesta

traspuesta([Lista|[]], Traspuesta) :- !,
aColumna(Lista, Traspuesta).

traspuesta([Lista|SubListas], Traspuesta) :- !,
traspuesta(SubListas, Parcial),
ponerCol(Lista,Parcial,Traspuesta).

%-----------------
%aColumna(Lista,Columna)
%Forma el inicio de un vectro de Columna a partir de una Lista
%Ejemplo aColumna([1,2,3],X) hace X=[[1],[2],[3]]

aColumna([], []).
aColumna([X|Xs], [[X]|Zs]) :- aColumna(Xs, Zs).

%-----------------
%ponerCol(Lista,Columna,Resultado)
%Añade Los elementos de Lista al vector Columna al principio de este vector y se guarda en resultado
%Ejemplo ponerCol([1,2,3],[[4],[5],[6]],X) hace X=[[1,4],[2,5],[3,6]]

ponerCol([], Columna, Columna).
ponerCol([Cabeza0|Resto0], [Cabeza1|Resto1], [[Cabeza0|Cabeza1]|Resto2]) :-
ponerCol(Resto0, Resto1, Resto2).

%-----------------

verificacionFila(Alfabeto,[]).
verificacionFila(Alfabeto,[Fila|Lista]) :-
estaContenido(Alfabeto,Fila),
verificacionFila(Alfabeto,Lista).

%------------------
% estaContenido(Alfabeto,Lista)
%Devuelve true si todos los caracteres de Alfabeto están contenidos en la lista Lista
%Asume que Alfabeto y Lista son del mismo tamaño


estaContenido([],_).
estaContenido([Cabeza|Sublista],Lista) :-
pertenece(Cabeza,Lista),
estaContenido(Sublista,Lista).
%---------------------------------------------------------
primerosN(Xs,[],X,0):- append(Xs,[],X).
primerosN([X|Xs],Subgrupo,Cola,Contador):-
Contador>0,
Contador1 is Contador-1,
primerosN(Xs,Subgrupo1,Cola1,Contador1),
append1(Subgrupo1,X,Subgrupo),
append(Cola1,[],Cola).

%---------------------------------------------------------

seccionador(_,_,0,_) :- !.
seccionador(ListaI,Alfabeto,ColContador,N):-
ColContador1 is ColContador-1,
primerosN(ListaI,Primeros,Cola,N),
sectorNOk(Primeros,N,Alfabeto),
seccionador(Cola,Alfabeto,ColContador1,N).

sectorNOk([[]|_],_,_).
sectorNOk(Lista,N,Alfabeto) :-
verificadorPel(Lista,N,N,Resultado,Cola),
estaContenido(Alfabeto,Resultado),
sectorNOk(Cola,N,Alfabeto).
%---------------------------------------------------------
verificadorPel(_,0,_,[],[]) :- !.
verificadorPel([X|Xs],Contador,N,Resultado,Colas):-
Contador1 is Contador-1,
primerosN(X,Primeros,Cola,N),
verificadorPel(Xs,Contador1,N,ParcialResult,ColasParcial),
append(ParcialResult,Primeros,Resultado),
append([Cola],ColasParcial,Colas).

%------------------
%pertenece(Elemento,Lista)
%Devuelve True si Elemento es miembro de la lista Lista

pertenece(X,[X|_]).
pertenece(X,[_|Y]) :-
pertenece(X,Y).
%------------------

% Author:
% Date: 21/01/2006

%------------------
%Dado un entero Contador, busca el elemento en la posicion Contador dentro de la lista y lo retorna en Elem, si no existe, retorna "[]".
iesimo([],_,[]).
iesimo([X|_],0,X).
iesimo([_|Y],Contador,Elem):-
Contador>0,
Contador1 is Contador-1,
iesimo(Y,Contador1,Elem).

%------------------
%append1(Lista,Elemento,Resultado)
%Agrega un elemento al final de la lista y lo coloca dentro de corchetes.
append1([], L, [L]).
append1([H|T], L, [H|NT]) :-
append1(T, L, NT) .


%------------------
%diagonalElems(Subtablero,Lista,Indexdiag).
%En cada nivel de recursion agrega el elemento [Indexdiag,Indexdiag] del tablero, a la lista Lista.
%Ejemplo diagonalElems([[1,2,3],[4,5,6],[7,8,9]],Lista,0) arroja como resultado Lista=[1,5,9], que son los elementos de la diagonal principal.

diagonalElems([],[],_,_).
diagonalElems([X|Y],Lista,Indexdiag,N):-
Indexdiag<N,
Indexdiag1 is Indexdiag+1,
diagonalElems(Y,Lista1,Indexdiag1,N),
iesimo(X,Indexdiag,Enesimo),
append1(Lista1,Enesimo,Lista).

%------------------
%esSudokuDiag(N,S,Tablero)
% Devuelve True si Tablero es un tablero Sudoku llenado completamente según las reglas de Sudoku y ademas la
% diagonal principal contiene todo el alfabeto.
% S representa el alfabeto con que se tiene que llenar
% N es la raiz cuadrada del tamaño de una fila o columna del tablero.
esSudokuDiag(N,S,Tablero):-
M is N*N,
diagonalElems(Tablero,Diagonal,0,M),
estaContenido(S,Diagonal),
esSudoku(N,S,Tablero).
%------------------

 






Re: juego sudoku
Enviado por aintzane el día 22 de enero de 2006

Hola, te agradeceria, si es qeu has conseguido el codigo en prolog del sudoku, que me lo enviaras, necesito entregar un ejercicio en clase y no tengo ni idea de como hacerlo. Gracias.

 


Tienda
Patrocinados
 

Copyright © 1999-2006 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network