Transaction Logic es una extensión de la lógica de predicados que explica de forma limpia y declarativa el fenómeno de los cambios de estado en programas lógicos y bases de datos . Esta extensión agrega conectores diseñados específicamente para combinar acciones simples en transacciones complejas y para proporcionar control sobre su ejecución. La lógica tiene una teoría del modelo natural y una teoría de prueba sólida y completa . Transaction Logic tiene un subconjunto de cláusulas Horn , que tiene una semántica tanto procesal como declarativa. Las características importantes de la lógica incluyen actualizaciones hipotéticas y comprometidas, restricciones dinámicas en la ejecución de transacciones, no determinismo y actualizaciones masivas. De esta manera, Transaction Logic es capaz de capturar declarativamente una serie de fenómenos no lógicos, incluido el conocimiento procedimental en inteligencia artificial , bases de datos activas y métodos con efectos secundarios en bases de datos de objetos .
La lógica de transacciones fue propuesta originalmente en 1993 por Anthony Bonner y Michael Kifer [1] y luego se describió con más detalle en An Overview of Transaction Logic [2] and Logic Programming for Database Transactions . [3] La descripción más completa aparece en el informe técnico de Bonner & Kifer de 1995. [4]
En años posteriores, la lógica de transacciones se amplió de varias maneras, incluida la concurrencia , [5] razonamiento anulable , [6] acciones parcialmente definidas, [7] y otras características. [8] [9]
En 2013, el artículo original sobre Transaction Logic ganó el premio Test of Time de 20 años de la Asociación de Programación Lógica como el artículo más influyente de las actas de la conferencia ICLP 1993 en los 20 años anteriores.
Aquí tinsert denota la operación de actualización elemental de inserción transaccional . La conectiva ⊗ se llama conjunción serial .
colorNode <- // colorea un nodo correctamente nodo(N) ⊗ ¬ coloreado(N,_) ⊗ color(C) ⊗ ¬(adyacente(N,N2) ∧ coloreado(N2,C)) ⊗ inserto(coloreado(N,C)).colorGraph <- ¬uncoloredNodesLeft.colorGraph <- colorNode ⊗ colorGraph.
La actualización elemental tdelete representa la operación de eliminación transaccional .
apilar(N,X) <- N>0 ⊗ mover(Y,X) ⊗ apilar(N-1,Y).pila (0,X).mover(X,Y) <- recoger(X) ⊗ dejar(X,Y).recoger(X) <- borrar(X) ⊗ en(X,Y) ⊗ ⊗ tdelete(on(X,Y)) ⊗ tinsert(clear(Y)).humillar(X,Y) <- más ancho(Y,X) ⊗ borrar(Y) ⊗ tinsert(en(X,Y)) ⊗ tdelete(borrar(Y)).
Aquí <> está el operador modal de posibilidad: si tanto acción1 como acción2 son posibles, ejecute acción1 . De lo contrario, si solo es posible la acción2 , ejecútela.
ejecutar <- <>acción1 ⊗ <>acción2 ⊗ acción1.ejecutar <- ¬<>acción1 ⊗ <>acción2 ⊗ acción2.
Aquí | es el conectivo lógico de la conjunción paralela de la lógica de transacciones concurrentes. [5]
comedorFilósofos <- phil(1) | filo(2) | filo(3) | filo(4).
Existen varias implementaciones de Transaction Logic:
Todas estas implementaciones son de código abierto .