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