Chapitre 2 Ensembles définis inductivement et Induction structurelle

Transcription

Chapitre 2 Ensembles définis inductivement et Induction structurelle
Chapitre 2
Ensembles définis inductivement et
Induction structurelle
2.1
Introduction
De très nombreuses structures de données informatiques sont définies inductivement. C’est le cas
par exemple des listes chainées ou encore des arbres.
Une définition inductive d’un ensemble consiste en la donnée explicite d’un certain nombre d’éléments
ainsi que de moyens de construire de nouveaux éléments à partir d’éléments déjà connus.
Les listes d’entiers par exemple sont définies par les 2 clauses suivantes :
1. La liste vide [] est une liste.
2. Si l est une liste et si a est un entier, alors a :: l est la liste résultant de l’ajout de a en tête de
l.
Les définitions syntaxiques en informatique sont souvent données en BNF (Backus Normal form)
et correspondent aussi à des définitions inductives.
Les expressions booléènnes par exemple peuvent être définies par : ExpBool : := true | false |
(ExpBool && Expbool)| (ExpBool || ExpBool) | ( ! ExpBool)
2.2
Définition inductive d’ensemble
Une définition inductive d’un ensemble X est caractérisée par la donnée d’un ensemble de règles
de construction des éléments de X. Parmis ces règles on distingue
– Les règles de base : qui affirment que des éléments appartiennent à X.
– Les règles inductives qui donne un moyen de construire d’autres éléments de X à partir de ceux
déjà construits.
Les règles inductives ont la forme suivante :
Si a1 ∈ A1,. . . , an ∈ An, x1 ∈ X, . . . , xm ∈ X alors f (a1, . . . an, x1, . . . xm) ∈ X.
L’ensemble X est l’ensemble des objets constructibles en partant des règles de base et en appliquant un nombre fini des règles inductives.
1
2CHAPITRE 2. ENSEMBLES DÉFINIS INDUCTIVEMENT ET INDUCTION STRUCTURELLE
Plus précisemment, X est l’ensemble des éléments qui admettent une construction suivant les règles
de la définition inductive .
Une construction d’un élément a suivant les règles d’une définition inductive est un arbre fini dont
– les feuilles vérifient l’une des règles de base.
– les noeuds s’obtiennent à partir des prédécesseurs immédiats en leur appliquant une des règles
inductives.
2.3
2.3.1
Exemples
Les mots sur un alphabet
L’ensemble des mots M constitué des lettres a,b ou c est défini inductivement par les règles :
1. a ∈ M
2. b ∈ M
3. c ∈ M
4. si x ∈ {a, b, c} et m ∈ M alors x.m ∈ M
x.m est la notation infixe de .(x, m).
Grâce à ces règles on peut construire a, mais aussi b et c. On peut donc aussi construire a.a , a.b ,
a.c , b.a . . . , c’est a dire tous les mots de deux caractères parmi a, b, c. Maintenant que l’on a tous
les mots de deux lettres dans M, on peut construire tous les mots de trois caractères parmi a, b, c et
ainsi de suite.
2.3.2
Expression booléenne
Reprenons l’exemple de la définition BNF des expressions booléennes. La définition inductive
correspondante est la suivante :
1. true ∈ ExBool
2. f alse ∈ ExBool
3. si x1 ∈ ExBool, x2 ∈ ExBool alors &&(x1 , x2 ) ∈ ExBool
4. si x1 ∈ ExBool, x2 ∈ ExBool alors ||(x1 , x2 ) ∈ ExBool
5. si x1 ∈ ExBool alors !(x1 ) ∈ ExBool
Les mots &&(true, ||(!(f alse), &&(true, f alse))) et ||(!(f alse), &&(true, f alse)) ont des constructions suivant ces règles et sont donc des éléments de ExpBool.
2.3. EXEMPLES
3
ExBool est bien l’ensemble des mots représentant les expressions booléennes formés à partir des
opérateurs &&, ||, !.
2.3.3
Les Listes d’entiers
On construit inductivement les listes d’entiers de la façon suivante.
1. nil ∈ L
2. si a ∈ N et si l ∈ L, alors a :: l ∈ L
2.3.4
Les arbres d’entiers
On construit inductivement les arbres binaires d’entiers de la façon suivante.
1. vide ∈ AB
2. si a ∈ N et si A ∈ AB et si B ∈ AB alors node(a, A1, A2) ∈ AB.
2.3.5
Les entiers
On construit inductivement les entiers de la façon suivante.
1. 0 ∈ Nat
2. si a ∈ N alors succ(a) ∈ Nat.
où succ est la fonction de N vers N qui a x associe x + 1. Remarquons que nat c’est à dire
l’ensemble des objets constructibles à partir de 0 par application de succ est N tout entier. Autrement
dit nat = N
2.3.6
Les entiers pairs
On construit inductivement les entiers pairs de la façon suivante.
1. 0 ∈ P air
2. si a ∈ P air alors a + 2 ∈ P air.
4CHAPITRE 2. ENSEMBLES DÉFINIS INDUCTIVEMENT ET INDUCTION STRUCTURELLE
2.4
fonctions définies par induction structurelle
Définir un ensemble inductivement, c’est donner un moyen de construire tous ses éléments. Autrement dit, si X est defini inductivement , alors tous ses éléments peuvent s’obtenir à partir des
règles de base en appliquant un nombre fini de fois les règles inductives.
Ceci signifie que la relation t est plus petit que u si u est dans la chaine de constructuion de t est
une relation d’ordre bien fondée.
On peut donc programmer récursivement sur ces ensembles.
ce seront des définitions récursives dont la structure va se calquer sur la définition de l’ensemble.
Il y aura autant de cas qu’il y a de règles dans la définition de l’ensemble ; Les cas correspondant
aux règles de base seront des cas non récursifs et ceux correspondant aux règles inductives pourront
avoir des appels recursifs sur l’un des prédécesseurs dans la construction du terme.
En programmant récursivement selon ces règles, on est sur que l’on définit des fonctions qui terminent.
Voici un exemple pour M :
On va définir la longueur d’un mot comme une fonction long : M → N :
long(a) = 1
long(b) = 1
long(c) = 1
long(x.m) = 1 + long(m)
un exemple sur Exbool :
eval(true) = 1
eval(f alse) = 0
eval(&&(A, B)) = if (eval(A) == 1, eval(B), 0)
eval(||(A, B)) = if (eval(A) == 1, 1, eval(B))
eval(!(A)) = if (eval(A) == 1, 0, 1)
un exemple sur L :
nil@l2 = l2
(a :: l1)@l2 = a :: (l1@l2)
Le cas général est le suivant : Soit X défini inductivement par les règles :
– b1 in X
..
.
– bk ∈ X
– si a1 ∈ A1, an ∈ An, x1 ∈ X, xm ∈ X alors f 1(a1, . . . an, x1, . . . xm) ∈ X
..
.
– si c1 ∈ C1, cp ∈ Cp, x1 ∈ X, xq ∈ X alors f 2(c1, . . . cp, x1, . . . xq) ∈ X.
Alors la définition suivante definit une fonction totale g : X → E
– g(b1) = e1
..
.
2.5. PREUVE PAR INDUCTION STRUCTURELLE
5
– g(bk) = ek
– g(f 1(a1, . . . an, x1, . . . xm)) = h1(g(x1), . . . , g(xm), a1, . . . , an)
..
.
– g(f 2(c1, . . . , cp, x1, . . . xq)) = h2(g(x1, . . . , g(xq), c1, . . . , cp).
Il faut bien sur que :
e1 . . . ek soient des éléments de E et f 1 . . . f 2 soient des fonctions du bon type et déja définies.
2.5
Preuve par induction structurelle
Nous nous interessons maintenant au fait de raisonner sur ces ensembles, de démontrer des propriétés sur les éléments de ces ensembles.
Pour démontrer qu’une propriété P est vraie de tous les éléments d’un ensemble défini inductivement, il suffit de calquer le raisonnement sur la structure de l’ensemble c’est à dire
1. pour chaque règle de base de type a ∈ X, il faut Montrer P (a)
2. pour les règles inductives de la forme :
Si a1 ∈ A1, an ∈ An, x1 ∈ X, xm ∈ X alors f (a1, . . . an, x1, . . . xm) ∈ X. il faut montrer que
si a1 ∈ A1, an ∈ An, x1 ∈ X et P (x1), xm ∈ X et P (xm) alors P (f (a1, . . . an, x1, . . . xm)).
Pourquoi ce raisonnement est il correct ?
Supposons que nous ayons démontré une propiété P suivant ce schéma.
Prenons maintenant un élément quelconque a de X.
Si cet élément est un de ceux donnés par les règles de base, Nous avons démontré par le schéma P (a).
Sinon, a s’obtient par un nombre fini d’applications des règles inductives à partir d’une règle de base.
P a été montré pour l’élement de base sur lequel a est construit. La deuxième partie du schéma nous
permet de remonter d’étape en étape la propriété P en suivant la chaine de construction de a.
Un exemple de raisonnement par induction structurelle sur les listes :
Montrons que pour toute liste l , l@nil = l
Selon le principe d’induction structurelle, il suffit de montrer :
1. nil@nil = nil trivial par le premier cas de définition de @
2. Supposons que l1@nil = l1 et montrons que (a :: l1)@nil = a :: l1
(a :: l1)@nil = a :: (l1@nil) par le deuxième cas de définition de @
et par notre hypothése d’induction l1@nil = l1. Donc (a :: l1)@nil = a :: l1
2.6
Definition inductives d’ensembles et langage de programmation
En programmation , on rencontre très souvent des définitions inductives.
Comme nous l’avons vu, la plupart des grammaires définissent l’ensemble des mots du langage comme
6CHAPITRE 2. ENSEMBLES DÉFINIS INDUCTIVEMENT ET INDUCTION STRUCTURELLE
un ensemble inductif.
Par ailleurs, de nombreuses structures de données très utilisées sont des structures récursives. Nous
avons ici pris l’exemple des listes et des arbres.
En général, les langages de pogrammation n’offrent pas directement le moyen de d’éfinir des types
de données inductifs. Il faut les implanter en utilisant les moyens offerts par le langage.
C’est ce qu’on fait par exemple pour les listes lorsu’on les implante par un pointeur sur un couple
(n,l) ou n est un entier (le premier élement de la liste) et l le reste de la liste.
La liste vide est en général le pointeur null. Ainsi, chaque liste implantée est bien soit la liste vide,
soit une liste construite a partir d’un entier et d’une liste déajà existante.
Le détour mathématique sur les ensembles inductifs de ce cours, vous permet :
– De repérer ce genre de structure,
– De savoir dès le moment ou vous les avez repéré comment les implanter dans le langage visé
– De savoir comment programmer sur ces structures
– De savoir comment raisonner sur ces structures.
Le gain visé est alors un gain en terme de rapidité de conception et d’ecriture de code, ainsi qu’un
gain en terme de qualité de vos applications.
Ocaml a ceci de particulier qu’il offre une construction-les types sommes récursifs - qui correspond
exactement à des définitions inductives d’ensemble
Rappelons la définition du type int arbre en Ocaml :
type int_arbre = Vide
|Noeud of int * int_arbre * int_arbre;;
et quelques manipulations de ce type :
let un =Noeud(1,Vide, Vide);;
let rec somme_arbre arb=
match arb
with Vide -> 0
|Noeud (n,a,b) -> somme_arbre a + n + somme_arbre b;;
Ceci est une simple traduction en Ocaml de ce que nous faisons dans ce cours. Parceque ces
ensembles ont un comportement et une structure parfaitement connue et maitrisée, les concepteurs
du langage ont pu prendre en charge l’implantation de ces définitions de type de façon correcte et
efficace. Cela offre aux utilisateurs du langage un style de programmation plus abstrait, plus proche
de la pratique mathématique, et par la même une plus grande facilité de maitrise de leur code.
2.7
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] ?
2.7. EXERCICES
7
2. Montrer que Noeud(1, noeud(2,vide,vide), noeud(3,Noeud(4,vide,vide),vide))est un élément de
AB
3. faire un dessin pour rerésenter ce terme.
4. Donner une autre définition inductive des arbres binaires dans laquelle les feuilles sont aussi
des entiers.
5. Donner une definion inductive des entiers relatifs
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.
2. Définir inductivement l’ensemble des exp arithmétiques avec +,-, *,/
3. Définir inductivement l’ensemble des instructions d’un langage avec := if while
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
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]
3. Prouver que (a@b)@c = (a@(b@c))
4. Prouver que rev(a@b) = rev(b)@rev(a)
5. Prouver que pref ix(A) = rev(postf ix(a))

Documents pareils