Comment les tactiques fonctionnent-elles dans les assistants de preuve?

44

Question: Comment les "tactiques" fonctionnent-elles dans les assistants de preuve? Ils semblent être des moyens de spécifier comment réécrire un terme en un terme équivalent (pour une définition du terme «équivalent»). Vraisemblablement, il existe des règles formelles pour cela, comment puis-je savoir ce qu’elles sont et comment elles fonctionnent? Impliquent-ils plus que le choix de l'ordre pour la réduction bêta?

Contexte de mon intérêt: Il y a plusieurs mois, j'ai décidé d'apprendre les mathématiques formelles. J'ai choisi la théorie des types car, d'après les recherches préliminaires, cela semble être la bonne façon de faire (tm) et parce qu'elle semble unifier la programmation et les mathématiques, ce qui est fascinant . Je pense que mon objectif final est de pouvoir utiliser et comprendre un assistant de preuve tel que Coq (je pense surtout pouvoir utiliser des types dépendants car je suis curieux de savoir comment représenter les types de matrices). J'ai commencé par ne connaître que très peu, pas même une programmation fonctionnelle rudimentaire, mais je progresse lentement. J'ai lu et compris de grandes quantités de types et de langages de programmation (Pierce) et appris quelques notions de Haskell et de ML.

John Salvatier
la source
1
Ceci est une publicité sans vergogne pour mes tutoriels vidéo sur Coq, math.andrej.com/2011/02/22/…
Andrej Bauer

Réponses:

36

La tactique de base consiste à exécuter une règle d'inférence en avant ou en arrière (par exemple, convertir les hypothèses et en ou convertir l'objectif en deux objectifs etB A B A B A BUNEBUNEBUNEBUNEBavec les mêmes hypothèses), appliquez un lemme (~ application de fonction), divisez un lemme relatif à un type inductif en un cas pour chaque constructeur, et ainsi de suite. Les tactiques de base peuvent réussir ou échouer selon le contexte dans lequel elles sont appliquées. Les tactiques plus avancées ressemblent à de petits programmes fonctionnels qui exécutent les tactiques de base, effectuent une correspondance de motif sur les termes de l'objectif et / ou des hypothèses, font des choix en fonction du succès ou de l'échec de la tactique, etc. Des tactiques plus avancées traitent de l'arithmétique et d'autres types de théories spécifiques. Le document clé sur le langage tactique de Coq est le suivant:

  • D. Delahaye. Un langage tactique pour le système Coq . Dans Actes de logique pour la programmation et le raisonnement automatique (LPAR), Ile de la Réunion, volume 1955 de Notes de lecture en informatique, pages 85–95. Springer-Verlag, novembre 2000.

Les règles formelles qui constituent l’essence de la tactique de base sont définies dans le guide de l’utilisateur Coq ici ou dans le chapitre 4 du document pdf .

