Está en la página 1de 10

INTRODUCCIN A LA TEORA DE

AUTMATAS Y LENGUAJES FORMALES


Prctica 1
1. Introduccin.
2. Listas.
2.1 Sintaxis.
2.2 Operaciones con listas.
2.3 Operadores lgicos y relacionales
3. Programacin
3.1 Funciones simples
3.2 Programacin procedural
3.2.1 Mdulos
3.2.2 Estructuras condicionales y de repeticin
4. Actividades
4.1 Actividades relacionadas con el manejo de Mathematica
4.2 Actividades relacionadas con la teora de lenguajes formales
5. Soluciones a algunos ejercicios propuestos
1. Introduccin.
El lenguaje de programacin escogido para las prcticas es Mathematica [Wolfram,91]. En las
implementaciones que se van a llevar a cabo, hay que manejar objetos abstractos como son los
autmatas y las gramticas, sobre los que se realizarn una serie de transformaciones. Tanto unos
como otras pueden ser concebidos como estructuras ms complejas realizadas en base a otras ms
sencillas. El inters de las prcticas no estriba en conseguir implementaciones eficientes, sino en
utilizar un lenguaje que facilite la construccin de estos objetos abstractos y el manejo de los
mismos. Teniendo en cuenta todos estos aspectos, veamos a continuacin algunas de las
caractersticas de Mathematica que lo hacen adecuado para su uso en dichas prcticas.
Mathematica es un paquete de desarrollo para aplicaciones de tipo general en las que los aspectos de
desarrollo matemtico, algebraico, numrico, simblico y grfico juegan un papel preponderante.
Mathematica est diseado para tratar tanto clculos matemticos, as como aquellos clculos
numricos tradicionalmente llevados a cabo en FORTRAN. La mayora de funciones especiales de la
fsica matemtica y funciones matriciales, ya estn construidas en Mathematica. Adems, tiene una
extensa capacidad grfica para la visualizacin de los resultados de los clculos.
La aplicaciones de Mathematica engloban prcticamente todas las reas de investigacin y desarrollo
tanto en investigaciones cientficas, de ingeniera, econmicas, arquitectura, etc. Dentro de estas
mismas reas se pueden utilizar tanto como herramienta de trabajo como herramienta docente para
aquellas materias que conlleven un alta carga de desarrollo matemtico.
Mathematica como lenguaje de programacin se diferencia del FORTRAN o C o PASCAL, por una
parte por su habilidad en el tratamiento de expresiones matemticas, nmeros, expresiones
simblicas, etc., y por otra en que es un lenguaje interpretado. Como consecuencia de ser
interpretado, un clculo tarda ms tiempo en ejecutarse que en un lenguaje compilado, sin embargo,
el escribir un programa en Mathematica requiere una fraccin del tiempo necesario para escribir el
mismo programa en C, y lo que es ms importante, permite concentrar los esfuerzos en los detalles
conceptuales y no en los de implementacin.
El sistema Mathematica es interactivo, lo cual significa que no hay que compilar programas. En
lugar de eso, los clculos se hacen tpicamente ejecutando una lnea cada vez, y por tanto, los
resultados intermedios pueden verse inmediatamente. Mathematica es potente, puede usarse para
realizar grandes clculos interactivos, evitando los tpicos errores algebraicos, y los resultados se
pueden comprobar al instante. El lenguaje Mathematica es conciso, clculos complicados pueden ser
escritos en pocas lneas (aunque hay que controlar las limitaciones de memoria del ordenador usado).
Es tambin flexible, pueden establecerse conexiones con otros programas ya existentes, etc..
Mathematica est siendo desarrollado por Wolfram Research, Inc. Actualmente est disponible en
prcticamente todas las plataformas de ordenadores. Los cdigos se pueden transportar en ficheros
ASCII o en ficheros Mathematica Notebook, si se trabaja con versiones compatibles.

En esta primera prctica se pretende introducir algunos conceptos elementales del lenguaje asociado
a la aplicacin Mathematica, as como el desarrollo de aplicaciones relacionadas con palabras y
lenguajes empleando esta herramienta.
2. Listas.
Quiz la estructura de datos ms importante en Mathematica (y, sin duda la que nosotros
emplearemos ms) es la lista. Se pueden emplear listas tanto para las palabras de los lenguajes con
los que trabajemos, como para las transiciones de los autmatas que reconozcan dichos lenguajes.
2.1. Sintaxis
list1 = {a, b, {c, d}} asigna a la variable "list1" la lista con primer elemento "a", segundo "b" y
tercero la lista {c, d}".
El elemento i-simo de una lista se referencia como nombre[[i]]. As, list1[[3]] es {c, d}.

