Você está na página 1de 6

Teoria da Computação

Aula 2: Linguagens
DAINF-UTFPR Prof. Ricardo Dutra da Silva

Definição 2.1. Um alfabeto Σ é um conjunto finito e não vazio de sı́mbolos.


Exemplo 2.1

ˆ Σ = {a, b, c, ..., z}, alfabeto das letras minúsculas.

ˆ Σ = {a, b}, alfabeto composto pelas letras a e b.

ˆ Σ = {α, β, . . . , ψ, ω, A, B, . . . , Ψ, Ω}, alfabeto grego.

ˆ Σ = {0, 1}, alfabeto binário.

Definição 2.2. Uma string sobre um alfabeto Σ é uma sequência de elementos de Σ jus-
tapostos.
Exemplo 2.2

ˆ aabccaca é uma string sobre o alfabeto Σ = {a, b, c, d}.

ˆ 0010011101 é uma string sobre o alfabeto Σ = {0, 1}.

Daqui para frente aplicaremos a convenção de usar as letras iniciais do alfabeto da


lı́ngua portuguesa1 (a, b, c, d, e) para representar elementos de um alfabeto2 e as letras fi-
nais (u, v, w, x, y, z) para representar strings.

Definição 2.3. A string nula é a string que não contém nenhum elemento. Denotaremos
a string nula por λ3 .
1
Aqui estamos falando do alfabeto que usado para escrever este texto. O alfabeto da lı́ngua portuguesa.
Não confundir com o alfabeto da Definição 2.1 ou do Exemplo 2.1.
2
Este sim é o alfabeto da Definição 2.1.
3
É comum encontrar em alguns textos a string nula representada pelo sı́mbolo .

1
2 Aula 2: Linguagens

O conjunto Σ∗ de todas as strings sobre um alfabeto pode ser definido a partir da string
nula por operações de justaposição de elementos do alfabeto Σ.
Definição 2.4. Seja Σ um alfabeto. O conjunto Σ∗ de strings sobre o alfabeto Σ, é definido
recursivamente da seguinte maneira:

ˆ Base: λ ∈ Σ∗ .

ˆ Passo recursivo: Se w ∈ Σ∗ e a ∈ Σ então wa ∈ Σ∗ .


Exemplo 2.3
A string 10011 pertence ao conjunto Σ∗ de todas as strings sobre o alfabeto Σ = {0, 1}.
Inicialmente, pela base da Definição 2.4, temos que

λ ∈ Σ∗ .

Pelo passo recursivo da Definição 2.4, como λ ∈ Σ∗ e 1 ∈ Σ, então

λ1 = 1 ∈ Σ∗ .

Aplicando novamente o passo recursivo, temos que 1 ∈ Σ∗ e 0 ∈ Σ, então

10 ∈ Σ∗ .

Continuamos o processo de aplicar o passo até encontrar a string 10011.

10 ∈ Σ∗ e 0 ∈ Σ, então 100 ∈ Σ∗ ;
100 ∈ Σ∗ e 1 ∈ Σ, então 1001 ∈ Σ∗ ;
1001 ∈ Σ∗ e 1 ∈ Σ, então 10011 ∈ Σ∗ .

Definição 2.5. O tamanho de uma string w, denotado por |w|, é o número de elementos
na string.
Exemplo 2.4
As strings λ, ca e 000101, possuem tamanhos

|λ| = 0,
|ca| = 2,
|000101| = 6.
Aula 2: Linguagens 3

Exemplo 2.5
Seja o alfabeto Σ = {a, b, c}. São elementos de Σ∗ :

ˆ Strings de tamanho 0: λ.

ˆ Strings de tamanho 1: a, b, c.

ˆ Strings de tamanho 2: aa, ab, ac, ba, bb, bc, ca, cb, cc.

ˆ ...

Definição 2.6. O conjunto de strings de tamanho k de um alfabeto é denotado por Σk .


Exemplo 2.6
Seja o alfabeto Σ = {0, 1}. Temos que Σ0 = {λ}, Σ1 = {0, 1}, Σ2 = {00, 01, 10, 11}, Σ3 =
{000, 001, 010, 011, 100, 101, 110, 111}. Note que Σ1 = {0, 1} é diferente de Σ = {0, 1}.
No primeiro os elementos são strings e no segundo são sı́mbolos.