Un article assez instructif sur la mise en œuvre de tactiques et de tactiques (essentiellement des tactiques prenant pour argument d'autres tactiques) est le suivant:

Le langage tactique de Coq présente la limite suivante: les preuves écrites à l'aide de cette clé ne ressemblent guère à celles que l'on fait à la main. Plusieurs tentatives ont été faites pour permettre des preuves plus claires. Celles-ci incluent Isar (pour Isabelle / HOL) et le langage de preuve de Mizar .

A part: Saviez-vous aussi que le langage de programmation ML a été conçu à l'origine pour implémenter des tactiques pour le prouveur de théorèmes LCF ? De nombreuses idées développées pour ML, telles que l'inférence de type, ont influencé les langages de programmation modernes.

Dave Clarke
la source
3
Très bonne réponse. La programmation certifiée avec types dépendants d'Adam Chlipala ( adam.chlipala.net/cpdt ) est une autre bonne ressource sur l'utilisation de la tactique dans Coq.
Jbapple
16

La LCF est en effet le grand-père de tous ces systèmes: Coq, Isabelle, HOL, y compris le langage de programmation ML (que nous voyons aujourd’hui sous les noms OCaml, SML, également F #). Oui, j'inclus Coq en tant que membre de la grande famille LCF. Comparé aux assistants américains (notamment ACL2), ou au Mizar totalement indépendant, Coq est culturellement assez proche d'Isabelle et des HOL, principalement en raison de la même idée de tactique .

Alors, quelles sont les tactiques de toute façon, dépourvues d’observations accidentelles sur la réécriture, les conversions, l’introduction ou l’élimination de connecteurs?

Le principe de la stratification est hérité de la LCF de Milner:

  • Inférences fondamentales (raisonnement direct), soit comme type thmde données abstrait dans l'approche LCF d'origine, soit avec vérification séparée des termes de preuve dans la branche Théorie des types de la famille (Coq, Matita). Cela vous donne un certain fondement logique aux résultats que le prouveur considère comme des théorèmes. Donc vous pouvez avoir une inférence primitive qui prend A et ⊢ B et vous donne ⊢ A ∧ B. Une autre inférence primitive pourrait vous donner t = u, où u est la forme bêta normale de t. Aucun de ces mécanismes n'est une tactique, bien qu'il s'agisse de règles d'inférence comme dans la logique standard.

  • Preuve dirigée vers le but (raisonnement en arrière). L'idée est que vous exploitez une certaine notion d '"état d'objectif" en l'affinant, en le divisant en de plus en plus de sous-objectifs, des sous-objectifs proches, jusqu'à ce que tout soit résolu. Finir l’état de but fera apparaître un certain théorème dans le processus. La LCF a mis en place une infrastructure extra-logique pour les objectifs, qui est toujours présente dans les HOL: une tactique est une fonction de ML qui précise un objectif et fournit une justification pour l’affinement. À la toute fin de la preuve, les justifications sont rejouées dans l'ordre inverse pour produire une preuve de manière directe, conformément aux inférences primitives esquissées ci-dessus.

Coq et Matita sont encore assez proches de ce principe de LCF. Isabelle est différente ici: dès 1989, Larry Paulson a reformé les notions de but et de tactique pour les rapprocher de la logique, qui est le cadre logique "pur" d'Isabelle ici. Isabelle / Pure fournit une logique minimale d’ordre supérieur avec implication ==> et quantificateur !! qui indiquent à la fois la structure des règles de déduction naturelle et les états des objectifs.

Par exemple, ⊢ A ==> B ==> A B est la règle d'introduction de la conjonction (de la logique de l'objet) en tant que théorème du cadre logique.

Les états de but ne sont également que des théorèmes, commençant par C ==> C pour votre revendication initiale C, qui est raffinée en X ==> Y ==> Z ==> C dans des états intermédiaires, où X, Y, Z sont les sous-objectifs actuels et le processus se termine par ⊢ C (pas de sous-objectifs).

Revenons maintenant aux tactiques, qui sont plus uniformes pour tous ces prouveurs: à partir d’une notion d’état de but (par exemple celle d’Isabelle ci-dessus), une tactique est une fonction qui associe un état de but à (0, 1 ou plus). états d'objectif. De plus, une tactique est un combinateur de telles fonctions tactiques, par exemple pour exprimer une composition séquentielle, un choix, une répétition, etc. En fait, le langage de la tactique et des tactiques est lié à l'approche de la "liste des réussites" des combinateurs d'analyse syntaxique.

Les tactiques permettent de décrire systématiquement certaines stratégies d’amélioration des objectifs. Ils ont eu beaucoup de succès depuis leur invention dans LCF dans les années 1970/80, mais ils produisent des scripts de preuve notoirement illisibles.

A. Asperti et al., PLMMS 2009, donnent un aperçu récent de certains aspects des langages tactiques (voir les comptes rendus de l'atelier, page 22).

Mizar et Isabelle / Isar ont été mentionnés en tant qu'approches alternatives au raisonnement structuré lisible par l'homme , et ils ne sont pas basés sur des tactiques dans ce sens. Mizar n’ayant aucun lien avec la famille LCF, il ne connaît pas cette terminologie tactique. Isabelle / Isar reprend dans une certaine mesure la tradition tactique, mais sa notion de méthode de preuve est un peu plus structurée (contexte de preuve explicite Isar, indication explicite de faits chaînés et évitement du piratage interne des objectifs au cours du raisonnement).

Beaucoup plus de réformes et de reconsidérations de langages tactiques ont eu lieu au cours des dernières décennies. Par exemple, une branche récente de la communauté Coq privilégie SSReflect (par G. Gonthier) à la place du traditionnel Ltac.

Makarius
la source
12

Comment les tactiques fonctionnent-elles dans les assistants de preuve?

Je suppose que cette réponse sera un peu difficile.

Premièrement, il ne suffit pas de se demander "comment les tactiques fonctionnent dans les assistants de preuve", car elles fonctionnent différemment selon les assistants de preuve. Il existe actuellement deux classes principales d'assistants: ceux dérivés de la LCF d'origine, tels que Isabelle, HOL et HOL light, et les assistants de preuve basés sur la théorie des types, tels que Coq et Matita. Dans ces deux différentes classes d'assistants de preuve, la tactique fonctionne différemment, ce qui montre que ce qui se passe sous le capot, par exemple Isabelle, est assez différent de ce qui se passe sous le capot, par exemple à Matita.

Demandez-vous: que se passe-t-il lorsque nous essayons de prouver une proposition P dans Matita? Nous introduisons une métavariable X de type P. Nous jouons ensuite un jeu, pour ainsi dire, où nous raffinons X, ajoutant de plus en plus de structure au terme incomplet, jusqu'à obtenir un terme lambda complet (c'est-à-dire ne contenant plus de métavariables). Une fois que nous sommes en possession d'un terme lambda complet, nous dactylographions le vérifie par rapport à P, en nous assurant qu'il occupe le type requis. Nous voyons ensuite que dans Coq et Matita, une tactique est simplement une fonction de termes de preuves incomplètes à des termes de preuves incomplets, ce qui, espérons-le, permet de structurer le terme après application (cette observation a motivé de nombreux travaux récents, par exemple Jojgov , Pientka et autres).

Par exemple, la tactique de Matita "intro" introduit une abstraction lambda par rapport au terme existant, "cases" introduit une expression de correspondance dans le terme et "apply" introduit une application d'un terme à l'autre. Ces tactiques de base peuvent être combinées, en utilisant des fonctions d'ordre supérieur, pour en créer d'autres plus complexes. L'idée de base est toujours la même: une tactique vise toujours à ajouter un peu de structure à un terme de preuve incomplet.

Notez que les développeurs souhaitent redonner un terme à chaque vérification de type après chaque application tactique. Strictement parlant, ils ne sont pas tenus de le faire, car tout ce qui compte pour les assistants de preuve basés sur la théorie des types est que, lorsque l'utilisateur fournit à Qed la preuve, nous sommes en possession d'un terme de preuve qui habite la proposition P. arrivé à ce terme de preuve est en grande partie hors de propos. Cependant, Coq et Matita visent tous deux à redonner à l'utilisateur un terme de preuve (éventuellement incomplet) indiquant que les vérificateurs de typage sont vérifiés après chaque application tactique. Pourtant, cet invariant peut échouer (et souvent échoue), notamment en ce qui concerne les deux vérifications syntaxiques que les assistants de preuve basés sur CIC doivent implémenter.

En particulier, nous pouvons effectuer ce qui semble être une preuve valable, en appliquant une série de tactiques jusqu'à ce qu'il ne reste plus aucun objectif ouvert. Nous arrivons ensuite à Qed la preuve supposée, seulement pour découvrir que le vérificateur de terminaison de Matita, ou son vérificateur de positivité stricte, se plaint, car le terme de preuve généré par la tactique a invalidé l’un de ces contrôles syntaxiques (c’est-à-dire une métavariable dans la position un appel récursif a été instancié avec un terme qui n’est pas syntaxiquement plus petit que l’argument original). Cela montre que, dans un certain sens, la théorie des types de CIC n’est pas "assez forte" et ne reflète pas les exigences de positivité ou de syntaxe de taille de ses types (observation qui motive les types dimensionnés d’Abel, et quelques travaux récents sur les types de positivité ).

Par contre, les assistants de preuve de style LCF sont assez différents. Ici, le noyau consiste en un module (généralement implémenté dans une variante de ML), contenant un type abstrait "thm", et des fonctions qui implémentent les règles d'inférence de la logique de l'assistant de preuve, mappant "thm" à "thm", etc. en avant. Nous nous appuyons sur la discipline de dactylographie de ML pour nous assurer que la seule manière de construire une valeur de type "thm" consiste à utiliser ces règles d'inférence (tactiques de base). Le noyau d'Isabelle est ici .

Les preuves consistent alors en une série d’applications de ces tactiques de base (ou de tactiques plus complexes et de plus grande taille, qui sont à nouveau réalisées en reliant des tactiques plus simples utilisant des fonctions d’ordre supérieur --- chez Isabelle, les fonctions d’ordre supérieur, appelées tactiques, peuvent être vu ici ). Contrairement aux assistants de preuve basés sur la théorie des types, un assistant de style LCF n'a pas besoin de laisser traîner un témoin de preuve explicite. La précision de la preuve est garantie par la construction et notre confiance dans la discipline de dactylographie de ML (de nombreux assistants, par exemple Isabelle, génèrent toutefois des conditions de preuve pour leurs preuves).

Dominic Mulligan
la source