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!
+
+