Linguagens Formais e Autômatos (LFA) Aula de 28/08/2013 Sobre as respostas das duplas aos exercícios cios propostos 1
Fatos extraídos dos scores das duplas Tempo médio de resposta - A série inteira de exercício, conforme informado pelas duplas, foi resolvida em 31:28 minutos em média. - O percentual médio de confiança das duplas nas respostas dadas (opção completo e correto ) foi de 62%, Há duplas com menos de 30% de grau de certeza sobre seu desempenho: sinal não muito promissor de acúmulo de dúvidas sobre a matéria. ------------------------------------ Sobre se as duplas que têm alto grau de certeza a respeito de seu desempenho estão de fato sabendo tudo ou não, vamos conferir nos próximos slides. 2
Exercício 1 Seja o autômato A = 1. Utilizando o seguinte formalismo simplificado: A : Q = <conjunto completo de estados> I = <conjunto unitário de estados iniciais> F = <conjunto completo de estados finais> = <alfabeto reconhecido> = tuplas de transição (qi,, qj) onde qi = estado corrente = símbolo lido pelo cabeçote qj = estado-alvo da transição defina formalmente o autômato A. 3
Resposta do Exercício 1 A : { Q = {q0, q1, q2} I = {q0} F = {q1} = {a,b} = { (q0,a,q0), (q0,b,q1), (q1,b,q, (q2,b,q1) } } 4
Exercício 2 - Resposta Seja o autômato A = 2. Que tipos de cadeias este autômato aceita? a*b(bb)* Ou seja, qualquer cadeias que resulte da concatenação de: Zero ou mais a com Um b com Zero ou mais bb (isto é, a cadeia formada pela concatenação de b com b, iterada (=repetida) zero ou mais vezes) 5
Comentário sobre a resposta do exercício 2 Algumas duplas responderam algo assim: Cadeias formadas por zero a infinitos a seguidos de 1 a infinitos b, sendo que o número de b tem de ser ímpar. É verdade. Este é o tipo de cadeia formada. Mas, como estamos aprendendo a formalizar linguagens, a resposta destas duplas é ainda informal (embora não esteja errada). Para dar uma resposta formal e correta, vamos utilizar os conceitos e as operações aprendidas na Aula 3 (slides de 8 em diante, sobretudo). É o que veem na resposta apresentada no slide anterior: a*b(bb)*. 6
Exercício Seja o autômato A = 3. Utilizando tuplas (qi,,qj) para representar (estado corrente, símbolo lido, próximo estado), apresente a sequência completa de reconhecimento para as seguintes cadeias: ab (q0,a,q0),(q0,b,q1) aaaaab (q0,a,q0), (q0,a,q0), (q0,a,q0), (q0,a,q0), (q0,a,q0),(q0,b,q1) abbbbb (q0,aq0),(q0,b,q1),(q1,b,q,(q2,b,q1), (q1,b,q,(q2,b,q1) b (q0,b,q1) a (q0,a,q0) -- Esta cadeia não é aceita: por quê? bb (q0,b,q1),(q1,b,q -- Esta cadeia não é aceita: por quê? 7
Exercício Seja o autômato A = 4. Utilizando os programas em Ruby apresentados na aula passada, implemente o reconhecedor associado a A. Basta que editem um dos arquivos Exemplo*.rb do diretório afd. Vejam no slide seguinte o resultado no ambiente instalado no computador de um dos professores da disciplina. 8
9
Exercício Seja o autômato A = 5. Escreva uma gramática regular que gere exatamente as mesmas cadeias aceitas pelo reconhecedor que você implementou. Lembrete - Uma gramática regular é definida por uma tupla {V,,P,S} onde: V=vocabulário finito e não vazio com TODOS os símbolos que aparecem à esquerda ou direita de regras de reescrita; é o alfabeto da linguagem (isto é, os símbolos terminais que podem aparecer em cadeias gramaticais da linguagem); P é o conjunto de regras de reescrita; e S é o símbolo raiz de todas as derivações. GramReg : V = {a,b,a,b,c,d,s} ; = {a,b} ; S; P = { S b A bc S bc C bd S aa D b A aa D bc A b } 10
Como conferir se uma gramática proposta está certa? JFLAP 1. Clique em Grammar 2. Na janela nova, transcreva a sua gramática candidata 3. Teste se a sua gramática é regular (menu Test ) 4. Se for, a mensagem diz entre parênteses (Regular Grammar and Context Free Grammar) ; prossiga. [Continua no próximo slide] 11
Como conferir se uma gramática proposta está certa? [Continuação] 5. Crie uma massa de testes, com cadeias que você sabe que devem ser aceitas e que devem ser rejeitadas. 6. Verifique o que acontece quando sua massa de testes é processada: Clique em Input e selecione Multiple CYK Parse Quando a nova janela abrir, forneça sua massa de teste e Clique em Run Inputs Se sua gramática for equivalente ao reconhecedor associado ao autômato A, então ela deverá: -- gerar corretamente (e fazer um parse bem sucedido) de cadeias a*b(bb)* [accept] -- não gerar cadeias cuja forma não seja w = a*b(bb)* Para testar a cadeia vazia, cliquem em Enter lambda. 12
Resultado da Gramática Proposta Este é o exercício mais difícil da série. É só para testar as intuições de vocês. Estudaremos algoritmos de conversão entre Gramáticas e Autômatos no próximo capítulo da matéria. 13
Exercícios Sejam as gramáticas G1, G2, G3, G4 e G5, cujas regras de reescrita são as seguintes: G1 S -> a S -> as Regular Tipo 3 G2 1. Diga que tipo de gramática é cada uma delas, segundo a Hierarquia de Chomsky. S -> AS bs ->Sb A -> a A -> b A -> aa Sensível a Contexto Tipo 1 G3 S -> AS S -> b A -> a A -> aa Livre de Contexto Tipo 2 G4 S -> ASB S -> c A -> a A -> aa B -> b B -> bb Livre de Contexto Tipo 2 G5 S -> XC X -> x X -> xx xxxx -> xxxx xxc -> xxc -> C Irrestrita Tipo 0 14
Exercícios Sejam as gramáticas G1, G2, G3, G4 e G5, cujas regras de reescrita são as seguintes: G1 G2 G3 G4 G5 S -> a S -> as S -> AS bs ->Sb A -> a A -> b A -> aa S -> AS S -> b A -> a A -> aa S -> ASB S -> c A -> a A -> aa B -> b B -> bb S -> XC X -> x X -> xx xxxx -> xxxx xxc -> xxc -> C 2. Mostre o caminho de derivação de pelos menos duas cadeias diferentes para cada uma delas, usando a notação do slide 5. 15
Exemplos de Derivações Para G1: S -> a S -> as -> aas -> aaa G1 S -> a S -> as Para G2: S -> AS -> as -> aas -> abs -> asb -> aasb -> aasb -> Temos um problema com esta gramática; o processo de derivação não para. Podem tentar vários caminhos alternativos, todos levarão a pontos da derivação - as ou bs -> Sb - que já foram visitados e de onde não se consegue sair. É um ciclo pernicioso que mostra que esta gramática está mal-formada. Mais adiante na matéria procuraremos caracterizar formalmente o sinal da má-formação desta gramática. G2 S -> AS bs ->Sb A -> a A -> b A -> aa 16
Exemplos de Derivações G3 Para G3: S -> AS -> aas -> aaas -> aaas -> aaab S -> AS -> aas -> aaas -> aaas -> aaaas -> aaaas -> aaaab Para G4: S -> ASB -> aasb -> aasb -> aacb -> aacbb -> aacbbb -> aacbbbb -> aacbbbb S -> ASB -> aasb -> aaasb -> aaaasb -> aaaasb -> aaaacb -> aaaacbb -> aaaacbbb -> aaaacbbbb -> aaaacbbbb S -> AS S -> b A -> a A -> aa G4 S -> ASB S -> c A -> a A -> aa B -> b B -> bb 17
Algumas Derivações para G5 G5 S -> XC S -> XC -> xc -- parou a derivação aqui! X -> x X -> xx S -> XC -> xxc -> xxc -> xxxx -> xxxx S -> XC -> xxc -> xxc -> C -- parou a derivação aqui! xxc -> S -> XC -> xxc -> xxxc -> xxxc -> x xxc -> C S -> XC -> xxc -> xxxc -> xxxxc -> xxxxc -> xxxxc -> xx S -> XC -> xxc -> xxxc -> xxxxc -> xxxxc -> xxxxxc -> xxxxxc -> xxx (Ufa!) -> xxxxxxxxxxxxx S -> XC -> xxc -> xxxc -> xxxxc -> xxxxc -> xxxxxc -> xxxxxc -> xxxc (Oh, não!) <complete uma derivação você mesmo> 18
Explorando o JFLAP na derivação gramatical Veja o vídeo de demonstração online. Video S-aS.mp4 Video S-aS-derivacao.mp4 19
Múltiplos caminhos de derivação O importante é que a cada passo seja válida da reescrita realizada, isto é: que haja uma regra autorizando a substituição. Diferentes caminhos têm, computacionalmente, diferentes vantagens e desvantagens, dependendo do propósito e do contexto da derivação. Vejam como a mesma cadeia é aceita por 3 parsers (analisadores sintáticos) diferentes, que geram 3 árvores diferentes! Video S-aS-parsers.mp4 20