Você está na página 1de 10

Universidade Estadual Vale do Acaraú - UVA

Curso: Ciências da Computação


Disciplina: Linguagens Formais e Autômatos
Professor: Cláudio Carvalho

Introdução ao estudo das linguagens formais

Neste material, será apresentado um breve histórico do estudo da Teoria dos

Autômatos e Linguagens Formais, e serão introduzidos os conceitos básicos, necessários

ao estudo de linguagens formais, tais como: alfabetos, palavras, linguagens e gramáticas.

1 Introdução / Histórico

Segundo Hopcroft, Ullman e Motwani (2006), a Teoria dos Autômatos estuda

dispositivos abstratos de computação, ou máquinas. Antes mesmo de existirem computa-

dores, na década de 1930, Alan Turing estudou uma máquina abstrata que tinha todas as

capacidades dos computadores de hoje, pelo menos no que diz respeito ao que eles podem

ou não computar. Suas conclusões se aplicam não somente a essas máquinas abstratas,

mas às máquinas reais.

Entre as décadas de 1940 e 1950, tipos mais simples de máquinas - hoje chama-

dos de autômatos nitos - foram estudadas por um grande número de pesquisadores. Nos

anos 50, o linguista Noam Chomsky começou a estudar as gramáticas formais. Embora

estas não sejam modelos de máquinas, elas têm uma relação próxima com os autômatos.

Em 1969, Stephen Cook ampliou o estudo do que as Máquinas de Turing

podiam ou não fazer. Ele separou os problemas que podem ser resolvidos ecientemente

por um computador daqueles que, na prática, podem levar muito tempo para serem

resolvidos. Estes são chamados de intratáveis.

Todos esses desenvolvimentos teóricos incidem diretamente no trabalho dos

cientistas da computação hoje. Alguns conceitos como autômatos nitos e certos tipos de

gramáticas formais são usadas no projeto e construção de importantes tipos de software.

Outros conceitos, como a Máquina de Turing, ajudam-nos a compreender o que pode ser

esperado de nossos algoritmos.

A seguir, temos alguns exemplos do uso de autômatos nitos:

ˆ projeto de software para vericação do comportamento de circuitos digitais.

ˆ analisadores léxicos de compiladores.

ˆ reconhecimento de padrões em textos.

1
Segundo Menezes (2012), a Teoria das Linguagens Formais se desenvolveu na

década de 1950, com o objetivo de desenvolver teorias relacionadas às linguagens naturais.

Posteriormente, observou-se a sua importância também para o estudo das linguagens

articiais - em especial, as linguagens de programação. Desde então, os estudos nessa

área se desenvolveram signicativamente e com diversos enfoques, entre os quais podemos

citar a análise léxica e sintática em linguagens de programação.

1.1 Sintaxe e Semântica

Ainda segundo Menezes (2012), uma linguagem de programação pode ser vista

de duas formas:

ˆ uma entidade livre, sem qualquer signicado associado;

ˆ uma entidade associada a uma interpretação do seu signicado.

A sintaxe trata das propriedades livres da linguagem como, por exemplo, a

vericação gramatical. Já a semântica trata da interpretação para a linguagem, um

signicado ou valor para determinado programa.

No estudo de linguagens de programação, o problema sintático foi identicado

antes do problema semântico. Além disso, os problemas sintáticos são de tratamento

mais simples que os semânticos. É bem mais simples vericar se um texto (no contexto

de linguagens de programação, um programa) está escrito segundo as regras gramaticais

da linguagem, do que vericar se ele expressa o que realmente deveria. A Teoria da

Sintaxe possui modelos matemáticos bem denidos e universalmente conhecidos, como

por exemplo, as Gramáticas de Chomsky.


Um programa pode estar semanticamente errado (é possível que ele não faça

o que se pretendia). Não existe, no entanto, um programa sintaticamente errado. Nesse

caso, simplesmente, não é um programa.

1.2 Abordagens

No nosso curso, seguiremos as abordagens sugeridas em Menezes (2012). As-

sim, os assuntos serão vistos a partir de três formalismos. A saber:

ˆ Operacional/Reconhecedor : dene-se uma máquina abstrata (autômato) com base

em um conjunto nito de estados e em uma especicação de como se dão as mu-

