Articulo de referencia

Se produce una comprobación

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 s...

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 Prologincógnita=F(incógnita){\displaystyle X=f(X)} 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 ].(incógnitay.pag(incógnita,y))(yincógnita.pag(incógnita,y)){\displaystyle (\forall x\exists yp(x,y))\rightarrow (\exists y\forall xp(x,y))}: la negación de esa fórmula tiene la forma normal conjuntivapag(incógnita,F(incógnita))¬pag(gramo(Y),Y){\displaystyle p(X,f(X))\land \lnot p(g(Y),Y)}, conF{\displaystyle f}ygramo{\displaystyle g}que denotan la función de Skolem para el primer y segundo cuantificador existencial, respectivamente. Sin ocurre la comprobación, los literalespag(incógnita,F(incógnita)){\displaystyle p(X,f(X))}ypag(gramo(Y),Y){\displaystyle p(g(Y),Y)}son unificables, produciendo la cláusula vacía refutatoria.

Ciclo por omitido ocurre verificación

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 t1{\displaystyle t_{1}}con términot2{\displaystyle t_{2}} se reduce en muchos casos de O(tamaño(t1)+tamaño(t2)){\displaystyle O({\text{tamaño}}(t_{1})+{\text{tamaño}}(t_{2}))} a O(min(tamaño(t1),tamaño(t2))){\displaystyle O({\text{min}}({\text{tamaño}}(t_{1}),{\text{tamaño}}(t_{2})))}; en el caso frecuente de unificación de términos variables, el tiempo de ejecución se reduce a O(1){\displaystyle O(1)}. [ 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.doonortes(incógnita,y)=¿doonortes(1,doonortes(incógnita,doonortes(2,y))){\displaystyle cons(x,y){\stackrel {?}{=}}cons(1,cons(x,cons(2,y)))}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

  1. Algunos manuales de Prolog afirman que la complejidad de la unificación sin comprobación de ocurrencias es O(min(tamaño(t1),tamaño(t2))){\displaystyle O({\text{min}}({\text{tamaño}}(t_{1}),{\text{tamaño}}(t_{2})))}(en todos los casos). [ 3 ] Esto es incorrecto, ya que implicaría comparar términos fundamentales arbitrarios en tiempo constante (al unificarmiq(t1,t2){\displaystyle eq(t_{1},t_{2})}conmiq(incógnita,incógnita){\displaystyle eq(X,X)}).

Referencias

  1. David A. Duffy (1991). Principios de la demostración automatizada de teoremas . Wiley.; aquí: pág. 143
  2. De manera informal y tomandopag(incógnita,y){\displaystyle p(x,y)}Para 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. "
  3. 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 .
  4. A. Colmerauer (1982). KL Clark; S.-A. Tarnlund (eds.). Prolog y árboles infinitos . Academic Press.
  5. MH van Emden; JW Lloyd (1984). "Una reconstrucción lógica de Prolog II". Journal of Logic Programming . 2 : 143–149 .
  6. 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 .
  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 .
  8. 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.
  9. Joxan Jaffar (1984), "Unificación eficiente sobre términos infinitos", Computación de nueva generación
  10. 7.3.4 Unificación normal en Prolog de ISO/IEC 13211-1:1995.
  11. 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 .
  12. Thomas Prokosch; François Bry (2020). Unificación en marcha (PDF) . 34.º Taller Internacional sobre Unificación. pp. 13:1–13:5.