Unificación (ciencias de la computación)

De testwiki
Ir a la navegación Ir a la búsqueda

En lógica y en ciencias de la computación, la unificación es un proceso algorítmico para resolución de ecuaciones con expresiones simbólicas.

Se pueden determinar diferentes esquemas de unificación dependiendo de: qué expresiones (también llamadas términos) están permitidas en un conjunto de ecuaciones (también llamado problema de unificación), y de cuáles expresiones son consideradas homólogas. Si variables de orden superior, esto es, variables que representan funciones, son permitidas en una expresión, el proceso es llamado unificación de orden superior, si no se llama unificación de primer orden. Si una solución requiere hacer ambos lados de cada ecuación literalmente iguales entonces el proceso se llama sintáctico o unificación libre, de lo contrario semántico o unificación ecuacional, o E-Unificación o teoría de unificación modular.

Una solución de un problema de unificación se denota como una sustitución, esto es, un mapeo asignando un valor simbólico a cada una de las variables en las expresiones del problema. Un algoritmo de unificación debe calcular un conjunto de sustituciones completo y mínimo para un problema dado; esto es, un conjunto que cubra todas las soluciones y que no contenga miembros redundantes. De acuerdo con el marco de referencia, un conjunto de sustituciones completo y mínimo puede que tenga a lo más un miembro, a lo sumo una cantidad finita, o posiblemente infinito número de miembros, o no tener ninguno del todo.[note 1][1] En algunos marcos de referencia es generalmente imposible decidir siquiera si existe alguna solución. Para unificaciones sintácticas de primer orden, Martelli y Montanari[2] brindaron un algoritmo que reporta insolubilidd o calcula un conjunto completo y mínimo de sustituciones unitario que contiene el así llamado unificador más general.

Por ejemplo, usando x,y,z como variables, el conjunto de ecuaciones unitario { cons(x,cons(x,nil)) = cons(2,y) } es un problema de unificación sintáctico de primer orden que tiene la sustitución { x ↦ 2, ycons(2,nil) } como única solución. El problema de unificación sintáctico de primer orden { y = cons(2,y) } no tiene solución en el conjunto finite terms; sin embargo, tiene una solución única { ycons(2,cons(2,cons(2,...))) } en el conjunto de árboles infinitos. El problema de unificación semántica de primer orden { ax = xa } tiene cualquier sustitución de la forma { xa⋅...⋅a } como solución en un semigrupo, en otras palabras, si (⋅) es asociativa; el mismo problema, visto en un grupo abeliano donde (⋅) también es considerada conmutativa, tiene cualquier sustitución como una solución. El conjunto unitario { a = y(x) } es un problema de unificación sintáctico de segundo orden dado que y es una variable que representa una función. Una solución es { xa, y ↦ (función identidad) }; otra solución es { y ↦ (función constante asociando cada valor con a), x(cualquier valor) }.

Los algoritmos de unificación fueron descubiertos por Jacques Herbrand,[3][4][5] pero la primera investigación formal puede ser atribuida a John Alan Robinson,[6][7] quien utilizó unificación sintáctica de primer orden como base en su procedimiento de resolución de lógica de primer orden, un gran paso adelante en la tecnología de razonamiento automatizado al eliminar una de las fuentes de explosión combinatoria: la búsqueda de instanciación de términos. El razonamiento automático es todavía el área donde la unificación es aplicada mayormente. Unificación sintáctica de primer orden es usada en programación lógica y en la implementación de lenguajes de programación que usan tipos, especialmente en algoritmos de inferencia de tipos basados en Hindley–Milner. Unificación semántica es utilizada en solucionadores de satisfacibilidad módulo (SMT por las siglas en inglés), algoritmos para la conversión de términos (reescritura de términos) y en análisis de protocolos criptográficos. Unificación de orden superior es utilizado en asistentes para la demostración de teoremas, por ejemplo Isabelle and Twelf, y formas restringidas de unificación de orden superior (unificación de patrones de nivel orden superior) son utilizadas en la implementación de algunos lenguajes de programación, tales como lambdaProlog, porque pese a que los patrones de orden superior son expresivos, su procedimiento de unificación asociado conserva propiedades teóricas más cercanas a la unificación de primer orden.

