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
| % Valeurs possibles :
nombre(1).
nombre(2).
nombre(3).
nombre(4).
nombre(5).
nombre(6).
nombre(7).
nombre(8).
nombre(9).
creeGrille(G,Sol):-
% Représentation de la grille Solution
% Lignes représentées par des lettres et colonnes par des chiffres.
Sol=
[A1,A2,A3,A4,A5,A6,A7,A8,A9,
B1,B2,B3,B4,B5,B6,B7,B8,B9,
C1,C2,C3,C4,C5,C6,C7,C8,C9,
D1,D2,D3,D4,D5,D6,D7,D8,D9,
E1,E2,E3,E4,E5,E6,E7,E8,E9,
F1,F2,F3,F4,F5,F6,F7,F8,F9,
G1,G2,G3,G4,G5,G6,G7,G8,G9,
H1,H2,H3,H4,H5,H6,H7,H8,H9,
I1,I2,I3,I4,I5,I6,I7,I8,I9
],
creeListe(G,Sol),
ligne(A1,A2,A3,A4,A5,A6,A7,A8,A9,1,Sol),
ligne(B1,B2,B3,B4,B5,B6,B7,B8,B9,2,Sol),
ligne(C1,C2,C3,C4,C5,C6,C7,C8,C9,3,Sol),
ligne(D1,D2,D3,D4,D5,D6,D7,D8,D9,4,Sol),
ligne(E1,E2,E3,E4,E5,E6,E7,E8,E9,5,Sol),
ligne(F1,F2,F3,F4,F5,F6,F7,F8,F9,6,Sol),
ligne(G1,G2,G3,G4,G5,G6,G7,G8,G9,7,Sol),
ligne(H1,H2,H3,H4,H5,H6,H7,H8,H9,8,Sol),
ligne(I1,I2,I3,I4,I5,I6,I7,I8,I9,9,Sol).
% On remplit cette ligne avec les valeurs 1 à 9 en vérifiant
% à chaque fois si la valeur qu'on met est dispo :
ligne(A1,A2,A3,A4,A5,A6,A7,A8,A9,NumLigne,Sol):-
L=[1,2,3,4,5,6,7,8,9],
select(A1,L,L1),verif(A1,NumLigne,Sol,1),
select(A2,L1,L2),verif(A2,NumLigne,Sol,2),
select(A3,L2,L3),verif(A3,NumLigne,Sol,3),
select(A4,L3,L4),verif(A4,NumLigne,Sol,4),
select(A5,L4,L5),verif(A5,NumLigne,Sol,5),
select(A6,L5,L6),verif(A6,NumLigne,Sol,6),
select(A7,L6,L7),verif(A7,NumLigne,Sol,7),
select(A8,L7,L8),verif(A8,NumLigne,Sol,8),
select(A9,L8,_),verif(A9,NumLigne,Sol,9).
% Permet de vérifier que la variable X n'a pas déjà été affecté
% dans la ligne, colonne et dans le bloc ou elle se trouve
%Pour le bloc -> pas encore implémenté
verif(X,NumLigne,Sol,NumColonne):-verifLigne(X,NumLigne,NumColonne,1,Sol),verifColonne(X,NumColonne,NumLigne,1,Sol).
%,calcNumBloc(NumLigne,NumColonne,Bloc),different(X,Bloc).
verifLigne(_,_,_,NumColCourante,_):-NumColCourante>9.
verifLigne(X,Num,NumColonne,NumColCourante,Sol):-
NumColCourante=<9,
NumColonne==NumColCourante,
NCol is NumColCourante+1,
Nb is Num+1,
verifLigne(X,Nb,NumColonne,NCol,Sol).
verifLigne(X,Num,NumColonne,NumColCourante,Sol):-
NumColCourante=<9,
NumColonne\=NumColCourante,
NCol is NumColCourante+1,
element(Num,X1,Sol),
!,
(X\=X1;var(X1)),
Nb is Num+1,
verifLigne(X,Nb,NumColonne,NCol,Sol).
% Permet de vérifier que la variable X n'a pas déjà été affecté
% dans la colonne ou elle se trouve :
verifColonne(_,_,_,NumLigneCourante,_):-NumLigneCourante>9.
verifColonne(X,Num,NumLigne,NumLigneCourante,Sol):-
NumLigneCourante=<9,
NumLigne==NumLigneCourante,
NLigne is NumLigneCourante+1,
Nb is Num+9,
verifColonne(X,Nb,NumLigne,NLigne,Sol).
verifColonne(X,Num,NumLigne,NumLigneCourante,Sol):-
NumLigneCourante=<9,
NumLigne\=NumLigneCourante,
NLigne is NumLigneCourante+1,
element(Num,X1,Sol),
!,
Nb is Num+9,
(X\=X1;var(X1)),
verifColonne(X,Nb,NumLigne,NLigne,Sol).
% X sera la variable en position I dans la liste
element(1,X,[X|_]).
element(I,X,[_|L1]):-nonvar(I),J is I-1,element(J,X,L1).
element(I,X,[_|L1]):-var(I),element(J,X,L1),I is J+1.
% member (Elem, Liste) : permet de dire si Elem appartient
% à Liste
membre(Elem,[Elem|_]).
membre(Elem,[_|Suivants]):-membre(Elem,Suivants).
tousDifferent([]).
tousDifferent([A|L]):-not(membre(A,L)),tousDifferent(L).
creeListe([],[]).
creeListe([N|L1],[N|L2]):-creeListe(L1,L2).
creeListe([_|L1],[_|L2]):-creeListe(L1,L2).
% Predicat permettant de résoudre la grille de sudoku
solution(G,Sol):-creeGrille(G,Sol).%,contraintes(Sol).
affiche(G):-afficheLigne,afficheGrille(G,0,0),afficheLigne.
afficheLigne:-write('============='),nl.
afficheGrille([],_,_).
afficheGrille([A|L],NumVar,NumLigne):-
(NumVar==0;NumVar==3;NumVar==6),
write('|'),
write(A),
NewVar is NumVar+1,
afficheGrille(L,NewVar,NumLigne).
afficheGrille([A|L],NumVar,NumLigne):-
NumVar==8,
NewLigne is NumLigne+1,
(NewLigne==3;NewLigne==6),
write(A),
write('|'),
nl,
afficheLigne,
afficheGrille(L,0,NewLigne).
afficheGrille([A|L],NumVar,NumLigne):-
NumVar==8,
NewLigne is NumLigne+1,
write(A),
write('|'),
nl,
afficheGrille(L,0,NewLigne).
afficheGrille([A|L],NumVar,NumLigne):-
write(A),
NewVar is NumVar+1,
afficheGrille(L,NewVar,NumLigne).
% Predicat permettant de résoudre une grille de sudoku
% puis d'afficher la solution.
resolveSudoku(G):-solution(G,Sol),affiche(Sol).
grilleMini([
_,1,_,_,_,_,_,_,9,
_,_,_,3,_,_,8,_,_,
_,_,_,_,_,_,6,_,_,
_,_,_,_,1,2,4,_,_,
7,_,3,_,_,_,_,_,_,
5,_,_,_,_,_,_,_,_,
8,_,_,6,_,_,_,_,_,
_,_,_,_,4,_,_,2,_,
_,_,_,7,_,_,_,_,_
]). |
Partager