diff --git a/_tikz/gnfa.tex b/_tikz/gnfa.tex new file mode 100644 index 0000000..0c57073 --- /dev/null +++ b/_tikz/gnfa.tex @@ -0,0 +1,24 @@ +\documentclass[tikz,convert={outfile=\jobname.svg}]{standalone} +\usetikzlibrary{automata, arrows.meta, positioning} +\begin{document} +\begin{tikzpicture}[ + thick, + node distance={25mm}, + auto +] + +\node[state, initial, initial text = {}] (q1) {$q_1$}; +\node[state, accepting] (q3) [below=4cm, right of=q1] {$q_3$}; +\node[state, accepting] (q2) [above=4cm, right of=q3] {$q_2$}; + +\path[->] + (q1) edge [loop above] node {$a$} (q1) + (q1) edge [bend left] node {$a^{*}b^{*}$} (q2) + (q1) edge [bend right] node [swap, left=0.8cm, above] {$a\cup b$} (q3) + (q2) edge [loop right] node {$ab$} (q2) + (q2) edge [bend left] node [swap] {$b$} (q1) + (q2) edge [bend left] node [right=0.6cm, above] {$aab$} (q3) + ; + +\end{tikzpicture} +\end{document} diff --git a/_tikz/gnfa_convenient.tex b/_tikz/gnfa_convenient.tex new file mode 100644 index 0000000..cd29cd5 --- /dev/null +++ b/_tikz/gnfa_convenient.tex @@ -0,0 +1,32 @@ +\documentclass[tikz,convert={outfile=\jobname.svg}]{standalone} +\usepackage{amssymb} +\usetikzlibrary{automata, arrows.meta, positioning} +\begin{document} +\begin{tikzpicture}[ + thick, + node distance={25mm}, + auto +] + +\node[state, initial, initial text = {}] (q1) {$q_1$}; +\node[state] (qn) [right of=q1] {$q_n$}; +\node[state] (q3) [below=4cm, right of=qn] {$q_3$}; +\node[state] (q2) [above=4cm, right of=q3] {$q_2$}; +\node[state, accepting] (q4) [below=2cm, right of=q2] {$q_4$}; + +\path[->] + (q1) edge node {$\varepsilon$} (qn) + (qn) edge [loop above] node {$a$} (qn) + (qn) edge [bend left] node {$a^{*}b^{*}$} (q2) + (qn) edge [bend right] node [swap, left=0.8cm, above] {$a\cup b$} (q3) + (q2) edge [loop above] node {$ab$} (q2) + (q2) edge [bend left] node [swap] {$b$} (qn) + (q2) edge [bend left] node [right=0.6cm, above] {$aab$} (q3) + (q3) edge [] node [] {$\varnothing$} (q2) + (q3) edge [] node [swap] {$\varnothing$} (qn) + (q2) edge [bend left] node [swap] {$\varepsilon$} (q4) + (q3) edge [bend right] node [swap] {$\varepsilon$} (q4) + ; + +\end{tikzpicture} +\end{document} diff --git a/_tikz/gnfa_kstate.tex b/_tikz/gnfa_kstate.tex new file mode 100644 index 0000000..5313c00 --- /dev/null +++ b/_tikz/gnfa_kstate.tex @@ -0,0 +1,22 @@ +\documentclass[tikz,convert={outfile=\jobname.svg}]{standalone} +\usetikzlibrary{automata, arrows.meta, positioning} +\begin{document} +\begin{tikzpicture}[ + thick, + node distance={25mm}, + auto +] + +\node[state] (qi) {$q_i$}; +\node[state] (x) [above right of =qi] {$x$}; +\node[state] (qj) [below right of=x] {$q_j$}; + +\path[->] + (qi) edge [] node {$r_1$} (x) + (qi) edge [] node {$r_4$} (qj) + (x) edge [loop right] node {$r_2$} (x) + (x) edge [] node {$r_3$} (qj) + ; + +\end{tikzpicture} +\end{document} diff --git a/_tikz/gnfa_kstate_reduced.tex b/_tikz/gnfa_kstate_reduced.tex new file mode 100644 index 0000000..3eacdc0 --- /dev/null +++ b/_tikz/gnfa_kstate_reduced.tex @@ -0,0 +1,18 @@ +\documentclass[tikz,convert={outfile=\jobname.svg}]{standalone} +\usetikzlibrary{automata, arrows.meta, positioning} +\begin{document} +\begin{tikzpicture}[ + thick, + node distance={25mm}, + auto +] + +\node[state] (qi) {$q_i$}; +\node[state] (qj) [right=4cm] {$q_j$}; + +\path[->] + (qi) edge [] node {$r_1(r_2)^*r_3 \cup r_4$} (qj) + ; + +\end{tikzpicture} +\end{document} diff --git a/images/gnfa.svg b/images/gnfa.svg new file mode 100644 index 0000000..9fe868b --- /dev/null +++ b/images/gnfa.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/gnfa_convenient.svg b/images/gnfa_convenient.svg new file mode 100644 index 0000000..e0586bb --- /dev/null +++ b/images/gnfa_convenient.svg @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/gnfa_kstate.svg b/images/gnfa_kstate.svg new file mode 100644 index 0000000..de5cad4 --- /dev/null +++ b/images/gnfa_kstate.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/gnfa_kstate_reduced.svg b/images/gnfa_kstate_reduced.svg new file mode 100644 index 0000000..835698c --- /dev/null +++ b/images/gnfa_kstate_reduced.svg @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/teaching/lasalle/2024/automata.md b/teaching/lasalle/2024/automata.md index 80f5b50..867e238 100644 --- a/teaching/lasalle/2024/automata.md +++ b/teaching/lasalle/2024/automata.md @@ -86,17 +86,19 @@ lectures: - Liguagens Regulares e Autômatos Finitos lecture: true - topics: + - Conversão de automatos finitos não-determinísticos em automatos finitos determinísticos - Expressões regulares - - Lema do Bombeamento - - Solução de problemas como reconhecimento de linguagens - Especificação dos trabalhos [T1](lectures/automata/trabalho-01) e [T2](lectures/automata/trabalho-02). - lecture: true + lecture: false - topics: + - Fecho das linguagens regulares + - Lema do Bombeamento - Gramáticas Livres de Contexto - Automatos de Pilha - - Propriedades das linguagens Livres de Contexto - lecture: false + lecture: true - topics: + - Propriedades das linguagens Livres de Contexto + - Solução de problemas como reconhecimento de linguagens - Exercícios de revisão lecture: false - topics: diff --git a/teaching/lasalle/2024/lectures/automata/lecture-08.md b/teaching/lasalle/2024/lectures/automata/lecture-08.md new file mode 100644 index 0000000..87b8e2e --- /dev/null +++ b/teaching/lasalle/2024/lectures/automata/lecture-08.md @@ -0,0 +1,141 @@ +--- +section: Linguagens Formais e Autômatos +title: Linguagens Regulares e Livres de Contexto +subtitle: +layout: lecture +last_occurrence: +copy: 2024 +institution: + name: Universidade LaSalle Canoas + link: /teaching/lasalle/2024/automata +extra_styles: + - lecture +--- + +## Conversão de Autômatos Finitos em Expressões Regulares + +Na última aula vimos como transformar uma expressão regular em um automato finito, provando que as expressões regulares, no máximo, representam o mesmo tipo de linguagem reconhecida pelos automatos finitos determinísticos (as linguagens regulares). Para provar a equivalência entre os dois formalismos, é necessário que demonstremos que qualquer autômato finito determinístico possa ser transformado em uma expressão regular. + +Pra facilitar a conversão do de um automato finito em uma expressão regular vamos estudar um novo conceito, Autômato Finito Não-Determinístico Generalizado (GNFA, do inglês _Generalized Nondeterministic Finite Automaton_). + +### Autômato Finito Não-Determinístico Generalizado (GNFA) + +Um autômato Finito Não-Determinístico Generalizado é semelhante a um NFA, mas permite o uso de expressões regulares como símbolo de ativação das transições. + +![GNFA](/images/gnfa.svg) + +A diferença na computação de um GNFA é que ao invés de ler um único símbolo, a transição irá consumir toda uma string. + +A aceitação ou rejeição de uma entrada é a mesma do NFA, se houver qualquer caminho que, ao final da entrada, levar a um estado de aceitação, a entrada será aceita, caso contrário, ela será rejeitada. + +Por conveniência, vamos assumir uma forma especial do GNFA, onde: +* Existe apenas um estado de aceitação, separado do estado inicial. + +![GNFA Conveniente](/images/gnfa_convenient.svg){:style="min-width:55ch !important;"} + +* Devem existir transições de entrada e saída entre todos os estados do autômato: + * o estado inicial só possui transições de saída. + * o estado final só possui transições de entrada. + + + + +## Prova da conversão GNFA em Expressões regulares + +**Lema:** Todo GNFA $G$ tem uma expressão regular $R$ equivalente. + +**Prova:** Por indução do número de estados $k$ de $G$. +* Base: $k = 2 : G = \rightarrow\bigcirc\overset{r}{\rightarrow}\bigodot$ + * Lembre-se que $G$ está na forma especial + * $R = r$ +* Passo de Indução ($k > 2$) + * Assumimos que o lema é verdade para $k-1$ estados e provar para $k$ estados. + * _Ideia_: Converter o GNFA de $k$ estados para o GFNA com $k-1$ estados. + * Escolher um estado qualquer $x$ que não seja o estado inicial ou o estado final. + * Remover o estado $x$. + * reconstruir todos os caminhos que passavam por $x$ + * Faço o mesmo para todo par de estados $q_i, q_j$ + +![GNFA with k states](/images/gnfa_kstate.svg){:style="margin: 0px; display:inline; max-width: 6ch !important; max-height: 15ch !important;"} +![GNFA with k states](/images/gnfa_kstate_reduced.svg){:style="margin: spx; display:inline; max-height: 7ch !important; min-height: 3ch !important;"} +{:style="text-align:center"} + + + +## Lema do Bombeamento + +Para mastrar que uma linguagem é uma linguagem regular, é preciso contruir um DFA, ou criar a liguagem por indução utilizando os fechos de linguagens regulares. + +Para mostrar que uma linguagem não é regular é preciso mostrar uma prova, e não é possível dizer que não existe um DFA para ela, pois isso não é uma prova. + +Dado o alfabeto $\Sigma = \\{0, 1\\}$: +* Seja $B = \\{w \| w\; \text{tem um numero igual de 0s e 1s}\\}$ + * Intuição: $B$ não é regular porque DFAs não podem contar infinitamente. + +* Seja $C = \\{w \| w\; \text{tem um numero igual de substrings 01 e 10}\\}$ + * $0101 \notin C$ + * $0110 \in C$ + * Intuição: $C$ não é regular porque DFAs não podem contar infinitamente. + * Na realidade, $C$ é regular. + * Regex: 00*(1*00*)* | 11*(0*11*)* + +**Lema do Bombeamento**: Para toda linguagem regular $A$, existe um número $p$ (o _tamanho do bombeamento_), de tal modo que se $s \in A$ e $\|s\| \ge p$ então $s = xyz$ onde: +* $xy^{i}z \in A \forall{i} \ge 0 \quad \quad \quad y^i = \underbrace{yyy\cdots{y}}\_{i}$ +* $y\ne\varepsilon$ +* $\|xy\|\le{p}$ + +**Informalmente**: $A$ é regular se cada cadeia longa em $A$ pode ser bombeada e o resultado continua em $A$. + +**Prova**: Seja $M$ um DFA que reconhece $A$, seja $p$ o número de estados em $M$, escolha $s \in A$ onde $\|s\| \ge p$ +* $M$ vai, obrigatoriamente repetir um estado $q_j$ quando avaliar $s$, porque $s$ é muito longa. +* Logo, $xyyz$ também é aceita. + +### Aplicação do Lema do Bombeamento + +Seja $D = \\{0^k1^k \| k\ge{0}\\}$, demonstraremos que D não é regular por uma prova por contradição. +* Assumimos que $D$ é regular, logo podemos aplicar o lema do bombeamento. +* Pelo lema do bombeamento, dizemos que $s = 0^p1^p \in D$ +* Podemos, então, divivir a cadeia, tal que $s = xyz$ satisfazendo as três condições. +* Se cortarmos de forma que $\|xy\| \le p$, ao criar $xyyz$, haverá um número excessivo de $0$, logo $xyyz \notin D$. +* Como esse resultado contradiz o que assumimos (que $D$ é regular), temos que assumir que $D$ não é regular. + +Seja $E = \\{ww \| w \in \Sigma^\*\\}$, demonstraremos que D não é regular por uma prova por contradição. +* Assumimos que $F$ é regular, logo podemos aplicar o lema do bombeamento. +* Pelo lema do bombeamento, dizemos que $s = 0^p0^p \in D$ + * Se escolhermos $y = 00$, a palavra $xyyz$ ainda estará em $E$, porém isso não prova que $E$ é regular. +* Escolhemos então, uma outra _string_ $s = 0^p10^p1 \in D$ +* Podemos, então, divivir a cadeia, tal que $s = xyz$ satisfazendo as três condições. +* Se cortarmos de forma que $\|xy\| \lt p-1$, ao criar $xyyz$, haverá um número excessivo de $0$, logo $xyyz \notin E$. +* Como esse resultado contradiz o que assumimos (que $D$ é regular), temos que assumir que $D$ não é regular. + + +Voltamos agora a linguagem $B = \\{w \| w\; \text{tem um numero igual de 0s e 1s}\\}$: +* Vamos assumir, para provar por contradição, que $B$ é regular. +* Sabemos que $0^\*1^\*$ é regular, logo, $B \cap 0^\*1^\*$ é regular (fechada para intersecção das linguagens regulares). +* Como $D = B \cap 0^\*1\*$ e já mostramos que $D$ não é regular, chegamos a uma contradição! +* Logo $B$ não pode ser regular! + +