Professional Documents
Culture Documents
AUTOMATAS FINITOS,
EXPRESIONES REGULARES y
GRAMATICA FORMAL
Alfonso Abarca
Departamento de Electrnica e Informtica
San Salvador, enero de 2002
INDICE
Introduccin
Seccin 1: Importancia de la teora de autmatas,
expresiones regulares y gramtica formal
i
1
13
23
33
43
53
Referencias bibliogrficas
65
Introduccin
La intencin con la que se elaboran estas notas sobre autmatas finitos, expresiones
regulares y gramtica formal, es la de proporcionar material de apoyo para la materia de
teora de lenguajes de programacin.
La experiencia al impartir esta materia en los ltimos aos me ensea que el estudiante
de Licenciatura en Computacin se enfrenta de pronto y sin previo aviso a una teora
para la que no estaba preparado, ya sea por los formalismos de la matemtica que se
usan, por el grado de rigurosidad con que se enfoca la teora o por que al principio no
comprende el rol que los autmatas jugarn posteriormente en la teora de lenguajes de
programacin.
Por supuesto que existe una extensa y excelente bibliografa sobre estos temas, de
lectura obligatoria para todo principiante en la materia, pero de nuevo la experiencia
indica que el terreno resulta arduo para el estudiante de computacin cuyas bases
matemticas son dbiles o que dispone de poco tiempo para asimilar los conceptos
bsicos.
Decimos que el estudiante dispone de poco tiempo para asimilar los conceptos bsicos
no en razn de su disponibilidad horaria para el estudio, sino ms bien, por el hecho de
que la teora de autmatas es solo la introduccin a la teora de lenguajes de
programacin, y de pronto, estos conceptos antes desconocidos (junto con la gramtica
formal), se vuelven pilar fundamental en el desarrollo temtico de la materia.
En el desarrollo de este trabajo me apoyar en las notas escritas para cursos de Teora
Matemtica de la Computacin y Teora de la Compilacin que he impartido en el
transcurso de los ltimos 15 aos, pero no debe presuponerse absoluta originalidad,
puesto que en muchos lugares me he basado en la bibliografa existente y en algunas
oportunidades se parafrasea a los grandes investigadores de estos temas.
En cada seccin de estas notas, los conceptos ha estudiar se apoyan con ejemplos, y por
supuesto, al final de cada seccin se encontrarn ejercicios de refuerzo que el estudiante
deber de realizar para ampliar su dominio sobre estos conceptos.
Al final de estas notas se hace referencia a la bibliografa, de modo que el estudiante no
sustituya la lectura de los libros clsicos por estas sencillas notas de apoyo.
El enfoque es formal, por lo menos en el sentido que se necesita que el estudiante
maneje medianamente bien los conceptos matemticos bsicos que le fueron
proporcionados en los primeros aos de la carrera. Solo he omitido la demostracin de
algn teorema cuando he considerado que est ms all de los conocimientos
matemticos promedio del estudiante que cursa la materia de teora de lenguajes de
programacin.
Aunque estas notas se escriben como material de apoyo a la materia de teora de
lenguajes de programacin, otros lectores interesados en el tema tambin podran
encontrar secciones que despierten su inters o refuercen sus conceptos sobre estos
temas.
iii
Seccin 1
Importancia de la Teora de Autmatas,
Expresiones Regulares y Gramtica Formal
Es un hecho empricamente comprobado que la mayora de personas (estudiantes o no)
cundo escuchan la frase Ciencias de la Computacin, inmediatamente piensan en una
computadora. Esto de ninguna manera es incorrecto, pues este instrumento llamado
Computadora forma ahora parte de nuestra vida cotidiana y por asociatividad todos
tenemos la tendencia a pensar en una computadora al escuchar la palabra computacin.
Si lo pensamos con un poco ms de detenimiento, tambin podra asociarse a la frase
Ciencias de la Computacin el trmino Computar. Esto pareciera solo un juego de
palabras si no fuese por el hecho que detrs del trmino computar se encuentran las
nociones ms profundas y fundamentales de las Ciencias de la Computacin.
Las preguntas : Qu es computar? , Cul es la nocin de problema computable?,
Son todos los problemas computables? son de capital importancia en computacin y de
hecho las respuestas que se dan a ellas definen los fundamentos de toda esta ciencia.
Sorprendentemente estas preguntas y sus respuestas se vienen estudiando desde mucho
antes de la invencin de la computadora. El desarrollo formal del concepto computar y
mquina de cmputo es resultado de los trabajos del matemtico ingls Alan Turing
(19121954) que se remontan hasta el ao 1936.
Tal como escribe Guillermo Levine en (1): "Como resultado de las investigaciones de
Turing ahora sabemos cules son algunas limitantes, inherentes a nuestro sistema de
pensamiento, de los mecanismos mentales para averiguar la estructura formal del
mundo. Estos estudios inauguran la teora matemtica de la computacin, de la cual las
computadoras son tan solo un aspecto, el ms visible sin duda".
La formalizacin de estos conceptos da a luz algunos modelos y nociones matemticas
que forman, digmoslo as, un valioso instrumental para el estudio de problemas de
fondo en las ciencias de la computacin.
Los autmatas finitos y las expresiones regulares son pilar de esta teora matemtica de
la computacin y aparecen de una u otra forma de manera reiterada en muchas reas de
las ciencias de la computacin y la electrnica. En particular, para el caso que nos
ocupa, las expresiones regulares sern usadas como metalenguaje para describir las
expresiones que son procesadas por una fase dentro de un compilador. An ms, esta
fase del compilador ser programada en lenguaje C simulando el comportamiento de un
autmata finito.
Si se desea un excelente ejemplo de la aplicacin de los autmatas finitos en
computacin, se invita al lector a revisar la literatura sobre Redes Neuronales, que es
una exitosa e interesante aplicacin de estos modelos matemticos.
4
Seccin 2
Definiciones bsicas
Ejemplos de prefijos:
Si x=ABB1* es una palabra formada sobre algn alfabeto, entonces:
? ,A,AB,ABB,ABB1 y ABB1* son todos los prefijos de la palabra x.
Obsrvese que la palabra vaca es prefijo de toda palabra.
Matemticamente un prefijo se define as:
Si x,y son palabras, entonces:
y prefijo de x si existe una palabra z / yz=x
Ejemplos de sufijos:
Si x=ABB1* es una palabra formada sobre algn alfabeto, entonces:
? ,*,1*,B1*,BB1*,ABB1* son todos los sufijos de la palabra x.
Obsrvese que la palabra vaca es sufijo de toda palabra.
Matemticamente un sufijo se define as:
Si x,y son palabras, entonces:
y sufijo x si existe z / zy=x
Subpalabra: Si x es palabra, una subpalabra de x es cualquier
sucesin consecutiva de smbolos en x.
Ejemplos de subpalabras:
Si x=*abc es una palabra formada a partir de algn alfabeto, entonces
ab, abc, *a y ? son ejemplos de algunas subpalabras de x.
Un teorema es cualquier proposicin susceptible de ser probada usando razonamientos lgicos vlidos.
i=0
Obsrvese que cada conjunto en la unin se puede ordenar, puesto que es finito, luego
podemos formar una sucesin con las palabras de ?* colocando los elementos del primer
conjunto (de hecho es la palabra vaca), seguido de los elementos del segundo conjunto
(que es el mismo alfabeto), seguido de los elementos del tercer conjunto, etc.
A este orden se le conoce como "Orden Lexicogrfico".
(Q.E.D)
Ahora, recordando un poco ms de teora de conjuntos podemos contestar a la pregunta
Cuntos lenguajes se pueden formar a partir de un alfabeto?
10
?*
L2
*
L1
*
palabras
* * *
*
*
*
*
*
*
L3
*
*
*
*
*
*
*
*
*
11
Pero tambin hay lenguajes con un nmero infinito de palabras que pueden ser
representados con un nmero finito de smbolos:
Ejemplo 2: Sea ? un alfabeto, y L1 , L2
?* (es decir, L1,L2 son lenguajes formales
sobre ?) con un nmero infinito de palabras, entonces la concatenacin de L1 con L2 se
denota:
L1 . L2 = L1L2 = {xy / x ? L1 y y ? L2}.
Ejemplo 3: Describir al lenguaje de todos los nmeros binarios pares.
El lenguaje de los nmeros binarios es de especial importancia en teora matemtica de
la computacin (y por supuesto en la computacin en general) y la mayora de ejemplos
que seguirn en estas notas, usarn de manera reiterada a este lenguaje.
En este ejemplo describiremos por comprensin al lenguaje de los nmeros binarios
pares L.
No es difcil probar (ver ejercicio #2), que :
Un nmero binario es par si y solamente si termina en cero,
De aqu se sigue inmediatamente que si ?={0,1}, entonces:
L={y0 / y ? ?*}
Ejemplo 4: En el ejemplo anterior se han repetido nmeros binarios. Aunque la palabra
10 y la palabra 010 son distintas, su equivalente numrico es el mismo: ambas
representan al entero 2. De hecho hay infinitas repeticiones para cada par: 10, 010,
0010, etc. Describir al lenguaje de los binarios pares sin repeticin.
El hecho de que existan repeticiones no quiere decir que hallamos cometido un error en
el ejemplo anterior. La descripcin es correcta desde el punto de vista de la
representacin, pero ahora el lenguaje por describir es distinto e indica que debemos
omitir estas repeticiones. Si ?={0,1}, entonces proponemos inicialmente que el lenguaje
de los binarios pares sin repeticin es:
L={1y0 / y ? ?*},
Lo cual elimina la posibilidad de repeticin. Pero debemos de ser ms cuidadosos al
describir por comprensin a un lenguaje. Recuerde que estamos bajo la notacin de la
teora de conjuntos y por tanto la rigurosidad matemtica debe de ser respetada. Un
examen ms minucioso de la representacin propuesta nos indica que NO representa al
lenguaje solicitado. Porqu?.
12
Porqu no contiene a todos las palabras binarias pares!. Se ha omitido al binario par
cero. La justificacin de que solamente un par entre infinitos es el que se ha omitido no
vale en teora de conjuntos. Sencillamente la representacin de arriba es incorrecta.
Considere ahora a: L={1y0 / y ? ?*}U{0},
Esta nueva representacin corrige el error de omisin y soluciona el problema.
13
Ejercicios
1. Sea el alfabeto ?={a1,a2,...,an} :
1.1. Indicar cuntas palabras tienen los siguientes conjuntos
i)
ii)
iii)
?0 = { x / |x|<=0}
?1 = { x / |x|<=1}
?2 = { x / |x|<=2}
14
Seccin 3
Autmatas Finitos Determinsticos
El conteo del nmero de lenguajes que se pueden formar sobre un alfabeto result en el
abrumador infinito. An ms, en un infinito en donde la caracterstica del orden est
ausente.
El estudio de la teora de lenguajes y en particular la de los lenguajes de programacin,
se sustenta fundamentalmente en el conocimiento de la estructura de los lenguajes.
Cmo podemos inferir algo sobre la estructura de los lenguajes si son tantos?
Una primera aproximacin a la estructura de los lenguajes son los Autmatas Finitos
(desde ahora FA de su abreviatura en ingls). Los FA son modelos matemticos que nos
permitirn estudiar una clase de lenguajes importantes.
Los FA no son de uso exclusivo de la teora matemtica de la computacin. Estas
"mquinas" se usan para representar otro tipo de fenmenos que se caracterizan por
pasar siempre de un estado a otro de forma discreta, siendo siempre el nmero de
estados finito (de all el nombre de autmatas finitos).
Por ejemplo: la electrnica usa los FA para diagramar todos los cambios de estado
posibles en componentes que usan lgica digital, muchas otras mquinas como por
ejemplo una sencilla mquina expendedora de chicles puede basar su operacin en un
FA.
Definicin: Un autmata finito determinstico (DFA por sus siglas en ingls) es un
quintuplete (Q, ?, ?, q0, F) donde:
a)
b)
c)
d)
e)
...
a1 a
a2
a3
...
a n1
an
...
Direccin de avance
Cabeza lectora
Control
finito
led cambiando de color
?(q2,0) = q3
?(q2,1) = q0
?(q3,0) = q2
?(q3,1) = q1
Ntese que el conjunto de estados finales de esta DFA consta solamente del mismo
estado inicial.
De particular importancia es la especificacin de la funcin de transicin. Lo primero
que debe verse es que verdaderamente sea una funcin, es decir, que todo elemento de
su dominio QX? tiene una imagen y ningn elemento de su dominio tiene ms de una
imagen.
16
0
q1
q0
q3
q2
1
q2
q3
q0
q1
Los DFA se pueden especificar sin usar todo el formalismo matemtico de la definicin
de una manera ms intuitiva, usando los llamados diagramas de transicin de estados.
Los diagramas de transicin de estados son grafos en los cuales un estado se simboliza
por un circulo, los estados finales con doble circulo y se dibujan flechas dirigidas para
especificar las transiciones de ?, por ejemplo, para el caso anterior tenemos:
0
qo
1
q1
0
0
q3
q2
0
Con el diagrama de transicin podemos ensayar como funciona el DFA sobre una
palabra cualquiera: 0110.
El DFA siempre comienza a trabajar desde su estado inicial qo, y analizando el primer
smbolo de la palabra, en este caso 0. El diagrama de transicin indica que el DFA
estando en el estado qo y viendo al 0 pasa a q1. Ahora hay que analizar que hace el DFA
estando en el estado q1 y viendo al segundo smbolo de la palabra: 1.
El DFA estando en q1 y viendo a un 1 pasa a q3. Ahora estando en q3 y viendo al tercer
smbolo, el 1, regresa a q1.
Finalmente desde q1 y viendo al ltimo smbolo, un 0, pasa a q0.
El lector puede comprobar que con la palabra: 01010 el DFA termina en q1.
17
La ilustracin del recorrido del DFA anterior ejemplifica claramente la mecnica con la
que se espera operen los autmatas, sin embargo, la funcin ? tal como esta
especificada, no permite que los DFA operen sobre palabras completas a partir del
estado inicial, sino solamente sobre un smbolo desde algn estado (su dominio es QX?).
Por esto definiremos una funcin de transicin extendida a partir de ? que legitime la
operacin de los DFA sobre palabras completas.
Definicin: Dado el DFA M y su funcin de transicin ?, definimos a ?^, la funcin de
transicin extendida de M, as:
?^ :Qx?* Q , tal que:
i)
?^ (qi, ?)
ii)
?^ (qi, aj) = ?(qi, aj) , para todo qieQ y para todo aje?
iii)
18
q1
0
Eje X
0
q2
q3
19
Si los autmatas finitos nos servirn para analizar (o aceptar) lenguajes, deberamos
proseguir contando cuntos FA se pueden formar, con la esperanza de que al menos
exista uno que reconozca a cada lenguaje posible sobre un alfabeto.
Comenzaremos por observar que dado un alfabeto ?, el conjunto de todos los
autmatas finitos M= (Q, ?, ?, q0, F) que se pueden forma es infinito. Basta ver que
podemos construir autmatas con cualquier nmero finitos de estados, sin restriccin, es
decir: |Q| ? N. (Dado un nmero natural, siempre se puede construir un FA con ese
nmero de estados).
Esto nos acerca a materializar nuestras esperanzas, puesto que el nmero de lenguajes
que se pueden formar sobre un alfabeto es infinito y el nmero de autmatas tambin.
Sin embargo, existe un hecho que no probaremos aqu, y es que aunque el nmero de
autmatas que se pueden formar es infinito, este infinito es numerable.
Ambos conjuntos, el de los lenguajes sobre un alfabeto, y el de los autmatas con este
alfabeto son infinitos, pero el primero es no numerable y el segundo es numerable.
Aunque al principio parezca sorprendente este hecho, hace que por ms autmatas que
se construyan, nunca se alcancen a cubrir todos los lenguajes.
Ms adelante veremos que los FA no solo son menos que los lenguajes formales, sino
que, tambin son incapaces de aceptar lenguajes con una estructura relativamente
compleja. Esto no debe de desanimarnos en nuestro estudio, porque la clase de lenguajes
aceptados por los FA, aunque pequea, es de mucha importancia en la teora de
lenguajes de programacin. Esta clase de lenguajes aceptados por los FA sirve para
definir los componentes lexicogrficos de los lenguajes de programacin.
En teora matemtica de la computacin, las limitaciones impuestas por los FA se
superan definiendo modelos ms poderosos (mquinas ms poderosas): autmatas de
pila determinsticos, autmatas de pila no determinsticos, mquinas de Turing, etc.
El estudiante interesado puede consultar la bibliografa, en particular (3) para ampliar
sus conocimientos en estos interesantes temas.
1
1
q1
q0
0
El autmata M1 acepta a todas las palabras binarias que terminan en cero, pero
L(M1) ? L1, puesto que M1 acepta ms. M1 acepta a ?, la palabra vaca, debido a que
estando en qo, M permanece en qo sin ver ningn smbolo.
Esto es: ?^(q0, ?)
= qo ? F.
1
0
q0
q1
1
22
21
Pues bien, los compiladores poseen un autmata finito codificado que es capaz de
reconocer el lxico definido para los identificadores, y as aceptar o rechazar a los
identificadores. El DFA es como se muestra el diagrama de transicin:
digito
letra
letra
digito
q0
letra
coc
q1
digito
q2
coc
coc
Hemos simplificado las cosas indicando sobre los caminos de las transiciones conceptos
como letra, digito y coc (cualquier otra cosa que no sea letra y digito).
Ms adelante definiremos a otros miembros importantes de la familia de los autmatas
finitos: los autmatas finitos no determinsticos y los autmatas finitos no
determinsticos con movimientos vacos.
22
Ejercicios
1. Considerar a L2={1x0 / x ? ?*}U{0 } , ?={0,1}. L2 es el lenguaje de los binarios
pares sin repeticin. Encontrar un DFA que acepte a L2.
Escribir completamente el formalismo matemtico para este autmata,
incluyendo la escritura de la funcin de transicin como en la definicin y
adems en forma de tabla. Dibuje un diagrama de transicin de estados para el
autmata.
2. Describir por extensin al lenguaje aceptado por el siguiente DFA:
0
1
0,1
1
q0
0
q1
q2
3. Encontrar un DFA que acepte a los binarios divisibles entre 8 sin repeticin.
4. Encontrar un DFA que acepte a los binarios divisibles entre 8 con repeticin.
5. Encontrar autmatas finitos que acepten a los lenguajes siguientes sobre ?={0,1}
a. El conjunto de todas las palabras que terminan en 00
b. El conjunto de todas las palabras con 3 ceros consecutivos.
6. Especificar un DFA que acepte a todas las palabras binarias divisibles entre 3.
7. Demostrar que para todo lenguaje finito siempre se puede construir un DFA que
lo acepte.
8. Sea ? la funcin de transicin para un DFA. Probar que para cualquier par de
palabras de entrada x,y y un estado q se cumple que:
?^ (q,xy)= ?^ (?^ (q,x),y).
Sugerencia: Aplique el axioma de induccin completa sobre |x|
9. Definimos a un nmero real simplificado y sin signo de la siguiente manera:
######.######
donde cada smbolo "#" representa a cualquier dgito entre 0 y 9.
Estos reales simplificados obligatoriamente tienen una parte entera y una parte
decimal, por lo que nmeros como 123. o .123 NO son nmeros reales
23
simplificados y sin signo. Construir un DFA que acepte a los nmeros reales
simplificados y sin signo.
10. Encontrar un DFA que acepte al lenguaje:
L={x / x empieza con 1, termina con 1 y no tiene 2 unos consecutivos}.
11. Sea M=(Q, ?, ?, q0, F) DFA y x,y,z ? ?*, q ? Q.
Probar que si ?^ (q,x)= ?^ (q,y) entonces ?^ (q,xz)= ?^ (q,yz).
12. Elaborar un programa de computadora en lenguaje C que simule a un DFA.
Sugerencia: Puede suponer que en ste caso ? est formado por todos los
caracteres que se pueden generar usando el teclado de la computadora o por
subconjuntos de estos.
24
Seccin 4
Una primera aproximacin a la clasificacin de los lenguajes
Antes de continuar nuestro estudio de los autmatas, es bueno detenerse para intentar
revisar lo que hemos conseguido. Veremos a continuacin que ya tenemos elementos
para brindar alguna clasificacin sobre los lenguajes formales, sin que esta clasificacin
sea muy profunda. Sin embargo y a pesar de todo, lo que antes era el infinito de los
lenguajes formales, se convertir en un todo ms ordenado.
Consideremos una primera clasificacin de los lenguajes, as :
Por su cardinalidad:
i)
ii)
No todos los lenguajes posibles formados sobre un alfabeto son representables y esto se
deriva de que su nmero es infinito no numerable. No existe ningn mtodo de
especificacin de lenguajes que sea capaz de definir todos los lenguajes sobre un
alfabeto.
La figura 4.1 muestra la relacin entre las 2 clasificaciones anteriores:
Lenguajes infinitos
Lenguajes representables
con un nmero finito de
smbolos
Lenguajes
finitos
25
GOTO 20
GOTO 10
END
Algoritmo G
Salida
x?L
El lector encontrar la definicin
de lenguaje
x ? Lrecursivo en teora matemtica de la
computacin muy distinta a la clsica definicin de lenguaje recursivo que
probablemente conoci de sus cursos de programacin.
26
All recibi la definicin de lenguaje recursivo como todo aquel en el que se permite
que un procedimiento, mdulo, bloque o funcin se invoque a si mismo. En teora
matemtica de la computacin la acepcin es obviamente diferente, por motivos que no
discutiremos aqu.
x (palabra) y
pertenece a L
Proc. P
SI
x (palabra) y
no pertenece a L
Proc. P
NO
x (palabra) y
no pertenece a L
Proc. P en un loop
infinito
????
No hay salida
27
28
x Copia
(palabra)
x
Proc. P
Proc. P
Posible Loop
SI
SI
SI
NO
La explicacin del algoritmo construido es como sigue: Dada x palabra la introducimos
al programa quin inicialmente copia x para obtener un duplicado. (Este es un proceso
trivialmente finito en tiempo). Una x se introduce en el procedimiento P y la copia en P.
Supongamos que x ? L, entonces el procedimiento P contestar SI. Ya no importa si P
contesta NO o entra en un loop. Nuestro programa ya contest en un tiempo finito SI.
Ahora supongamos que x ? L, entonces por definicin x ? L y ser el procedimiento P
quin contestar SI, con la operacin de negacin obtenemos NO como respuesta en un
tiempo finito.
Luego nuestro dispositivo siempre decide en un tiempo finito si x ? L.
(Q.E.D.)
Demostracin:
Llamemos A al conjunto de algoritmos y P al conjunto de procedimientos, entonces por
definicin A P. Esto es, todo algoritmo es procedimiento.
(Q.E.D.)
Armados con estos nuevos hallazgos, procedemos a ofrecer nuevas clasificaciones para
los lenguajes:
Todos los lenguajes sobre ?
Lenguajes recursivos
Lenguajes
finitos
Lenguajes recursivos
Lenguajes
finitos
qi
qj
a
...
Fig. 4.1: Si M hace un loop entre qi y qj, podemos usar este loop
para desbalancear a la palabra dando tantas vueltas como se quiera y
luego continuando hacia el estado de aceptacin.
Este teorema tiene consecuencias profundas sobre la capacidad de los autmatas finitos
determinsticos de aceptar lenguajes, confirmndonos lo que ya habamos previsto al
comparar la cantidad de lenguajes formales con la cantidad de autmatas: es imposible
construir un DFA para cada lenguaje formal sobre un alfabeto.
La estructura de esta mquina de estados es tal, que solo puede recordar usando el
mecanismo de pasar de un estado a otro, y esta mecanismo es limitado y finito.
33
Ejercicios
1. Justificar la afirmacin de que todo algoritmo es procedimiento.
2. Sea L={ancan / n ? N} un lenguaje sobre el alfabeto {a,c}.
Elaborar un programa de computadora en lenguaje C que teniendo como entrada
una palabra formada a partir del alfabeto {a,c} indique si la palabra est o no en
L.
3. Demuestre que si existe un lenguaje recursivamente numerable, pero no
recursivo, entonces existe un lenguaje que no es recursivamente
numerable.
4. Sea L={ai bi /i>=0}. Se puede construir un DFA que acepte a L?.
Justifique plenamente su respuesta.
5. Indiquemos que L es recursivo escribiendo Lrec e indiquemos que L es
recursivamente numerable escribiendo Lrec num.
i)
ii)
34
Seccin 5
Autmatas Finitos No Determinsticos
Reformularemos ahora la definicin de autmata finito determinstico para permitir
cierto nivel de paralelismo en la manera en la que los autmatas funcionan
Recordemos antes una definicin bsica de teora de conjuntos: La nocin de conjunto
potencia.
Definicin: Si A es un conjunto entonces al conjunto de todos los subconjuntos que se
pueden formar a partir de A se le llama el conjunto potencia de A, y se simboliza P(A).
Ejemplo 1: A={1,2,3}, entonces: P(A)={ {},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} }.
Ntese que el conjunto vaco y el subconjunto formado por el mismo conjunto original
estn en el conjunto potencia.
Tambin recordemos que en teora de conjuntos al conjunto vaco se le simboliza con la
letra . Esto es ={}, luego : P(A)={ ,{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} }.
Un resultado importante de teora de conjuntos referente a P(A) es que:
Si el conjunto A tiene n elementos entonces P(A) tiene 2n elementos.
(Ver ejercicio #1 de sta seccin)
Definicin: Un autmata finito no determinstico (NDFA por sus siglas en ingls) es un
quintuplete (Q, ?, ?, q0, F) donde:
i)
ii)
ii)
iv)
v)
es decir, que el NDFA en el estado qi no posee informacin para efectuar una transicin
si lee al smbolo aj.
Q={q0,q1,q2},
?={0,1},
F={q2}
y la funcin de transicin de la siguiente manera:
?(qo,0)={q0,q1}
?(qo,1)=
?(q1,0)={q1}
?(q1,1)={qo,q1,q2}
?(q2,0)=
?(q2,1)={q2}
El diagrama de transicin de estados para este NDFA es el siguiente:
0
0
0
1
1
qo
q1
q2
1
i)
?^(q, ?)
ii)
= { q } , para todo q ? Q
iii)
36
?^(qo,010) U ?^(q1,010)
=
?^(qo,10) U ?^(q1,10) U ?^(q1,10)
=
?^(qo,10) U ?^(q1,10)
=
U ?^(q1,10)
=
?^(q1,10)
=
?^(q0,0) U ?^(q1,0) U ?^(q2,0)
=
?(q0,0) U ?(q1,0) U ?(q2,0)
=
{q0,q1} U {q1} U
=
{q0,q1}
Definicin: Se dice que una palabra x es aceptada por un NDFA M, si qi ? ?^(qo,x) tal
que qi ? F. Esto es, al leer todos los smbolos de la palabra x, el autmata queda en algn
estado final.
Definicin: El lenguaje aceptado por un NDFA es el conjunto formado por todas las
palabras que el NDFA acepta.
37
38
?([qo,q1],0) =[qo,q1]
?([qo,q1],1) =[q0,q1,q2]
?([qo],0) =[qo,q1]
?([qo],1) = []
?([qo,q2],0)
?([qo,q2],1)
=[qo,q1]
=[q2]
?([q1],0) =[q1]
?([q1],1) =[q0,q1,q2]
?([q1,q2],0)
?([q1,q2],1)
=[q1]
=[q0,q1,q2]
?([q2],0) = []
?([q2],1) =[q2]
?([q0,q1,q2],0) =[qo,q1]
?([q0,q1,q2],1) =[q0,q1,q2]
0,1
1
[qo]
[]
[q2]
[qo,q2]
0
0
0
0
[qo,q1]
[qo,q1,q2]
[q1]
[q1,q2]
0
Si se observa detenidamente este diagrama, se observar que los estados [q2], [q1], [qo,q2]
y [q1,q2] no son alcanzables desde el estado inicial [qo]. Luego el DFA puede ser
simplificado para funcionar con menos estados. El siguiente diagrama muestra esta
simplificacin junto con los estados renombrados de manera ms familiar:
0,1
1
q2
qo
0
0
q1
q3
1
0
1 lenguajes aceptados por los
De los dos teoremas anteriores podemos concluir que los
DFA son los mismos que aceptan los NDFA y viceversa. Ningn autmata es ms
poderoso que el otro.
40
0
qo
q1
?
0,1
q2
Se tiene que :
Q={qo,q1,q2}, ?={0,1}, F={q1} y :
? (qo,0) ={q1}
? (qo,1) =
? (qo, ?) ={q2}
? (q1,0) ={q1,q2}
? (q1,1) ={q2}
? (q1, ?) =
? (q2,0) ={q0}
? (q2,1) ={q1}
? (q2, ?) ={q1}
En este caso se incluyen cambios de estado sin necesidad de ver un smbolo.
Por ejemplo: la palabra 10 comenzando en q0 alcanza al estado final q1, puesto que
desde qo se llega a q2 sin necesidad de ver ningn smbolo (la transicin se hace por el
camino etiquetado ?), de all se pasa a q1 con el smbolo 1 de la palabra y luego viendo a
un 0 se queda en q1 y pasa q2 (finaliza en ambos estados).
41
Las nociones de palabra aceptada y lenguaje aceptado por un NDFA? son anlogas a
las de un DFA y NDFA desde el punto de vista intuitivo, aunque su definicin
operacional es relativamente ms compleja.
Teorema 5.3: Si M es un NDFA que acepta al lenguaje L(M) entonces existe un
NDFA? que acepta al mismo lenguaje.
En el ejercicio #5 se invita al lector a formular una demostracin de este ltimo teorema.
El siguiente teorema, que se da sin demostracin, completa la equivalencia entre los
NDFAs y los NDFA? :
Teorema 5.4: Si M es un NDFA? que acepta al lenguaje L(M) entonces existe un
NDFA (sin movimientos vacos) que acepta al mismo lenguaje.
Los teoremas 5.3 y 5.4 cierran el ciclo de autmatas finitos, estableciendo la
equivalencia entre los 3 modelos matemticos presentados aqu.
El dibujo que sigue muestra grficamente estas equivalencias:
DFA
NDFA
NDFA?
42
M1
q1
q2
q0
q3
?
1
q5
q6
q4
M2
0
0
43
Ejercicios
Si A es un conjunto con n elementos, probar que P(A) tiene 2n
elementos.
1.
2.
3.
0
0
0,1
q1
1
1
q2
q3
0,1
4.
5.
44
Seccin 6
Expresiones Regulares
V+S es una expresin regular que denota al conjunto formado por VUS
VS es una expresin regular que denota al conjunto formado por VS: la
concatenacin de V con S.
V* es una expresin regular que denota al conjunto formado por la
cerradura de Kleene de V.
iii)
?
A
B
/
x
y representa al lenguaje {}
y representa al lenguaje { ? }
y representa al lenguaje { A }
y representa al lenguaje { B }
y representa al lenguaje { / }
y representa al lenguaje { x }
(0+1)*1(00+01+10+11)
Solucin: Observamos que el lenguaje puede iniciar con cualquier combinacin de
ceros y unos, incluyendo ningn 0 y ningn 1, pero definitivamente, debido a
que a continuacin se encuentra la expresin 1(00+01+10+11), debe de
tener un 1 como tercer smbolo de derecha a izquierda.
La expresin regular (0+1)*1(00+01+10+11) denota al lenguaje de los
binarios con un 1 como tercer smbolo de derecha a izquierda.
Ejemplo 6: En este ejemplo encontraremos una aplicacin de mucho inters de las
expresiones regulares a la computacin.
En los lenguajes de programacin es usual que los identificadores se
construyan comenzando con una letra del alfabeto y a continuacin,
combinando cualquier cantidad de letras y dgitos.
Describir a los identificadores usando una expresin regular.
Definimos a :
letra={a,b,..,z,A,B,...,Z}
digito={0,1,2,...,9}
Luego, la expresin regular buscada es:
letra(letra+digito)*
Ahora centraremos nuestra atencin en corroborar que el siguiente diagrama se cumple:
Teorema 6.2
Expresiones
regulares
Teorema 6.1
DFA
NDFA?
NDFA
Los teoremas 6.1 y 6.2 nos mostrarn la equivalencia entre las expresiones regulares y
los autmatas finitos. Con esto cerraremos el crculo y estaremos en posibilidad de
47
declarar que las expresiones regulares describen a la clase de lenguajes aceptados por
los autmatas finitos.
Teorema 6.1: Sea ? una expresin regular que denota a un lenguaje sobre ?, entonces
existe un NDFA? con un solo estado final y sin transiciones en ese estado que acepta al
mismo lenguaje.
Demostracin:
Definiremos a las expresiones regulares bsicas como: , ? y ai??. Es decir, las
expresiones regulares bsicas sern aquellas sin operadores, en otro caso se denominarn
compuestas.
La demostracin de este teorema es por induccin completa sobre el nmero de
operadores de ?.
i)
qo
ii)
qf
?(qo, ?)={q1,q2}
?(q, a)= ?1(q, a)
q ? Q1{f1} y a ? ?1U{ ? }
?(q, a)= ?2(q, a)
q ? Q2{f2} y a ? ?2U{ ? }
?(f1, ?)=?(f2, ?)={f0}
M grficamente es as:
M1
q1
...
f1
q0
f0
M2
q2
...
f2
Deber ahora estar claro que M es un NDFA? con un solo estado final y
sin transiciones en ese estado construido de manera que acepta a r+s.
b) rs. De manera anloga, en este caso definimos a
M=(Q1UQ2, ?1U?2, ?, q1, {f2}), tal que:
i)
ii)
iii)
q ? Q1{f1} y a ? ?1U{ ? }
q ? Q2 y a ? ?2U{ ? }
M grficamente es as:
M1
q1
...
?
f1
M2
q2
...
f2
49
c) r*. Por hiptesis de induccin completa, existe M1=(Q1, ?1, ?1, q1, {f1) }
NDFA? con un solo estado final y sin transiciones en ese estado, tal que:
L(M1)=r.
Sea q0 un nuevo estado inicial y f0 un nuevo estado final, definimos:
M=(Q1U{q0,f0}, ?1, ?, q0, {f0}), tal que:
i)
ii)
M grficamente es as:
?
?
M1
...
q1
q0
f1
f0
?
Afirmamos que M es un NDFA? con un solo estado final y sin
transiciones en ese estado construido de manera que acepta a r*.
Invitamos al lector para encontrar los argumentos que permitan justificar
esta ltima afirmacin.
(Q.E.D.)
La demostracin anterior es otra de estas valiossimas demostraciones constructivas, esto
es, adems de demostrar el teorema, los argumentos de la demostracin producen un
algoritmo de construccin.
Ejemplo 7: Sea ?={0,1}. Encontrar un autmata finito que acepte al lenguaje descrito
por la expresin regular 1(0+1)*0.
Solucin: Esta claro cul es el autmata finito que acepta a 1(0+1)*0, pues sta
expresin caracteriza a los binarios pares sin repeticin. Solo deseamos aqu encontrar
este autmata por un camino distinto al de la intuicin o la heurstica. Lo construiremos
usando el algoritmo del teorema 6.1.
0
qo
q1
50
q2
q3
qo
?
q4
q5
1
q2
q3
?
q6
qo
q1
?
?
q7
q5
q4
1
q2
q3
?
?
y finalmente, terminamos con el autmata para 1(0+1)*0:
1
q9
?
q8
qo
q1
?
q6
?
q5
q4
q7
q10
0
q11
1
q2
q3
?
En el NDFA? anterior los estados pueden ser renumerados y se pueden simplificar
?
estados redundantes, de forma que el autmata resultante sea ms sencillo.
Parece que la intuicin o la heurstica funcionan mejor en ciertos casos, y as es.
El teorema 6.1 resulta til cuando la expresin regular es medianamente complicada.
Incluso, un programa de computadora puede ser escrito para tener como entrada una
expresin regular y usando el algoritmo anterior producir cmo salida un FA que acepte
51
al lenguaje descrito por aquella. (Ver ejercicio #10). Sin embargo, en otras
circunstancias ser preferible construir el autmata sin usar el algoritmo.
El siguiente teorema se da sin demostracin. Revise (3) si desea obtener una
demostracin completa del teorema.
Teorema 6.2: Si M es un DFA que reconoce al lenguaje L(M), entonces existe una
expresin regular ? que denota al mismo lenguaje.
Esto cierra el ciclo propuesto, y por tanto podemos afirmar:
La clase de lenguajes aceptados por los autmatas finitos es
precisamente la clase de lenguajes descrita por las expresiones
regulares.
Teorema 6.3: Las expresiones regulares son cerradas respecto al complemento y la
interseccin.
Demostracin: Ya que conocemos la equivalencia entre expresiones regulares y
autmatas, podemos ahora usar esta equivalencia para nuestras demostraciones.
i)
ii)
(Q.E.D.)
Como puede observarse, los conceptos pueden ser extendidos de forma inmediata para
probar muchas propiedades interesantes sobre las expresiones regulares, conformando lo
que se conoce como "lgebra regular".
Ejercicios
1.
10+(0+11)0*1
01(((10)*+111)*+0)*1
2.
3.
4.
6.
Sean L1 y L2 lenguajes denotados por expresiones regulares.
Demostrar que:
(L1?L2)U(L1?L2)= si y solo si L1=L2.
7.
M1
0
1
qo
q2
0
qo
0
q1
Demostrar que todo lenguaje que puede ser expresado por medio de
una expresin regular es recursivo.
9.
Lr={x / (x al revs) ? L }
53
Probar que si existe una expresin regular para describir a L entonces tambin
existe una expresin regular para describir a Lr.
10.
54
Seccin 7
Gramtica Formal
En la seccin 1 comentbamos sobre la posibilidad de escribir un compilador.
Decamos que un compilador tiene como objetivo leer un programa fuente escrito en
algn lenguaje de alto nivel y traducirlo a cdigo objeto de una computadora.
El primer paso antes de intentar escribir un compilador es tener clara la especificacin
del lenguaje a compilar. Con esto queremos decir que las reglas del lenguaje deben de
estar especificadas por escrito de alguna forma precisa y sin ambigedad, pues el
compilador deber (como todo algoritmo) revisar de forma mecnica un programa
escrito en este lenguaje y decidir en un tiempo finito si est bien escrito o no, cotejando
en cada momento si no se han cometido violaciones a las reglas.
Por otro lado, las reglas que se definan para el lenguaje deben de ser amplias y
adecuadas como para generar programas suficientemente expresivos, de alto nivel y que
ayuden a los usuarios a resolver problemas complejos usando todo el poder de la
computadora.
Son las expresiones regulares adecuadas para definir con ellas a un lenguaje de
programacin?. Desgraciadamente la respuesta es NO.
Las expresiones regulares no son suficientes para especificar completamente a un
lenguaje de programacin de alto nivel. La razn de esto radica bsicamente en la
relativa sencillez de los lenguajes que describen, no obstante las expresiones regulares
juegan un papel importante en un compilador, permitiendo definir las componentes
lexicogrficas del lenguaje.
Fue Noam Chomsky, del Instituto Tecnolgico de Massachussets, quin por primera vez
propuso la formalizacin del concepto de gramtica, es decir, la matematizacin del
concepto a fin de poder definir y estudiar rigurosamente sus propiedades.
Estas herramientas permitieron la definicin de lenguajes de programacin expresivos y
la construccin de compiladores para estos lenguajes.
En esta ltima seccin estudiaremos brevemente algunos conceptos bsicos de gramtica
formal.
Definicin: Sea V un alfabeto. Una gramtica sin restricciones o del tipo 0, tambin
llamada natural, es un cuadruplete (Vn,Vt,P,S), donde:
a) Vn
b) Vt
*
L(G)={x / S==>x y x ? Vt*}
G
El lenguaje generado por una gramtica G es el conjunto de todas las palabras formadas
solo por smbolos terminales que pueden derivarse a partir de S en G.
Ejemplo 5: Consideremos a la gramtica G1=(Vn,Vt,P1,S):
Vn={S,A,B}, Vt={0,1} y
P1={S>AB, B>0,A>A0,A>A1,
A>0,A>1,A> ? }.
Podemos abreviar la escritura de las producciones P1 usando el smbolo "|" para indicar
alternativa. Para el caso, P1 puede rescribirse:
P1={S>AB, B>0,
A>A0|A1|0|1| ? }.
La produccin A> ?
significa que el smbolo A puede ser sustituido por la
palabra vaca, es decir, que a partir de A se genera a la palabra vaca. Esto no contradice
la definicin de gramtica, puesto que la especificacin de que en toda produccin
?>?,
? ? V+, impide que la palabra vaca este a la izquierda de la produccin, pero no a su
derecha.
Un examen del comportamiento de las producciones en G1
muestra que:
L(G1)=(0+1)*0
Si consideramos ahora a G2=(Vn,Vt,P2,S), con:
P2={S>A0, A>A0|A1|? },
Notamos que tambin L(G2)=(0+1)*0, de lo cual se concluye que 2 gramticas distintas
pueden generar el mismo lenguaje.
Como sucede con los lenguajes aceptados por los autmatas finitos, en general no
siempre ser posible encontrar de un vistazo el lenguaje generado por una gramtica, en
especial cuando sta tiene muchas producciones complejas.
Definicin: Una gramtica sensible de contexto (CSG=Context Sensitive Grammar) o
del tipo 1, es una gramtica de tipo 0 con la restriccin de que todas las producciones
?>? cumplen con la condicin: | ? |?| ? |. (Recuerde que el operador | . | es la
"longitud de una palabra").
Definicin: Una gramtica libre de contexto (CFG=Context Free Grammar) o del tipo 2,
es una gramtica de tipo 1 con la restriccin de que todas las producciones
?>? cumplen con la condicin: | ? |=1.
58
59
G es evidentemente regular.
Si se examina con detenimiento a G se puede ver que L(G)=1(0+1)*0, el lenguaje de los
binarios pares sin repeticin.
Para el caso de las gramticas regulares, la definicin nos dice que una de las formas de
las producciones es A>aB, denominndose entonces regular por la derecha.
Se puede dar la posibilidad de que la produccin sea de la forma A>Ba, lo cul
produce una gramtica denominada regular por la izquierda.
Los nombres de los lenguajes generados por las gramticas se denominan de acuerdo a
la gramtica que las genera, para el caso:
Si G0 es natural. entonces L(G0) es natural
Si G1 es sensitiva del contexto, L(G1) es sensitivo del contexto
Si G2 es libre de contexto, L(G2) es libre de contexto
Si G3 es regular, L(G3) es regular.
Esto produce una nueva clasificacin de los lenguajes de acuerdo a la gramtica que los
produce, segn el siguiente diagrama:
L(G0)
L(G1)
L(G2)
L(G3)
Desde luego esto nos dice que todo lenguaje regular es libre de contexto, que todo
lenguaje libre de contexto es sensitivo de contexto y que todo lenguaje sensitivo de
contexto es natural.
El lector inquisitivo habr notado una cierta ligereza en la denominacin de lenguaje
regular para los lenguajes generados por una gramtica regular, puesto que por
congruencia, los nicos lenguajes que pueden denominarse con propiedad "regulares",
son aquellos que pueden ser descritos por alguna expresin regular.
El siguiente teorema legitima el uso de la expresin "regular" para estos lenguajes:
Teorema 7.1: Sea G gramtica regular, entonces L(G) es aceptado por un autmata
finito.
60
Comentario: Si L(G) es aceptado por una autmata finito, entonces existe una expresin
regular que describe a L(G).
Demostracin: Indicaremos de forma constructiva el autmata requerido y dejamos al
lector los detalles para convencerse de que dicho autmata acepta exactamente a L(G).
Como G es regular, todas las producciones son de la forma A>a o A>aB, con
A,B ? Vn y a ? Vt. Creamos el conjunto denominado [Vn], formado por los nuevos
smbolos [A] y [B].
Construimos ahora al autmata finito M, equivalente a G as:
M={[Vn]U[qf],Vt, ?, [A],{[qf]}},
(Obsrvese que a cada smbolo no terminal le asociamos un estado)
y definimos a ? de la siguiente manera:
i)
ii)
Note que las transiciones del autmata simulan de forma precisa a las reglas del
lenguaje:
a
[A]
[A]
[qf]
[B]
M acepta a L(G).
(Q.E.D.)
Ejemplo 9: Sea Vn={S,A} y Vt={0,1}.
P={S>0A|1A|0|0S|1S, A>0}
Esta gramtica es regular. Construyamos un autmata finito que acepte al lenguaje
generado por esta gramtica:
Q={[S],[A],[qf]}, ={0,1}, el estado inicial es [S], F={[qf]} y el diagrama de transicin
del autmata es como sigue:
0,1
[qf]
61
[S]
0,1
[A]
El teorema que sigue, y que se da sin demostracin, nos permitir de nuevo obtener una
nueva organizacin de lenguajes:
Teorema 7.2: Todo lenguaje sensitivo del contexto es recursivo. Esto es: existe un
algoritmo que siempre decide si una palabra pertenece o no a un lenguaje sensitivo del
contexto.
Podemos entonces dibujar el siguiente diagrama:
Todos los
lenguajes
Lenguajes rec. num.
Lenguajes
recursivos
L(G1)
L(G2)
L(G3)
Se puede probar (Ver ejercicio #2) que si L(G) es un lenguaje sensitivo de contexto,
entonces ? ? L(G). Esto significa que la palabra vaca no puede producirse a partir de las
reglas de la gramtica.
Dado que en cualquier lenguaje la palabra vaca es una palabra relevante (como en
teora de conjuntos, el vaco es fundamental), el resultado anterior impone una
importante restriccin sobre L(G) cuando G es CSG.
Uno podra pensar que dada G, CSG, la generacin de la palabra vaca es trivial si se
introducen las producciones necesarias. El siguiente ejemplo ilustra esta idea.
Ejemplo 10: Sea G=({S,A},{a,b},P,S), tal que:
62
P={S>aS|aa|bb|AS,
A>b|aA|ba}
G es CFG y por tanto CSG. Adems G no genera a la palabra vaca. Para producir a la
palabra vaca aumentemos a P la produccin S> ? y listo. En un paso S==> ?.
G
Sin embargo debemos de hacer notar que antes de introducir la nueva regla, la palabra
"a" no era producida por G, y luego de la introduccin de la nueva regla, la palabra "a"
si es producida a partir de S:
S > aS>a.
Por tanto, el lenguaje generado por G ha sido alterado. Aunque este ejemplo es sencillo,
muestra que en casos ms complejos la introduccin de una regla para producir al vaco
pudiese alterar de manera drstica a L(G).
A continuacin discutiremos un mtodo para aumentar a la palabra vaca sin alterar al
lenguaje producido por la gramtica (excepto por supuesto por la produccin de ?).
Este mtodo es conocido como extensin de la gramtica y el resultado se conoce como
gramtica extendida.
Sea G=(Vn,Vt,P,S) CSG.
Construimos G=(VnU{S1},Vt,P,S1) y S1 ? Vn. (S1 es el nuevo smbolo inicial).
Adems P=PU{S1>? si y solo si S> ??P} U {S1> ?}
Aseguramos que L(G)=L(G)U{?}. No es difcil ver esto, pues G tiene las mismas
producciones que G y lo que hemos hecho es solamente introducir un nuevo smbolo
inicial para retrazar las producciones de S.
G es la gramtica extendida de G.
Ejemplo 11: Regresemos a la gramtica del ejemplo 10 e intentemos ahora extender la
gramtica G.
Tenemos que: P={ S1>aS|aa|bb|AS, S1> ?,
S>aS|aa|bb|AS,
A>b|aA|ba}.
Al iniciar la discusin de esta seccin, decamos que era importante encontrar reglas
para definir a los lenguajes de programacin. Ahora que conocemos el concepto de
gramtica formal, estamos en posicin de decidir que tipo de gramtica conviene para
tales efectos. Hacemos hincapi en la importancia de decidir correctamente, pues luego
de definir que gramtica servir para definir a los lenguajes de programacin de alto
nivel, el problema ya no ser la generacin de frases, sino su reconocimiento por medio
de un compilador.
63
64
65
Ejercicios
1.
Vn={S,A}, Vt={x,y,z} y
P={S>xA, A>z|yA}
ii)
Vn={S,A,B}, Vt={x,y,z} y
P={S>A|B, A>xA|y, B>xB|z}
2.
3.
6.
66
Referencias bibliogrficas
(1) Levine Gutirrez, Guillermo, Introduccin a la computacin y a la
programacin estructurada, McGrawHill, Mxico.
(2) Rudin, W., Principios de anlisis matemtico, McGrawHill, Mxico.
(3) Hopcroft, John E.; Ullman, Jeffrey D., Introduction to automata theory,
languages and computation, AddisonWesley Publishing Company.
(4) Hopcroft, John E.; Ullman, Jeffrey D., Formal languages and their relations to
automata, AddisonWesley Publishing Company.
(5) Kelley, Dean, Teora de autmatas y lenguajes formales, Prentice Hall.
(6) Beckman, F.S., Mathematical theory of programming, AddisonWesley.
(7) Brookshear, J. Glenn, Teora de la computacin : lenguajes formales, autmatas
y complejidad, AddisonWesley Iberoamericana.
(8) D. Knuth, The art of computer programming, Vol I, AddisonWesley, Mass.
(9) R. Kothange, Logic and algoritms, Wiley & Sons, N.Y.
(10)Teufel, Bernard; Teufel, Thomas; Schmidt, Stephanie, Compiladores: conceptos
fundamentales, AddisonWesley Iberoamericana.
67
68