Definiciones formales comunes

Prerrequisitos

Formalmente, un enfoque de unificación presupone:

  • Un conjunto infinito V de variables. Para unificación de orden superior es conveniente escoger un V diferente de un conjunto de variables ligadas en expresiones lambda.
  • Un conjunto T de términos tales que VT. Para unificaciones de primer orden y unificaciones de orden superior, T es usualmente el conjunto de términos de primer orden (términos construidos con variables y funciones) para el primero y términos Lambda (términos con algunas variables de orden superior) para el segundo.
  • Un mapeo vars: T (V), asignando a cada término t el conjunto vars(t)V de variables libres en t.
  • Una relación de equivalencia on T, indicando que términos son considerados iguales. En unificación de orden superior, usualmente tu si t y u son alpha equivalentes. En E-Unificación de primer orden, refleja el conocimiento previo sobre ciertas funciones; por ejemplo, si es considerado conmutativo, tu si u es el resultado de t intercambiando los argumentos de con algunas (posiblemente todas) las ocurrencias.[note 2] Si no hay conocimiento previo del todo, entonces solo términos literalmente, o sintácticamente, idénticos son considerados iguales; en este caso, ≡ es llamado teoría libre (porque es un objeto libre), teoría vacía (porque el conjunto de sentencias, o el conocimiento previo, está vacío), o teoría de constructores (porque todas las funciones solo crean términos de datos, en lugar de operaciones en ellos).

Término de primer orden

Dado un conjunto V de variables, un conjunto C de constantes y varios conjuntos Fn de n funciones, también llamados operadores, por cada número natural n1, el conjunto de términos (de primero orden sin clasificar) T se define recursivamente como el conjunto más pequeño con las siguientes propiedades:[8]

  • Cada variable es un término: VT,
  • Cada constante es un término: CT,
  • A partir de cada n términos t1,...tn, y cada n función fFn, se puede crear un término más grande f(t1,...,tn).

Por ejemplo, si xV es una variable, 1C es una constante, y addF2 es una función binaria, entonces xT,1T, y (por lo tanto) add(x,1)T por la primera, segunda y tercera regla de construcción de términos respectivamente. El último término se escribe usualmente como x+1, usando notación using notación de infijo y por conveniencia se utiliza el símbolo + que es un operador más común.

Términos de orden superior

Plantilla:AP

Sustitución

Sustitución es un mapeo σ:VT desde variables hacia terms; la notación {x1t1,...,xktk} se refiere a una sustitución mapeando cada variable xi con el término ti, para i=1,...,k, y cada otra variable consigo misma. Aplicar esa sustitución a un término t se escribe utilizando notación de posfijo: t{x1t1,...,xktk}; que significa reemplazar (simultáneamente) cada ocurrencia la variable xi en el término t con ti. El resultado tτ de haber aplicado una sustitución τ a un término t se llama una instancia de ese término t. Un ejemplo de primer orden, aplicando la sustitución Plantilla:Math} al término

f( x ,a,g( z ),y)
resulta en  
f( h(a,y) ,a,g( b ),y).

Generalización, especialización

Si un término t tiene una instancia equivalente a un término u, esto es, si tσu por alguna sustitución σ, entonces se dice que t es más general que u, y que u es más especial que, o subsumido por, t. Por ejemplo, xa es más general que ab si ⊕ es conmutativa, considerando que (xa){xb}=baab.

Si ≡ es una identidad literal (sintáctica) de términos, un término puede ser más general o más especial que otro solo si ambos términos difieren solo en sus nombres de variable, no en su estructura sintáctica; tales términos se denominan variantes o renombramientos entre sí. Por ejemplo,

f(x1,a,g(z1),y1) es una variante de f(x2,a,g(z2),y2), dado que

f(x1,a,g(z1),y1){x1x2,y1y2,z1z2}=f(x2,a,g(z2),y2)

