Formellement vérifier l'exactitude d'un algorithme
-
23-09-2019 - |
Question
Tout d'abord, est-ce possible sur des algorithmes qui ont pas d'effets secondaires?
En second lieu, où je pourrais en apprendre davantage sur ce processus, tous les bons livres, articles, etc?
La solution
COQ est un assistant de preuve qui produit la sortie OCaml correcte. Il est assez compliqué cependant. Je ne ai jamais eu le temps de regarder, mais mon collègue de travail a commencé et cessé de l'utiliser au bout de deux mois. Il était surtout parce qu'il voulait faire avancer les choses plus vite, mais si vous avez besoin de vérifier un algorithme cela pourrait être une bonne idée.
Voici un cours qui utilise COQ et parle des algorithmes prouvant.
Et Voici un tutoriel sur la rédaction de documents académiques COQ.
Autres conseils
- Il est généralement beaucoup plus facile pour vérifier / prouver la justesse en l'absence d'effets secondaires sont impliqués, mais ce n'est pas une exigence absolue.
- Vous pouvez regarder une partie de la documentation pour un langage de spécification formelle comme Z . Une spécification formelle est pas une preuve elle-même, mais elle est souvent la base pour un.
En général, les preuves formelles sont très spécifiques à l'algorithme à portée de main.
Cependant, il y a plusieurs trucs bien connus qui sont utilisés et réutilisés à nouveau. Par exemple, avec des algorithmes récursifs vous pouvez utiliser invariants.
Une autre astuce commune réduit le problème d'origine à un problème qui est plus facile de montrer la preuve de la justesse de votre algorithme, puis soit généralisant le problème plus facile ou montrant que le problème plus facile peut être traduit à une solution au problème d'origine. est une description.
Si vous avez un algorithme particulier à l'esprit, vous pouvez faire mieux demander comment construire une preuve de cet algorithme plutôt qu'une réponse générale.
Acheter ces livres: http://www.amazon.com/Science-Programming -Monographs-Informatique / dp / 0387964800
Le livre Gries, la programmation scientifique est grande substance. Patient, complet, complet.
Je pense que la vérification de l'exactitude d'un algorithme serait de valider sa conformité avec un cahier des charges. Il y a une branche de la science informatique théorique appelé Méthodes formelles qui peut être ce que vous cherchez si vous avez besoin de se rapprocher de la preuve que vous pouvez. De wikipedia,
Méthodes formelles sont un type particulier techniques de base mathématiquement pour la spécification, le développement et la vérification des logiciels et du matériel systèmes
Vous pourrez trouver de nombreuses ressources et outils d'apprentissage de la multitude de liens sur la page de Wikipédia liés et de la Méthodes formelles wiki .
Logique en informatique, par Huth et Ryan, donne un aperçu assez lisible des systèmes modernes pour la vérification des systèmes. Il était une fois les gens ont parlé de prouver des programmes corrects - avec des langages de programmation qui peuvent ou peuvent ne pas avoir des effets secondaires. L'impression que je reçois de ce livre et ailleurs que les applications réelles sont différentes - par exemple prouvant qu'un protocole est correct, ou que l'unité à virgule flottante d'une puce peut diviser correctement, ou qu'une routine sans verrouillage pour manipuler des listes chaînées est correcte.
Informatique ACM Enquêtes Vol 41 Numéro 4 (Octobre 2009) est un numéro spécial sur la vérification du logiciel. Il semble que vous pouvez obtenir au moins un des documents sans un compte ACM en recherchant « Méthodes formelles: la pratique et l'expérience ».
L'outil Frama-C , pour lequel Elazar propose une vidéo de démonstration dans les commentaires, donne vous un langage de spécification, ACSL , pour l'écriture des contrats de fonction et divers analyseurs pour vérifier qu'une fonction C satisfait ses propriétés de contrat et de sécurité tels que l'absence d'erreurs d'exécution.
Un tutoriel étendu, ACSL par exemple , montre des exemples de algorithmes réels C étant spécifiées et vérifiées, et sépare les fonctions sans effet du côté de ceux effectful (ceux-libre d'effets secondaires sont considérés comme plus facile et viennent en premier dans le tutoriel). Ce document est également intéressant en ce sens qu'il n'a pas été écrit par les concepteurs des outils dont elle a décrire, lui donne un look plus frais et plus didactique à ces techniques.
Si vous êtes familier avec LISP alors vous devriez certainement vérifier ACL2:
Dijkstra Discipline de la programmation et ses EWDS jeter les bases d'une vérification formelle en tant que science dans la programmation. Un travail plus simple est Programmation systématique de Wirth , qui commence par l'approche simple à l'aide de la vérification. Wirth utilise Pascal pré-ISO pour la langue; Dijkstra utilise un formalisme de type Algol-68 appelé Guarded (GCL). La vérification formelle a mûri depuis Dijkstra et Hoare, mais ces textes anciens peuvent encore être un bon point de départ.
outil PVS développé par les gars de Stanford est un système de spécification et de vérification. J'y ai travaillé et trouvé très utile pour Theoram Proving.
WRT (1), vous aurez sans doute de créer un modèle de l'algorithme d'une manière qui « capture » les effets secondaires de l'algorithme dans une variable de programme destiné à modéliser les effets secondaires basés sur l'état.