Question

J'essaie de participer à une image générale de l'état de vérification du logiciel formelle et je suis un bon problème. Pour le contexte, je viens de la plupart des mathématiques. Je connais très bien l'état des professeurs d'automatisation des théorèmes et des assistants prêtés en ce qui concerne leur utilisation afin de prouver des déclarations mathématiques bien formées (par exemple en Coq, Isabelle, maigre, etc.). Ce que j'ai du mal à comprendre, c'est ce qui se passe avec des "méthodes formelles" dans les applications CS pratiques.

J'ai découvert que des sociétés telles que Microsoft et AWS ont utilisé TLA + comme "méthode formelle" dans leur développement de logiciels quelque peu sensiblement. Mais quand j'ai commencé à lire le livre de Wayne 'EM> Pratique TLA + , j'ai constaté qu'il considérait comme un programme à vérifier officiellement si nous vérifions simplement un algorithme de tri sur listes de longueur $ avec entrées entre 1 et $ n $ pour certains $ n $ , c'est-à-dire que nous vérifions simplement de nombreux cas et dire que l'algorithme devrait donc fonctionner en général. Cela ne semble pas particulièrement intéressant; juste un exemple de test unitaire particulièrement rigoureux. Notamment ce n'est pas une preuve formelle de l'exactitude.

D'autre part, j'ai vu des murmures sur Isabelle et Coq pouvant faire preuve de choses sur les logiciels, comme ils peuvent prouver des théorèmes mathématiques. Bien que lorsque je regarde dans les livres qui semblent promettre cela, par exemple. Chlipala's programmation certifiée avec des types dépendants , je vois beaucoup de choses abstraites qui semblent être liées vaguement à des programmes formellement vérifiants, mais pas d'exemples de prendre un véritable programme écrit dans une langue qui a une utilisation généralisée (par exemple, C ++ , Python, java, etc.), etc.) ou même un pseudocode et "la vérifiant", quoi que ce soit.

Quelqu'un peut-il essayer de nettoyer ma confusion?

Était-ce utile?

La solution

Un programme officiellement éprouvé est un programme officiellement éprouvé, quelle que soit sa langue. Juste parce qu'un programme est écrit en Coq et peut-être extrait à OCAML ou HASKELL, plutôt que de écrit dans une langue plus" Entreprise ", telle que C ++ ou Java, ne le fait pas moins d'un programme.

Programmes de preuve écrites dans les langages de programmation à usage général, même "Tame" comme Haskell, c'est difficile car ces langues incluent généralement de nombreuses caractéristiques de commodité, des coins sombres pour la performance et de l'interface avec le système d'exploitation et riche et complexe bibliothèques. Pour prouver une propriété d'un programme, vous avez d'abord besoin d'énoncer cette propriété et la déclaration intègre la sémantique de la langue que le programme est écrit. Lorsque vous essayez de formaliser les langues initialement conçues sans sémantique formelle (qui est presque tous)), vous avez tous rapidement frappé les coins sombres que la description anglaise ne quitte pas non précisée, ou là où elle est ambiguë, ou où elle est pivotante contre-contradiction, ou lorsque la mise en œuvre de la référence ne fait pas quelle est la description et c'est considéré comme un bug l'anglais plutôt que dans la mise en œuvre. L'état de la technique de prouver des propriétés des programmes rédigés dans une langue préexistante consiste à restreindre les programmes à un sous-ensemble de la langue.

