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. Mathematica es sensible a las maysculas. No es lo mismo Table que table .

En lo sucesivo, l1, l2 ... designarn listas, x, y ... designarn elementos o variables, mientras que m, n... designarn enteros positivos.
l

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 . Sintaxis Table[f( x), {x,n}] Range[m] Length[ l1] Position[l1,x ] Join [l1, l2 ] Union[ l1, l2 ] Intersection[ l1, l2 ] Complement[ l1, l2 ] Sort[l1 ] Reverse[l1] RotateRight[l1 ] RotateLeft[ l1] First[ l1] Rest [l1] Drop[l1, n ] Take[ l1, n] Append[l1, x ] Prepend[ l1, x] AppendTo [ l1, x], PrependTo[l1, x ] Delete[l1,n ] Select[ l1, condicin] l1 /. izq -> dcha Significado Devuelve la lista {f(1), f(2)...f(n)} Devuelve una lista con los m primeros nmeros naturales. Devuelve la longitud de la lista. Devuelve una lista con las posiciones de x en l1. (cuidado !) Concatena dos listas. Devuelve una lista con los elementos que se encuentran en l1 o l2 y los ordena. Devuelve una lista con los elementos que se encuentran en l1 y l2 Lista con los elementos de l1 que no estan en l2. Devuelve l1 ordenada de menor a mayor (no actualiza l1). Devuelve el reverso de l1. Devuelve l1 con los elementos desplazados un lugar a la derecha (el ltimo pasa a ser el primero). Idntico al anterior pero desplazando hacia la izquierda Devuelve el primer elemento de la lista. Lista l1 sin el primer elemento. Devuelve la lista sin los primeros n elementos. Devuelve los primeros n elementos de la lista. Aade el elemento x al final. Aade el elemento x al comienzo. Idnticas a las anteriores pero actualizan la lista. Elimina el elemento n-simo de la lista. Lista con los elementos de l1 que cumplen condicin. Sustituye en l1 los elementos que se llaman izq por dcha).

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

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: Operacin Negacin Conjuncin Disyuncin Igualdad No igualdad Adems estn los conocidos: >, <, >=, <=. MemberQ [l1,x] : Devuelve True si x pertenece a l1 y False si no. Operador ! && || == =!=

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 n2 . 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

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 Sintaxis If [condicin, sent_verdad, sent_falso] Estructuras de repeticin Sintaxis Do [sentencias , {var,com,fin }] 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} Sintaxis For [ comienzo, test, incremento, sentencias ] Se evala comienzo y se ejecutan sentencias e incremento hasta que test falla. 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 autom ticamente. 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 l l

La lista vaca se representa mediante {}. l = Rest[l] asigna a la variable l (que es una lista) la lista l sin el primer elemento. 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 xn . 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 Ln . 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