Publishers Trial Paying Peer Reviewers - What Did They Find?
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
À l’occasion de la Journée internationale des droits des femmes et pour la paix internationale, on va parler d’un sujet « tendance » vu sous un angle un peu spécifique : celui des femmes qui la font. Parce que, bien que l’on soit amené à reprocher aux intelligences artificielles une forme de sexisme due à leurs jeux de données, les femmes n’ont pas été, ne sont pas étrangères à leur conception. C’est donc l’occasion de donner les portraits de Karen Spärck Jones (1935 – 2007) et de Chloé-Agathe Azencott qui ont contribué, et contribuent, à leur existence, et de rappeler les « petits » défauts des IA.
Karen Spärck Jones fait ses études à Cambridge. Elle commencera sa carrière en 1953 à l’unité de recherche linguistique de l’université avec la linguiste Margaret Mastermann, elle-même pionnière dans le domaine de la linguistique informatique. Ses recherches porteront sur les moteurs de recherche et du traitement du langage.
Margaret Mastermann lui confie la mission de programmer un ordinateur qui devait comprendre des mots polysémiques, elle génèrera un thésaurus. Elle entame également une collaboration avec l’informaticien Roger Needham qu’elle épousera en 1958.
En 1964, Karen Spärck Jones publie un article d’une importance capitale Synonymy and semantic classification (Synonymie et classification sémantique), considéré comme un document fondamental dans le domaine du traitement du langage naturel. Une importance qui s’accroîtra avec l’arrivée du World Wide Web.
À partir de 1994, ses travaux portent sur les outils de recherche d’information, notamment les applications vocales, les interrogations de bases de données, la modélisation des utilisateurs et des agents, le résumé et l’évaluation des systèmes d’informations et des systèmes linguistiques.
Elle est élue en 1995 membre de la British Academy (académie des sciences humaines et sociales du Royaume-Uni) dont elle sera vice-présidente de 2000 à 2002. Elle obtiendra aussi plusieurs prix : le Gerard Salton Award en 1988 (un prix de l’ACM et du SIGIR (en), deux associations états-uniennes en informatique), le prix de l’ACL en 2004 (une société savante américaine spécialisée dans le traitement des langues) et la médaille Lovelace de la British Computer Society en 2007 (sept ans après Linus Torvalds).
Elle dira, dans un entretien suite à la réception de la médaille Lovelace :
J’étais sidérée. J’ai regardé la liste des précédents récipiendaires et j’ai pensé : « Qu’est-ce que je viens faire dans ce groupe de gens ? » Mais j’étais particulièrement enchantée de voir que j’étais la première femme à l’obtenir. Très agréable, j’ai vraiment apprécié.
Je pense qu’il est très important de faire en sorte qu’il y ait plus de femmes en informatique. Mon slogan est _« l’informatique est trop importante pour être laissée aux
On change de génération avec Chloé-Agathe Azencott, elle aurait pu être une petite fille de Karen Spärck Jones.
Chloé-Agathe Azencott est professeure à l’École des Mines de Paris et à l’Institut Curie où elle enseigne l’apprentissage automatique ou apprentissage statistique ou encore apprentissage machine, en anglais machine learning. Elle a fait ses études à l’IMT Atlantique (ENST Bretagne à son époque, et, plus familièrement « Télécoms Bretagne ») et à l’Université de Californie à Irvine (UC Irvine).
Elle est récipiendaire, en 2021, du premier prix de la Jeune ingénieure en intelligence artificielle, organisé par le cabinet de conseil en communication Tilder en partenariat avec France Digitale (une association de startups et de VCs) et le magazine Challenges. Elle est l’autrice d’un livre sur l’apprentissage automatique : Introduction au machine learning chez Dunod, deuxième édition février 2022. On peut en télécharger une version PDF gratuitement mais sans les exercices. La version papier est en réimpression.
Comment définit-elle l’apprentissage automatique qui est l’un des sous-domaines de l’intelligence artificielle ? Elle commence par définir l’apprentissage qui est le fait d’acquérir une compétence par l’expérience et la pratique. Dans une conférence donnée le 25 novembre 2021 à l’Institut Henri Poincaré elle ajoute :
j’aime cette définition parce que je peux l’appliquer à ce qui se passe avec des humains, donc un enfant qui apprend à marcher en essayant de marcher et plus il s’entraine à marcher, plus il marche. Ça s’applique à mes étudiants et mes étudiantes qui, à force de résoudre des problèmes de maths, acquièrent l’expérience et la compétence de savoir faire des stats et des probas et puis ça s’applique aussi aux ordinateurs à condition de, peut-être, détourner un peu le sens de « compétences » et d’« expérience ».
Pour une machine la compétence est un algorithme donc
un nouvel algorithme capable de faire des choses que l’ordinateur n’était pas capable de faire avant et l’expérience ou la pratique ça va être des exemples ou des données.
Définition qui peut être complétée par celle qu’elle donne dans l’introduction de son livre :
Dans le cas d’un programme informatique, […], on parle d’apprentissage automatique, ou machine learning, quand ce programme a la capacité de se modifier lui-même sans que cette modification ne soit explicitement programmée. Cette définition est celle donnée par Arthur Samuel (1959). On peut ainsi opposer un programme classique, qui utilise une procédure et les données qu’il reçoit en entrée pour produire en sortie des réponses, à un programme d’apprentissage automatique, qui utilise les données et les réponses afin de produire la procédure qui permet d’obtenir les secondes à partir des premières.
[…]
Ce point de vue informatique sur l’apprentissage automatique justifie que l’on considère qu’il s’agit d’un domaine différent de celui de la statistique. Cependant, nous aurons l’occasion de voir que la frontière entre inférence statistique et apprentissage est souvent mince. Il s’agit ici, fondamentalement, de modéliser un phénomène à partir de données considérées comme autant d’observations de celui-ci.
Elle pense toutefois qu’il convient de garder un esprit critique vis-à-vis de l’IA notamment parce que :
l’on y injecte souvent des connaissances déjà établies (lois de la physique, notions de linguistique, connexions entre concepts), ces modèles restent essentiellement statistiques et ne mènent aucun raisonnement. L’intelligence artificielle ne remplacera pas les scientifiques, Chloé-Azencott, La Croix, 15 avril 2024
Chloé-Agathe Azencott considère, en outre, qu’il est extrêmement important :
de donner plus de visibilité aux femmes scientifiques, et notamment à celles qui travaillent dans le domaine du machine learning et de la science des données (elles ne représentent que 2% des scientifiques dans ce domaine), mais aussi à toutes les identités, afin de refléter la diversité dans tous ces aspects, y compris social. Chloé-Agathe Azencott, mathématiques et machine learning au service de la recherche médicale, Institut Henri Poincaré, [sd].
Une nécessité qui se démontre ci-après.
Avant tout chose, une précision. Le sexisme et le racisme ce sont à la fois des opinions et des manifestations. Si les intelligences artificielles n’ont pas d’opinions, en revanche ce qui en sort peut être manifestement raciste ou sexiste et c’est cet aspect-là qu’on va voir à travers une série d’articles de diverses origines parus entre 2017 et 2024. Les articles sont présentés dans l’ordre chronologique.
Il est intéressant de voir, à partir de cette sélection, les questions que pose l’IA et de relever l’impact extrêmement important de cette technologie sur la société, qu’il s’agisse d’emploi (tri des candidatures), de santé, de droits d’auteurs ou de justice, entre autres.
▶ L’intelligence artificielle reproduit aussi le sexisme et le racisme des humains, Morgane Tual, 15 avril 2017, Le Monde.
L’article se fait le relais d’une étude de la vue Science (en) du 14 avril 2017 et commence ainsi :
Les femmes associées aux arts et au foyer, les hommes aux professions scientifiques… Ces stéréotypes ont tellement la vie dure qu’ils se retrouvent reproduits dans des programmes d’intelligence artificielle (IA).
Un problème qui :
ne se situe pas seulement au niveau du langage. Quand un programme d’IA est devenu jury d’un concours de beauté, en septembre 2016, il a éliminé la plupart des candidats noirs.
L’article signale que ce ne sont pas les IA qui ont des préjugés, mais bien nous qui leur donnons les nôtres et relève que cela concerne la sélection des CV, la justice, les assurances. Au niveau des pistes pour redresser la barre, il est suggéré une meilleure diversité au niveau des personnes qui conçoivent les IA (une diversité très mise à mal par la nouvelle présidence des États-Unis et des patrons des GAFAM). Une autre piste évidente : travailler sur les données. L’article conclut que la solution du problème serait de modifier les humains.
▶ L’intelligence artificielle, aussi raciste et sexiste que nous, Fabien Goubet, 4 mai 2017, Le temps.ch.
L’article est basé sur la même étude que celle citée plus haut et il commence assez fort :
Les androïdes rêvent-ils de moutons noirs expulsés par des moutons blancs ? Avec leurs capacités de raisonnement froides, basées sur des calculs complexes, on imagine les intelligences artificielles dénuées de tout préjugé. C’est tout le contraire, comme vient de le confirmer une étude parue en avril dans la revue « Science ».
Il explique que le logiciel, GloVe, utilisé pour l’étude :
s’est prêté au jeu d’association d’idées. Ce programme est une IA basée sur le «machine learning», c’est-à-dire capable d’apprendre, à partir de nombreux exemples, à classer des informations selon des critères exigés par un humain. C’est sur ce type d’apprentissage que reposent notamment les algorithmes de reconnaissance d’images utilisés par Facebook ou Google. Pour entraîner GloVe, Aylin Caliskan l’a donc « nourri » avec un gigantesque corpus de 840 milliards de mots (en) issus du Web, en 40 langues différentes. Ses réponses laissent songeur. Comme un être humain, le programme a associé des noms de fleurs à des connotations positives, tandis que des noms d’insectes, par exemple, ont été catégorisés plutôt négativement.
Il ajoute que ces « biais plutôt innocents » ont été reproduits plus problématiquement : aux prénoms féminins les associations avec la famille, aux prénoms masculins celles avec la carrière, et un meilleur traitement était réservé aux noms à consonance européenne. Comportement qu’un spécialiste des réseaux de neurones artificiels et de la théorie neuronale de la cognition, Claude Touzet, explique :
Les machines capables d’apprentissage sont un miroir du comportement humain. En les nourrissant avec un discours humain forcément biaisé, il est naturel qu’elles le reproduisent.
Avec des idées de solutions possibles, par exemple imposer des lois aux IA, ce que Sébastien Konieczny, directeur de recherche au CNRS, trouve difficile car :
on ne sait pas encore vraiment comment réguler ces algorithmes avec des règles éthiques et morales, pas plus – et c’est tout aussi inquiétant – qu’on ne comprend comment la machine a pris sa décision.
Une solution possible :
serait d’associer ces algorithmes à d’autres méthodes permettant, elles, de rendre compte du raisonnement.
▶ Comment une IA peut devenir raciste ou sexiste, Anne Cagan, 25 juin 2020, Journal du geek.
La base de l’article est une interview de Stéphane d'Ascoli, qui deviendra docteur en intelligence artificielle en 2022 et venait de publier une livre de vulgarisation « Comprendre la révolution de l’intelligence artificielle » aux éditions First. Stéphane d’Ascoli donne l’exemple des recrutements biaisés par les IA :
On a tendance à s’imaginer que les IA sont froides, objectives et parfaitement rationnelles mais ce n’est pas le cas. Elles apprennent de nos données et nos données sont biaisées. Si, pendant dix ans, les femmes ont été défavorisées lors du processus de recrutement d’une entreprise et que celle-ci utilise ces données pour entraîner une IA, il y a des chances que l’IA déduise que les CV de femmes sont moins pertinents pour cette entreprise et qu’elle continue de les défavoriser. Les intelligences artificielles n’ont pas notre esprit critique.
À la question : « comment éviter ces dérives ». Il répond qu’une piste faisable serait d’assurer que :
les jeux de données sur lesquels on va entraîner l’IA sont équilibrés et diversifiés.
Et qu’il faut, évidemment, tester l’IA pour vérifier qu’elle traite tout le monde de façon identique.
▶ L’IA serait-elle raciste ? C’est ce qu’affirme une étude, Daniel Ichbiah, 18 novembre 2023, Futura.
L’étude en question, datée de juillet 2023 a été menée par une équipe plurinationale : Shangbin Feng et Yulia Tsvetkov de l’Université de Washington (USA), Chan Young Park de l’Université privée Carnegie Mellon (USA) et Yuhan Liu de l’Université Jiaotong de Xi'an (Chine).
À chaque fois, il a été noté que les outils d’IA générative manifestaient des biais sociaux et politiques particuliers, en relation avec le lieu où le corpus de données avait été collecté.
L’article relève les inquiétudes de la Cnil anglaise qui estime que l’usage de l’IA pourrait aboutir à « des conséquences dommageables pour la vie des gens ».
▶ ChatGPT et misogynie : l’intelligence artificielle est-elle sexiste ?, Nadine Jürgensen, 11 février 2024, TDG (Tribune de Genève).
D’entrée de jeu, la question est posée :
Deepfakes sur Taylor Swift et Sibel Arslan, représentations suggestives du corps des femmes: que faire contre une IA parfois machiste ?
L’autrice explique qu’elle a testé ChatGPT et qu’elle a été déçue : réponses maladroites, insatisfaisantes, voire fausses. Elle ajoute :
Jusqu’à présent, l’IA ne semble pas exercer une grande attraction sur le sexe féminin. En effet, seuls 30% des utilisatrices et des utilisateurs actifs sont des femmes. Elles sont critiques à l’égard des résultats de l’IA et ne les perçoivent pas comme justes. Oui, elles ont l’impression de tricher lorsqu’elles utilisent l’IA au quotidien. Elle serait pratique pour les hommes, tandis que les femmes peuvent avoir l’impression d’être moins qualifiées parce qu’elles la sollicitent.
Elle reprend la question des sources de données des IA et aborde un point intéressant qui est celui de la réglementation, la Suisse n’en disposant pas. Elle évoque la question de la propriété intellectuelle :
Les artistes et les professionnels des médias de notre pays demandent une meilleure protection de leurs droits d’auteur. Et tant d’autres questions, par exemple où et comment l’intelligence artificielle peut se «servir» de contenus créés par l’homme ou comment protéger nos données personnelles. En outre, il est essentiel de savoir si un contenu a été créé avec l’IA ou non.
Elle conclut, après avoir indiqué qu’elle avait recommencé à jouer avec l’IA, qu’elle continuera à écrire sa chronique elle-même.
▶ Pourquoi les IA génératives sont-elles sexistes, racistes et homophobes ?, Justine Havelange, 29 juillet 2024, EJO.
Cet article est issu d’une rencontre avec Anne Jobin, chercheuse au département informatique de l’Université de Fribourg (Suisse) présidente de la commission fédérale des médias et spécialiste des technologies digitales.
« La technologie n’est ni bonne, ni mauvaise, ni neutre », cette citation de l’historien des sciences Melvin Kranzberg est pour Anna Jobin un guide « pour se rendre compte de la vitesse des changements et de la cohabitation nécessaire entre nous et la technologie. »
L’IA n’est pas neutre, car elle reproduit les stéréotypes de notre société (comme on l’a déjà vu plus haut).
Les bases de données, même gigantesques, sont parfois la source d’un « sous-apprentissage ». Comprenez par là qu’il n’existe pas assez de données sur certains types de personne.
Ce constat a mobilisé l’UNESCO mais également « Numeum », le syndicat [français] de l’industrie du Numérique. L’une des pistes de solution trouvées par ces organisations est de diversifier les équipes de développeurs et d’ingénieurs ou de faire appel à des sociologues.
À la question des solutions possibles : l’ajustement des biais, modèles, bases de données et algorithmes, est une réponse.
▶ Pour finir, et occuper vos futures longues soirée de printemps, d’été, d’automne et d’hiver, la lecture du blog Entretien avec un vampire d’un professeur des universités en informatique qui a fait un assez triste constat.
Depuis deux ans, les IA génératives ont déferlé absolument partout, et donc aussi dans l’enseignement. Plus spécifiquement, les étudiant·e·s s’en servent quotidiennement pour résoudre les exercices que je leur donne, je le constate, iels me le disent. J’ai beau prévenir qu’en faisant ainsi, l’objet même des exercices disparaît (on ne s’exerce plus), le rouleau compresseur marketing les convainc que ça peut les aider et on me dit même comment telle ou telle IA est interrogée pour expliquer le programme qu’elle propose, et les concepts qui vont avec, utilisée comme une vraie auxiliaire de travail en somme.
L’idée du blog étant d’évaluer l’IA comme il le fait avec ses étudiants et de documenter ce travail.
Commentaires : voir le flux Atom ouvrir dans le navigateur
Read more of this story at Slashdot.
Read more of this story at Slashdot.
Read more of this story at Slashdot.
En principe, une démonstration mathématique ne fait que suivre des règles logiques bien définies, et devrait donc pouvoir être encodée informatiquement et vérifiée par un ordinateur. Où en est-on dans la pratique et dans la théorie ? Petit tour au pays des assistants de preuve, des langages de programmation dédiés aux démonstrations, et de leur fondement théorique le plus commun, la théorie des types.
Comme nous sommes sur LinuxFr.org, je devrais peut-être commencer par ceci : nous passons énormément de temps à découvrir des bugs, et pour les personnes du développement logiciel, à les comprendre, à les résoudre, et de préférence à les éviter en écrivant des tests.
Dans une formation universitaire de base en informatique, on rencontre des algorithmes, mais aussi des méthodes pour prouver que ces algorithmes terminent et répondent bien au problème posé. Les premières introduites sont typiquement les variants de boucle (montrer qu’une certaine valeur décroît à chaque itération, ce qui assure que le programme termine si elle ne peut pas décroître à l’infini), et les invariants de boucle (montrer qu’une certaine propriété vraie au début d’une boucle est préservée entre deux itérations, ce qui assure qu’elle reste encore vraie à la fin de la boucle).
On a donc, d’une part, un algorithme, implémentable sur machine, d’autre part une preuve, sur papier, que l’algorithme est correct. Mais si l’implémentation a une erreur par rapport à l’algorithme sur papier ? Et puisque nous n’arrêtons pas de nous tromper dans nos programmes, il est fort possible que nous nous trompions dans notre preuve (qui n’a jamais oublié qu’il fallait faire quelque chose de spécial dans le cas ?).
En tant que programmeurs, on peut imaginer une approche où non seulement l’algorithme est implémenté, mais sa preuve de terminaison et de correction est aussi « implémentée », c’est-à-dire encodée dans un langage qui ressemble à un langage de programmation, pour être ensuite non pas interprétée ou compilée mais vérifiée.
La vérification est un très vaste domaine de l’informatique, dont je ne suis pas spécialiste du tout, et dans lequel il existe énormément d’approches : la logique de Hoare (voir par exemple l’outil why3), qui est essentiellement un raffinement des variants et invariants de boucle, la logique de séparation spécialement conçue pour raisonner sur la mémoire mutable (voir Iris), le model checking qui se concentre sur des programmes d’une forme particulièrement simple (typiquement des systèmes de transition finis) pour en vérifier des propriétés de façon complètement automatisée, etc.
Dans cette dépêche, je vais parler d’une approche avec quelques caractéristiques particulières :
On vérifie des programmes purement fonctionnels (pas d’effets de bord, même si on peut les simuler).
Le même langage mélange à la fois les programmes et leurs preuves.
Plus précisément, le langage ne fait pas (ou peu) de distinction entre les programmes et les preuves.
Pour se convaincre de l’ampleur que les démonstrations ont prise dans les mathématiques contemporaines, il suffit d’aller jeter un œil, par exemple, au projet Stacks : un livre de référence sur la géométrie algébrique, écrit collaborativement sur les 20 dernières années, dont l’intégrale totalise plus de 7500 pages très techniques. Ou bien la démonstration du théorème de classification des groupes finis simples : la combinaison de résultats répartis dans les dizaines de milliers de pages de centaines d’articles, et une preuve « simplifiée » toujours en train d’être écrite et qui devrait faire plus de 5000 pages. Ou bien le théorème de Robertson-Seymour, monument de la théorie des graphes aux nombreuses applications algorithmiques : 20 articles publiés sur 20 ans, 400 pages en tout. Ou bien, tout simplement, le nombre de références dans la bibliographie de la moindre thèse ou d’articles publiés récemment sur arXiv.
Inévitablement, beaucoup de ces démonstrations contiennent des erreurs. Parfois découvertes, parfois beaucoup plus tard. Un exemple assez célèbre est celui d’un théorème, qui aurait été très important s’il avait été vrai, publié en 1989 par Vladimir Voedvodsky, un célèbre mathématicien dont je vais être amené à reparler plus bas, avec Mikhail Kapranov. Comme raconté par Voedvodsky lui-même, un contre-exemple a été proposé par Carlos Simpson en 1998, mais jusqu’en 2013, Voedvodsky lui-même n’était pas sûr duquel était faux entre sa preuve et le contre-exemple !
Il y a aussi, souvent, des « trous », qui ne mettent pas tant en danger la démonstration mais restent gênants : par exemple, « il est clair que la méthode classique de compactification des espaces Lindelöf s’applique aussi aux espaces quasi-Lindelöf », quand l’auteur pense évident qu’un argument existant s’adapte au cas dont il a besoin mais que ce serait trop de travail de le rédiger entièrement. Donc, assez naturellement, un but possible de la formalisation des maths est de produire des démonstrations qui soient certifiées sans erreur (et sans trou).
Mais c’est loin d’être le seul argument. On peut espérer d’autres avantages, qui pour l’instant restent de la science-fiction, mais après tout ce n’est que le début : par exemple, on peut imaginer que des collaborations à grande échelle entre beaucoup de mathématiciens deviennent possibles, grâce au fait qu’il est beaucoup plus facile de réutiliser le travail partiel de quelqu’un d’autre s’il est formalisé que s’il est donné sous formes d’ébauches informelles pas complètement rédigées.
Parmi les assistants de preuve existants, la plupart (mais pas tous) se fondent sur une famille de systèmes logiques rangés dans la famille des « théories des types ». L’une des raisons pour lesquelles ces systèmes sont assez naturels pour être utilisés en pratique est qu’en théorie des types, les preuves et les programmes deviennent entièrement confondus ou presque, ce qui rend facile le mélange entre les deux.
Mais comment est-ce qu’un programme devient une preuve, au juste ? L’idée de base est appelée interprétation de Brouwer-Heyting-Kolomogorov et veut que les preuves mathématiques se comprennent de la façon suivante :
Le moyen de base pour prouver une proposition de la forme « et
» est de fournir d’une part une preuve de
et une preuve de
. En d’autres mots, une preuve de «
et
» rassemble en un même objet une preuve de
et une preuve de
. Mais en termes informatiques, ceci signifie qu’une preuve de «
et
» est une paire d’une preuve de
et d’une preuve de
.
De même, pour prouver « ou
», on peut prouver
, ou on peut prouver
. Informatiquement, une preuve de «
ou
» va être une union disjointe : une preuve de
ou une preuve de
, avec un bit pour savoir dans quel cas on est.
Pour prouver « Vrai », il suffit de dire « c’est vrai » : on a une unique preuve de « Vrai ».
On ne doit pas pouvoir prouver « Faux », donc une preuve de « Faux » n’existe pas.
Et le plus intéressant : pour prouver « si alors
», on suppose temporairement
et on en déduit
. Informatiquement, ceci doit devenir une fonction qui prend une preuve de
et renvoie une preuve de
.
L’interprétation de Brouwer-Heyting-Kolmogorov est informelle, et il existe plusieurs manières de la rendre formelle. Par exemple, on peut interpréter tout ceci par des programmes dans un langage complètement non-typé, ce qui s’appelle la réalisabilité.
Mais en théorie des types, on prend plutôt un langage statiquement typé pour suivre l’idée suivante : si une preuve de et
est une paire d’une preuve de
et d’une preuve de
, alors le type des paires de
et
peut se comprendre comme le type des preuves de «
et
». On peut faire de même avec les autres types de preuves, et ceci s’appelle la correspondance de Curry-Howard. Autrement dit, là où Brouwer-Heyting-Kolmogorov est une correspondance entre les preuves et les programmes, Curry-Howard est un raffinement qui met aussi en correspondance les propositions logiques avec les types du langage, et la vérification des preuves se confond entièrement avec le type checking.
Sur les cas que j’ai donnés, la correspondance de Curry-Howard donne :
La proposition « et
» est le type des paires d’un élément de
et d’un élément de
,
La proposition « ou
» est le type somme de
et
(comme
Either
en Haskell et OCaml, les tagged unions en C, et std::variant
en C++ : l’un ou l’autre, avec un booléen pour savoir lequel),
La proposition « Vrai » est le type trivial à une seule valeur (comme ()
en Haskell et Rust, unit
en OCaml),
La proposition « Faux » est le type vide qui n’a aucune valeur (comme !
en Rust),
La proposition « si alors
» est le type des fonctions qui prennent un argument de type
et renvoient une valeur de type
.
La version de Curry-Howard que j’ai esquissée donne une logique dite « propositionnelle » : il n’y a que des propositions, avec des connecteurs entre elles. Mais en maths, on ne parle évidemment pas que des propositions. On parle de nombres, de structures algébriques, d’espaces topologiques, …, bref, d’objets mathématiques, et des propriétés de ces objets. Les deux types principaux de propositions qui manquent sont ce qu’on appelle les quantificateurs : « Pour tout , … » et « Il existe
tel que… ». Ici, ce qui est une évidence en logique devient moins évident, mais très intéressant, du côté des programmes.
Prenons pour l’exemple le théorème des deux carrés de Fermat, qui énonce (dans l’une de ses variantes) qu’un nombre premier impair est de la forme si et seulement s’il peut s’écrire comme somme de deux carrés parfaits. À quoi doit ressembler le type associé à cette proposition ? Par analogie avec les implications, on a envie de dire que cela devrait être une fonction, qui prend un nombre premier impair
, et renvoie une preuve de l’équivalence. Problème : ce qui est à droite de l’équivalence est une proposition paramétrée par
. Autrement dit, en notant
le type des nombres premiers impairs, on ne veut plus un simple type fonction
, mais un type fonction où le type de retour peut dépendre de la valeur passée à la fonction, noté par exemple
. Ces types qui dépendent de valeurs sont appelés types dépendants.
Dans les langages de programmation populaires, il est rare de trouver des types dépendants. Mais on en retrouve une forme faible en C avec les tableaux de longueur variable (VLA pour « variable-length arrays ») : on peut écrire
… f(int n) {
int array[n];
…
}
qui déclare un tableau dont la taille n
est une expression. Néanmoins, en C, même si on dispose de ce type tableau qui est en quelque sorte dépendant, on ne peut pas écrire une fonction « int[n] f(int n)
» qui renvoie un tableau dont la longueur est passée en paramètre. Plus récemment, en Rust, il existe les const generics, où des valeurs se retrouvent dans les types et où on peut écrire fn f<const n: usize>() -> [u8; n]
, ce qui est un vrai type dépendant, mais cette fois avec la restriction assez sévère que toutes ces valeurs peuvent être calculées entièrement à la compilation, ce qui à cause de la façon dont fonctionne ce type de calcul en Rust empêche par exemple les allocations mémoire. (Donc l’implémentation est assez différente, elle efface ces valeurs en « monomorphisant » tous les endroits où elles apparaissent.)
En théorie des types, le langage est (normalement) purement fonctionnel, donc les problèmes d’effets de bord dans les valeurs à l’intérieur des types dépendants ne se pose pas. Le type checking peut déclencher des calculs arbitrairement complexes pour calculer les valeurs qui se trouvent dans les types.
Et le « il existe », au fait, à quoi correspond-il ? Cette fois, ce n’est plus une fonction dépendante mais une paire dépendante : une preuve de « Il existe tel que
» est une paire d’une valeur
et d’une preuve de
. La différence avec une paire normale est que le type du deuxième élément peut dépendre de la valeur du premier élément.
Comme on peut commencer à s’en douter, le fait d’avoir des types dépendants est utile pour prouver des affirmations mathématiques, mais aussi, bien qu’il puisse sembler inhabituel, pour prouver des programmes, et plus précisément pour encoder des propriétés des valeurs dans les types. Là où on aurait dans un langage moins expressif une fonction qui renvoie deux listes, avec une remarque dans la documentation qu’elles sont toujours de même taille, dans un langage avec des types dépendants, on peut renvoyer un triplet d’un entier , d’une liste dont le type indique qu’elle est de taille
, et une deuxième liste elle aussi de taille
. Et là où on aurait un
deuxieme_liste[indice_venant_de_la_premiere]
avec un commentaire que cela ne peut pas produire d’erreur, car les deux listes sont de même taille, on a un programme qui utilise la garantie que les deux listes sont de même taille, et le typage garantit statiquement que cette opération t[i]
ne produira pas d’erreur.
Reprenons l’exemple du théorème des deux carrés de Fermat. Nous pouvons maintenant traduire cette proposition en un type : celui des fonctions qui prennent un nombre premier impair et renvoient une paire de :
Une fonction qui prend tel que
et renvoie deux entiers
accompagnés d’une preuve que
,
Réciproquement, une fonction qui prend et une preuve de
, et renvoie
tel que
.
Prouver le théorème des deux carrés de Fermat en théorie des types, c’est donner un élément (on dit plutôt « habitant ») de ce type, soit un programme dont le langage peut vérifier qu’il a ce type. Mais que fait au juste ce programme quand on l’exécute ? On voit qu’il permet notamment de calculer une décomposition d’un nombre premier impair congru à 1 modulo 4 comme somme de deux carrés.
Là, c’est le côté « programmes » qui apporte un élément moins habituel du côté « preuves » : l’exécution d’un programme va correspondre à un processus de simplification des preuves. Notamment, si on a une preuve de « si alors
» et une preuve de
, on peut prendre la preuve de
et remplacer chaque utilisation de l’hypothèse
dans la preuve de « si
alors
», pour obtenir une preuve de
qui peut contenir de multiples copies d’une même preuve de
. Cette opération de simplification du côté logique correspond naturellement au fait que la manière en théorie des types de prouver
à partir d’une preuve
de
et d’une preuve
de
est tout simplement d’écrire
, et que calculer
, informatiquement, se fait bien en remplaçant le paramètre de
à tous les endroits où il apparaît par la valeur
et à simplifier le résultat. On dit que la logique de Curry-Howard est constructive, parce qu’elle se prête à une interprétation algorithmique.
Mais ceci peut sembler gênant. Par exemple, il est trivial en maths « normales » de prouver que tout programme termine ou ne termine pas. Mais par Curry-Howard, une preuve que tout programme termine ou ne termine pas doit être une fonction qui prend un programme, et qui renvoie soit une preuve qu’il termine, soit une preuve qu’il ne termine pas. Autrement dit, si cette proposition censément triviale était prouvable dans Curry-Howard, on aurait un algorithme pour résoudre le problème de l’arrêt, ce qui est bien connu pour être impossible.
L’explication à cette différence tient au fait que la preuve « triviale » de cette proposition utilise une règle de déduction qui a un statut un peu à part en logique, dite règle du tiers exclu : pour n’importe quelle proposition , sans aucune hypothèse, on peut déduire «
ou (non
) » (autrement dit, que
est vraie ou fausse). Or cette règle n’admet pas d’interprétation évidente par Curry-Howard : le tiers exclu devrait prendre une proposition
et renvoyer soit une preuve de
, soit une preuve que
est fausse (ce qui s’encode par « si
alors Faux »), autrement dit, le tiers exclu devrait être un oracle omniscient capable de vous dire si une proposition arbitraire est vraie ou fausse, et ceci est bien évidemment impossible.
(Cela dit, si vous voulez vous faire mal à la tête, apprenez que c’est l’opérateur call/cc et pourquoi l’ajouter permet de prouver le tiers exclu. Exercice : call/cc existe dans de vrais langages, comme Scheme, pourtant on vient de voir que le tiers exclu semble nécessiter un oracle omniscient, comment expliquer cela ?)
Pour être précis, la logique sans le tiers exclu est dite intuitionniste (le terme constructive étant un peu flou, alors que celui-ci est précis). On peut faire des maths en restant entièrement en logique intuitionniste, et même si ce n’est pas le cas de l’écrasante majorité des maths, il existe tout de même un certain nombre de chercheurs qui le font, et ceci peut avoir divers intérêts. Il y a notamment l’interprétation algorithmique des théorèmes, mais aussi, de manière beaucoup plus avancée, le fait que certaines structures mathématiques (topos, ∞-topos et consorts) peuvent s’interpréter comme des sortes d’univers mathématiques alternatifs régis par les règles de la logique intuitionniste (techniquement, des « modèles » de cette logique), et que parfois il est plus simple de prouver un théorème en le traduisant à l’intérieur de l’univers et en prouvant cette version traduite de manière intuitionniste.
Pour pouvoir malgré tout raisonner en théorie des types de manière classique (par opposition à intuitionniste), il suffit de postuler le tiers exclu comme axiome. Du point de vue des programmes, cela revient à rajouter une constante qui est supposée avoir un certain type mais qui n’a pas de définition (cela peut donc rendre les programmes impossibles à exécuter, ce qui est normal pour le tiers exclu).
Si vous aviez décroché, c’est le moment de reprendre. Parlons un peu des assistants de preuve qui existent. Les plus connus sont :
Rocq, anciennement nommé Coq, développé à l’Inria depuis 1989, écrit en OCaml, sous licence LGPL 2.1. Il est assez lié à l’histoire de la théorie des types, car il a été créé par Thierry Coquand comme première implémentation du calcul des constructions, une théorie des types inventée par Coquand et devenue l’une des principales existantes. (Oui, Coq a été renommé en Rocq à cause de l’homophonie en anglais entre « Coq » et « cock ». J’apprécierais que les commentaires ne se transforment pas en flame war sur ce sujet très peu intéressant, merci.)
Lean, créé par Leonardo de Moura et développé depuis 2013 chez Microsoft Research, écrit en C++, placé sous licence Apache 2.0.
Agda, créé par Ulf Norrell en 1999, écrit en Haskell et sous licence BSD 1-clause.
D’autres que je connais moins, notamment Isabelle et F* (liste sur Wikipédia).
Pour illustrer comment peuvent fonctionner les choses en pratique, voici un exemple très simple de code en Agda :
open import Agda.Primitive using (Level)
open import Data.Product using (_×_; _,_)
swap : {ℓ₁ ℓ₂ : Level} → {P : Set ℓ₁} {Q : Set ℓ₂} → P × Q → Q × P
swap (p , q) = (q , p)
Vue comme un programme, cette fonction swap
inverse simplement les deux éléments d’une paire. Vue comme une preuve, elle montre que pour toutes propositions et
, si
et
, alors
et
. Comme le veut Curry-Howard, les deux ne sont pas distingués. Les types
et
sont eux-mêmes dans des types
avec un « niveau »
, ceci parce que, pour des raisons logiques, il serait incohérent que le type des types soit de son propre type, donc on a un premier type de types
, qui est lui-même de type
, et ainsi de suite avec une hiérarchie infinie de niveaux appelés univers. À un niveau plus superficiel, on remarquera qu’Agda a une syntaxe qui ressemble fort à Haskell (et utilise intensivement Unicode).
Voilà la même chose en Rocq :
Definition swap {P Q : Prop} : P /\ Q -> Q /\ P :=
fun H => match H with conj p q => conj q p end.
La syntaxe est assez différente et ressemble plutôt à OCaml (normal, vu que Rocq est écrit en OCaml et Agda en Haskell). Mais à un niveau plus profond, on voit apparaître un type Prop
dont le nom évoque furieusement les propositions. Or j’avais promis que les propositions seraient confondues avec les types, donc pourquoi a-t-on un type spécial pour les propositions ?
En réalité, pour diverses raisons, il peut être intéressant de briser l’analogie d’origine de Curry-Howard et de séparer les propositions et les autres types en deux mondes qui se comportent de façon extrêmement similaire mais restent néanmoins distincts. Notamment, un principe qu’on applique sans réfléchir en maths est que si deux propositions sont équivalentes, alors elles sont égales (extensionnalité propositionnelle), mais on ne veut clairement pas ceci pour tous les types (on peut donner des fonctions bool -> int
et int -> bool
, pourtant on ne veut certainement pas bool = int
), donc séparer les propositions des autres permet d’ajouter l’extensionnalité propositionnelle comme axiome. (Mais il y a aussi des différences comme l'imprédicativité dans lesquelles je ne vais pas rentrer.)
Et voici encore le même code, cette fois en Lean :
def swap {P Q : Prop} : P ∧ Q → Q ∧ P :=
fun ⟨p, q⟩ => ⟨q, p⟩
À part les différences de syntaxe, c’est très similaire à Rocq, parce que Lean a aussi une séparation entre les propositions et les autres types.
Cependant, en Rocq et Lean, on peut aussi prouver la même proposition de façon différente :
Lemma swap {P Q : Prop} : P /\ Q -> Q /\ P.
Proof.
intros H. destruct H as [p q]. split.
- apply q.
- apply p.
Qed.
et
def swap {P Q : Prop} : P ∧ Q → Q ∧ P := by
intro h
have p := h.left
have q := h.right
exact ⟨q, p⟩
Avec Proof.
ou by
, on entre dans un mode où les preuves ne sont plus écrites à la main comme programmes, mais avec des tactiques, qui génèrent des programmes. Il existe toutes sortes de tactiques, pour appliquer des théorèmes existants, raisonner par récurrence, résoudre des inégalités, ou même effectuer de la recherche automatique de démonstration, ce qui s’avère extrêmement utile pour simplifier les preuves.
Ce mode « tactiques » permet aussi d’écrire la preuve de façon incrémentale, en faisant un point d’étape après chaque tactique pour voir ce qui est prouvé et ce qui reste à prouver. Voici par exemple ce qu’affiche Rocq après le destruct
et avant le split
:
P, Q : Prop
p : P
q : Q
============================
Q /\ P
Cette notation signifie que le contexte ambiant contient les variables P
et Q
de type Prop
ainsi que p
une preuve de P
(donc un élément du type P
) et q
une preuve de Q
. Le Q /\ P
en dessous de la barre horizontale est le but à prouver, c’est-à-dire le type dont on cherche à construire un élément.
Agda fonctionne assez différemment : il n’y a pas de tactiques, mais il existe néanmoins un système de méta-programmation qui sert à faire de la recherche de preuves (donc contrairement à Rocq et Lean, on n’écrit pas la majeure partie des preuves avec des tactiques, mais on peut se servir d’un équivalent quand c’est utile). Pour écrire les preuves incrémentalement, on met ?
dans le programme quand on veut ouvrir une sous-preuve, et Agda va faire le type-checking de tout le reste et donner le contexte à l’endroit du ?
.
En 2025, la formalisation reste très fastidieuse, mais elle a déjà eu plusieurs grands succès :
Actuellement, Lean a réussi à attirer une communauté de mathématiciens qui développent mathlib (1,1 million de lignes de code Lean au moment où j’écris), une bibliothèque de définitions et théorèmes mathématiques qui vise à être la plus unifiée possible.
Les équivalents dans d’autres assistants de preuve se développent même s’ils ne sont pas (encore) aussi gros : citons mathcomp, unimath, agda-unimath entre autres.
Un autre grand succès, dans le domaine de la vérification cette fois, est CompCert (malheureusement non-libre), qui est un compilateur C entièrement écrit en Rocq et vérifié par rapport à une spécification du C également encodée en Rocq.
La théorie des types est un domaine de recherche à part entière, qui vise à étudier du point de vue logique les théories des types existantes, et à en développer de nouvelles pour des raisons à la fois théoriques et pratiques.
Historiquement, une grande question de la théorie des types est celle de comprendre à quel type doivent correspondre les propositions d’égalité. Par exemple, on veut que deux propositions équivalentes soient égales, et que deux fonctions qui prennent les mêmes valeurs soient égales, et éventuellement pour diverses raisons que deux preuves de la même proposition soient égales, mais s’il est facile d’ajouter toutes ces choses comme axiomes, il est très compliqué de les rendre prouvables sans obtenir, comme avec le tiers exclu, des programmes qui ne peuvent pas s’exécuter à cause des axiomes qui sont déclarés sans définition.
Vladimir Voedvodsky a fait une contribution majeure en proposant un nouvel axiome, appelé univalence, qui dit très sommairement que si deux types ont la même structure (on peut donner une « équivalence » entre les deux), alors ils sont en fait égaux (résumé simpliste à ne pas prendre au mot). Cet axiome est très pratique pour faire des maths parce qu’on travaille souvent avec des objets qui ont la même structure (on dit qu’ils sont isomorphes), et qui doivent donc avoir les mêmes propriétés, et cet axiome permet de les identifier (même s’il a aussi des conséquences qui peuvent paraître choquantes). Sa proposition a donné naissance à une branche appelée théorie homotopique des types, qui explore les maths avec univalence. Le prix à payer est que les types ne se comprennent plus comme de simples ensembles de valeurs (ou de preuves d’une proposition), mais comme des espaces géométriques munis de toute une structure complexe (techniquement, les égalités sont des chemins entre points, et il y a des égalités non-triviales, des égalités entre égalités, etc.), et la compréhension de ces espaces-types est fondée sur la théorie de l’homotopie. Il y a bien d’autres théories des types, avec univalence ou non : théorie cubique des types, théorie des types observationnelle, etc.
J’espère avoir communiqué un peu de mon enthousiasme pour le domaine (dans lequel je suis probablement parti pour démarrer une thèse). Si vous voulez apprendre un assistant de preuve, une ressource assez abordable est la série Software Foundations avec Rocq. Il existe également Theorem proving in Lean 4 et divers tutoriels Agda. Vous pouvez aussi essayer ces assistants de preuve directement dans votre navigateur : Rocq, Lean ou Agda. Et bien sûr les installer et jouer avec : Rocq, Lean, Agda.
Commentaires : voir le flux Atom ouvrir dans le navigateur
Read more of this story at Slashdot.