Adloun

Induction structurelle sur les listes

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 9 — Ordres bien fondés et induction structurelle

Énoncé

Les listes sont l'ensemble inductif engendré par et la règle . Prouver par induction structurelle, pour toutes listes et :

Corrigé

Les définitions, qui sont le squelette des preuves :


let rec longueur = function [] -> 0 | _ :: r -> 1 + longueur r
let rec concat l1 l2 = match l1 with [] -> l2 | x :: r -> x :: concat r l2
let rec miroir = function [] -> [] | x :: r -> concat (miroir r) [x]

Première identité, par induction sur — et non sur , car c'est que concat décompose.

Cas . .

Cas . Alors , donc

L'hypothèse d'induction est appliquée à , qui est un argument du constructeur : c'est la seule chose que l'ordre induit autorise.

Seconde identité, encore par induction sur .

Cas . Le membre de gauche vaut . Celui de droite vaut . Il faut donc le lemme , qui n'est pas une évidence : il se prouve lui-même par induction sur , et c'est l'occasion de remarquer que , lui, est vrai par définition. La concaténation n'est pas symétrique dans son code, et les deux neutres ne coûtent donc pas le même prix.

Cas .

L'avant-dernière égalité est l'associativité de la concaténation — second lemme, prouvé lui aussi par induction sur son premier argument.

Vérification. Les deux identités, plus et , ont été testées sur couples de listes tirées au hasard : toutes vraies.

Le point de méthode, et il vaut pour tout le chapitre. Une preuve par induction structurelle en appelle presque toujours d'autres : ici, deux lemmes ( et l'associativité) qu'on ne voit pas avant d'être bloqué. Le bon réflexe est de mener le calcul jusqu'à l'obstacle, et de nommer alors le lemme manquant — plutôt que de chercher à tout prévoir.

Une remarque de coût, pour finir. miroir tel qu'écrit ici est en : mesures s pour , puis , et s pour , et — un facteur à chaque doublement, la signature du quadratique. La version à accumulateur, let rec miroir_acc l acc = match l with [] -> acc | x :: r -> miroir_acc r (x :: acc), reste sous la milliseconde à . La preuve d'une fonction ne dit rien de son coût, et réciproquement : ce sont deux obligations distinctes, et le programme les demande toutes les deux.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.