You are on page 1of 22

Notas de clase para el curso

Introducción a la Teorı́a de la Computación


I Semestre 2018
Profesor: Rodrigo De Castro K.

Capı́tulo 1

Alfabetos, cadenas y lenguajes

De manera muy amplia podrı́a decirse que la computación es la manipulación de entradas


(inputs) para producir salidas (outputs). Pero cualquier mecanismo de cómputo solamente
puede manipular un número finito de sı́mbolos en un tiempo finito. Desde el punto de
vista teórico esto impone dos restricciones básicas: el conjunto de sı́mbolos (alfabeto) debe
ser finito y se deben considerar únicamente cadenas (secuencias de sı́mbolos) de longitud
finita. Surgen ası́ los ingredientes esenciales de una teorı́a abstracta de la computación:
alfabetos y cadenas. Los conjuntos de cadenas (ya sean finitos o infinitos) se denominarán
lenguajes.

1.1 Alfabetos y cadenas


Alfabetos. Un alfabeto es un conjunto finito no vacı́o cuyos elementos se llaman
sı́mbolos. Es costumbre usar las letras griegas mayúsculas Σ, Γ, ∆ para denotar alfabetos.
De ser necesario se utilizan también subı́ndices: Σ1 , Σ2 , Σ3 . . .
 
Ejemplos Los siguientes son algunos de los alfabetos más conocidos:
 

• El alfabeto de los idiomas occidentales (minúsculas, 26 sı́mbolos).


Σ = {a, b, c, d, . . . , w, x, y, z}.

• El alfabeto de los idiomas occidentales (mayúsculas, 26 sı́mbolos).


Σ = {A, B, C, D, . . . , W, X, Y, Z}.

• El alfabeto de los idiomas occidentales (minúsculas y mayúsculas, 52 sı́mbolos).


Σ = {a, A, b, B, c, C, d, D, . . . , w, W, x, X, y, Y, z, Z}.

1
Introducción a la Teorı́a de la Computación Capı́tulo 1 2

• El alfabeto de las letras griegas (minúsculas, 24 sı́mbolos).


Σ = {α, β, γ, δ, , η, ι, κ, λ, µ, ν, o, ψ, φ, π, ρ, σ, τ, θ, υ, χ, ξ, ζ, ω}.
• El alfabeto de los dı́gitos (10 sı́mbolos).
Σ = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}.
• El alfabeto Σ = {0, 1} se conoce como alfabeto binario.

Cadenas. Una cadena o palabra sobre un alfabeto Σ dado es cualquier sucesión (o


secuencia) finita de elementos de Σ. Según las convenciones estándares, una cadena se
escribe de izquierda a derecha. Admitimos la existencia de una única cadena que no
tiene sı́mbolos, la cual se denomina cadena vacı́a y se denota con λ. La cadena vacı́a
desempeña, en la teorı́a de la computación, un papel similar al del conjunto vacı́o ∅ en
la teorı́a de conjuntos.
 
Ejemplo Sea Σ = {a, b} el alfabeto que consta de los dos sı́mbolos a y b. Las siguientes
 son cadenas sobre Σ:
aba
ababaaa
aaaab.
Obsérvese que aba 6= aab y que aaab 6= baaa. El orden de los sı́mbolos en una cadena
es significativo ya que las cadenas se definen como sucesiones, es decir, conjuntos secuen-
cialmente ordenados.
 
Ejemplo Las cadenas sobre el alfabeto binario Σ = {0, 1} son secuencias finitas de
 ceros y unos, llamadas secuencias binarias, tales como

001
1011
001000001.
Para denotar cadenas concretas se utilizan letras como u, v, w, x, y, z, con subı́ndices si
es necesario. Si tales letras hacen parte del alfabeto de referencia Σ, entonces se utilizan
letras griegas.
 
Ejemplo Sea Σ = {a, b, c, d}. Utilizamos u, v, w para denotar (dar un nombre) a ciertas
 cadenas concretas:
u = ddaba.
v = cababadda.
w = bbbcc.

Longitud de una cadena. La longitud de una cadena u ∈ Σ∗ se denota |u| y se


puede definir descriptivamente como el número de sı́mbolos de u (contando los sı́mbolos
repetidos). Es decir,

0, si u = λ,
|u| =
n, si u = a1 a2 · · · an , donde a1 , a2 , . . . , an ∈ Σ.
Introducción a la Teorı́a de la Computación Capı́tulo 1 3

 
Ejemplo Sea Σ = {a, b, c, d}.
 

Si u = bbcada =⇒ |u| = 6,
Si v = ccddd =⇒ |v| = 5.

Definición descriptiva de Σ∗ . El conjunto de todas las cadenas sobre un alfa-


beto Σ, incluyendo la cadena vacı́a, se denota por Σ∗ .
 
Ejemplo Sea Σ = {a, b, c}, entonces
 

Σ∗ = {λ, a, b, c, aa, ab, ac, ba, bb, bc, ca, cb, cc, aaa, aab, abc, baa, . . .}.

En este caso, Σ∗ está formado por la cadena vacı́a λ, las 3 cadenas con un solo sı́mbolo
(a, b, c), las 9 cadenas con dos sı́mbolos (aa, ab, ac, ba, bb, bc, ca, cb, cc), las 27 cadenas con
tres sı́mbolos (aaa, aab, abc, baa, . . . , ccc), etc.
Obsérvese que los sı́mbolos de un alfabeto Σ juegan un doble papel: como sı́mbolos del
alfabeto de referencia y como cadenas de longitud uno.

. Algunos autores denotan la cadena vacı́a con la letra griega ε. Prefe-


rimos denotarla con λ porque ε tiende a confundirse con el sı́mbolo ∈
usado para la relación de pertenencia. También es frecuente usar Λ para
denotar la cadena vacı́a.
. Si bien un alfabeto Σ es un conjunto finito, Σ∗ es siempre un conjunto in-
finito (enumerable). En el caso más simple, Σ contiene solo un sı́mbolo,
Σ = {a}, y Σ∗ = {λ, a, aa, aaa, aaaa, aaaaa, . . .}.
. Hay que distinguir entre los siguientes cuatro objetos, que son todos
diferentes entre sı́: ∅, λ, {∅} y {λ}.
. La mayor parte de la teorı́a de la computación se hace con referencia a
un alfabeto Σ fijo (pero arbitrario).

