Autómatos Finitos — Exercícios

Os exercícios assinalados com "✓" serão resolvidos nas aulas práticas; Os assinalados com "†" têm elevada dificuldade. Todos os restantes devem ser resolvidos pelos alunos.

Autómatos Finitos Deterministas

Exercício 01

Para o AFD com a transição dada pela tabela

  1. Desenhe o diagrama de estados.
  2. Escreva as computações de para as palavras e referindo se são, ou não, aceites.
  3. Escreva uma expressão regular que represente a linguagem reconhecida por .

Exercício 02

AFD Exercício 02
AFD Exercício 02

Seja o AFD dado pelo diagrama acima.

  1. Qual é o estado inicial, e quais são os estados finais?
  2. As palavras , e são aceites?
  3. Que palavras de estão em ?

Exercício 03

Seja um AFD.

  1. desenhe o diagrama de estados
  2. ✓ escreva uma expressão regular que represente a linguagem reconhecida por
  3. ✓ repita a alínea anterior para o AFD que apenas difere de no conjunto dos estados de aceitação, que no caso de é

Exercício 04

Construa um autómato finito determinista que reconheça a linguagem das palavras...

  1. sobre em que todos os 's precedem todos os 's que, por sua vez, precedem todos os 's (donde que todos os 's precedem todos os 's), podendo não haver nem 's, nem 's, nem 's.
  2. sobre que não têm como subpalavra.
  3. sobre em que cada é seguido imediatamente por .
  4. não vazias sobre em que o número de 's é divisível por .

Exercício 05

Construa um autómato finito determinista que reconheça a linguagem da ER .

Exercício 06

Calcule ER das linguagens reconhecidas pelos autómatos seguintes.

a)b)
AFD Exercício 06AFD Exercício 06
c)d)
AFD Exercício 06AFD Exercício 06
e)
AFD Exercício 06

Exercício 07

Encontre um AFD que aceite a linguagem das palavras em ...

  1. com prefixo .
  2. com subpalavra .
  3. expansões binárias dos naturais congruentes zero módulo .
  4. com subpalavra e sufixo .
  5. com subpalavra e não têm sufixo .
  6. em que cada bloco de quatro letras consecutivas contém .

Exercício 08

Encontre um AFD que aceite a linguagem das palavras...

  1. com prefixo .
  2. com sufixo .
  3. com subpalavra ou .
  4. em que as últimas cinco letras têm três s.
  5. tais que é múltiplo de cinco.
  6. sobre o alfabeto onde a soma dos símbolos é múltiplo de cinco.

Computação Não Determinista

Exercício 09

Determine a linguagem (ER) dos AFND acima.

a)b)c)
AFND EXERC 09 AAFND EXERC 09 BAFND EXERC 09 C

Exercício 10

Considere a linguagem de todos os números inteiros sem sinal, escritos em base , em que o último algarismo ocorre anteriormente no número. Por exemplo, e pertencem a esta linguagem, mas e não. (Os números escritos em base só podem ter os algarismos e .)

  1. escreva uma expressão regular que a represente.
  2. defina um autómato finito que a reconheça.
  3. apresente um autómato finito determinista que a reconheça (Sugestão: tente construí-lo diretamente, sem recorrer a qualquer algoritmo).

Exercício 11

AFND EXERC 11

Considere o autómato definido no diagrama acima.

  1. Calcule o e o .
  2. Calcule e .
  3. Desenhe as árvores das computações de e , indicando se são aceites ou rejeitadas.

Exercício 12

Seja um autómato finito não determinista cuja função de transição é

Construa um autómato finito determinista equivalente a , usando o algoritmo dado nas aulas, e apresente uma ER que represente a linguagem por ele reconhecida.

Exercício 13

✓ Repita o exercício anterior para o autómato finito não determinista cuja função de transição é

Exercício 14

✓ Considere a linguagem de todas as palavras sobre em que o antepenúltimo símbolo é .

  1. defina um autómato finito (não determinista) que reconheça esta linguagem.
  2. aplicando o algoritmo dado nas aulas, construa um autómato finito determinista equivalente ao autómato finito da alínea anterior.

Exercício 15

Repita o exercício anterior para a linguagem de todas as palavras sobre em que o terceiro e o antepenúltimo símbolos são . São exemplos de palavras que pertencem a esta linguagem as palavras , , e .

Exercício 16

Sejam e dois autómatos finitos tais que e são disjuntos. Defina um autómato finito tal que .

Exercício 17

Defina um AFD equivalente ao AFND

em que

Minimização e Composição de AFD

Exercício 18

✓ Aplicando o algoritmo dado nas aulas, construa o autómato finito determinista mínimo equivalente a , com a função de transição

e apresente uma expressão regular que represente .

Exercício 19

Considere o autómato finito não determinista , com a função de transição

  1. construa o AFD equivalente a .
  2. construa o AFD mínimo equivalente a .

Exercício 20

