La interpretación abstracta es un concepto muy general y, dependiendo de a quién le pregunte, recibirá diferentes explicaciones porque los conceptos versátiles admiten múltiples perspectivas. La opinión en esta respuesta es mía y no asumiría que es general.
La dureza computacional como motivación.
Comencemos con los problemas de decisión, cuyas soluciones tienen una estructura como esta:
A menudo hay un límite inferior NP-duro en el procedimiento. Comprobar las propiedades semánticas de los programas es incluso indecidible. ¿Qué podemos hacer?
Hagamos dos observaciones. Primero, a veces podemos resolver casos específicos de problemas, incluso si no podemos resolver el problema general. En segundo lugar, las aplicaciones como la optimización del compilador toleran la aproximación en que un compilador que elimina algunas pero no todas las fuentes de ineficiencia es útil. Para hacer esta intuición precisa, debemos responder:
- ¿Qué significa formalmente resolver algunas, pero no todas las instancias problemáticas?
- ¿Cuál es una solución aproximada a un problema de decisión?
Idea de interpretación abstracta 1: Cambiar la declaración del problema
Para mí, una idea importante de la interpretación abstracta es cambiar la formulación del problema para que, en lugar de pedir una respuesta Sí / No , solicitemos una respuesta Sí / No / Quizás .
Como consecuencia, cada problema tiene una solución trivial y de tiempo constante (salida Quizás ). Ahora podemos cambiar nuestra atención a derivar un procedimiento que no siempre produce Quizás . Para volver a las preguntas anteriores, una solución que funciona para algunas instancias problemáticas es la que devuelve Quizás en problemas que no puede resolver. Además, Quizás es una aproximación de Sí y No porque no estamos seguros de cuál es la respuesta.
Esta idea no está restringida a problemas de decisión. Considere estos problemas relacionados con los programas.
- ¿Qué líneas de código en el programa están muertas (nunca se ejecutarán)?
- ¿Qué variables en el programa tienen valores constantes?
- ¿Qué afirmaciones en el programa son violadas?
En todas estas situaciones, podemos pasar de una solución exacta a una aproximada al considerar soluciones que tienen cierta incertidumbre.
- ¿Qué es un conjunto de líneas de código que está muerto?
- ¿Qué es un conjunto de variables en el programa que tienen valores constantes?
- ¿Qué es un conjunto de afirmaciones en el programa que no se viola?
Los sets producidos no necesitan ser los más grandes. Esta idea es extremadamente general y se aplica a problemas que tienen poco que ver con el análisis del programa.
- metronorte[ a , b ]
- metronortek
- En lugar de pedir las asignaciones satisfactorias a una fórmula, podemos pedir un conjunto que contenga las asignaciones satisfactorias.
Tenga en cuenta que no solo hemos cambiado el problema, sino que también lo hemos generalizado estrictamente porque una solución al problema original sigue siendo una solución al problema modificado. La gran pregunta sin respuesta ahora es: ¿Cómo podemos encontrar una solución aproximada?
Idea de interpretación abstracta 2: Caracterización de punto fijo de las soluciones originales
tsR e a c h (s)stR e a c h (s)
X= { s } ∪ { w | v está en X y ( v , w ) es un borde }
nortenortes
La caracterización de punto fijo es una decisión de diseño. Hay muchas caracterizaciones diferentes de un conjunto de soluciones. Cada uno de ellos puede tener diferentes ventajas. En el caso de los lenguajes de programación, tenemos más estructura que solo tratar con un gráfico. Las ecuaciones de punto fijo que nos interesan pueden definirse por inducción en la estructura del programa de entrada. Esta idea no es específica de los programas. Al aplicar la interpretación abstracta a elementos de un lenguaje estructurado, como una gramática, una fórmula lógica, un programa, una expresión aritmética, etc., podemos definir puntos fijos por inducción en la estructura de algún objeto sintáctico.
Al dar esta caracterización de punto fijo, nos comprometemos a una forma específica de soluciones informáticas. En realidad, no calcularemos este punto fijo porque es al menos tan difícil como resolver el problema original, lo que nos lleva al siguiente paso.
Idea de interpretación abstracta 3: aproximación de punto fijo
FLGMMLML
LMFG
Puede encontrar perspicaz la intuición detrás de la transferencia de punto fijo. Podemos pensar en un punto fijo como el límite de una cadena de elementos (posiblemente transfinita). Calcular soluciones aproximadas equivale a aproximar este límite, lo que podemos hacer al aproximar elementos de la cadena.
stst
Idea de interpretación abstracta 4: Algoritmos de aproximación de punto fijo
Todo lo visto hasta ahora ha sido un resultado de existencia matemática. El último paso es calcular la aproximación. Cuando la red de aproximaciones es finita (o si se cumple la condición de cadena ascendente / descendente), podemos usar un procedimiento iterativo simple. Si la red es infinita, un procedimiento iterativo puede no ser suficiente, aunque calcular un punto fijo aún puede ser decidible. En esta situación, se utilizan muchas técnicas para aproximar aún más la solución, o para saltar a una solución exacta más rápido que un algoritmo de iteración ingenuo. En el contexto de la computación de una solución, escuchas términos como ensanchamiento , estrechamiento , iteración de estrategia , aceleración , etc.
Resumen
En mi opinión, la interpretación abstracta proporciona una base matemática para la noción de abstracción de la misma manera que la lógica matemática proporciona una base matemática para el razonamiento. Las soluciones a muchos problemas que nos interesan tienen caracterizaciones como puntos fijos. Esta observación no se limita a los problemas del lenguaje de programación e incluso a la informática. Las soluciones aproximadas pueden caracterizarse como aproximaciones de puntos fijos y se calculan con algoritmos especializados. Estas caracterizaciones y algoritmos explotarán la estructura de la instancia del problema. En el caso de los programas, esta estructura viene dada por la sintaxis del lenguaje.
Calcular aproximaciones a problemas que no tienen una métrica natural es un arte constantemente desarrollado y refinado por los profesionales. La interpretación abstracta es una teoría matemática para la ciencia detrás de este arte.
Referencias
Hay varios buenos tutoriales sobre interpretación abstracta que puede leer.
- Una introducción informal a la interpretación abstracta , Patrick Cousot (trabajo conjunto con Radhia Cousot), Taller sobre biología de sistemas y métodos formales (SBFM'12)
- Una introducción suave a la verificación formal de los sistemas informáticos por interpretación abstracta , Patrick y Radhia Cousot, Marktoberdorf Summer School 2010.
- Lección 13: Abstracción Parte I , Patrick Cousot, Interpretación abstracta, Curso MIT.
- Introducción a la interpretación abstracta , Samson Abramsky y Chris Hankin, Interpretación abstracta de lenguajes declarativos, 1987.
- Interpretación abstracta y aplicación a programas lógicos , Patrick y Radhia Cousot, 1992. Las dos primeras secciones tienen una visión general de alto nivel con varios ejemplos.