1.2 Definiciones y demostraciones recursivas


En la Teorı́a de la Computación muchos conjuntos se definen recursivamente. A contin-
uación presentamos este tipo de definiciones en un contexto muy amplio.

Definición recursiva de un conjunto. Un conjunto S se define recursiva-


mente por medio de tres cláusulas:

(1) Cláusula básica. Se especifican los elementos más sencillos (o básicos) de S.

(2) Cláusula recursiva. Se especifican la regla o reglas para la formación de nuevos


elementos de S a partir de elementos ya conocidos de S.
Introducción a la Teorı́a de la Computación Capı́tulo 1 4

(3) Cláusula de exclusión. Establece que los elementos de S se pueden obtener únicamente
utilizando las cláusulas (1) y (2).
La cláusula de exclusión se suele admitir de manera implı́cita y es corriente omitirla en
las definiciones recursivas concretas, algo que haremos en lo sucesivo.
  ∗
Ejemplo Dado un alfabeto Σ, el conjunto Σ de todas las cadenas, definido descripti-
 vamente en la sección 1.1, se puede definir recursivamente. La idea es que a
partir de una cadena u ∈ Σ∗ se puede obtener una nueva cadena añadiendo a la derecha
un sı́mbolo a perteneciente al alfabeto Σ; dicha cadena será denotada por ua. Todas las
cadenas de Σ∗ se pueden obtener de esta manera a partir de la cadena vacı́a λ; se entiende
que λa = a, para cualquier sı́mbolo a ∈ Σ.
La definición recursiva de Σ∗ consta entonces de las siguientes dos cláusulas:
(1) λ ∈ Σ∗ .
(2) Si u ∈ Σ∗ entonces ua ∈ Σ∗ para cada sı́mbolo a ∈ Σ, donde ua es la secuencia de
sı́mbolos obtenida a partir de u añadiendo el sı́mbolo a a la derecha.

Definición recursiva de conceptos sobre cadenas. La definición recur-


siva de Σ∗ permite definir recursivamente nociones o conceptos aplicables a todas las
cadenas. Sea Σ un alfabeto dado; para definir un concepto C sobre todas las cadenas en
Σ∗ se utilizan dos cláusulas:
(1) Se define C(λ), es decir, se define el concepto C para la cadena λ.
(2) Se define C(ua) en términos de C(u) para toda cadena u ∈ Σ∗ y todo sı́mbolo a ∈ Σ.
 
Ejemplo Aunque la noción de longitud de una cadena es muy simple y bastarı́a la
 descripción presentada en la sección 1.1, también podemos dar una definición
recursiva de |u|, con u ∈ Σ∗ :
(1) |λ| = 0.
(2) |ua| = |u| + 1 para toda u ∈ Σ∗ y todo sı́mbolo a ∈ Σ.

Recursión sobre cadenas. Dado un alfabeto Σ, es posible demostrar recursi-


vamente que todas las cadenas en Σ∗ satisfacen una cierta propiedad P . A tal tipo de
razonamiento recursivo se le conoce como recursión sobre cadenas, y consta de dos pasos:
(1) Se demuestra P (λ), es decir, se demuestra que la cadena vacı́a λ satisface la propiedad
P.
(2) Se demuestra la implicación
P (u) =⇒ P (ua), para toda u ∈ Σ∗ y todo a ∈ Σ.
Es decir, se demuestra que si u satisface la propiedad P , entonces la cadena ua
también satisface la propiedad P , para todo a ∈ Σ.
Introducción a la Teorı́a de la Computación Capı́tulo 1 5

La recursión sobre cadenas es necesaria cuando se quiere demostrar propiedades con toda
rigurosidad.

1.3 Concatenación de cadenas


Dado un alfabeto Σ y dos cadenas u, v ∈ Σ∗ , la concatenación de u y v se denota como
u · v o simplemente uv y se define descriptivamente ası́:
(1) Si v = λ, entonces u · λ = λ · u = u. Es decir, la concatenación de cualquier cadena u
con la cadena vacı́a, a izquierda o a derecha, es igual a u.

(2) Si u = a1 a2 · · · an , v = b1 b2 · · · bm , donde a1 , . . . , an , b1 , . . . , bm ∈ Σ, n, m ≥ 1,
entonces
u · v = a1 a2 · · · an b 1 b 2 · · · b m .
Es decir, u · v es la cadena formada escribiendo los sı́mbolos de u y a continuación los
sı́mbolos de v.

Definición recursiva de la concatenación. Para definir recursivamente la


concatenación u · v para todas las cadenas u, v ∈ Σ∗ se toma una cadena fija u (pero
arbitraria) y se hace recursión sobre v, de la siguiente manera:
(1) u · λ = λ · u = u.

(2) u · (va) = (u · v)a, para toda v ∈ Σ∗ , a ∈ Σ.

Propiedad asociativa de la concatenación. La concatenación de cadenas



es una operación asociativa. Es decir, si u, v, w ∈ Σ , entonces

(uv)w = u(vw).

Demostración. Primero hay que considerar los casos en los que alguna (o algunas) de las
cadenas u, v o w sea la cadena vacı́a λ. Por ejemplo, si v = λ tenemos (uv)w = (uλ)w =
uw mientras que u(vw) = u(λw) = uw.
Luego consideramos el caso en que u, v y w sean diferentes de λ. Entonces podemos
escribir

u = a1 · · · an , con ai ∈ Σ, n ≥ 1.
v = b1 · · · bm , con bi ∈ Σ, m ≥ 1.
w = c1 · · · cq , con ci ∈ Σ, q ≥ 1.

Entonces

(uv)w = (a1 · · · an b1 · · · bm )w = a1 · · · an b1 · · · bm c1 · · · cq .
u(vw) = u(b1 · · · bm c1 · · · cq ) = a1 · · · an b1 · · · bm c1 · · · cq .
Introducción a la Teorı́a de la Computación Capı́tulo 1 6

Esto demuestra la propiedad asociativa.


