diff options
| author | Gregor Kleen <gkleen@yggdrasil.li> | 2018-05-07 10:35:14 +0200 |
|---|---|---|
| committer | Gregor Kleen <gkleen@yggdrasil.li> | 2018-05-07 10:35:14 +0200 |
| commit | c37395089c3a5dfc32406685ac5b0102050a8aa1 (patch) | |
| tree | 173555933cc62a0b4dec6345637893f117f78bcc /edit-lens/src | |
| parent | b55258d2b5609aea500fb0b011c87e9e1585cbb0 (diff) | |
| download | incremental-dfsts-c37395089c3a5dfc32406685ac5b0102050a8aa1.tar incremental-dfsts-c37395089c3a5dfc32406685ac5b0102050a8aa1.tar.gz incremental-dfsts-c37395089c3a5dfc32406685ac5b0102050a8aa1.tar.bz2 incremental-dfsts-c37395089c3a5dfc32406685ac5b0102050a8aa1.tar.xz incremental-dfsts-c37395089c3a5dfc32406685ac5b0102050a8aa1.zip | |
Describe algorithm for `propR` of DFST-lens
Diffstat (limited to 'edit-lens/src')
| -rw-r--r-- | edit-lens/src/Data/String/DFST/Lens.lhs | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/edit-lens/src/Data/String/DFST/Lens.lhs b/edit-lens/src/Data/String/DFST/Lens.lhs index e4d9083..51ce970 100644 --- a/edit-lens/src/Data/String/DFST/Lens.lhs +++ b/edit-lens/src/Data/String/DFST/Lens.lhs | |||
| @@ -63,6 +63,24 @@ instance Module StringEdits where | |||
| 63 | go (_, []) = Nothing | 63 | go (_, []) = Nothing |
| 64 | go (n, (c:cs)) = Just ((succ n, cs), Insert n c) | 64 | go (n, (c:cs)) = Just ((succ n, cs), Insert n c) |
| 65 | 65 | ||
| 66 | \end{code} | ||
| 67 | |||
| 68 | % TODO Make notation mathy | ||
| 69 | |||
| 70 | Um zunächst eine asymmetrische edit-lens `StringEdits -> StringEdits` mit akzeptabler Komplexität für einen bestimmten `DFST s` (entlang der \emph{Richtung} des DFSTs) zu konstruieren möchten wir folgendes Verfahren anwenden: | ||
| 71 | |||
| 72 | Gegeben eine Sequenz (`StringEdits`) von zu übersetzenden Änderungen genügt es die Übersetzung eines einzelnen `StringEdit`s in eine womöglich längere Sequenz von `StringEdits` anzugeben, alle `StringEdits` aus der Sequenz zu übersetzen (hierbei muss auf die korrekte Handhabung des Komplements geachtet werden) und jene Übersetzungen dann zu concatenieren. | ||
| 73 | |||
| 74 | Wir definieren zunächst die \emph{Wirkung} eines DFST auf einen festen String als eine Abbildung `state -> (state, String)`, die den aktuellen Zustand vorm Parsen des Strings auf den Zustand danach und die (womöglich leere) Ausgabe schickt. | ||
| 75 | Diese Wirkungen bilden einen Monoiden analog zu Endomorphismen, wobei die Resultat-Strings concateniert werden. | ||
| 76 | |||
| 77 | Die Unterliegende Idee ist nun im Komplement der edit-lens eine Liste von Wirkungen (eine für jedes Zeichen der Eingabe des DFSTs) und einen Cache aller möglichen monoidalen Summen von zusammenhängenden Teilstücke zu halten. | ||
| 78 | Da wir wissen welche Stelle im input-String von einem gegebenen edit betroffen ist können wir, anhand der Wirkung des Teilstücks bis zu jener Stelle, den output-String in einen durch den edit unveränderten Prefix und einen womöglich betroffenen Suffix unterteilen. | ||
| 79 | Die Wirkung ab der betroffenen Stelle im input-String können wir also Komposition der Wirkung der durch den edit betroffenen Stelle und derer aller Zeichen danach bestimmen. | ||
| 80 | Nun gilt es nur noch die Differenz (als `StringEdits`) des vorherigen Suffixes im output-String und des aus der gerade berechneten Wirkung Bestimmten zu bestimmen. | ||
| 81 | |||
| 82 | \begin{code} | ||
| 83 | |||
| 66 | data DFSTAction state = DFSTBranch (Map state (state, String)) (DFSTAction state) (DFSTAction state) | 84 | data DFSTAction state = DFSTBranch (Map state (state, String)) (DFSTAction state) (DFSTAction state) |
| 67 | | DFSTLeaf | 85 | | DFSTLeaf |
| 68 | 86 | ||
