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.
fuente
Respuestas:
Una forma de responder a esto es considerar la complejidad computacional de los problemas de decisión para las clases de corrección parcial y consultas de terminación que se sabe que son decidibles. La interpretación abstracta que usa el dominio poliédrico puede inferir las anotaciones de corrección parcial que menciona en los casos en que las anotaciones requeridas son conjunciones de desigualdades lineales. Calcular la condición posterior abstracta es exponencial en el número de variables. Luego está la sobrecarga de encontrar el punto fijo. Consulte los primeros documentos de Cousot para obtener más información sobre esto y la biblioteca Apron si desea jugar directamente con él.
Encontrar funciones variantes es decidible cuando las funciones variantes son lineales. No pude encontrar una caracterización completa de la complejidad de esto, pero "Terminación de programas lineales" de Tiwari tiene una sección que analiza la complejidad. Véase también "Un método completo para la síntesis de funciones de clasificación lineal" de Podelski y Rybalchenko. Además, Byron Cook ha trabajado en aprovechar la interpretación abstracta para ayudar a construir argumentos de terminación. Consulte, por ejemplo, "Clasificación de abstracciones" y "Análisis de varianza a partir de análisis de invarianza". Estos pueden dar más información sobre la relación entre la corrección parcial y la terminación.
Enlaces:
fuente
Hay una reducción obvia de la no terminación necesaria a la corrección parcial, a saber:
P nunca termina cuando se inicia en un estado inicial que satisface φ iff { φ } P {false} es válido.
Soy consciente de que esta es otra falta de respuesta. Su ventaja es que es más corto que los anteriores.
fuente
Existe una tecnología estándar, generalmente indecidible, por supuesto, para llenar su gráfico con sus condiciones previas y posteriores, a saber, la semántica de precondición liberal más débil , que es una forma de semántica de transformador predicado que proporciona precondiciones más débiles para la satisfacción de la especificación o no -terminación. Esencialmente, esta es una teoría completa de la corrección parcial para tales idiomas y, de hecho, la corrección completa
Es la tiza y el queso decidir cuál de las terminaciones y la corrección parcial es donde radica el trabajo duro, ya que ambas son muy indecidibles. Pero la corrección parcial está enredada con problemas de diseño del lenguaje, tanto para los lenguajes de programa como de especificación, mientras que la dificultad de la terminación es clara: para cualquier teoría utilizada para probar la terminación habrá algoritmos que terminan, pero no se puede demostrar que terminen en términos relativos. a esa teoría Por ejemplo, los cálculos en el cálculo lambda polimórfico puro deben terminar, pero la aritmética de Peano no puede probar esto.
Mi impresión es que el trabajo sobre interpretación abstracta iniciado por Patrick Cousot ha sido el más dinámico en esta área, pero no pretendo ser un experto.
fuente