La propiedad asociativa también se puede demostrar por recursión sobre cadenas: se
mantienen u y v fijas (pero arbitrarias) y se hace recursión sobre w. Para w = λ, se
obtiene fácilmente que
(uv)λ = uv = u(vλ).
Para el paso recursivo, suponemos que (uv)w = u(vw) y demostraremos que (uv)(wa) =
u[v(wa)], para todo a ∈ Σ.
(uv)(wa) = [(uv)w]a, (definición recursiva de la concatenación)
= [u(vw)]a, (hipótesis recursiva)
= u[(vw)a], (definición recursiva de la concatenación)
= u[v(wa)], (definición recursiva de la concatenación).

1.4 Potencias de una cadena


Dada u ∈ Σ∗ y n ∈ N, se define (descriptivamente) un en la siguiente forma
u0 = λ,
un = uu · · · u}, si n ≥ 1.
| {z
n veces

Lo anterior se puede escribir como:



λ, si n = 0,
n
u = uu · · · u, si n ≥ 1.
| {z }
n veces

Es decir, un es la concatenación de u consigo misma n veces, si n ≥ 1. Puesto que n es


un número natural, un se puede definir inductivamente sobre n:
u0 = λ,
un+1 = un · u, para todo n ≥ 0.
Un caso particular importante se presenta cuando la cadena u consta de un solo sı́mbolo,
por ejemplo, u = a, donde a ∈ Σ. Se tiene entonces
a0 = λ,
an = aa · · · a}, si n ≥ 1.
| {z
n veces
 
Ejemplo Sea Σ = {a, b, c, d}. Usando la propiedad asociativa y la potenciación de
 cadenas de longitud 1, podemos escribir, por ejemplo:

baaaddb = ba3 d2 b.
dddbbcccccaa = d3 b2 c5 a2 .
ababbbc = (ab)2 b2 c = abab3 c.
Introducción a la Teorı́a de la Computación Capı́tulo 1 7

1.5 Reflexión de una cadena


La reflexión (o inversa o reverso) de una cadena u ∈ Σ∗ se denota uR y se define descrip-
tivamente ası́: 
R λ, si u = λ,
u =
an · · · a2 a1 , si u = a1 a2 · · · an .
De la definición se observa claramente que la reflexión de la reflexión de una cadena es la
misma cadena, es decir,
(uR )R = u, para u ∈ Σ∗ .
. Algunos autores escriben u−1 en lugar de uR para denotar la reflexión
de una cadena u.
 
Ejercicios de la sección 1.5
 
À Dar una definición recursiva de uR .
Á Si u, v ∈ Σ∗ , demostrar que (uv)R = v R uR . Generalizar esta propiedad a la con-
catenación de n cadenas.

1.6 Subcadenas, prefijos y sufijos


Una cadena v es una subcadena o una subpalabra de u si existen cadenas x, y tales que
u = xvy. Nótese que x o y pueden ser λ y, por lo tanto, la cadena vacı́a es una subcadena
de cualquier cadena y toda cadena es subcadena de sı́ misma.
Un prefijo de u es una cadena v tal que u = vw para alguna cadena w ∈ Σ∗ . Se dice
que v es un prefijo propio de u si v 6= u.
Similarmente, un sufijo de u es una cadena v tal que u = wv para alguna cadena
w ∈ Σ∗ . Se dice que v es un sufijo propio de u si v 6= u.
Obsérvese que λ es un prefijo y un sufijo de toda cadena u ya que uλ = λu = u. Por
la misma razón, toda cadena u es prefijo y sufijo de sı́ misma.
 
Ejemplo Sean Σ = {a, b, c, d} y u = bcbaadb.
 
Prefijos de u : Sufijos de u :
λ λ
b b
bc db
bcb adb
bcba aadb
bcbaa baadb
bcbaad cbaadb
bcbaadb bcbaadb
Algunas subcadenas de u: baad, aa, cba, db.
Introducción a la Teorı́a de la Computación Capı́tulo 1 8

1.7 Lenguajes
Un lenguaje L sobre un alfabeto Σ es un subconjunto de Σ∗ , es decir L ⊆ Σ∗ .
Casos extremos:
L = ∅, lenguaje vacı́o.
L = Σ∗ , lenguaje de todas las cadenas sobre Σ.
Todo lenguaje L satisface ∅ ⊆ L ⊆ Σ∗ , y puede ser finito o infinito. Los lenguajes se
denotan con letras mayúsculas A, B, C, . . . , L, M, N, . . ..
 
Ejemplos Los siguientes son ejemplos de lenguajes sobre los alfabetos especificados.
 
• Σ = {a, b, c}. L = {a, aba, aca}.
• Σ = {a, b, c}. L = {a, aa, aaa, . . .} = {an : n ≥ 1}.
• Σ = {a, b, c}. L = {aa, aba, ab2 a, ab3 a, . . .} = {abn a : n ≥ 0}.
• Σ = {a, b, c, . . . , x, y, z, A, B, C, . . . , X, Y, Z}. L = {u ∈ Σ∗ : u es una palabra
listada en el diccionario español DRA}. L es un lenguaje finito.
• Σ = {a, b, c}. L = {u ∈ Σ∗ : u no contiene el sı́mbolo c}. Por ejemplo, abbaab ∈ L
pero abbcaa ∈/ L.
• Σ = {0, 1}. L = conjunto de todas las secuencias binarias que contienen un número
impar de unos.
• Σ = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. El conjunto N de los números naturales se puede
definir como un lenguaje sobre Σ, en la siguiente forma:
N = {u ∈ Σ∗ : u 6= λ y (u = 0 ó 0 no es un prefijo de u)}.

Como ejercicio, el estudiante puede definir el conjunto de los enteros


Z = {. . . , −2, −1, 0, 1, 2, . . .}
como un lenguaje sobre un alfabeto adecuado.

1.8 Operaciones entre lenguajes


Puesto que los lenguajes sobre Σ son subconjuntos de Σ∗ , las operaciones usuales entre
conjuntos son también operaciones válidas entre lenguajes. Ası́, si A y B son lenguajes
sobre Σ (es decir A, B ⊆ Σ∗ ), entonces los siguientes también son lenguajes sobre Σ:
A ∪ B = {u : u ∈ A o u ∈ B} Unión.
A ∩ B = {u : u ∈ A y u ∈ B} Intersección.
A − B = {u : u ∈ A y u ∈
/ B} Diferencia.
A = Σ − A = {u : u ∈ Σ∗ y u ∈

/ A} Complemento.
Introducción a la Teorı́a de la Computación Capı́tulo 1 9

Otra operación útil es la diferencia simétrica, obtenida con la disyunción excluyente:

A M B = {u : u ∈ A o u ∈ B, pero no ambas} = (A ∪ B) − (A ∩ B) = (A − B) ∪ (B − A).

Estas operaciones entre lenguajes se llaman operaciones conjuntistas o booleanas para


distinguirlas de las operaciones lingüı́sticas (concatenación, potencias, reflexión, clausura)
que son extensiones a los lenguajes de las correspondientes operaciones entre cadenas.

1.9 Concatenación de lenguajes


La concatenación de dos lenguajes A y B sobre Σ, notada A · B o simplemente AB se
define como
AB = {uv : u ∈ A, v ∈ B}.
En general, AB 6= BA.
 
Ejemplo Si Σ = {a, b, c}, A = {a, ab, ac}, B = {b, b2 }, entonces
 

AB = {ab, ab2 , ab2 , ab3 , acb, acb2 } = {ab, ab2 , ab3 , acb, acb2 }.
BA = {ba, bab, bac, b2 a, b2 ab, b2 ac}.

Nótese que AB tiene cinco cadenas en total ya que la cadena ab2 se obtiene de dos maneras
distintas.
 
Ejemplo Si Σ = {a, b, c}, A = {ba, bc}, B = {bn : n ≥ 0}, entonces
 

AB = {babn : n ≥ 0} ∪ {bcbn : n ≥ 0}.


BA = {bn ba : n ≥ 0} ∪ {bn bc : n ≥ 0}
= {bn+1 a : n ≥ 0} ∪ {bn+1 c : n ≥ 0}
= {bn a : n ≥ 1} ∪ {bn c : n ≥ 1}.

Propiedades de la concatenación de lenguajes. Sean A, B, C lenguajes


sobre Σ, es decir A, B, C ⊆ Σ∗ . Entonces

1. A · ∅ = ∅ · A = ∅.

2. A · {λ} = {λ} · A = A.

3. Propiedad Asociativa,
A · (B · C) = (A · B) · C.

4. Distributividad de la concatenación con respecto a la unión,

A · (B ∪ C) = A · B ∪ A · C.
(B ∪ C) · A = B · A ∪ C · A.
Introducción a la Teorı́a de la Computación Capı́tulo 1 10

5. Propiedad distributiva generalizada. Si {Bi }i∈I es una familia cualquiera de lengua-


jes sobre Σ, entonces S S
A · Bi = (A · Bi ),
i∈I i∈I
S  S
Bi · A = (Bi · A).
i∈I i∈I

Demostración.
1. A · ∅ = {uv : u ∈ A, v ∈ ∅} = ∅.
2. A · {λ} = {uv : u ∈ A, v ∈ {λ}} = {u : u ∈ A} = A.
3. Se sigue de la asociatividad de la concatenación de cadenas.
4. Caso particular de la propiedad general, demostrada a continuación.
S S
5. Demostración de la igualdad A · Bi = (A · Bi ):
i∈I i∈I
S S
x∈A· Bi ⇐⇒ x = u · v, con u ∈ A & v ∈ i∈I Bi
i∈I
⇐⇒ x = u · v, con u ∈ A & v ∈ Bj , para algún j ∈ I
⇐⇒ x ∈ AS · Bj , para algún j ∈ I
⇐⇒ x ∈ i∈I (A · Bi ).
S  S
La igualdad Bi · A = (Bi · A) se demuestra de forma similar.
i∈I i∈I

. La propiedad asociativa permite escribir concatenaciones de tres o más


lenguajes sin necesidad de usar paréntesis.
. En general, no se cumple que A · (B ∩ C) = A · B ∩ A · C. Es de-
cir, la concatenación no es distributiva con respecto a la intersección.
Contraejemplo: Sea Σ = {a}, A = {a, λ}, B = {λ}, C = {a}. Se tiene:

A · (B ∩ C) = {a, λ} · ∅ = ∅.

Por otro lado,


A · B ∩ A · C = {a, λ} · {λ} ∩ {a, λ} · {a} = {a, λ} ∩ {a2 , a} = {a}.
 
Ejercicios de la sección 1.9
 
À Dar un ejemplo de un alfabeto Σ y dos lenguajes diferentes A, B sobre Σ tales que
AB = BA.
Á Una de las dos contenencias siguientes es siempre verdadera y la otra es falsa.
Demostrar o refutar, según sea el caso:
(i) A · (B ∩ C) ⊆ A · B ∩ A · C.
(ii) A · B ∩ A · C ⊆ A · (B ∩ C).
Introducción a la Teorı́a de la Computación Capı́tulo 1 11

1.10 Potencias de un lenguaje


Dado un lenguaje A sobre Σ, (A ⊆ Σ∗ ), y un número natural n ∈ N, se define An en la
siguiente forma
A0 = {λ},
An = AA · · · A} = {u1 · · · un : ui ∈ A, para todo i, 1 ≤ i ≤ n}, para n ≥ 1.
| {z
n veces

Las potencias de A Se pueden definir por inducción sobre n:


A0 = {λ},
An+1 = An · A, para todo n ≥ 0.
Se tiene entonces que A1 = A y A2 es el conjunto de las concatenaciones dobles de cadenas
de A:
A2 = {uv : u, v ∈ A}.
A3 está formado por las concatenaciones triples:
A3 = {uvw : u, v, w ∈ A}
En general, An es el conjunto de todas las concatenaciones de n cadenas de A, de todas
las formas posibles:
An = {u1 · · · un : ui ∈ A, i = 1, . . . , n}.

1.11 La clausura de Kleene de un lenguaje


La clausura de Kleene o estrella de Kleene o simplemente la estrella de un lenguaje A,
A ⊆ Σ∗ , es la unión de todas las potencias de A y se denota por A∗ .
[
(Descripción 1) A∗ = Ai = A0 ∪ A1 ∪ A2 ∪ · · · ∪ An · · ·
i≥0

Según la definición de las potencias de una lenguaje, A∗ consta de todas las concatena-
ciones de cadenas de A consigo mismas, de todas las formas posibles. Tenemos ası́ una
descripción explı́cita de A∗ :
A∗ = conjunto de todas las concatenaciones
(Descripción 2) de cadenas de A, incluyendo λ
= {u1 · · · un : ui ∈ A, n ≥ 0}.
De manera similar se define la clausura positiva de un lenguaje A, A ⊆ Σ∗ , denotada por
A+ . [
A+ = Ai = A1 ∪ A2 ∪ · · · ∪ An · · ·
i≥1

A+ se puede describir explı́citamente de la siguiente manera


Introducción a la Teorı́a de la Computación Capı́tulo 1 12

A+ = conjunto de todas las concatenaciones de cadenas de A


= {u1 · · · un : ui ∈ A, n ≥ 1}.

También es posible dar una definición recursiva de A∗ :

(1) λ ∈ A∗ .
(2) Si u ∈ A∗ y v ∈ A entonces u · v ∈ A∗ .

En definitiva, A∗ es todo lo que se puede obtener comenzando con λ y concatenando con


cadenas de A. La definición recursiva de A+ es similar, excepto que sus elementos básicos
son las cadenas de A:

(1) Si u ∈ A entonces u ∈ A+ .
(2) Si u ∈ A+ y v ∈ A entonces u · v ∈ A+ .

 
Ejemplo Sea Σ = {a, b, c}.
 

{a}∗ = {λ, a, a2 , a3 , . . .}.


{a}+ = {a, a2 , a3 , . . .}.
{cb, ba}∗ = {λ, cb, ba, cbab, bacb, (cb)2 , (ba)2 , cbbacb, bacbba, babacb, . . .}.

. Según las definiciones dadas, Σ∗ tiene dos significados:


Σ∗ = conjunto de las cadenas sobre el alfabeto Σ.
Σ∗ = conjunto de todas las concatenaciones de cadenas de Σ, con-
siderando a Σ como el lenguaje de las cadenas de longitud 1.
No hay conflicto de notaciones porque las dos definiciones anteriores de
Σ∗ dan lugar al mismo conjunto.

Propiedades de ∗ y +. Sea A un lenguaje sobre Σ, es decir, A ⊆ Σ∗ .


1. A∗ = A+ ∪ {λ}.

2. A∗ = A+ si y solamente si λ ∈ A.

3. A+ = A∗ · A = A · A∗ .

4. A∗ · A∗ = A∗ .
n
5. A∗ = A∗ , para todo n ≥ 1.

6. A+ · A+ ⊆ A+ . En general, A+ · A+ 6= A+
∗
7. A∗ = A∗ .
Introducción a la Teorı́a de la Computación Capı́tulo 1 13

+
8. A∗ = A∗ .
∗
9. A+ = A∗ .
+
10. A+ = A+ .
Demostración.
Las propiedades 1 y 2 se siguen inmediatamente de las definiciones de A∗ y A+ .

3. A · A∗ = A · (A0 ∪ A1 ∪ A2 ∪ · · · )
= A1 ∪ A2 ∪ A3 ∪ · · ·
= A+ .
Similarmente se demuestra que A∗ · A = A+ .
4. Si x ∈ A∗ · A∗ , entonces x = u · v, con u ∈ A∗ , v ∈ A∗ . De modo que, x = u · v, con
u = u1 u2 · · · un , ui ∈ A, n ≥ 0 y v = v1 v2 · · · vm , vi ∈ A, m ≥ 0.
De donde
x = u · v = u1 · u2 · · · un · v1 · v2 · · · vm .
con ui ∈ A, vi ∈ A, n ≥ 0. Por lo tanto, x es una concatenación de n + m cadenas de
A. Ası́ que x ∈ A∗ .
Recı́procamente, si x ∈ A∗ , entonces x = x · λ ∈ A∗ · A∗ .
Hemos probado que x ∈ A∗ · A∗ ⇐⇒ x ∈ A∗ , lo cual establece la igualdad.
5. Se sigue de la propiedad 4.
6. La demostración de A+ · A+ ⊆ A+ es similar a la demostración de A∗ · A∗ ⊆ A∗
presentada en la propiedad 4, pero tomando m, n ≥ 1.
Para exhibir un contraejemplo de A+ · A+ = A+ , consideramos Σ = {a, b} y A = {a}.
Se tiene que
A+ = A1 ∪ A2 ∪ · · · = {a} ∪ {aa} ∪ {aaa} ∪ · · · = {an : n ≥ 1}.
A+ · A+ = {a, a2 , a3 , . . . } · {a, a2 , a3 , . . . } = {a2 , a3 , a4 , . . . } = {an : n ≥ 2}.
Se observa que A+ · A+ 6= A+

∗ 0 1 2
7. A∗ = A∗ ∪ A∗ ∪ A∗ ∪ · · ·
= {λ} ∪ A∗ ∪ A∗ ∪ A∗ ∪ · · ·
= A∗ .

+ 1 2 3
8. A∗ = A∗ ∪ (A∗ ∪ (A∗ ∪ · · ·
= A∗ ∪ A∗ ∪ A∗ ∪ · · ·
= A∗ .
Introducción a la Teorı́a de la Computación Capı́tulo 1 14

∗ 0 1 2
9. A+ = A+ ∪ A+ ∪ A+ ∪ · · ·
= {λ} ∪ A+ ∪ A+ A+ ∪ · · ·
= A∗ ∪ (conjuntos contenidos en A+ )
= A∗ .

+ 1 2 3
10. A+ = A+ ∪ A+ ∪ A+ ∪ · · · ,
= A+ ∪ (conjuntos contenidos en A+ )
= A+ .

Otras propiedades de ∗. Sean A, B lenguajes sobre Σ, es decir, A, B ⊆ Σ∗ .


1. Si A ⊆ B entonces A∗ ⊆ B ∗ .

2. (A ∪ B)∗ = (A∗ B ∗ )∗ = (B ∗ A∗ )∗ .

Demostración.
1. Se sigue inmediatamente de las definiciones de A∗ y B ∗ .
2. Demostraremos la igualdad (A ∪ B)∗ = (A∗ B ∗ )∗ . La contenencia ⊆ se sigue de

A ⊆ A∗ , B ⊆ B ∗ =⇒ A ⊆ A∗ B ∗ , B ⊆ A∗ B ∗
=⇒ A ∪ B ⊆ A∗ B ∗
=⇒ (A ∪ B)∗ ⊆ (A∗ B ∗ )∗ por la propiedad 1.

Ahora deduciremos la contenencia ⊇. Puesto que A ⊆ A ∪ B y B ⊆ A ∪ B, de la


propiedad 1 se obtiene que A∗ ⊆ (A ∪ B)∗ y B ∗ ⊆ (A ∪ B)∗ ; se concluye que A∗ B ∗ ⊆
(A ∪ B)∗ (A ∪ B)∗ = (A ∪ B)∗ . Por la propiedad 1 se tiene entonces que
∗
(A∗ B ∗ )∗ ⊆ (A ∪ B)∗ = (A ∪ B)∗ .

1.12 Reflexión o inverso de un lenguaje


Dado A un lenguaje sobre Σ, se define AR de la siguiente forma:

AR = {uR : u ∈ A}.

AR se denomina la reflexión, o el inverso de A, o el reverso de A.


Introducción a la Teorı́a de la Computación Capı́tulo 1 15

Propiedades. Sean A y B lenguajes sobre Σ, es decir, A, B ⊆ Σ∗ .


1. (A · B)R = B R · AR .
2. (A ∪ B)R = AR ∪ B R .
3. (A ∩ B)R = AR ∩ B R .
R
4. AR = A.
∗
5. (A∗ )R = AR .
R +
6. (A+ ) = AR .
Demostración. Demostraremos las propiedades 1 y 5; las demás se dejan como ejercicio
(opcional) para el estudiante.

1. x ∈ (A · B)R ⇐⇒ x = uR , donde u ∈ A · B
⇐⇒ x = uR , donde u = vw, v ∈ A, w ∈ B
R
⇐⇒ x = (vw) , donde v ∈ A, w ∈ B
⇐⇒ x = wR v R , donde v ∈ A, w ∈ B
⇐⇒ x ∈ B R · AR .

5. x ∈ (A∗ )R ⇐⇒ x = uR , donde u ∈ A∗
⇐⇒ x = (u1 · u2 · · · un )R , donde los ui ∈ A, n ≥ 0
⇐⇒ x = uR R R
n · u2 · · · u1 , donde los ui ∈ A, n ≥ 0
⇐⇒ x ∈ (AR )∗ .
 
Ejercicios de la sección 1.12
 
À Demostrar las propiedades 2, 3, 4 y 6 de la reflexión de cadenas.
Á ¿Se pueden generalizar las propiedades 2 y 3 anteriores para uniones e intersecciones
arbitrarias, respectivamente?

1.13 Lenguajes regulares


Los lenguajes regulares sobre un alfabeto dado Σ son todos los lenguajes que se pueden
formar a partir de los lenguajes básicos ∅, {λ}, {a}, a ∈ Σ, por medio de las operaciones
de unión, concatenación y estrella de Kleene.
A continuación presentamos la definición recursiva de la colección de todos los lenguajes
regulares sobre un alfabeto dado Σ.
Introducción a la Teorı́a de la Computación Capı́tulo 1 16

(1) ∅, {λ} y {a}, para cada a ∈ Σ, son lenguajes regulares sobre Σ. Estos son los
denominados lenguajes regulares básicos.
(2) Si A y B son lenguajes regulares sobre Σ, también lo son
A∪B (unión),
A·B (concatenación),
A∗ (estrella de Kleene).

La unión, la concatenación y la estrella de Kleene se denominan operaciones regulares.


 
Ejemplos Sea Σ = {a, b}. Los siguientes son lenguajes regulares sobre Σ porque los
 podemos
obtener a partir de los lenguajes básicos {λ}, {a} y {b} por medio
de un número finito de uniones, concatenaciones o estrellas de Kleene:

1. {a}∗ = {λ, a, a2 , a3 , a4 , . . .}.


2. {a}+ = {a}∗ · {a} = {a, a2 , a3 , a4 , . . .}.
3. {a, b}∗ = ({a} ∪ {b})∗ . Es decir, el lenguaje de todas las cadenas sobre Σ es regular.
4. El lenguaje A de todas las cadenas que tienen exactamente una a:
A = {b}∗ · {a} · {b}∗ .

5. El lenguaje B de todas las cadenas que comienzan con b:


B = {b} · {a, b}∗ = {b} · ({a} ∪ {b})∗ .

6. El lenguaje C de todas las cadenas que contienen la subcadena ba:


∗
C = {a} ∪ {b} · {b} · {a} · ({a} ∪ {b})∗ .

7. ({a} ∪ {b}∗ ) · {a}.


 ∗
8. {λ} ∪ {a} · {b} ∪ {b} · {a} .

. Es importante observar que todo lenguaje finito L = {w1 , w2 , . . . , wn } es


regular ya que L se puede obtener como una unión finita:

L = {w1 } ∪ {w2 } ∪ · · · ∪ {wn },

y cada cadena wi de L es la concatenación de un número finito de


sı́mbolos; si wi = a1 a2 · · · ak , entonces {wi } = {a1 } · {a2 } · · · {ak }.
. Según la definición recursiva de los lenguajes regulares, si A1 , A2 , . . . , Ak
son k lenguajes regulares, entonces ki=1 Ai es regular. Pero
S
S si {Ai }i∈I
es una familia infinita de lenguajes regulares, la unión Ai no nece-
i∈I
sariamente es regular, como se verá en el Capı́tulo 2.
Introducción a la Teorı́a de la Computación Capı́tulo 1 17

1.14 Expresiones regulares


Los ejemplos de la sección 1.13 muestran que en la presentación de los lenguajes regulares
abundan las llaves o corchetes { } y los paréntesis. Con el propósito de hacer más legible
la representación de los lenguajes regulares, se introducen las denominadas expresiones
regulares.
La siguiente es la definición recursiva de las expresiones regulares sobre un alfabeto Σ
dado.

(1) Expresiones regulares básicas:

∅ es una expresión regular que representa al lenguaje ∅.


λ es una expresión regular que representa al lenguaje {λ}.
a es una expresión regular que representa al lenguaje {a}, para cada a ∈ Σ.

(2) Si R y S son expresiones regulares sobre Σ que representan los lenguajes regulares A
y B, respectivamente, entonces

(R) ∪ (S) es una expresión regular que representa al lenguaje A ∪ B.


(R)(S) es una expresión regular que representa al lenguaje A · B.

(R) es una expresión regular que representa al lenguaje A∗ .

Los paréntesis ( y ) son sı́mbolos de agrupación y se pueden omitir si no hay peligro de


ambigüedad. Es decir, podemos escribir simplemente R ∪ S, RS y R∗ para la unión,
la concatenación y la estrella de Kleene, respectivamente, siempre y cuando no haya
confusiones ni ambigüedades. Los paréntesis son inevitables cuando haya necesidad
de delimitar el alcance de la operaciones involucradas.

Para una expresión regular R cualquiera se utiliza en ocasiones la siguiente notación:

L[R] := lenguaje representado por R.

Utilizando esta notación y la definición recursiva de las expresiones regulares podemos


escribir las siguientes igualdades en las que R y S son expresiones regulares arbitrarias
sobre el alfabeto Σ:
L[∅] = ∅.
L[λ] = {λ}.
L[a] = {a}, para cada a ∈ Σ.
L[R ∪ S] = L[R] ∪ L[S].
L[RS] = L[R] · L[S].

L[R∗ ] = L[R] .
 
Ejemplo Dado el alfabeto Σ = {a, b, c},
 

(a ∪ b∗ )a∗ (bc)∗
Introducción a la Teorı́a de la Computación Capı́tulo 1 18

es una expresión regular que representa al lenguaje


∗
{a} ∪ {b}∗ · {a}∗ · {b} · {c} .


 
Ejemplo Dado el alfabeto Σ = {a, b},
 

(λ ∪ a)∗ (a ∪ b)∗ (ba)∗

es una expresión regular que representa al lenguaje


∗ ∗ ∗
{λ} ∪ {a} · {a} ∪ {b} · {b} · {a} .
 
Ejemplos Podemos representar algunos de los lenguajes de la sección 1.13 por medio
 de expresiones regulares:

1. El lenguaje A de todas las cadenas que tienen exactamente una a:

b∗ ab∗ .

2. El lenguaje B de todas las cadenas que comienzan con b:

b(a ∪ b)∗ .

3. El lenguaje C de todas las cadenas que contienen la subcadena ba:

(a ∪ b)∗ ba(a ∪ b)∗ .

Por la propiedad A+ = A∗ · A = A · A∗ , la clausura positiva + se puede expresar en


términos de ∗ y concatenación. Por tal razón, se permite el uso de + en expresiones
regulares.
  + + ∗ ∗
Ejemplo Las expresiones (a ∪ b)ab y (aa ∪ b)abb representan el mismo lenguaje.
 Análogamente, las dos siguientes expresiones

(a ∪ b)+ ∪ a+ b+ .
(a ∪ b)(a ∪ b)∗ ∪ aa∗ b∗ b.
representan el mismo lenguaje.
Introducción a la Teorı́a de la Computación Capı́tulo 1 19

. En las expresiones regulares se usan reglas de precedencia para la unión,


la concatenación y la estrella de Kleene similares a las que se utilizan
en las expresiones aritméticas para la suma, la multiplicación y la expo-
nenciación. El orden de precedencia es ∗, ·, ∪; es decir, la estrella actúa
antes que la concatenación y ésta antes que la unión. Por ejemplo, la
expresión ba∗ ∪ c se interpreta como [b(a)∗ ] ∪ c.
. La representación de lenguajes regulares por medio de expresiones reg-
ulares no es única. Es posible que haya varias expresiones regulares
diferentes para el mismo lenguaje. Por ejemplo, b(a ∪ b)∗ y b(b ∪ a)∗
representan el mismo lenguaje. Otro ejemplo: las dos expresiones regu-
lares (a ∪ b)∗ y (a∗ b∗ )∗ representan el mismo lenguaje por la propiedad
(A ∪ B)∗ = (A∗ B ∗ )∗ mencionada en la página 14.
. La propiedad distributiva

A · (B ∪ C) = A · B ∪ A · C,

leı́da de izquierda a derecha sirve para distribuir A con respecto a una


unión, y leı́da de derecha a izquierda sirve para “factorizar” A. Esto
permite obtener nuevas expresiones regulares.

 
Ejemplo Sea Σ = {0, 1}. Encontrar una expresión regular para el lenguaje de todas
 las cadenas cuyo penúltimo sı́mbolo, de izquierda a derecha, es un 0.

Solución. El penúltimo sı́mbolo debe ser un cero pero para el último hay dos posibili-
dades: 0 o 1. Estos casos se representan como una unión:

(0 ∪ 1)∗ 00 ∪ (0 ∪ 1)∗ 01.

Factorizando podemos obtener otras expresiones regulares:

(0 ∪ 1)∗ (00 ∪ 01).


(0 ∪ 1)∗ 0(0 ∪ 1).
 
Ejemplos Encontrar expresiones regulares que representen los siguientes lenguajes,
 definidos sobre el alfabeto Σ = {a, b}:

1. Lenguaje de todas las cadenas que tienen un número par de sı́mbolos (cadenas de
longitud par ≥ 0).
Solución. Aparte de la cadena vacı́a λ, todas las cadenas de longitud par ≥ 2 se
obtienen concatenando de todas las formas posibles los cuatro bloques aa, ab, ba y
bb. Ası́ llegamos a la expresión

(aa ∪ ab ∪ ba ∪ bb)∗ .
Introducción a la Teorı́a de la Computación Capı́tulo 1 20

Otra expresión correcta es (a2 ∪ b2 ∪ ab ∪ ba)∗ . Utilizando la propiedad distributiva


de la concatenación con respecto a la unión, encontramos otra expresión regular
para este lenguaje:
[(a ∪ b)(a ∪ b)]∗ .

2. Lenguaje de todas las cadenas que tienen un número par ≥ 0 de aes.


Soluciones: Si la cadena tiene cero aes, significa que solamente posee bes. Todas las
demás cadenas tienen un número par de aes (2, 4, 6, . . . ) que aparecen rodeadas a
izquierda o a derecha por cualquier cantidad de bes (incluyendo 0 bes). Encontramos
ası́ a varias posibles soluciones:

b∗ (b∗ ab∗ ab∗ )∗ .


(b∗ ab∗ ab∗ )∗ b∗ .
b∗ (b∗ ab∗ ab∗ )∗ b∗ .
(b∗ ab∗ ab∗ )∗ ∪ b∗ .
(ab∗ a ∪ b)∗ .
(ab∗ a ∪ b∗ )∗ .

La expresión regular R = b∗ (ab∗ a)∗ b∗ no es una solución correcta porque en medio de dos
bloques de la forma ab∗ a no se podrı́an insertar bes. De modo que cadenas como abab2 aba
y ab3 ab4 ab5 a no harı́an parte de L[R], a pesar de que poseen un número par de aes.
 
Ejemplo Sea Σ = {0, 1}. Encontrar una expresión regular que represente el lenguaje
 de todas las cadenas que no contienen dos ceros consecutivos.

Solución. La condición de que no haya dos ceros consecutivos implica que todo cero debe
estar seguido necesariamente de un uno, excepto un cero al final de la cadena. Por lo tanto,
las cadenas de este lenguaje se obtienen concatenado unos con bloques 01, de todas las
formas posibles. Hay que tener en cuenta, además, que la cadena puede terminar ya sea
en 1 o en 0. A partir de este análisis, llegamos a la expresión regular

(1 ∪ 01)∗ ∪ (1 ∪ 01)∗ 0.

Factorizando (1 ∪ 01)∗ , obtenemos otra expresión para este lenguaje: (1 ∪ 01)∗ (λ ∪ 0).
Otras dos soluciones análogas son:

(1 ∪ 10)∗ ∪ 0(1 ∪ 10)∗ .


(λ ∪ 0)(1 ∪ 10)∗ .
 
Ejemplo Sea Σ = {a, b, c}. Encontrar una expresión regular que represente el lenguaje
 de todas las cadenas que no contienen la subcadena bc.
Solución. Tanto aes como ces pueden concatenarse entre sı́ sin ninguna restricción. Pen-
samos entonces en una expresión de la forma

(a ∪ c ∪ ?)∗ .
Introducción a la Teorı́a de la Computación Capı́tulo 1 21

Una b puede estar seguida solamente de otra b o de una a; por lo tanto, conjeturamos con
la expresión (a ∪ c ∪ b∗ a)∗ . Pero debemos permitir cadenas que terminen en bes; haciendo
el ajuste correspondiente llegamos a la primera solución:

(a ∪ c ∪ b∗ a)∗ b∗ .

Esta expresión puede simplificarse omitiendo la a inicial:

(c ∪ b∗ a)∗ b∗ .

ya que el bloque b∗ a permite obtener cualquier cadena de aes.


También podemos atacar el problema en la forma (a ∪ b ∪ ?)∗ . Teniendo en cuenta que
se debe impedir la subcadena bc, llegamos a la solución

c∗ (a ∪ b ∪ ac∗ )∗ ,

la cual se puede simplificar como c∗ (b ∪ ac∗ )∗ .


Otras soluciones válidas para este problema son:

(a ∪ c ∪ b+ a)∗ b∗ .
c∗ (a ∪ b ∪ ac+ )∗ .

 
Ejercicios de la sección 1.14
 

À Encontrar expresiones regulares para los siguientes lenguajes definidos sobre el al-
fabeto Σ = {a, b}:

(i) Lenguaje de todas las cadenas que comienzan con el sı́mbolo b y terminan con
el sı́mbolo a.
(ii) Lenguaje de todas las cadenas de longitud impar.
(iii) Lenguaje de todas las cadenas que tienen un número impar de aes.
(iv) Lenguaje de todas las cadenas en las que el número de bes es un múltiplo ≥ 0
de 3.
(v) Lenguaje de todas las cadenas que no comienzan con la subcadena ba ni ter-
minan en b.
(vi) Σ = {a, b}. Lenguaje de todas las cadenas que no contienen la subcadena bba.

Á Encontrar expresiones regulares para los siguientes lenguajes definidos sobre el al-
fabeto Σ = {0, 1, 2}:

(i) Lenguaje de todas las cadenas que comienzan con 2 y terminan con 1.
(ii) Lenguaje de todas las cadenas que no comienzan con 1 ni terminan en 2.
Introducción a la Teorı́a de la Computación Capı́tulo 1 22

(iii) Lenguaje de todas las cadenas que tienen exactamente dos ceros.
(iv) Lenguaje de todas las cadenas que tienen un número par de sı́mbolos.
(v) Lenguaje de todas las cadenas que tienen un número impar de sı́mbolos.
(vi) Lenguaje de todas las cadenas que no contienen dos unos consecutivos.

 Encontrar expresiones regulares para los siguientes lenguajes definidos sobre el al-
fabeto Σ = {0, 1}:

(i) Lenguaje de todas las cadenas que tienen por lo menos un 0 y por lo menos
un 1.
(ii) Lenguaje de todas las cadenas que no contienen tres ceros consecutivos.
(iii) Lenguaje de todas las cadenas cuya longitud es ≥ 4.
(iv) Lenguaje de todas las cadenas cuya longitud es ≥ 5 y cuyo quinto sı́mbolo, de
izquierda a derecha, es un 1.
(v) Lenguaje de todas las cadenas que no terminan en 01.
(vi) Lenguaje de todas las cadenas de longitud par ≥ 2 formadas por ceros y unos
alternados.
(vii) Lenguaje de todas las cadenas de longitud ≥ 2 formadas por ceros y unos
alternados.
(viii) Lenguaje de todas las cadenas que no contienen dos ceros consecutivos ni dos
unos consecutivos.
(ix) Lenguaje de todas las cadenas de longitud impar que tienen unos en todas las
posiciones impares.
(x) Lenguaje de todas las cadenas cuya longitud es un múltiplo de tres.
(xi) Lenguaje de todas las cadenas que no contienen cuatro ceros consecutivos.
(xii) Lenguaje de todas las cadenas que no comienzan con 00 ni terminan en 11.
(xiii) Lenguaje de todas las cadenas que no contienen la subcadena 101.