Cap´ ıtulo 1

Algoritmo de unificaci´n de Robinson o

´ 1.0 Introduccion
Con objeto de encontrar el unificador de m´xima generalidad de dos t´rminos a e se han propuesto numerosos algoritmos siendo el m´s conocido el de Robinson. a El algoritmo de unificaci´n de Robinson data del a˜o 1965. o n La claridad del m´todo utilizado por el algoritmo lo hace muy util, tanto e ´ desde un punto de vista did´ctico como desde un punto de vista de implemena taci´n. o Vamos a exponer el m´todo en un cuadro general y posteriormente lo aplie caremos a varios ejemplos. Para la mejor comprensi´n del algoritmo damos unas nociones previas que o ser´n de utilidad. a

´ 1.1 Elementos para el algoritmo de unificacion
Entre los elementos que vamos a considerar se encuentran el llamado primer par de discordancia entre dos t´rminos, y la aparici´n de variables dentro de un e o t´rmino occur check (comprobaci´n de apariciones). e o

1.1.0 Primer par de discordancia
Tomemos dos t´rminos que no sean iguales. Eso significa que habr´ alguna e a diferencia entre ellos. Esta diferencia puede hallarse en el nombre del funtor, en el n´mero de argumentos, o en alguno de los argumentos. u Si la diferencia est´ en el nombre del funtor, el primer par de discordancia a es la pareja formada por los dos t´rminos. Si est´ en el n´mero de argumentos, e a u al igual que antes, el primer par de discordancia resulta ser el formado por los dos t´rminos considerados. e En cambio, si coinciden en los funtores y en el n´mero de argumentos, el u primer par de discordancia debe ser buscado entre sus argumentos empezando a considerar ´stos de izquierda a derecha. Se busca en el primer argumento, y e si aqu´ no lo hubiera, se busca en el segundo, . . . Es evidente que al final se ı debe encontrar este par de discordancia pues hemos partido de dos t´rminos e distintos. 1

