Théorie de la démonstration TD3: preuves par induction

publicité
Théorie de la démonstration
TD3: preuves par induction
28 septembre 2015
Induction sur les entiers (ou récurrence)
Dans sa forme la plus simple, le principe d’induction (appelé aussi principe
de récurrence) permet de prouver des propriétés de la forme
∀n ∈ N.A(n),
c’est-à-dire, que la propriété A est vraie pour tout entier non-négatif n. Il
s’énonce de la manière suivante (on suppose implicitement que m, n ∈ N) :
(A(0) ∧ ∀m.(A(m) ⇒ A(m + 1))) ⇒ ∀n.A(n).
Autrement dit, si la propriété A est vraie pour 0 et si, en supposant que A
soit vraie pour un entier générique m on arrive a démontrer qu’elle vraie aussi
pour m+1, alors A est vraie pour n’importe quel entier. On pourrait l’appeler
« principe du domino » : si le premier domino tombe (A(0)) et si la chute de
chauqe domino implique la chute du suivant (∀m.A(m) ⇒ A(m + 1)), alors
tous les dominos tomberont (∀n.A(n)).
Concrètement, une preuve par induction sur les entiers comporte deux
étapes :
base : on démontre que A est vraie pour 0 ;
induction : on suppose que A est vraie pour m et, en utilisant cette
hypothèse (que l’on appelle hypothèse d’induction ou de récurrence),
on démontre que A est vraie pour m + 1.
Exercice 1. Montrer les identités suivantes par induction sur n :
1. (formule de Gauss)
n
X
n(n + 1)
i=
2
i=1
1
2. (série géométrique)
n
X
i=0
q n+1 − 1
q =
q−1
i
Exercice 2. Considérer la fonction suivante :
int bidon(n : int)
{
if (n == 0) return 1;
return bidon(n-1) * bidon(n-1) * bidon(n-1) * bidon(n-1);
}
On suppose que le type int n’a pas de valeurs négatives. Prouver que :
1. l’execution de la fonction bidon termine toujours ;
2. pour tout n, bidon(n) = 1.
Induction générale
Le principe d’induction s’applique en fait à des situations beaucoup plus
générales. Il suffit d’avoir un ordre bien fondé, c’est-à-dire, un ensemble S
muni d’une relation d’ordre ≤ tel qu’il n’existe pas de chaine descendante
infinie : a0 > a1 > a2 > a3 > · · · . Quelques exemples :
— les entiers non-négatifs N avec leur ordre habituel ;
— les arbres finis, étiquetés ou pas, avec l’ordre induit par la relation
« être sous-arbre de » ; les preuves du calcul des séquents sont un cas
particulier de cet exemple ;
— si (S1 , ≤1 ) et (S2 , ≤2 ) sont deux ordres bien fondés, le produit Cartésien S1 × S2 est aussi bien fondé avec l’ordre lexicographique :
(a, b) ≤ (a0 , b0 ) ssi a ≤1 a0 ou a = a0 et b ≤2 b0 ;
— si (S0 , ≤0 ) est un ordre bien fondé, l’ensemble des multiensembles finis
sur S0 est aussi bien fondé avec l’ordre suivant :
µ≤ν
ssi ν = (µ − ρ) + σ,
où σ et ρ sont tels que, pour tout a ∈ σ et b ∈ ρ, a ≤0 b. Autrement
dit, µ ≤ ν lorsque le multiset ν est obtenu à partir du multiset µ en
supprimant un certain nombre d’éléments (y compris zéro) et en les
remplaçant par des éléments qui ne sont pas plus grands.
2
Le principe d’induction générale s’énonce de la manière suivante :
(∀b.(∀c.c < b ⇒ A(c)) ⇒ A(b)) ⇒ ∀a.A(a).
C’est-à-dire, si, en supposant que A soit vraie pour tous les éléments c strictement plus petits qu’un élément générique b, on arrive à démontrer que A
est vraie pour b lui-même, alors A est vraie pour tous les éléments.
Concrètement, une preuve par induction sur l’ordre bien fondé (S, ≤) a
la forme suivante : on essaie de démontrer que A est vraie pour un b ∈ S
générique en supposant que A est vraie pour n’importe quel c strictement
plus petit que b (cette derniere est appelée hypothèse d’induction). Il y a
maintenant deux situations :
1. b est minimal, c’est-à-dire, il n’y pas de c < b ; dans ce cas, l’hypothèse
d’induction est inutile et la démonstration sera directe ;
2. b n’est pas minimal ; on utilise alors l’hypothèse d’induction.
Dans le cas particulier où S = N et ≤ est l’ordre habituel des entiers, on
reconnaîtra dans (1) et (2) respectivement le cas de base et d’induction du
principe de récurrence formulé ci-dessus.
Exercice 3. (Fonction d’Ackermann) Considérer la fonction suivante :
int ack(int m, int n)
{
if (m == 0) return n + 1;
else
if (n == 0) return ack(m - 1, 1);
else return ack(m - 1, ack(m, n - 1));
}
Prouver que, pour tout m, n ≥ 0, le calcul de la fonction ack termine. (La
fonction d’Ackermann est une drôle de bête : bien qu’elle soit totale, c.-à-d.
son calcul termine toujours, il est impossible de la programmer à l’aide de
seules boucles for, il faut impérativement utiliser quelque part des boucles
while, ou bien faire une récursion imbriquée comme dans la définition cidessus).
Excerice 4. (Admissibilité de l’affaiblissement) Démontrer que la
règle de l’affaiblissement
`Γ
` Γ, A
3
est admissible dans le calcul suivant :
` Γ, ¬A, A
` Γ, A, B
` Γ, A ∨ B
` Γ, A ` Γ, B
` Γ, A ∧ B
`Γ
` Γ, ⊥
` Γ, >
En d’autres termes, démontrer que, pour toute dérivation π de ` Γ utilisant
les règles ci-dessus et l’affaiblissement, il existe une preuve de ` Γ utilisant
uniquement les règles ci-dessus (et pas d’affaiblissement). On fera la preuve
par induction sur π.
Dans certains cas, l’ensemble X des objets pour lesquels on veut démontrer la propriété A n’est pas muni d’un ordre bien fondé, ou l’ordre bien
fondé naturel ne convient pas. Dans cette situation, il est parfois possible de
démontrer que tout élément de X jouit de la propriété A en définissant une
fonction p : X −→ S où S est bien fondé. L’élément p(x) est appelé poids,
ou mesure de x. On démontre alors la propriété suivante, qui implique en
particulier ∀x.A(x) :
∀a.∀x.(p(x) = a ⇒ A(x))
Cette formule étant de la forme ∀a.B(a), on peut la démontrer par induction.
Exercice 5.
1. Écrire la formule B(a) dont il est question ci-dessus.
2. Pourquoi est-ce que ∀a.∀x.(f (x) = a ⇒ A(x)) implique ∀x.A(x) ?
Exercice 6. Considérer la suivante modification de la fonction bidon définie à l’exo 2 :
int bidon(n : bidon)
{
if (n <= 0) return 1;
else return bidon(n - 7) * bidon(n - 42) * bidon(n - 2);
}
Démontrer que bidon(n) = 1 pour tout n : int, où int le vrai type des
entiers en C, c.-à-d. n peut prendre des valeurs négatives.
4
Exercice 7. Considérer la fonction suivante :
int zarbi(int n)
{
if (n > 100) return n - 10;
else return f(f(n + 1) + 10);
}
Comme dans l’exo précédent, int est le vrai type des entiers en C, c.-à-d. n
peut prendre des valeurs négatives. Montrer que, pour tout n, zarbi(n) ≥ 91.
5
Téléchargement