En informática , la comprobación de ocurrencias forma parte de los algoritmos de unificación sintáctica . Provoca que la unificación de una variable V y una estructura S falle si S contiene a V.
Aplicación en la demostración de teoremas
En la demostración de teoremas , la unificación sin la comprobación de ocurrencias puede conducir a una inferencia errónea . Por ejemplo, el objetivo de Prolog tendrá éxito, vinculando X a una estructura cíclica que no tiene contraparte en el universo de Herbrand . Como otro ejemplo, [ 1 ] sin verificación de ocurrencias, se puede encontrar una prueba de resolución para el no-teorema [ 2 ].: la negación de esa fórmula tiene la forma normal conjuntiva, conyque denotan la función de Skolem para el primer y segundo cuantificador existencial, respectivamente. Sin ocurre la comprobación, los literalesyson unificables, produciendo la cláusula vacía refutatoria.

Unificación de árboles racionales
Las implementaciones de Prolog suelen omitir la comprobación de ocurrencias por razones de eficiencia, lo que puede conducir a estructuras de datos circulares y bucles. Al no realizar la comprobación de ocurrencias, la complejidad del peor caso de unificar un término con término se reduce en muchos casos de a ; en el caso frecuente de unificación de términos variables, el tiempo de ejecución se reduce a . [ nb 1 ]
Las implementaciones, basadas en el Prolog II de Colmerauer, [ 4 ] [ 5 ] [ 6 ] [ 7 ] utilizan la unificación de árboles racionales para evitar bucles. Sin embargo, es difícil mantener la complejidad temporal lineal en presencia de términos cíclicos. Se pueden construir fácilmente ejemplos donde el algoritmo de Colmerauer se vuelve cuadrático [ 8 ] .
El trabajo de Jaffar de 1984 propuso un refinamiento basado en técnicas de unión-búsqueda, [ 9 ] reduciendo efectivamente la complejidad del peor caso a un tiempo casi lineal. Los sistemas modernos, incluidos SWI-Prolog, SICStus Prolog , Scryer Prolog y Ciao Prolog, parecen implementar variantes de este enfoque.
Consulte la imagen para ver un ejemplo de ejecución del algoritmo de unificación que se presenta en Unificación (informática)#Un algoritmo de unificación , que intenta resolver el objetivo.Sin embargo, sin la regla de verificación de ocurrencias (llamada "check" allí); aplicar la regla "eliminar" en su lugar conduce a un gráfico cíclico (es decir, un término infinito) en el último paso.
Unificación del sonido
Las implementaciones de Prolog ISO tienen el predicado incorporado unify_with_occurs_check/2 para la unificación correcta, pero son libres de usar algoritmos incorrectos o incluso en bucle cuando se invoca la unificación de otra manera, siempre que el algoritmo funcione correctamente para todos los casos que "no están sujetos a la comprobación de ocurrencias" (NSTO). [ 10 ] El predicado incorporado acyclic_term/1 sirve para comprobar la finitud de los términos.
Las implementaciones que ofrecen una unificación sólida para todas las unificaciones son Qu-Prolog y Strawberry Prolog y (opcionalmente, mediante un indicador de tiempo de ejecución): XSB , SWI-Prolog , CxProlog , Tau Prolog , Trealla Prolog y Scryer Prolog . Una variedad [ 11 ] [ 12 ] de optimizaciones puede hacer factible la unificación sólida para casos comunes.
Véase también
WP Weijland (1990). "Semántica para programas lógicos sin comprobación de ocurrencia" . Theoretical Computer Science . 71 : 155–174 . doi : 10.1016/0304-3975(90)90194-m .
Notas
Referencias
- ↑ David A. Duffy (1991). Principios de la demostración automatizada de teoremas . Wiley.; aquí: pág. 143
- ↑ De manera informal y tomandoPara decir, por ejemplo, " x ama a y ", la fórmula dice: " Si todo el mundo ama a alguien, entonces debe existir una sola persona que sea amada por todos. "
- ↑ F. Pereira; D. Warren; D. Bowen; L. Byrd; L. Pereira (1983). Manual del usuario de C-Prolog, versión 1.2 (Informe técnico). SRI International . Consultado el 21 de junio de 2013 .
- ↑ A. Colmerauer (1982). KL Clark; S.-A. Tarnlund (eds.). Prolog y árboles infinitos . Academic Press.
- ↑ MH van Emden; JW Lloyd (1984). "Una reconstrucción lógica de Prolog II". Journal of Logic Programming . 2 : 143–149 .
- ↑ Joxan Jaffar; Peter J. Stuckey (1986). "Semántica de la programación lógica de árboles infinitos" . Theoretical Computer Science . 46 : 141–158 . doi : 10.1016/0304-3975(86)90027-7 .
- ↑ B. Courcelle (1983). "Propiedades fundamentales de los árboles infinitos" . Theoretical Computer Science . 25 (2): 95– 169. doi : 10.1016/0304-3975(83)90059-2 .
- ↑ Albertro Martelli; Gianfranco Rossi (1984). Unificación eficiente con términos infinitos en programación lógica (PDF) . Conferencia Internacional sobre Sistemas Informáticos de Quinta Generación.
- ↑ Joxan Jaffar (1984), "Unificación eficiente sobre términos infinitos", Computación de nueva generación
- ↑ 7.3.4 Unificación normal en Prolog de ISO/IEC 13211-1:1995.
- ↑ Ritu Chadha; David A. Plaisted (1994). "Corrección de la unificación sin comprobación de ocurrencia en prolog" . The Journal of Logic Programming . 18 (2): 99– 122. doi : 10.1016/0743-1066(94)90048-5 .
- ↑ Thomas Prokosch; François Bry (2020). Unificación en marcha (PDF) . 34.º Taller Internacional sobre Unificación. pp. 13:1–13:5.
- Demostración automatizada de teoremas
- Programación lógica
- Estructuras de programación
- Unificación (informática)