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.
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
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.
%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,
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.
%-----------------
%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]]
%-----------------
%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]]
%------------------
% 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
%------------------
%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).
%------------------
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.