TD de Prolog et programmation par contraintes n 4

publicité
Université Paris 7 - M1
Année 2006-2007
TD de Prolog et programmation par contraintes n◦ 4
(Correction)
Exercice 1 [Carrés latins] Un carré latin est une matrice n × n qui contient les nombres de 1 à n 2 ,
disposés de telle façon que, pour chaque ligne et chaque colonne de la matrice, la somme des nombres
de la ligne ou de la colonne en question donne le même résultat.
Par exemple, voici un carré latin de taille 3:
8
1
6
3
5
7
4
9
2
Le but de cet exercice est d’implementer un algorithme “générer et tester” pour engendrer les carrés
latins.
Une configuration est une liste de n2 éléments, qui contient une permutation des entiers de 1 à n 2 . Les
n premiers éléments de la liste réprésentent la première ligne de la matrice, les éléments du n + 1-ème au
(2 ∗ n)-ième la deuxième ligne et ainsi de suite.
.
Donc, la matrice ci-dessus est réprésentée par la liste
#"%$'&
$
(*)+)!),
2 .
1. Définir un prédicat !
qui réussit ssi est la liste
$0"21'&
1
$
2. Définir un prédicat -,./
qui réussit ssi la liste est une permutation de la liste .
#"=<>&
<
qui réussit ssi est la somme des éléments d’une ligne
3. Définir un prédicat 34.*5!!6+7!89;:2,
d’un carré latin de taille (il s’agit évidemment de n’importe quelle ligne, ou colonne; la division
entière s’écrit ?!? , infixe)
Définir les prédicats:
$/
0"=B;&
– @,3%.!.'!6+7:%!
! 'A
qui réussit ssi la sommme des éléments de la A -ème ligne de
$
la configuration d’un carré latin de taille (c.à.d. des éléments (N ∗ (I − 1)) + 1,...,N ∗ I de
$
B
la liste ) est .
$/
#"2B;&
,
'A
, l’analogue pour la somme des éléments de la A -ème co– @,3%.!.'!6C3!7+3+D
lonne.
)
Une définition de @,3%.+.E!6+7:4, et @3%.+.E+6C3+7!3! se trouve dans ?!E@,?5!F;C!C+:8!?@3%.+.E@ -7 .
$/
&
$
! !H
4. Définir un prédicat 9*@%96!7:%,*@G
qui réussit ssi est une configuration pour un carré
$
latin de taille , tel que la somme des éléments sur chaque ligne de la matrice réprésentée par est
$
H . On supposera que est effectivement une configuration.
$ &
H , analogue au précedent.
5. Définir un prédicat 9*@496C3!7+3!*@G
0"2$;&
$
6. Définir un prédicat C8!+6!7+89':%,
qui réussit si est (la réprésentation d’) un carré latin
de taille .
7. Définir une requête pour trouver toutes les configurations qui représentent des carrés latins de taille
3. Quel est leur nombre?
8. Pour les carrés latins de taille 4, l’approche “générer et tester” montre ses limites. Pourquoi? Défi $;&
pour trouver les carrés latins de taille 4, plus efficace.
nir un prédicat C8++6!7!89':%6 1
Correction :
!#"$$%$&
'(*) ,
+-/.0,
1.2
'(*) ,
+-34#"/3,5.076
: +,+;,+-3#"26
()
3%".0 '(*) ,+6489$%
3&
(*) 3</34 '(*) ,+64=
>+;@?A
B,
B
>+;@?A
CDFE=#"2>,+;@?AF-HG%8 ( ) +;* ( 4HC4BG4E
( ) + ; ( $ 4C4&
CD*
( ) + ; ( $ 4C4
I*&,
I=J" ( ) +;* ( &C&!
/?,K;,+L ' ( 4346=J"/6
(*)
3<!3<@3M0.NNPO4
) /?*?%+L$>;+/? ( + ; ) F &Q-FQ!
) /?*?%+L$>;+/? ( + ; ) CDB34H=#"/R
+ '( ? ( +-FQ&
+ '( ? ( +-
C&34FU,=#"/R
(*) 3%".0 ) /?*?%+L$>;+/? ( +; ) &RFS,!H
(*)
S*M*CT
(*) 3%".0V+ '( ? ( +-FHR4JU
) /?*?%+L ' ( : +-F&34W.%H%F" ) 2 ?*?%+L/>;+2? ( +; ) &H34
) /?*?%+L ' ( : ' ( ? ( +-&H34JU!HR (*) 6%",.% ) /??+L '( : +-JU3R&=
+-F&34H6H%F"$+ ,
) /?*?%+L, ' +FH3H64J"2R
()
6%".0V+ '( ? ( +-FHR4JU! ) 2?*?%+L,@ ' $,+LXY&#U3&=
) /?*?%+L, ' +L*XY&
C&H3C%!#" ' +$ : Z4&HR%!BR[$3T
) /?*?%+L, ' +L*XY&
C&H3%!#" ' +$ : Z4&HR%!BR5\3]+ '( ? ( +-
C3&JU,8
) /?*?%+L, ' +L*XY&JU-3&J^,8H (*) C,
M ^
'( : + ) L*_F3`%=J" '( : +L$XYH3H34`
' ( : +L*XYF3FQ&H`=
' ( : +L*XYF364H`=#" ) / ?*?+L '( : ,+3&6H`!R
(*) 6%".0 '( : +L*XYF3&RH`%=
' + ) L*_F&34H`=#"*@ ' $*+LXY&3&3H`
' +LXYF&34Q-H`%
' +LXYF&34H6H`%F" ) 2 ?*?%+L ' $+=F&H364B`%8HR
() 6%".01 ' +LXY&H34BR4H`
;*;,+L ' ( 430.=J"2W?K;+L ' $ ( 346! : +$+;+-3!>+;@?AH0.8 ',( : + ) L*_0.%H34H6%01$ ' $+ ) L_&F.03&6
\\\*\\\\\*\\\\\*\\\*\*\*\\\\\*\*\*\,aRb%c26c@Sd
!#"$$%$&
'(*) ,
+-/.0,
1.2
'(*) ,
+-34,
3#"23,5.076
: +,+;,+-3#"26
(*)
3",.0 '(*) +-64
(*) 3</34 '(*) ,+64=
>+;@?A
C&
C=
2
>+;@?A
CDFE=#"2>,+;@?AF-HG%8 ( ) +;* ( 4HC4BG4E
( ) + ; ( $ 4C4&
CD*
( ) +; ( $ 4C4
I*&,
I=J" ( ) +;* ( &C&!
/?,K;,+L ' ( 4346=J"/6
(*)
3<!3<@3M0.NNPO4
?%+/?,K+;C
CBLJ"*
?%+/?,K+;C
L *J"#?+/?K+;&C!
+ ' + ,+;C4
CD=#"
+ ' + ,+;C4
ID,
IB^J"@+$ ' +,+;&C4-J^,=
'( : ) )( K ' +-/.%H6
6&F^F"1?+2?,K+;-6!F+@ ' + +;H64&J^,
+L$> ' ( : ) )( K ' ( ) 6%"/C4J^ () 3%".0
+L$> + 3H6
CA*&,
C&H#"W35.%HC[6&R *
' ( : )
)
(
'
+L$>
K + #^HR4H=
'( : +L$> ))( K ' +-3H6
CA*&
4
DC#"W35.% '( : +L@>, ))*( K ' +-34B64&
/Z ( YL '( : +-F&34H=#"2/?,K;+L ' ( 34B6%8
'( : +L$> ))( K ' +-3H6H0.%H0.!
'( : +L$> ))( K ' +-3H68.O-H,O0
'( : +L$> ))( K ' +-3H6,O-H0
>+;@?AF0.00.!H>,+;$? O&*O8B>,+;$?TF-0H>,+;@?A&!
%.0 O&HR8.8
R0.0 &HR,O8
RO& 4H%
' ( ? ( + +-FQ&
=
+ '( ? ( +-
C&34,
C-JU,=J"/R
) /?*?%+L, ' +FH3H64J"2R
()
(*) 3%",.0V+ ,
' ( ? ( +FR4
4JU,=
' ( ? ( +-FHR4JU! ) 2?*?%+L,@ ' $,+LXY&#U3&=
6%".0V+ ) /?*?%+L, ' +L*XY&
C&H3C%!#" ' $+ : Z4&HR%!BR[$3T
) /?*?%+L, ' +L*XY&
C&H3%!#" ' $+ : Z4&HR%!BR5\3]+ ' ( ? ( +-
C3&JU,8
) /?*?%+L, ' +L*XY&JU-3&J^,8H (*) CM,
^ ' + ) L*_F&34H`=#"*@ ' $ *+LXY&3&3H`
' +LXYF&34Q-H`%
' +LXYF&34H6H`%F" ) 2 ?*?%+L ' $+=F&H364B`%8HR
()
;*;,+L ' ( L&%=J"W/?K;+L ' ( 6%0 : +$,+;,+=!
/Z ( YL '( : + F&4H81 ' $*,+ ) L_&4B6%=
N,<
1.&W.&2.2.&2.2O-2..2.2Q-&--&4-O&2. <N
3
6%".01 ' +LXY&H34BR4H`
Exercice 2 [Le jeu des 16 allumettes]
Configuration initiale:
|
| | |
| | | | |
| | | | | | |
Règle du jeu: les deux joueurs, chacun à son tour, prélèvent une quantité (non nulle) d’allumettes
d’une (et une seule) rangée.
Fin du jeu: le joueur qui prélève la dernière allumette a perdu.
1. choisir une représentation des configurations du jeu.
&
2. définir un prédicat .E3D 3':%6!3F!;C
3E:4*6*@49':%89;:3
qui implémente la règle du
jeu.
&
&)
3. définir un prédicat *8! 3E:%!F!89':3 , tel que le but *8!0C
a succes si et seulement
si il existe une stratégie gagnante à partir de la configuration C . Voici par exemple 3 configurations
gagnantes:
|
|
|
|
| | | | | | |
| |
| |
| | | | |
| | | | | |
4. vérifier que la configuration initiale du jeu est perdante.
&
5. définir un prédicat +F 3':%,F+89':3 qui permet à l’utilisateur de jouer contre le programme,
comme premier joueur et à partir de la configuration donnée. Le programme joue une stratégie optimale (c’est à dir que, dès que le programme joue sur une configuration gagnante, le programme
gagne).
Correction :
N,< (' : ( $
+ ( . ) ,+/Z ( ( ( : X;, ( +P+ X '(*) ,
( ( ,+; ( ]
'' ( ( ( 1
.%&&*TJ<N
'
)
)
)
)
(
(
'
(
)
(
(
)
(
V
'
(
N,<
+P?%
+ >,
K
$ X >;,+
, X,+ >, %
? ,/Z , : ( $ ; *
X X,+,+,<N
'
(
'
)
(
(
'
(
)
)
N,< X +
/Z + +
>; ?% ?%
J<N
4
?%
? %
? %
? %
? %
? %
? %
( ) &Q
( ) &Q
( ) &Q
( ) 4Q
( ) &Q
( ) JO&Q
( ) /.0Q
?
? ? ? ? ? ( ) &2.
( ) &2.
( ) &2.
( ) 42.
( ) &2.
( ) FO&2.
?%
? %
? %
? %
? %
( ) &FO
( ) &FO
( ) &FO
( ) 4FO
( ) &FO
?%
? %
? %
? %
( ) - %
? ( ) &%= %
? ( ) & ?% ( ) &
=
( ) - %
(
)
? & %= %
? ( ) & ( ) - %
? ( ) & %=
( ) ?%+-
C4HI4FE&b
CHI4FE,=#"1? ( ) b48=
?%
+-
C4HI4FE&b
CHI4 4b=#"1? ( ) J E&8=
?%
+-
C4HI4FE&b
C FEb=#"1? ( ) I48=
?%
+-
1.0HI4FE&b
BQ-HI4FEb=
4
>+;
>+;
>+;
>+;
: :
&
1.0Q&FQ&FQ
&
HQ&W.0FQ&FQ
&
HQ&Q&2.0FQ
&
HQ&Q&FQ&2.W
+-
HQ-FQ&FQ&Q*=
: : +-F=#"1?%+-F&! >+; &F
>+; &
FJ" : : +F
+Y*C4I#"1?%,+-CHI%!>+; -I%!
' ( : ?%;,+L ,
+-FQJ"W ' '
,
(
: ?%;,+L
+-3%J"; ( +- !B6
(*)
3",.0?%$;,+L '( : +=6=
?%;,+L$>, ) CI4E-Hb!#"#?$;+L ',( : +=C8D?%*;+L '( : +I%8?*;,+L '( : ,+-FE0?$*;,+*L ',( : ,+-Hb%
: +
!H ' ;,+* -C%0
KX : +-C4HI%#"; ( + + ,
X + '' + ;,$ (
(
'
; ,+ 1/?K + #!B ;,+
-I
N,<
/Z : +-X;;,+H, : +*+-/?K ( +$4,+ ) X ' *<N
/Z$ : + B=
/Z$ : + CW.03,
I=J"2I (*) %
C "/3 /Z$ : + CH643,
C=J" 6,5.0 R ()
,+; ( 6%".0 /Z : +-FR34!
( +-C4IFE=J"/Z@ : +C&IE!?+FE,
) /?*?%-
B&FQ
) /?*?%-
63#" ) 2??%=F&
!3
(*) M6 ( , ' +-F#" ) 2??%&3%073\,[.!
X ($'(*) +X;F#" ?%*;,+L$> ) F!
( ' +-"5H ' ; ( ,+=
( 0H ' +Y ( % K,X : +-CHI%0
+; ( ( +-C4IFE
,
?%$;,+L@> ) JE!H,+Y*JE3+Y*%!
X ($'(*) +X;3+Y=
5
Téléchargement