Articulo de referencia

Reglas de manejo de restricciones

Constraint Handling Rules ( CHR ) es un lenguaje de programación declarativo basado en reglas , introducido en 1991 por Thom Frühwirth en ese entonces con el Centro Europeo de I...

Constraint Handling Rules ( CHR ) es un lenguaje de programación declarativo basado en reglas , introducido en 1991 por Thom Frühwirth en ese entonces con el Centro Europeo de Investigación de la Industria Informática (ECRC) en Múnich, Alemania. [ 1 ] [ 2 ] Originalmente destinado a la programación de restricciones , CHR encuentra aplicaciones en inducción gramatical , [ 3 ] sistemas de tipos , [ 4 ] razonamiento abductivo , sistemas multiagente , procesamiento del lenguaje natural , compilación , planificación , razonamiento espacio-temporal , pruebas y verificación .

Un programa CHR, a veces llamado manejador de restricciones , es un conjunto de reglas que mantienen un almacén de restricciones , un conjunto múltiple de fórmulas lógicas. La ejecución de las reglas puede agregar o eliminar fórmulas del almacén, cambiando así el estado del programa. El orden en que las reglas se "activan" en un almacén de restricciones dado es no determinista , [ 5 ] según su semántica abstracta y determinista (aplicación de reglas de arriba hacia abajo), según su semántica refinada . [ 6 ]

Aunque CHR es Turing completo , [ 7 ] no se usa comúnmente como lenguaje de programación por derecho propio. Más bien, se usa para extender un lenguaje anfitrión con restricciones. Prolog es, con mucho, el lenguaje anfitrión más popular y CHR está incluido en varias implementaciones de Prolog, incluyendo SICStus y SWI-Prolog , aunque también existen implementaciones de CHR para Haskell , [ 8 ] Java , C , [ 9 ] SQL , [ 10 ] y JavaScript. [ 11 ] A diferencia de Prolog, las reglas de CHR son de múltiples cabezas y se ejecutan de manera de elección comprometida usando un algoritmo de encadenamiento hacia adelante .

Descripción general del idioma

La sintaxis concreta de los programas CHR depende del lenguaje anfitrión, y de hecho, los programas incorporan instrucciones en dicho lenguaje que se ejecutan para gestionar ciertas reglas. El lenguaje anfitrión proporciona una estructura de datos para representar términos , incluidas variables lógicas . Los términos representan restricciones, que pueden considerarse como "hechos" sobre el dominio del problema del programa. Tradicionalmente, Prolog se utiliza como lenguaje anfitrión, por lo que se emplean sus estructuras de datos y variables. El resto de esta sección utiliza una notación matemática neutral, común en la literatura sobre CHR.

Un programa CHR, entonces, consiste en reglas que manipulan un multiconjunto de estos términos, llamado almacén de restricciones . Las reglas vienen en tres tipos: [ 5 ]

  • Las reglas de simplificación tienen la formah1,,hnortegramo1,,gramometro|b1,,bo{\displaystyle h_{1},\dots ,h_{n}\Longleftrightarrow g_{1},\dots ,g_{m}\,|\,b_{1},\dots ,b_{o}}Cuando coinciden las cabezash1,,hnorte{\displaystyle h_{1},\dots ,h_{n}}y los guardiasgramo1,,gramometro{\displaystyle g_{1},\dots ,g_{m}}sostén, las reglas de simplificación pueden reescribir las cabezas en el cuerpob1,,bo{\displaystyle b_{1},\dots ,b_{o}}.
  • Las reglas de propagación tienen la formah1,,hnortegramo1,,gramometro|b1,,bo{\displaystyle h_{1},\dots ,h_{n}\Longrightarrow g_{1},\dots ,g_{m}\,|\,b_{1},\dots ,b_{o}}Estas reglas agregan las restricciones del cuerpo al almacén, sin eliminar las cabeceras.
  • Las reglas de simpagación combinan simplificación y propagación. Están escritash1,,hh+1,,hnortegramo1,,gramometro|b1,,bo{\displaystyle h_{1},\dots ,h_{\ell }\,\backslash \,h_{\ell +1},\dots ,h_{n}\Longleftrightarrow g_{1},\dots ,g_{m}\,|\,b_{1},\dots ,b_{o}}Para que se active una regla de simpagación, el almacén de restricciones debe coincidir con todas las reglas en la cabecera y las condiciones deben ser verdaderas.{\displaystyle \ell }restricciones antes de la{\displaystyle \backslash }se conservan, como en una regla de propagación; los restantesnorte{\displaystyle n-\ell }Se eliminan las restricciones.

Dado que las reglas de simpagación engloban la simplificación y la propagación, todas las reglas CHR siguen el formato

HkHrGRAMO|B{\displaystyle H_{k}\,\backslash \,H_{r}\Longleftrightarrow G\,|\,B}