y

f(x2,a,g(z2),y2){x2x1,y2y1,z2z1}=f(x1,a,g(z1),y1).

Sin embargo, f(x1,a,g(z1),y1) no es una variante de f(x2,a,g(x2),x2), dado que no existe una sustitución que devuelva el primer término a partir del segundo. El último término es, por consiguiente, más especial que el primer término.

Para una arbitraria, un término puede ser más general o más específico que un término estructuralmente diferente. Por ejemplo, si ⊕ es idempotente, esto es, si siempre xxx, entonces el término xy es más general que z,[note 3] y viceversa,[note 4] a pesar de que xy y z tienen una estructura diferente.

Una sustitución σ es más especial que, o subsumida por, una sustitución τ si tσ is más especial que tτ para cada término t. Se dice también que τ es más general que σ. Por ejemplo {xa,ya} es más especial que τ={xy}, pero σ={xa} no lo es, porque f(x,y)σ=f(a,y) no es más especial que f(x,y)τ=f(y,y).[9]

Problema de unificación, conjunto de soluciones

Un problema de unificación es un conjunto finito Plantilla:Math} de ecuaciones potenciales, donde Plantilla:Math. Una sustitución σ es una solución de este problema si Plantilla:Math para i=1,...,n. Tal sustitución se llama también un unificador del problema de unificación. Por ejemplo, if ⊕ is asociativa, el problema de unificación { xaax } tiene las soluciones {xa}, {xaa}, {xaaa}, etc., mientras que el problema { xaa } no tiene solución.

Para un problema de unificación dado, se dice que un conjunto S de unificadores es completo si cada solución es subsumida por alguna sustitución σ ∈ S; el conjunto S es llamado mínimo si ninguno de sus miembros subsume algún otro.

Unificación sintáctica de términos de primer orden

Diagrama esquemático triangular de la unificación sintáctica de términos t1 and t2 mediante sustitución σ

Unificación sintáctica de términos de primer orden es el esquema de unificación más utilizado. Está basado en T siendo este un conjunto de términos de primer orden (sobre un conjunto dado V de variables, C de constantes y Fn de n funciones) y en que ≡ es una igualdad sintáctica. En este esquema, cada problema de unificación Plantilla:Math} que tenga solución tiene un conjunto de soluciones unitario Plantilla:Math} que es completo y obviamente mínimo. El miembro Plantilla:Mvar es llamado unificador más general (mgu por sus siglas en inglés[NT 1]) del problema. Los términos izquierdo y derecho de cada ecuación potencial se vuelven sintácticamente iguales cuando se aplica el mgu, por ejemplo Plantilla:Math. Cualquier unificador del problema es subsumido[note 5] por el mgu Plantilla:Mvar. El mgu es único: si S 1 y S 2 son conjuntos de soluciones completos y mínimos del mismo problema de unificación sintáctica, entonces S 1 = { σ 1 } y S 2 = { σ 2 } para algunas sustituciones Plantilla:Math y Plantilla:Math y Plantilla:Math es una variante de Plantilla:Math para cada variable x que ocurra en el problema.

Por ejemplo, el problema de unificación { xz, yf(x) } tiene un unificador { xz, yf(z) }, porque

x { xz, yf(z) } = z = z { xz, yf(z) } , y
y { xz, yf(z) } = f(z) = f(x) { xz, yf(z) } .

Este es también el unificador más general. Otros unificadores para el mismo problema son { xf(x1), yf(f(x1)), zf(x1) }, { xf(f(x1)), yf(f(f(x1))), zf(f(x1)) }, y así sucesivamente; hay una cantidad infinita de unificadores similares.

Otro ejemplo, el problema g(x,x) ≐ f(y) no tiene solución con respecto a ≡ como identidad literal, ya que cualquier sustitución aplicada al lado izquierdo y derecho mantendrá la g y la f más externas, respectivamente, y los términos con diferentes símbolos de función más externos son sintácticamente diferentes.

Un algoritmo de unificación

