Lógica de separación, lógica de separación ( lógica de separación en inglés ) - sistema formal, lógica subestructural, aplicable a la verificación de programas que contienen estructuras de datos mutables y punteros , una extensión de la lógica de Hoare . Diseñado por John Reynolds , Peter O'Hearn , Samin Ishtiaq y Hongseok Yang [ 1 ] [ 2 ] [ 3 ] [4] basado en el trabajo de Rod Burstall [ 5 ] . El lenguaje de aserciones de la lógica de partición es un caso especial de la lógica de implicaciones agrupadas [ 6 ] .
Una evolución de la lógica de partición para computación paralela con memoria compartida es la lógica de partición paralela , desarrollada por O'Hearn y Stephen D. Brookes .
Las tecnologías basadas en la lógica de la separación permiten desarrollar sistemas para la verificación de grandes proyectos de software [7] .
La lógica de Hoare tiene una serie de limitaciones, ya que opera solo en variables mutables y no admite procedimientos ni código de primera clase . Sin embargo, la mayor limitación es la falta de soporte de puntero , que es más relevante para la especificación de programa imperativo . En el caso de utilizar punteros y el montón , las variables mutables se pueden abandonar asignando un valor de puntero a las variables locales solo una vez [8] .
En 2000-2002, John Reynolds y Peter O'Hearn idearon una extensión de la lógica de Hoare, la lógica de la división. La idea original era simplificar el razonamiento sobre programas imperativos de bajo nivel con una estructura de datos mutable común [9] . El término en sí está asociado con la idea principal de esta lógica: la descripción de la división del almacenamiento ( almacenamiento en inglés ) en componentes que no se superponen. El término se utiliza tanto en relación con el cálculo de predicados , ampliado por el operador de división , como con el resultado de una ampliación de la lógica de Hoare [1] .
Una característica clave de la lógica de la separación es la posibilidad de un razonamiento local (razonamiento local) debido a la presencia en las declaraciones de conectores espaciales ( esp. conectores espaciales ) entre partes del montón [10] .
La lógica le permite trabajar con sentencias de la forma , donde:
Para superar las engorrosas descripciones de prohibiciones sobre el uso de la misma dirección por diferentes objetos, se ha introducido una nueva operación lógica: una conjunción disjunta , denotada por (o [13] ) y afirmando que cada una de las condiciones y se cumplen en su parte del montón (almacenamiento direccionado) [9] [14] . Es decir, verdadero para un montón si hay dos partes de este montón y para las cuales [15] es verdadero :
Arriba, y se entienden como funciones parciales que dan valores correspondientes a una dirección en el montón.
Para afirmar que el montón está vacío, se introduce un predicado (en este caso, obviamente, ) y para designar un puntero - . Por ejemplo, en el siguiente, que es uno de los axiomas, el triple de Hoare
la condición previa es la celda de memoria no utilizada que, como resultado de la operación de asignación, apunta a F , que se establece en la condición posterior [12] .
La clave del razonamiento local es la regla del marco introducida por O'Hearn [ 1 ] :
,en el que ninguna variable libre ( ing. free v ariable ) se cambia ( ing. mod ified ) bajo la influencia del comando . Con esta regla, puede agregar predicados arbitrarios sobre las variables y partes del montón que no modifica el comando . Al mismo tiempo, O'Hearn llamó a la cantidad de montón ocupado por el comando el término inglés. huella ("huella"). El propósito de la regla del marco es expandir el argumento de una descripción más local del comando a una descripción más global del comando adjunto, el comando con la huella más grande [1] .
Habiendo establecido que la lógica de la separación es un ejemplo de la lógica de las implicaciones de la gavilla, Yang e Ishtiak introdujeron la implicación de separación ( implicación de separación en inglés [1] , varita mágica en inglés ). La designación dice que si un montón se extendió por un montón que no se interseca para lo cual es true , entonces para el montón resultante será true [7] .
La semántica de los conectores lógicos (conjunción separadora e implicación separadora) implica una estructura de montón monoide [7] .
La lógica de separación concurrente ( CSL ) es una versión de lógica aplicable para la verificación de algoritmos paralelos con memoria compartida. Originalmente propuesto por Peter O'Hearn. Utiliza la siguiente regla [16]
,lo que le permite sacar conclusiones en presencia de hilos de ejecución independientes que acceden a una tienda separada. Las reglas de prueba de O'Hearn adaptaron el enfoque inicial de Tony Hoare sobre la concurrencia [17] reemplazando el uso de restricciones de alcance para hacer cumplir la partición con razonamiento en la lógica de partición. Además de extender el enfoque de Hoare a los punteros de montón, O'Hearn demostró que la lógica de partición paralela puede rastrear dinámicamente la transferencia de propiedad de áreas de montón entre procesos. Por lo tanto, los ejemplos de su artículo incluyen un búfer de paso de puntero y un administrador de memoria .
El razonamiento local también puede entenderse en términos de transferencia de propiedad . Es más fácil considerar la transferencia de propiedad utilizando las reglas del monitor Hoare como ejemplo (puede ver que la lógica de separación también es adecuada para sistemas distribuidos ). Para ingresar una sección crítica , se usa una conjunción de separación con , donde es el recurso invariante r . Al salir de la sección crítica, la conclusión lógica sigue en la dirección opuesta [18] :
,Por analogía, también podemos considerar el proceso de procesamiento por parte de un proceso de un mensaje enviado por otro proceso con recursos delegados a este proceso, determinados por huellas dactilares [18] .
Stephen D. Brookes introdujo por primera vez un modelo para una lógica de partición paralela en un artículo adjunto al artículo de O'Hearn [19] . La corrección ( en inglés solidness ) de la lógica era un problema difícil. En particular, el contraejemplo de John Reynolds mostró el fracaso de una versión anterior e inédita de la lógica. El punto planteado por el ejemplo de Reynolds se describe brevemente en el artículo de O'Hearn y más detalladamente en el de Brooks.
O'Hearn y Brooks son co-receptores del Premio Gödel 2016 por la invención de la lógica de partición paralela [20] .
La lógica de separación ha encontrado aplicación en verificadores automáticos e interactivos de software escritos en un estilo imperativo y orientado a objetos . Para esto, se desarrollaron adiciones apropiadas a las herramientas de verificación existentes, por ejemplo, tales como:
Otros sistemas que utilizan lógica dividida: Smallfoot, Space Invader, THOR, SLAyer, HIP, jStar, Xisa, VeriFast, Infer, SeLoger, SLP. Sin embargo, a partir de 2014, no hay probadores de teoremas prácticos que implementen la lógica completa de partición, es decir, que incluyan una implicación de partición [7] .
De acuerdo con la naturaleza del uso del sistema, se puede dividir de la siguiente manera [24] :