- La théorie des types dépendants inclut des objets de preuve, mais l’auteur la considère comme une structure inutile et inefficace
- Après avoir étudié directement d’anciens systèmes fondés sur les types dépendants comme AUTOMATH et le système formel de Martin-Löf, Isabelle a évolué vers un framework logique générique
- Basé sur la théorie des types simples (logique d’ordre supérieur), Isabelle/HOL se distingue par son automatisation, ses bibliothèques à grande échelle et sa lisibilité
- Le projet ALEXANDRIA a démontré qu’il est possible de formaliser des théorèmes mathématiques avancés avec la seule logique d’ordre supérieur
- Malgré la maturité de systèmes à types dépendants comme Lean, l’auteur continue de préférer la praticité de l’approche en logique d’ordre supérieur en raison de problèmes de performances et de complexité
Types dépendants et objets de preuve
- Dans la théorie des types dépendants, les objets de preuve (proof objects) sont indispensables, mais l’auteur les considère comme un gaspillage d’espace
- Dans l’architecture LCF, seules des étapes de preuve valides peuvent être exécutées grâce à une vérification de types au niveau du langage d’implémentation, et non à l’intérieur de la logique
- L’intuition de Robin Milner a introduit le concept de proof kernel, qui est devenu la base d’Isabelle
- À la question « pourquoi ne pas avoir utilisé les types dépendants ? », l’auteur répond : « je les ai utilisés pendant longtemps »
Expérience avec AUTOMATH
- En 1977, à Caltech, il a assisté au cours de N. G. de Bruijn sur AUTOMATH, sans pouvoir utiliser directement le système
- Le système de l’université d’Eindhoven n’était alors pas connecté à l’ARPAnet, et il fallait un ordinateur basé sur ALGOL 60
- AUTOMATH est un système à types dépendants, mais il n’implémente pas la correspondance de Curry–Howard
- L’utilisateur devait ajouter comme axiomes les symboles et règles d’inférence de la logique souhaitée
- de Bruijn comparait cela à « un grand restaurant qui sert tous les plats »
- Isabelle a repris cette idée en visant la généralité comme framework logique
- Mais de Bruijn détestait la théorie des ensembles et voyait les mathématiques comme fondamentalement fondées sur les types
- L’auteur a interrogé AUTOMATH sur la vérification de la correction, et de Bruijn lui a envoyé un traité de théorie du langage (300 pages), sans le convaincre
Théorie des types de Martin-Löf
- À Chalmers, à Göteborg, il a étudié la théorie des types de Martin-Löf et a été séduit par la possibilité de synthèse de programmes
- Il la jugeait clairement « juste » en ce qu’elle implémentait directement les principes de la logique intuitionniste de Heyting
- Il a poursuivi ces recherches pendant des années et a implémenté les premières versions d’Isabelle dans la théorie de Martin-Löf
- Elle est toujours distribuée aujourd’hui sous la forme de Isabelle/CTT
- Mais l’atmosphère dogmatique centrée sur Per Martin-Löf et le passage imposé à l’égalité intentionnelle (intensional equality) ont fait échouer ces travaux
- Les systèmes apparus ensuite, comme le Calculus of Constructions (CoC), Rocq et Lean, ont laissé subsister les mêmes interrogations
- Le CoC a accumulé pendant des décennies diverses variantes et des axiomes optionnels
Choix de recherche et orientation d’Isabelle
- Les chercheurs doivent choisir entre développer un nouveau système formel et étendre ou exploiter un système existant
- Isabelle a été conçue comme un framework généralisé capable d’accueillir différentes logiques
- En 1985, Mike Gordon a effectué de la vérification matérielle avec la théorie des types simples de Church
- Plus tard, John Harrison a conçu un encodage de la dimension des vecteurs
- Isabelle/HOL ajoute à la théorie de Church des classes de types axiomatiques et le système de modules locale
- La communauté Lean a accompli une vaste formalisation des mathématiques (mathlib) sur une base CoC
Projet ALEXANDRIA et test des limites de la logique d’ordre supérieur
- Le projet ALEXANDRIA, financé par l’ERC, met en avant l’automatisation, les bibliothèques et la lisibilité d’Isabelle
- Au départ, on pensait que la logique d’ordre supérieur atteindrait ses limites, mais en pratique, des mathématiques avancées comme les schémas de Grothendieck ont été formalisées avec succès
- Paulo Emílio de Vilhena et Martin Baillon ont démontré que tout corps admet une extension algébriquement close
- Le projet s’est étendu jusqu’à des résultats avancés comme le théorème de Balog–Szemerédi–Gowers
- L’affirmation selon laquelle « il est impossible de formaliser les mathématiques sans types dépendants » a disparu, et il ne reste plus que l’argument selon lequel « les types dépendants sont plus élégants »
Position actuelle sur Lean et les types dépendants
- L’auteur envie la taille de la communauté de Lean et l’outil Blueprint, mais les problèmes de performances et la complexité demeurent
- Les conflits avec l’égalité intentionnelle et la difficulté à savoir quand utiliser les types dépendants sont régulièrement signalés
- L’auteur compare les types dépendants au Full Self-Driving de Tesla, en pointant des attentes excessives et des désagréments bien réels
Annexe : limites théoriques de la logique d’ordre supérieur
- Certains affirment que la logique d’ordre supérieur est faible du point de vue de la théorie de la démonstration, mais cela signifie seulement qu’elle est plus faible que la théorie des ensembles ZF
- D’après les résultats d’ALEXANDRIA, la logique d’ordre supérieur peut malgré tout traiter des structures mathématiques complexes comme les schémas de Grothendieck
- Seules deux preuves ont nécessité l’ajout des axiomes ZF, et il s’agissait de théorèmes mentionnant directement des objets ZF
Notes
- L’intuitionnisme est une philosophie qui considère le langage comme un simple moyen d’enregistrement, et diffère des mathématiques constructives (constructive mathematics) d’aujourd’hui
1 commentaires
Avis Hacker News
Les types dépendants sont très utiles dans certaines situations
Par exemple, ce serait bien si Python pouvait exprimer et vérifier par le typage une « matrice
float32de taille 10×5 »Mais des concepts comme la correspondance de Curry–Howard, qui identifient preuve et type, sont déroutants du point de vue humain
Une erreur de type ressemble à une simple faute qu’on peut corriger, tandis qu’une erreur de preuve est un problème bien plus complexe qui demande de la réflexion
C’est pourquoi, à mon avis, la vraie force de Lean n’est pas son système de types, mais sa communauté et la structure open source de mathlib
Alors que l’AFP d’Isabelle fonctionne comme une revue académique, Lean a une collaboration très active fondée sur les pull requests
Je développe actuellement un nouveau démonstrateur de théorèmes, Acorn(acornprover.org), avec l’idée de combiner les avantages de Lean et d’Isabelle
La puissance d’expression simple des types dépendants de Lean est appréciable, mais si on en abuse, le débogage devient difficile
En revanche, on ne peut pas garantir à la compilation la plage d’un indice qui n’est connue qu’à l’exécution
Un vrai langage à types dépendants peut prévenir les erreurs d’exécution au niveau du type
En pratique, même dans les langages à types dépendants, on utilise rarement les types dépendants pour empêcher les erreurs d’exécution,
ils servent surtout à exprimer des invariants de structures de données ou à vérifier un programme après sa définition
Références associées : division-by-zero in type theory FAQ, présentation de Xavier Leroy
Par exemple, comme à la ligne 38 de ce code, on peut représenter la taille d’une matrice par le type
J’ai aussi implémenté un type de vecteur et le type résultat d’une multiplication de matrices
Cela dit, ce n’est pour l’instant qu’une expérimentation personnelle, et ce n’est peut-être pas adapté à des projets de données à grande échelle
Cela renvoie au concept de Propositions as Types
Je me demande comment les types dépendants fonctionnent à l’exécution, et s’il faut à la fois une vérification de types à la compilation et à l’exécution
Je me demande aussi si l’implémentation ne crée pas une complexité accrue avec beaucoup d’indirections
L’argument du Dr Paulson n’est pas que les types dépendants sont mauvais, mais qu’ils ne sont pas indispensables
J’aurais aimé voir davantage de discussion sur les problèmes de performance de Lean ou sur l’égalité intentionnelle
Comme avec le HEq d’Isabelle(lien), les cas qui ne relèvent pas de l’égalité définitionnelle posent problème
C’est pourquoi je pense qu’il vaut mieux utiliser les types dépendants aussi peu que possible
Même un système sans typage statique comme ACL2 permet des vérifications suffisantes
Au final, ce qui compte, c’est l’équilibre entre praticité et vérifiabilité
Lean ou Agda sont encore moins utilisés pour des vérifications à l’échelle industrielle
Il est intéressant de comparer Concrete Semantics(lien) et Logical Verification 2025(lien)
En pratique, les refinement types peuvent être plus utiles
Exemples : Rust Creusot, Dafny, et l’exemple de preuve de leftpad pour LiquidHaskell
Mais dans la vérification de programmes, il faut des lemmes auxiliaires complexes comme « ces deux preuves sont identiques », et cela est souvent impossible à prouver
La vraie question est de savoir à quel point la fonctionnalité est utile, pas si son existence est nécessaire ou non
Au fond, le choix d’un outil relève surtout des préférences du développeur et de l’efficacité
Il est intéressant de voir qu’une grande partie des débats en logique moderne finit par relever de préférences esthétiques
Si les avantages concrets étaient écrasants, il n’y aurait probablement pas de débat
À ce propos, l’article de 1999 de Paulson et Lamport, « Typing in Specification Languages », vaut la lecture
Depuis, un formalisme informel à la TLA+ de Lamport a aussi émergé
On gagne les garanties à la compilation, mais on paie en complexité et en temps de build
La vraie question est donc : « est-ce que cet échange en vaut la peine ? »
Le problème de HOL (théorie des types simples) n’est pas la dépendance, mais son manque de force logique
C’est l’équivalent d’une version restreinte de la théorie des ensembles de Zermelo, donc trop faible pour formaliser entièrement les mathématiques modernes
Il est particulièrement difficile d’y traiter les problèmes de taille dans des domaines comme la théorie des catégories
Je serais curieux de savoir à quel point cela diffère du style des mathématiciens en pratique
Par exemple, l’ajout d’un « cardinal inaccessible » rapproche le système de la notion d’« universe » en théorie des types
J’ai étudié les méthodes formelles et je trouvais les types dépendants élégants, mais en pratique leur usage a toujours été un combat difficile
Quand j’utilisais F#, j’ai essayé d’introduire F*, mais mes collègues trouvaient la courbe d’apprentissage mathématique trop lourde
J’en suis finalement arrivé à la conclusion cynique que les ingénieurs apprennent mal les outils qui embarquent beaucoup de mathématiques
Il permet un usage léger des types dépendants en s’appuyant sur la résolution de contraintes par SMT
Mais cela ne répond pas à la question philosophique : « est-ce vraiment la bonne approche ? »
Le monde de la preuve mathématique et celui de la vérification logicielle sont assez différents
Au final, le temps est limité
Dans notre entreprise Phosphor, nous expérimentons la combinaison des types dépendants avec des requêtes de base de données / de graphe
Cela nous a permis de compenser les limites de RDF et de construire un système de requêtes fondé sur la logique
En pratique, nous utilisons TypeDB(typedb.com), plus rapide que MongoDB et utile pour modéliser des données complexes
C’est aussi proche de la notion d’ontologie chez Palantir
Au fond, le secret des types dépendants est peut-être de savoir quand ne pas les utiliser
Plutôt que de critiquer Lean ou Rocq, on pourrait peut-être, selon le contexte, adopter une approche plus proche du style Isabelle
Le projet de formalisation Alexandria(lien) de l’équipe de Paulson est impressionnant
En particulier, les travaux sur la formalisation d’algorithmes de calcul quantique(lien vers l’article) sont intéressants
Autrefois, je croyais que les types dépendants représentaient l’avenir, mais dans les projets réels, la baisse de productivité était trop importante
Aujourd’hui, je préfère des solutions claires et faciles à maintenir
Si l’équipe peut comprendre l’outil et l’étendre, alors c’est probablement un bon outil
Je préfère les systèmes de types qui se situent à la frontière des types dépendants plutôt que les types dépendants complets
Par exemple, Purescript fournit nativement des row types plus puissants que ceux de Haskell,
et prend aussi en charge les listes, chaînes et expressions régulières au niveau du type
On peut s’en servir sous forme de programmation logique basée sur les typeclasses