%% ======================
%% === Précis de Sudoku
%% = (c) 2006 Narendra Jussien
%% code prolog complet de résolution
%% d'une grille de sudoku 4x4


% définition du domaine des variables
restriction(X) :- member(X, [1,2,3,4]).

% contrainte d'unicite par région
unicite([]).
unicite([C|Cs]) :-
  not(member(C,Cs)),
  unicite(Cs).


% la description d'une grille valide de sudoku 4x4
  sudoku([C11, C12, C13, C14, C21, C22, C23, C24,
          C31, C32, C33, C34, C41, C42, C43, C44]) :-
   restriction(C11), restriction(C12), ..., restriction(C44),
   % pour les lignes
   unicite([C11,C12,C13,C14]), ..., unicite([C41,C42,C43,C44]),
   % pour les colonnes
   unicite([C11,C21,C31,C41]), ..., unicite([C14,C24,C34,C44]),
   % pour les blocs
   unicite([C11,C12,C21,C22]), ..., unicite([C33,C34,C43,C44]).

% pour info : requête du livre
%  ?-  sudoku([  3, C12,   2, C14, C21 , C22, C23,   1,
%              C31, C32, C33, C34,   4,    2, C43, C44]).