donde cada uno deHk,Hr,GRAMO,B{\displaystyle H_{k},H_{r},G,B}es una conjunción de restricciones:Hk,Hr{\displaystyle H_{k},H_{r}}yB{\displaystyle B}contienen restricciones CHR, mientras que los guardasGRAMO{\displaystyle G}están integrados. Solo uno deHk,Hr{\displaystyle H_{k},H_{r}}debe no estar vacío.

El lenguaje anfitrión también debe definir restricciones integradas sobre los términos. Las condiciones en las reglas son restricciones integradas, por lo que ejecutan efectivamente el código del lenguaje anfitrión. La teoría de restricciones integradas debe incluir al menos true(la restricción que siempre se cumple), fail(la restricción que nunca se cumple y se usa para indicar un fallo) e igualdad de términos, es decir, unificación . [ 7 ] Cuando el lenguaje anfitrión no admite estas características, deben implementarse junto con CHR. [ 9 ]

La ejecución de un programa CHR comienza con un almacén de restricciones inicial. A continuación, el programa procede comparando reglas con dicho almacén y aplicándolas hasta que no haya más coincidencias (éxito) o failse derive la restricción. En el primer caso, el almacén de restricciones puede ser leído por un programa en lenguaje anfitrión para buscar hechos de interés. La comparación se define como una "unificación unidireccional": vincula variables solo en un lado de la ecuación. La comparación de patrones se puede implementar fácilmente como unificación cuando el lenguaje anfitrión lo admite. [ 9 ]

Programa de ejemplo

El siguiente programa CHR, escrito en sintaxis Prolog, contiene cuatro reglas que implementan un solucionador para una restricción de menor o igual . Las reglas están etiquetadas para mayor comodidad (las etiquetas son opcionales en CHR).

% X leq Y significa que la variable X es menor o igual que la variable Y reflexividad @ X leq X <=> verdadero . antisimetría @ X leq Y , Y leq X <=> X = Y . transitividad @ X leq Y , Y leq Z ==> X leq Z . idempotencia @ X leq Y \ X leq Y <=> verdadero . 

Las reglas pueden leerse de dos maneras. En la lectura declarativa, tres de las reglas especifican los axiomas de un orden parcial :

Las tres reglas están cuantificadas universalmente de forma implícita (los identificadores en mayúsculas son variables en la sintaxis de Prolog). La regla de idempotencia es una tautología desde el punto de vista lógico, pero tiene un propósito en la segunda lectura del programa.

La segunda forma de interpretar lo anterior es como un programa informático para mantener un almacén de restricciones, una colección de hechos (restricciones) sobre objetos. El almacén de restricciones no forma parte de este programa, sino que debe proporcionarse por separado. Las reglas expresan las siguientes reglas de cálculo:

  • La reflexividad es una regla de simplificación : expresa que, si se encuentra en la base de datos un hecho de la forma XX , se puede eliminar.
  • La antisimetría también es una regla de simplificación, pero con dos caras . Si se encuentran en el almacén dos hechos de la forma XY e YX (con X e Y coincidentes ), entonces se pueden reemplazar por el hecho único X = Y. Esta restricción de igualdad se considera integrada y se implementa como una unificación que normalmente maneja el sistema Prolog subyacente.
  • La transitividad es una regla de propagación . A diferencia de la simplificación, no elimina nada del almacén de restricciones; en cambio, cuando existen en el almacén hechos de la forma XY e YZ (con el mismo valor para Y ), se puede agregar un tercer hecho XZ.
  • La idempotencia, en definitiva, es una regla de simpagación , una combinación de simplificación y propagación. Cuando encuentra hechos duplicados, los elimina del almacén. Los duplicados pueden aparecer porque los almacenes de restricciones son conjuntos múltiples de hechos.

Dada la consulta

A leq B, B leq C, C leq A

Pueden producirse las siguientes transformaciones:

La regla de transitividad añade A leq C. Luego, al aplicar la regla de antisimetríaA leq C , y C leq Ase eliminan y se reemplazan por A = C. Ahora la regla de antisimetría se aplica a las dos primeras restricciones de la consulta original. Ahora se eliminan todas las restricciones de CHR, por lo que no se pueden aplicar más reglas, y A = B, A = Cse devuelve la respuesta: CHR ha inferido correctamente que las tres variables deben referirse al mismo objeto.

Ejecución de programas CHR

Para decidir qué regla debe "activarse" en un almacén de restricciones dado, una implementación de CHR debe usar algún algoritmo de coincidencia de patrones . Los algoritmos candidatos incluyen RETE y TREAT , [ 12 ] pero la mayoría de las implementaciones usan un algoritmo perezoso llamado LEAPS . [ 13 ]

La especificación original de la semántica de CHR era completamente no determinista, pero la denominada "semántica de operación refinada" de Duck et al. eliminó gran parte del no determinismo, de modo que los desarrolladores de aplicaciones pueden confiar en el orden de ejecución para el rendimiento y la corrección de sus programas. [ 5 ] [ 14 ]

La mayoría de las aplicaciones de CHR requieren que el proceso de reescritura sea confluente ; de ​​lo contrario, los resultados de la búsqueda de una asignación satisfactoria serán no deterministas e impredecibles. El establecimiento de la confluencia generalmente se realiza a través de las siguientes tres propiedades: [ 2 ]

  • Un programa CHR es localmente confluente si todos sus pares críticos son unibles .
  • Un programa CHR se considera terminante si no hay cálculos infinitos.
  • Un programa CHR que está terminando es confluente si todos sus pares críticos son unibles .

Véase también

Referencias

  1. Thom Frühwirth. Introducción a las reglas de simplificación . Informe interno ECRC-LP-63, ECRC Múnich, Alemania, octubre de 1991. Presentado en el taller Logisches Programmieren, Goosen/Berlín, Alemania, octubre de 1991 y en el taller sobre reescritura y restricciones, Dagstuhl, Alemania, octubre de 1991.
  2. 1 2 Thom Frühwirth. Teoría y práctica de las reglas de manejo de restricciones . Número especial sobre programación lógica con restricciones (P. Stuckey y K. Marriott, eds.), Journal of Logic Programming , vol. 37(1-3), octubre de 1998. doi : 10.1016/S0743-1066(98)10005-5
  3. Dahl, Veronica y J. Emilio Miralles. « Gramáticas de útero: resolución de restricciones para la inducción gramatical ». Actas del 9.º Taller sobre Reglas de Manejo de Restricciones. Informe técnico CW. Vol. 624. 2012.
  4. Alves, Sandra y Mário Florido. " Inferencia de tipos mediante reglas de manejo de restricciones ". Electronic Notes in Theoretical Computer Science 64 (2002): 56-72.
  5. 1 2 3 Sneyers, Jon; Van Weert, Peter; Schrijvers, Tom; De Koninck, Leslie (2009). "A medida que pasa el tiempo: Reglas de manejo de restricciones: una revisión de la investigación en CHR entre 1998 y 2007" (PDF) . Theory and Practice of Logic Programming . 10 : 1. arXiv : 0906.4474 . doi : 10.1017/S1471068409990123 . S2CID 11044594 . 
  6. Frühwirth, Thom (2009). Reglas de manejo de restricciones . Cambridge University Press. ISBN 978-0521877763.
  7. 1 2 Sneyers, Jon; Schrijvers, Tom; Demoen, Bart (2009). "El poder computacional y la complejidad de las reglas de manejo de restricciones" (PDF) . ACM Transactions on Programming Languages ​​and Systems . 31 (2): 1– 42. doi : 10.1145/1462166.1462169 . S2CID 2691882 . 
  8. "CHR: Biblioteca de reglas para el manejo de restricciones" . GitHub . 5 de septiembre de 2021.
  9. ^ Peter Van Weert ; Pieter Wuille; Tom Schrijvers; Bart Demoen. "CHR para idiomas anfitriones imperativos" . Reglas de manejo de restricciones: temas de investigación actuales . Saltador.
  10. "Convertidor de CHR2 a SQL" . GitHub . 15 de marzo de 2021.
  11. CHR.js - Un transpilador CHR para JavaScript
  12. Miranker, Daniel P. (13-17 de julio de 1987). «TREAT: Un algoritmo de mejor coincidencia para sistemas de producción de IA» (PDF) . AAAI'87: Actas de la sexta conferencia nacional sobre inteligencia artificial . Seattle, Washington: Asociación para el Avance de la Inteligencia Artificial, AAAI. págs. 42-47 . ISBN  978-0-262-51055-4.
  13. ^ Leslie De Koninck (2008). Control de ejecución de reglas de manejo de restricciones (PDF) (tesis doctoral). Universidad Católica de Lovaina . págs. 12 a 14. 
  14. Duck, Gregory J.; Stuckey, Peter J.; García de la Banda, María ; Holzbaur, Christian (2004). "The Refined Operational Semantics of Constraint Handling Rules" (PDF) . Logic Programming . Lecture Notes in Computer Science. Vol. 3132. pp. 90–104 . doi : 10.1007/978-3-540-27775-0_7 . ISBN   978-3-540-22671-0. Archivado del original (PDF) el 04-03-2011 . Consultado el 23-12-2014 .

Lecturas adicionales

  • Christiansen, Henning. " Gramáticas CHR ". Teoría y práctica de la programación lógica 5.4-5 (2005): 467-501.
  • Sitio web oficial
  • Bibliografía de CHR
  • La lista de correo de CHR
  • El sistema CHR de la KU Leuven
  • WebCHR: una interfaz web de CHR