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
| %%
% setConstraint(+N, +Ind, +Val, +Grid, +CurInd, +VarsToProp, -NewGrid, -NewVarsToProp)
%
%
setConstraint(N, Ind, Val, [Dom|Grid], CurInd, VarsToProp, [[Val]|NewGrid], NewVarsToProp) :-
% Meme case
Ind == CurInd,
!,
% si la valeur n'est pas dans le domaine => échec
member(Val, Dom),
NextInd is CurInd + 1,
setConstraint(N, Ind, Val, Grid, NextInd, VarsToProp, NewGrid, NewVarsToProp).
setConstraint(N, Ind, Val, [Dom|Grid], CurInd, VarsToProp, [NewDom|NewGrid], NewVarsToProp) :-
% Meme ligne, colonne ou carre
ligneColonneCarre(Ind, N, LiInd, ColInd, CarInd),
ligneColonneCarre(CurInd, N, LiCur, ColCur, CarCur),
( LiInd==LiCur ; ColInd==ColCur ; CarInd==CarCur ),
!,
removeFromSortedList(Dom, Val, NewDom),
variablesToPropagate(CurInd, Dom, NewDom, VarsToProp, TempVarsToProp),
NextInd is CurInd + 1,
setConstraint(N, Ind, Val, Grid, NextInd, TempVarsToProp, NewGrid, NewVarsToProp).
setConstraint(N, Ind, Val, [Dom|Grid], CurInd, VarsToProp, [Dom|NewGrid], NewVarsToProp) :-
% Variable non affectée par le changement
NextInd is CurInd + 1,
setConstraint(N, Ind, Val, Grid, NextInd, VarsToProp, NewGrid, NewVarsToProp).
setConstraint(_, _, _, [], _, VarsToProp, [], VarsToProp).
% Plus de variable => on s'arrête |
Partager