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.