Apprendre au théorème automatisé

44

Je suis d' apprentissage automatisé théorème prouvons / solveurs SMT / assistants de preuve par moi - même et après une série de questions au sujet du processus, en commençant ici.

Notez que ces sujets ne sont pas faciles à digérer sans connaissances en logique (mathématique). Si vous rencontrez des problèmes avec les termes de base, veuillez en prendre connaissance, par exemple Logics in Computer Science de M. Huth et M. Ryan (en particulier les chapitres un, deux et quatre) ou Introduction à la logique mathématique et à la théorie des types de P. Andrews.
Pour une brève introduction à la logique d'ordre supérieur (HOL), voir ici .

J'ai regardé Coq et lu le premier chapitre de l'intoduction à Isabelle entre autres; Types de prouveurs de théorèmes automatisés

Je connais Prolog depuis quelques décennies et j'apprends maintenant le F #. ML, O'Caml et LISP sont donc un bonus. Haskell est une bête différente.

J'ai les livres suivants

"Manuel de raisonnement automatisé" édité par Alan Robinson et Andrei Vornkov

"Manuel de logique pratique et de raisonnement automatisé" par John Harrison

"La réécriture du terme et tout ça" de Franz Baader et Tobias Nipkow

  1. Quelles sont les différences entre Coq et Isabelle?

  2. Devrais-je apprendre Isabelle ou Coq, ou les deux?

  3. Y a-t-il un avantage à apprendre d'abord Isabelle ou Coq?

Trouvez la prochaine question de la série ici .

