1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
/*
** Nom du fichier : sudoku.pl
** Deallyra
**
** Réalisation d'un Jeu sudoku de dimension 4.
**
**
* Déclaration des variables
* Définition des domaines
* Spécification des contraintes
* Recherche de solutions
**
**
* - les paramètres en entrée sont précédés d'un +
* - les paramètres en sortie sont précédés d'un -
* - les paramètres qui peuvent être soit en entrée, soit en sortie (suivant le sens de l'unification) sont précédées d'un ?
**
*/
% Import du module qui permet de
:- use_module(library('clp/bounds')). %rajouter explications sur les librairies
:- use_module(library('clp/clp_distinct')).
/*
sudoku(+Grille,-Solutions) :-
Grille est la grille, le tableau de cases
Initialisée à 0
Remplie par des chiffres allant de 1 à 4
Remplir la grille est en fait, l'ajout d'une contrainte.
Solutions est une solution
Cela permet de savoir s'il existe plusieurs solutions
*/
sudoku(Grille, Solutions) :-
% Définition de la grille du Sudoku, des variables
Solutions =
[
A1,A2,A3,A4,
B1,B2,B3,B4,
C1,C2,C3,C4,
D1,D2,D3,D4
],
% Définition de la grille du Sudoku, des variables
% Une case ne peut prendre que une valeur entre 1 et 4
Solutions in 1..4 ,
vars_in(Solutions, 1, 4),
% Définition des contraintes de la grille
% Une ligne ne peut pas contenir deux fois la même valeur
all_distinct([A1,A2,A3,A4]),
all_distinct([B1,B2,B3,B4]),
all_distinct([C1,C2,C3,C4]),
all_distinct([D1,D2,D3,D4]),
% Une colonne ne peut pas contenir deux fois la même valeur
all_distinct([A1,B1,C1,D1]),
all_distinct([A2,B2,C2,D2]),
all_distinct([A3,B3,C3,D3]),
all_distinct([A4,B4,C4,D4]),
% Toutes les valeurs d'un carre sont differentes
all_distinct([A1,A2,B1,B2]),
all_distinct([A3,A4,B3,B4]),
all_distinct([C1,C2,D1,D2]),
all_distinct([C3,C4,D3,D4]),
% Construction de la grille
grille(Grille, Solutions),
% Recherche de solutions
label(Solutions),
% Affichage des solutions
nl,
write('Affichage de la resolution du Sudoku :'),
afficherGrille(Solutions),
% Ecriture du resultat dans le fichier
ecritureFichier(Solution).
/*
Initialisation de la grille du Sudoku
Instanciation des contraintes pour les éléments différents de 0
Ajout de la contrainte Var #= Val
*/
grille([],[]) :- !.
grille([0|Q1],[_|Q2]) :-
!,
grille(Q1,Q2).
grille([Val|Q1],[Var|Q2]) :-
!,
vars_in([Var], [Val]),
grille(Q1,Q2).
/*
sudokuExemple(-Solutions) :-
Solutions est une solution
Cela permet de savoir s'il existe plusieurs solutions
On initialise un test, un exemple à résoudre.
*/
%Sudoku correct, une solution
sudoku1(Solutions) :-
sudoku(
[ 1,0,0,0,
0,3,0,2,
0,0,2,0,
0,1,0,3
], Solutions
).
%sudoku a choix multiples
sudoku2(Solutions) :-
sudoku(
[ 0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0
], Solutions
).
%sudoku erreur
sudoku3(Solutions) :-
sudoku(
[ 1,0,1,0,
0,2,0,0,
0,0,3,0,
4,0,3,0
], Solutions
).
/*
L'affichage du résultat se fait par l'apparition de la grille
A voir si on garde cette partie de code ou alors /et l'écriture dans le fichier
*/
afficherGrille(G) :-
printHSep(2),
afficherGrille(G,1,1).
afficherGrille(G,L,5) :-
!,
printHSep(L),
L1 is L + 1,
afficherGrille(G,L1,1).
afficherGrille([],_,_) :- !.
afficherGrille([T|Q],L,C) :-
write(T),
printVSep(C),
C1 is C + 1,
afficherGrille(Q,L,C1).
printVSep(C) :-
mult2(C), !,
write('|').
printVSep(_) :- write('~').
printHSep(L) :-
mult2(L), !,
nl, write('~~~~~~~~~'), nl,
write('|').
printHSep(_) :-
nl, write('|').
mult2(C) :-
T is (C mod 2),
T == 0.
ecritureFichier(Solutions) :-
Solutions =
[
A1,A2,A3,A4,
B1,B2,B3,B4,
C1,C2,C3,C4,
D1,D2,D3,D4
],
% Ne marche pas, replacer par tell/1 told/0
open(solu,write, H),
write(H,A1),tab(H,1),write(H,A2),tab(H,1),write(H,A3),tab(H,1),write(H,A4),tab(H,1),nl(H),
write(H,B1),tab(H,1),write(H,B2),tab(H,1),write(H,B3),tab(H,1),write(H,B4),tab(H,1),nl(H),
write(H,C1),tab(H,1),write(H,C2),tab(H,1),write(H,C3),tab(H,1),write(H,C4),tab(H,1),nl(H),
write(H,D1),tab(H,1),write(H,D2),tab(H,1),write(H,D3),tab(H,1),write(H,D4),tab(H,1),nl(H),
close(H). |
Partager