Adloun

Quand on ne sait pas construire l'ordre

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

Énoncé

Cette fonction termine-t-elle ?


(* Precondition : n >= 1. *)
let rec vol n =
  if n = 1 then 0
  else if n mod 2 = 0 then 1 + vol (n / 2)
  else 1 + vol (3 * n + 1)

Corrigé

Personne ne le sait. C'est la conjecture de Syracuse, formulée en 1937 et toujours ouverte : on ignore si cette fonction termine pour tout .

Pourquoi les outils du chapitre échouent. Sur la branche paire, : tout va bien. Sur la branche impaire, : l'argument triple. Il faudrait donc un ordre bien fondé pour lequel quand est impair, et quand il est pair — et l'on ne sait pas en construire, ni prouver qu'il n'en existe pas.

Les mesures montrent pourquoi c'est difficile.

nombre d'étapesplus grande valeur atteinte

Partant de , la suite monte jusqu'à — fois sa valeur de départ — avant de retomber sur en étapes. Le record de longueur pour est , avec étapes. Aucune régularité n'apparaît : demande étapes et en demande .

Ce que l'exercice enseigne, et c'est le contraire de ce qu'on attend d'un exercice. La méthode du chapitre — exhiber un ordre bien fondé pour lequel les appels décroissent — est une méthode suffisante pour prouver la terminaison. Elle n'est pas un algorithme : il n'existe aucune procédure générale décidant si un programme termine, et le chapitre chap:decidabilite le démontrera. Syracuse en est un témoin de deux lignes.

Ce qu'un programmeur en retire, concrètement. Une fonction dont on ne sait pas prouver la terminaison n'est pas une fonction dont on a prouvé qu'elle boucle : c'est une fonction sans garantie. En production, on lui adjoint un compteur d'étapes maximal — ce qui rend la terminaison triviale et déplace la question sur la correction du résultat. La conjecture, elle, a été vérifiée par ordinateur jusqu'à des valeurs de dépassant , ce qui ne constitue pas une preuve et n'en constituera jamais une.

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.