Viene de Problemas con el castellano.
Advertencia: Todo lo que se diga aquí puede contener errores. Seguramente estas soluciones no sean las únicas ni las mejores.
Bueno, después de acabar el divertidísimo examen de Redes, toca solucionar los problemas.
Empecemos por el primero: contar el numero de cadenas de
paréntesis bien formadas. Llamemosle
. Quizás os recuerde un poco a los que habéis estudiado Matemática Discreta a los números de Catalán. Estos numeros aparecen cuando se quiere enumerar las maneras de parentizar una expresión de
elementos o lo que es lo mismo el número de maneras distintas de aplicar una operación binaria ( como la multiplicación ) a
(*). Algunos ejemplos:
Como vemos para
= 2 hay 2 mientras que para
= 3 hay 5 maneras; para un
cualquiera usamos la estrategia de dividir a nuestro enemigo. Supongamos que la cadena tiene la operación más externa después de
:
Sabiendo esto el número de maneras en la que podemos hacer las multiplicaciones es, el numero de maneras de las que podemos hacer la parte derecha
por el número de maneras de las que podemos hacer la parte izquierda
. Como la operación más externa puede estar en cualquier posición entre el 0 y el
y dos expresiones son distintas si sus operaciones mas externa están en posiciones distintas tenemos que:
Pero ¿ Que tiene que ver todo esto con nuestro problema inicial ? Pues mucho, supongamos que recorremos una de las cadenas de multiplicaciones de arriba asignando un +1 a cada asterisco y un -1 a cada símbolo de cierre ‘)’. Obtenemos una
-tupla
con
que cumple :
Y cambiando ‘(‘ por +1 y ‘)’ por -1 esta es la definición de una cadena bien formada de paréntesis. Luego la solución es:
No obstante el problema puede plantearse de la siguiente manera alternativa. Sea
una gramatica no ambigua que genera cadenas bien formadas de paréntesis, como la que se muestra abajo; sustituyamos los paréntesis por símbolos iguales
:
Llamemos
al número de derivaciones de una cadena de longitud
con
como axioma y
si el axioma es
. Ya hemos nombrado a nuestro enemigo, primer paso hacia la victoria según Dorronsoro, ahora vamos a calcularlo. Imaginemos un árbol de derivación con el símbolo
en la raíz. Por las primeras 2 reglas ( las que parten de
) lo que deriva de el es o bien un árbol con E en la raíz y
hojas o bien dos símbolos
y
cada uno de los cuales tiene
y
hojas, por ello:
Si tenemos un árbol de derivación con
hojas y con
en la raíz y
es igual a 2 solo podemos aplicar
por lo que hay una única derivación. En otro caso el numero de derivaciones con
en la raíz es el mismo que el número de derivaciones de una cadena de
elementos y
en la raíz, ya que
es la única regla aplicable. Luego (**) :
Ahora tenemos un sistema de dos ecuaciones en recurrencia con dos incógnitas, que se reducen a una sustituyendo
en
. Haciendo algunas manipulaciones y suponiendo que
queda la formula recursiva de los números de Cátalan
de nuevo (***).
Despues de este pequeño triunfo gramatical, nos sentimos con ánimos como para abordar una gramatica cualquiera sobre el alfabeto
. Por simplificar supondremos que no tiene reglas lambda. Sea
una gramatica, imaginemos todas las reglas que derivan de un símbolo no terminal cualquiera
:
Si queremos saber cuantas derivaciones tiene la cadena de
símbolos, definimos
para todos los
como el número de arboles de derivación con
hojas y con
en la raíz. Cada una de las derivaciones
da un arbol distinto ( ya que
) por lo que
es la suma de todos los arboles posibles
en la raiz y en los que la primera regla aplicada fue
:
Como
la cadena de
símbolos terminales se puede descomponer en
subcadenas disjuntas, cada una de ellas derivando de un
en caso de qeu sean no terminal o siendo la la misma cadena en caso de que sean terminales. Esas subcadenas tienen longitudes
con
. Sabemos cuantas derivaciones tiene una cadena de
alfas que derive de
, esto es
, por lo que el número de derivaciones para una “particion”
concreta es:
Si sumamos para todas las particiones queda:
Con esto sabemos cuantos arboles hay con
hojas y cuya primera regla aplicada es
. Tenemos
incógnitas,
, una por cada no terminal;y
ecuaciones en recurencia, una por cada grupo de derivaciones que parta de
. Solo hay que aplicarlas hasta llegar a
para obtener
con
el axioma de la gramatica. Solo falta un caso base. Lo natural es pensar que los casos base pueden obtenerse cuando
es el simbolo terminal
, ya que
.
No nos engañemos, nada de esto es magnífico aun. Ya hemos resuelto el problema de hallar el número de arboles de derivacion solo que de una manera un tanto asquerosa ( con sistemas de muchas ecuaciones en recurrencia ). ¡ Es hora de dar recuperar la elegancia perdida ! . Vamos a usar funciones generatrices, la razon es facil: Si tenemos dos series
y
cuyas funciones generatrices son
y
la serie
corresponde al producto de funciones
. La expresion de arriba recuerda mucho a estas por lo que si definimos:
Y todas las reglas que derivan de
estan en
entonces:
Como
tenemos un sistema de
funciones a despejar mediante
ecuaciones.
¡ Magnifico ! Las uniones (|) se traducen como sumas de funciones mientras que las concatenaciones se traducen como productos de funciones. Todo esto no deja de ser una curiosidad, pero choca que a veces unos objetos representen tan bien las propiedades de otros, al fin y al cabo la concatenacion de simbolos en cierto sentido es distributiva con la union y la union es conmutativa. De hecho en algunos contextos se usan los signos
y
para representar union y concatenacion, los mismos caracteres que para la suma y la multiplicacion ordinarias.
Si lo aplicamos a la gramatica de los paréntesis perdidos, tenemos:
Despejando
se obtiene una funcion par por lo que
es una serie de potencias igual a la que generan los números de Catalan salvo en el termino independiente:
Con esto resolvamos bastante más que el primer problema. Nos queda acabar el tercer problema y hacer de una vez el segundo problema, aunque creo que eso se deja para el siguiente post, que este ya es demasiado largo.
(*) : Podéis ver mas detalles sobre los números de Catalan en el libro de Pablo Fernandez, Capítulo 2 pagina 78.
(**) : He llamado
a la función que vale
si y solo si
y en otro caso es cero.
(***) : Hacerlo se deja para el maltratado lector.
(****) : Para escribir este post he hecho cosas muy muy feas mezclado html y latex para compensar las pobres opciones que tiene el latex de wordpress. A partir de ahora no hare nada por lo que el Dios de Tex no me deje entrar en su cielo.