2.2. Operaciones con listas
Notas:
l Las mayora de las operaciones no actualizan las listas a menos que se asignen a una variable.
l Mathematica es sensible a las maysculas. No es lo mismo Table que table.
l En lo sucesivo, l1, l2... designarn listas, x, y... designarn elementos o variables, mientras que m,
n... designarn enteros positivos.
Las funciones definidas a continuacin admiten variantes no especificadas aqu para no hacer
demasiado larga esta exposicin. Solo se indica alguno de los usos ms frecuentes. Para conocer
todas las posibilidades se puede teclear ?Nombre.
Pueden ser de utilidad las siguientes funciones de Mathematica:
Cases[lista, patrn]: Devuelve una lista con los elementos de lista que concuerdan con patrn.
Ejemplo 3
Sintaxis Significado
Table[f(x), {x,n}] Devuelve la lista {f(1), f(2)...f(n)}
Range[m]
Devuelve una lista con los m primeros
nmeros naturales.
Length[ l1] Devuelve la longitud de la lista.
Position[l1,x]
Devuelve una lista con las posiciones de x en
l1. (cuidado!)
Join [l1, l2] Concatena dos listas.
Union[l1, l2]
Devuelve una lista con los elementos que se
encuentran en l1 o l2 y los ordena.
Intersection[l1, l2]
Devuelve una lista con los elementos que se
encuentran en l1 y l2
Complement[l1, l2]
Lista con los elementos de l1 que no estan en
l2.
Sort[l1]
Devuelve l1 ordenada de menor a mayor (no
actualiza l1).
Reverse[l1] Devuelve el reverso de l1.
RotateRight[l1]
Devuelve l1 con los elementos desplazados
un lugar a la derecha (el ltimo pasa a ser el
primero).
RotateLeft[l1]
Idntico al anterior pero desplazando hacia la
izquierda
First[l1] Devuelve el primer elemento de la lista.
Rest[l1] Lista l1 sin el primer elemento.
Drop[l1, n]
Devuelve la lista sin los primeros n
elementos.
Take[l1, n] Devuelve los primeros n elementos de la lista.
Append[l1, x] Aade el elemento x al final.
Prepend[l1, x] Aade el elemento x al comienzo.
AppendTo[l1, x],
PrependTo[l1, x]
Idnticas a las anteriores pero actualizan la
lista.
Delete[l1,n] Elimina el elemento n-simo de la lista.
Select[l1, condicin]
Lista con los elementos de l1 que cumplen
condicin.
l1 /. izq -> dcha
Sustituye en l1 los elementos que se llaman
izq por dcha).
lista={{a,a},{b,a},{b,b},{a,b}}
Cases[lista,{a,_} ]
{{a,a},{a,b}}.
2.3. Operadores lgicos y relacionales
Son operadores que dan como resultado True o False:
Adems estn los conocidos: >, <, >=, <=.
MemberQ[l1,x]: Devuelve True si x pertenece a l1 y False si no.
3.- Programacin
Mathematica lleva incorporado un lenguaje de programaci n propio que permite incorporar
funciones para realizar tareas especficas al mismo nivel que las funciones predefinidas.
Al ser un intrprete, el modo de trabajo puede ser totalmente interactivo; As si ejecutamos la
expresin For[i = 1, i < 10, i++, Print[i]] se escriben en pantalla los dgitos del 1 al 9 (se ha
introducido la sentencia For cuya sintaxis es totalmente idntica a la que tiene en C).
3.1.- Funciones simples
La forma mas sencilla de definir una funcin es n_funcin[var_]:=valor.
Ejemplos:
f[x_]:=x^2. A partir de este momento, si se teclea f[n], Mathematica devuelve el valor n
2
.

