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