Aula 2: Linguagens
DAINF-UTFPR Prof. Ricardo Dutra da Silva
Defini¸c˜ao 2.1. Um alfabeto Σ ´e um conjunto finito e n˜ao vazio de s´ımbolos. Exemplo 2.1
Σ = {a, b, c, ..., z}, alfabeto das letras min´usculas. Σ = {a, b}, alfabeto composto pelas letras a e b. Σ = {α, β, . . . , ψ, ω, A, B, . . . , Ψ, Ω}, alfabeto grego. Σ = {0, 1}, alfabeto bin´ario.
Defini¸c˜ao 2.2. Uma string sobre um alfabeto Σ ´e uma sequˆencia de elementos de Σ jus-tapostos.
Exemplo 2.2
aabccaca ´e uma string sobre o alfabeto Σ = {a, b, c, d}. 0010011101 ´e uma string sobre o alfabeto Σ = {0, 1}.
Daqui para frente aplicaremos a conven¸c˜ao 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¸c˜ao 2.3. A string nula ´e a string que n˜ao cont´em nenhum elemento. Denotaremos a string nula por λ3.
1Aqui estamos falando do alfabeto que usado para escrever este texto. O alfabeto da l´ıngua portuguesa.
N˜ao confundir com o alfabeto da Defini¸c˜ao 2.1 ou do Exemplo 2.1.
2Este sim ´e o alfabeto da Defini¸c˜ao 2.1.
3E comum encontrar em alguns textos a string nula representada pelo s´ımbolo .´
O conjunto Σ∗ de todas as strings sobre um alfabeto pode ser definido a partir da string nula por opera¸c˜oes de justaposi¸c˜ao de elementos do alfabeto Σ.
Defini¸c˜ao 2.4. Seja Σ um alfabeto. O conjunto Σ∗ de strings sobre o alfabeto Σ, ´e definido recursivamente da seguinte maneira:
Base: λ ∈ Σ∗.
Passo recursivo: Se w ∈ Σ∗ e a ∈ Σ ent˜ao wa ∈ Σ∗.
Exemplo 2.3
A string 10011 pertence ao conjunto Σ∗ de todas as strings sobre o alfabeto Σ = {0, 1}. Inicialmente, pela base da Defini¸c˜ao 2.4, temos que
λ ∈ Σ∗.
Pelo passo recursivo da Defini¸c˜ao 2.4, como λ ∈ Σ∗ e 1 ∈ Σ, ent˜ao λ1 = 1 ∈ Σ∗.
Aplicando novamente o passo recursivo, temos que 1 ∈ Σ∗ e 0 ∈ Σ, ent˜ao 10 ∈ Σ∗.
Continuamos o processo de aplicar o passo at´e encontrar a string 10011. 10 ∈ Σ∗ e 0 ∈ Σ, ent˜ao 100 ∈ Σ∗;
100 ∈ Σ∗ e 1 ∈ Σ, ent˜ao 1001 ∈ Σ∗; 1001 ∈ Σ∗ e 1 ∈ Σ, ent˜ao 10011 ∈ Σ∗.
Defini¸c˜ao 2.5. O tamanho de uma string w, denotado por |w|, ´e o n´umero de elementos na string.
Exemplo 2.4
As strings λ, ca e 000101, possuem tamanhos |λ| = 0, |ca| = 2, |000101| = 6.
Exemplo 2.5
Seja o alfabeto Σ = {a, b, c}. S˜ao 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¸c˜ao 2.6. O conjunto de strings de tamanho k de um alfabeto ´e 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} ´e diferente de Σ = {0, 1}.
No primeiro os elementos s˜ao strings e no segundo s˜ao s´ımbolos.
O conjunto Σ∗ de todas as strings sobre um alfabeto Σ pode ser definido como Σ∗ = Σ0∪ Σ1∪ Σ2∪ . . .
e o conjunto de strings n˜ao nulas como
Σ+= Σ1∪ Σ2∪ . . .
ou Σ+ = Σ∗− {λ}.
A concatena¸c˜ao de duas strings ´e a opera¸c˜ao que “cola” uma string no final da outra. Defini¸c˜ao 2.7. Dadas as strings u, v ∈ Σ∗. A concatena¸c˜ao de u e v, escrita uv, ´e definida como:
Base: Se |v| = 0 ent˜ao v = λ e uv = u.
Passo recursivo: Seja v uma string de tamanho |v| = n > 0. Ent˜ao, 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
Expoentes s˜ao usados para abreviar a concatena¸c˜ao de uma string com ela mesma, desta forma, wn significa n concatena¸c˜oes da string w.
Exemplo 2.8
Dadas strings v = a e w = 01:
v5 = a5 = aaaaa
w4 = (01)4 = 01010101.
Defini¸c˜ao 2.8. Seja w ∈ Σ∗ sobre um alfabeto Σ. A string reversa de w, wR, ´e definida
como:
Base: Se |w| = 0 ent˜ao w = λ e λR= λ.
Passo recursivo: se |w| = n > 0. Ent˜ao, w = va, para alguma string v de tamanho n − 1 e a ∈ Σ, e wR= avR.
Exemplo 2.9
Dada a string w = abcabb temos que wR= (abcab
| {z }
v
b)R= b(abcab)R (passo recursivo) wR= b(abca
|{z}
v
b)R= bb(abca)R (passo recursivo) wR= bb( abc
|{z}
v
a)R= bba(abc)R (passo recursivo)
wR= bba( ab
|{z}
v
c)R = bbac(ab)R (passo recursivo)
wR= bbac( a
|{z}
v
b)R= bbacb(a)R (passo recursivo)
wR= bbacb( λ |{z}
v
a)R= bbacba(λ)R (passo recursivo) wR= bbacba(λ)R= bbacbaλ (base)
wR= bbacba
A especifica¸c˜ao de uma linguagem requer uma descri¸c˜ao n˜ao amb´ıgua das strings que comp˜oem a linguagem.
Exemplo 2.10
Dado Σ = {a, b, c, . . . , z} s˜ao linguagens sobre Σ: L1 = {casa, bola, bolo},
L2 = {casa, bola, bolo, taquicardia, carro, . . .}.
Exemplo 2.11
Dado Σ = {0, 1} s˜ao 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´umeros primos (em base bin´aria)”}, L4 = {0, 1, 100, 1001, 10000, . . .}
= {“Linguagem dos quadrados perfeitos”}.
Durante o curso comumente relacionaremos linguagens com problemas. Um problema ser´a visto como o processo de decidir se uma determinada string pertence ou n˜ao a uma linguagem.
Defini¸c˜ao 2.10. Seja L uma linguagem sobre um alfabeto Σ, o problema L ´e o seguinte: “Dada uma string w ∈ Σ∗, decidir se w pertence ou n˜ao a L”.
Exemplo 2.12
O problema de testar se um n´umero ´e um quadrado perfeito pode ser visto como decidir se uma string sobre o alfabeto Σ = {0, 1} est´a dentro da linguagem L = {0, 1, 100, 1001, 10000, . . .}. Para a string 11 a resposta da decis˜ao deve ser “n˜ao”. Para