Desafortunadamente, hay demasiadas cosas pasando aquí. Entonces, es fácil mezclar las cosas. El uso de "completo" en "plenitud completa" y "abstracción completa" se refieren a ideas completamente diferentes de plenitud. Pero, también hay una conexión vaga entre ellos. Entonces, esta será una respuesta complicada.
Completo : "Sonido y completo" es una propiedad que desea que tenga una lógica tradicional con respecto a su semántica. La solidez significa que todo lo que pueda probar en la lógica es cierto en el modelo semántico. La integridad significa que lo que sea cierto en el modelo semántico es demostrable en la lógica. Decimos que una lógica es sólida y completa para un modelo semántico particular. Cuando llegamos a la lógica constructiva, como la teoría de tipo Martin-Lof o la lógica lineal, nos preocupamos no solo de si las fórmulas son demostrables, sino también de cuáles son sus pruebas. Una fórmula comprobable puede tener muchas pruebas y una lógica constructiva quiere mantenerlas separadas. Entonces, una semántica para una lógica constructiva implica especificar no solo si una fórmula es verdadera, sino también alguna noción semántica abstracta de "prueba" ("evidencia") de su verdad. Abramsky y sus colegas acuñaron el término "integridad completa" para significar que las pruebas en la lógica pueden expresar todas las pruebas semánticas en el modelo. Entonces, "completo" se refiere a las pruebas aquí. Una lógica "completa" puede demostrar todo lo que necesita. Una lógica "completamente completa" tiene todas las pruebas que necesita tener. Entonces, "integridad completa" significa "integridad constructiva" o "integridad de prueba". Esto no tiene nada que ver con la abstracción completa.
Abstracción completa : "Adecuado y completamente abstracto" es una propiedad que desea para el modelo semántico de un lenguaje de programación. (Tenga en cuenta la primera diferencia: ahora estamos tratando con las propiedades del modelo semántico, ¡no las propiedades del lenguaje!) Adecuación significa que, cuando dos términos tienen el mismo significado en el modelo semántico, son observacionalmente equivalentes en el lenguaje de programación (con respecto a alguna noción de ejecución). La abstracción completa significa que, si dos términos son observacionalmente equivalentes, tienen el mismo significado en el modelo semántico. Estas ideas pueden estar relacionadas con la solidez y la integridad, pero de una manera algo artificial. Si pensamos en el modelo semántico de un lenguaje de programación como una "lógica" o un "método de prueba" para hablar de equivalencia observacional, la adecuación significa que este método de prueba es sólido; abstracción completa significa que este método de prueba está completo. No existe una noción de "plenitud total"método de prueba (Pero, tal cosa es teóricamente posible, y uno de estos días alguien podría hacerlo).
En su caso, le interesan las traducciones en lugar de los modelos semánticos. Las propiedades de adecuación y abstracción completa se pueden ampliar para tratar las traducciones de la siguiente manera. Piensa en el idioma de destino como su "modelo semántico", es decir, un formalismo que de alguna manera comprende completamente. Si es así, tiene alguna noción de equivalencia. Luego, decimos que la traducción es adecuada si, cuando las traducciones de dos programas fuente son equivalentes en el idioma de destino, son observacionalmente equivalentes en el idioma fuente. Decimos que es completamente abstracto si, cuando dos programas de origen son observacionalmente equivalentes en el idioma de origen, sus traducciones son equivalentes en el idioma de destino.
τ( M) ≅τ( N) ⟹ M≅norte
METRO≅norte⟹ τ( M) ≅τ( N)
METRO≅norte⟺τ( M) ≅τ( N)
UNUN
∀ N: τ( A ) .∃ M: Una .τ( M) = N
Ahora para la conexión vaga entre la totalidad completa y la abstracción completa. Probar que un modelo semántico o una traducción es completamente abstracto a menudo implica algo de definibilidad. Esto se debe a que nuestros idiomas son generalmente de orden superior. Por lo tanto, si el modelo semántico o el idioma de destino tiene demasiados "contextos", entonces podrá introducir nuestros términos o significados semánticos de manera indeseable y estropear su equivalencia. "Formas indeseables" significa que el lenguaje de programación en sí mismo no puede pincharlas. Por lo tanto, para obtener una abstracción completa, debemos asegurarnos de que los "contextos" disponibles en el modelo semántico o el idioma de destino provengan de alguna forma de aquellos en el idioma de origen. Tenga en cuenta que esto se relaciona con la propiedad de integridad completa.
¿Por qué queremos tales propiedades? No tiene nadaque ver con los compiladores! Queremos estas propiedades para afirmar que el idioma de origen se incrusta en el idioma de destino. Si estamos contentos con un idioma de destino particular (como ser limpio, comprensible, de alguna manera fundamental o dado por Dios), entonces, si el idioma de origen se incrusta en él, entonces podemos afirmar que no hay nada nuevo en el idioma de origen. Es solo un fragmento del idioma de destino que conocemos y amamos. Es solo azúcar sintáctico. Por lo tanto, las personas dan traducciones completamente abstractas para establecer que los idiomas de destino particulares son excelentes. A veces también los dan personas que tienen un lenguaje grande o complicado con el que lidiar. Entonces, en lugar de definir una semántica para él directamente, lo traducen a algún lenguaje central y luego le dan semántica al lenguaje central. Por ejemplo, el informe Haskell hace esto. Pero la abstracción completa de estas traducciones rara vez se prueba porque los idiomas de origen son grandes y complicados. La gente cree que la traducción es buena.
Una vez más, esto no tiene nada que ver con los compiladores. Los compiladores rara vez son adecuados o totalmente abstractos. ¡Y no necesitan serlo! Todo lo que un compilador debe hacer es preservar el comportamiento de ejecución de programas completos. El lenguaje de destino de un compilador es generalmente enorme, lo que significa que tiene muchos contextos que pueden confundir la equivalencia. Por lo tanto, los programas equivalentes en el idioma fuente casi nunca son contextualmente equivalentes cuando se compilan.