g[x_,y_]:=2x + y (funcin de dos variables).
valab[x_]:=If[ x > 0, x, -x]; (se ha definido el valor absoluto de un nmero. Esta funcin lo es a
todos los efectos, se puede dibujar con Plot[valab[x], {x,-3,3}]. De paso se ha introducido la funcin
If, cuya sintaxis es If[condicin, verdad, falso]).
kron[x_,y_]:= If[x==y, 1, 0]; (delta de Kronecker).
3.2.-Programacin procedural
Operacin Operador
Negacin !
Conjuncin &&
Disyuncin | |
Igualdad ==
No igualdad =!=
3.2.1.-Mdulos
El concepto de mdulo es totalmente parecido al de procedure en Pascal. Su esquema genrico es :
nombre[parmetros] : = Module [{variables locales separadas por comas},
Acciones (separadas por ;);
Return[nvar] (si el mdulo devuelve un valor)
]
Ejemplo
Mdulo que toma como entrada un nmero positivo n y devuelve la suma de los n primeros nmeros
enteros.
suma[n_Integer]:=Module[{i,suma1},
suma1=0;
For[i =1,i <= n,i++,suma1 = suma1 + i];
Return[suma1];
]
Para ejecutarlo se escribira por ejemplo suma[3] (que dar como resultado 6).
3.2.2.- Estructuras condicionales y de repeticin
Condicional
Estructuras de repeticin
Se ejecuta repetidamente sentencias desde var = com hasta var = fin. Por defecto el incremento de la
variable es 1. Se puede utilizar alternativamente{var, com, fin, paso}
Se evala comienzo y se ejecutan sentencias e incremento hasta que test falla.
Sintaxis
If[condicin, sent_verdad,
sent_falso]
Sintaxis
Do[sentencias,
{var,com,fin}]
Sintaxis
For[comienzo, test,
incremento, sentencias]
Sintaxis
While[condicin,
sentencias]
Se ejecuta sentencias mientras condicin es cierta.
4.- Actividades
4.1.- Actividades relacionadas con el manejo de
Mathematica
Listas
Para trabajar con listas es cmodo disponer de una funcin que las genere automticamente.
Haremos uso de las funciones Random[ ] y Table[ ].
Random[Integer,{imin,imax}] devuelve un nmero entero pseudoaleatorio comprendido entre los
enteros imin e imax.
Ejemplo: Random[Integer,{0,9}] devuelve un dgito.
l = Table[ Random[Integer,{imin,imax}],{n}] devuelve una lista de n nmeros y los asigna a la
variable l. Si no se desea ver la lista por pantalla hay que terminar la expresin con ";".
Bucles simples
Ejercicio
Simulacin de la funcin Length
La expresin Length[l], donde l es una lista, devuelve la longitud de l. Se pide, sin el uso de la
funcin Length, un fragmento de programa iterativo que simule dicha funcin.
Ayudas:
l La lista vaca se representa mediante {}.
l l = Rest[l] asigna a la variable l (que es una lista) la lista l sin el primer elemento.
l Se recuerda la estructura repetitiva While[condicin,expresiones]. Hay que tener cuidado en
no entrar en un bucle sin fin. En caso de hacerlo, Alt + "." aborta la ejecucin.
Nota: Las palabras de un lenguaje se representarn mediante listas, por lo que el fragmento anterior
puede servir para calcular la longitud de una palabra de forma iterativa. La definicin recursiva (ver
libro de apuntes, pgina 7) se puede transcribir casi literalmente con el siguiente programa recursivo:
long[{}]:=0;
long[l_]:=1+long[Rest[l]];
Una vez ejecutado este fragmento, ejectese por ejemplo long[{a,b,a,a}].
Ejercicio
Escriba un fragmento de programa que suprima los elementos repetidos de una lista dejando el
primero de cada uno de ellos.

Ejercicio
Escriba un fragmento de programa que, dados una lista y dos enteros i y j, devuelva la lista con los
elementos de las posiciones i y j intercambiados.
Bucles anidados
Ejecute el siguiente programa y estdielo detenidamente:
For[i=1, i<=4, i++,
Print["i___: ", i];
For[j=i+1, j<=5, j++,
Print["j : ", j]
]
]
Mdulos.
Por defecto, todas las variables definidas en Mathematica son globales. Para evitar interferencias y
para generalizar las funciones que se definen se emplean los mdulos. Por ejemplo, el programa
escrito como ejemplo de bucles anidados se puede introducir en un mdulo de la siguiente manera:
imprime[m_Integer]:=Module [{i,j},
For[i=1, i<=m-1, i++,
Print["i___: ", i];
For[j=i+1, j<=m, j++,
Print["j : ", j]
] (*del For j*)
] (*del For i*)
] (*del mdulo*)
Una vez ejecutado el mdulo anterior, la funcin "imprime" est disponible en la sesin de
Mathematica. Ejecute por ejemplo imprime[5] .
Ejercicio
Escrbanse mdulos para todos los fragmentos realizados anteriormente.

4.2. - Actividades relacionadas con la teora de lenguajes
formales