Qu'est-ce qui se passe dans ce sous-ensemble est très variable. Le sucre syntaxique n'est pas trop difficile: la sémantique doit simplement la traduire en constructions plus simples. Les propriétés de réflexion ne sont pas particulièrement difficiles à modéliser, mais peuvent rendre le modèle beaucoup plus difficile à raisonner (par exemple, il invalide les propriétés telles que "Cet extrait de code n'a aucun moyen de faire référence à cette variable. Il ne peut donc pas Changer sa valeur »), tant de cadres l'excluent. Les interactions avec le système d'exploitation (généralement via des bibliothèques) sont problématiques car elles nécessitent la modélisation du système d'exploitation, qui sont extrêmement complexes. Les opérations de point flottant sont difficiles, car la tenue des approximations des opérations successives provoque une explosion énorme.

Pour C, l'un des principaux grands sous-ensembles avec un modèle formel est Compcert C, la langue de Compcert . Compcert est un compilateur formellement vérifié (écrit en Coq), donc si vous prouvez une propriété du programme C, vous pouvez également obtenir une preuve du code de machine généré. Compcert C est un très vaste sous-ensemble de C99, mais la formalisation exclut la majeure partie de la norme bibliothèque et quelques bizarreries de la langue.

Pour prouver un programme écrit dans un (sous-ensemble approprié d'un) langage de programmation du monde réel, le programme doit être structuré de manière à rendre la preuve pouvant être traitée. En pratique, cela signifie avoir écrit et prouvé le programme d'abord dans une langue de niveau supérieur (qui n'a aucune implémentation sur le matériel réel) et en utilisant cette langue de niveau supérieur en tant que spécification du programme final. Il existe souvent plusieurs niveaux de raffinements successifs entre le programme exécutable et la spécification.

Il est assez courant que le programme final n'est pas écrit manuellement, mais extrait de manière mécanique d'une langue de niveau supérieur. Par exemple, écrire Coq extraite sur OCAML ou écrire F * qui est extraite à C. mais le Une approche opposée est également possible, par exemple l'écriture ("Tame") C, l'annotant avec des propriétés des fonctions et d'autres subdivisions de code, et en utilisant FRACA-C pour prouver ces propriétés (et la propriété impliquée que le programme C n'a aucun comportement non défini).

Lorsque vous avez une sémantique formelle d'une langue de programmation et un moyen d'exprimer des propriétés de programmes, prouvant que ces propriétés sont un théorème mathématique. Généralement, ces théorèmes n'impliquent aucune mathématique complexe telle que le calcul (sauf indication contraire du domaine de l'application, telles que le suivi du mouvement d'un objet physique), mais ils sont difficiles à prouver car impliquent de très grandes formules et contiennent des déclarations arithmétiques ( $ x ^ n + y ^ n= z ^ n $ n'est pas une équation complexe, mais la résolution de ce n'est pas élémentaire!). C'est théoriquement impossible d'écrire un programme qui peut prouver une propriété sémantique non triviale de tous les programmes , et pratiquement impossible d'écrire un programme qui peut prouver de nombreuses propriétés intéressantes de programmes typiques. La vérification formelle implique une combinaison de briser le problème dans des étapes suffisamment faibles (écrire de petites fonctions et indiquant suffisamment de propriétés précises de ces fonctions), avoir un outil prouvant automatiquement certaines de ces propriétés (telles que

comme un solver SAT pour la logique propositionnelle) et avoir des épreuves d'écriture des humains où l'ordinateur peut 't le faire (mais l'ordinateur vérifiera la preuve de l'homme). Les assistants d'épreuve tels que le Coq et l'Isabelle entrent pour cette dernière étape.

Profication officielle Un programme réel est un effort énorme, nécessitant une durée et une expertise beaucoup plus importantes que le projet logiciel typique. Il est rarement fait en dehors des environnements d'assurance élevée, principalement des environnements présentant une qualité élevée de sécurité, tels que le transport (avions, trains, pas autant de voitures), parfois des environnements à des coûts élevés tels que l'espace ou (très rarement) avec des exigences de sécurité élevées telles que SMART cartes.

Si nous vérifions simplement un algorithme de tri sur des listes de longueur

Ce ne serait pas une preuve formelle à moins que le programme n'avait une limite de n articles pour sa contribution. Je ne connais pas ce livre, mais je soupçonne que vous avez mal interprété quelque chose. Vérification officielle qu'un programme de tri impliquerait prouver son exactitude pour tous les n.

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top