Vous êtes sur la page 1sur 5

1

exercices
exercice 1
On travaille sur les listes et les arbres binaires.
1. Par quel élément de L représenter la liste [1, 2, 3, 4] ?
1 :: (2 :: (3 :: 4 :: nil)

2. Montrer que noeud(1, noeud(2,vide,vide), noeud(3,Noeud(4,vide,vide),vide))est un élément de


AB
Remarque : on va appeler AB1 la première règle de définition de AB et AB2 la seconde.
(1) par AB1 vide ∈ AB
(2) Comme de plus 2 ∈ N , par AB2 noeud(2, vide, vide) ∈ AB.
(3) Comme de plus 4 ∈ N , par AB2 noeud(4, vide, vide) ∈ AB.
(4) Les lignes (1) et (3) et le fait que 3 ∈ N nous donne par AB2 que noeud(3, noeud(4, vide, vide), vide) ∈
AB
(5) Les lignes (2) et (4) et le fait que 1 ∈ N nous donne par AB2 que noeud(1, noeud(2, vide, vide), noeud(3
AB

3. faire un dessin pour représenter ce terme.

4. Donner une autre définition inductive des arbres binaires dans laquelle les feuilles sont aussi
des entiers.

(a) n ∈ Ar (n ∈ N )
(b) si a ∈ N et si A ∈ Ar et si B ∈ Ar alors node(a, A1, A2) ∈ Ar.

Avec cette définition on peut construire par exemple :node(1,2,node(3,4,5))


5. Donner une definion inductive des entiers relatifs
(a) 0 ∈ Z
(b) si a ∈ Z alors n + 1 ∈ Z.
(c) si a ∈ Z alors n − 1 ∈ Z.
2

Exercice 2
Il s’agit de définir inductivement des ensembles.
1. Définir inductivement le sous ensemble de M des mots de longueur paire.
(a) a.a ∈ MP
(b) b.b ∈ MP
(c) c.c ∈ MP
(d) si m ∈ MP , si x ∈ {a, b, c} et si y ∈ {a, b, c} alors x.y.m∈ MP .
, le mot vide n’était pas un élément de M. Le sous ensemble de M des mots de longueur paire
seront donc tous de longueur > 0.
2. Définir inductivement l’ensemble des exp arithmétiques avec +,-, *,/
(a) n ∈ Expa (n ∈ N )
(b) si A ∈ Expa , si B ∈ Expa alors (A + B) ∈ Expa
(c) si A ∈ Expa , si B ∈ Expa alors (A − B) ∈ Expa
(d) si A ∈ Expa , si B ∈ Expa alors (A ∗ B) ∈ Expa
(e) si A ∈ Expa , si B ∈ Expa alors (A/B) ∈ Expa
3. Définir inductivement l’ensemble des instructions d’un langage avec := if while
On va supposer que l’ensemble des variables des programmes est V ar = {x, y, z}.
On a par ailleurs défini Expa et ExBool.

(a) n ∈ Expa et si v ∈ V ar alors v := n ∈ Instr (n ∈ N )


(b) si A ∈ ExpBool , si B ∈ Instr alors if (A){B} ∈ Instr
(c) si A ∈ ExpBool , si B ∈ Instr alors while(A){B} ∈ Instr

Exercice 3
On travaille sur la definition inductive des arbres binaires et sur les listes AB.
1. définir la fonction rev qui renverse les éléments d’une liste

La définition des listes contient une règle de base (nil) et une règle inductive (a :: x) qui permet
la construction d’une nouvelle liste à partir d’une liste existante. Les fonctions sur les listes
pourront être définies récursivement en suivant la définition de l’ensemble ; Elles auront donc
2 cas :
(a) le cas nil qui ne doit pas être récursif.
(b) le cas a :: l qui peut rappeler la fonction sur l.
Appliquons cela pour définir rev : rev(nil) = nil
rev(a :: x) = rev(x)@(a :: nil)
3

2. définir les fonctions prefix et postfix respectivement de type AB → L et qui engendre la liste
correspondant au parcours respectivement prefixe et postfixe de l’arbre.
exemple :
prefix(Noeud(1, noeud(2,vide,vide), noeud(3,Noeud(4,vide,vide),vide)))= [1,2,3,4] et
postfix (Noeud(1, noeud(2,vide,vide), noeud(3,Noeud(4,vide,vide),vide)))= [4,3,2,1]
La définition des Arbres AB contient une règle de base (vide) et une règle inductive (noeud(n, a, b))
qui permet la construction d’un nouvel arbre à partir de 2 arbres existants. Les fonctions sur les
arbres pourront être définies récursivement en suivant la définition de l’ensemble ; Elles auront
donc 2 cas :
(a) le cas vide qui ne doit pas être récursif.
(b) le cas noeud(n, a, b) qui peut rappeler la fonction sur a (le sous arbre gauche) mais aussi
sur b (le sous arbre droit)
pref ix(vide) = nil
pref ix(noeud(n, a, b)) = (n :: pref ix(a))@pref ix(b)

postf ix(vide) = nil


postf ix(noeud(n, a, b)) = postf ix(b)@(postf ix(a)@n :: nil)

3. Prouver que (a@b)@c = (a@(b@c))


On va utiliser le raisonnement par induction structurelle sur les listes qui à la forme suivante :

Pour montrer que pour toutes liste l on a P (l), il suffit de montrer :


(a) P (0)
(b) si P (l1) est vraie alors P (n :: l1) aussi

On applique ce shéma au cas où P (a) est la propriété : (a@b)@c = (a@(b@c)) . Il faut donc
montrer :
(a) (nil@b)@c = (nil@(b@c)) .
par définition de @, (nil@b)@c = b@c .
par définition de @, nil@(b@c) = b@c , ce qui nous donne le résultat.
(b) si (a1@b)@c = (a1@(b@c)) est vraie alors ((n :: a1)@b)@c = ((n :: a1)@(b@c)) aussi.
Supposons (HR) :(a1@b)@c = a1@(b@c) vraie
et montrons ((n :: a1)@b)@c = ((n :: a1)@(b@c)).

((n :: a1)@b)@c = (n :: (a1@b))@c ((n :: a1)@(b@c))


= (déf de @) = (déf de @)
(n :: (a1@b))@c = n :: ((a1@b)@c) n :: (a1@(b@c)) Ce qui nous donne le résultat.
= (par HR)
n :: (a1@(b@c))
4

4. Prouver que rev(a@b) = rev(b)@rev(a)


On applique Le shéma au cas où P (a) est la propriété :rev(a@b) = rev(b)@rev(a)
Il faut donc montrer :
(a) rev(nil@b) = rev(b)@rev(nil) .

rev(nil@b) rev(b)@rev(nil)
= (def rev) = (def rev)
rev(b) rev(b)@nil
= (preuve dans notes cours)
rev(b)
(b) si rev(a1@b) = rev(b)@rev(a1) est vraie alors rev((n :: a1)@b) = rev(b)@rev(n :: a1)
aussi.
Supposons (HR) :rev(a1@b) = rev(b)@rev(a1) vraie
et montrons rev((n :: a1)@b) = rev(b)@rev(n :: a1)

rev((n :: a1)@b) rev(b)@rev(n :: a1)


= (déf de @) = (déf de rev)
rev(n :: (a1@b)) rev(b)@(rev(a1)@(n :: nil))
= (def rev) = (ex precedent)
rev(a1@b)@(n :: nil) (rev(b)@rev(a1))@(n :: nil)
= (HR)
(rev(b)@rev(a1))@(n :: nil)

Ce qui nous donne le résultat.


5. Prouver que pour tous les éléments de AB :pref ix(a) = rev(postf ix(a))
La définition des Arbres AB contient une règle de base (vide) et une règle inductive (noeud(n, a, b))
qui permet la construction d’un nouvel arbre à partir de 2 arbres existants. Le raisonnement
par induction structurelle sur AB a donc la forme suivante :
Pour montrer que pour tout arbre a on a P (a), il suffit de montrer :
(a) P (vide)
(b) si P (a1) et P (a2) sont vraies alors P (noeud(n, a1, a2)) aussi

On applique ce shéma au cas où P (a) est la propriété : pref ix(a) = rev(postf ix(a)) Il faut
donc montrer :
(a) pref ix(vide) = rev(postf ix(vide))
pref ix(vide) rev(postf ix(vide))
= (def prefix) = (def postfix)
nil rev(nil)
= (def rev)
nil
5

(b) si pref ix(a1) = rev(postf ix(a1)) et pref ix(a2) = rev(postf ix(a2)) sont vraies alors
pref ix(noeud(n, a1, a2)) = rev(postf ix(noeud(n, a1, a2))) aussi
Supposons (HR1) pref ix(a1) = rev(postf ix(a1)) et (HR2) pref ix(a2) = rev(postf ix(a2))
et montrons pref ix(noeud(n, a1, a2)) = rev(postf ix(noeud(n, a1, a2)))

pref ix(noeud(n, a1, a2)) rev(postf ix(noeud(n, a1, a2)))


= (def prefix) = (def postfix)
(n :: pref ix(a1))@pref ix(a2) rev(postf ix(a2)@(postf ix(a1)@(n :: nil)))
= (def @)
n :: (pref ix(a1)@pref ix(a2))
= (HR1)
n :: (rev(postf ix(a1))@pref ix(a2))
= (HR2)
n :: (rev(postf ix(a1))@rev(postf ix(a2)))
= (exercice precedent)
n :: (rev(postf ix(a2)@postf ix(a1)))
= (exercice 3)
rev((postf ix(a2)@postf ix(a1))@(n :: nil))
= (exercice precedent)
rev(n :: nil)@rev(postf ix(a2)@postf ix(a1))
= ...
(n :: nil)@rev(postf ix(a2)@postf ix(a1))
= (def @)
n :: rev(postf ix(a2)@postf ix(a1))

Exercice 4
Montrer que P air ⊆ N .
Montrer que P air ⊆ N , c’est montrer que tous les éléments de P airs sont des éléments de N .
On va utiliser le raisonnement par induction structurelle sur l’ensemble P air. Il faut donc montrer :
1. 0 ∈ N trivial.
2. si p ∈ N alors p + 2 ∈ N trivial
Montrer que tout entier Pair est divisible par 2 (ie il existe z p=2*z)
1. 0 est divisible par 2 : oui, il suffit de prendre 0 pour z.
2. si p divisible par 2 alors p + 2 aussi.
par hypothèse p divisible par 2, donc p = 2 ∗ z1 pour un certain z1.
Donc p + 2 = (2 ∗ z1) + 2 = (2 ∗ (z1 + 1))