Soy un principiante trabajando en métodos que prueban la equivalencia del programa. He leído algunos artículos sobre la definición de relaciones lógicas o simulaciones para demostrar que dos programas son equivalentes. Pero estoy bastante confundido acerca de estas dos técnicas.
Solo sé que las relaciones lógicas se definen inductivamente mientras que las simulaciones se basan en la coinducción. ¿Por qué se definen de esa manera? ¿Cuáles son sus pros y sus contras respectivamente? ¿Cuál debo elegir en diferentes situaciones?
lo.logic
pl.programming-languages
logical-relations
parametricity
Hongjin Liang
fuente
fuente
Respuestas:
Tengo una respuesta a esta pregunta que posiblemente sea nueva. De hecho, todavía lo estoy pensando durante los últimos 6 meses más o menos, y aún no se ha escrito en los periódicos.
La tesis general es que los principios de razonamiento relacional como "relaciones lógicas", "simulaciones" e incluso "invariantes" son manifestaciones de abstracción de datos u ocultamiento de información. Dondequiera que haya información oculta, estos principios surgen.
Las primeras personas en descubrirlo fueron los teóricos de los autómatas. Los autómatas tienen estado oculto. Por lo tanto, necesita un razonamiento relacional para hablar sobre su equivalencia. Los teóricos de los autómatas lucharon con los homomorfismos durante un tiempo, se rindieron y se les ocurrió una noción llamada "cobertura relacional", que es una forma de relaciones de simulación.
Milner recogió la idea en un artículo poco conocido pero muy fundamental llamado " Una noción algebraica de simulación entre programas " en 1971. Hoare lo sabía y lo usó para elaborar la " Prueba de corrección de las representaciones de datos " en 1972 (pero utilizó la abstracción funciona en lugar de las relaciones porque pensaba que eran "más simples"). Más tarde se retractó de la afirmación de simplicidad y volvió a usar las relaciones en " Refinamiento de datos refinado ". Reynolds utilizó el razonamiento relacional en " Craft of Programming"", Capítulo 5 (1981). Pensó que las relaciones eran más naturales y generales que las funciones de abstracción. Si regresa y lee este capítulo, encontrará ideas de paramétrica relacional que acechan, esperando ser descubiertas. Efectivamente, dos años después, Reynolds publicó "Tipos, abstracción y polimorfismo paramétrico" (1983).
Parece que todas estas ideas no tienen nada que ver con los tipos, pero realmente lo tienen. Los lenguajes y modelos con estado tienen abstracción de datos incorporada . No necesita definir un "tipo de datos abstractos" para ocultar la información. Simplemente declara una variable local y la oculta. Podemos enseñarlo a estudiantes de primer año en clases de Java en las primeras semanas. Sin sudar.
Los lenguajes y modelos funcionales, por otro lado, tienen que ocultar su información mediante tipos . Los modelos funcionales no tienen abstracción de datos incorporada. Tenemos que agregarlo explícitamente, usando o ∃ . Entonces, si traduce un lenguaje con estado a un lenguaje funcional, notará que todo el estado local se traduce en variables de tipo. Para una descripción explícita de cómo funciona esto, vea mi artículo " Objetos y clases en lenguajes similares a Algol ", pero las ideas realmente provienen de Reynolds 1981 ("La esencia de Algol"). Estamos entendiendo mejor esas ideas clásicas ahora.∀ ∃
Tome dos máquinas y M ′ que quiera probar equivalentes. Milner 1971 dice, define una relación entre los estados de M y M ' y muestra que las dos máquinas preservan la relación. La parametricidad de Reynolds dice: piense en los estados de las máquinas como pertenecientes a los tipos X y X ' . Defina una relación R entre ellos. Si las máquinas son de tipo F ( X ) y F ( X ' ) , parametrizadas por los tipos de sus estados, compruebe que las dos máquinas están relacionadas por la relación FMETRO METRO′ METRO METRO′ X X′ R F( X) F( X′) . F( R )
Entonces, las simulaciones y la parametricidad relacional son esencialmente la misma idea . No es simplemente un parecido superficial. El primero está hecho para lenguajes con estado donde hay abstracción de datos incorporada. Este último está hecho para lenguajes sin estado donde la abstracción de datos se obtiene a través de variables de tipo.
¿Qué pasa con las relaciones lógicas entonces? En la superficie, las relaciones lógicas parecen ser una idea más general. Mientras que la parametricidad habla sobre cómo relacionar las variables de tipo dentro del mismo modelo, las relaciones lógicas parecen relacionar tipos en diferentes modelos. (Dave Clarke escribió una exposición brillante de esto antes). Pero mi sensación es (y aún debe demostrarse) que esta es una instancia de alguna forma de parametricidad de tipo superior que aún no se ha formulado. Estén atentos para más progreso en ese frente.
[Nota agregada] La conexión entre las relaciones lógicas y las simulaciones se discute en nuestro artículo reciente Relaciones lógicas y paramétrica: Un programa de Reynolds para teoría de categorías y lenguajes de programación .
fuente
functor
Una de las diferencias clave es que las relaciones lógicas se usan como una técnica para mostrar que una clase de programas (por ejemplo, entrada a un compilador) corresponde a otra clase de programas (por ejemplo, la salida del compilador), mientras que las relaciones de simulación se usan para mostrar la correspondencia entre dos programas.
La similitud entre las dos nociones es que ambas definen una relación utilizada para mostrar la correspondencia entre dos entidades diferentes. En cierto sentido, uno puede pensar en una relación lógica como una relación de simulación que se define inductivamente en la sintaxis de los tipos. Pero existen diferentes tipos de relaciones de simulación.
Las relaciones lógicas se pueden usar para mostrar la correspondencia entre un lenguaje como ML y su traducción al lenguaje ensamblador, como en el documento que lee. Una relación lógica se define inductivamente en la estructura de tipo. Una relación lógica proporciona un medio compositivo para mostrar, por ejemplo, que una traducción es correcta, al mostrar que la traducción es correcta para cada tipo de constructor. En los tipos de función, la condición de condición de corrección diría algo así como, la traducción de esta función toma una entrada bien traducida a una salida bien traducida.
Las relaciones lógicas son una técnica versátil para lenguajes basados en el cálculo lambda. Otras aplicaciones de relaciones lógicas incluyen (a partir de aquí ): caracterizar la definibilidad lambda, relacionar definiciones semánticas denotacionales, caracterizar polimorfismo paramétrico, modelar interpretación abstracta, verificar representaciones de datos, definir semántica completamente abstracta y modelar estado local en lenguajes de orden superior.
Las relaciones de simulación se usan generalmente para mostrar la equivalencia de dos programas. Típicamente, estos programas producen algún tipo de observación, como enviar mensajes por canales. Un programa P simula otra Q si P puede hacer todo lo que Q puede hacer, aunque quizás más.
La bisimulación, aproximadamente, es dos relaciones de simulación juntas. Muestra que el programa P y simula el programa Q y que el programa Q puede simular el programa P y tiene una bisimulación, aunque generalmente existen condiciones adicionales. La entrada de Wikipedia sobre la bisimulación es un buen punto de partida (más preciso). Existen miles de variantes de la idea, pero es una idea fundamental que se ha reinventado en más o menos la misma forma informática, lógica modal y teoría de modelos. El artículo de Sangiorgi da una historia maravillosa de la idea.
Un artículo que establece una relación entre las dos nociones es una nota sobre las relaciones lógicas entre semántica y sintaxis, de Andy Pitts, que utiliza relaciones lógicas, en última instancia, una noción semántica definida sintácticamente, para demostrar una cierta propiedad sobre la bisimulación aplicativa , que es una noción puramente sintáctica.
fuente
Los dos tipos de relaciones parecen usarse en diferentes contextos. Simulaciones lógicas para lenguajes mecanografiados y relaciones de simulación cuando se trata de cálculos de procesos o lógicas modales interpretadas sobre sistemas de transición. Dave Clarke ha proporcionado una explicación muy intuitiva, por lo que solo agregaré algunos consejos que pueden ayudar.
Se ha trabajado en caracterizar ambas nociones utilizando la interpretación abstracta. Puede que no sea lo que desea, pero al menos ambas nociones se tratan en el mismo marco matemático.
Samson Abramsky usó relaciones lógicas para probar la solidez y la terminación del análisis de rigurosidad para el cálculo perezoso de Lambda ( Interpretación abstracta, Relaciones lógicas y Extensiones Kan ). También demostró que las relaciones lógicas definen funciones de abstracción en el sentido de conexión de Galois de interpretación abstracta. Más recientemente, Backhouse y Backhouse mostraron cómo construir conexiones de Galois para tipos de orden superior a partir de conexiones de Galois para tipos base y que estas construcciones se pueden describir de manera equivalente utilizando relaciones lógicas ( Relaciones lógicas y Conexiones de Galois ). Por lo tanto, en el contexto específico de los lenguajes funcionales mecanografiados, las dos nociones son equivalentes.
Las relaciones de simulación caracterizan la preservación de la propiedad entre las estructuras de Kripke para varias lógicas modales y temporales. En lugar de tipos, tenemos modalidades en una lógica. Las relaciones de simulación también definen las conexiones de Galois y, por lo tanto, las abstracciones. Uno puede preguntar si estas abstracciones tienen propiedades especiales. La respuesta es que las abstracciones estándar son sólidas y las abstracciones basadas en relaciones de simulación están completas. La noción de integridad es con respecto a las conexiones de Galois, que pueden no coincidir con las interpretaciones intuitivas. Esta línea de trabajo ha sido desarrollada por David Schmidt ( Relaciones binarias que preservan la estructura para la abstracción del programa ), y Francesco Ranzato y Francesco Tapparo ( Preservación fuerte generalizada por interpretación abstracta ).
fuente
Yo diría que los dos conceptos son algo vagos. Ambos tratan sobre relaciones binarias de mecanismos computacionales que de alguna manera encarnan una noción de igualdad. Las relaciones lógicas se definen por la inducción de la estructura tipográfica, mientras que las simulaciones se pueden definir como se desee, pero el término alude a la coinducción.
Es engañoso decir que las relaciones lógicas están restringidas a cálculos lambda o lenguajes secuenciales, aunque ahí es donde se originaron las relaciones lógicas. Por ejemplo, en nuestro trabajo sobre modelos completamente abstractos para el Sistema Fπ
fuente