Guy Coder
la source
7
Il est important de noter que les outils que vous mentionnez ne sont pas des prouveurs automatisés mais des assistants de preuve (bien qu'ils puissent prouver des choses simples par eux-mêmes).
Raphaël
@DaveClarke Dupliquer?
Raphaël
@Raphael: Oui (sauf que ma réponse contient de nouvelles données).
Dave Clarke
@DaveClarke Pensez-vous que nous devrions fermer celui-ci et fusionner les deux?
Raphaël
@ Raphaël: Oui. Je viens de copier le texte de la réponse ici dans ma réponse à l'autre question.
Dave Clarke

Réponses:

25

Ma préférence va au Coq, mais j'imagine que d'autres préfèrent Isabelle. L'une des choses étranges que j'ai trouvées chez Isabelle, c'est qu'il existe une syntaxe à deux niveaux, dans laquelle certaines de vos définitions doivent être entre guillemets. Aucune absurdité de ce genre n’est présente en Coq.

En fin de compte, celui qui vous convient le mieux peut dépendre de ce que vous voulez prouver. Les deux langues ont beaucoup de soutien en bibliothèque et des communautés actives développant toutes sortes de théories de développement et d’exemples. Si une langue fournit suffisamment de ressources bibliothécaires (ou autres) pour les types de théorie que vous souhaitez développer, alors je choisirais cette langue.

Une stratégie consiste à faire un tutoriel simple dans les deux langues et à suivre celui qui se sent le mieux. Par exemple,

Voici un article de blog comparant brièvement les deux de quelqu'un qui préfère finalement Isabelle.

Assurez-vous d'utiliser un IDE approprié (tel que ProofGeneral ) plutôt que de faire les choses en ligne de commande.

Une autre façon d’entrer dans Coq est d’essayer le livre en ligne Software Foundations de Benjamin Pierce et al. Il fournit un excellent tutoriel avec une foule de détails fournis. L'accent est principalement mis sur la sémantique des langages de programmation, mais une grande partie des bases (et au-delà) de Coq et de la démonstration semi-automatique de théorèmes sont abordées tout au long du processus.

Dave Clarke
la source
4
ProofGeneral est génial, une fois que vous l'avez apprivoisé! En ce qui concerne la syntaxe Isabelle: iirc, les éléments entre guillemets sont les éléments dont vous parlez, les formules. Tout le reste est du contrôle de la preuve. Je pensais que la distinction claire était bonne, mais les guillemets doubles (et l’absence de mise en évidence syntaxique à l’intérieur des guillemets) ne sont probablement pas la meilleure façon de les implémenter.
Raphaël
4
Nous avons créé un wiki Isabelle / HOL l’année dernière pour un cours; Il y a de belles vues difficiles à obtenir autrement.
Raphaël
18

Une chose que je pense que vous trouverez intéressante est que le terme "prouver un théorème" varie énormément en fonction du domaine dans lequel vous vous trouvez. Bien qu'ils soient - dans l’abstrait - un peu apparentés, ils prouvent un théorème pratique (comme voir plus en détail dans le Manuel de raisonnement automatisé) a moins à faire avec Coq ou Isabelle que vous ne le pensez.

Lorsque j'ai commencé à étudier le théorème, le premier livre que j'ai lu (bien que daté?) Était l'excellente logique de premier ordre de Melvin Fitting et la démonstration automatique de théorèmes. Ce livre était vraiment excellent et couvrait les types de sujets que vous verrez qui se rapportent aux logiques d’ordre inférieur, où vous pouvez réellement obtenir une bonne quantité d’automatisation. Le type de logique que vous apprendrez devrait être dicté par ce que vous voulez raisonner, et non pas par tant de théorème à prouver. Par exemple, alors que la logique de premier ordre vous donne une bonne dose d’expressivité et de capacité de raisonnement, la plupart des langages de programmation (où j’en suis arrivée aujourd’hui) s’écartent de l’ancienne école de démonstration de théorèmes et de vérification de modèles le seau de choses qui sont plus décidables mais moins expressifs).

Cela ne signifie toutefois pas que le raisonnement de premier ordre et la vérification des modèles n’ont pas été extrêmement utiles dans la pratique. Ils ont été! Vous pouvez considérer ACL2 comme un exemple de prouveur construit au-dessus d'une logique de premier ordre qui a connu un succès incroyable dans le domaine industriel. Parallèlement à cela, il y a eu également une quantité incroyable de développement dans la résolution SMT. Les solveurs SMT modernes reposent sur des résolveurs SAT très puissants (principalement grâce aux découvertes faites au cours des vingt dernières années pour des améliorations de DPLL) et ont été largement utilisés dans des tâches telles que l'exécution symbolique.

Cependant, comme je l’ai dit plus tôt, même s’il est amusant de «prouver un théorème», il ya encore beaucoup à apprendre. Learning Coq - par exemple - a peu à faire pour apprendre les outils d’automatisation qu’il vous fournit, mais aussi beaucoup plus pour apprendre la théorie des types sur laquelle elle repose (le calcul prédicatif des constructions coinductives). Si vous n’êtes pas habitué à la logique constructive, à l’isomorphisme de Curry-howard ou à la théorie des types, vous passerez un moment excitant à apprendre ces outils, mais j’ai peine à penser qu’ils sont trop étroitement liés à ce que vous voyez dans le premier volume. du manuel.

Alors décidez ce que vous voulez faire: vérifiez les modèles et les théorèmes dans la logique du premier ordre ou utilisez une théorie des types puissante pour raisonner au sujet de l’exactitude de vos programmes (ou de vos théorèmes dans la logique constructive). Si c’est le premier, apprenez-en plus sur les techniques basées sur la déduction automatisée, si c’est le second, apprenez-en plus sur Coq, HOL, etc. Au fait, si vous voulez apprendre le Coq, alors que les références ci-dessus sont bonnes, je pense que Il existe deux références essentielles pour apprendre le Coq:

Le livre de base des logiciels de Benjamin Pierce (le Dr. Pierce est un excellent écrivain, et je vous recommanderais également de consulter son plus populaire "livre de briques", si vous ne l'avez pas encore fait).

Programmation certifiée avec types dépendants (Adam Chlipala écrit également très bien, bien que ses livres supposent un peu plus de maturité et d’intelligence que l’introduction peut-être plus simple de Pierce.)

Kristopher Micinski
la source
15

Il existe une variété de systèmes pour le test de théorèmes interactifs (ITP) - voir aussi la conférence de ce nom - Coq, Isabelle, HOLs, ACL2, PVS, etc.

Tous sont relativement difficiles à apprendre et chacun a sa propre culture. C'est comme apprendre une langue étrangère: disons que vous connaissez déjà l'anglais et que vous avez le choix entre le français, l'allemand, l'italien, l'espagnol et le portugais. Tous sont liés d'une manière ou d'une autre - ce n'est pas le chinois - mais très peu de personnes gèrent tout cela simultanément. Vous devriez donc essayer de goûter à chacune des cultures et communautés, puis vous engager.

Il se peut que vous ayez également besoin de la "fonctionnalité tueur" pour votre travail.

Il est également utile d’avoir des collègues experts sur l’un de ces systèmes.

  • Quelles sont les différences entre Coq et Isabelle?

Tous deux sont des descendants du système LCF de Stanford / Edinburgh / Cambridge. En 1985, G. Huet et L. Paulson travaillaient ensemble sur la dernière version de Cambridge LCF. La scission a ensuite eu lieu entre Coc / CIC / COQ (maintenant Coq) en France et Isabelle à Cambridge et Munich. Notez que HOL4, HOL-Light, HOL-XYZ sont d’autres descendants apparentés de LCF.

Il y a plus de 20 ans, la distinction entre Coq et Isabelle aurait été faite selon des fondements logiques: logique de construction dépendante, ici dépendante, logique classique typée ici. Aujourd’hui, cette pratique a étonnamment peu d’impact, car de plus en plus de couches ont été ajoutées à chaque système formel, y compris des outils complémentaires et des bibliothèques.

  • Devrais-je apprendre Isabelle ou Coq, ou les deux?

Vous devriez regarder les deux et essayer de ressentir si vous aimez plus de vin et de fromage, ou de Bratwurst et de choucroute. (En tant que l'un des gars derrière Isabelle, mais actuellement en France, je suis surpris de voir combien de Français aiment réellement la choucroute quand ils sont chez eux en privé et que personne ne regarde :-)

  • Y a-t-il un avantage à apprendre d'abord Isabelle ou Coq?

Je ne pense pas Vous risqueriez de rester coincé avec celui que vous avez essayé en premier et de ne pas essayer le second, ou d'être déçu trop tôt avec le premier et de le rejeter trop tôt. Dans tous les cas, vous aurez besoin de temps et de persévérance pour devenir productif avec l'un ou l'autre système.

Depuis que Proof General a été mentionné en tant que "IDE": Proof General / Emacs a longtemps été l’interface unificatrice standard pour Coq et Isabelle, mais je ne l’aurais jamais appelée IDE. Il y a aussi CoqIDE avec "IDE" dans son nom, mais c'est un éditeur relativement basique au-dessus des widgets Gtk. Isabelle actuelle comprend Isabelle / jEdit, qui ne porte pas le nom "IDE", mais vise à donner une approximation de ce que vous voyez régulièrement dans Netbeans ou IntelliJ IDEA - pour les textes de preuve au lieu du code Java.

Makarius
la source
10

Voici quelques tutoriels vidéo Coq de Andrej Bauer. Ce n'est en aucun cas complet, mais je pense que c'est une bonne introduction.

Daniil
la source
1
Génial! Notez une phrase centrale dans "Une première preuve avec Coq": "Réfléchissez à la manière de le faire sur papier." Le meilleur conseil que je connaisse.
Raphaël
4

Cette introduction à Isabelle est assez exhaustive.

Voir aussi cette introduction à Isabelle

En général, il est relativement facile de commencer avec Isabelle, car il existe de nombreux exemples disponibles. Par exemple, sur le site officiel

PS - Je ne suis aucunement affilié à Isabelle, je suis un théoricien des méthodes formelles, mais je sais qu'Isabelle est souvent le point de départ par défaut.

Shaull
la source
1
«Je sais qu'Isabelle est souvent le point de départ par défaut.»: Je dirais plutôt que le HOL est souvent le point de départ par défaut. En tant qu'assistant de preuve, il s'agit plutôt d'un Coq qui est souvent un défaut. En y pensant, c’est drôle… la logique la plus connue (HOL plus célèbre que CoC) et le plus célèbre assistant de preuve (Coq plus célèbre qu’Isabelle) ne correspondent pas (Coq est basé sur CoC et Isabelle sur HOL).
Hibou57
2

λ

En outre, les fondations de logiciels de DeepSpec Summer School proposent des conférences très intéressantes:

Certaines des conférences basées sur la série de fondations de logiciels, qui a déjà été mentionné.

Aristu
la source