✓ Considere a linguagem representada por reunida com .

  1. defina um autómato finito (não determinista) que reconheça aquela linguagem.
  2. construa um AFD equivalente ao autómato finito definido na alínea anterior.
  3. construa um AFD mínimo equivalente ao AFD obtido na alínea anterior.

Exercício 21

Repita o exercício anterior para a linguagem das palavras sobre que têm como subpalavra.

Exercício 22

✓ Construa um AFND que aceita a linguagem das palavras

  1. binárias com, pelo menos, três ocorrências de ;
  2. binárias com subpalavras e ;
  3. binárias (com subpalavra ou ) e (com sufixo ou );
  4. binárias em que o -ésimo símbolo é , para ;
  5. binárias, de tamanho , e em que, para cada , algum dos , ou -ésimo símbolo é ;
  6. em que ;

Exercício 23

Encontre um AFND que aceite as palavras...

  1. com prefixo ou sufixo .
  2. com pelo menos, duas ocorrências de e sufixo .
  3. em que .

Exercício 24

  1. Sejam e dois AFND. Encontre um AFND tal que .
  2. Seja um AFND. Encontre um AFND tal que .

Exercício 25

Seja um AFND em que

Construa um AFND que aceite a linguagem complementar de .

Exercício 26

  1. Construa um AFD que aceite a linguagem binária das palavras em que o quinto símbolo a partir do fim é .
  2. Converta (simule) cada um dos AFND seguintes num AFD:
    1. com transição

    2. Dados nos diagramas abaixo:

26.2 A26.2 B26.2 C
AFND EXERC 26 BAFND EXERC 26 BAFND EXERC 26 B

Exercício 27

Construa um AFD que aceite a linguagem das palavras que:

  1. Contêm as sub-palavras e ;
  2. Com sufixo ou ou (de duas maneiras);
  3. Ou (contêm as sub-palavras e ) ou (não contêm nem nem );
  4. A quarta letra a partir do fim, e a quarta letra a partir do princípio são ambas (nota: e estão nesta linguagem);

O Pumping Lemma

Exercício 28

Mostre que as seguintes linguagens não são regulares:

  1. .
  2. A linguagem das palavras capicua sobre .
  3. .
  4. .
  5. .
  6. .

Implementação

As indicações gerais para os exercícios de implementação são válidas aqui.

Uma Biblioteca para AFD

A biblioteca para AFD tem de verificar as condições indicadas a seguir.

  • Os estados são números inteiros, os símbolos de entrada são string e as palavras são listas de símbolos.
  • Represente. Um AFD é representado por uma estrutura de dados FSA (pode ser uma classe, uma struct, etc) com os seguintes atributos, que devem ser visíveis mas não modificáveis:
    • initialState o estado inicial.
    • finalStates o conjunto dos estados finais.
    • delta uma lista de triplos (q, s, p) que define a transição .
  • Construção. Um AFD é construidos pela função/método makeFSA(t,i,f) em que:
    • t é uma lista de triplos (q, s, p) como acima.
    • i é o estado inicial.
    • f é a lista dos estados finais.
  • Sanidade. A função wellFormed(fsa) ou fsa.wellFormed() testa se os atributos t,i,f do argumento definem, de facto, um AFD. Quais são essas condições?
  • Implemente. A função step(fsa, q, s) ou fsa.step(q, s) devolve o estado p quando fsa está no estado q e lê s.

    Se não existe transição para (q, s) esta função devolve "não definido".

    Em python "não definido" é None, em java/kotlin é null, em rust é Option::None, outras linguagens podem ou não definir "não definido" :D

  • Implemente. A função proc(fsa, q, w) ou fsa.proc(q, w) devolve o estado em que fsa termina se começar em q e ler a palavra w. Use o critério de step se a computação não continuar até ao fim.
  • Implemente. A função accepts(fsa, q, w) ou fsa.accepts(q, w), testa se w é aceite por fsa. Esta função deve devolver sempre um booleano.
  • Escrita. A função repr(fsa) ou fsa.repr() devolve uma string com várias linhas:
    • A primeira linha tem o formato i <Q>; em que <Q> é o estado inicial.
    • A segunda linha tem o formato f <Q1> ... <Qn>; em que os <Qi> são os estados finais.
    • As restantes linhas têm o formato <Q> <S> <P>; para representar a transição do fsa. Deve existir uma linha destas para cada "aresta" do autómato.
    • N.B. todas as linhas terminam em ";" e valores na mesma linha são separados por espaços.
  • Leitura. A função parseFSA(s) tem como argumento uma string no formato acima e devolve o FSA correspondente. A leitura do argumento deve descartar carateres "espaço" (\n\r\t) mas com cuidado.
  • Escrita. Consulte a documentação da linguagem dot usada para definir grafos. Implemente uma função reprDOT(fsa) ou fsa.reprDOT() para gerar um grafo numa string em dot.
  • Sanidade. As funções repr e parseFSA devem ser "inversas" uma da outra, no sentido em que parseFSA(s).repr() == s e parseFSA(fsa.repr()) == fsa. Embora estas igualdades não sejam exatamente igualdades, nem fáceis de implementar, teste-as com alguns casos simples.