diff options
author | Gregor Kleen <gkleen@yggdrasil.li> | 2019-05-30 12:18:08 +0200 |
---|---|---|
committer | Gregor Kleen <gkleen@yggdrasil.li> | 2019-05-30 12:18:08 +0200 |
commit | f4c419b9ddec15bad267a4463f0720d6e28042d2 (patch) | |
tree | 54a0259116476150247619c4410eae33f8669314 /presentation.tex | |
parent | 8afbe1f7df24034dd16fdf2e89b0665b2318ae2a (diff) | |
download | incremental-dfsts-f4c419b9ddec15bad267a4463f0720d6e28042d2.tar incremental-dfsts-f4c419b9ddec15bad267a4463f0720d6e28042d2.tar.gz incremental-dfsts-f4c419b9ddec15bad267a4463f0720d6e28042d2.tar.bz2 incremental-dfsts-f4c419b9ddec15bad267a4463f0720d6e28042d2.tar.xz incremental-dfsts-f4c419b9ddec15bad267a4463f0720d6e28042d2.zip |
Further work
Diffstat (limited to 'presentation.tex')
-rw-r--r-- | presentation.tex | 351 |
1 files changed, 351 insertions, 0 deletions
diff --git a/presentation.tex b/presentation.tex new file mode 100644 index 0000000..3eddd70 --- /dev/null +++ b/presentation.tex | |||
@@ -0,0 +1,351 @@ | |||
1 | \section{Einführung} | ||
2 | |||
3 | \begin{frame} | ||
4 | \frametitle{Tl;dr} | ||
5 | |||
6 | \begin{itemize} | ||
7 | \item Inkrementelle Parser agieren auf \emph{edits} von Ein- und Ausgaben | ||
8 | \item Edit-Lenses sind algebraische Struktur für deartige Programme | ||
9 | \item DFSTs sind spezielle Parser, schwach genug um immer auch inkrementell zu sein | ||
10 | \item Darstellung von DFSTs als edit-lenses als Proof of Concept | ||
11 | \end{itemize} | ||
12 | \end{frame} | ||
13 | |||
14 | \begin{frame} | ||
15 | \frametitle{Struktur} | ||
16 | \begin{enumerate} | ||
17 | \item Begriffe/Definitionen | ||
18 | \begin{itemize} | ||
19 | \item Parser, Inkrementelle Parser | ||
20 | \item Funktionale Linsen, edit-lenses | ||
21 | \end{itemize} | ||
22 | \item Motivation | ||
23 | \item Inhalt der Arbeit | ||
24 | \begin{itemize} | ||
25 | \item Inkrementelle Parser als edit-lenses für DFSTs | ||
26 | \end{itemize} | ||
27 | \item Demonstration | ||
28 | \begin{itemize} | ||
29 | \item Interaktiver Editor unter einer edit-lens | ||
30 | \end{itemize} | ||
31 | \item Skizze des Verfahrens aus der Arbeit | ||
32 | \begin{itemize} | ||
33 | \item Komplement-Konstruktion für DFSTs | ||
34 | \item $\Rrightarrow$ und $\Lleftarrow$ | ||
35 | \end{itemize} | ||
36 | \item Weiterführendes | ||
37 | \end{enumerate} | ||
38 | \end{frame} | ||
39 | |||
40 | \begin{frame} | ||
41 | \frametitle{Inkrementelle Parser} | ||
42 | |||
43 | \begin{defn}[Parser] | ||
44 | Jedes Programm vom Typ $\Sigma^\star \to a$ | ||
45 | \note[item]{Programme, die Strings analysieren und eine Struktur produzieren} | ||
46 | \end{defn} | ||
47 | |||
48 | \begin{defn}[Inkrementelle Parser] | ||
49 | Vermeiden komplette Re-analyse bekannter Eingabe-Texte | ||
50 | |||
51 | Für unsere Zwecke\footnote{Mit $\delta(x)$ immer einer geeigneten Sprache von edits über $x$}: | ||
52 | \[ | ||
53 | \delta ( \Sigma^\star ) \to \delta ( a ) | ||
54 | \] | ||
55 | \end{defn} | ||
56 | \end{frame} | ||
57 | |||
58 | \begin{frame} | ||
59 | \begin{defn}[Funktionale Linsen] | ||
60 | Eine Linse auf ein $a$ \emph{innerhalb} eines größeren $s$: | ||
61 | \begin{align*} | ||
62 | G & \colon s \to a \\ | ||
63 | P & \colon (a \to a) \to (s \to s) | ||
64 | \end{align*} | ||
65 | \note[item]{Zum Verständnis: nimm $s$ als Klasse/Struct und $a$ als Attribut davon} | ||
66 | \begin{itemize} | ||
67 | \item Bidirektional | ||
68 | \item \emph{fokussiert} Teil der großen Struktur $s$ | ||
69 | \item Projektion und Update-Propagator | ||
70 | \item $P$ und $G$ sind \emph{well-behaved} | ||
71 | \end{itemize} | ||
72 | \end{defn} | ||
73 | \end{frame} | ||
74 | |||
75 | \begin{frame} | ||
76 | \begin{defn}[edit-lenses] | ||
77 | \begin{align*} | ||
78 | \Rrightarrow & \colon \delta(s) \times C \to \delta(a) \times C \\ | ||
79 | \Lleftarrow & \colon \delta(a) \times C \to \delta(s) \times C | ||
80 | \end{align*} | ||
81 | Mit $C$ dem \emph{Komplement}\footnote{\emph{View-Update-Problem} für DBS}, die zusätzlich zu den Edits $\delta(s)$, bzw. $\delta(a)$ notwendige Information um neues $a$ bzw. $s$ zu konstruieren | ||
82 | \begin{itemize} | ||
83 | \item Bidirektional | ||
84 | \item Edit-Propagatoren in beide Richtungen | ||
85 | \item Edits haben \emph{Algebraische Struktur} | ||
86 | \item $\Rrightarrow$ und $\Lleftarrow$ sind \emph{well-behaved} | ||
87 | \end{itemize} | ||
88 | \note[item]{$\delta(s)$ ist Speziallfall von $s \to s$} | ||
89 | \end{defn} | ||
90 | \end{frame} | ||
91 | |||
92 | \begin{frame}[fragile] | ||
93 | |||
94 | \frametitle{Edit-Konversationen} | ||
95 | \framesubtitle{Vereinfacht, ohne Komplement} | ||
96 | |||
97 | \begin{figure} | ||
98 | \centering | ||
99 | \pinclude{presentation/editconv.tex} | ||
100 | \end{figure} | ||
101 | |||
102 | \end{frame} | ||
103 | |||
104 | \begin{frame} | ||
105 | \frametitle{FSTs} | ||
106 | |||
107 | \begin{defn}[Finite state transducer] | ||
108 | Endliche Automaten mit Ausgabe-Symbolen an Zustansübergängen annotiert. | ||
109 | \note[item]{\emph{Determinismus} analog zu DFAs} | ||
110 | \end{defn} | ||
111 | |||
112 | %% \begin{eg} | ||
113 | %% \centering | ||
114 | %% \begin{tikzpicture}[->,auto,node distance=2.5cm] | ||
115 | %% \node[initial,state] (0) {$A$}; | ||
116 | %% \node[state,accepting] (1) [right of=0] {$B$}; | ||
117 | %% \node[state,initial,accepting,initial where=right] (2) [right of=1] {$C$}; | ||
118 | |||
119 | %% \path (0) edge [loop above] node {$(a, x)$} (0) | ||
120 | %% (0) edge node {$(a, y)$} (1) | ||
121 | %% (1) edge [bend left=20] node [above] {$(a, z)$} (2) | ||
122 | %% (1) edge [bend right=20] node [below] {$(b, z)$} (2) | ||
123 | %% (2) edge [loop above] node {$(\epsilon, z)$} (2); | ||
124 | %% \end{tikzpicture} | ||
125 | %% \note[item]{Beispiel ist \emph{nicht} deterministisch} | ||
126 | %% \note[item]{Beispiel hat zwei initiale Zustände} | ||
127 | %% \note[item]{Beispiel hat zwei akzeptierende Zustände} | ||
128 | %% \note[item]{$a^{+}(a \mid b)^{?} \to x^{n}(yz^{+})^{?} \mid z^\star$} | ||
129 | %% %% \begin{tikzpicture}[->,auto,node distance=2.5cm] | ||
130 | %% %% \node[initial,state] (0) {$A$}; | ||
131 | %% %% \node[state,accepting] (1) [right of=0] {$B$}; | ||
132 | %% %% \node[state,accepting] (2) [right of=1] {$C$}; | ||
133 | |||
134 | %% %% \path (0) edge node {$(a, y)$} (1) | ||
135 | %% %% (1) edge [bend left=20] node [above] {$(a, z)$} (2) | ||
136 | %% %% (1) edge [bend right=20] node [below] {$(b, z)$} (2); | ||
137 | %% %% \end{tikzpicture} | ||
138 | %% \end{eg} | ||
139 | %% \end{frame} | ||
140 | |||
141 | %% \begin{frame} | ||
142 | %% \frametitle{Beispiel-DFST} | ||
143 | |||
144 | \begin{figure} | ||
145 | \centering | ||
146 | \pinclude{presentation/switchdfst.tex} | ||
147 | \end{figure} | ||
148 | \end{frame} | ||
149 | |||
150 | \section{Motivation} | ||
151 | |||
152 | \begin{frame} | ||
153 | \frametitle{Motivation} | ||
154 | |||
155 | \begin{itemize} | ||
156 | \item edit-lenses (und unterliegende edits) haben umfangreiche algebraische Struktur | ||
157 | \item Inkrementelle Parser haben praktische Vorteile, wo anwendbar | ||
158 | \item Darstellung von inkrementellen Parsern als edit-lenses erlaubt Kompositions-basierte Konstruktion von Parsern | ||
159 | \end{itemize} | ||
160 | |||
161 | \begin{eg} | ||
162 | \begin{itemize} | ||
163 | \item Interaktive Programmierumgebung kann \emph{sofort} Feedback geben (Semantisches autocomplete, syntax highlighting, ...) | ||
164 | \item Grafische Konfigurations-Ansichten für unterliegende Konfigurationsdateien können Formatierung (z.B. Kommentare) erhalten | ||
165 | \end{itemize} | ||
166 | \end{eg} | ||
167 | \end{frame} | ||
168 | |||
169 | \section{Inhalt der Arbeit} | ||
170 | |||
171 | \begin{frame} | ||
172 | \frametitle{Inhalt} | ||
173 | |||
174 | \begin{itemize} | ||
175 | \item edits, edit-lenses, und FSTs in Haskell | ||
176 | \item Verfahren zum automatischen Ableiten von edit-lenses aus DFSTs | ||
177 | \item Interaktiver editor für beliebige edit-lenses zwischen Strings | ||
178 | \end{itemize} | ||
179 | \end{frame} | ||
180 | |||
181 | \section{Demonstration} | ||
182 | |||
183 | \begin{frame} | ||
184 | \frametitle{JSON-Normalisierer} | ||
185 | \framesubtitle{Demonstration} | ||
186 | |||
187 | \begin{itemize} | ||
188 | \item JSON-Normalisierung ausgedrückt als DFST | ||
189 | \item edit-lens aus DFST abgeleitet | ||
190 | \item Interaktiver editor akzeptiert edits auf einer Seite und propagiert in Gegenrichtung | ||
191 | \end{itemize} | ||
192 | \end{frame} | ||
193 | |||
194 | \section{Edit-lenses für DFSTs} | ||
195 | |||
196 | \begin{frame} | ||
197 | \frametitle{Ansatz} | ||
198 | |||
199 | Als \emph{Komplement} genug Information um für jedes Intervall im Eingabe-String berechnen zu können: | ||
200 | |||
201 | \begin{itemize} | ||
202 | \item Gegeben einen Zustand auf der linken Seite des Intervalls, welche Ausgabe wird produziert und welcher Zustand wird auf der rechten Seite erreicht? | ||
203 | |||
204 | \[ \text{state} \to \text{outChar}^\star \times (\text{state} \cup \{ \bot \}) \] | ||
205 | |||
206 | \emph{Ausgabe-Wirkung} des FST | ||
207 | \item Welche Eingabe wurde im Intervall konsumiert? | ||
208 | \end{itemize} | ||
209 | |||
210 | Gegeben einen edit: | ||
211 | |||
212 | \begin{enumerate} | ||
213 | \item Intervall in Ausgabe/Eingabe bestimmen, die von edit betroffen ist | ||
214 | \item Betroffenes Teilstück des Komplements austauschen | ||
215 | \item Übertragenen edit Anhand von Differenz der Komplement-Stücke bestimmen | ||
216 | \end{enumerate} | ||
217 | \end{frame} | ||
218 | |||
219 | \begin{frame} | ||
220 | \frametitle{Composition-Trees} | ||
221 | \framesubtitle{Effiziente Berechnung von Wirkungen beliebiger Eingabe-Intervalle} | ||
222 | |||
223 | \begin{columns}[c] | ||
224 | \column{.5\textwidth} | ||
225 | \begin{center} | ||
226 | \scalebox{1}{\pinclude{presentation/switchdfst.tex}} | ||
227 | \end{center} | ||
228 | \column{.5\textwidth} | ||
229 | \begin{center} | ||
230 | \scalebox{0.65}{\pinclude{presentation/comptree.tex}} | ||
231 | \end{center} | ||
232 | \end{columns} | ||
233 | \end{frame} | ||
234 | |||
235 | \begin{frame} | ||
236 | \frametitle{$\Rrightarrow$} | ||
237 | |||
238 | \begin{align*} | ||
239 | \Rrightarrow & \colon \delta ( \text{inChar}^\star ) \times C \to \delta ( \text{outChar}^\star ) \times C \\ | ||
240 | C & \colon \left ( \text{outChar}^\star \times (\text{state} \cup \{ \bot \}), \text{inChar}^\star \right ) | ||
241 | \end{align*} | ||
242 | |||
243 | \begin{enumerate} | ||
244 | \item Bestimme Intervall in $\text{inChar}^\star$ betroffen von edit und asoziiertes Stück $c \subseteq C$ | ||
245 | \item Lese in $C$ betroffenes Intervall in $\text{outChar}^\star$ ab | ||
246 | \item Berechne neues Stück $c^\prime$ durch Auswertung des DFST | ||
247 | \item Bestimme $\delta (\text{outChar}^\star)$ mit Standard-Diff auf $\text{inChar}^\star$-Komponenten von $c$ und $c^\prime$ | ||
248 | \item Ersetze $c$ in $C$ mit $c^\prime$ | ||
249 | \end{enumerate} | ||
250 | \end{frame} | ||
251 | |||
252 | \begin{frame} | ||
253 | \frametitle{$\Rrightarrow$} | ||
254 | \framesubtitle{Beispiel} | ||
255 | |||
256 | \begin{columns}[c] | ||
257 | \column{.33\textwidth} | ||
258 | \begin{enumerate} | ||
259 | \item Intervall im Eingabetext | ||
260 | \item Ausgabe-Stück aus Komplement | ||
261 | \item Neues Komplement-Stück durch Auswertung | ||
262 | \item Komplement-Stück ersetzen | ||
263 | \item Ausgabe-Differenz aus Komplement-Stücken | ||
264 | \end{enumerate} | ||
265 | \column{.33\textwidth} | ||
266 | \begin{center} | ||
267 | \scalebox{1}{\pinclude{presentation/switchdfst.tex}} | ||
268 | \end{center} | ||
269 | \column{.33\textwidth} | ||
270 | \begin{center} | ||
271 | \scalebox{0.6}{\pinclude{presentation/comptree.tex}} | ||
272 | \end{center} | ||
273 | \end{columns} | ||
274 | \end{frame} | ||
275 | |||
276 | \begin{frame} | ||
277 | \frametitle{$\Lleftarrow$} | ||
278 | |||
279 | \begin{align*} | ||
280 | \Lleftarrow & \colon \delta ( \text{outChar}^\star ) \times C \to \delta ( \text{inChar}^\star ) \times C \\ | ||
281 | C & \colon \left ( \text{outChar}^\star \times (\text{state} \cup \{ \bot \}), \text{inChar}^\star \right ) | ||
282 | \end{align*} | ||
283 | |||
284 | \begin{enumerate} | ||
285 | \item Bestimme Intervall in $\text{outChar}^\star$ betroffen von edit und asoziiertes Stück $c \subseteq C$ | ||
286 | \item Bestimme neue Ausgabe durch Anwenden von $\delta ( \text{outChar}^\star )$ | ||
287 | \item Finde, durch Breitensuche, Lauf in DFST mit passender Ausgabe und selben Grenzen wie $c$ | ||
288 | \item Lese $c^\prime$ aus neuem Lauf ab | ||
289 | \item Bestimme $\delta ( \text{inChar}^\star )$ mit Standard-Diff | ||
290 | \item Ersetze $c$ in $C$ mit $c^\prime$ | ||
291 | \end{enumerate} | ||
292 | \end{frame} | ||
293 | |||
294 | \begin{frame} | ||
295 | \frametitle{$\Lleftarrow$} | ||
296 | \framesubtitle{Beispiel} | ||
297 | |||
298 | \begin{columns}[c] | ||
299 | \column{.33\textwidth} | ||
300 | \begin{enumerate} | ||
301 | \item Intervall im Ausgabetext | ||
302 | \item Neue Ausgabe für Intervall | ||
303 | \item Breitensuche nach neuem Lauf-Stück | ||
304 | \item Neues Komplement-Stück | ||
305 | \item Komplement-Stück ersetzen | ||
306 | \item Eingabe-Differenz aus Komplement-Stücken | ||
307 | \end{enumerate} | ||
308 | \column{.33\textwidth} | ||
309 | \begin{center} | ||
310 | \scalebox{1}{\pinclude{presentation/switchdfst.tex}} | ||
311 | \end{center} | ||
312 | \column{.33\textwidth} | ||
313 | \begin{center} | ||
314 | \scalebox{0.6}{\pinclude{presentation/comptree.tex}} | ||
315 | \end{center} | ||
316 | \end{columns} | ||
317 | \end{frame} | ||
318 | |||
319 | \section{Resultate} | ||
320 | |||
321 | \begin{frame} | ||
322 | \frametitle{Ergebnisse} | ||
323 | |||
324 | \begin{itemize} | ||
325 | \item Verfahren zum automatischen Ableiten von inkrementellen Parsern zu DFSTs | ||
326 | \item Inkl. Darstellung als edit-lens | ||
327 | \item Interaktive Demonstration von edit-lenses | ||
328 | \end{itemize} | ||
329 | \end{frame} | ||
330 | |||
331 | \begin{frame} | ||
332 | \frametitle{Implementierung} | ||
333 | \begin{itemize} | ||
334 | \item Diverse erfolglose Ansätze zur Implementierung von $\Lleftarrow$ | ||
335 | \item Erfolgreiche Implementierung dann mit algebraischen FST-Transformationen und als Komposition kleiner Typ-gesteuerter und generischer Teile | ||
336 | \note[item]{Demonstriert Erfolg von algebraischer Programmierung: nicht optimale, aber ähnliche, Komplexitätsklasse und dafür leichter verständlich} | ||
337 | \item Demonstriert Kodierung von algorithmischen Voraussetzungen in Typen (z.B. Determinismus von FST) | ||
338 | \note[item]{Korrekte Kodierung in Typen erlaubt auslassen von wenig interessanten Spezialfällen} | ||
339 | \end{itemize} | ||
340 | \end{frame} | ||
341 | |||
342 | \begin{frame} | ||
343 | \frametitle{Weiterführendes} | ||
344 | \begin{itemize} | ||
345 | \item Analoges Verfahren für FSTs auch möglich; $\Lleftarrow$ und $\Rrightarrow$ dann symmetrisch und analog zum DFST-Fall von $\Lleftarrow$ | ||
346 | \item Edit-Lenses sind nicht kompatibel mit bestehenden Lens-Frameworks (in Haskell), da kodierung der Update-Propagatoren nicht kompatibel mit algebraischer Struktur der Edits | ||
347 | \item Linsen bilden große Familie von funktionalen, bidirektionalen Programmen z.B. | ||
348 | Imperative accessors für rein-funktionale Datenstrukturen und nützliche Verallgemeinerungen | ||
349 | \item Inkrementelle Parser und assoziierte Algorithmen (gewöhnlich basierend auf formalen Grammatiken) sind bekannt seit den 70er-Jahren; neue Darstellungen mit algebraischer Struktur fassen besser die \emph{mostly-incremental}-Struktur der meisten Programmiersprachen | ||
350 | \end{itemize} | ||
351 | \end{frame} | ||