Veamos un ejemplo. f (b.1 Sean los t´rminos e p(g(a. hemos dado una definici´n recursiva de lo que es un par de o discordancia. f (X. g(a. estar´ e a formado por esos dos t´rminos. el primer par de discordancia es b y X encontrados dentro del u segundo argumento como primer argumento. Cualquier algoritmo que realice la b´squeda del primer par de u discordancia debe primero asegurarse de que no est´ ante dos t´rminos iguales. consideramos inicialmente E0 = σ0 (E) y F0 = σ0 (F ). En cada iteraci´n k del algoritmo se realizan los siguientes pasos: o . X ) p(f (X .Algoritmo de unificaci´n de Robinson o Como se ve. Ejemplo Como conclusi´n podemos decir que siempre es posible encontrar un par de o discordancia entre dos t´rminos distintos y que. que vamos a realizar un proceso iterativo. Y ) como primer par de discordancia pues aplicando la definici´n o dada. f (b. b. Obs´rvese que no hemos tomado e f (b. no podemos encontrar el primer par o e de discordancia. c).1 La comprobacion de apariciones Con la comprobaci´n de apariciones (occur check) simplemente queremos deo tectar cu´ndo una variable aparece dentro de un t´rmino. La raz´n simplemente est´ en que es tedioso tener que buscar por cada o a argumento y dentro del mismo la aparici´n de una variable. que no cambia ninguna variable. Ejemplo 1. Dado o ıa. hemos de introducirnos en este argumento ya que coinciden sus funtores y n´mero de argumentos. Consideramos inicialmente e σ0 = {} una sustituci´n vac´ es decir. o Ejemplo 1. c). g(X)) p(a.2 1 .2 El algoritmo Sean E y F dos t´rminos que queremos unificar.0 Sean los t´rminos e p(a. Y )) pero no de los t´rminos p(a. e Ejemplo 1. u Ejemplo Un par de discordancia suele expresarse entre llaves. g(h(Z )) seg´n lo dicho. g(X. b. c). a). X)) e y q(X. Y ). As´ el par de discorı dancia del ejemplo anterior es {b. a)}. Z ) En este caso. o En cualquier caso. a e ´ 1. Ejemplo 1.1. b) y q(a. s´ la ofrece cuando o ı se intenta sistematizar este procedimiento. el primer par de discordancia es {g(a. Z. c) y f (X. f (X .2 La variable X se encuentra dentro de los t´rminos p(a. e S´lo cuando dos t´rminos son iguales. Veamos algunos ejemplos. s´lo se trata de eso. X}. b). Si bien desde un a e punto de vista formal esto no ofrece ninguna complicaci´n. en el peor de los casos.

Paso 2 D1 = {a. a) y F1 = e σ1 (F0 ) = p(a. Paso 2 Si Ek = Fk entonces se busca el primer par de discordancia entre Ek y Fk . Y ) y sea σ0 = {}. Consideremos tambi´n e E0 = p(a. a a e Veamos algunos ejemplos. Y ). Si esto no ocurre pasamos al siguiente paso. e Paso 5 Sea σ1 = {X/a}.1. X) y F0 = p(X. a).El algoritmo 3 Paso 1 Si Ek = Fk entonces las cl´usulas E y F son unificables y un unificador a de m´xima generalidad es σ = σk ◦ · · · ◦ σ0 . Paso 4 La variable Y no aparece en el t´rmino a. Ejemplo 1. Paso 3 En D1 uno es un t´rmino (a) y el otro una variable (Y ). Paso 2 D0 = {a. Vamos al paso 5. Sean tambi´n E1 = σ1 (E0 ) = p(a. Vamos e al paso 4. Vamos al paso 5. Vamos e al paso 4 Paso 4 La variable X no aparece en el t´rmino a. Paso 3 En D0 uno es un t´rmino (a) y el otro una variable (X). Sea esta sustituci´n σk+1 . X}. e Paso 4 Si la variable aparece en el t´rmino se produce un occur check por lo que e E y F no unifican y terminamos. X) y F = p(X. Sea ´ste Dk . e Paso 5 Sea σ2 = {Y /a}. . Adem´s. Sean tambi´n E2 = σ2 (E1 ) = p(a. el t´rmino Ek es el a a e t´rmino unificado. Y }. Si los e t´rminos no eran unificables terminar´ indic´ndolo as´ y si eran unificables dee a a ı volver´ un unificador de m´xima generalidad y el t´rmino resultante unificado. Y ) Iteraci´n 1 Desarrollamos para k = 0 o Paso 1 Como E0 = F0 vamos al paso 2. e Paso 3 Si Dk contiene una variable y un t´rmino (pueden ser dos variables y e una de ellas hace de t´rmino) pasamos al siguiente paso. Paso 5 Construimos una nueva sustituci´n que vincule la variable con el t´rmino o e de Dk . Vamos al paso 3.2 . Y ) aplicando el algoritmo paso a paso tenemos Sea E = p(a. Vamos al paso 3. Vamos al paso 1. Iteraci´n 2 Desarrollamos para k = 1 o Paso 1 Como E1 = F1 vamos al paso 2. Volvemos al paso 1. En otro caso los e t´rminos no son unificables y terminamos el proceso. X ) p(X . Este algoritmo siempre termina para dos t´rminos cualesquiera. Construimos ahora dos nuevos t´rminos o e Ek+1 = σk+1 (Ek ) y Fk+1 = σk+1 (Fk ) y volvemos al paso 1. a) y F2 = e σ2 (F1 ) = p(a. En este caso el proceso termina aqu´ e ı.3 Sean los t´rminos e p(a.

No unifican. Ejemplo Ejemplo 1. Paso 2 Par de discordancia D1 = {a. Vamos al paso 2. Vamos al paso 4. o Paso 1 E0 = F0 . Entonces: Iteraci´n 1 Para k = 0. Vamos al paso 2. Vamos al paso 1. o Paso 1 E1 = F1 . h(Y ). o Paso 1 E0 = F0 . Vamos al paso 1. h(Y )).Algoritmo de unificaci´n de Robinson o Iteraci´n 3 Desarrollamos para k = 2 o Paso 1 Como E2 = F2 el algoritmo termina con σ = σ2 ◦ σ1 ◦ σ0 = {X/a. Z. T )). Vamos al paso 3. h(g(Z))) y F = F0 = p(Z. Paso 3 T´rmino y variable. Vamos al paso 3. Paso 2 D0 = {Z. Sea E1 = p(a. Y ) y F = F0 = p(X. . h(Y )). Vamos al paso 1. Vamos al paso 3. f (g(Y ). o Paso 2 D1 = {X. h(g(a))) y sea F1 = p(a. Vamos al paso 2. o Paso 1 E1 = F1 . Vamos al paso 3. a}. b). Paso 3 Variable y termino. X. T ) y sea σ0 = {}. X. f (X. Sea E2 = p(a. Iteraci´n 2 Para K = 1. Iteraci´n 2 Desarrollamos para k = 1. Paso 2 D0 = {X. Sean E1 = σ1 (E0 ) = p(a. h(Y ). Paso 3 Variable y termino. Y ) y F1 = σ1 (F0 ) = p(a. b). Paso 3 atomo y funtor. Paso 4 No hay occur check. h(g(a))) y F2 = p(a. h(Y ). a}.Vamos al paso 5. Paso 4 No hay occur check. Paso 5 Sea σ1 = {Z/a}.4 Sean E = E0 = p(a. g(Y )}. Paso 5 Sea σ1 = {X/a}. f (a. Vamos al paso 4. Iteraci´n 1 Desarrollamos para k = 0. h(Y ). h(Y )}. Paso 5 Sea σ2 = {X/h(Y )}. Vamos al paso 5. Iteraci´n 3 Para k = 2. Sea σ0 = {}. f (g(Y ).5 Sean E = E0 = p(a. e Paso 4 No hay occur check. Vamos al paso 2. Vamos al paso 4. a Ejemplo Ejemplo 1.4 1 . h(Y )). Y /a} como unificador de m´xima generalidad.Vamos al paso 5. Z).

se comporta de una manera u otra. X . W . X ) p(X . X/h(g(a)). Hay sistemas Prolog que lo detectan y avisan del hecho. X ) p(t(a. g(X )) p(f (a). g(X )) p(Z . que permite visualizar los pasos del algoritmo de unificaci´n de Robinson (aur) o para dos t´rminos dados.4 El programa unifica. 1. t(X . y especialmente para SWI-Prolog. f (X )) p(f (a). g(a)}. si se presenta. Y /g(a)}.Algoritmo de unificacion en Prolog Paso 1 E2 = F2 . h(g(a)).3 Algoritmo de unificacion en Prolog El algoritmo de unificaci´n que utiliza Prolog es b´sicamente igual al aqu´ o a ı descrito excepto que no dispone del Paso 4. X ) p(Y . Vamos al paso 2.3 . siguiendo el algoritmo de Robinson los siguientes t´rminos: e p(a. g(Y ). no es habitual encontrar situaciones que deriven en programas donde se produzcan occur checks. b))) p(t(X . 5 Paso 5 Sea σ3 = {Y /g(a)}. h(g(a))). Unifican. g(Z ). h(g(a))) y sea F3 = p(a. dependiendo de la implementaci´n de Proo log. X ) p(X . Esto quiere decir que no verifica nunca el occur check. h(g(a)). o Paso 1 E3 = F3 .pl Este es un programa escrito en Prolog. Z ) p(Y . Z ) ´ 1. Ejemplo Ejercicio 1. Sea E3 = p(a. Y ) p(t(X . e . En cualquier caso. Vamos al paso 3. La raz´n de prescindir de este paso es por cuesti´n de o o eficiencia ya que la comprobaci´n de occur check consume demasiado tiempo. Paso 3 Variable y termino. Vamos al paso 4. y otros que simplemente dejan de funcionar.´ 1. Iteraci´n 4 Para k = 3. g(Z )) p(f (a). y o hay que realizarla muchas veces. t(X . Paso 2 D2 = {Y. Por otro lado. Z ))) p(f (Z ). b) p(Y . t(Z . Z )) p(t(a. b))) p(X . f (f (X ))) p(a. Y ) p(Y . f (Z )) p(Y .Vamos al paso 5. Vamos al paso 1. Paso 4 No hay occur check. El algoritmo para aqu´ y la sustituci´n ı o completa es σ = {Z/a. f (Y )) p(Y .6 Unificar. si es posible.

En la figura 1. − > Unificaci´ n paso a paso o fin. − > Fin del programa ayuda. ALGORITMO DE UNIFICACION PASO A PASO ==================================== Term1 = Term2.0 se muestra un ejemplo de ejecuci´n. en el int´rprete y nos o e muestra un s´ ımbolo de entrada de datos aur> adem´s de unos comentarios que a aclaran su uso: ? − aur . o .Algoritmo de unificaci´n de Robinson o Para su ejecuci´n hay que escribir simplemente aur. − > Esta ayuda aur > Para ver los pasos de una unificaci´n simplemente hay que escribir los dos o t´rminos a unificar separados por un s´ e ımbolo de igualdad y terminado en punto.6 1 .

OK Paso 5 : Sigma1 = {Z /f (X )} E 1 = p(f (X ). a) F 1 = p(f (X ).0: Ejemplo uso del programa .1. a) F 2 = p(f (a). f (X )} Paso 3 : Variable y termino.pl 7 aur > p(f (X ). X ) Iteraci´ n 2 o Paso 1 : Son distintos E 1 = p(f (X ). OK Paso 5 : Sigma2 = {X /a} E 2 = p(f (a). OK Paso 4 : No hay occur check . a} Paso 3 : Variable y termino. E 0 = p(f (X ).El programa unifica. a) F 1 = p(f (X ).4 . a) = p(Z . X ). X ) Iteraci´ n 1 o Paso 1 : Son distintos E 0 = p(f (X ). X /a} − − − − − − − −− > Unifican Term1 = Term2. X ) Paso 2 : Par de discordancia D1 = {X . OK Paso 4 : No hay occur check . − > Unificaci´ n paso a paso o fin. a) F 2 = p(f (a). a) F 0 = p(Z . a) Iteraci´ n 3 o Paso 1 : Son iguales E 2 = p(f (a). − > Esta ayuda aur > Figura 1. X ) Paso 2 : Par de discordancia D0 = {Z . a) Sigma = {Z /f (a). − > Fin del programa ayuda. a) F 0 = p(Z .

Sign up to vote on this title
UsefulNot useful