danças de estado nesta. A máquina recebe como entrada uma palavra e deve dizer

se a aceita ou se a rejeita.

Exemplos: Autômatos Finitos, Autômatos com pilha e Máquinas de Turing.

2
ˆ Axiomático/Gerador : associam-se regras (axiomas) às componentes da linguagem.

As regras permitem armar o que será verdadeiro após a ocorrência de cada cláusula,

com base no que era verdadeiro antes de cada ocorrência.

Exemplos: Gramáticas (Regulares, Livres de Contexto, Sensíveis ao Contexto).

ˆ Denotacional/Funcional : dene-se uma função que caracteriza o conjunto de todas

as palavras que pertencem à linguagem. Este formalismo pode ser chamado de

gerador, uma vez que é possível inferir (gerar) as palavras da linguagem denotada.

Exemplo: Expressões Regulares.

2 Linguagens Formais

2.1 Alfabetos

Um alfabeto é um conjunto nito de símbolos, usado para representar dados

(palavras). Usualmente, são representados pela letra grega Σ (sigma). A seguir, temos

alguns exemplos de alfabetos:

ˆ Σ1 = {a, b}
ˆ Σ2 = {0, 1}
ˆ Σ3 = {◦, •, #}
ˆ Σ4 = {ab, ba}

Na verdade, qualquer objeto pode estar em um alfabeto. De um ponto de vista

formal, um alfabeto é um conjunto nito de qualquer tipo. Por questões de simplicidade,

utilizamos alfabetos com um número pequeno de símbolos (geralmente letras, números ou

alguns caracteres especiais).

Segundo Ding-Zhu e Ker-I (2004), um alfabeto pode ser denido por um con-

junto nito de cadeias, em vez de apenas símbolos. Um exemplo disso é o alfabeto Σ4 .


A única exigência, nesses casos, é que nenhum símbolo seja obtido pela combinação de

símbolos do mesmo alfabeto. Por exemplo, o conjunto {00, 01, 10} é um alfabeto; já o

conjunto {00, 0, 1} não é um alfabeto, pois o símbolo 00 pode ser obtido a partir da con-

catenação de dois símbolos 0. Isso permite, por exemplo, gerar uma mesma cadeia com

duas sequências distintas de símbolos. Observe que as sequências h0, 0i e h00i produzem

a cadeia 00.
Dizemos então que um conjunto de símbolos é um alfabeto se quaisquer duas

sequências distintas de símbolos deste produzem cadeias distintas. No nosso estudo, no

entanto, serão utilizados apenas alfabetos cujos símbolos têm tamanho 1.

3
2.2 Palavras

Uma palavra é uma sequência nita de símbolos de um alfabeto. É a unidade

básica na Teoria dos Autômatos e Linguagens Formais. A palavra pode não conter ne-

nhum símbolo do alfabeto. Nesse caso, é a palavra vazia, representada pela letra grega ε
(épsilon). Em geral, usamos a letra w para denotar palavras. Vejamos alguns exemplos:

ˆ w1 = abba é uma palavra sobre Σ1 ou Σ4 .


ˆ w2 = 0100 é uma palavra sobre Σ2 .
ˆ w3 = ◦ ◦ •# é uma palavra sobre Σ3 .

Dado um alfabeto Σ. Denotamos por:

ˆ Σ∗ o conjunto de todas as palavras formadas com 0 ou mais símbolos de Σ.


ˆ Σ+ o conjunto de todas as palavras formadas com 1 ou mais símbolos de Σ.

Observe que a palavra vazia está em Σ∗ (ε ∈ Σ∗ ), mas não está em Σ+ (ε ∈


/ Σ+ ).

2.2.1 Tamanho

O tamanho de uma palavra w, representado por |w|, é a quantidade de símbolos


desta. Nos exemplos anteriores de palavras, se considerarmos w1 sobre o alfabeto Σ4 , seu

tamanho é 2; mas se considerarmos que ela está denida sobre o alfabeto Σ1 , o seu

tamanho é 4. O tamanho da palavra vazia (ε) é 0 (zero).

Formalmente, dene-se o tamanho de uma palavra w da seguinte forma:


(
0, se w = ε
|w| =
1 + |w0 |, se w = aw0 , onde a∈Σ e w0 ∈ Σ∗

2.2.2 Concatenação

A concatenação w1 e w2 é uma terceira palavra formada pela


de duas palavras

justaposição dos símbolos de w1 com os de w2 . Por exemplo: sejam w1 = ab e w2 = cd.

A concatenação de w1 com w2 , representada por w1 w2 é abcd. Vale ressaltar que o ε é o

elemento neutro da concatenação. Assim, wε = εw = w .

A concatenação sucessiva de uma palavra w, representada por wn , é a conca-

tenação de w com ela mesma n vezes. Formalmente, a concatenação sucessiva é denida

da seguinte maneira:

4


 indef inida, se w = ε e n = 0

 ε, se w = ε e n > 0


n
w = ε, se w 6= ε e n = 0


 w . . w}, se w 6= ε e n > 0
| .{z



n vezes

Como exemplo, seja w = ab, w5 = ababababab. A concatenação sucessiva se


3 3
aplica ao elemento mais próximo. Assim (ab) = ababab 6= ab = abbb.

2.2.3 Reverso

O reverso de uma palavra w, representado por wR , corresponde à palavra

obtida a partir de w, invertendo-se a ordem dos seus símbolos. Formalmente, temos:


(
ε, se w = ε
wR =
wn . . . w1 , se w = w1 . . . wn
Em algumas situações, o reverso de uma palavra corresponde à própria palavra.

Nesses casos, diz-se que w é um palíndromo. São exemplos de palíndromos: ε, a, aba.


O reverso, assim como a concatenação sucessiva, aplica-se ao elemento mais

próximo. Assim, (aab)R = baa 6= a(ab)R = aba.

2.2.4 Prexo, Suxo e Subpalavra

Sejam w uma palavra, Σ um alfabeto sobre o qual w está denida (w ∈ Σ∗ ) e

v uma subsequência contígua de símbolos de w. Segundo Hromkovi£ (2003), v é:

ˆ prexo de w; se existe y ∈ Σ∗ tal que w = vy ;


ˆ suxo de w; se existe x ∈ Σ∗ tal que w = xv ; e

ˆ subpalavra de w; se existem x, y ∈ Σ∗ tais que w = xvy .

Para exemplicar esses conceitos, considere a palavra w = abcd. A seguir,

estão listados todos os seus prexos, suxos e subpalavras.

ˆ prexos: ε, a, ab, abc e abcd;


ˆ suxos: ε, d, cd, bcd e abcd;
ˆ subpalavras: ε, a, b, c, d, ab, bc, cd, abc, bcd e abcd.

w uma palavra e w0 uma subpalavra de w. Diz-se que w0 é uma subpa-


Sejam

lavra própria de w se, e somente se, 0 < |w0 | < |w| (em outras palavras, w0 6= ε e w0 6= w).
De forma análoga, denem-se prexo próprio e suxo próprio.

5
2.3 Linguagens

Uma Linguagem Formal é um conjunto de palavras sobre um alfabeto. For-



malmente, diz-se que L = {w ∈ Σ | P (w)}. Ou seja, L é o conjunto de palavras sobre

um alfabeto Σ que satisfazem a propriedade P . Por exemplo:

ˆ L1 = {w ∈ {a, b}∗ | aa não é subpalavra de w}


ˆ L2 = {w ∈ {a, b}∗ | w é um palíndromo}

ˆ L3 = 0n 1n , n ∈ N
ˆ L 4 = an b n c n , n ∈ N
ˆ L5 = an bn an bn , n ∈ N
O conjunto vazio e o conjunto que possui apenas a palavra vazia são exemplos

de linguagens. Note, entretanto, que são distintas ({} 6 {ε}).


= A primeira, chamada de

L∅ , não possui nenhuma palavra; já a segunda, chamada de Lε , possui uma palavra.

A concatenação de duas linguagens L1L1 · L2 = {w1 w2 |


e L2 é a linguagem

w1 ∈ L1 e w2 ∈ L2 }. A concatenação pode ser representada por L1 L2 . Por exemplo,


sejam as linguagens L1 = {a, ab, ba, aba} e L2 = {ε, b, ba}. A concatenação de L1 com L2

é a linguagem formada pela concatenação de cada palavra de L1 com cada palavra de L2 .

Assim, L1 L2 = {a, ab, aba, abb, abba, ba, bab, baba, abab, ababa}.

Para toda e qualquer linguagem L, temos as seguintes propriedades:

ˆ LL∅ = L∅ L = ∅
ˆ LLε = Lε L = L

A concatenação sucessiva de uma linguagem L é a concatenação de L com ela


n
mesma n vezes. Ou seja, L =L
| .{z
. . L}. Há ainda dois casos especiais de concatenação
n vezes
sucessiva, que são:L+ = Ln , n ≥ 1 e L∗ = Ln , n ≥ 0. Esta última é chamada também de

Estrela de Kleene de L. Observa-se ∗ +


que ε ∈ L , ∀ L 6= ∅; e que ε ∈ L ⇔ ε ∈ L.

A concatenação sucessiva de uma linguagem L pode ser denida como:

ˆ L0 = Lε
ˆ Li+1 = Li L,
[
para todo i∈ N
ˆ L∗ = Li
i∈ N[
ˆ L =
+
Li = LL∗
N
i∈ −{0}

6
Uma outra operação comum em linguagens é o complemento. Seja L uma

linguagem sobre um alfabeto Σ (L ⊆ Σ ). O complemento de L, representado por L0 ou

L, é o conjunto resultante de Σ∗ − L.
Na verdade, as operações que podem ser realizadas com conjuntos também

se aplicam a linguagens, pois estas são também conjuntos. Como será visto no decorrer

do nosso curso, é comum ver uma linguagem como uma combinação (união, intersecção,

concatenação etc.) de outras linguagens mais simples.

A Figura 1 apresenta uma hierarquia para as linguagens formais. Foi elaborada

com base na hierarquia proposta por Noam Chomsky para gramáticas. As linguagens

também podem ser classicadas em tipos de 0 a 3. A numeração é feita do conjunto

mais externo para o mais interno, de forma que as linguagens enumeráveis recursivamente

também são tratadas como tipo 0, e as linguagens regulares são chamadas de tipo 3.

Linguagens Regulares

Linguagens Livres de Contexto

Linguagens Sensíveis ao Contexto

Linguagens Enumeráveis Recursivamente

Figura 1  Hierarquia de Chomsky para Linguagens

Considere as linguagens apresentadas no início desta seção. L1 é regular, L2 e

L3 são livres de contexto, L4 é sensível ao contexto, e L5 é enumerável recursivamente.

O Quadro 1 a seguir traz a relação entre cada tipo de linguagem com as ferra-

mentas utilizadas para estudar cada uma delas, nos formalismos reconhecedor e gerador.

O formalismo denotacional será utilizado apenas para o estudo de linguagens regulares.

Classe de Linguagens Formalismo Reconhecedor Formalismo Gerador

Enumeráveis Recursivamente Máquinas de Turing Gramáticas Irrestritas

Sensíveis ao Contexto Máq. de Turing com ta limitada Gram. Sensíveis ao Contexto

Livres de Contexto Autômatos com Pilha Gram. Livres de Contexto

Regulares Autômatos Finitos Gramáticas Regulares

Tabela 1  Relação entre linguagens e formalismos utilizados

7
2.4 Gramáticas

Gramáticas são representadas por quádruplas G = (V, T, P, S), onde:

ˆ V: Conjunto nito e não vazio de símbolos variáveis;

ˆ T: Conjunto nito de símbolos terminais;

ˆ P: Conjunto nito de regras de produção;

ˆ S: Símbolo inicial da gramática (S ∈ V ).

As regras de produção são pares (α, β), com α ∈ (V ∪ T )+ e β ∈ (V ∪ T )∗ .


Uma regra (α, β) é representada por α → β (α produz β ). Se há n regras de produção

com uma mesma cadeia α do lado esquerdo, ou seja, α → β1 , . . . , α → βn , é possível

abreviá-las para α → β1 | . . . |βn . As barras indicam ou (α produz β1 ou . . . ou βn ).

O que muda de um tipo de gramática para outro é a forma como são denidas

as regras de produção. Nas gramáticas regulares e nas livres de contexto, o lado esquerdo

das produções consiste em apenas uma variável (α ∈ V ). No caso das regulares, há ainda

algumas restrições em relação ao lado direito. Nas gramáticas sensíveis ao contexto e nas

irrestritas, o lado esquerdo pode conter mais de um símbolo, incluindo terminais. Cada

um desses detalhes será visto no decorrer do curso.

Uma derivação consiste na aplicação de uma das regras de produção da gra-

mática. A geração de uma palavra por uma gramática se dá pela aplicação de sucessivas

derivações, a partir do símbolo inicial. Para representar que uma cadeia α deriva uma
+ ∗
outra cadeia β (α ∈ (V ∪ T ) e β ∈ (V ∪ T ) ), usa-se a relação ⇒ (α ⇒ β ).
Dada uma gramática G = (V, T, P, S), a derivação é denida como segue:

ˆ Se S → β, então S ⇒ β;
ˆ Se β ⇒ βu βv βw e βv → βt , então β ⇒ βu βt βw .

Tomemos como exemplo a gramática G1 a seguir, para vericar se a palavra

ababa é gerada por ela:

G1 = ({S}, {a, b}, P1 , S)


P1 = {S → aSa | bSb | a | b | ε}
Observe que S ⇒ aSa ⇒ abSba ⇒ ababa.
O propósito deste material é fazer uma breve apresentação sobre as gramáticas

em geral. No decorrer do curso, sempre que oportuno, serão introduzidos novos conceitos,

tais como: derivação sucessiva, árvore de derivação, ambiguidade, linguagem gerada e

formas normais, entre outros.

8
3 Exercícios

1. Marque cada conjunto a seguir com V, se for um alfabeto, ou F, caso contrário.

a) ( ) Σ1 = {0, 1, 2, . . .}
b) ( ) Σ2 = {0, 1, . . . , 9}
c) ( ) Σ3 = {00, 01, 10, 11}
d) ( ) Σ4 = {0, 1, 10, 11}

2. Seja w = 011001 uma palavra sobre Σ = {0, 1}. Nos itens a seguir, considere wi ∈ Σ∗ ,
para 1 ≤ i ≤ 3, e os demais símbolos elementos de Σ. Apresente quantas e quais são

as possíveis soluções para cada expressão:

a) w = aw1 aw2 aw3