Plantilla:Quote box El primer algoritmo dado por Robinson (1965) era bastante ineficiente; cf. box. Luego hubo un algoritmo más eficiente originado en Martelli, Montanari (1982).[note 6] Este documento también enlista otros intentos previos para encontrar un algoritmo de unificación sintáctica más eficiente,[10][11][12][13][14][15] y afirma que los algoritmos de tiempo lineal fueron descubiertos independientemente por Martelli, Montanari (1976)[12] y Paterson, Wegman (1978).[13]Plantilla:Refn

Dado un conjunto finito G={s1t1,...,sntn} de ecuaciones potenciales, el algoritmo aplica reglas para transformarlo en un conjunto de ecuaciones equivalentes, de la forma { x1u1, ..., xmum } donde x1, ..., xm son variables diferentes y u1, ..., um son términos que no contienen a ninguna de las xi. Un conjunto de esta forma puede ser una sustitución. Si no hay solución el algoritmo termina con ⊥; otros autores usan "Ω", "{}", o "fallo". La acción de sustituir todas las ocurrencias de x en un problema G con el término t se denota G {xt}. Por simplicidad, las constantes se Para simplificar, los símbolos constantes se consideran símbolos de función que tienen cero argumentos.

G{tt} G     borrar
G{f(s0,...,sk)f(t0,...,tk)} G{s0t0,...,sktk}     descomponer
G{f(s0,,sk)g(t0,...,tm)} if fg or km     conflicto
G{f(s0,...,sk)x} G{xf(s0,...,sk)}     intercambio
G{xt} G{xt}{xt} if x∉vars(t) and xvars(G)     eliminar[note 7]
G{xf(s0,...,sk)} if xvars(f(s0,...,sk))     check

Revisión de ocurrencia

El intento de unificar una variable x con un término que contenga x como un subtérmino estricto xf(..., x, ...) podría generar un término infinito como solución de para x, dado que x puede aparecer como un subtérmino de sí mismo. La ecuación xf(..., x, ...) no tiene solución en el conjunto finito de términos de primer orden definido arriba; puesto que la regla de eliminación solo puede ser aplicada si xvars(t). La revisión de ocurrencia es omitida en la mayoría de los sistemas Prolog porque hace que el algoritmo se vuelva lento.

Prueba de finalización

Para la prueba de finalización del algoritmo, considere un triple nvar,nlhs,neqn donde Plantilla:Math es el número de variables que ocurren más de una vez en el conjunto de ecuaciones, Plantilla:Math es el número de símbolos de función y constantes en el lado izquierdo de las ecuaciones potenciales, y Plantilla:Math es el número de ecuaciones. Cuando se aplica la regla eliminar, Plantilla:Math disminuye, ya que x se elimina de G y permanece solo en {xt}. La aplicación de cualquier otra regla nunca puede aumentar Plantilla:Math nuevamente. Cuando se aplica la regla descomponer, conflicto o intercambio, Plantilla:Math disminuye, ya que por lo menos desaparece la "f" más externa del lado izquierdo. La aplicación de cualquiera de las reglas restantes eliminar o revisar no puede aumentar Plantilla:Math, pero disminuye Plantilla:Math. Por lo tanto, cualquier aplicación de las reglas disminuye el triple nvar,nlhs,neqn con respecto al orden lexicográfico, que es posible solo un número finito de veces.

Conor McBride observa[16] que "expresando la estructura que explota la unificación" en un lenguaje tipo dependiente como Epigram, el algoritmo de John Alan Robinson se puede hacer recursivo en el número de variables, en cuyo caso una prueba de finalización separada se vuelve innecesaria.

Ejemplos de unificación sintáctica de términos de primer orden

En la convención sintáctica de Prolog, un símbolo que comienza con una letra mayúscula es un nombre de variable; un símbolo que comienza con una letra minúscula es un símbolo de función; la coma se utiliza como operador lógico "and". Para la notación matemática, "x,y,z" se utilizan como variables, "f,g" como símbolos de función y "a,b" como constantes.

