Probleme – Une récursion qui n'est pas structurelle
Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 9 — Ordres bien fondés et induction structurelle
Énoncé
La forme normale négative d'une formule est une formule équivalente où toute négation porte sur une variable.
- Écrire la fonction
nnfpar filtrage. - Montrer que ses appels récursifs ne portent pas tous sur des sous-formules. La terminaison est-elle acquise par l'ordre induit ?
- Trouver le variant, et prouver la terminaison.
- Prouver que
nnfpréserve la sémantique et atteint son but.
Corrigé
1. La fonction. Elle repose sur les lois de De Morgan et l'élimination de la double négation.
(* Renvoie une formule equivalente a f dont toute negation porte sur une
variable. Precondition : aucune. *)
let rec nnf = function
| Var p -> Var p
| Non (Var p) -> Non (Var p)
| Non (Non g) -> nnf g
| Non (Et (a,b)) -> Ou (nnf (Non a), nnf (Non b))
| Non (Ou (a,b)) -> Et (nnf (Non a), nnf (Non b))
| Et (a,b) -> Et (nnf a, nnf b)
| Ou (a,b) -> Ou (nnf a, nnf b)
2. Les appels ne sont pas structurels, et c'est le point du problème. Dans le cas , les appels portent sur et . Or n'est pas une sous-formule de : les sous-formules de sont elle-même, , , et leurs sous-formules. La formule n'y figure pas — elle vient d'être construite.
L'ordre induit du cours ne prouve donc rien ici. Un filtrage dont les motifs se lisent sur les constructeurs ne garantit pas que la récursion soit structurelle : il faut regarder les arguments des appels, pas les motifs. C'est la faute la plus fréquente quand on croit qu'un match suffit à démontrer une terminaison.
3. Le variant est la taille. Posons le nombre de nœuds : , , . C'est un entier , et est bien fondé. Vérifions chaque cas :
| Argument | Appels | Comparaison des tailles |
|---|---|---|
| , | car | |
| , | idem | |
| , | , |
La ligne décisive est la deuxième : la négation ajoutée coûte , mais on a supprimé le connecteur binaire et laissé tomber l'autre sous-formule, qui pèse au moins . Le gain est exactement de , plus le connecteur — c'est juste, mais de peu, et c'est pourquoi le variant doit être vérifié cas par cas.
Vérification mesurée : sur formules tirées au hasard jusqu'à la profondeur , la taille de l'argument décroît strictement à chacun des appels récursifs, sans exception.
4. Correction, en deux énoncés prouvés par récurrence forte sur — puisque c'est le variant, c'est aussi l'ordre de la preuve.
(a) Équivalence. Pour toute valuation , si et seulement si . Les cas et sont immédiats. Le cas utilise , puis l'hypothèse sur , de taille strictement plus petite. Le cas utilise De Morgan, , puis l'hypothèse sur et — licite parce que leurs tailles sont strictement plus petites, et pour aucune autre raison. Les cas binaires sont directs.
(b) Le but est atteint. Toute négation de porte sur une variable. Même récurrence : les seuls produits par la fonction viennent du motif , qui les rend inchangés ; aucun autre cas n'en construit.
Vérification mesurée. Sur formules tirées au hasard à trois variables, on a comparé et sur toutes les valuations : elles coïncident à chaque fois, et aucune négation ne porte sur autre chose qu'une variable.
Le coût, mesuré aussi. La taille peut croître, puisqu'un devant une conjonction devient deux . Le plus grand rapport observé sur formules de profondeur est . La borne théorique est : chaque nœud binaire produit au plus une négation supplémentaire. Contrairement à la mise sous forme normale conjonctive, qui peut faire exploser la taille exponentiellement, la forme normale négative reste linéaire — c'est pourquoi elle est le préalable systématique de tout le reste au chapitre chap:logique.
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.