Sudoku - Pierluigi Tresoldi

Transcript

Sudoku - Pierluigi Tresoldi
RISOLUTORE AUTOMATICO
PER
SUDOKU
Progetto Prolog - Pierluigi Tresoldi 609618
INDICE
1.STORIA DEL SUDOKU
2.REGOLE DEL GIOCO
3.PROGRAMMAZIONE CON VINCOLI
4.COMANDI DEL PROGRAMMA
5.ESEMPI
1. STORIA DEL SUDOKU
Il nome viene dal giapponese e significa posto dei numeri.
È un gioco enigmistico basato sui numeri e sulla logica.
Una versione semplificata del Sudoku fu messa a punto dal matematico svizzero Eulero
nel diciottesimo secolo; il Sudoku infatti deriva dal quadrato latino di Eulero.
Il quadrato latino, che Eulero definiva un nuovo tipo di "quadrato magico" (nel quale i
numeri sono disposti in modo che le somme dei valori di ciascuna riga, colonna o
diagonale risultino sempre uguali), è una griglia quadrata di n x n caselle nella quale
compaiono n simboli diversi, che soddisfa le seguenti condizioni:
1) in ogni cella della griglia compare un simbolo;
2) in ogni riga e in ogni colonna ciascun simbolo compare una volta sola.
Il più semplice quadrato latino è:
12
21
Il Sudoku non è altro che una una variante del quadrato latino di Eulero; variante, perché
le regole del sudoku impongono una restrizione ulteriore: anche i riquadri 3x3 devono
contenere una sola volta le cifre dall'1 al 9. Così, mentre tutti i Sudoku sono dei quadrati
latini, non tutti i quadrati latini sono dei Sudoku.
I quadrati latini validi per un quadrato 9x9 sono un numero di ventotto lettere (per vostra
informazione: 5524751496156892842531225600). Solo leggerlo è un rompicapo. È
meglio dire 5,5 x 10 alla ventisettesima potenza.
Mentre i Sudoku validi sono "soltanto" 3.500 miliardi e rotti.
2. REGOLE DEL GIOCO
Sudoku è un puzzle giocato su una griglia 9x9 parzialmente riempita.
Il compito è di completare gli assegnamenti usando numeri compresi tra 1 e 9 in modo tale
che in ogni riga, in ogni colonna e in ogni riquadro 3x3 non ci siano coppie uguali.
Un quesito ben posto ha un’unica soluzione.
3. PROGRAMMAZIONE CON VINCOLI
CLP (Constraint Logic Programmino) ovvero la programmazione logica con vincoli, è un
potente strumento per risolvere difficili problemi combinatori.
Prolog è basato sulla logica del primordine e gli oggetti che manipola sono puri simboli,
senza un significato intrinseco. L’esecuzione di un programma Prolog procede sfruttando
un processo chiamato unificazione, il quale compie ricerche in un database contenente dei
fatti cercando i valori che soddisfano l’interrogazione eseguita da un utente.
Prolog prova a cercare l’insieme di tutte le soluzioni a una richiesta e, durante tale ricerca,
un programma può incorrere in molti punti morti ed eseguire backtracking per provare una
strada alternativa.
In un linguaggio CLP, gli oggetti hanno significato in un dominio di applicazione.
Un programma CLP deve compiere ricerche in un database di fatti, ma può usare dei
vincoli per escludere molte possibili risultati e quindi potare parecchi rami dell’albero di
ricerca. Vengono usati i fatti come vincoli per guidare il ragionamento.
La struttura di un programma CLP in domini finiti è la seguente:
 Dichiarare il dominio delle variabili
 Inserire i vincoli
 Cercare una soluzione via backtracking
Nel caso specifico del Sudoku i 3 punti corrispondono a 3 funzioni del Prolog:
 Domain
 All_different
 Label
Domain è una funzione che assegna un dominio a una variabile in questo caso un valore
compreso tra 1 e 9.
All_different controlla che non ci siano coppie uguali di elementi in una determinata lista e,
sfruttando gli assegnamenti parziali del Sudoku, restringe i domini delle variabili.
Ovviamente su un problema di Sudoku la funzione deve lavorare a tre livelli, controllando
che non ricorrano valori uguali nella stessa riga, colonna e riquadro 3x3.
Label entra in azione qualora la funzione all_different non sia riuscita a compiere gli
assegnamenti a tutte le variabili. In pratica prova ad assegnare un valore del dominio alla
variabile controllando che questa rispetti tutti i vincoli impostati su di essa.
4. COMANDI DEL PROGRMMA
INTERFACCIA DI TESTO:
Per avviare il risolutore con interfaccia di testo è sufficiente digitare
?-text('percorso/nomefile').
Percorso è il nome della directory dove è contenuto il file,
nomefile è il nome del file contenente il problema da risolvere.
Per generare il file di input ci si attenga alle seguenti regole:
1. se una cella non è assegnata si inserisca il carattere 0 (zero);
2. se una cella è assegnata si inserisca il valore corrispondente (1..9);
3. il separatore non è necessario, per comodità di visualizzazione comunque
si può usare qualsiasi carattere non numerico;
4. il file dovrà necessariamente contenere 81 cifre.
Esempi su come scriverlo si possono trovare nel file TEMPLATE e nei vari TEST.
La soluzione verrà stampata a video.
Se non viene visualizzato niente, significa che l'input inserito è errato.
INTERFACCIA GRAFICA:
Per avviare il risolutore con interfaccia grafica è sufficiente digitare
?-graph.
Apparirà una griglia di gioco.
Per inserire i valori usare le frecce posizionate all'interno di ogni cella.
Per risolvere il problema cliccare il tasto SOLVE.
Se dopo aver premuto il tasto SOLVE non succede nulla, significa che l'input
inserito è errato.
Per iniziare un nuovo gioco cliccare sul tasto NEW e la griglia verrà azzerata.
La soluzione verrà visualizzata sulla griglia.
Se il quesito è ben posto esiste un unico assegnamento delle variabili che porta alla
soluzione; qualora comunque ci fosse più di una soluzione, il risolutore visualizza il primo
assegnamento utile che risolve il problema.
Esempi di file di input sono:
5. ESEMPI
ESEMPI DI ESECUZIONE DELLA MODALITA’ DI TESTO:
 File di input
Esecuzione:
 File di input con errori
Esecuzione:
ESEMPIO DI MODALITA’ GRAFICA: