Escolar Documentos
Profissional Documentos
Cultura Documentos
1.
Autômato Finito Determinístico: é uma 5-upla (Q, Σ, , q 0 , F), onde
Q é o conjunto de estados;
Σ é o alfabeto;
: Q x Σ ↦ Q é a função de transição;
q 0 ∈ Q é o estado inicial;
F é o conjunto de estados de aceitação.
Autômato Finito Não Determinístico: é uma 5-upla (Q, Σ, , q 0 , F), onde
Q é o conjunto de estados;
Σ é o alfabeto;
: Q x Σ ↦ 𝒫(Q) é a função de transição;
q 0 ∈ Q é o estado inicial;
F é o conjunto de estados de aceitação.
Linguagem Regular:
- Se a ∈ Σ ou a = ε , { a } é uma linguagem regular.
- Ø é uma linguagem regular.
- Se L1 e L2 são linguagens regulares, então L1 ∪ L2 é uma linguagem regular.
- Se L1 e L2 são linguagens regulares, então L1L2 é uma linguagem regular.
- Se L é uma linguagem regular, então L* é uma linguagem regular.
Expressão Regular:
- Se a ∈ Σ , a é uma expressão regular.
- Ø é uma expressão regular.
- ε é uma expressão regular.
- Se R1 e R2 são expressões regulares, então R1 ∪ R2 é uma expressão regular.
- Se R1 e R2 são expressões regulares, então R1R2 é uma expressão regular.
- Se R é uma expressão regular, então R* é uma expressão regular.
2.
Para provar que um AFD e um AFN reconhecem a mesma classe de linguagens, é necessário
provar que, dada um AFD, podemos construir um AFN equivalente e que, dada um AFN,
podemos construir uma AFD equivalente.
Caso 1: Dada uma AFD, construir uma AFN equivalente
Uma AFD por si só satisfaz a definição de AFN. Logo, dada uma AFD A que reconhece uma
linguagem R, a própria AFD A será uma AFN que também reconhece R. c.q.d
Caso 2: Dada uma AFN, construir uma AFD equivalente
Ideia da prova:
A idéia para transformar uma AFN numa AFD consiste em memorizar em quais estados a
AFN estaria depois da leitura de cada símbolo da cadeia. É importante perceber que
memorizar em quais estados a AFN estaria significa memorizar qual subconjunto do
conjunto de estados da AFN está ativo em cada computação. Para um AFN com k estados, há
2k subconjunto de estados. Logo, podemos construir a AFD dada uma AFN, criaremos um
estado para cada elemento do conjunto das partes da AFN e criaremos as transições de
forma a "apontar" qual seria o subconjunto de estados resultante se computássemos a cadeia
até o ponto atual.
Definição auxiliar:
E(R) = {q | q pode ser atingido a partir de R viajando − se ao longo de 0 ou mais setas ε}
Prova:
Seja uma AFN A = (Q, Σ, δ, q o , F ) que reconhece uma linguagem R. Podemos definir uma
AFD B que também reconhece R através da tupla (Q′, Σ, δ ′, q o ′, F ′) onde:
● Q′ = P (Q)
● q o ′ = E{ q o }
● δ ′(R, a) = {q ∈ Q | q ∈ E (δ(r, a)) para algum r ∈ R}
● F ′ = {R ∈ Q′ | R contém um estado de aceitação pertencente a F }
3.
A prova:
M = (
Q = Q1 U Q2 U q0,
∑ = ∑1 U ∑2,
q0 = q0,
= 1 U 2 U { (q0, ε) = {q0_1, q0_2} },
F = F1 U F2
)
A para essa propriedade é similar ao caso anterior, porém agora a AFN M irá ver se é possível
partir a palavra w recebida em dois pedaços w1 e w2 de tal forma que w1 sejá aceita por M1 e w2
seja aceita por w2.
A prova:
M = (
Q = Q1 U Q2,
∑ = ∑1 U ∑2,
q0 = q0_1,
F = F2
)
Mais uma vez, teremos uma prova similar as anteriores, mais especificamente, essa prova será
similar a prova do fechamento sob concatenação, uma vez que a operação de estrela é equivalente
a concatenação de uma linguagem consigo mesma uma quantidade qualquer de vezes (inclusive 0
vezes).
A prova:
M = (
Q = Q1 U q0,
∑ = ∑1,
F = F1 U q0
)
4.
a)
b)
c)
d) .
e)
f)
g)
h)
i)
5.
a. Se M é determinístico significa que dada uma palavra de entrada w existe uma única
execução possível de M sobre w. Isso quer dizer que há apenas uma possível
sequência de estados pelos quais o AFD irá passar ao processar a entrada w.
b. Como M é determinístico, sabemos que existe uma única sequência de estados pelos
quais M passa ao avaliar uma dada palavra w. Devido a isso, sabemos que existe um
único estado possível no qual M para ao completar a leitura de w. Se M aceita w, isso
quer dizer que M para em um estado de aceitação, porém como os estados de
aceitação e rejeição foram trocados em M’, isso quer dizer que o estado no qual M’
para será um estado de rejeição, e, portanto, M’ rejeitará toda palavra que M aceitar.
Da mesma forma o contrário: quando M roda sobre uma palavra w, e a rejeita, isso
quer dizer que quando M acaba de ler w ele deve se encontrar em um estado de
rejeição, mas como os estados são trocados em M’, esse estado passa a ser de
aceitação, e M’ deve aceitar w. Se M’ aceita toda palavra que M rejeita, e rejeita toda
palavra que M aceita, M’ reconhece o complemento da linguagem de M, por
definição.
c. Pode-se verificar que isso não é verdade para AFN com um exemplo simples de dois
estados. com apenas duas transições: O primeiro estado tem uma transição para o
segundo ao ler a letra ‘a’, e uma transição para si mesmo ao ler essa mesma letra. O
segundo estado é um estado de aceitação. Assim, esse automato aceita a palavra ‘a’, e
‘aa’, e ‘aaa’, e assim por diante. Se trocarmos os estados de aceitação, isto é, o
primeiro passar a ser o único estado de aceitação, veremos que esse novo AFN M’
continua aceitando ‘a’, e ‘aa’, e ‘aaa’, e assim por diante.
6.
a.
b.
c.
d.
7.
8. Para provar que as expressões regulares reconhecem a classe das linguagens regulares e
não que isso. Precisamos provar duas direções:
- Se uma linguagem é descrita por uma expressão regular, então há um AFD que a
descreve.
Vamos provar essa direção através de um algoritmo que converte uma expressão regular
genérica em um AFN. Como AFN e AFD são modelos equivalentes (questão 2), então
teremos provado o enunciado. Utilizaremos a definição formal para criar um algoritmo de
construção capture todo o poder expressivo das expressões regulares.
4. R = R1 ⋃ R2 , R = R1 ⋂ R2 e R = R1 *
Equivalente a provar que a classe das linguagens regulares é fechada sobre as operações
união, intersecção e estrela, que estão na questão 3.
- Se uma linguagem é descrita por um AFD, então há uma expressão regular que a
descreve.
Essa direção da prova é mais complicada e necessita da utilização de um modelo especial
chamado AFNG para formalizarmos a prova. Passaremos pelos seguintes passos para provar
esse enunciado:
1. Apresentar o novo modelo AFNG e a conversão de um AFD em um AFNG.
2. Apresentar um algoritmo que converte uma AFNG de n estados em uma AFNG de 2
estados e provar sua corretude.
Uma prova completa também necessitaria provar a equivalência entre AFNG e AFD, porém
isso será considerado trivial para essa prova devido ao tamanho da questão e do fato de que o
livro também não se preocupa em provar essa equivalência.
Definiremos um AFNG da seguinte forma:
Para converter um AFD para um AFNG seguimos uma sequência curta de passos:
1. Criamos dois novos estados, um que será o novo estado inicial e que tem uma
transição espontânea para o estado inicial atual, e um que será o novo estado de
aceitação, para o qual todos os atuais estados de aceitação passam a ter uma transição
espontânea.
2. Com esse novo estado de aceitação definido, os outros estados de F deixam de ser
estados de aceitação
3. Para todo par de estados q1 e q2, se q1 não possui nenhuma transição para q1,
adicionamos a transição (q1, ∅) = q2. A transição no conjunto vazio é diferente da
transição no símbolo vazio, sendo seu oposto: se a transição no símbolo vazio
acontece imediatamente sem precisar de qualquer entrada, a transição no conjunto
vazio nunca acontece, independente do símbolo da entrada.
Com a AFNG gerada, podemos aplicar o algoritmo que converte uma AFNG de n estados em
uma AFNG de dois estados, em que a única transição acontece justamente na expressão
regular que descreve a linguagem da AFD. Esse algoritmo consiste em eliminar um estado
intermediário por vez, até que sobre apenas o inicial e o final.
O algoritmo consiste em pegar um conjunto de três estados por vez, na seguinte formulação:
A partir daí é possível ir eliminando as dependências do estado intermediário até que ele
possa ser eliminado do AFNG. Esse processo é repetido até que se chegue a forma final
desejada.
9. A prova de que uma AFN pode ser convertida para uma AFN com um único estado de
aceitação, criaremos um algoritmo que realize essa conversão e provaremos sua corretude.
Seja um AFN N = (Q, Σ, δ, q o , F ) que reconhece a linguagem R. Podemos definir um AFN
M = (Q′, Σ, δ ′, q o , {q novo }) tal que:
● Q′ = Q ⋃ q novo
● δ ′(R, a) = {
/ R para algum estado q ∈ F
δ (R, a) se q ∈
δ(R, a) ⋃ q novo se q ∈ R para algum estado q ∈ F e a = ε
δ (R, a) se q ∈ R para algum estado q ∈ F e a =/ ε
}
Para provar a corretude do algoritmo, suponha uma palavra w.
- Caso w ∈ R , então N irá parar num estado de aceitação. Como M contém as mesmas
transições que N, M também parará no mesmo estado que N, que não é mais um
estado de aceitação. Como para todo estado de aceitação de N há uma transição vazia
para q novo , M também parará num estado de aceitação. Logo, M aceita todas as
palavras que N aceita.
- Caso w ∈/ R , então N irá parar em um estado diferente do estado de aceitação.
Como M tem as mesmas transições que N, com adição das transições vazias para
q novo e não há nenhuma transição vazia saindo de q novo , é impossível q novo pertencer
ao conjunto de estados ativos no final da computação de w. Como q novo é um único
estado de aceitação de M, então M não aceita nenhuma palavra que N não aceita.
Logo, M reconhece R, como queríamos demonstrar.
10.
11.
Essa prova é dividida na prova de dois lemas:
● Se uma linguagem é regular, então há uma AFN-TODOS que a reconhece
Uma linguagem é regular se é reconhecida por um AFD. Um AFD satisfaz a definição de um
AFN-TODOS onde todas as transições são definidas e não são usadas transições vazias, logo
esse lema é verdadeiro.
● Se uma linguagem é reconhecida por um AFN-TODOS, então a linguagem é regular.
Se uma linguagem regular, é reconhecida por um AFD. Para provar o lema então, criaremos
um algoritmo que, dado um AFN-TODOS, constroi um AFD equivalente.
Seja um AFN-TODOS T = (Q, Σ, q i , δ, F ) , construa uma AFD D = (Q′, Σ, q ′i , δ ′, F ′) tal que:
● Q′ = P (Q)
● q ′i = E({q i })
A descrição da linguagem é equivalente a reconhecer palavras que:
1. Não comecem com 0
2. Não terminem com 1 (par)
3. Não terminem com dois 0 (não divisível por 4)
Ao começar a computação, a AFD acima, que chamaremos de D, caso leia um 0, não satisfará
a condição 1 e logo passará para um estado "morto". Caso leia um 1, ela passa para um estado
onde verificará as outras duas condições. Caso leia um 0, a AFD irá para o estado de
aceitação, pois não terminará com 0 e o penúltimo símbolo foi 1, logo não terminará com
dois 0. Caso leia 00, a cadeia irá ferir a condição 3, logo não aceitará. Caso leia 1, 0^n1 , a
AFD continuará no segundo estado, pois não satisfaz ainda a condição de ser par.
13.
a)
Utilizaremos a prova por construção para provar que NAOPREFIXO é regular.
Dado um AFD A = (Q, Σ, q i , δ, F ) que reconhece uma linguagem R. Construiremos uma
AFD B que reconhece NAOPREFIXO(R). A idéia consiste em inutilizar qualquer transição
saindo de um estado de aceitação. Construa B = (Q′, Σ, q i , δ ′, F ) onde:
● Q′ = Q ⋃ {q morto }
● δ ′(r, a) = {
q morto se r ∈ F
q morto se r = q morto
/ F
δ (r, a) se r ∈
}
Seja w uma cadeia.
● Caso w ∈ R e w tenha um prefixo próprio pertencente a R, B não aceitará w, pois a
computação de b terá passado por q morto e não há formas de sair dele.
● Caso w ∈ R e w não tenha um prefixo próprio pertencente a R, B aceitará w, pois B é
composto das mesmas transições de A.
● Caso w ∈
/ R e w não tenha um prefixo próprio pertencente a R, B não aceitará w,
pois B é composto das mesmas transições de A, logo parará num estado de não
aceitação.
● Caso w ∈ / R e w tenha um prefixo próprio pertencente a R, B não aceitará w, pois B
terminará em q morto .
Logo, B reconhece NAOPREFIXO(R), como queríamos demonstrar.
b)
Utilizaremos a prova por construção para provar que NAOESTENDE é regular.
Dado um AFN A = (Q, Σ, q i , δ, F ) que reconhece uma linguagem R. Construiremos uma
AFN B que reconhece NAOESTENDE(). A idéia consiste em modificar o conjunto dos
estados de aceitação para não permitir estados que deem em outros estados de aceitação em
algum momento da computação. Construa B = (Q, Σ, q i , δ, F ′) onde:
● F ′ = { q ∈ F | não há transição saindo de q de tamanho ≥ 1 para algum estado r ∈ F }
Seja w uma cadeia
● Caso w ∈ R e w seja um prefixo próprio de uma cadeia de R, B não irá aceitar, pois
caso w seja um prefixo próprio de uma cadeia de R, significa que há um caminho do
estado de aceitação q1 da computação de w até um outro estado de aceitação q2. q2
não pode ser um estado de aceitação de B pela definição do conjunto de estados de
aceitação F'.
● Caso w ∈ R e w não seja um prefixo próprio de uma cadeia de R, B irá aceitar pois B
contém as mesmas transições de A e o estado final não fere a restrição dada por F'.
● Caso w ∈
/ R , B não irá aceitar pois B contém as mesmas transições de A e nenhum
estado de não aceitação foi transformado em um estado de aceitação.
Logo, NAOESTENDE é regular, como queríamos demonstrar.
14.
a) L3 = { w ∈ {0, 1} * | contém exatamente dois 0 e termina com 0}
b) maxcadeia(L) é equivalente a NAOESTENDE. Logo maxcadeia é regular a partir da
mesma prova.
c) Não. Suponha que o enunciado seja verdadeiro. Considere uma linguagem L =
{0i 1j | i > j } . L não é regular, mas aplicar maxcadeia(L) resulta em {}, que é regular.
Logo, por contradição, o enunciado é falso.
15.
16.
17. Através da prova do fechamento da concatenação sobre linguagens regulares, sabemos
que podemos construir um AFN A que reconhece L1 ⋂ L2 adicionando somente transições
vazias dos estados de aceitação de L1 para o estado inicial de L2. Logo, A tem n1 + n2
estados. Sabemos que podemos converter um AFN em um AFD com um conjunto de estados
igual ao conjunto das partes dos estados da AFN. Como P(Q) = 2|Q| e | QA | = n1 + n2, podemos
construir um AFD que reconhece L1 ⋂ L2 com 2n1 +n2 estados, como queríamos demonstrar.
18.
19.
Provaremos por construção. Suponha uma AFN A = (Q, Σ, δ, q o , F ) que reconhece uma
linguagem regular R. Construiremos uma AFN B = (Q′, Σ, δ ′, q o ′, F ′) que reconhece AR .
Para isso utilizaremos a seguinte função auxiliar:
CONTRARIO( δ ) = { δ ′ | δ ′(q, a) = q ′ se δ(q ′, a) = q ∈ δ}
CONTRARIO recebe uma função de transição e troca os estados de entrada com os estados
de saída para cada função possível.
Logo, AR será tal que:
● Q′ = Q ⋃ {q novo }
● q o ′ = q novo
● F ′ = { q o }
● δ ′(R, a) = {
F ⋃ CONTRARIO( δ ) se q novo ∈ R e a = ε
CONTRARIO( δ ) caso contrário
}
A ideia é inverter as transições de A, criar um novo estado inicial com transições vazias para
os antigos estados de aceitação e tornar o antigo estado inicial o novo estado de aceitação.
Logo, AR é regular.
20.
a) B pode ser descrita pela expressão regular 1Σ* 1Σ* . Como B pode ser descrita por uma
expressão regular, B é regular.
b) Provaremos que C não é regular através do lema de bombeamento. Suponha que C
seja regular e seja a cadeia w = 1p 01p . Se dividirmos w em xyz de forma que y tenha
somente 1’s da esquerda da cadeia e bombearmos para baixo de forma a ter a cadeia
xz, xz não será regular pois o número de 1’s a esquerda será menor que o número de
1’s a direita. Como há uma cadeia válida que, se bombeada, não pertence a
linguagem, C não satisfaz o lema de bombeamento. Logo, C não é regular por
contradição.
21.
a) Provaremos por contradição. S abemos que abn cn = F ⋂ ab* c* . Suponha que F é
regular. Como ab* c* é regular, abn cn também deve ser regular pela propriedade do
fecho da intersecção sobre a classe das linguagens regulares. Porém, abn cn não é
regular, como provaremos abaixo:
● L = abn cn não é regular
Provaremos por contradição. Suponha que L seja regular. Então L satisfaz o lema de
bombeamento. Suponha a cadeia w = abp cp ∈ L . Pelo lema do bombeamento, w pode ser
dividida em xyz tal que:
1. |xy| <= p
2. |y| > 0
3. xy * z ∈ L
Vamos verificar todas as formas possíveis de dividir w em xyz.
● Caso y seja formado só pelo a, o seu bombeamento faz com que o número de ‘a’ seja
maior que 1, logo xy * z não pertencerá a linguagem.
● Caso y seja formado por ab*, o seu bombeamento também irá ferir a terceira condição
pelo mesmo motivo do caso anterior.
● Caso y seja formado apenas por b’s, o seu bombeamento fará com que o número de
b’s e c’s não sejam mais iguais, contrariando a terceira condição do lema.
● Caso y seja formado por b’s e c’s, a cadeia resultante do bombeamento terá o número
correto de b’s e c’s, porém na ordem errada. Assim, essa divisão contraria a condição
3 do lema de bombeamento.
Como não há nenhuma forma de dividir w de forma que satisfaça o lema de bombeamento, L
não é regular, como queríamos demonstrar.
Como L não é regular, pelo fecho da intersecção sobre a classe das linguagens regulares F
também não pode ser regular, como queríamos demonstrar.
b)
Vamos verificar se F satisfaz o lema de bombeamento. Para isso, vamos verificar todas as
possibilidades de cadeias possíveis e vamos mostrar que toda cadeia de F pode ser
bombeada.
● Seja a cadeia w = abp cp . Podemos dividir w de forma que y tenha somente o a, e seu
bombeamento gerará uma cadeia ainda presente na linguagem.
● Seja a cadeia w = b* c* . ab* c* . Podemos dividir w de forma que y tenha somente b’s, e
seu bombeamento gerará uma cadeia ainda presente na linguagem.
● Seja a cadeia w = aa*b*c*. Podemos dividir w de forma que y tenha somente o a, e seu
bombeamento gerará uma cadeia ainda presente na linguagem.
Como não há uma cadeia de F que não satisfaça o lema de bombeamento, F satisfaz o lema
de bombeamento.
c) Os resultados não se contradizem por que o lema de bombeamento é uma condição
necessária, mas não suficiente para que uma linguagem seja regular. Isto é, toda linguagem
regular satisfaz o lema, porém isso não quer dizer que toda a linguagem não regular não
satisfaz.
22.
a) Suponha uma cadeia w que pertence a R1 e uma cadeia s que pertence a R2. Como w
pertence a R1 e R1 ≾ S1, w pertence a S1. Como s pertence a R2 e R2 ≾ S2, s pertence a
S2. Logo, (R1 o R2) é equivalente a ws. Como w pertence a S1 e s pertence a S2, ws
pertence a (S1 ° S2). Logo, (R1 o R2) ≾ (S1 ° S2), como queríamos demonstrar.
b) Suponha uma cadeia w que pertence a R. w* pertence a R* por definição. Como R ≾ S,
w pertence a S. Como w pertence a S, w* pertence a S*. Logo, como w é uma cadeia
qualquer, R* ≾ S*, como queríamos demonstrar.
c) Prova por indução:
Caso base: n = 0
(R 0 o S) ≾ T é equivalente a S ≾ T, que é verdadeiro através das pré-condições.
Caso indutivo: Suponha (R i o S) ≾ T . Prove que (R i +1 o S) ≾ T .
(R i+1 o S) ≾ T é equivalente a R o (R i o S) ≾ T .
Como (R o T) ≾ T, isso significa que, para qualquer cadeia w ∈ R e qualquer cadeia s ∈ T ,
ws ∈ T .
Seja a cadeia k ∈ (R i o S) . Como, pela hipótese indutiva, (R i o S) ≾ T , k
∈ T .
Logo, como w ∈ R e k ∈ T . wk ∈ T , por (R o T) ≾ T.
Logo, como wk ∈ T é equivalente a R o (R i o S) ≾ T , (R i +1 o S) ≾ T , como queríamos
demonstrar.
23.
a) Falso. abn cn não é regular e abn cn ⊆ Σ* , que é regular. Logo, por contra exemplo, o
enunciado é falso.
b) Falso. {a} ⊆ abn cn . {a} é regular, enquanto abn cn não é. Logo, por contra
exemplo, o enunciado é falso.
c) Verdadeiro. Suponha que C U { ε } seja regular. Temos dois casos possíveis.
● Caso ε ∈ C , C U { ε } = C, logo C é regular, o que contradiz a pré condição.
● Caso ε ∈
/ C , C = (C U { ε }) ⋂ {ε} . Como {ε} é regular e as linguagens
regulares são fechadas sobre a operação de intersecção e união, C é regular, o
que contradiz a pré condição.
Como a suposição sempre chega a uma contradição, Se C não é regular, então C U { ε } não é
regular, como queríamos demonstrar.