Comment les langages de programmation et les fondements des mathématiques sont-ils liés?

30

Fondamentalement, je connais trois fondements des mathématiques

  1. Théorie des ensembles
  2. Théorie des types
  3. Théorie des catégories

Alors, en quoi les langages de programmation et les fondements des mathématiques sont-ils liés?

MODIFIER

La question d'origine était "Langages de programmation basés sur les fondements des mathématiques"

avec le paragarphe ajouté de

Et implémentations de la théorie
1. Théorie des types dans Coq
2. Théorie des ensembles dans SETL
3. Théorie des catégories dans Haskell

Sur la base d'une suggestion, cela a été changé en "Comment les langages de programmation et les fondements des mathématiques sont-ils liés"

Étant donné que c'est l'une de ces questions où je ne savais pas assez ce que je demandais mais que je voulais apprendre quelque chose, je modifie la question pour la rendre plus précieuse pour l'apprentissage et pour les autres, tout en laissant les détails afin de ne pas faire le la réponse actuelle d'Andrej Bauer semble hors sujet.

Merci pour tous les commentaires et la réponse jusqu'à présent, j'apprends d'eux.

Guy Coder
la source
1
Je ne sais pas si je comprends la question ou les hypothèses qui y sont énoncées. Coq n'est pas un langage de programmation pour autant que je sache. Les programmes peuvent être extraits des preuves Coq mais cela n'en fait pas un langage de programmation. La théorie des catégories et la théorie des types sont également étroitement liées, donc je ne sais pas si nous pouvons les classer comme vous l'avez fait. Je ne sais pas sur SETL. Voir aussi la liste des assistants de preuve sur Wikipédia.
Kaveh
3
Haskell n'est pas "une implémentation de la théorie des catégories", et en tout cas, les fondements des mathématiques ont un objectif différent de celui des langages de programmation. Bien qu'une sorte de comparaison puisse être faite, il n'est pas si bon d'essayer de forcer la comparaison dans une relation formelle.
Andrej Bauer
1
Lien pertinent sur la Sainte Trinité
Gardenhead
D'intérêt: Fondations logicielles
Guy Coder

Réponses:

29

[Remarque: ce paragraphe est désormais obsolète.] Le titre de votre question contient une hypothèse injustifiée, à savoir que les langages de programmation sont "basés sur les fondements des mathématiques". Ce n'est généralement pas le cas, bien que les deux domaines aient des relations importantes. Un énoncé plus précis serait que (certains) langages de programmation ont été conçus en utilisant des techniques fondamentales. Une meilleure question à poser serait "comment les langages de programmation et les fondements des mathématiques sont-ils liés?"

Le lien le plus général est incarné dans les slogans preuves en tant que programmes , qui peuvent fonctionner de plusieurs manières. La correspondance Curry-Howard est la plus évidente. Avec elle, nous relions à la fois la théorie des types, la logique et la programmation. Mais il convient de souligner que la correspondance Curry-Howard ne fonctionne pas très bien en présence d'une récursivité générale (car chaque type devient habité), que prend en charge chaque langage de programmation à usage général.

Une manière plus subtile de faire fonctionner le slogan des preuves en tant que programmes est d'utiliser la réalisabilité . Ici aussi, nous relions les preuves et les programmes, mais maintenant la direction va des preuves aux programmes: chaque preuve donne un programme, mais pas chaque programme est nécessairement une preuve.

Le principal exemple d'un langage de programmation basé sur une fondation est Agda , qui est simplement une implémentation de la théorie des types dépendants. Cependant, Agda n'est pas un langage de programmation à usage général car il ne prend pas en charge la récursivité générale. Chaque fonction dans Agda est totale et il existe des fonctions calculables qui ne peuvent pas être implémentées dans Agda. Dans la pratique, les programmeurs ne le remarqueront pas, mais ils remarqueront qu'Agda n'autorise pas les valeurs indéfinies, par exemple les boucles infinies.

Coq n'est pas un langage de programmation mais plutôt un assistant de preuve. Cependant, il a également des capacités d'extraction qui donnent des programmes à partir de preuves. Les assistants de vérification et les langages de programmation ne doivent pas être confondus.

N'oublions pas que le prologue et d'autres langages de programmation logique s'inspirent de l'idée que le calcul est une recherche de preuve . Bien sûr, cela les relie étroitement à la logique.

Haskell est un langage de programmation à usage général basé sur la théorie des domaines . C'est-à-dire que sa sémantique est une théorie du domaine car elle doit tenir compte des fonctions partielles et de la récursivité. La communauté Haskell a développé un certain nombre de techniques inspirées de la théorie des catégories, dont les monades sont les plus connues mais ne doivent pas être confondues avec les monades . Plus généralement, les fonctionnalités de programmation avancées sont généralement traitées avec une combinaison de la théorie des domaines et de la théorie des catégories, mais ce n'est pas quelque chose que le programmeur Haskell dans la rue est compétent. La soi-disant «catégorie syntaxique» des types de Haskell est la vision d'un profane de la façon dont Haskell et la théorie des catégories se correspondent.

La théorie des ensembles (classique ou constructive) semble inspirer dans une moindre mesure les idées en langage de programmation. Bien sûr, la théorie des ensembles constructive a son lien avec la programmation par la logique constructive. Une application importante de la théorie des ensembles intuitionniste aux langages de programmation a été donnée par Alex Simpson qui l'a utilisée pour faire fonctionner la théorie du domaine synthétique. Mais ce sont des choses assez avancées, peut-être voir ces diapositives . Jean-Louis Krivine a développé une marque de réalisabilité très intéressante pour la théorie des ensembles classique. Cela semble un bon moyen de relier la théorie des ensembles classique et la programmation.

En résumé, la théorie des langages de programmation utilise des techniques fondamentales. Cela n'est pas surprenant, car nous considérons le calcul comme un concept fondamental. Mais il est trop naïf de dire que les langages de programmation sont "basés" sur certaines bases. En fait, la trichotomie des fondations "théorie des ensembles - théorie des types - théorie des catégories" n'est encore qu'une observation utile de haut niveau qui peut être mathématiquement précise de diverses manières, mais elle n'est pas nécessaire. C'est un accident historique.

Andrej Bauer
la source
"l'idée que le calcul est une recherche de preuves ." Je suis confus par cette déclaration. Certes, la recherche de preuves est une forme de calcul, mais tous les calculs ne sont pas une recherche de preuves? Dans le cadre de cette question, il y a aussi la vérification des preuves, la vérification des types. Plus généralement, il suffit d'ajouter 5 + 3. Que voulez-vous dire par cette déclaration?
user56834
6

c'est un sujet très complexe et il y a beaucoup de grands livres sur le sujet, un récent s'intitule Cathédrale de Turings, origines de l'univers numérique et aussi Moteurs de logique, mathématiciens et origines de l'ordinateur .

Les langages informatiques ont évolué au fil des décennies, mais croyez-le ou non, il existe deux langages de programmation originaux qui montrent que les mathématiques et l'informatique sont intimement liées:

  • L'article de Turing de 1936 sur le problème de l' arrêt . une construction théorique pour résoudre le problème proposé par hilbert au tournant du siècle, le Entscheidungsproblem , c'est-à-dire une procédure automatisée pour résoudre des problèmes mathématiques!

  • Le calcul lambda de l'Église développé en même temps survit toujours dans des langues comme le lisp et le schéma

il y a deux personnages clés qui ont franchi les frontières mathématiques et informatiques avec les "langages de programmation":

  • la théorie de l'information lancée par Shannon montre les liens profonds entre les mathématiques et l'informatique

  • Von Neumann est un autre personnage clé qui se situe entre les mathématiques et l'informatique . il a inventé l'architecture von neumann de stockage de programmes en mémoire.

"langages de programmation" encore plus anciens:

  • le mot anglais «ordinateur» signifiait à l'origine quelque chose de plus comme une «calculatrice» qui utilisait des opérations mathématiques sur les nombres et sa signification s'est considérablement déplacée vers le concept de programmation à usage général d'aujourd'hui. il y a donc une connexion entre les langages de programmation et les premières calculatrices.
  • les cartes perforées utilisées dans les métiers à tisser de la fin du 19e et du début du 20e siècle étaient un «langage de programmation» pour les motifs de tissage. Notez que les cartes perforées ont été utilisées pour la programmation des mainframes dans les années 1960. ceux-ci étaient à l'origine considérés comme des "machines à calculer" (utilisant les mathématiques!), pas tellement des ordinateurs modernes à usage général.
  • Babbage et Ada Lovelace ont développé les premiers concepts rudimentaires des "langages de programmation" au milieu des années 1800 sur un "moteur de calcul"
  • l'algèbre booléenne était à l'origine un concept purement mathématique inventé par Boole
  • l'ancien boulier (millénaire) pour le calcul mathématique est considéré comme un précurseur de l'ordinateur moderne. mais on pourrait dire que les opérations pour le manipuler étaient une sorte de "langage de programmation" (suivi par les humains)

Cependant, dans les langages de programmation modernes, à mesure que l'abstraction a augmenté et évolué, la connexion claire et directe aux mathématiques a quelque peu diminué au fil des décennies, mais elle va toujours être assez intrinsèque et, à certains égards, elle s'est renforcée. par exemple, des langages tels que Java avec ses types stricts ont des liens avec les mathématiques, et au début de la fin des années 1990, les langages informatiques courants (par exemple c ++, Java, Ruby, etc.) ont commencé à implémenter explicitement de nombreux objets mathématiques de niveau supérieur en tant que quasi primitives dans langages tels que les ensembles, les arbres (par exemple Btrees ou hashmaps), etc.

vzn
la source