O conjunto Σ∗ de todas as strings sobre um alfabeto Σ pode ser definido como

Σ∗ = Σ0 ∪ Σ1 ∪ Σ2 ∪ . . .

e o conjunto de strings não nulas como

Σ+ = Σ1 ∪ Σ2 ∪ . . .

ou Σ+ = Σ∗ − {λ}.
A concatenação de duas strings é a operação que “cola” uma string no final da outra.
Definição 2.7. Dadas as strings u, v ∈ Σ∗ . A concatenação de u e v, escrita uv, é definida
como:

ˆ Base: Se |v| = 0 então v = λ e uv = u.

ˆ Passo recursivo: Seja v uma string de tamanho |v| = n > 0. Então, v = wa, para
alguma string w de tamanho n − 1 e a ∈ Σ, e uv = (uw)a.
Exemplo 2.7
Dadas as strings u = ab, v = ca e w = bb.

uv = abca
vw = cabb
(uv)w = u(vw) = abcabb.
4 Aula 2: Linguagens

Expoentes são usados para abreviar a concatenação de uma string com ela mesma, desta
forma, wn significa n concatenações da string w.
Exemplo 2.8
Dadas strings v = a e w = 01:

v 5 = a5 = aaaaa
w4 = (01)4 = 01010101.

Definição 2.8. Seja w ∈ Σ∗ sobre um alfabeto Σ. A string reversa de w, wR , é definida


como:

ˆ Base: Se |w| = 0 então w = λ e λR = λ.

ˆ Passo recursivo: se |w| = n > 0. Então, w = va, para alguma string v de tamanho
n − 1 e a ∈ Σ, e wR = av R .
Exemplo 2.9
Dada a string w = abcabb temos que

wR = (abcab R
| {z } b) = b(abcab)
R
(passo recursivo)
v
wR = b(abca R
|{z} b) = bb(abca)
R
(passo recursivo)
v
wR = bb(|{z}
abc a)R = bba(abc)R (passo recursivo)
v
R
ab c)R = bbac(ab)R
w = bba(|{z} (passo recursivo)
v
wR = bbac(|{z}
a b)R = bbacb(a)R (passo recursivo)
v
wR = bbacb(|{z}
λ a)R = bbacba(λ)R (passo recursivo)
v
wR = bbacba(λ)R = bbacbaλ (base)
wR = bbacba

Definição 2.9. Uma linguagem sobre um alfabeto Σ é um subconjunto de Σ∗ .


Aula 2: Linguagens 5

A especificação de uma linguagem requer uma descrição não ambı́gua das strings que
compõem a linguagem.
Exemplo 2.10
Dado Σ = {a, b, c, . . . , z} são linguagens sobre Σ:

L1 = {casa, bola, bolo},


L2 = {casa, bola, bolo, taquicardia, carro, . . .}.

Exemplo 2.11
Dado Σ = {0, 1} são linguagens sobre Σ:

L1 = {λ, 01, 0011, 000111, 00001111, . . .}


= {“Linguagem das strings que consistem em n 0’s seguidos de n 1’s, para n ≥ 0”},
L2 = {010, 1001, 11100111, 10100101, . . .}
= {“Linguagem dos palı́ndromos”},
L3 = {10, 11, 101, 111, 1011, . . .}
= {“Linguagem dos números primos (em base binária)”},
L4 = {0, 1, 100, 1001, 10000, . . .}
= {“Linguagem dos quadrados perfeitos”}.

Durante o curso comumente relacionaremos linguagens com problemas. Um problema


será visto como o processo de decidir se uma determinada string pertence ou não a uma
linguagem.
Definição 2.10. Seja L uma linguagem sobre um alfabeto Σ, o problema L é o seguinte:
“Dada uma string w ∈ Σ∗ , decidir se w pertence ou não a L”.
Exemplo 2.12
O problema de testar se um número é um quadrado perfeito pode ser visto como
decidir se uma string sobre o alfabeto Σ = {0, 1} está dentro da linguagem L =
{0, 1, 100, 1001, 10000, . . .}. Para a string 11 a resposta da decisão deve ser “não”. Para
6 Aula 2: Linguagens

a string 1001 a resposta deve ser “sim”.

Você também pode gostar