A Hierarquia de Chomsky é uma forma de classificar tipos de linguagens, proposta originalmente por Noam Chomsky. Esta classificação tem sido utilizada em áreas como linguística, ciência da computação e teoria de lingagens formais.
Uma gramática formal descreve como criar palavras, a partir de um alfabeto, que são válidas de acordo com as regras sitáticas da linguagem. A hierarquia de Chomsky contém quatra classes de linguagens de complexidade crescente, onde cada classe mais complexa consegue gerar as linguagens mais simples.
A classe de linguagens mais simples da hierarquia de Chomsky é a clase das linguagens regulares.
A gramática de uma liguagem regular é limitada a um único símbolo não terminal à esquerda, e um símbolo terminal, possivelmente seguido de um símbolo não terminal a direita:
\[\begin{align} & S \rightarrow aS \\ & S \rightarrow a \end{align}\]Podemos definir formalmente uma linguagem regular sobre um alfabeto $\Sigma$ de forma recursiva:
Teorema: Toda linguagem regular pode ser reconhecida por uma automato finito determinístico.
Ao longo do texto provaremos essas afirmações.
Vimos a definição de autômatos finitos determinísticos na última aula.
É importante frisar que a relação de transição $\delta: Q\times\Sigma\rightarrow{Q}$ retorna um único estado possível. É essa característica que determina que o autômato finito tenha um comportamento determinístico, pois dado um estado $q \in Q$ e um símbolo $\alpha \in \Sigma$, só existe, no máximo, um estado $q^\prime \in Q$ que é resultado dessa relação.
Um autômato finito determinístico pode decidir (reconhecer) se uma palavra pertence a lingugem que ele define se, iniciando no estado $q_0$, e trocando de estado pela aplicação da relação de transição para cada símbolo da entrada, na ordem e m que se apresentam, o estado resultante seja $q_n \in F$ (onde $F$ é o conjunto de estados finais ou de aceitação).
Ao contrário da computação determinística, onde sabemos qual o estado a máquina assume dado o estado atual um símbolo de entrada, em uma máquina não-determinística várias escolhas podem existir para o próximo estado em qualquer ponto.
Para simular um autômato finito não-determinístico, podemos utilizar técnicas de backtraking ou execução concorrente, onde cada caminho possível é executado em paralelo.
Um automato finito não-determinístico reconhece uma palavra se qualquer caminho executado terminar em um estado de aceitação.
Un NFA pode ter, em um mesmo estado, várias transições com o mesmo símbolo, para outros estados. Pode também ter transições envolvendo a palavra vazia.
Formalmente, um autômato finito não-determinístico é definido como uma 5-upla $(Q, \Sigma, \delta, q_0, F)$, onde:
Note que a diferença de um NFA para um DFA é a definição da relação de transição ($\delta), pois agora o resultado dessa relação é um conjunto de estados em $Q$.
Apesar do poder de representação de um NFA ser maior que de um DFA, o poder computacional das máquinas criadas com eles é o mesmo, ou seja, qualquer linguagem reconhecida por um NFA pode ser reconhecida por um DFA.
Teorema: Todo autômato finito não-determinístico possui um autômato finito determinístico equivalente.
NOTA: O fecho de uma operação significa que a aplicação desta operação sobre um ou mais elementos de um conjunto resulta em um elemento do mesmo conjunto.
Teorema: A classe das linguagens regulares é fechada sob a operação de união.
Teorema: A classe das linguagens regulares é fechada sob a operação de concatenação.
Teorema: A classe das linguagens regulares é fechada sob o fecho de Kleene.
(origem, símbolo, destino)
(palavra, resultado)
, onde resultado
poder ser um valor do conjunto $\{\text{ACEITA}, \text{REJEITA}, \text{INVALIDA}\}$