Si vous êtes familier avec la vérification de programme, vous préférerez probablement lire la question avant le contexte . Si vous n'êtes pas familier avec la vérification de programme, vous pourrez peut-être encore répondre à cette question, mais vous préférerez probablement lire d'abord le Contexte .
Contexte
Il est souvent indiqué que la vérification de l'exactitude partielle est indécidable. Pour les besoins de la discussion, choisissons une façon très particulière de rendre cette déclaration précise, dans le style de Floyd - Hoare. Un organigramme est un digraphe avec un nœud initial distinct à partir duquel tous les nœuds sont accessibles. Un programme est un organigramme dont les nœuds sont des commandes. Il existe trois types de commandes (1) les hypothèses supposent q , (2) les assertions affirment q et (3) les affectations v: = e. Ici q est une formule fol (logique du premier ordre), e est un terme fol et v est une variable.
Nous disons qu'un programme est partiellement correct lorsqu'il existe un moyen d'annoter chaque nœud x avec une précondition a (x) et une postcondition b (x) telles que (1) la précondition du nœud initial est valide, (2) { a (x) } x { b (x) } est valable pour toutes les commandes x , et (3) ( b (x) implique a (y) ) est valable pour toutes les arêtes de x à y . Ici, les triplets Hoare sont définis comme suit:
- { p } assert q { r } signifie que ( p implique ( q et r )) est valide
- { p } supposons que q { r } signifie que (( p et q ) implique r ) est valide
- { p } v: = e { r } signifie que (( p avec e substitué à v ) implique r ) est valide
Voici un argument ondulé expliquant pourquoi la vérification de cette exactitude partielle est indécidable: Une fois que vous avez rempli certains a (x) et certains b (x), vous devez vérifier si certaines formules fol sont valides, et cela est indécidable.
Une manière typique de coder la terminaison dans une exactitude partielle consiste à ajouter des affirmations spéciales qui disent essentiellement "depuis la dernière fois que j'ai été exécuté, il y a eu des progrès vers la terminaison". Ces assertions de progression doivent être placées de telle sorte que toutes les marches infinies sur le diagramme de flux (qui commencent au nœud initial) contiennent une infinité d'assertions de progression. Pour être plus précis, disons que les assertions de progression ont toujours la forme assert u < v , où u et v sont des entiers positifs, sont précédées de l'affectation u : = f et sont suivies de l'affectation v : = u . Ici f est unfonction variante , u est sa valeur actuelle et v est sa valeur précédente. Maintenant, puisque nous parlons d '"entiers positifs" et que nous les comparons, nous devons nous assurer qu'un peu plus que fol est disponible: disons que l'arithmétique Peano est disponible. (Je ne suis pas convaincu de ce choix. N'hésitez pas à ignorer si cela vous convient.) Bien sûr, f peut utiliser toutes les autres fonctions et constantes mentionnées dans le programme. (Notez que l'ajout d'hypothèses au début du programme équivaut à l'introduction d'axiomes non logiques.)
Maintenant, si le programme avec des affirmations de progression est encore partiellement correct, alors nous savons que le programme d'origine se termine.
Question
Étant donné un programme de terminaison, il est difficile de trouver des fonctions variantes pour les affirmations de progression. Mais combien dur? (Je sais que même avec l'énorme arrière-plan ci-dessus, j'ai toujours laissé cette question en quelque sorte ouverte ou mal définie, selon la façon dont vous voulez la voir.)
Autrement dit: je cherche une référence qui formalise le problème de la réduction de la terminaison à une exactitude partielle, puis dit quelque chose sur sa complexité. Une réponse qui fait tout cela serait bien sûr la bienvenue.
Réponses:
Une façon d'y répondre est de considérer la complexité de calcul des problèmes de décision pour les classes de requêtes de correction partielle et de terminaison qui sont connues pour être décidables. L'interprétation abstraite utilisant le domaine polyédrique peut déduire les annotations de correction partielle que vous mentionnez dans les cas où les annotations requises sont des conjonctions d'inégalités linéaires. Le calcul de la post-condition abstraite est exponentiel dans le nombre de variables. Ensuite, il y a la surcharge de trouver le point fixe. Consultez les premiers articles de Cousot pour en savoir plus à ce sujet et la bibliothèque de tabliers si vous voulez jouer directement avec.
La recherche de fonctions variantes est décidable lorsque les fonctions variantes sont linéaires. Je n'ai pas pu trouver une caractérisation complète de la complexité de cela, mais "Termination of Linear Programs" par Tiwari a une section qui discute de la complexité. Voir aussi "Une méthode complète pour la synthèse des fonctions de classement linéaire" par Podelski et Rybalchenko. De plus, Byron Cook a travaillé sur l'exploitation de l'interprétation abstraite pour aider à construire des arguments de terminaison. Voir, par exemple, "Classement des abstractions" et "Analyses de variance à partir d'analyses d'invariance". Ceux-ci peuvent donner un aperçu supplémentaire de la relation entre l'exactitude partielle et la résiliation.
Liens:
la source
Il y a une réduction évidente de la non-résiliation nécessaire à l'exactitude partielle, à savoir:
P ne se termine jamais lorsqu'il est démarré dans un état initial satisfaisant φ ssi { φ } P {faux} est valide.
Je suis conscient que c'est une autre non-réponse. Son avantage est qu'il est plus court que ceux ci-dessus.
la source
Il existe une technologie standard - généralement indécidable, bien sûr - pour remplir votre graphique avec ses conditions préalables et postérieures, à savoir la sémantique de précondition libérale la plus faible , qui est une forme de sémantique de transformateur de prédicat qui donne les conditions préalables les plus faibles pour la satisfaction de la spécification ou non -Résiliation. Il s'agit essentiellement d'une théorie complète de l'exactitude partielle de ces langues, et, en fait, de l'exactitude totale
C'est la craie et le fromage qui décident de la terminaison et de l'exactitude partielle où réside le dur labeur, car les deux sont tellement indécidables. Mais l'exactitude partielle est enchevêtrée avec des problèmes de conception de langage, à la fois pour les langages de programme et de spécification, tandis que la difficulté de la terminaison est de nature propre: pour toute théorie utilisée pour prouver la terminaison, il y aura des algorithmes qui se terminent, mais il ne peut pas être prouvé que la terminaison est relative à cette théorie. Par exemple, les calculs dans le calcul lambda polymorphe pur doivent se terminer, mais l'arithmétique Peano ne peut pas le prouver.
J'ai l'impression que le travail sur l'interprétation abstraite initié par Patrick Cousot, a été le plus dynamique dans ce domaine, mais je ne prétends pas être un expert.
la source