Prova 1 de INF1626 Linguagens Formais e Autômatos Guia de correção proposto pelos professores (Clarisse e Bruno) Algumas das questões a seguir admitem várias respostas corretas. Este documento apenas dá exemplos de respostas consideradas corretas. Caso você tenha dado uma resposta diferente da apresentada aqui para uma questão qualquer e não tenha obtido o total de pontos da questão, compare as soluções e procure na diferença o motivo da perda de pontos. A pontuação das questões e critério de correção adotado estão no final. Questão 1 Seja a EBNF abaixo, descrevendo parte das regras sintáticas para expressar a definição de funções ('functions') na linguagem de programação C. Para facilitar o seu entendimento, quaisquer símbolos precedidos por '\' identificam um caso de símbolo reservado da própria EBNF (por exemplo '>', '<','[',']', etc.) que também faz parte das expressões válidas para a definição de funções em C (por exemplo \< ::= <, \{ ::= {, e assim por diante). <function> ::= <type> <literal> ([<params>]) \{ {<declarations>} \} <params> ::= <type> <literal> <type> <literal>; <params> <declarations> ::= <type> <literal>; <literal> = <value>; <literal>; <value> ::= TRUE FALSE <literal> {<number>} <type> ::= bool int <literal> ::= {<letter>} <letter>{<number>}[<literal>] <number> ::= 0 1 2 3 4 5 6 7 8 9 <letter> ::= a b c d e f g h i j k l m n o p q r s t u v w x y z ** Lembrete: Na notação acima, '[ ]' é o indicador de opcionalidade; '{ }' é o indicador de repetição de 1 a n vezes; '< >' é o indicador de símbolo não-terminal; '::=' é o indicador de produção; ' ' é o indicador de alternativas de produção para um mesmo não-terminal. (a) Utilizando a notação α β onde: α é um símbolo não-terminal é o indicador de produção (ou reescrita) do símbolo não-terminal à sua esquerda e β é uma cadeia de símbolos terminais ou não-terminais separados por um espaço em branco (por exemplo 'a B', ou 'a b A', ou 'a B A', etc.) escreva as regras de produção de uma gramática que define exatamente a mesma linguagem que a EBNF acima (ou seja, que define quais são as sentenças sintaticamente corretas que podem ser usadas para expressar 'function' em C). Para simplificar, vamos admitir as seguintes duas regras correspondentes às definições de <number> e <letter>, respectivamente: Number -> 0..9 Letter -> a..z 1. Letter a..z 2. Number 0..9 3. Letters Letter Letter Letters 4. Numbers Number Number Numbers 5. Literal Letters Letter Numbers Letter Numbers Literal 6. Type bool int 7. Value true false Literal Numbers 8. Declaration Type Literal ; Literal = Value ; Literal ; 9. Declarations Declaration Declaration Declarations
10. Params Type Literal Type Literal ; Params 11. Function Type Literal ( ) { Declarations } Type Literal ( Params ) { Declarations } A mesma gramática acima pode ser escrita assim: 1. A a..z 2. B 0..9 3. Z A A Z 4. Y B B Y 5. L Z A Y A Y L 6. T bool int 7. V true false L Y 8. X T L ; L = V ; L ; 9. D X X D 10. P T L T L ; P 11. S T L ( ) { D } T L ( P ) { D } Estão também implicitamente definidos nas duas gramáticas: O vocabulário da linguagem: a..z, 0..9, bool, int, true, false, (, {, }, ), =, ; O símbolo inicial: Function (ou S) Os símbolos não-terminais: Letter (ou A), Number (ou B), Letters (ou Z), Numbers (ou Y), Literal (ou L), Type (ou T), Value (ou V), Declaration (ou X), Declarations (ou D), Params (ou P) Uma versão regular para a gramática seria: Literal a..z a..z Literal' Literal' a..z Literal' 0..9 Literal' a..z 0..9 Type bool int Value true false a..z a..z Literal' 0..9 0..9 Literal' Declarations bool Declarations' int Declarations' a..z Literal'' a..z Literal''' Declarations' a..z Literal'' 0..9 Literal'' a..z D 0..9 D Literal'' a..z Literal'' 0..9 Literal'' a..z D 0..9 D D D ; } ; Declarations Literal''' a..z Literal''' 0..9 Literal''' a..z V 0..9 V V = V' V' true D false D a..z D a..z Literal'' 0..9 D 0..9 Literal'' Params bool Literal int Literal bool Literal'''' int Literal'''' Literal'''' a..z Literal'''' 0..9 Literal'''' a..z P 0..9 P P P ; Params ; R Function bool F int F F a..z F 0..9 F a..z Q 0..9 Q Q ( Params R ) G G { Declarations (b) A gramática que você propôs em (a) é regular? Por quê?
A primeira gramática ilustrada (em suas duas versões) não é regular porque as reescritas definidas pelas regras (cadeias do lado direito) violam uma ou mais das restrições que caracterizam as regras α β das linguagens regulares: 1. α = 1 2. β tem no máximo 1 símbolo não terminal 3. o padrão das cadeias à direita da regra é t T (ou alternativamente T t) ou t, para t=símbolo terminal e T=símbolo não-terminal Obs: Alguns autores não aceitam a alternativa apontada para (3), acima. A segunda gramática ilustrada é regular porque atende às restrições 1, 2 e 3. (c) No autômato mostrado da Figura 1, abaixo, o arco declarations é uma abreviação de todas as e somente as concatenações de símbolos autorizadas pela regra de expansão de declarations (<declarations> ::= <type> <literal>; <literal> = <value>; <literal>;) na EBNF acima. Portanto, o que está omitido por este arco é perfeitamente equivalente ao que está explícito na EBNF. A abreviação está sendo feita para simplificar a questão. Figura 1: Autômato de referência para as perguntas c1,c2,c3 e c4 c1: Este autômato é um autômato finito? A resposta para alunos que apresentaram gramáticas não regulares e corretas em 1a é que, se houver uma gramática regular que descreva todas as e somente as concatenações de símbolos autorizadas pela regra de expansão de declarations (<declarations> ::= <type> <literal>; <literal> = <value>; <literal>;) na EBNF acima, então pode-se dizer que o autômato completo da Figura 1 é finito. Caso contrário, não é. Para alunos que apresentaram gramáticas regulares corretas em 1a a resposta é que o autômato é finito porque, como demonstrado em 1a, a expansão de declarations é uma linguagem regular. c2: É determinístico? Por quê? A resposta para alunos que apresentaram gramáticas não regulares e corretas em 1a é que, tal como apresentado na Figura 1 (i. e. sem considerar os estados e transições correspondentes a declarations ), o autômato é determinístico porque não existe, entre os seus 8 estados explícitos, nenhum para o qual haja duas transições definidas para o mesmo símbolo terminal e também não há arcos λ (lambda), correspondendo a transições com cadeias vazias. Sobre a parte abstraída como declarations, o sub-autômato que processa as cadeias de símbolos corretas será
determinístico se não houver, para seus n estados definidos, nem arcos λ, nem duas transições determinadas por um mesmo símbolo (terminal, se a gramática for regular, ou não-terminal, se a gramática não for regular). Alunos que apresentaram gramáticas regulares em 1a, resta saber se a gramática é determinística ou não. c3: Pode ser minimizado? Como? (Se sua resposta for positiva, desenhe o autômato mínimo.) A parte inicial do autômato, que garantidamente corresponde a um sub-autômato finito e determinístico, pode ser minimizada como mostrado na Figura 1A. O autômato foi desenhado no JFLAP e a legenda é: b=bool; i=int; l=letter; n=number. Os rótulos do autômato da Figura 1a correspondem aos estados da Figura 1 (0 =Q0, 1=Q1, etc.). Figura 1A: Autômato minimizado para a parte inicial do autômato da Figura 1 c4: O autômato da Figura 1 reconhece a mesma linguagem que a especificada pela EBNF acima? Se não reconhece, que modificações são necessárias para que passe a reconhecer? Considerando que declarations gera todas as cadeias corretas conforme especificado na EBNF da questão, resta saber se os estados que precedem q6 e sucedem q7 geram os símbolos especificados pela regra 11 da gramática apresentada na questão 1a: 11. Function Type Literal ( ) { Declarations } Type Literal ( Params ) { Declarations } O autômato da Figura 1 não gera expansões corretas para a parte em negrito da regra 11, acima. Note que, por exemplo, ele aceita uma sentença como int ab1 ( ) { } que não é aceita pela EBNF apresentada. Outro problema é a colocação correta do ;, que só deveria aparecer caso houvesse uma lista de mais de um parâmetro para a função. Com um único parâmetro, depois do literal deveria seguir um ). Uma forma de corrigr o autômato da Figura 1 seria o que aparece na Figura 1B:
Figura 1B: Autômato corrigido para processar listas de parâmetros corretamente (d) A sentença "int f (bool b) {a=1; b=a; return}" é sintaticamente correta pela EBNF apresentada acima? Se não for, você conseguiria adicionar ou retirar um único símbolo na sentença em questão fazendo então com que ela se torne sintaticamente correta? Mostre como. A sentença em questão não é correta. Para corrigi-la bastaria acrescentar um ; antes de fechar a chave: "int f (bool b) {a=1; b=a; return; }". (e) A expressão regular (letter* + number*)* = true + false + number* denota corretamente um tipo (não necessariamente todos os tipos) de declaração ('declarations') sintaticamente correta da linguagem C pela EBNF acima? Se não denota, por que não denota? Há como corrigi-la para que denote? Como? O tipo de declarations em questão é <literal> = <value>. A ausência de ; no final não é o principal da questão. Para este tipo de declarations, a expressão acima tem dois problemas. Primeiro, ela a expansão da cadeia equivalente a literal permite vários problemas: literais iniciados por uma cadeia de letras, seguida de números, ou iniciados por números, ou até mesmo literais vazios (que é o que o operador de Kleene denota). Uma denotação correta para esta parte seria: letter letter* + letter number (number + letter number)* letter*. O segundo problema é que o lado direito da equação (o que vem depois de = ) admite como alternativa uma iteração de zero números (ou seja, uma cadeia vazia). Isto tampouco funciona. A correção desta parte seria: = true + false + number number*. A notação adotada na expressão regular desta questão é: a + b para denotar a OU b a * para denotar a repetição de 0..N instâncias de a (a + b)* para denotar a repetição de 0..N instâncias de a ou b Para simplificar, estamos também adotando as seguintes definições: letter* denota 0..N letras (a..z) concatenados number* denota 0..N algarismos (0..9) concatenados
Questão 2 Seja L uma linguagem que denota expressões aritméticas binárias com operadores infixos para a soma, subtração, multiplicação e divisão de operandos inteiros, e que admite o uso de parênteses balanceados para priorizar o cálculo de parcelas da expressão. São exemplos de expressões sintaticamente corretas em L as listadas a seguir: 1. (100 + 82) / 7 2. 100 + 82 / 7 ou então (100 + 82 / 7) 3. 250 - ((100 - (45 / 2)) * (67 / (23 + 8))) São exemplos de expressões sintaticamente incorretas em L as listadas a seguir: 4. 3 + (7-2 / ) 4 ou então 3 + (7-2 ) / 4) 5. 526 + ( -7) 6. * (30 + (15 3)) Apresente uma gramática de tipo 2 que gere essa linguagem. Uma possibilidade é a gramática a seguir. Mas há outras, claro. 1. S N O N S O S S O N N O S (S) 2. N 0..9 0..9 N 3. O + - / * Questão 3 O Lema do Bombeamento diz que, para toda linguagem regular LR à qual pertençam infinitas sentenças, existe uma constante p tal que, sendo w uma sentença qualquer de LR, existe uma partição w xyz desta sentença tal que: y 1 xy p qualquer w xy*z também pertence a LR (a) A afirmação a seguir é consistente com o Lema do Bombeamento? SIM, é consistente. Nesta interpretação, não há qualquer garantia de que p seja o comprimento mínimo para o bombeamento. Porém, o lema não depende deste comprimento mínimo. Para qualquer linguagem LR reconhecida por um autômato finito determinístico AFD tal como o apresentado na Figura 2: p é o número de estados do AFD; y é a menor cadeia não nula aceita pelo sub-autômato que tem qn como estado inicial e final (veja retângulo pontilhado na Figura 2); x é a cadeia de símbolos derivada pelas transições previstas entre q0 e qn; e z é a cadeia de símbolos derivada pelas transições previstas entre qn e qm. Figura 2: AFD de referência para a questão 3.
(b) Utilize o Lema do Bombeamento para mostrar que uma das duas linguagens a seguir não é regular: L = a n! para n > 0 L = a n + b m para n, m > 0 e n m Seja P a assertiva para uma sentença w qualquer de L verifica-se o Lema do Bombeamento e Q a assertiva L é uma linguagem regular. A tabela de verificação para P Q é: P Q P Q V V V F V F F F V V F V P é condição necessária mas não suficiente para L ser regular Assim, se existir uma sentença w de L para a qual o Lema do Bombeamento não se verifique, L não é regular. Se existir, L pode ser regular ou não. No caso de L=a n!, para uma cadeia w qualquer de L, se w=xyz então xz tem de pertencer também a L (caso de zero iterações da cadeia y) e portanto xz = n!. Seja n=2 (cadeia aaaa) o xyz = 2! o xz = n! e n<2 (já que retiramos a cadeia y) Se n=1 então xz = 1! (cadeia a ) => y =2!-1!=1 Ora, iterando y duas vezes teríamos: 1!+2*1=m!=3 Se n=0 então xz = 0! (cadeia vazia) => y =0!-1!=0 Ora, esta condição viola a restrição de que y >0 Como chegamos a uma inverdade nas duas hipóteses acima, concluímos que existe pelo menos uma sentença w de L para a qual o Lema do Bombeamento não se aplica. Ou seja, L não é uma linguagem regular. Esta mesma situação ocorre com outras cadeias de L, como se vê a seguir: Seja n=3 (cadeia aaaaaaaaa) o xyz = 3! o xz = n! e n<3 (já que retiramos a cadeia y) Se n=2 então xz = 2! (aaaa) => y =3!-2!=5 Ora, iterando y duas vezes teríamos: 2!+2*5=m!=14 Se n=1 então xz = 1! (a) => y =3!-1!=8 Ora, iterando y duas vezes teríamos: 1!+2*8=m!=17 No caso de L, há duas respostas possíveis: a) apontar que o uso de + (ou) na definição da linguagem torna a ocorrência de cadeias alternativa e independente, anulando a possibilidade de haver a e b nas cadeias bem formadas. Logo a linguagem seria cabalmente regular, pois uma das alternativas sempre teria zero ocorrência daqueles símbolos. Havia um erro de impressão nesta questão que foi corrigido em sala de prova pelos professores.
b) apontar que se o + for interpretado como concatenação entre cadeias de a e b, o que daria sentido não trivial à restrição, as sentenças válidas têm cadeias de a n b m para n,m > 0 e n m. Há duas situações a examinar: ou n>m ou n<m. Se w=a n b m e n>m (i.e. há mais a do que b em w) então poderíamos: a) bombear qualquer y para w=xyz se y=aa* contanto que: o A extração de aa* (zero iterações de y) não gerasse uma cadeia que não pertence a L. Porém, isto não é possível porque: Se y=a, o lema não se aplica para a cadeia w=a n b n-1 Exemplo: w=aab ou w=aaabb ou w=aaaabbb e assim por diante Se y=aaa* e y =k, o lema não se aplica para a cadeia w=a k+n b n Exemplo: seja k=2 w=aaab ou w=aaaabb ou w=aaaaabbb e assim por diante b) bombear qualquer y para w=xyz se y=ab contanto que: o A extração de ab (zero iterações de y) não gerasse uma cadeia que não pertence a L. Porém, isto não é possível porque: Se y=ab, o lema não se aplica se m=1, pois a extração do único b da cadeia w levaria a cadeias de a, somente, que não atendem às restrições de L. c) bombear qualquer y para w=xyz se y=bb* contanto que: o A extração de bb* (zero iterações de y) não gerasse uma cadeia que não pertence a L. Porém, isto não é possível porque: Se y=b a extração de y não funcionaria para cadeias a n b m se m=1 Se y=bbb* se y =k, o lema não se aplica para cadeias do tipo w=a k+n b k Exemplo: k=1: a n>1 b; k=2: a n>2 bb; e assim por diante. Como chegamos a impossibilidades nas três hipóteses acima, concluímos que existem sentenças w de L para a qual o Lema do Bombeamento não se aplica. Ou seja, L não é uma linguagem regular. OBS: A mesma conclusão pode ser atingida explorando-se a opção de n<m, examinando-se as mesmas hipóteses.
As provas estão sendo corrigidas pelos professores e deverão ser entregues ou no dia 13 ou no dia 15 de setembro, próximos. Alunos que desejem revisão de correção devem solicitá-la por escrito, em folha contendo, para cada questão cuja correção está sendo posta em dúvida: o motivo do questionamento (i.e. uma justificativa para que seja dada à questão uma pontuação diferente da que foi dada pelos professores) anexo com a prova (tanto as folhas de enunciado, quanto as de resposta) o email institucional do aluno (i.e. no domínio puc-rio.br ; os professores não se responsabilizam pela entrega de mensagens fora deste domínio). A resposta ao pedido de revisão será encaminhada por email ao aluno. Atenção: o pedido de revisão obviamente não pode ser encaminhado por email (pois as folhas de prova têm de estar anexas).