Sistemas de Reescritura Cristóbal Domínguez González Jorge García de la Nava Ruiz Michel Piliougine Rocha Miguel Ángel Rico Blanco 13 de Marzo del 2001 PROGRAMACIÓN DECLARATIVA II
Introducción Comenzamos con conceptos ya estudiados anteriormente. Entre estos conceptos tenemos los siguientes: -Ecuaciones matemáticas -Haskell -Prolog -lambda-calculo -Maquina de Turing Para las ecuaciones matemáticas lo que nos interesa es ver como se aplica la igualdad para reducir expresiones complejas en otras mas simples para realizar un computo. La utilización de estas igualdades es muy ambigua, no sabemos que ecuación aplicar ni sobre que expresión, ni en que orden... De modo que un humano puede hacerlo de manera intuitiva, pero un computador no tiene esta habilidad. El caso de Haskell plantea, frente a las ecuaciones, una simplificación importante: la unidireccionalidad de sus reglas. Aunque no elimina otros problemas como la elección de la subexpresión o el de elección de la regla a aplicar. Cambia el resultado final según el orden de aplicación la regla? y según la subexpresión? Con Prolog tenemos dos variantes sobre los apartados anteriores: la unificación, que es una sustitución en ambos sentidos y el backtracking, que permite calcular distintos resultados para una misma expresión. Si se prohíbe la unificación y el backtracking, tenemos un sistema de reescritura puro. Si permiten, no obtenemos un sistema de reescritura puro, sino que habría que incluir elementos extras que simulen estas características. El lambda-calculo es un sistema particular de reescritura y ya se ha estudiado en esta asignatura. Este documento generaliza muchos de los resultados del lambda-calculo y, en cierta manera, justificarlos en una teoría mas amplia y abstracta. Dado que el lambda-calculo es un modelo de computación, cualquier otro modelo de computación será equivalente. En particular las maquinas de Turing, en las cuales si tomamos como expresión su configuración obtenemos un sistemas de reescritura de configuraciones basado en la tabla de estados de la maquina, que harían la función de reglas. Esto es extensible a el caso determinista e indeterminista ya que son equivalentes. Como caso particular de un modelo de computación tenemos la ejecución de un programa en un computador real, que podría ser visto como un sistema de reescritura del contenido de la memoria. Finalizando, un sistema de escritura, desde el punto de vista mas abstracto, puede ser visto como un grupo de relaciones (reglas) sobre un conjunto. Dependiendo de estas reglas y de este conjunto tendremos sistemas de reescritura particulares.
Sistemas abstractos de reescritura, propiedades y relaciones entre ellas. Definición Sea un Sistema Abstracto de Reescritura definido de la forma siguiente = (A,( R1, R2, Rn)), donde A es un conjunto sobre el que se dan la relaciones de reescritura o reducción R1, R2,.. Rn Supongamos definida sobre A la relación de igualdad = como nosotros la conocemos, en ambos sentidos. Usaremos la siguiente notación. R = R * = -1 = (Inversa) + (Cierre Transitivo) = (Cierre Reflexivo) = R según la relación R (relación de convertibilidad) Veamos que = R es de equivalencia dada la siguiente definición: a R b a = R b (Definición y Simétrica) a = R b b = R a (Reflexiva) a = R b b = R c a = R c (Transitiva) OTRAS DEFINICIONES. â es forma normal b : b A : â b. b A tiene forma normal â : â A : b â y â es esa forma normal. Usaremos la notación â para indicar que a es forma normal. Débilmente Normalizante WN( ). b : b A : â : â A : â b Notas: b puede no ser unica puede que no todos los caminos lleguen hasta b Fuertemente Normalizante SN( ) Es WN Terminación Únicamente Normalizante UN( R ) â, ê : â, ê A : â= R ê â=ê Inductividad Ind( ) Sea una cadena infinita de la forma a b c, entonces se da que a ς, b ς, c ς,
Incremental Inc( ) f : f:a N : a, b : a, b A : a b f(a)<f(b) Notas. N es el conjunto de los naturales Esta propiedad refleja que un elemento al que se llega por una relación tendrá un numero asociado mayor que los anteriores, y por tanto las formas normales de una cadena de elementos relacionados tendrán un numero asignado mayor que cualquiera de sus antecedentes. Confluencia Débil WCR( ) a, b, c : a, b, c A : c a b d : d A : c d b Confluencia CR( ) a, b, c : a, b, c A : c a b d : d A : c d b Subconmutativa WCR 1 ( ) a, b, c : a, b, c A : c a b d : d A : c = d = b Confluencia por Equivalencia CEq( R ) a, b : a, b A : a= R b c : c A : a = c = b RELACIÓN ENTRE PROPIEDADES. CR( ) WCR( ) WCR 1 ( ) CEq( ) GRAFO CONLA RELACIÓN ENTRE PROPIEDADES Según un teorema tenemos las siguientes relaciones entre propiedades que se representarán mediante un grafo: CR UN SN WCR CR ( lema de Newman ) UN WN CR UN WN Ind Ind Inc SN WCR WN Inc SN WCR CR WCR WCR 1 CR
Sistemas de reescritura de términos. Sistemas ortogonales y propiedades. Estrategias de reducción. Definición Sea un sistema de reescritura de términos definido de la forma siguiente = (Σ, ( R1, R2, Rn)), donde Σ es un alfabeto de términos formado por: Σ V = Alfabeto de variables (x, y, z ) Σ F = Alfabeto de funtores (F, G, H ) cada uno con una aridad dada. Σ = Alfabeto de puntuación ( (,,, ) ) Y i son reglas formadas por un par de términos ( s t ) Se define el conjunto de los términos sobre Σ, llamado Ter(Σ), de la siguiente forma: Σ V Ter(Σ) T 1,, T n Ter(Σ) F Σ F con aridad n F(T 1,, T n ) Ter(Σ) Este conjunto Ter(Σ) es el conjunto A de un sistema de reescritura abstracto, pero para definir las relaciones de reescritura hay que definir dos operaciones sobre Ter(Σ): Sobre el conjunto Ter(Σ) se definen dos operaciones: Sustitución y Contexto. Una sustitución es una aplicación σ : Ter(Σ) Ter(Σ) que cumple las siguientes propiedades: σ(x) Ter(Σ) donde x Σ V σ(f(t 1,,T n )) = F(σ(T 1 ),,σ(t n )) donde F Σ F con aridad n y T 1,,T n Ter(Σ) Un contexto C[ ] es un término donde hay una variable especial, llamada hueco y representada por, que ocurre sólo una vez en él. Entonces, dado un término T Ter(Σ), C[T] = σ( C[ ] ) siendo σ una sustitución tal que σ( ) = T, es decir, se sustituye el hueco por el término. σ(x) = x si x Σ V y x no es el hueco Ahora estamos en condiciones de definir las relaciones i del sistema de reescritura abstracto a partir de las reglas i del sistema de reescritura de términos. C[ ], σ : C[ ] contexto y σ sustitución : S i T C[σ(S)] i C[σ(T)] Al subtérmino σ(s) se le llama expresión reducible (redex). Así pues, se construye un sistema abstracto de reescritura a partir de un sistema de reescritura de términos y se pueden analizar todas las propiedades. Sin embargo, se pueden garantizar ciertas propiedades si se construye un sistema de reescritura de términos especial. Sistemas ortogonales de escritura de términos Un sistema ortogonal es un sistema de reescritura de términos donde dado cualquier término T de Ter(Σ), no hay en él un funtor implicado en dos redex distintos. Equivalentemente se puede decir que los redex del sistema no se solapan. Un ejemplo de sistema no ortogonal sería:
L(L(x)) x Ya que con el término L(L(L(A))) se podrían reducir las dos L s externas o las dos internas, estando la L intermedia implicada en las dos reducciones. Otro ejemplo de sistema no ortogonal sería: OR(x,y) x OR(x,y) y Ya que con la expresión OR(A,B) se podría aplicar la regla primera o la segunda utilizando el mismo funtor OR. Un sistema ortogonal es: SUMA(0,x) x SUMA(S(y),x) S(SUMA(y,x)) Ya que no existe ningún primer argumento que satisfaga que es 0 y que es S(x). Para ver si un sistema es ortogonal basta comprobar que no haya un antecedente unificable con un subtérmino (no variable) de otro antecedente (o del mismo, siendo subtérmino propio) y que cada variable no aparezca más de una vez en cada antecedente (reglas lineales por la izquierda o en los antecedentes). En L(L(x)) x puedo unificar el antecedente L(L(x)) con el subtérmino propio del mismo L(x) haciendo x=l(x) en el segundo. En OR(x,y) no hace falta ni renombrar variables ya que el antecedente de la primera regla es igual al antecedente de la segunda, es igual pero no el mismo (están en distintas reglas). Propiedades de los sistemas ortogonales Hay una importante propiedad: Todos los sistemas ortogonales son confluentes. Otra propiedad es: Si en cada regla las mismas variables ocurren en antecedente y en consecuente, decimos que es un sistema no borrador, ocurre que WN SN. Si en un sistema ortogonal siempre se puede encontrar una forma normal mediante el orden de evaluación aplicativo (más interior), entonces es SN y viceversa. Estrategias de reducción en los sistemas ortogonales Tenemos cinco estrategias principales según los redex que vayamos a reducir: Más a la izquierda, más interior (aplicativo) Todos los interiores Más a la izquierda, más exterior ( En general no es normal!) Todos los exteriores (normal) Todos (sólo válida en sistemas ortogonales donde no se solapan los redex). Se llama reducción de Kleene o de Gross Knuth. Además de normal es cofinal (una condición más fuerte: encuentra la forma normal por el mejor camino) La reducción más a la izquierda, más exterior es normal en los sistemas ortogonales normales por la izquierda. En estos sistemas no hay constantes ni funtores a la derecha de una variable.
Técnicas para estudiar la terminación. Método de Dershowitz La propiedad SN (de terminación) es deseable, entre otras razones porque si se cumple a la par que WCR, tenemos también que se cumple CR ( por el lema de Newman ). Pero el determinar si un sistema de reescritura de términos genera o no derivaciones infinitas es un problema indecidible. Pero bajo ciertas condiciones son aplicables técnicas que resuelven dicho problema. Una de ellas el método de Dershowitz, que está basado en el teorema de Kruskal. Definición Sea un conjunto de árboles finitos y conmutativos, cuyos nodos están etiquetados con números naturales. Sea * otro conjunto de árboles finitos y conmutativos, con nodos etiquetados también con números naturales, con la salvedad de que algunos de estos nodos pueden estar macados con un asterisco ( * ). Es fácil entender *. Definición Definamos sobre * la relación de reducción como: Siendo n,m naturales y t i cualquier árbol, 1. n (t 1,t 2,...,t n ) n * (t 1,t 2,...,t n ) 2. Si n>m, n * (t 1,t 2,...,t n ) m(n * (t 1,t 2,...,t n ),n * (t 1,t 2,...,t n ),...,n * (t 1,t 2,...,t n )) 3. n * (m,t 1,...,t n ) n(m *, m *,...,m * 1,t 1,...,t n ), donde m * aparece repetida j veces con j 0. 4. n * (t 1, t 2,...,t n ) t i donde i {1,...,n} con n 1. Es fácil ver que la relación no cumple SN en *. Pero por el contrario... Teorema La relación +, restringida a cumple SN. Esto significa que no existe ninguna secuencia infinita t 0 + t 1 + t 2 +... siendo los t i árboles sin marcas. Método de Dershowitz Sea R un sistema de reescritura de términos. Primero tenemos que asignar un peso a cada uno de los funtores que intervienen en las reglas (de lo afortunada que sea esta asignación dependerá el éxito del método). Si sustituimos los nodos por sus pesos, cada antecedente de las reglas del sistema será un elemento de ( idem para cada consecuente). Luego, regla por regla, trataremos de reducir el antecedente de la misma hasta el consecuente que le corresponda usando exclusivamente +. Si esto es posible para cada regla habremos demostrado que cada una de ellas es un caso particular de +, y como + es SN cuando nos restringimos a, nuestro TRS también será SN. Ejemplo: x x Sea R un TRS de como el de la figura ( x y ) ( x y ) Primero asignamos pesos: 1 a, 2 a, 3 a. Y ahora... ( x y ) ( x y ) x (y z) (x y) (x z) Para la primera regla : 3(3(t)) 3*(3(t)) 3(t) 3*(t) t, luego 3(3(t)) + (y z) x (y x) (z x) t Para la segunda regla: 3(1(t,s)) 3*(1(t,s)) 2(3*(1(t,s)), 3*(1(t,s))) 2(3(1*(t,s)), 3(1*(t,s))) 2(3(t), 3(s)), luego 3(1(t,s)) + 2(3(t), 3(s)) Se procede análogamente para el resto de las reglas. Transformación de sistemas ecuacionales en TRS s Dado un conjunto de ecuaciones de la forma f 1 = g 1, f 2 = g 2, f 3 = g 3,..., f n = g n, sería interesante obtener a partir de él un sistema de reescritura, tal que, la convertibilidad inducida por el sistema de reescritura equivalga al concepto de igualdad que se quiere capturar con dicho
sistema de ecuaciones. En un principio se podría, por cada ecuación de la forma f i = g i, obtener una regla, que podría ser bien f i g i, o bien g i f i. Cuál de las dos reglas posibles incorporamos a nuestro TRS? A veces las mismas condiciones sintácticas que los TRS s imponen a sus reglas descartan una de las opciones ( siendo la otra opción la adecuada ). Pero otras veces no está claro el sentido de la reducción. La elección está en nuestras manos y determinará las propiedades del sistema de reescritura que obtengamos. Definición: Par Crítico Sea R un TRS, y sean α β y γ δ dos reglas de R tal que α es unificable con un subtérmino no-variable de γ. Sea σ el unificador más general de ambos y sea t un término tal que σ(t) σ(α). Entonces el término σ(γ) sería de la forma σ(c[t]) puede reducirse de dos maneras distintas, usando la primera regla, o bien usando la segunda. Dando dos posibles reducciones, por un lado C[σ(β)] y por otro σ(δ). A este par de valores <C[σ(β)],σ(δ)> se le llama par crítico. La confluencia del sistema dependerá de la capacidad de reducción de ambos términos a uno común. Un par crítico va asociado a lo que en apartados anteriores llamábamos solapamiento de reglas Definición: Convergencia De un par crítico <s,t > se dice que es convergente en un TRS (y se escribe s t ) si es posible una reducción a un término común. Lema del par crítico: Sea R un TRS, WCR(R) ( <s, t> : par crítico de R : s t ) Corolario: Sea R un TRS, tal que SN(R). Entonces: CR(R) ( <s, t> : par crítico de R : s t ) Definición: Orden de reducción Un orden de reducción > es un orden parcial sobre los el conjunto de términos que cumple: s > t σ(s) > σ(t) s > t C[s] > C[t] Algoritmo de Knuth-Bendix ( para un orden de reducción prefijado ) Sea el E el conjunto de ecuaciones y sea R el cojunto de reglas. R:=Ø; mientras E tenga elementos seleccionar una ecuación s=t de E reducir s ˉs y t ˉt si ˉs ˉt entonces E:= E { s=t } en otro caso si (ˉs > ˉt) entonces α := ˉs ; β := ˉt en caso de que ˉs > ˉt β := ˉs ; α := ˉt en otro caso fracaso fin_si fin_si fin_mientras CP:={ P=Q <P,Q> es un par crítico, entre las reglas de R y α β } R:=R {α β} E:=E (CP-[s=t ])
Epílogo Con los conocimientos teóricos recién adquiridos, podemos volver a los ejemplos mencionados en la introducción para llegar a interesantes conclusiones. Hemos visto un algoritmo para transformar ecuaciones matemáticas en reglas de reescritura. Dicho algoritmo no es determinista y no funciona en todos los casos, pero a cambio los sistemas de reescritura generados son ortogonales y por tanto consistentes (si hay dos formas normales distintas). Haskell es un sistema casi ortogonal, ya que aunque el sistema permite definir dos reglas que se solapen, solo la primera que aparezca en el código será la efectiva, de manera que no se pueden aplicar las dos a la vez y no se pueden producir pares críticos. Esto hace que Haskell sea un sistema confluente y por tanto consistente. Por otro lado, esto no implica que Haskell tenga terminación asegurada. Como ya se dijo, Prolog es muy distinto a los dos casos anteriores aun asi se pueden llegar a algunas conclusiones. Por ejemplo, si dos reglas se solapan (si las dos se pueden aplicar sobre un mismo redes) el Prolog introduce un Choice-Point, de manera que nunca se van aplicar dos reglas en una misma rama. Siendo cada rama ortogonal y por lo tanto consistente. Por otro lado, gracias al backtracking tenemos varias formas normales, y cada una de ellas será un resultado de la computación. El lambda-calculo ya ha sido estudiado, pero podemos destacar el teorema de Church- Rosser que dice que es confluente y por tanto si tiene dos formas normales distintas (que las tiene, basta tomar dos variables distintas) es consistente.