b) w = w1 w1R w2
c) w = aw1 bw2
d) w = aw1 bbw2

3. Seja Σ = {a, b} um alfabeto. Dê exemplos de cadeias que estão e não estão em cada

uma das linguagens denidas sobre Σ∗ .

a) L1 = {w | ∃u ∈ Σ2 e w = uuR u}
b) L2 = {w ∈ Σ∗ | w2 = w5 }
c) L3 = {w | ∃u, v ∈ Σ+ e w = uv = vu}
d) L4 = {w ∈ Σ+ | w = wR }

4. Seja L 6= ∅. Sobre quais circunstâncias L+ = L∗ − {ε}


5. Dada a gramática G a seguir, verique se a palavra abaab é gerada por ela.

G = ({S, A, B, C}, {a, b}, P, S)


P = {S → aA | bB ,
A → aC | bB ,
B → bC | aA,
C → aC | bC | ε}

9
Referências

DING-ZHU, D.; KER-I, K. Problem Solving in Automata, Languages, and Complexity.


Newark, NJ: Wiley, 2004.

HOPCROFT, J. E.; ULLMAN, J. D.; MOTWANI, R. Introduction to Automata Theory,


Languages and Computation. 3. ed. Boston, MA, USA: Addison-Wesley Longman
Publishing Co., Inc., 2006.

HROMKOVIƒ, J. Theoretical Computer Science: Introduction to Automata,


Computability, Complexity, Algorithmics, Randomization, Communication, and
Cryptography. Berlim: Springer, 2003. (Texts in Theoretical Computer Science. An
EATCS Series). ISBN 9783540140153.

LEWIS, H. R.; PAPADIMITRIOU, C. H. Elements of the Theory of Computation. 2. ed.


New Jersey: Prentice-Hall, 1998.

MENEZES, P. F. B. Linguagens Formais e Autômatos. 6. ed. Porto Alegre: Bookman,


2012. v. 3. (Série livros didáticos informática UFRGS, v. 3).

10

Você também pode gostar