Si está familiarizado con la verificación del programa, es probable que prefiera leer la Pregunta antes que los Antecedentes . Si no está familiarizado con la verificación del programa, es posible que aún pueda responder esta pregunta, pero es probable que prefiera leer el Fondo primero.
Antecedentes
A menudo se dice que verificar la corrección parcial es indecidible. En aras de la discusión, escojamos una forma muy particular de hacer que esta declaración sea precisa, al estilo de Floyd - Hoare. Un diagrama de flujo es un dígrafo con un nodo inicial distinguido desde el cual todos los nodos son accesibles. Un programa es un diagrama de flujo cuyos nodos son comandos. Hay tres tipos de comandos (1) los supuestos asumen q , (2) las aserciones afirman q y (3) las asignaciones v: = e. Aquí q es una fórmula fol (lógica de primer orden), e es un término fol y v es una variable.
Decimos que un programa es parcialmente correcto cuando hay una manera de anotar cada nodo x con una condición previa a (x) y una condición posterior b (x) de modo que (1) la condición previa del nodo inicial sea válida, (2) { a (x) } x { b (x) } se cumple para todos los comandos x , y (3) ( b (x) implica que a (y) ) es válido para todos los bordes de x a y . Aquí los triples Hoare se definen de la siguiente manera:
- { p } afirmar q { r } significa que ( p implica ( q y r )) es válido
- { p } suponga que q { r } significa que (( p y q ) implica que r ) es válido
- { p } v: = e { r } significa que (( p con e sustituido por v ) implica que r ) es válido
Aquí hay un argumento ondulado a mano de por qué verificar esta corrección parcial es indecidible: una vez que complete algunos a (x) y algunos b (x) , debe verificar si algunas fórmulas son válidas, y eso es indecidible.
Una forma típica de codificar la terminación en corrección parcial es agregar algunas afirmaciones especiales que esencialmente dicen "desde la última vez que fui ejecutado, hubo progreso hacia la terminación". Estas aserciones de progreso deben colocarse de tal manera que todos los pasos infinitos en el diagrama de flujo (que comienzan en el nodo inicial) contengan infinitas aserciones de progreso. Para ser más específico, digamos que las afirmaciones de progreso siempre tienen la forma aserción u < v , donde u y v son números enteros positivos, están precedidos por la asignación u : = f , y son seguidos por la asignación v : = u . Aquí f es unfunción variante , u es su valor actual y v es su valor anterior. Ahora, dado que hablamos de "enteros positivos" y los comparamos, debemos asegurarnos de que haya un poco más de lo que está disponible: digamos que la aritmética de Peano está disponible. (No me gusta mucho esta opción. Siéntete libre de ignorar si es conveniente). Por supuesto, f puede usar cualquier otra función y constantes que se mencionan en el programa. (Tenga en cuenta que agregar suposiciones al comienzo del programa es equivalente a introducir axiomas no lógicos).
Ahora, si el programa con afirmaciones de progreso sigue siendo parcialmente correcto, entonces sabemos que el programa original finaliza.
Pregunta
Dado un programa de terminación, parece que es difícil encontrar funciones variantes para las afirmaciones de progreso. ¿Pero qué tan difícil? (Sé que incluso con el gran fondo anterior, todavía dejé esta pregunta como abierta, o mal definida, dependiendo de cómo quieras verla).
Para decirlo de otra manera: estoy buscando una referencia que formalice el problema de reducir la terminación a una corrección parcial y luego diga algo sobre su complejidad. Una respuesta que haga todo esto, por supuesto, sería bienvenida.