En lo que sigue, una palabra se representa como una una lista de smbolos sobre un determinado
alfabeto. As la palabra x=abbaca, se representar como {a,b,b,a,c,a}; la palabra vaca se representa
como la lista de longitud 0, es decir, {}.
Un lenguaje finito es un conjunto finito de palabras. Por tanto, un lenguaje se representa como una
lista cuyos elementos (palabras) son listas. Por ejemplo, el lenguaje L={abba, bb }, se representar
como {{a,b,b,a},{b,b}}; el lenguaje vaco se representa como {}.
Escribid mdulos Mathematica que realicen los siguientes clculos
Ejercicio 1
Con entrada una palabra x y un smbolo a, calcular |x|
a
(nmero de ocurrencias de a en x).

Ejercicio 2
Con entrada una palabra x y un entero positivo n, obtenga x
n
.

Ejercicio 3
Conjunto de prefijos de una palabra x.
Ejercicio 4
Conjunto de segmentos de una palabra x.
Ejercicio 5
Conjunto de segmentos de longitud k (k>0) de una palabra x.
Ejercicio 6
Producto de lenguajes finitos.
Ejercicio 7
Con entrada un lenguaje finito L y un entero n>0 calcular L
n
.

Ejercicio 8
Palabras de longitud n sobre un alfabeto de entrada .(una manera posible consiste en usar la solucin
a 6),
Ejercicio 9
Desarrollar una funcin que, dados un alfabeto de entrada y un nmero n, obtenga todas las palabras
de longitud menor o igual que n sobre ese alfabeto.
Ejercicio 10
Modificar el programa anterior obtenido a partir de la solucin a 9 para obtener solamente las
palabras de longitud n. Puede ser una forma alternativa de resolver 8.
Ejercicio 11
Palabras de longitud n sobre un alfabeto que son palndromos.
Ejercicio 12
Con entrada una palabra x, y un homomorfismo h, calcular h(x). Si, por ejemplo, se tiene un
homomorfismo h(a)=010, h(b)= , h se puede representar por una lista
halfa={{a,{0,1,0}},{b,{}}}
Ejercicio 13
Con entrada una palabra x, y una sustitucin finita , calcular (x). Si, por ejemplo, se tiene una
sustitucin, (a)={010,11}, (b)= { ,110,0} se puede representar por una lista
salfa={{a,{{0,1,0},{1,1}}},{b,{{},{1,1,0},{0}}}}.
Ejercicio 14
Dado un alfabeto en el que se asume un orden en los smbolos y una palabra x sobre dicho
alfabeto, calcular la siguiente palabra en orden lexicogrfico.
Ejercicio 15
Funcin que con entrada una palabra x, calcule f(x) definido como sigue:
Si |x|<2, f(x)=x
Si no, si x=aby, f(x)=af(y)b


5.- Soluciones a algunos ejercicios propuestos
Solucin al ejercicio 1
frec[pal_,sim_]:=Length[Position[pal,sim]]
Solucin al ejercicio 4
seg[pal_]:=Module[{l,i,j,w},
l={{}};
For[i=1,i<=Length[pal],i++,
For[j=i,j<=Length[pal],j++,
w=Take[pal,{i,j}];
l=Union[Append[l,w]]
]
];
Return[l]
]

Solucin al ejercicio 9
Lo que se presenta no es un programa. A partir de este algoritmo, el alumno, mediante un traduccin
casi literal a Mathematica, podr obtener un programa.
Mdulo_listar[n:Entero, Alfabeto:lista]
listado={cadena_vacia};
auxiliar= {cadena_vacia};
Para i=1 hasta n hacer
auxiliar2 =;
Para j = 1 hasta Longitud de auxiliar hacer
Para k = 1 hasta Longitud de Alfabeto hacer
nuevapal = prolongar la palabra j de auxiliar con el smbolo k del
Alfabeto;
auxiliar2 = Aadir a auxiliar2 la palabra nuevapal;
listado = Aadir a listado la palabra nuevapal;
FinPara
FinPara
auxiliar = auxiliar2;
FinPara
Resultado: listado
Fin Mdulo
Solucin al ejercicio 12
(w es la palabra e imag el homomorfismo):
h[w_,imag_]:=Module[{hw,i,l},
hw=w;
For[i=1,i<=Length[w],i++,
l=Cases[imag,{w[[i]],_}];
hw[[i]]=l[[1,2]]
];
hw=Flatten[hw];
Return[hw]
]
Bibliografa
[Wolfram,91]. S. Wolfram. Mathematica: A System for doing mathematica by computer. Addison
Wesley, 1991.

También podría gustarte