Notación Prolog Notación Matemática Sustitución Explicación
a = a { a = a } {} Exitoso. (tautología)
a = b { a = b } a y b no coinciden
X = X { x = x } {} Exitoso. (tautología)
a = X { a = x } { xa } x es unificada con la constante a
X = Y { x = y } { xy } x e y son seudónimos
f(a,X) = f(a,b) { f(a,x) = f(a,b) } { xb } símbolos de función y de constante coinciden, x es unificada con la constante a
f(a) = g(a) { f(a) = g(a) } f y g no coinciden
f(X) = f(Y) { f(x) = f(y) } { xy } x e y son seudónimos
f(X) = g(Y) { f(x) = g(y) } f y g no coinciden
f(X) = f(Y,Z) { f(x) = f(y,z) } Fallo. Los símbolos de función f tienen diferente cantidad de argumentos
f(g(X)) = f(Y) { f(g(x)) = f(y) } { yg(x) } Unifica y con el término g(x)
f(g(X),X) = f(Y,a) { f(g(x),x) = f(y,a) } { xa, yg(a) } Unifica x con la constante a, y y con el término g(a)
X = f(X) { x = f(x) } debe ser ⊥ Retorna ⊥ en lógica de primer orden y en varios dialectos modernos de Prolog (enforzado por la revisión de ocurrencia).

Exitoso en Prolog tradicional y en Prolog II, unificación de x con un término infinito x=f(f(f(f(...)))).

X = Y, Y = a { x = y, y = a } { xa, ya } Ambos x y y son unificados con la constante a
a = Y, X = Y { a = y, x = y } { xa, ya } Tal como se muestra arriba (no importa el orden de las ecuaciones en el conjunto)
X = a, b = X { x = a, b = x } Falla. a y b no coinciden, por lo tanto x no se puede unificar con ninguno de los dos
Dos términos con un árbol exponencialmente más grande para su instancia menos común. Su representación gda (dag en inglés) es de tamaño linear (parte naranja a la derecha).

El unificador más general de un problema de unificación sintáctica de primer orden de tamaño Plantilla:Mvar puede tener un tamaño de Plantilla:Math. Por ejemplo, el problema (((a*z)*y)*x)*ww*(x*(y*(z*a))) tiene el unificador más general za,ya*a,x(a*a)*(a*a),w((a*a)*(a*a))*((a*a)*(a*a)), cf. imagen. Para evitar la complejidad de tiempo exponencial causada por tal explosión, los algoritmos de unificación avanzados trabajan con Grafo acíclico dirigido s (gad) en lugar de árboles.Plantilla:Refn

Notas

Plantilla:Reflist

Notas de traducción

Plantilla:Reflist

Referencias

Plantilla:Reflist

Plantilla:Control de autoridades


Error en la cita: Existen etiquetas <ref> para un grupo llamado «note», pero no se encontró la etiqueta <references group="note"/> correspondiente.

  1. Plantilla:Cite journal
  2. Plantilla:Cite journal
  3. J. Herbrand: Recherches sur la théorie de la démonstration. Travaux de la société des Sciences et des Lettres de Varsovie, Class III, Sciences Mathématiques et Physiques, 33, 1930.
  4. Plantilla:Cite report Here: p.56
  5. Plantilla:Cite thesis Here: p.96-97
  6. Plantilla:Cite journal; Here: sect.5.8, p.32
  7. Plantilla:Cite journal
  8. Plantilla:Cite book; here: Sect.1.3
  9. K.R. Apt. "From Logic Programming to Prolog", p. 24. Prentice Hall, 1997.
  10. Plantilla:Cite report
  11. Plantilla:Cite thesis
  12. 12,0 12,1 Plantilla:Cite report
  13. 13,0 13,1 Plantilla:Cite journal
  14. Plantilla:Cite book
  15. Plantilla:Cite journal
  16. Plantilla:Cite journal


Error en la cita: Existen etiquetas <ref> para un grupo llamado «NT», pero no se encontró la etiqueta <references group="NT"/> correspondiente.