Les propriétés comme boussole : programmer avec précision ✛ ✎

Original: "Accurate Programming: Thinking about programs in terms of properties"
· Walid Taha, Veronica Gaspes, Rex Page
arXiv:1109.0786 · 2011-09-05 · arXiv non-exclusive · analyse indépendante · 3 min
Les programmes ne sont pas seulement du code, mais aussi des propriétés mathématiques que l'on peut vérifier automatiquement.

Le brouillard s'épaissit autour de la ligne « def max(a: Int, b: Int): Int ». Que fait-elle ? Elle retourne le plus grand de deux nombres, mais comment le vérifier ? On peut écrire une dizaine de tests avec des paires concrètes : max(2,3)=3, max(5,5)=5, max(-1,0)=0. Et pourtant, une inquiétude demeure : et si, pour un million et moins un million, elle se cassait ? Au lieu de scruter le brouillard, le développeur peut prendre une boussole, et cette boussole s'appelle une propriété.

Une propriété est une affirmation sur le programme qui doit être vraie pour toutes les entrées. Pas « pour 2 et 3, elle retourne 3 », mais « pour tout a et b, le résultat n'est inférieur à aucun des deux ». Une telle affirmation peut être écrite non seulement sur papier, mais aussi dans le code. La bibliothèque ScalaCheck sait générer des centaines de valeurs aléatoires, les substituer dans la propriété et signaler si au moins une est violée. C'est cela, le test basé sur les propriétés : au lieu d'énumérer manuellement des exemples, on vérifie automatiquement une loi.

La propriété comme boussole : elle ne vous guide pas sur un seul itinéraire, mais donne une direction valable pour tout chemin. Pour la fonction max, trois directions : la symétrie (max(a,b)=max(b,a)), l'idempotence (max(a,a)=a) et la propriété de borne supérieure (le résultat n'est inférieur à aucun argument et n'est supérieur à aucun autre nombre de ce type). Ensemble, elles définissent complètement ce que signifie « maximum ».

Mais les propriétés ne servent pas seulement à vérifier du code existant, elles aident à l'écrire. Prenons la fonction sum, qui additionne une liste de nombres. Une propriété est la monotonie : si on prend une liste et qu'on y ajoute un nombre positif, la somme augmente. Cela semble évident. Mais ScalaCheck trouve un contre-exemple : pour la liste [65536] et l'ajout de 1, la somme n'augmente pas, elle reste à 65537, à cause du dépassement d'entier dans certains langages. La boussole a indiqué un écueil que les tests ordinaires ne voyaient pas.

Les propriétés peuvent être affinées, comme on règle une boussole. La fonction count compte les éléments d'une liste. La première propriété, « le résultat est non négatif », est trop faible : même une fonction qui retourne toujours zéro la satisfait. On ajoute la propriété « pour une liste d'un seul élément, le résultat est 1 » : le zéro est éliminé, mais d'autres imposteurs subsistent. Progressivement, pas à pas, les propriétés convergent vers l'unique implémentation correcte.

Et voici le tournant : le programme lui-même est aussi une propriété. Si une fonction retourne toujours 42, on peut la décrire par la propriété « pour toute entrée, le résultat est 42 ». La frontière entre spécification (ce que l'on veut) et implémentation (comment on le fait) s'estompe. La programmation précise est une approche où le développeur garde en tête non seulement le code, mais aussi les propriétés que ce code doit satisfaire. C'est un pont entre le test et la vérification formelle : on ne prouve pas le programme entièrement, mais on obtient la plupart des garanties pour une fraction du coût.

Le brouillard se dissipe. La ligne « def max » n'est plus une énigme : elle a trois propriétés-boussoles, et chacune peut être vérifiée automatiquement. La programmation cesse d'être une devinette et devient une navigation sur une carte que l'on dessine soi-même.

Le nom de la bibliothèque ScalaCheck fait référence à l'idée de vérification automatique de propriétés, et non à une « vérification de Scala » : c'est un outil pour vérifier des propriétés en Scala.

Dans la série « Westworld », le comportement des robots est déterminé par des règles complexes, mais leur correction n'est pas garantie. La programmation précise pourrait aider à formuler et vérifier des propriétés de comportement, évitant ainsi des défaillances inattendues.

Scientifiques
Erwin SchrödingerHugh Everett IIIMax BornAlbert EinsteinJohn von NeumannAugustin-Louis Cauchy
Notions
précision automatisation optimisation précision diagnostique traitement automatique du langage naturel temps réel algorithme quantique conception de médicaments open source convergence apprentissage automatique simulation informatique reconnaissance vocale médecine personnalisée intelligence artificielle robotique calcul classification solution exacte précision