384
+ − 1
%
+ − 2
\begin{isabellebody}%
+ − 3
\setisabellecontext{Paper}%
+ − 4
%
+ − 5
\isadelimtheory
+ − 6
%
+ − 7
\endisadelimtheory
+ − 8
%
+ − 9
\isatagtheory
+ − 10
%
+ − 11
\endisatagtheory
+ − 12
{\isafoldtheory}%
+ − 13
%
+ − 14
\isadelimtheory
+ − 15
%
+ − 16
\endisadelimtheory
+ − 17
%
+ − 18
\isadelimproof
+ − 19
%
+ − 20
\endisadelimproof
+ − 21
%
+ − 22
\isatagproof
+ − 23
%
+ − 24
\endisatagproof
+ − 25
{\isafoldproof}%
+ − 26
%
+ − 27
\isadelimproof
+ − 28
%
+ − 29
\endisadelimproof
+ − 30
%
+ − 31
\isadelimproof
+ − 32
%
+ − 33
\endisadelimproof
+ − 34
%
+ − 35
\isatagproof
+ − 36
%
+ − 37
\endisatagproof
+ − 38
{\isafoldproof}%
+ − 39
%
+ − 40
\isadelimproof
+ − 41
%
+ − 42
\endisadelimproof
+ − 43
%
+ − 44
\isadelimdocument
+ − 45
%
+ − 46
\endisadelimdocument
+ − 47
%
+ − 48
\isatagdocument
+ − 49
%
+ − 50
\isamarkupsection{Core of the proof%
+ − 51
}
+ − 52
\isamarkuptrue%
+ − 53
%
+ − 54
\endisatagdocument
+ − 55
{\isafolddocument}%
+ − 56
%
+ − 57
\isadelimdocument
+ − 58
%
+ − 59
\endisadelimdocument
+ − 60
%
+ − 61
\begin{isamarkuptext}%
+ − 62
This paper builds on previous work by Ausaf and Urban using
+ − 63
regular expression'd bit-coded derivatives to do lexing that
+ − 64
is both fast and satisfies the POSIX specification.
+ − 65
In their work, a bit-coded algorithm introduced by Sulzmann and Lu
+ − 66
was formally verified in Isabelle, by a very clever use of
+ − 67
flex function and retrieve to carefully mimic the way a value is
+ − 68
built up by the injection funciton.
+ − 69
+ − 70
In the previous work, Ausaf and Urban established the below equality:
+ − 71
\begin{lemma}
+ − 72
\isa{{\normalsize{}If\,}\ v\ {\isacharcolon}{\kern0pt}\ r{\isacharbackslash}{\kern0pt}s\ {\normalsize \,then\,}\ Some\ {\isacharparenleft}{\kern0pt}flex\ r\ id\ s\ v{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ decode\ {\isacharparenleft}{\kern0pt}retrieve\ {\isacharparenleft}{\kern0pt}r\mbox{$^\uparrow$}\mbox{$\bbslash$}s{\isacharparenright}{\kern0pt}\ v{\isacharparenright}{\kern0pt}\ r{\isachardot}{\kern0pt}}
+ − 73
\end{lemma}
+ − 74
+ − 75
This lemma establishes a link with the lexer without bit-codes.
+ − 76
+ − 77
With it we get the correctness of bit-coded algorithm.
+ − 78
\begin{lemma}
+ − 79
\isa{lexer\mbox{$_b$}\ r\ s\ {\isacharequal}{\kern0pt}\ lexer\ r\ s}
+ − 80
\end{lemma}
+ − 81
+ − 82
However what is not certain is whether we can add simplification
+ − 83
to the bit-coded algorithm, without breaking the correct lexing output.
+ − 84
+ − 85
+ − 86
The reason that we do need to add a simplification phase
+ − 87
after each derivative step of $\textit{blexer}$ is
+ − 88
because it produces intermediate
+ − 89
regular expressions that can grow exponentially.
+ − 90
For example, the regular expression $(a+aa)^*$ after taking
+ − 91
derivative against just 10 $a$s will have size 8192.
+ − 92
+ − 93
%TODO: add figure for this?
+ − 94
+ − 95
+ − 96
Therefore, we insert a simplification phase
+ − 97
after each derivation step, as defined below:
+ − 98
\begin{lemma}
+ − 99
\isa{blexer{\isacharunderscore}{\kern0pt}simp\ r\ s\ {\isasymequiv}\ \textrm{if}\ nullable\mbox{$_b$}\ {\isacharparenleft}{\kern0pt}bders{\isacharunderscore}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}r\mbox{$^\uparrow$}{\isacharparenright}{\kern0pt}\ s{\isacharparenright}{\kern0pt}\ \textrm{then}\ decode\ {\isacharparenleft}{\kern0pt}mkeps\mbox{$_b$}\ {\isacharparenleft}{\kern0pt}bders{\isacharunderscore}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}r\mbox{$^\uparrow$}{\isacharparenright}{\kern0pt}\ s{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ r\ \textrm{else}\ None}
+ − 100
\end{lemma}
+ − 101
+ − 102
The simplification function is given as follows:
+ − 103
+ − 104
\begin{center}
+ − 105
\begin{tabular}{lcl}
+ − 106
\isa{bsimp\ {\isacharparenleft}{\kern0pt}ASEQ\ bs\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{bsimp{\isacharunderscore}{\kern0pt}ASEQ\ bs\ {\isacharparenleft}{\kern0pt}bsimp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}bsimp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 107
\isa{bsimp\ {\isacharparenleft}{\kern0pt}AALTs\ bs{\isadigit{1}}{\isachardot}{\kern0pt}{\isadigit{0}}\ rs{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{bsimp{\isacharunderscore}{\kern0pt}AALTs\ bs{\isadigit{1}}{\isachardot}{\kern0pt}{\isadigit{0}}\ {\isacharparenleft}{\kern0pt}distinctBy\ {\isacharparenleft}{\kern0pt}flts\ {\isacharparenleft}{\kern0pt}map\ bsimp\ rs{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ erase\ {\isasymemptyset}{\isacharparenright}{\kern0pt}}\\
+ − 108
\isa{bsimp\ AZERO} & $\dn$ & \isa{AZERO}\\
+ − 109
+ − 110
\end{tabular}
+ − 111
\end{center}
+ − 112
+ − 113
And the two helper functions are:
+ − 114
\begin{center}
+ − 115
\begin{tabular}{lcl}
+ − 116
\isa{bsimp{\isacharunderscore}{\kern0pt}AALTs\ bs\isactrlsub {\isadigit{1}}\ {\isacharbrackleft}{\kern0pt}r{\isacharbrackright}{\kern0pt}} & $\dn$ & \isa{bsimp{\isacharunderscore}{\kern0pt}ASEQ\ bs\isactrlsub {\isadigit{1}}\ {\isacharparenleft}{\kern0pt}bsimp\ r{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}bsimp\ r{\isadigit{2}}{\isachardot}{\kern0pt}{\isadigit{0}}{\isacharparenright}{\kern0pt}}\\
+ − 117
\isa{bsimp{\isacharunderscore}{\kern0pt}AALTs\ bs{\isadigit{1}}{\isachardot}{\kern0pt}{\isadigit{0}}\ {\isacharbrackleft}{\kern0pt}r{\isacharbrackright}{\kern0pt}} & $\dn$ & \isa{bsimp{\isacharunderscore}{\kern0pt}AALTs\ bs{\isadigit{1}}{\isachardot}{\kern0pt}{\isadigit{0}}\ {\isacharparenleft}{\kern0pt}distinctBy\ {\isacharparenleft}{\kern0pt}flts\ {\isacharparenleft}{\kern0pt}map\ bsimp\ rs{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ erase\ {\isasymemptyset}{\isacharparenright}{\kern0pt}}\\
+ − 118
\isa{bsimp{\isacharunderscore}{\kern0pt}AALTs\ bs{\isadigit{1}}{\isachardot}{\kern0pt}{\isadigit{0}}\ {\isacharparenleft}{\kern0pt}v\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}vb\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}vc{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{AZERO}\\
+ − 119
+ − 120
\end{tabular}
+ − 121
\end{center}
+ − 122
+ − 123
+ − 124
This might sound trivial in the case of producing a YES/NO answer,
+ − 125
but once we require a lexing output to be produced (which is required
+ − 126
in applications like compiler front-end, malicious attack domain extraction,
+ − 127
etc.), it is not straightforward if we still extract what is needed according
+ − 128
to the POSIX standard.
+ − 129
+ − 130
+ − 131
+ − 132
+ − 133
+ − 134
By simplification, we mean specifically the following rules:
+ − 135
+ − 136
\begin{center}
+ − 137
\begin{tabular}{lcl}
+ − 138
\isa{\mbox{}\inferrule{\mbox{}}{\mbox{ASEQ\ bs\ AZERO\ r\isactrlsub {\isadigit{2}}\ {\isasymleadsto}\ AZERO}}}\\
+ − 139
\isa{\mbox{}\inferrule{\mbox{}}{\mbox{ASEQ\ bs\ r\isactrlsub {\isadigit{1}}\ AZERO\ {\isasymleadsto}\ AZERO}}}\\
+ − 140
\isa{\mbox{}\inferrule{\mbox{}}{\mbox{ASEQ\ bs\ {\isacharparenleft}{\kern0pt}AONE\ bs\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isasymleadsto}\ fuse\ {\isacharparenleft}{\kern0pt}bs\ {\isacharat}{\kern0pt}\ bs\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ r\isactrlsub {\isadigit{1}}}}}\\
+ − 141
\isa{\mbox{}\inferrule{\mbox{r\isactrlsub {\isadigit{1}}\ {\isasymleadsto}\ r\isactrlsub {\isadigit{2}}}}{\mbox{ASEQ\ bs\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{3}}\ {\isasymleadsto}\ ASEQ\ bs\ r\isactrlsub {\isadigit{2}}\ r\isactrlsub {\isadigit{3}}}}}\\
+ − 142
\isa{\mbox{}\inferrule{\mbox{r\isactrlsub {\isadigit{3}}\ {\isasymleadsto}\ r\isactrlsub {\isadigit{4}}}}{\mbox{ASEQ\ bs\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{3}}\ {\isasymleadsto}\ ASEQ\ bs\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{4}}}}}\\
+ − 143
\isa{\mbox{}\inferrule{\mbox{r\ {\isasymleadsto}\ r{\isacharprime}{\kern0pt}}}{\mbox{AALTs\ bs\ {\isacharparenleft}{\kern0pt}rs\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ {\isacharbrackleft}{\kern0pt}r{\isacharbrackright}{\kern0pt}\ {\isacharat}{\kern0pt}\ rs\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymleadsto}\ AALTs\ bs\ {\isacharparenleft}{\kern0pt}rs\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ {\isacharbrackleft}{\kern0pt}r{\isacharprime}{\kern0pt}{\isacharbrackright}{\kern0pt}\ {\isacharat}{\kern0pt}\ rs\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}}}\\
+ − 144
\isa{\mbox{}\inferrule{\mbox{}}{\mbox{AALTs\ bs\ {\isacharparenleft}{\kern0pt}rs\isactrlsub a\ {\isacharat}{\kern0pt}\ {\isacharbrackleft}{\kern0pt}AZERO{\isacharbrackright}{\kern0pt}\ {\isacharat}{\kern0pt}\ rs\isactrlsub b{\isacharparenright}{\kern0pt}\ {\isasymleadsto}\ AALTs\ bs\ {\isacharparenleft}{\kern0pt}rs\isactrlsub a\ {\isacharat}{\kern0pt}\ rs\isactrlsub b{\isacharparenright}{\kern0pt}}}}\\
+ − 145
\isa{\mbox{}\inferrule{\mbox{}}{\mbox{AALTs\ bs\ {\isacharparenleft}{\kern0pt}rs\isactrlsub a\ {\isacharat}{\kern0pt}\ {\isacharbrackleft}{\kern0pt}AALTs\ bs\isactrlsub {\isadigit{1}}\ rs\isactrlsub {\isadigit{1}}{\isacharbrackright}{\kern0pt}\ {\isacharat}{\kern0pt}\ rs\isactrlsub b{\isacharparenright}{\kern0pt}\ {\isasymleadsto}\ AALTs\ bs\ {\isacharparenleft}{\kern0pt}rs\isactrlsub a\ {\isacharat}{\kern0pt}\ map\ {\isacharparenleft}{\kern0pt}fuse\ bs\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ rs\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ rs\isactrlsub b{\isacharparenright}{\kern0pt}}}}\\
+ − 146
\end{tabular}
+ − 147
\end{center}
+ − 148
+ − 149
+ − 150
And these can be made compact by the following simplification function:
+ − 151
+ − 152
where the function $\mathit{bsimp_AALTs}$
+ − 153
+ − 154
The core idea of the proof is that two regular expressions,
+ − 155
if "isomorphic" up to a finite number of rewrite steps, will
+ − 156
remain "isomorphic" when we take the same sequence of
+ − 157
derivatives on both of them.
+ − 158
This can be expressed by the following rewrite relation lemma:
+ − 159
\begin{lemma}
+ − 160
\isa{{\isacharparenleft}{\kern0pt}r\mbox{$\bbslash$}s{\isacharparenright}{\kern0pt}\ {\isasymleadsto}{\isacharasterisk}{\kern0pt}\ bders{\isacharunderscore}{\kern0pt}simp\ r\ s}
+ − 161
\end{lemma}
+ − 162
+ − 163
This isomorphic relation implies a property that leads to the
+ − 164
correctness result:
+ − 165
if two (nullable) regular expressions are "rewritable" in many steps
+ − 166
from one another,
+ − 167
then a call to function $\textit{bmkeps}$ gives the same
+ − 168
bit-sequence :
+ − 169
\begin{lemma}
+ − 170
\isa{{\normalsize{}If\,}\ \mbox{r{\isadigit{1}}{\isachardot}{\kern0pt}{\isadigit{0}}\ {\isasymleadsto}{\isacharasterisk}{\kern0pt}\ r{\isadigit{2}}{\isachardot}{\kern0pt}{\isadigit{0}}}\ {\normalsize \,and\,}\ \mbox{nullable\mbox{$_b$}\ r{\isadigit{1}}{\isachardot}{\kern0pt}{\isadigit{0}}}\ {\normalsize \,then\,}\ mkeps\mbox{$_b$}\ r{\isadigit{1}}{\isachardot}{\kern0pt}{\isadigit{0}}\ {\isacharequal}{\kern0pt}\ mkeps\mbox{$_b$}\ r{\isadigit{2}}{\isachardot}{\kern0pt}{\isadigit{0}}{\isachardot}{\kern0pt}}
+ − 171
\end{lemma}
+ − 172
+ − 173
Given the same bit-sequence, the decode function
+ − 174
will give out the same value, which is the output
+ − 175
of both lexers:
+ − 176
\begin{lemma}
+ − 177
\isa{lexer\mbox{$_b$}\ r\ s\ {\isasymequiv}\ \textrm{if}\ nullable\mbox{$_b$}\ {\isacharparenleft}{\kern0pt}r\mbox{$^\uparrow$}\mbox{$\bbslash$}s{\isacharparenright}{\kern0pt}\ \textrm{then}\ decode\ {\isacharparenleft}{\kern0pt}mkeps\mbox{$_b$}\ {\isacharparenleft}{\kern0pt}r\mbox{$^\uparrow$}\mbox{$\bbslash$}s{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ r\ \textrm{else}\ None}
+ − 178
\end{lemma}
+ − 179
+ − 180
\begin{lemma}
+ − 181
\isa{blexer{\isacharunderscore}{\kern0pt}simp\ r\ s\ {\isasymequiv}\ \textrm{if}\ nullable\mbox{$_b$}\ {\isacharparenleft}{\kern0pt}bders{\isacharunderscore}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}r\mbox{$^\uparrow$}{\isacharparenright}{\kern0pt}\ s{\isacharparenright}{\kern0pt}\ \textrm{then}\ decode\ {\isacharparenleft}{\kern0pt}mkeps\mbox{$_b$}\ {\isacharparenleft}{\kern0pt}bders{\isacharunderscore}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}r\mbox{$^\uparrow$}{\isacharparenright}{\kern0pt}\ s{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ r\ \textrm{else}\ None}
+ − 182
\end{lemma}
+ − 183
+ − 184
And that yields the correctness result:
+ − 185
\begin{lemma}
+ − 186
\isa{lexer\ r\ s\ {\isacharequal}{\kern0pt}\ blexer{\isacharunderscore}{\kern0pt}simp\ r\ s}
+ − 187
\end{lemma}
+ − 188
+ − 189
The nice thing about the above%
+ − 190
\end{isamarkuptext}\isamarkuptrue%
+ − 191
%
+ − 192
\isadelimdocument
+ − 193
%
+ − 194
\endisadelimdocument
+ − 195
%
+ − 196
\isatagdocument
+ − 197
%
+ − 198
\isamarkupsection{Additional Simp Rules?%
+ − 199
}
+ − 200
\isamarkuptrue%
+ − 201
%
+ − 202
\endisatagdocument
+ − 203
{\isafolddocument}%
+ − 204
%
+ − 205
\isadelimdocument
+ − 206
%
+ − 207
\endisadelimdocument
+ − 208
%
+ − 209
\begin{isamarkuptext}%
+ − 210
One question someone would ask is:
+ − 211
can we add more "atomic" simplification/rewriting rules,
+ − 212
so the simplification is even more aggressive, making
+ − 213
the intermediate results smaller, and therefore more space-efficient?
+ − 214
For example, one might want to do open up alternatives who is a child
+ − 215
of a sequence:
+ − 216
+ − 217
\begin{center}
+ − 218
\begin{tabular}{lcl}
+ − 219
\isa{ASEQ\ bs\ {\isacharparenleft}{\kern0pt}AALTs\ bs{\isadigit{1}}\ rs{\isacharparenright}{\kern0pt}\ r\ {\isasymleadsto}{\isacharquery}{\kern0pt}\ AALTs\ {\isacharparenleft}{\kern0pt}bs\ {\isacharat}{\kern0pt}\ bs{\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}map\ {\isacharparenleft}{\kern0pt}{\isasymlambda}r{\isacharprime}{\kern0pt}{\isachardot}{\kern0pt}\ ASEQ\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ r{\isacharprime}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ rs{\isacharparenright}{\kern0pt}}\\
+ − 220
\end{tabular}
+ − 221
\end{center}
+ − 222
387
+ − 223
This rule allows us to simplify \mbox{\isa{{\isacharparenleft}{\kern0pt}a\ {\isacharplus}{\kern0pt}\ b{\isacharparenright}{\kern0pt}\ {\isasymcdot}\ c\ {\isacharplus}{\kern0pt}\ a\ {\isasymcdot}\ c}}
+ − 224
into \mbox{\isa{a\ {\isasymcdot}\ c\ {\isacharplus}{\kern0pt}\ b\ {\isasymcdot}\ c}},
+ − 225
which cannot be done under the rrewrite rule because only alternatives which are
389
+ − 226
children of another alternative can be spilled out.
+ − 227
+ − 228
Now with this rule we have some examples where we get
+ − 229
even smaller intermediate derivatives than not having this
+ − 230
rule:
+ − 231
$\textit{(a+aa)}^* \rightarrow \textit{(1+1a)(a+aa)}^* \rightarrow
+ − 232
\textit{(1+a)(a+aa)}^* $%
384
+ − 233
\end{isamarkuptext}\isamarkuptrue%
+ − 234
%
+ − 235
\isadelimdocument
+ − 236
%
+ − 237
\endisadelimdocument
+ − 238
%
+ − 239
\isatagdocument
+ − 240
%
+ − 241
\isamarkupsection{Introduction%
+ − 242
}
+ − 243
\isamarkuptrue%
+ − 244
%
+ − 245
\endisatagdocument
+ − 246
{\isafolddocument}%
+ − 247
%
+ − 248
\isadelimdocument
+ − 249
%
+ − 250
\endisadelimdocument
+ − 251
%
+ − 252
\begin{isamarkuptext}%
+ − 253
Brzozowski \cite{Brzozowski1964} introduced the notion of the {\em
+ − 254
derivative} \isa{r{\isacharbackslash}{\kern0pt}c} of a regular expression \isa{r} w.r.t.\
+ − 255
a character~\isa{c}, and showed that it gave a simple solution to the
+ − 256
problem of matching a string \isa{s} with a regular expression \isa{r}: if the derivative of \isa{r} w.r.t.\ (in succession) all the
+ − 257
characters of the string matches the empty string, then \isa{r}
+ − 258
matches \isa{s} (and {\em vice versa}). The derivative has the
+ − 259
property (which may almost be regarded as its specification) that, for
+ − 260
every string \isa{s} and regular expression \isa{r} and character
+ − 261
\isa{c}, one has \isa{cs\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}} if and only if \mbox{\isa{s\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}}}.
+ − 262
The beauty of Brzozowski's derivatives is that
+ − 263
they are neatly expressible in any functional language, and easily
+ − 264
definable and reasoned about in theorem provers---the definitions just
+ − 265
consist of inductive datatypes and simple recursive functions. A
+ − 266
mechanised correctness proof of Brzozowski's matcher in for example HOL4
+ − 267
has been mentioned by Owens and Slind~\cite{Owens2008}. Another one in
+ − 268
Isabelle/HOL is part of the work by Krauss and Nipkow \cite{Krauss2011}.
+ − 269
And another one in Coq is given by Coquand and Siles \cite{Coquand2012}.
+ − 270
+ − 271
If a regular expression matches a string, then in general there is more
+ − 272
than one way of how the string is matched. There are two commonly used
+ − 273
disambiguation strategies to generate a unique answer: one is called
+ − 274
GREEDY matching \cite{Frisch2004} and the other is POSIX
+ − 275
matching~\cite{POSIX,Kuklewicz,OkuiSuzuki2010,Sulzmann2014,Vansummeren2006}.
+ − 276
For example consider the string \isa{xy} and the regular expression
+ − 277
\mbox{\isa{{\isacharparenleft}{\kern0pt}x\ {\isacharplus}{\kern0pt}\ y\ {\isacharplus}{\kern0pt}\ xy{\isacharparenright}{\kern0pt}\isactrlsup {\isasymstar}}}. Either the string can be
+ − 278
matched in two `iterations' by the single letter-regular expressions
+ − 279
\isa{x} and \isa{y}, or directly in one iteration by \isa{xy}. The
+ − 280
first case corresponds to GREEDY matching, which first matches with the
+ − 281
left-most symbol and only matches the next symbol in case of a mismatch
+ − 282
(this is greedy in the sense of preferring instant gratification to
+ − 283
delayed repletion). The second case is POSIX matching, which prefers the
+ − 284
longest match.
+ − 285
+ − 286
In the context of lexing, where an input string needs to be split up
+ − 287
into a sequence of tokens, POSIX is the more natural disambiguation
+ − 288
strategy for what programmers consider basic syntactic building blocks
+ − 289
in their programs. These building blocks are often specified by some
+ − 290
regular expressions, say \isa{r\isactrlbsub key\isactrlesub } and \isa{r\isactrlbsub id\isactrlesub } for recognising keywords and identifiers,
+ − 291
respectively. There are a few underlying (informal) rules behind
+ − 292
tokenising a string in a POSIX \cite{POSIX} fashion:
+ − 293
+ − 294
\begin{itemize}
+ − 295
\item[$\bullet$] \emph{The Longest Match Rule} (or \emph{``{M}aximal {M}unch {R}ule''}):
+ − 296
The longest initial substring matched by any regular expression is taken as
+ − 297
next token.\smallskip
+ − 298
+ − 299
\item[$\bullet$] \emph{Priority Rule:}
+ − 300
For a particular longest initial substring, the first (leftmost) regular expression
+ − 301
that can match determines the token.\smallskip
+ − 302
+ − 303
\item[$\bullet$] \emph{Star Rule:} A subexpression repeated by ${}^\star$ shall
+ − 304
not match an empty string unless this is the only match for the repetition.\smallskip
+ − 305
+ − 306
\item[$\bullet$] \emph{Empty String Rule:} An empty string shall be considered to
+ − 307
be longer than no match at all.
+ − 308
\end{itemize}
+ − 309
+ − 310
\noindent Consider for example a regular expression \isa{r\isactrlbsub key\isactrlesub } for recognising keywords such as \isa{if},
+ − 311
\isa{then} and so on; and \isa{r\isactrlbsub id\isactrlesub }
+ − 312
recognising identifiers (say, a single character followed by
+ − 313
characters or numbers). Then we can form the regular expression
+ − 314
\isa{{\isacharparenleft}{\kern0pt}r\isactrlbsub key\isactrlesub \ {\isacharplus}{\kern0pt}\ r\isactrlbsub id\isactrlesub {\isacharparenright}{\kern0pt}\isactrlsup {\isasymstar}}
+ − 315
and use POSIX matching to tokenise strings, say \isa{iffoo} and
+ − 316
\isa{if}. For \isa{iffoo} we obtain by the Longest Match Rule
+ − 317
a single identifier token, not a keyword followed by an
+ − 318
identifier. For \isa{if} we obtain by the Priority Rule a keyword
+ − 319
token, not an identifier token---even if \isa{r\isactrlbsub id\isactrlesub }
+ − 320
matches also. By the Star Rule we know \isa{{\isacharparenleft}{\kern0pt}r\isactrlbsub key\isactrlesub \ {\isacharplus}{\kern0pt}\ r\isactrlbsub id\isactrlesub {\isacharparenright}{\kern0pt}\isactrlsup {\isasymstar}} matches \isa{iffoo},
+ − 321
respectively \isa{if}, in exactly one `iteration' of the star. The
+ − 322
Empty String Rule is for cases where, for example, the regular expression
+ − 323
\isa{{\isacharparenleft}{\kern0pt}a\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}\isactrlsup {\isasymstar}} matches against the
+ − 324
string \isa{bc}. Then the longest initial matched substring is the
+ − 325
empty string, which is matched by both the whole regular expression
+ − 326
and the parenthesised subexpression.
+ − 327
+ − 328
+ − 329
One limitation of Brzozowski's matcher is that it only generates a
+ − 330
YES/NO answer for whether a string is being matched by a regular
+ − 331
expression. Sulzmann and Lu~\cite{Sulzmann2014} extended this matcher
+ − 332
to allow generation not just of a YES/NO answer but of an actual
+ − 333
matching, called a [lexical] {\em value}. Assuming a regular
+ − 334
expression matches a string, values encode the information of
+ − 335
\emph{how} the string is matched by the regular expression---that is,
+ − 336
which part of the string is matched by which part of the regular
+ − 337
expression. For this consider again the string \isa{xy} and
+ − 338
the regular expression \mbox{\isa{{\isacharparenleft}{\kern0pt}x\ {\isacharplus}{\kern0pt}\ {\isacharparenleft}{\kern0pt}y\ {\isacharplus}{\kern0pt}\ xy{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\isactrlsup {\isasymstar}}}
+ − 339
(this time fully parenthesised). We can view this regular expression
+ − 340
as tree and if the string \isa{xy} is matched by two Star
+ − 341
`iterations', then the \isa{x} is matched by the left-most
+ − 342
alternative in this tree and the \isa{y} by the right-left alternative. This
+ − 343
suggests to record this matching as
+ − 344
+ − 345
\begin{center}
+ − 346
\isa{Stars\ {\isacharbrackleft}{\kern0pt}Left\ {\isacharparenleft}{\kern0pt}Char\ x{\isacharparenright}{\kern0pt}{\isacharcomma}{\kern0pt}\ Right\ {\isacharparenleft}{\kern0pt}Left\ {\isacharparenleft}{\kern0pt}Char\ y{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}{\isacharbrackright}{\kern0pt}}
+ − 347
\end{center}
+ − 348
+ − 349
\noindent where \isa{Stars}, \isa{Left}, \isa{Right} and \isa{Char} are constructors for values. \isa{Stars} records how many
+ − 350
iterations were used; \isa{Left}, respectively \isa{Right}, which
+ − 351
alternative is used. This `tree view' leads naturally to the idea that
+ − 352
regular expressions act as types and values as inhabiting those types
+ − 353
(see, for example, \cite{HosoyaVouillonPierce2005}). The value for
+ − 354
matching \isa{xy} in a single `iteration', i.e.~the POSIX value,
+ − 355
would look as follows
+ − 356
+ − 357
\begin{center}
+ − 358
\isa{Stars\ {\isacharbrackleft}{\kern0pt}Seq\ {\isacharparenleft}{\kern0pt}Char\ x{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}Char\ y{\isacharparenright}{\kern0pt}{\isacharbrackright}{\kern0pt}}
+ − 359
\end{center}
+ − 360
+ − 361
\noindent where \isa{Stars} has only a single-element list for the
+ − 362
single iteration and \isa{Seq} indicates that \isa{xy} is matched
+ − 363
by a sequence regular expression.
+ − 364
+ − 365
%, which we will in what follows
+ − 366
%write more formally as \isa{x\ {\isasymcdot}\ y}.
+ − 367
+ − 368
+ − 369
Sulzmann and Lu give a simple algorithm to calculate a value that
+ − 370
appears to be the value associated with POSIX matching. The challenge
+ − 371
then is to specify that value, in an algorithm-independent fashion,
+ − 372
and to show that Sulzmann and Lu's derivative-based algorithm does
+ − 373
indeed calculate a value that is correct according to the
+ − 374
specification. The answer given by Sulzmann and Lu
+ − 375
\cite{Sulzmann2014} is to define a relation (called an ``order
+ − 376
relation'') on the set of values of \isa{r}, and to show that (once
+ − 377
a string to be matched is chosen) there is a maximum element and that
+ − 378
it is computed by their derivative-based algorithm. This proof idea is
+ − 379
inspired by work of Frisch and Cardelli \cite{Frisch2004} on a GREEDY
+ − 380
regular expression matching algorithm. However, we were not able to
+ − 381
establish transitivity and totality for the ``order relation'' by
+ − 382
Sulzmann and Lu. There are some inherent problems with their approach
+ − 383
(of which some of the proofs are not published in
+ − 384
\cite{Sulzmann2014}); perhaps more importantly, we give in this paper
+ − 385
a simple inductive (and algorithm-independent) definition of what we
+ − 386
call being a {\em POSIX value} for a regular expression \isa{r} and
+ − 387
a string \isa{s}; we show that the algorithm by Sulzmann and Lu
+ − 388
computes such a value and that such a value is unique. Our proofs are
+ − 389
both done by hand and checked in Isabelle/HOL. The experience of
+ − 390
doing our proofs has been that this mechanical checking was absolutely
+ − 391
essential: this subject area has hidden snares. This was also noted by
+ − 392
Kuklewicz \cite{Kuklewicz} who found that nearly all POSIX matching
+ − 393
implementations are ``buggy'' \cite[Page 203]{Sulzmann2014} and by
+ − 394
Grathwohl et al \cite[Page 36]{CrashCourse2014} who wrote:
+ − 395
+ − 396
\begin{quote}
+ − 397
\it{}``The POSIX strategy is more complicated than the greedy because of
+ − 398
the dependence on information about the length of matched strings in the
+ − 399
various subexpressions.''
+ − 400
\end{quote}
+ − 401
+ − 402
+ − 403
+ − 404
\noindent {\bf Contributions:} We have implemented in Isabelle/HOL the
+ − 405
derivative-based regular expression matching algorithm of
+ − 406
Sulzmann and Lu \cite{Sulzmann2014}. We have proved the correctness of this
+ − 407
algorithm according to our specification of what a POSIX value is (inspired
+ − 408
by work of Vansummeren \cite{Vansummeren2006}). Sulzmann
+ − 409
and Lu sketch in \cite{Sulzmann2014} an informal correctness proof: but to
+ − 410
us it contains unfillable gaps.\footnote{An extended version of
+ − 411
\cite{Sulzmann2014} is available at the website of its first author; this
+ − 412
extended version already includes remarks in the appendix that their
+ − 413
informal proof contains gaps, and possible fixes are not fully worked out.}
+ − 414
Our specification of a POSIX value consists of a simple inductive definition
+ − 415
that given a string and a regular expression uniquely determines this value.
+ − 416
We also show that our definition is equivalent to an ordering
+ − 417
of values based on positions by Okui and Suzuki \cite{OkuiSuzuki2010}.
+ − 418
+ − 419
%Derivatives as calculated by Brzozowski's method are usually more complex
+ − 420
%regular expressions than the initial one; various optimisations are
+ − 421
%possible. We prove the correctness when simplifications of \isa{\isactrlbold {\isadigit{0}}\ {\isacharplus}{\kern0pt}\ r},
+ − 422
%\isa{r\ {\isacharplus}{\kern0pt}\ \isactrlbold {\isadigit{0}}}, \isa{\isactrlbold {\isadigit{1}}\ {\isasymcdot}\ r} and \isa{r\ {\isasymcdot}\ \isactrlbold {\isadigit{1}}} to
+ − 423
%\isa{r} are applied.
+ − 424
+ − 425
We extend our results to ??? Bitcoded version??%
+ − 426
\end{isamarkuptext}\isamarkuptrue%
+ − 427
%
+ − 428
\isadelimdocument
+ − 429
%
+ − 430
\endisadelimdocument
+ − 431
%
+ − 432
\isatagdocument
+ − 433
%
+ − 434
\isamarkupsection{Preliminaries%
+ − 435
}
+ − 436
\isamarkuptrue%
+ − 437
%
+ − 438
\endisatagdocument
+ − 439
{\isafolddocument}%
+ − 440
%
+ − 441
\isadelimdocument
+ − 442
%
+ − 443
\endisadelimdocument
+ − 444
%
+ − 445
\begin{isamarkuptext}%
+ − 446
\noindent Strings in Isabelle/HOL are lists of characters with
+ − 447
the empty string being represented by the empty list, written \isa{{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}}, and list-cons being written as \isa{\underline{\hspace{2mm}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}\underline{\hspace{2mm}}}. Often
+ − 448
we use the usual bracket notation for lists also for strings; for
+ − 449
example a string consisting of just a single character \isa{c} is
+ − 450
written \isa{{\isacharbrackleft}{\kern0pt}c{\isacharbrackright}{\kern0pt}}. We use the usual definitions for
+ − 451
\emph{prefixes} and \emph{strict prefixes} of strings. By using the
+ − 452
type \isa{char} for characters we have a supply of finitely many
+ − 453
characters roughly corresponding to the ASCII character set. Regular
+ − 454
expressions are defined as usual as the elements of the following
+ − 455
inductive datatype:
+ − 456
+ − 457
\begin{center}
+ − 458
\isa{r\ {\isacharcolon}{\kern0pt}{\isacharequal}{\kern0pt}}
+ − 459
\isa{\isactrlbold {\isadigit{0}}} $\mid$
+ − 460
\isa{\isactrlbold {\isadigit{1}}} $\mid$
+ − 461
\isa{c} $\mid$
+ − 462
\isa{r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}} $\mid$
+ − 463
\isa{r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}} $\mid$
+ − 464
\isa{r\isactrlsup {\isasymstar}}
+ − 465
\end{center}
+ − 466
+ − 467
\noindent where \isa{\isactrlbold {\isadigit{0}}} stands for the regular expression that does
+ − 468
not match any string, \isa{\isactrlbold {\isadigit{1}}} for the regular expression that matches
+ − 469
only the empty string and \isa{c} for matching a character literal. The
+ − 470
language of a regular expression is also defined as usual by the
+ − 471
recursive function \isa{L} with the six clauses:
+ − 472
+ − 473
\begin{center}
+ − 474
\begin{tabular}{l@ {\hspace{4mm}}rcl}
+ − 475
\textit{(1)} & \isa{L{\isacharparenleft}{\kern0pt}\isactrlbold {\isadigit{0}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{{\isasymemptyset}}\\
+ − 476
\textit{(2)} & \isa{L{\isacharparenleft}{\kern0pt}\isactrlbold {\isadigit{1}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{{\isacharbraceleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}}\\
+ − 477
\textit{(3)} & \isa{L{\isacharparenleft}{\kern0pt}c{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{{\isacharbraceleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}c{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}}\\
+ − 478
\textit{(4)} & \isa{L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ &
+ − 479
\isa{L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharat}{\kern0pt}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 480
\textit{(5)} & \isa{L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ &
+ − 481
\isa{L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymunion}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 482
\textit{(6)} & \isa{L{\isacharparenleft}{\kern0pt}r\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{{\isacharparenleft}{\kern0pt}L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}{\isasymstar}}\\
+ − 483
\end{tabular}
+ − 484
\end{center}
+ − 485
+ − 486
\noindent In clause \textit{(4)} we use the operation \isa{\underline{\hspace{2mm}}\ {\isacharat}{\kern0pt}\ \underline{\hspace{2mm}}} for the concatenation of two languages (it is also list-append for
+ − 487
strings). We use the star-notation for regular expressions and for
+ − 488
languages (in the last clause above). The star for languages is defined
+ − 489
inductively by two clauses: \isa{{\isacharparenleft}{\kern0pt}i{\isacharparenright}{\kern0pt}} the empty string being in
+ − 490
the star of a language and \isa{{\isacharparenleft}{\kern0pt}ii{\isacharparenright}{\kern0pt}} if \isa{s\isactrlsub {\isadigit{1}}} is in a
+ − 491
language and \isa{s\isactrlsub {\isadigit{2}}} in the star of this language, then also \isa{s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}} is in the star of this language. It will also be convenient
+ − 492
to use the following notion of a \emph{semantic derivative} (or \emph{left
+ − 493
quotient}) of a language defined as
+ − 494
%
+ − 495
\begin{center}
+ − 496
\isa{Der\ c\ A\ {\isasymequiv}\ {\isacharbraceleft}{\kern0pt}s\ \mbox{\boldmath$\mid$}\ c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s\ {\isasymin}\ A{\isacharbraceright}{\kern0pt}}\;.
+ − 497
\end{center}
+ − 498
+ − 499
\noindent
+ − 500
For semantic derivatives we have the following equations (for example
+ − 501
mechanically proved in \cite{Krauss2011}):
+ − 502
%
+ − 503
\begin{equation}\label{SemDer}
+ − 504
\begin{array}{lcl}
+ − 505
\isa{Der\ c\ {\isasymemptyset}} & \dn & \isa{{\isasymemptyset}}\\
+ − 506
\isa{Der\ c\ {\isacharbraceleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}} & \dn & \isa{{\isasymemptyset}}\\
+ − 507
\isa{Der\ c\ {\isacharbraceleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}d{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}} & \dn & \isa{\textrm{if}\ c\ {\isacharequal}{\kern0pt}\ d\ \textrm{then}\ {\isacharbraceleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ \textrm{else}\ {\isasymemptyset}}\\
+ − 508
\isa{Der\ c\ {\isacharparenleft}{\kern0pt}A\ {\isasymunion}\ B{\isacharparenright}{\kern0pt}} & \dn & \isa{Der\ c\ A\ {\isasymunion}\ Der\ c\ B}\\
+ − 509
\isa{Der\ c\ {\isacharparenleft}{\kern0pt}A\ {\isacharat}{\kern0pt}\ B{\isacharparenright}{\kern0pt}} & \dn & \isa{{\isacharparenleft}{\kern0pt}Der\ c\ A\ {\isacharat}{\kern0pt}\ B{\isacharparenright}{\kern0pt}\ {\isasymunion}\ {\isacharparenleft}{\kern0pt}\textrm{if}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ {\isasymin}\ A\ \textrm{then}\ Der\ c\ B\ \textrm{else}\ {\isasymemptyset}{\isacharparenright}{\kern0pt}}\\
+ − 510
\isa{Der\ c\ {\isacharparenleft}{\kern0pt}A{\isasymstar}{\isacharparenright}{\kern0pt}} & \dn & \isa{Der\ c\ A\ {\isacharat}{\kern0pt}\ A{\isasymstar}}
+ − 511
\end{array}
+ − 512
\end{equation}
+ − 513
+ − 514
+ − 515
\noindent \emph{\Brz's derivatives} of regular expressions
+ − 516
\cite{Brzozowski1964} can be easily defined by two recursive functions:
+ − 517
the first is from regular expressions to booleans (implementing a test
+ − 518
when a regular expression can match the empty string), and the second
+ − 519
takes a regular expression and a character to a (derivative) regular
+ − 520
expression:
+ − 521
+ − 522
\begin{center}
+ − 523
\begin{tabular}{lcl}
+ − 524
\isa{nullable\ {\isacharparenleft}{\kern0pt}\isactrlbold {\isadigit{0}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{False}\\
+ − 525
\isa{nullable\ {\isacharparenleft}{\kern0pt}\isactrlbold {\isadigit{1}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{True}\\
+ − 526
\isa{nullable\ {\isacharparenleft}{\kern0pt}c{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{False}\\
+ − 527
\isa{nullable\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{nullable\ r\isactrlsub {\isadigit{1}}\ {\isasymor}\ nullable\ r\isactrlsub {\isadigit{2}}}\\
+ − 528
\isa{nullable\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{nullable\ r\isactrlsub {\isadigit{1}}\ {\isasymand}\ nullable\ r\isactrlsub {\isadigit{2}}}\\
+ − 529
\isa{nullable\ {\isacharparenleft}{\kern0pt}r\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{True}\medskip\\
+ − 530
+ − 531
% \end{tabular}
+ − 532
% \end{center}
+ − 533
+ − 534
% \begin{center}
+ − 535
% \begin{tabular}{lcl}
+ − 536
+ − 537
\isa{\isactrlbold {\isadigit{0}}{\isacharbackslash}{\kern0pt}c} & $\dn$ & \isa{\isactrlbold {\isadigit{0}}}\\
+ − 538
\isa{\isactrlbold {\isadigit{1}}{\isacharbackslash}{\kern0pt}c} & $\dn$ & \isa{\isactrlbold {\isadigit{0}}}\\
+ − 539
\isa{d{\isacharbackslash}{\kern0pt}c} & $\dn$ & \isa{\textrm{if}\ c\ {\isacharequal}{\kern0pt}\ d\ \textrm{then}\ \isactrlbold {\isadigit{1}}\ \textrm{else}\ \isactrlbold {\isadigit{0}}}\\
+ − 540
\isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}c} & $\dn$ & \isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isacharplus}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}}\\
+ − 541
\isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}c} & $\dn$ & \isa{\textrm{if}\ nullable\ r\isactrlsub {\isadigit{1}}\ \textrm{then}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}\ {\isacharplus}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ \textrm{else}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}}\\
+ − 542
\isa{{\isacharparenleft}{\kern0pt}r\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}c} & $\dn$ & \isa{{\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymcdot}\ r\isactrlsup {\isasymstar}}
+ − 543
\end{tabular}
+ − 544
\end{center}
+ − 545
+ − 546
\noindent
+ − 547
We may extend this definition to give derivatives w.r.t.~strings:
+ − 548
+ − 549
\begin{center}
+ − 550
\begin{tabular}{lcl}
+ − 551
\isa{r{\isacharbackslash}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}} & $\dn$ & \isa{r}\\
+ − 552
\isa{r{\isacharbackslash}{\kern0pt}{\isacharparenleft}{\kern0pt}c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{{\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}s}\\
+ − 553
\end{tabular}
+ − 554
\end{center}
+ − 555
+ − 556
\noindent Given the equations in \eqref{SemDer}, it is a relatively easy
+ − 557
exercise in mechanical reasoning to establish that
+ − 558
+ − 559
\begin{proposition}\label{derprop}\mbox{}\\
+ − 560
\begin{tabular}{ll}
+ − 561
\textit{(1)} & \isa{nullable\ r} if and only if
+ − 562
\isa{{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}}, and \\
+ − 563
\textit{(2)} & \isa{L{\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ Der\ c\ {\isacharparenleft}{\kern0pt}L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}}.
+ − 564
\end{tabular}
+ − 565
\end{proposition}
+ − 566
+ − 567
\noindent With this in place it is also very routine to prove that the
+ − 568
regular expression matcher defined as
+ − 569
%
+ − 570
\begin{center}
+ − 571
\isa{match\ r\ s\ {\isasymequiv}\ nullable\ {\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}s{\isacharparenright}{\kern0pt}}
+ − 572
\end{center}
+ − 573
+ − 574
\noindent gives a positive answer if and only if \isa{s\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}}.
+ − 575
Consequently, this regular expression matching algorithm satisfies the
+ − 576
usual specification for regular expression matching. While the matcher
+ − 577
above calculates a provably correct YES/NO answer for whether a regular
+ − 578
expression matches a string or not, the novel idea of Sulzmann and Lu
+ − 579
\cite{Sulzmann2014} is to append another phase to this algorithm in order
+ − 580
to calculate a [lexical] value. We will explain the details next.%
+ − 581
\end{isamarkuptext}\isamarkuptrue%
+ − 582
%
+ − 583
\isadelimdocument
+ − 584
%
+ − 585
\endisadelimdocument
+ − 586
%
+ − 587
\isatagdocument
+ − 588
%
+ − 589
\isamarkupsection{POSIX Regular Expression Matching\label{posixsec}%
+ − 590
}
+ − 591
\isamarkuptrue%
+ − 592
%
+ − 593
\endisatagdocument
+ − 594
{\isafolddocument}%
+ − 595
%
+ − 596
\isadelimdocument
+ − 597
%
+ − 598
\endisadelimdocument
+ − 599
%
+ − 600
\begin{isamarkuptext}%
+ − 601
There have been many previous works that use values for encoding
+ − 602
\emph{how} a regular expression matches a string.
+ − 603
The clever idea by Sulzmann and Lu \cite{Sulzmann2014} is to
+ − 604
define a function on values that mirrors (but inverts) the
+ − 605
construction of the derivative on regular expressions. \emph{Values}
+ − 606
are defined as the inductive datatype
+ − 607
+ − 608
\begin{center}
+ − 609
\isa{v\ {\isacharcolon}{\kern0pt}{\isacharequal}{\kern0pt}}
+ − 610
\isa{Empty} $\mid$
+ − 611
\isa{Char\ c} $\mid$
+ − 612
\isa{Left\ v} $\mid$
+ − 613
\isa{Right\ v} $\mid$
+ − 614
\isa{Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}} $\mid$
+ − 615
\isa{Stars\ vs}
+ − 616
\end{center}
+ − 617
+ − 618
\noindent where we use \isa{vs} to stand for a list of
+ − 619
values. (This is similar to the approach taken by Frisch and
+ − 620
Cardelli for GREEDY matching \cite{Frisch2004}, and Sulzmann and Lu
+ − 621
for POSIX matching \cite{Sulzmann2014}). The string underlying a
+ − 622
value can be calculated by the \isa{flat} function, written
+ − 623
\isa{{\isacharbar}{\kern0pt}\underline{\hspace{2mm}}{\isacharbar}{\kern0pt}} and defined as:
+ − 624
+ − 625
\begin{center}
+ − 626
\begin{tabular}[t]{lcl}
+ − 627
\isa{{\isacharbar}{\kern0pt}Empty{\isacharbar}{\kern0pt}} & $\dn$ & \isa{{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}}\\
+ − 628
\isa{{\isacharbar}{\kern0pt}Char\ c{\isacharbar}{\kern0pt}} & $\dn$ & \isa{{\isacharbrackleft}{\kern0pt}c{\isacharbrackright}{\kern0pt}}\\
+ − 629
\isa{{\isacharbar}{\kern0pt}Left\ v{\isacharbar}{\kern0pt}} & $\dn$ & \isa{{\isacharbar}{\kern0pt}v{\isacharbar}{\kern0pt}}\\
+ − 630
\isa{{\isacharbar}{\kern0pt}Right\ v{\isacharbar}{\kern0pt}} & $\dn$ & \isa{{\isacharbar}{\kern0pt}v{\isacharbar}{\kern0pt}}
+ − 631
\end{tabular}\hspace{14mm}
+ − 632
\begin{tabular}[t]{lcl}
+ − 633
\isa{{\isacharbar}{\kern0pt}Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}} & $\dn$ & \isa{{\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}\ {\isacharat}{\kern0pt}\ {\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}}\\
+ − 634
\isa{{\isacharbar}{\kern0pt}Stars\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbar}{\kern0pt}} & $\dn$ & \isa{{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}}\\
+ − 635
\isa{{\isacharbar}{\kern0pt}Stars\ {\isacharparenleft}{\kern0pt}v\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}vs{\isacharparenright}{\kern0pt}{\isacharbar}{\kern0pt}} & $\dn$ & \isa{{\isacharbar}{\kern0pt}v{\isacharbar}{\kern0pt}\ {\isacharat}{\kern0pt}\ {\isacharbar}{\kern0pt}Stars\ vs{\isacharbar}{\kern0pt}}\\
+ − 636
\end{tabular}
+ − 637
\end{center}
+ − 638
+ − 639
\noindent We will sometimes refer to the underlying string of a
+ − 640
value as \emph{flattened value}. We will also overload our notation and
+ − 641
use \isa{{\isacharbar}{\kern0pt}vs{\isacharbar}{\kern0pt}} for flattening a list of values and concatenating
+ − 642
the resulting strings.
+ − 643
+ − 644
Sulzmann and Lu define
+ − 645
inductively an \emph{inhabitation relation} that associates values to
+ − 646
regular expressions. We define this relation as
+ − 647
follows:\footnote{Note that the rule for \isa{Stars} differs from
+ − 648
our earlier paper \cite{AusafDyckhoffUrban2016}. There we used the
+ − 649
original definition by Sulzmann and Lu which does not require that
+ − 650
the values \isa{v\ {\isasymin}\ vs} flatten to a non-empty
+ − 651
string. The reason for introducing the more restricted version of
+ − 652
lexical values is convenience later on when reasoning about an
+ − 653
ordering relation for values.}
+ − 654
+ − 655
\begin{center}
+ − 656
\begin{tabular}{c@ {\hspace{12mm}}c}\label{prfintros}
+ − 657
\\[-8mm]
+ − 658
\isa{\mbox{}\inferrule{\mbox{}}{\mbox{Empty\ {\isacharcolon}{\kern0pt}\ \isactrlbold {\isadigit{1}}}}} &
+ − 659
\isa{\mbox{}\inferrule{\mbox{}}{\mbox{Char\ c\ {\isacharcolon}{\kern0pt}\ c}}}\\[4mm]
+ − 660
\isa{\mbox{}\inferrule{\mbox{v\isactrlsub {\isadigit{1}}\ {\isacharcolon}{\kern0pt}\ r\isactrlsub {\isadigit{1}}}}{\mbox{Left\ v\isactrlsub {\isadigit{1}}\ {\isacharcolon}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}}}} &
+ − 661
\isa{\mbox{}\inferrule{\mbox{v\isactrlsub {\isadigit{2}}\ {\isacharcolon}{\kern0pt}\ r\isactrlsub {\isadigit{1}}}}{\mbox{Right\ v\isactrlsub {\isadigit{2}}\ {\isacharcolon}{\kern0pt}\ r\isactrlsub {\isadigit{2}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{1}}}}}\\[4mm]
+ − 662
\isa{\mbox{}\inferrule{\mbox{v\isactrlsub {\isadigit{1}}\ {\isacharcolon}{\kern0pt}\ r\isactrlsub {\isadigit{1}}}\\\ \mbox{v\isactrlsub {\isadigit{2}}\ {\isacharcolon}{\kern0pt}\ r\isactrlsub {\isadigit{2}}}}{\mbox{Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}\ {\isacharcolon}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}}}} &
+ − 663
\isa{\mbox{}\inferrule{\mbox{{\isasymforall}v{\isasymin}vs{\isachardot}{\kern0pt}\ v\ {\isacharcolon}{\kern0pt}\ r\ {\isasymand}\ {\isacharbar}{\kern0pt}v{\isacharbar}{\kern0pt}\ {\isasymnoteq}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}}}{\mbox{Stars\ vs\ {\isacharcolon}{\kern0pt}\ r\isactrlsup {\isasymstar}}}}
+ − 664
\end{tabular}
+ − 665
\end{center}
+ − 666
+ − 667
\noindent where in the clause for \isa{Stars} we use the
+ − 668
notation \isa{v\ {\isasymin}\ vs} for indicating that \isa{v} is a
+ − 669
member in the list \isa{vs}. We require in this rule that every
+ − 670
value in \isa{vs} flattens to a non-empty string. The idea is that
+ − 671
\isa{Stars}-values satisfy the informal Star Rule (see Introduction)
+ − 672
where the $^\star$ does not match the empty string unless this is
+ − 673
the only match for the repetition. Note also that no values are
+ − 674
associated with the regular expression \isa{\isactrlbold {\isadigit{0}}}, and that the
+ − 675
only value associated with the regular expression \isa{\isactrlbold {\isadigit{1}}} is
+ − 676
\isa{Empty}. It is routine to establish how values ``inhabiting''
+ − 677
a regular expression correspond to the language of a regular
+ − 678
expression, namely
+ − 679
+ − 680
\begin{proposition}\label{inhabs}
+ − 681
\isa{L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbraceleft}{\kern0pt}{\isacharbar}{\kern0pt}v{\isacharbar}{\kern0pt}\ \mbox{\boldmath$\mid$}\ v\ {\isacharcolon}{\kern0pt}\ r{\isacharbraceright}{\kern0pt}}
+ − 682
\end{proposition}
+ − 683
+ − 684
\noindent
+ − 685
Given a regular expression \isa{r} and a string \isa{s}, we define the
+ − 686
set of all \emph{Lexical Values} inhabited by \isa{r} with the underlying string
+ − 687
being \isa{s}:\footnote{Okui and Suzuki refer to our lexical values
+ − 688
as \emph{canonical values} in \cite{OkuiSuzuki2010}. The notion of \emph{non-problematic
+ − 689
values} by Cardelli and Frisch \cite{Frisch2004} is related, but not identical
+ − 690
to our lexical values.}
+ − 691
+ − 692
\begin{center}
+ − 693
\isa{LV\ r\ s\ {\isasymequiv}\ {\isacharbraceleft}{\kern0pt}v\ \mbox{\boldmath$\mid$}\ v\ {\isacharcolon}{\kern0pt}\ r\ {\isasymand}\ {\isacharbar}{\kern0pt}v{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ s{\isacharbraceright}{\kern0pt}}
+ − 694
\end{center}
+ − 695
+ − 696
\noindent The main property of \isa{LV\ r\ s} is that it is alway finite.
+ − 697
+ − 698
\begin{proposition}
+ − 699
\isa{finite\ {\isacharparenleft}{\kern0pt}LV\ r\ s{\isacharparenright}{\kern0pt}}
+ − 700
\end{proposition}
+ − 701
+ − 702
\noindent This finiteness property does not hold in general if we
+ − 703
remove the side-condition about \isa{{\isacharbar}{\kern0pt}v{\isacharbar}{\kern0pt}\ {\isasymnoteq}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}} in the
+ − 704
\isa{Stars}-rule above. For example using Sulzmann and Lu's
+ − 705
less restrictive definition, \isa{LV\ {\isacharparenleft}{\kern0pt}\isactrlbold {\isadigit{1}}\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}} would contain
+ − 706
infinitely many values, but according to our more restricted
+ − 707
definition only a single value, namely \isa{LV\ {\isacharparenleft}{\kern0pt}\isactrlbold {\isadigit{1}}\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbraceleft}{\kern0pt}Stars\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}}.
+ − 708
+ − 709
If a regular expression \isa{r} matches a string \isa{s}, then
+ − 710
generally the set \isa{LV\ r\ s} is not just a singleton set. In
+ − 711
case of POSIX matching the problem is to calculate the unique lexical value
+ − 712
that satisfies the (informal) POSIX rules from the Introduction.
+ − 713
Graphically the POSIX value calculation algorithm by Sulzmann and Lu
+ − 714
can be illustrated by the picture in Figure~\ref{Sulz} where the
+ − 715
path from the left to the right involving \isa{derivatives}/\isa{nullable} is the first phase of the algorithm
+ − 716
(calculating successive \Brz's derivatives) and \isa{mkeps}/\isa{inj}, the path from right to left, the second
+ − 717
phase. This picture shows the steps required when a regular
+ − 718
expression, say \isa{r\isactrlsub {\isadigit{1}}}, matches the string \isa{{\isacharbrackleft}{\kern0pt}a{\isacharcomma}{\kern0pt}\ b{\isacharcomma}{\kern0pt}\ c{\isacharbrackright}{\kern0pt}}. We first build the three derivatives (according to
+ − 719
\isa{a}, \isa{b} and \isa{c}). We then use \isa{nullable}
+ − 720
to find out whether the resulting derivative regular expression
+ − 721
\isa{r\isactrlsub {\isadigit{4}}} can match the empty string. If yes, we call the
+ − 722
function \isa{mkeps} that produces a value \isa{v\isactrlsub {\isadigit{4}}}
+ − 723
for how \isa{r\isactrlsub {\isadigit{4}}} can match the empty string (taking into
+ − 724
account the POSIX constraints in case there are several ways). This
+ − 725
function is defined by the clauses:
+ − 726
+ − 727
\begin{figure}[t]
+ − 728
\begin{center}
+ − 729
\begin{tikzpicture}[scale=2,node distance=1.3cm,
+ − 730
every node/.style={minimum size=6mm}]
+ − 731
\node (r1) {\isa{r\isactrlsub {\isadigit{1}}}};
+ − 732
\node (r2) [right=of r1]{\isa{r\isactrlsub {\isadigit{2}}}};
+ − 733
\draw[->,line width=1mm](r1)--(r2) node[above,midway] {\isa{\underline{\hspace{2mm}}{\isacharbackslash}{\kern0pt}a}};
+ − 734
\node (r3) [right=of r2]{\isa{r\isactrlsub {\isadigit{3}}}};
+ − 735
\draw[->,line width=1mm](r2)--(r3) node[above,midway] {\isa{\underline{\hspace{2mm}}{\isacharbackslash}{\kern0pt}b}};
+ − 736
\node (r4) [right=of r3]{\isa{r\isactrlsub {\isadigit{4}}}};
+ − 737
\draw[->,line width=1mm](r3)--(r4) node[above,midway] {\isa{\underline{\hspace{2mm}}{\isacharbackslash}{\kern0pt}c}};
+ − 738
\draw (r4) node[anchor=west] {\;\raisebox{3mm}{\isa{nullable}}};
+ − 739
\node (v4) [below=of r4]{\isa{v\isactrlsub {\isadigit{4}}}};
+ − 740
\draw[->,line width=1mm](r4) -- (v4);
+ − 741
\node (v3) [left=of v4] {\isa{v\isactrlsub {\isadigit{3}}}};
+ − 742
\draw[->,line width=1mm](v4)--(v3) node[below,midway] {\isa{inj\ r\isactrlsub {\isadigit{3}}\ c}};
+ − 743
\node (v2) [left=of v3]{\isa{v\isactrlsub {\isadigit{2}}}};
+ − 744
\draw[->,line width=1mm](v3)--(v2) node[below,midway] {\isa{inj\ r\isactrlsub {\isadigit{2}}\ b}};
+ − 745
\node (v1) [left=of v2] {\isa{v\isactrlsub {\isadigit{1}}}};
+ − 746
\draw[->,line width=1mm](v2)--(v1) node[below,midway] {\isa{inj\ r\isactrlsub {\isadigit{1}}\ a}};
+ − 747
\draw (r4) node[anchor=north west] {\;\raisebox{-8mm}{\isa{mkeps}}};
+ − 748
\end{tikzpicture}
+ − 749
\end{center}
+ − 750
\mbox{}\\[-13mm]
+ − 751
+ − 752
\caption{The two phases of the algorithm by Sulzmann \& Lu \cite{Sulzmann2014},
+ − 753
matching the string \isa{{\isacharbrackleft}{\kern0pt}a{\isacharcomma}{\kern0pt}\ b{\isacharcomma}{\kern0pt}\ c{\isacharbrackright}{\kern0pt}}. The first phase (the arrows from
+ − 754
left to right) is \Brz's matcher building successive derivatives. If the
+ − 755
last regular expression is \isa{nullable}, then the functions of the
+ − 756
second phase are called (the top-down and right-to-left arrows): first
+ − 757
\isa{mkeps} calculates a value \isa{v\isactrlsub {\isadigit{4}}} witnessing
+ − 758
how the empty string has been recognised by \isa{r\isactrlsub {\isadigit{4}}}. After
+ − 759
that the function \isa{inj} ``injects back'' the characters of the string into
+ − 760
the values.
+ − 761
\label{Sulz}}
+ − 762
\end{figure}
+ − 763
+ − 764
\begin{center}
+ − 765
\begin{tabular}{lcl}
+ − 766
\isa{mkeps\ \isactrlbold {\isadigit{1}}} & $\dn$ & \isa{Empty}\\
+ − 767
\isa{mkeps\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{Seq\ {\isacharparenleft}{\kern0pt}mkeps\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}mkeps\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 768
\isa{mkeps\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{\textrm{if}\ nullable\ r\isactrlsub {\isadigit{1}}\ \textrm{then}\ Left\ {\isacharparenleft}{\kern0pt}mkeps\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ \textrm{else}\ Right\ {\isacharparenleft}{\kern0pt}mkeps\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 769
\isa{mkeps\ {\isacharparenleft}{\kern0pt}r\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{Stars\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}}\\
+ − 770
\end{tabular}
+ − 771
\end{center}
+ − 772
+ − 773
\noindent Note that this function needs only to be partially defined,
+ − 774
namely only for regular expressions that are nullable. In case \isa{nullable} fails, the string \isa{{\isacharbrackleft}{\kern0pt}a{\isacharcomma}{\kern0pt}\ b{\isacharcomma}{\kern0pt}\ c{\isacharbrackright}{\kern0pt}} cannot be matched by \isa{r\isactrlsub {\isadigit{1}}} and the null value \isa{None} is returned. Note also how this function
+ − 775
makes some subtle choices leading to a POSIX value: for example if an
+ − 776
alternative regular expression, say \isa{r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}}, can
+ − 777
match the empty string and furthermore \isa{r\isactrlsub {\isadigit{1}}} can match the
+ − 778
empty string, then we return a \isa{Left}-value. The \isa{Right}-value will only be returned if \isa{r\isactrlsub {\isadigit{1}}} cannot match the empty
+ − 779
string.
+ − 780
+ − 781
The most interesting idea from Sulzmann and Lu \cite{Sulzmann2014} is
+ − 782
the construction of a value for how \isa{r\isactrlsub {\isadigit{1}}} can match the
+ − 783
string \isa{{\isacharbrackleft}{\kern0pt}a{\isacharcomma}{\kern0pt}\ b{\isacharcomma}{\kern0pt}\ c{\isacharbrackright}{\kern0pt}} from the value how the last derivative, \isa{r\isactrlsub {\isadigit{4}}} in Fig.~\ref{Sulz}, can match the empty string. Sulzmann and
+ − 784
Lu achieve this by stepwise ``injecting back'' the characters into the
+ − 785
values thus inverting the operation of building derivatives, but on the level
+ − 786
of values. The corresponding function, called \isa{inj}, takes three
+ − 787
arguments, a regular expression, a character and a value. For example in
+ − 788
the first (or right-most) \isa{inj}-step in Fig.~\ref{Sulz} the regular
+ − 789
expression \isa{r\isactrlsub {\isadigit{3}}}, the character \isa{c} from the last
+ − 790
derivative step and \isa{v\isactrlsub {\isadigit{4}}}, which is the value corresponding
+ − 791
to the derivative regular expression \isa{r\isactrlsub {\isadigit{4}}}. The result is
+ − 792
the new value \isa{v\isactrlsub {\isadigit{3}}}. The final result of the algorithm is
+ − 793
the value \isa{v\isactrlsub {\isadigit{1}}}. The \isa{inj} function is defined by recursion on regular
+ − 794
expressions and by analysing the shape of values (corresponding to
+ − 795
the derivative regular expressions).
+ − 796
%
+ − 797
\begin{center}
+ − 798
\begin{tabular}{l@ {\hspace{5mm}}lcl}
+ − 799
\textit{(1)} & \isa{inj\ d\ c\ {\isacharparenleft}{\kern0pt}Empty{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{Char\ d}\\
+ − 800
\textit{(2)} & \isa{inj\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ c\ {\isacharparenleft}{\kern0pt}Left\ v\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}} & $\dn$ &
+ − 801
\isa{Left\ {\isacharparenleft}{\kern0pt}inj\ r\isactrlsub {\isadigit{1}}\ c\ v\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}}\\
+ − 802
\textit{(3)} & \isa{inj\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ c\ {\isacharparenleft}{\kern0pt}Right\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ &
+ − 803
\isa{Right\ {\isacharparenleft}{\kern0pt}inj\ r\isactrlsub {\isadigit{2}}\ c\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 804
\textit{(4)} & \isa{inj\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ c\ {\isacharparenleft}{\kern0pt}Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$
+ − 805
& \isa{Seq\ {\isacharparenleft}{\kern0pt}inj\ r\isactrlsub {\isadigit{1}}\ c\ v\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ v\isactrlsub {\isadigit{2}}}\\
+ − 806
\textit{(5)} & \isa{inj\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ c\ {\isacharparenleft}{\kern0pt}Left\ {\isacharparenleft}{\kern0pt}Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}} & $\dn$
+ − 807
& \isa{Seq\ {\isacharparenleft}{\kern0pt}inj\ r\isactrlsub {\isadigit{1}}\ c\ v\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ v\isactrlsub {\isadigit{2}}}\\
+ − 808
\textit{(6)} & \isa{inj\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ c\ {\isacharparenleft}{\kern0pt}Right\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$
+ − 809
& \isa{Seq\ {\isacharparenleft}{\kern0pt}mkeps\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}inj\ r\isactrlsub {\isadigit{2}}\ c\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 810
\textit{(7)} & \isa{inj\ {\isacharparenleft}{\kern0pt}r\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}\ c\ {\isacharparenleft}{\kern0pt}Seq\ v\ {\isacharparenleft}{\kern0pt}Stars\ vs{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}} & $\dn$
+ − 811
& \isa{Stars\ {\isacharparenleft}{\kern0pt}inj\ r\ c\ v\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}vs{\isacharparenright}{\kern0pt}}\\
+ − 812
\end{tabular}
+ − 813
\end{center}
+ − 814
+ − 815
\noindent To better understand what is going on in this definition it
+ − 816
might be instructive to look first at the three sequence cases (clauses
+ − 817
\textit{(4)} -- \textit{(6)}). In each case we need to construct an ``injected value'' for
+ − 818
\isa{r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}}. This must be a value of the form \isa{Seq\ \underline{\hspace{2mm}}\ \underline{\hspace{2mm}}}\,. Recall the clause of the \isa{derivative}-function
+ − 819
for sequence regular expressions:
+ − 820
+ − 821
\begin{center}
+ − 822
\isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}c} $\dn$ \isa{\textrm{if}\ nullable\ r\isactrlsub {\isadigit{1}}\ \textrm{then}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}\ {\isacharplus}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ \textrm{else}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}}
+ − 823
\end{center}
+ − 824
+ − 825
\noindent Consider first the \isa{else}-branch where the derivative is \isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}}. The corresponding value must therefore
+ − 826
be of the form \isa{Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}}, which matches the left-hand
+ − 827
side in clause~\textit{(4)} of \isa{inj}. In the \isa{if}-branch the derivative is an
+ − 828
alternative, namely \isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}\ {\isacharplus}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}}. This means we either have to consider a \isa{Left}- or
+ − 829
\isa{Right}-value. In case of the \isa{Left}-value we know further it
+ − 830
must be a value for a sequence regular expression. Therefore the pattern
+ − 831
we match in the clause \textit{(5)} is \isa{Left\ {\isacharparenleft}{\kern0pt}Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}},
+ − 832
while in \textit{(6)} it is just \isa{Right\ v\isactrlsub {\isadigit{2}}}. One more interesting
+ − 833
point is in the right-hand side of clause \textit{(6)}: since in this case the
+ − 834
regular expression \isa{r\isactrlsub {\isadigit{1}}} does not ``contribute'' to
+ − 835
matching the string, that means it only matches the empty string, we need to
+ − 836
call \isa{mkeps} in order to construct a value for how \isa{r\isactrlsub {\isadigit{1}}}
+ − 837
can match this empty string. A similar argument applies for why we can
+ − 838
expect in the left-hand side of clause \textit{(7)} that the value is of the form
+ − 839
\isa{Seq\ v\ {\isacharparenleft}{\kern0pt}Stars\ vs{\isacharparenright}{\kern0pt}}---the derivative of a star is \isa{{\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymcdot}\ r\isactrlsup {\isasymstar}}. Finally, the reason for why we can ignore the second argument
+ − 840
in clause \textit{(1)} of \isa{inj} is that it will only ever be called in cases
+ − 841
where \isa{c\ {\isacharequal}{\kern0pt}\ d}, but the usual linearity restrictions in patterns do
+ − 842
not allow us to build this constraint explicitly into our function
+ − 843
definition.\footnote{Sulzmann and Lu state this clause as \isa{inj\ c\ c\ {\isacharparenleft}{\kern0pt}Empty{\isacharparenright}{\kern0pt}} $\dn$ \isa{Char\ c},
+ − 844
but our deviation is harmless.}
+ − 845
+ − 846
The idea of the \isa{inj}-function to ``inject'' a character, say
+ − 847
\isa{c}, into a value can be made precise by the first part of the
+ − 848
following lemma, which shows that the underlying string of an injected
+ − 849
value has a prepended character \isa{c}; the second part shows that
+ − 850
the underlying string of an \isa{mkeps}-value is always the empty
+ − 851
string (given the regular expression is nullable since otherwise
+ − 852
\isa{mkeps} might not be defined).
+ − 853
+ − 854
\begin{lemma}\mbox{}\smallskip\\\label{Prf_injval_flat}
+ − 855
\begin{tabular}{ll}
+ − 856
(1) & \isa{{\normalsize{}If\,}\ v\ {\isacharcolon}{\kern0pt}\ r{\isacharbackslash}{\kern0pt}c\ {\normalsize \,then\,}\ {\isacharbar}{\kern0pt}inj\ r\ c\ v{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}{\isacharbar}{\kern0pt}v{\isacharbar}{\kern0pt}{\isachardot}{\kern0pt}}\\
+ − 857
(2) & \isa{{\normalsize{}If\,}\ nullable\ r\ {\normalsize \,then\,}\ {\isacharbar}{\kern0pt}mkeps\ r{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isachardot}{\kern0pt}}
+ − 858
\end{tabular}
+ − 859
\end{lemma}
+ − 860
+ − 861
\begin{proof}
+ − 862
Both properties are by routine inductions: the first one can, for example,
+ − 863
be proved by induction over the definition of \isa{derivatives}; the second by
+ − 864
an induction on \isa{r}. There are no interesting cases.\qed
+ − 865
\end{proof}
+ − 866
+ − 867
Having defined the \isa{mkeps} and \isa{inj} function we can extend
+ − 868
\Brz's matcher so that a value is constructed (assuming the
+ − 869
regular expression matches the string). The clauses of the Sulzmann and Lu lexer are
+ − 870
+ − 871
\begin{center}
+ − 872
\begin{tabular}{lcl}
+ − 873
\isa{lexer\ r\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}} & $\dn$ & \isa{\textrm{if}\ nullable\ r\ \textrm{then}\ Some\ {\isacharparenleft}{\kern0pt}mkeps\ r{\isacharparenright}{\kern0pt}\ \textrm{else}\ None}\\
+ − 874
\isa{lexer\ r\ {\isacharparenleft}{\kern0pt}c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{case} \isa{lexer\ {\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ s} \isa{of}\\
+ − 875
& & \phantom{$|$} \isa{None} \isa{{\isasymRightarrow}} \isa{None}\\
+ − 876
& & $|$ \isa{Some\ v} \isa{{\isasymRightarrow}} \isa{Some\ {\isacharparenleft}{\kern0pt}inj\ r\ c\ v{\isacharparenright}{\kern0pt}}
+ − 877
\end{tabular}
+ − 878
\end{center}
+ − 879
+ − 880
\noindent If the regular expression does not match the string, \isa{None} is
+ − 881
returned. If the regular expression \emph{does}
+ − 882
match the string, then \isa{Some} value is returned. One important
+ − 883
virtue of this algorithm is that it can be implemented with ease in any
+ − 884
functional programming language and also in Isabelle/HOL. In the remaining
+ − 885
part of this section we prove that this algorithm is correct.
+ − 886
+ − 887
The well-known idea of POSIX matching is informally defined by some
+ − 888
rules such as the Longest Match and Priority Rules (see
+ − 889
Introduction); as correctly argued in \cite{Sulzmann2014}, this
+ − 890
needs formal specification. Sulzmann and Lu define an ``ordering
+ − 891
relation'' between values and argue that there is a maximum value,
+ − 892
as given by the derivative-based algorithm. In contrast, we shall
+ − 893
introduce a simple inductive definition that specifies directly what
+ − 894
a \emph{POSIX value} is, incorporating the POSIX-specific choices
+ − 895
into the side-conditions of our rules. Our definition is inspired by
+ − 896
the matching relation given by Vansummeren~\cite{Vansummeren2006}.
+ − 897
The relation we define is ternary and
+ − 898
written as \mbox{\isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}}, relating
+ − 899
strings, regular expressions and values; the inductive rules are given in
+ − 900
Figure~\ref{POSIXrules}.
+ − 901
We can prove that given a string \isa{s} and regular expression \isa{r}, the POSIX value \isa{v} is uniquely determined by \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}.
+ − 902
+ − 903
%
+ − 904
\begin{figure}[t]
+ − 905
\begin{center}
+ − 906
\begin{tabular}{c}
+ − 907
\isa{\mbox{}\inferrule{\mbox{}}{\mbox{{\isacharparenleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharcomma}{\kern0pt}\ \isactrlbold {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Empty}}}\isa{P}\isa{\isactrlbold {\isadigit{1}}} \qquad
+ − 908
\isa{\mbox{}\inferrule{\mbox{}}{\mbox{{\isacharparenleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}c{\isacharbrackright}{\kern0pt}{\isacharcomma}{\kern0pt}\ c{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Char\ c}}}\isa{P}\isa{c}\medskip\\
+ − 909
\isa{\mbox{}\inferrule{\mbox{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}}{\mbox{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Left\ v}}}\isa{P{\isacharplus}{\kern0pt}L}\qquad
+ − 910
\isa{\mbox{}\inferrule{\mbox{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}\\\ \mbox{s\ {\isasymnotin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}}}{\mbox{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Right\ v}}}\isa{P{\isacharplus}{\kern0pt}R}\medskip\\
+ − 911
$\mprset{flushleft}
+ − 912
\inferrule
+ − 913
{\isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\isactrlsub {\isadigit{1}}} \qquad
+ − 914
\isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\isactrlsub {\isadigit{2}}} \\\\
+ − 915
\isa{{\isasymnexists}s\isactrlsub {\isadigit{3}}\ s\isactrlsub {\isadigit{4}}{\isachardot}{\kern0pt}a{\isachardot}{\kern0pt}\ s\isactrlsub {\isadigit{3}}\ {\isasymnoteq}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ {\isasymand}\ s\isactrlsub {\isadigit{3}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{4}}\ {\isacharequal}{\kern0pt}\ s\isactrlsub {\isadigit{2}}\ {\isasymand}\ s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{3}}\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymand}\ s\isactrlsub {\isadigit{4}}\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}}
+ − 916
{\isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}}}$\isa{PS}\\
+ − 917
\isa{\mbox{}\inferrule{\mbox{}}{\mbox{{\isacharparenleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharcomma}{\kern0pt}\ r\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Stars\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}}}}\isa{P{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}}\medskip\\
+ − 918
$\mprset{flushleft}
+ − 919
\inferrule
+ − 920
{\isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v} \qquad
+ − 921
\isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ r\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Stars\ vs} \qquad
+ − 922
\isa{{\isacharbar}{\kern0pt}v{\isacharbar}{\kern0pt}\ {\isasymnoteq}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}} \\\\
+ − 923
\isa{{\isasymnexists}s\isactrlsub {\isadigit{3}}\ s\isactrlsub {\isadigit{4}}{\isachardot}{\kern0pt}a{\isachardot}{\kern0pt}\ s\isactrlsub {\isadigit{3}}\ {\isasymnoteq}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ {\isasymand}\ s\isactrlsub {\isadigit{3}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{4}}\ {\isacharequal}{\kern0pt}\ s\isactrlsub {\isadigit{2}}\ {\isasymand}\ s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{3}}\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}\ {\isasymand}\ s\isactrlsub {\isadigit{4}}\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}}}
+ − 924
{\isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ r\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Stars\ {\isacharparenleft}{\kern0pt}v\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}vs{\isacharparenright}{\kern0pt}}}$\isa{P{\isasymstar}}
+ − 925
\end{tabular}
+ − 926
\end{center}
+ − 927
\caption{Our inductive definition of POSIX values.}\label{POSIXrules}
+ − 928
\end{figure}
+ − 929
+ − 930
+ − 931
+ − 932
\begin{theorem}\mbox{}\smallskip\\\label{posixdeterm}
+ − 933
\begin{tabular}{ll}
+ − 934
(1) & If \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v} then \isa{s\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}} and \isa{{\isacharbar}{\kern0pt}v{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ s}.\\
+ − 935
(2) & \isa{{\normalsize{}If\,}\ \mbox{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}\ {\normalsize \,and\,}\ \mbox{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v{\isacharprime}{\kern0pt}}\ {\normalsize \,then\,}\ v\ {\isacharequal}{\kern0pt}\ v{\isacharprime}{\kern0pt}{\isachardot}{\kern0pt}}
+ − 936
\end{tabular}
+ − 937
\end{theorem}
+ − 938
+ − 939
\begin{proof} Both by induction on the definition of \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}.
+ − 940
The second parts follows by a case analysis of \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v{\isacharprime}{\kern0pt}} and
+ − 941
the first part.\qed
+ − 942
\end{proof}
+ − 943
+ − 944
\noindent
+ − 945
We claim that our \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v} relation captures the idea behind the four
+ − 946
informal POSIX rules shown in the Introduction: Consider for example the
+ − 947
rules \isa{P{\isacharplus}{\kern0pt}L} and \isa{P{\isacharplus}{\kern0pt}R} where the POSIX value for a string
+ − 948
and an alternative regular expression, that is \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}},
+ − 949
is specified---it is always a \isa{Left}-value, \emph{except} when the
+ − 950
string to be matched is not in the language of \isa{r\isactrlsub {\isadigit{1}}}; only then it
+ − 951
is a \isa{Right}-value (see the side-condition in \isa{P{\isacharplus}{\kern0pt}R}).
+ − 952
Interesting is also the rule for sequence regular expressions (\isa{PS}). The first two premises state that \isa{v\isactrlsub {\isadigit{1}}} and \isa{v\isactrlsub {\isadigit{2}}}
+ − 953
are the POSIX values for \isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}} and \isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}
+ − 954
respectively. Consider now the third premise and note that the POSIX value
+ − 955
of this rule should match the string \mbox{\isa{s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}}}. According to the
+ − 956
Longest Match Rule, we want that the \isa{s\isactrlsub {\isadigit{1}}} is the longest initial
+ − 957
split of \mbox{\isa{s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}}} such that \isa{s\isactrlsub {\isadigit{2}}} is still recognised
+ − 958
by \isa{r\isactrlsub {\isadigit{2}}}. Let us assume, contrary to the third premise, that there
+ − 959
\emph{exist} an \isa{s\isactrlsub {\isadigit{3}}} and \isa{s\isactrlsub {\isadigit{4}}} such that \isa{s\isactrlsub {\isadigit{2}}}
+ − 960
can be split up into a non-empty string \isa{s\isactrlsub {\isadigit{3}}} and a possibly empty
+ − 961
string \isa{s\isactrlsub {\isadigit{4}}}. Moreover the longer string \isa{s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{3}}} can be
+ − 962
matched by \isa{r\isactrlsub {\isadigit{1}}} and the shorter \isa{s\isactrlsub {\isadigit{4}}} can still be
+ − 963
matched by \isa{r\isactrlsub {\isadigit{2}}}. In this case \isa{s\isactrlsub {\isadigit{1}}} would \emph{not} be the
+ − 964
longest initial split of \mbox{\isa{s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}}} and therefore \isa{Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}} cannot be a POSIX value for \isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}.
+ − 965
The main point is that our side-condition ensures the Longest
+ − 966
Match Rule is satisfied.
+ − 967
+ − 968
A similar condition is imposed on the POSIX value in the \isa{P{\isasymstar}}-rule. Also there we want that \isa{s\isactrlsub {\isadigit{1}}} is the longest initial
+ − 969
split of \isa{s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}} and furthermore the corresponding value
+ − 970
\isa{v} cannot be flattened to the empty string. In effect, we require
+ − 971
that in each ``iteration'' of the star, some non-empty substring needs to
+ − 972
be ``chipped'' away; only in case of the empty string we accept \isa{Stars\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}} as the POSIX value. Indeed we can show that our POSIX values
+ − 973
are lexical values which exclude those \isa{Stars} that contain subvalues
+ − 974
that flatten to the empty string.
+ − 975
+ − 976
\begin{lemma}\label{LVposix}
+ − 977
\isa{{\normalsize{}If\,}\ {\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\ {\normalsize \,then\,}\ v\ {\isasymin}\ LV\ r\ s{\isachardot}{\kern0pt}}
+ − 978
\end{lemma}
+ − 979
+ − 980
\begin{proof}
+ − 981
By routine induction on \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}.\qed
+ − 982
\end{proof}
+ − 983
+ − 984
\noindent
+ − 985
Next is the lemma that shows the function \isa{mkeps} calculates
+ − 986
the POSIX value for the empty string and a nullable regular expression.
+ − 987
+ − 988
\begin{lemma}\label{lemmkeps}
+ − 989
\isa{{\normalsize{}If\,}\ nullable\ r\ {\normalsize \,then\,}\ {\isacharparenleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ mkeps\ r{\isachardot}{\kern0pt}}
+ − 990
\end{lemma}
+ − 991
+ − 992
\begin{proof}
+ − 993
By routine induction on \isa{r}.\qed
+ − 994
\end{proof}
+ − 995
+ − 996
\noindent
+ − 997
The central lemma for our POSIX relation is that the \isa{inj}-function
+ − 998
preserves POSIX values.
+ − 999
+ − 1000
\begin{lemma}\label{Posix2}
+ − 1001
\isa{{\normalsize{}If\,}\ {\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\ {\normalsize \,then\,}\ {\isacharparenleft}{\kern0pt}c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ inj\ r\ c\ v{\isachardot}{\kern0pt}}
+ − 1002
\end{lemma}
+ − 1003
+ − 1004
\begin{proof}
+ − 1005
By induction on \isa{r}. We explain two cases.
+ − 1006
+ − 1007
\begin{itemize}
+ − 1008
\item[$\bullet$] Case \isa{r\ {\isacharequal}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}}. There are
+ − 1009
two subcases, namely \isa{{\isacharparenleft}{\kern0pt}a{\isacharparenright}{\kern0pt}} \mbox{\isa{v\ {\isacharequal}{\kern0pt}\ Left\ v{\isacharprime}{\kern0pt}}} and \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v{\isacharprime}{\kern0pt}}; and \isa{{\isacharparenleft}{\kern0pt}b{\isacharparenright}{\kern0pt}} \isa{v\ {\isacharequal}{\kern0pt}\ Right\ v{\isacharprime}{\kern0pt}}, \isa{s\ {\isasymnotin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}} and \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v{\isacharprime}{\kern0pt}}. In \isa{{\isacharparenleft}{\kern0pt}a{\isacharparenright}{\kern0pt}} we
+ − 1010
know \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v{\isacharprime}{\kern0pt}}, from which we can infer \isa{{\isacharparenleft}{\kern0pt}c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ inj\ r\isactrlsub {\isadigit{1}}\ c\ v{\isacharprime}{\kern0pt}} by induction hypothesis and hence \isa{{\isacharparenleft}{\kern0pt}c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ inj\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ c\ {\isacharparenleft}{\kern0pt}Left\ v{\isacharprime}{\kern0pt}{\isacharparenright}{\kern0pt}} as needed. Similarly
+ − 1011
in subcase \isa{{\isacharparenleft}{\kern0pt}b{\isacharparenright}{\kern0pt}} where, however, in addition we have to use
+ − 1012
Proposition~\ref{derprop}(2) in order to infer \isa{c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s\ {\isasymnotin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}} from \isa{s\ {\isasymnotin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}}.\smallskip
+ − 1013
+ − 1014
\item[$\bullet$] Case \isa{r\ {\isacharequal}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}}. There are three subcases:
+ − 1015
+ − 1016
\begin{quote}
+ − 1017
\begin{description}
+ − 1018
\item[\isa{{\isacharparenleft}{\kern0pt}a{\isacharparenright}{\kern0pt}}] \isa{v\ {\isacharequal}{\kern0pt}\ Left\ {\isacharparenleft}{\kern0pt}Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} and \isa{nullable\ r\isactrlsub {\isadigit{1}}}
+ − 1019
\item[\isa{{\isacharparenleft}{\kern0pt}b{\isacharparenright}{\kern0pt}}] \isa{v\ {\isacharequal}{\kern0pt}\ Right\ v\isactrlsub {\isadigit{1}}} and \isa{nullable\ r\isactrlsub {\isadigit{1}}}
+ − 1020
\item[\isa{{\isacharparenleft}{\kern0pt}c{\isacharparenright}{\kern0pt}}] \isa{v\ {\isacharequal}{\kern0pt}\ Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}} and \isa{{\isasymnot}\ nullable\ r\isactrlsub {\isadigit{1}}}
+ − 1021
\end{description}
+ − 1022
\end{quote}
+ − 1023
+ − 1024
\noindent For \isa{{\isacharparenleft}{\kern0pt}a{\isacharparenright}{\kern0pt}} we know \isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\isactrlsub {\isadigit{1}}} and
+ − 1025
\isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\isactrlsub {\isadigit{2}}} as well as
+ − 1026
%
+ − 1027
\[\isa{{\isasymnexists}s\isactrlsub {\isadigit{3}}\ s\isactrlsub {\isadigit{4}}{\isachardot}{\kern0pt}a{\isachardot}{\kern0pt}\ s\isactrlsub {\isadigit{3}}\ {\isasymnoteq}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ {\isasymand}\ s\isactrlsub {\isadigit{3}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{4}}\ {\isacharequal}{\kern0pt}\ s\isactrlsub {\isadigit{2}}\ {\isasymand}\ s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{3}}\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymand}\ s\isactrlsub {\isadigit{4}}\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\]
+ − 1028
+ − 1029
\noindent From the latter we can infer by Proposition~\ref{derprop}(2):
+ − 1030
%
+ − 1031
\[\isa{{\isasymnexists}s\isactrlsub {\isadigit{3}}\ s\isactrlsub {\isadigit{4}}{\isachardot}{\kern0pt}a{\isachardot}{\kern0pt}\ s\isactrlsub {\isadigit{3}}\ {\isasymnoteq}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ {\isasymand}\ s\isactrlsub {\isadigit{3}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{4}}\ {\isacharequal}{\kern0pt}\ s\isactrlsub {\isadigit{2}}\ {\isasymand}\ c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{3}}\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymand}\ s\isactrlsub {\isadigit{4}}\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\]
+ − 1032
+ − 1033
\noindent We can use the induction hypothesis for \isa{r\isactrlsub {\isadigit{1}}} to obtain
+ − 1034
\isa{{\isacharparenleft}{\kern0pt}c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ inj\ r\isactrlsub {\isadigit{1}}\ c\ v\isactrlsub {\isadigit{1}}}. Putting this all together allows us to infer
+ − 1035
\isa{{\isacharparenleft}{\kern0pt}c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Seq\ {\isacharparenleft}{\kern0pt}inj\ r\isactrlsub {\isadigit{1}}\ c\ v\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ v\isactrlsub {\isadigit{2}}}. The case \isa{{\isacharparenleft}{\kern0pt}c{\isacharparenright}{\kern0pt}}
+ − 1036
is similar.
+ − 1037
+ − 1038
For \isa{{\isacharparenleft}{\kern0pt}b{\isacharparenright}{\kern0pt}} we know \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\isactrlsub {\isadigit{1}}} and
+ − 1039
\isa{s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}\ {\isasymnotin}\ L{\isacharparenleft}{\kern0pt}{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}. From the former
+ − 1040
we have \isa{{\isacharparenleft}{\kern0pt}c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ inj\ r\isactrlsub {\isadigit{2}}\ c\ v\isactrlsub {\isadigit{1}}} by induction hypothesis
+ − 1041
for \isa{r\isactrlsub {\isadigit{2}}}. From the latter we can infer
+ − 1042
%
+ − 1043
\[\isa{{\isasymnexists}s\isactrlsub {\isadigit{3}}\ s\isactrlsub {\isadigit{4}}{\isachardot}{\kern0pt}a{\isachardot}{\kern0pt}\ s\isactrlsub {\isadigit{3}}\ {\isasymnoteq}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ {\isasymand}\ s\isactrlsub {\isadigit{3}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{4}}\ {\isacharequal}{\kern0pt}\ c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s\ {\isasymand}\ s\isactrlsub {\isadigit{3}}\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymand}\ s\isactrlsub {\isadigit{4}}\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\]
+ − 1044
+ − 1045
\noindent By Lemma~\ref{lemmkeps} we know \isa{{\isacharparenleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ mkeps\ r\isactrlsub {\isadigit{1}}}
+ − 1046
holds. Putting this all together, we can conclude with \isa{{\isacharparenleft}{\kern0pt}c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Seq\ {\isacharparenleft}{\kern0pt}mkeps\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}inj\ r\isactrlsub {\isadigit{2}}\ c\ v\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}}, as required.
+ − 1047
+ − 1048
Finally suppose \isa{r\ {\isacharequal}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\isactrlsup {\isasymstar}}. This case is very similar to the
+ − 1049
sequence case, except that we need to also ensure that \isa{{\isacharbar}{\kern0pt}inj\ r\isactrlsub {\isadigit{1}}\ c\ v\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}\ {\isasymnoteq}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}}. This follows from \isa{{\isacharparenleft}{\kern0pt}c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ inj\ r\isactrlsub {\isadigit{1}}\ c\ v\isactrlsub {\isadigit{1}}} (which in turn follows from \isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\isactrlsub {\isadigit{1}}} and the induction hypothesis).\qed
+ − 1050
\end{itemize}
+ − 1051
\end{proof}
+ − 1052
+ − 1053
\noindent
+ − 1054
With Lemma~\ref{Posix2} in place, it is completely routine to establish
+ − 1055
that the Sulzmann and Lu lexer satisfies our specification (returning
+ − 1056
the null value \isa{None} iff the string is not in the language of the regular expression,
+ − 1057
and returning a unique POSIX value iff the string \emph{is} in the language):
+ − 1058
+ − 1059
\begin{theorem}\mbox{}\smallskip\\\label{lexercorrect}
+ − 1060
\begin{tabular}{ll}
+ − 1061
(1) & \isa{s\ {\isasymnotin}\ L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}} if and only if \isa{lexer\ r\ s\ {\isacharequal}{\kern0pt}\ None}\\
+ − 1062
(2) & \isa{s\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}} if and only if \isa{{\isasymexists}v{\isachardot}{\kern0pt}\ lexer\ r\ s\ {\isacharequal}{\kern0pt}\ Some\ v\ {\isasymand}\ {\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}\\
+ − 1063
\end{tabular}
+ − 1064
\end{theorem}
+ − 1065
+ − 1066
\begin{proof}
+ − 1067
By induction on \isa{s} using Lemma~\ref{lemmkeps} and \ref{Posix2}.\qed
+ − 1068
\end{proof}
+ − 1069
+ − 1070
\noindent In \textit{(2)} we further know by Theorem~\ref{posixdeterm} that the
+ − 1071
value returned by the lexer must be unique. A simple corollary
+ − 1072
of our two theorems is:
+ − 1073
+ − 1074
\begin{corollary}\mbox{}\smallskip\\\label{lexercorrectcor}
+ − 1075
\begin{tabular}{ll}
+ − 1076
(1) & \isa{lexer\ r\ s\ {\isacharequal}{\kern0pt}\ None} if and only if \isa{{\isasymnexists}v{\isachardot}{\kern0pt}a{\isachardot}{\kern0pt}\ {\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}\\
+ − 1077
(2) & \isa{lexer\ r\ s\ {\isacharequal}{\kern0pt}\ Some\ v} if and only if \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}\\
+ − 1078
\end{tabular}
+ − 1079
\end{corollary}
+ − 1080
+ − 1081
\noindent This concludes our correctness proof. Note that we have
+ − 1082
not changed the algorithm of Sulzmann and Lu,\footnote{All
+ − 1083
deviations we introduced are harmless.} but introduced our own
+ − 1084
specification for what a correct result---a POSIX value---should be.
+ − 1085
In the next section we show that our specification coincides with
+ − 1086
another one given by Okui and Suzuki using a different technique.%
+ − 1087
\end{isamarkuptext}\isamarkuptrue%
+ − 1088
%
+ − 1089
\isadelimdocument
+ − 1090
%
+ − 1091
\endisadelimdocument
+ − 1092
%
+ − 1093
\isatagdocument
+ − 1094
%
+ − 1095
\isamarkupsection{Ordering of Values according to Okui and Suzuki%
+ − 1096
}
+ − 1097
\isamarkuptrue%
+ − 1098
%
+ − 1099
\endisatagdocument
+ − 1100
{\isafolddocument}%
+ − 1101
%
+ − 1102
\isadelimdocument
+ − 1103
%
+ − 1104
\endisadelimdocument
+ − 1105
%
+ − 1106
\begin{isamarkuptext}%
+ − 1107
While in the previous section we have defined POSIX values directly
+ − 1108
in terms of a ternary relation (see inference rules in Figure~\ref{POSIXrules}),
+ − 1109
Sulzmann and Lu took a different approach in \cite{Sulzmann2014}:
+ − 1110
they introduced an ordering for values and identified POSIX values
+ − 1111
as the maximal elements. An extended version of \cite{Sulzmann2014}
+ − 1112
is available at the website of its first author; this includes more
+ − 1113
details of their proofs, but which are evidently not in final form
+ − 1114
yet. Unfortunately, we were not able to verify claims that their
+ − 1115
ordering has properties such as being transitive or having maximal
+ − 1116
elements.
+ − 1117
+ − 1118
Okui and Suzuki \cite{OkuiSuzuki2010,OkuiSuzukiTech} described
+ − 1119
another ordering of values, which they use to establish the
+ − 1120
correctness of their automata-based algorithm for POSIX matching.
+ − 1121
Their ordering resembles some aspects of the one given by Sulzmann
+ − 1122
and Lu, but overall is quite different. To begin with, Okui and
+ − 1123
Suzuki identify POSIX values as minimal, rather than maximal,
+ − 1124
elements in their ordering. A more substantial difference is that
+ − 1125
the ordering by Okui and Suzuki uses \emph{positions} in order to
+ − 1126
identify and compare subvalues. Positions are lists of natural
+ − 1127
numbers. This allows them to quite naturally formalise the Longest
+ − 1128
Match and Priority rules of the informal POSIX standard. Consider
+ − 1129
for example the value \isa{v}
+ − 1130
+ − 1131
\begin{center}
+ − 1132
\isa{v\ {\isasymequiv}\ Stars\ {\isacharbrackleft}{\kern0pt}Seq\ {\isacharparenleft}{\kern0pt}Char\ x{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}Char\ y{\isacharparenright}{\kern0pt}{\isacharcomma}{\kern0pt}\ Char\ z{\isacharbrackright}{\kern0pt}}
+ − 1133
\end{center}
+ − 1134
+ − 1135
\noindent
+ − 1136
At position \isa{{\isacharbrackleft}{\kern0pt}{\isadigit{0}}{\isacharcomma}{\kern0pt}{\isadigit{1}}{\isacharbrackright}{\kern0pt}} of this value is the
+ − 1137
subvalue \isa{Char\ y} and at position \isa{{\isacharbrackleft}{\kern0pt}{\isadigit{1}}{\isacharbrackright}{\kern0pt}} the
+ − 1138
subvalue \isa{Char\ z}. At the `root' position, or empty list
+ − 1139
\isa{{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}}, is the whole value \isa{v}. Positions such as \isa{{\isacharbrackleft}{\kern0pt}{\isadigit{0}}{\isacharcomma}{\kern0pt}{\isadigit{1}}{\isacharcomma}{\kern0pt}{\isadigit{0}}{\isacharbrackright}{\kern0pt}} or \isa{{\isacharbrackleft}{\kern0pt}{\isadigit{2}}{\isacharbrackright}{\kern0pt}} are outside of \isa{v}. If it exists, the subvalue of \isa{v} at a position \isa{p}, written \isa{v\mbox{$\downharpoonleft$}\isactrlbsub p\isactrlesub }, can be recursively defined by
+ − 1140
+ − 1141
\begin{center}
+ − 1142
\begin{tabular}{r@ {\hspace{0mm}}lcl}
+ − 1143
\isa{v} & \isa{{\isasymdownharpoonleft}\isactrlbsub {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\isactrlesub } & \isa{{\isasymequiv}}& \isa{v}\\
+ − 1144
\isa{Left\ v} & \isa{{\isasymdownharpoonleft}\isactrlbsub {\isadigit{0}}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}ps\isactrlesub } & \isa{{\isasymequiv}}& \isa{v\mbox{$\downharpoonleft$}\isactrlbsub ps\isactrlesub }\\
+ − 1145
\isa{Right\ v} & \isa{{\isasymdownharpoonleft}\isactrlbsub {\isadigit{1}}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}ps\isactrlesub } & \isa{{\isasymequiv}} &
+ − 1146
\isa{v\mbox{$\downharpoonleft$}\isactrlbsub ps\isactrlesub }\\
+ − 1147
\isa{Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}} & \isa{{\isasymdownharpoonleft}\isactrlbsub {\isadigit{0}}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}ps\isactrlesub } & \isa{{\isasymequiv}} &
+ − 1148
\isa{v\isactrlsub {\isadigit{1}}\mbox{$\downharpoonleft$}\isactrlbsub ps\isactrlesub } \\
+ − 1149
\isa{Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}} & \isa{{\isasymdownharpoonleft}\isactrlbsub {\isadigit{1}}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}ps\isactrlesub }
+ − 1150
& \isa{{\isasymequiv}} &
+ − 1151
\isa{v\isactrlsub {\isadigit{2}}\mbox{$\downharpoonleft$}\isactrlbsub ps\isactrlesub } \\
+ − 1152
\isa{Stars\ vs} & \isa{{\isasymdownharpoonleft}\isactrlbsub n{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}ps\isactrlesub } & \isa{{\isasymequiv}}& \isa{vs\ensuremath{_{[\mathit{n}]}}\mbox{$\downharpoonleft$}\isactrlbsub ps\isactrlesub }\\
+ − 1153
\end{tabular}
+ − 1154
\end{center}
+ − 1155
+ − 1156
\noindent In the last clause we use Isabelle's notation \isa{vs\ensuremath{_{[\mathit{n}]}}} for the
+ − 1157
\isa{n}th element in a list. The set of positions inside a value \isa{v},
+ − 1158
written \isa{Pos\ v}, is given by
+ − 1159
+ − 1160
\begin{center}
+ − 1161
\begin{tabular}{lcl}
+ − 1162
\isa{Pos\ {\isacharparenleft}{\kern0pt}Empty{\isacharparenright}{\kern0pt}} & \isa{{\isasymequiv}} & \isa{{\isacharbraceleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}}\\
+ − 1163
\isa{Pos\ {\isacharparenleft}{\kern0pt}Char\ c{\isacharparenright}{\kern0pt}} & \isa{{\isasymequiv}} & \isa{{\isacharbraceleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}}\\
+ − 1164
\isa{Pos\ {\isacharparenleft}{\kern0pt}Left\ v{\isacharparenright}{\kern0pt}} & \isa{{\isasymequiv}} & \isa{{\isacharbraceleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isasymunion}\ {\isacharbraceleft}{\kern0pt}{\isadigit{0}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}ps\ \mbox{\boldmath$\mid$}\ ps\ {\isasymin}\ Pos\ v{\isacharbraceright}{\kern0pt}}\\
+ − 1165
\isa{Pos\ {\isacharparenleft}{\kern0pt}Right\ v{\isacharparenright}{\kern0pt}} & \isa{{\isasymequiv}} & \isa{{\isacharbraceleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isasymunion}\ {\isacharbraceleft}{\kern0pt}{\isadigit{1}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}ps\ \mbox{\boldmath$\mid$}\ ps\ {\isasymin}\ Pos\ v{\isacharbraceright}{\kern0pt}}\\
+ − 1166
\isa{Pos\ {\isacharparenleft}{\kern0pt}Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}
+ − 1167
& \isa{{\isasymequiv}}
+ − 1168
& \isa{{\isacharbraceleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isasymunion}\ {\isacharbraceleft}{\kern0pt}{\isadigit{0}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}ps\ \mbox{\boldmath$\mid$}\ ps\ {\isasymin}\ Pos\ v\isactrlsub {\isadigit{1}}{\isacharbraceright}{\kern0pt}\ {\isasymunion}\ {\isacharbraceleft}{\kern0pt}{\isadigit{1}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}ps\ \mbox{\boldmath$\mid$}\ ps\ {\isasymin}\ Pos\ v\isactrlsub {\isadigit{2}}{\isacharbraceright}{\kern0pt}}\\
+ − 1169
\isa{Pos\ {\isacharparenleft}{\kern0pt}Stars\ vs{\isacharparenright}{\kern0pt}} & \isa{{\isasymequiv}} & \isa{{\isacharbraceleft}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isasymunion}\ {\isacharparenleft}{\kern0pt}{\isasymUnion}n\ {\isacharless}{\kern0pt}\ len\ vs\ {\isacharbraceleft}{\kern0pt}n\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}ps\ \mbox{\boldmath$\mid$}\ ps\ {\isasymin}\ Pos\ vs\ensuremath{_{[\mathit{n}]}}{\isacharbraceright}{\kern0pt}{\isacharparenright}{\kern0pt}}\\
+ − 1170
\end{tabular}
+ − 1171
\end{center}
+ − 1172
+ − 1173
\noindent
+ − 1174
whereby \isa{len} in the last clause stands for the length of a list. Clearly
+ − 1175
for every position inside a value there exists a subvalue at that position.
+ − 1176
+ − 1177
+ − 1178
To help understanding the ordering of Okui and Suzuki, consider again
+ − 1179
the earlier value
+ − 1180
\isa{v} and compare it with the following \isa{w}:
+ − 1181
+ − 1182
\begin{center}
+ − 1183
\begin{tabular}{l}
+ − 1184
\isa{v\ {\isasymequiv}\ Stars\ {\isacharbrackleft}{\kern0pt}Seq\ {\isacharparenleft}{\kern0pt}Char\ x{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}Char\ y{\isacharparenright}{\kern0pt}{\isacharcomma}{\kern0pt}\ Char\ z{\isacharbrackright}{\kern0pt}}\\
+ − 1185
\isa{w\ {\isasymequiv}\ Stars\ {\isacharbrackleft}{\kern0pt}Char\ x{\isacharcomma}{\kern0pt}\ Char\ y{\isacharcomma}{\kern0pt}\ Char\ z{\isacharbrackright}{\kern0pt}}
+ − 1186
\end{tabular}
+ − 1187
\end{center}
+ − 1188
+ − 1189
\noindent Both values match the string \isa{xyz}, that means if
+ − 1190
we flatten these values at their respective root position, we obtain
+ − 1191
\isa{xyz}. However, at position \isa{{\isacharbrackleft}{\kern0pt}{\isadigit{0}}{\isacharbrackright}{\kern0pt}}, \isa{v} matches
+ − 1192
\isa{xy} whereas \isa{w} matches only the shorter \isa{x}. So
+ − 1193
according to the Longest Match Rule, we should prefer \isa{v},
+ − 1194
rather than \isa{w} as POSIX value for string \isa{xyz} (and
+ − 1195
corresponding regular expression). In order to
+ − 1196
formalise this idea, Okui and Suzuki introduce a measure for
+ − 1197
subvalues at position \isa{p}, called the \emph{norm} of \isa{v}
+ − 1198
at position \isa{p}. We can define this measure in Isabelle as an
+ − 1199
integer as follows
+ − 1200
+ − 1201
\begin{center}
+ − 1202
\isa{{\isasymparallel}v{\isasymparallel}\isactrlbsub p\isactrlesub \ {\isasymequiv}\ \textrm{if}\ p\ {\isasymin}\ Pos\ v\ \textrm{then}\ len\ {\isacharbar}{\kern0pt}v\mbox{$\downharpoonleft$}\isactrlbsub p\isactrlesub {\isacharbar}{\kern0pt}\ \textrm{else}\ {\isacharminus}{\kern0pt}\ {\isadigit{1}}}
+ − 1203
\end{center}
+ − 1204
+ − 1205
\noindent where we take the length of the flattened value at
+ − 1206
position \isa{p}, provided the position is inside \isa{v}; if
+ − 1207
not, then the norm is \isa{{\isacharminus}{\kern0pt}{\isadigit{1}}}. The default for outside
+ − 1208
positions is crucial for the POSIX requirement of preferring a
+ − 1209
\isa{Left}-value over a \isa{Right}-value (if they can match the
+ − 1210
same string---see the Priority Rule from the Introduction). For this
+ − 1211
consider
+ − 1212
+ − 1213
\begin{center}
+ − 1214
\isa{v\ {\isasymequiv}\ Left\ {\isacharparenleft}{\kern0pt}Char\ x{\isacharparenright}{\kern0pt}} \qquad and \qquad \isa{w\ {\isasymequiv}\ Right\ {\isacharparenleft}{\kern0pt}Char\ x{\isacharparenright}{\kern0pt}}
+ − 1215
\end{center}
+ − 1216
+ − 1217
\noindent Both values match \isa{x}. At position \isa{{\isacharbrackleft}{\kern0pt}{\isadigit{0}}{\isacharbrackright}{\kern0pt}}
+ − 1218
the norm of \isa{v} is \isa{{\isadigit{1}}} (the subvalue matches \isa{x}),
+ − 1219
but the norm of \isa{w} is \isa{{\isacharminus}{\kern0pt}{\isadigit{1}}} (the position is outside
+ − 1220
\isa{w} according to how we defined the `inside' positions of
+ − 1221
\isa{Left}- and \isa{Right}-values). Of course at position
+ − 1222
\isa{{\isacharbrackleft}{\kern0pt}{\isadigit{1}}{\isacharbrackright}{\kern0pt}}, the norms \isa{{\isasymparallel}v{\isasymparallel}\isactrlbsub {\isacharbrackleft}{\kern0pt}{\isadigit{1}}{\isacharbrackright}{\kern0pt}\isactrlesub } and \isa{{\isasymparallel}w{\isasymparallel}\isactrlbsub {\isacharbrackleft}{\kern0pt}{\isadigit{1}}{\isacharbrackright}{\kern0pt}\isactrlesub } are reversed, but the point is that subvalues
+ − 1223
will be analysed according to lexicographically ordered
+ − 1224
positions. According to this ordering, the position \isa{{\isacharbrackleft}{\kern0pt}{\isadigit{0}}{\isacharbrackright}{\kern0pt}}
+ − 1225
takes precedence over \isa{{\isacharbrackleft}{\kern0pt}{\isadigit{1}}{\isacharbrackright}{\kern0pt}} and thus also \isa{v} will be
+ − 1226
preferred over \isa{w}. The lexicographic ordering of positions, written
+ − 1227
\isa{\underline{\hspace{2mm}}\ {\isasymprec}\isactrlbsub lex\isactrlesub \ \underline{\hspace{2mm}}}, can be conveniently formalised
+ − 1228
by three inference rules
+ − 1229
+ − 1230
\begin{center}
+ − 1231
\begin{tabular}{ccc}
+ − 1232
\isa{\mbox{}\inferrule{\mbox{}}{\mbox{{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ {\isasymprec}\isactrlbsub lex\isactrlesub \ p\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}ps}}}\hspace{1cm} &
+ − 1233
\isa{\mbox{}\inferrule{\mbox{p\isactrlsub {\isadigit{1}}\ {\isacharless}{\kern0pt}\ p\isactrlsub {\isadigit{2}}}}{\mbox{p\isactrlsub {\isadigit{1}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}ps\isactrlsub {\isadigit{1}}\ {\isasymprec}\isactrlbsub lex\isactrlesub \ p\isactrlsub {\isadigit{2}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}ps\isactrlsub {\isadigit{2}}}}}\hspace{1cm} &
+ − 1234
\isa{\mbox{}\inferrule{\mbox{ps\isactrlsub {\isadigit{1}}\ {\isasymprec}\isactrlbsub lex\isactrlesub \ ps\isactrlsub {\isadigit{2}}}}{\mbox{p\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}ps\isactrlsub {\isadigit{1}}\ {\isasymprec}\isactrlbsub lex\isactrlesub \ p\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}ps\isactrlsub {\isadigit{2}}}}}
+ − 1235
\end{tabular}
+ − 1236
\end{center}
+ − 1237
+ − 1238
With the norm and lexicographic order in place,
+ − 1239
we can state the key definition of Okui and Suzuki
+ − 1240
\cite{OkuiSuzuki2010}: a value \isa{v\isactrlsub {\isadigit{1}}} is \emph{smaller at position \isa{p}} than
+ − 1241
\isa{v\isactrlsub {\isadigit{2}}}, written \isa{v\isactrlsub {\isadigit{1}}\ {\isasymprec}\isactrlbsub p\isactrlesub \ v\isactrlsub {\isadigit{2}}},
+ − 1242
if and only if $(i)$ the norm at position \isa{p} is
+ − 1243
greater in \isa{v\isactrlsub {\isadigit{1}}} (that is the string \isa{{\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{1}}\mbox{$\downharpoonleft$}\isactrlbsub p\isactrlesub {\isacharbar}{\kern0pt}} is longer
+ − 1244
than \isa{{\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{2}}\mbox{$\downharpoonleft$}\isactrlbsub p\isactrlesub {\isacharbar}{\kern0pt}}) and $(ii)$ all subvalues at
+ − 1245
positions that are inside \isa{v\isactrlsub {\isadigit{1}}} or \isa{v\isactrlsub {\isadigit{2}}} and that are
+ − 1246
lexicographically smaller than \isa{p}, we have the same norm, namely
+ − 1247
+ − 1248
\begin{center}
+ − 1249
\begin{tabular}{c}
+ − 1250
\isa{v\isactrlsub {\isadigit{1}}\ {\isasymprec}\isactrlbsub p\isactrlesub \ v\isactrlsub {\isadigit{2}}}
+ − 1251
\isa{{\isasymequiv}}
+ − 1252
$\begin{cases}
+ − 1253
(i) & \isa{{\isasymparallel}v\isactrlsub {\isadigit{2}}{\isasymparallel}\isactrlbsub p\isactrlesub \ {\isacharless}{\kern0pt}\ {\isasymparallel}v\isactrlsub {\isadigit{1}}{\isasymparallel}\isactrlbsub p\isactrlesub } \quad\text{and}\smallskip \\
+ − 1254
(ii) & \isa{{\isasymforall}q{\isasymin}Pos\ v\isactrlsub {\isadigit{1}}\ {\isasymunion}\ Pos\ v\isactrlsub {\isadigit{2}}{\isachardot}{\kern0pt}\ q\ {\isasymprec}\isactrlbsub lex\isactrlesub \ p\ {\isasymlongrightarrow}\ {\isasymparallel}v\isactrlsub {\isadigit{1}}{\isasymparallel}\isactrlbsub q\isactrlesub \ {\isacharequal}{\kern0pt}\ {\isasymparallel}v\isactrlsub {\isadigit{2}}{\isasymparallel}\isactrlbsub q\isactrlesub }
+ − 1255
\end{cases}$
+ − 1256
\end{tabular}
+ − 1257
\end{center}
+ − 1258
+ − 1259
\noindent The position \isa{p} in this definition acts as the
+ − 1260
\emph{first distinct position} of \isa{v\isactrlsub {\isadigit{1}}} and \isa{v\isactrlsub {\isadigit{2}}}, where both values match strings of different length
+ − 1261
\cite{OkuiSuzuki2010}. Since at \isa{p} the values \isa{v\isactrlsub {\isadigit{1}}} and \isa{v\isactrlsub {\isadigit{2}}} match different strings, the
+ − 1262
ordering is irreflexive. Derived from the definition above
+ − 1263
are the following two orderings:
+ − 1264
+ − 1265
\begin{center}
+ − 1266
\begin{tabular}{l}
+ − 1267
\isa{v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ v\isactrlsub {\isadigit{2}}\ {\isasymequiv}\ {\isasymexists}p{\isachardot}{\kern0pt}\ v\isactrlsub {\isadigit{1}}\ {\isasymprec}\isactrlbsub p\isactrlesub \ v\isactrlsub {\isadigit{2}}}\\
+ − 1268
\isa{v\isactrlsub {\isadigit{1}}\ \mbox{$\preccurlyeq$}\ v\isactrlsub {\isadigit{2}}\ {\isasymequiv}\ v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ v\isactrlsub {\isadigit{2}}\ {\isasymor}\ v\isactrlsub {\isadigit{1}}\ {\isacharequal}{\kern0pt}\ v\isactrlsub {\isadigit{2}}}
+ − 1269
\end{tabular}
+ − 1270
\end{center}
+ − 1271
+ − 1272
While we encountered a number of obstacles for establishing properties like
+ − 1273
transitivity for the ordering of Sulzmann and Lu (and which we failed
+ − 1274
to overcome), it is relatively straightforward to establish this
+ − 1275
property for the orderings
+ − 1276
\isa{\underline{\hspace{2mm}}\ {\isasymprec}\ \underline{\hspace{2mm}}} and \isa{\underline{\hspace{2mm}}\ \mbox{$\preccurlyeq$}\ \underline{\hspace{2mm}}}
+ − 1277
by Okui and Suzuki.
+ − 1278
+ − 1279
\begin{lemma}[Transitivity]\label{transitivity}
+ − 1280
\isa{{\normalsize{}If\,}\ \mbox{v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ v\isactrlsub {\isadigit{2}}}\ {\normalsize \,and\,}\ \mbox{v\isactrlsub {\isadigit{2}}\ {\isasymprec}\ v\isactrlsub {\isadigit{3}}}\ {\normalsize \,then\,}\ v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ v\isactrlsub {\isadigit{3}}{\isachardot}{\kern0pt}}
+ − 1281
\end{lemma}
+ − 1282
+ − 1283
\begin{proof} From the assumption we obtain two positions \isa{p}
+ − 1284
and \isa{q}, where the values \isa{v\isactrlsub {\isadigit{1}}} and \isa{v\isactrlsub {\isadigit{2}}} (respectively \isa{v\isactrlsub {\isadigit{2}}} and \isa{v\isactrlsub {\isadigit{3}}}) are `distinct'. Since \isa{{\isasymprec}\isactrlbsub lex\isactrlesub } is trichotomous, we need to consider
+ − 1285
three cases, namely \isa{p\ {\isacharequal}{\kern0pt}\ q}, \isa{p\ {\isasymprec}\isactrlbsub lex\isactrlesub \ q} and
+ − 1286
\isa{q\ {\isasymprec}\isactrlbsub lex\isactrlesub \ p}. Let us look at the first case. Clearly
+ − 1287
\isa{{\isasymparallel}v\isactrlsub {\isadigit{2}}{\isasymparallel}\isactrlbsub p\isactrlesub \ {\isacharless}{\kern0pt}\ {\isasymparallel}v\isactrlsub {\isadigit{1}}{\isasymparallel}\isactrlbsub p\isactrlesub } and \isa{{\isasymparallel}v\isactrlsub {\isadigit{3}}{\isasymparallel}\isactrlbsub p\isactrlesub \ {\isacharless}{\kern0pt}\ {\isasymparallel}v\isactrlsub {\isadigit{2}}{\isasymparallel}\isactrlbsub p\isactrlesub } imply \isa{{\isasymparallel}v\isactrlsub {\isadigit{3}}{\isasymparallel}\isactrlbsub p\isactrlesub \ {\isacharless}{\kern0pt}\ {\isasymparallel}v\isactrlsub {\isadigit{1}}{\isasymparallel}\isactrlbsub p\isactrlesub }. It remains to show
+ − 1288
that for a \isa{p{\isacharprime}{\kern0pt}\ {\isasymin}\ Pos\ v\isactrlsub {\isadigit{1}}\ {\isasymunion}\ Pos\ v\isactrlsub {\isadigit{3}}}
+ − 1289
with \isa{p{\isacharprime}{\kern0pt}\ {\isasymprec}\isactrlbsub lex\isactrlesub \ p} that \isa{{\isasymparallel}v\isactrlsub {\isadigit{1}}{\isasymparallel}\isactrlbsub p{\isacharprime}{\kern0pt}\isactrlesub \ {\isacharequal}{\kern0pt}\ {\isasymparallel}v\isactrlsub {\isadigit{3}}{\isasymparallel}\isactrlbsub p{\isacharprime}{\kern0pt}\isactrlesub } holds. Suppose \isa{p{\isacharprime}{\kern0pt}\ {\isasymin}\ Pos\ v\isactrlsub {\isadigit{1}}}, then we can infer from the first assumption that \isa{{\isasymparallel}v\isactrlsub {\isadigit{1}}{\isasymparallel}\isactrlbsub p{\isacharprime}{\kern0pt}\isactrlesub \ {\isacharequal}{\kern0pt}\ {\isasymparallel}v\isactrlsub {\isadigit{2}}{\isasymparallel}\isactrlbsub p{\isacharprime}{\kern0pt}\isactrlesub }. But this means
+ − 1290
that \isa{p{\isacharprime}{\kern0pt}} must be in \isa{Pos\ v\isactrlsub {\isadigit{2}}} too (the norm
+ − 1291
cannot be \isa{{\isacharminus}{\kern0pt}{\isadigit{1}}} given \isa{p{\isacharprime}{\kern0pt}\ {\isasymin}\ Pos\ v\isactrlsub {\isadigit{1}}}).
+ − 1292
Hence we can use the second assumption and
+ − 1293
infer \isa{{\isasymparallel}v\isactrlsub {\isadigit{2}}{\isasymparallel}\isactrlbsub p{\isacharprime}{\kern0pt}\isactrlesub \ {\isacharequal}{\kern0pt}\ {\isasymparallel}v\isactrlsub {\isadigit{3}}{\isasymparallel}\isactrlbsub p{\isacharprime}{\kern0pt}\isactrlesub },
+ − 1294
which concludes this case with \isa{v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ v\isactrlsub {\isadigit{3}}}. The reasoning in the other cases is similar.\qed
+ − 1295
\end{proof}
+ − 1296
+ − 1297
\noindent
+ − 1298
The proof for $\preccurlyeq$ is similar and omitted.
+ − 1299
It is also straightforward to show that \isa{{\isasymprec}} and
+ − 1300
$\preccurlyeq$ are partial orders. Okui and Suzuki furthermore show that they
+ − 1301
are linear orderings for lexical values \cite{OkuiSuzuki2010} of a given
+ − 1302
regular expression and given string, but we have not formalised this in Isabelle. It is
+ − 1303
not essential for our results. What we are going to show below is
+ − 1304
that for a given \isa{r} and \isa{s}, the orderings have a unique
+ − 1305
minimal element on the set \isa{LV\ r\ s}, which is the POSIX value
+ − 1306
we defined in the previous section. We start with two properties that
+ − 1307
show how the length of a flattened value relates to the \isa{{\isasymprec}}-ordering.
+ − 1308
+ − 1309
\begin{proposition}\mbox{}\smallskip\\\label{ordlen}
+ − 1310
\begin{tabular}{@ {}ll}
+ − 1311
(1) &
+ − 1312
\isa{{\normalsize{}If\,}\ v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ v\isactrlsub {\isadigit{2}}\ {\normalsize \,then\,}\ len\ {\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}\ {\isasymle}\ len\ {\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}{\isachardot}{\kern0pt}}\\
+ − 1313
(2) &
+ − 1314
\isa{{\normalsize{}If\,}\ len\ {\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}\ {\isacharless}{\kern0pt}\ len\ {\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}\ {\normalsize \,then\,}\ v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ v\isactrlsub {\isadigit{2}}{\isachardot}{\kern0pt}}
+ − 1315
\end{tabular}
+ − 1316
\end{proposition}
+ − 1317
+ − 1318
\noindent Both properties follow from the definition of the ordering. Note that
+ − 1319
\textit{(2)} entails that a value, say \isa{v\isactrlsub {\isadigit{2}}}, whose underlying
+ − 1320
string is a strict prefix of another flattened value, say \isa{v\isactrlsub {\isadigit{1}}}, then
+ − 1321
\isa{v\isactrlsub {\isadigit{1}}} must be smaller than \isa{v\isactrlsub {\isadigit{2}}}. For our proofs it
+ − 1322
will be useful to have the following properties---in each case the underlying strings
+ − 1323
of the compared values are the same:
+ − 1324
+ − 1325
\begin{proposition}\mbox{}\smallskip\\\label{ordintros}
+ − 1326
\begin{tabular}{ll}
+ − 1327
\textit{(1)} &
+ − 1328
\isa{{\normalsize{}If\,}\ {\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}\ {\normalsize \,then\,}\ Left\ v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ Right\ v\isactrlsub {\isadigit{2}}{\isachardot}{\kern0pt}}\\
+ − 1329
\textit{(2)} & If
+ − 1330
\isa{{\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}} \;then\;
+ − 1331
\isa{Left\ v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ Left\ v\isactrlsub {\isadigit{2}}} \;iff\;
+ − 1332
\isa{v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ v\isactrlsub {\isadigit{2}}}\\
+ − 1333
\textit{(3)} & If
+ − 1334
\isa{{\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}} \;then\;
+ − 1335
\isa{Right\ v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ Right\ v\isactrlsub {\isadigit{2}}} \;iff\;
+ − 1336
\isa{v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ v\isactrlsub {\isadigit{2}}}\\
+ − 1337
\textit{(4)} & If
+ − 1338
\isa{{\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbar}{\kern0pt}w\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}} \;then\;
+ − 1339
\isa{Seq\ v\ v\isactrlsub {\isadigit{2}}\ {\isasymprec}\ Seq\ v\ w\isactrlsub {\isadigit{2}}} \;iff\;
+ − 1340
\isa{v\isactrlsub {\isadigit{2}}\ {\isasymprec}\ w\isactrlsub {\isadigit{2}}}\\
+ − 1341
\textit{(5)} & If
+ − 1342
\isa{{\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}\ {\isacharat}{\kern0pt}\ {\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbar}{\kern0pt}w\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}\ {\isacharat}{\kern0pt}\ {\isacharbar}{\kern0pt}w\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}} \;and\;
+ − 1343
\isa{v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ w\isactrlsub {\isadigit{1}}} \;then\;
+ − 1344
\isa{Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}\ {\isasymprec}\ Seq\ w\isactrlsub {\isadigit{1}}\ w\isactrlsub {\isadigit{2}}}\\
+ − 1345
\textit{(6)} & If
+ − 1346
\isa{{\isacharbar}{\kern0pt}vs\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbar}{\kern0pt}vs\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}} \;then\;
+ − 1347
\isa{Stars\ {\isacharparenleft}{\kern0pt}vs\ {\isacharat}{\kern0pt}\ vs\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymprec}\ Stars\ {\isacharparenleft}{\kern0pt}vs\ {\isacharat}{\kern0pt}\ vs\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} \;iff\;
+ − 1348
\isa{Stars\ vs\isactrlsub {\isadigit{1}}\ {\isasymprec}\ Stars\ vs\isactrlsub {\isadigit{2}}}\\
+ − 1349
+ − 1350
\textit{(7)} & If
+ − 1351
\isa{{\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{1}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}vs\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{2}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}vs\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}} \;and\;
+ − 1352
\isa{v\isactrlsub {\isadigit{1}}\ {\isasymprec}\ v\isactrlsub {\isadigit{2}}} \;then\;
+ − 1353
\isa{Stars\ {\isacharparenleft}{\kern0pt}v\isactrlsub {\isadigit{1}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}vs\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isasymprec}\ Stars\ {\isacharparenleft}{\kern0pt}v\isactrlsub {\isadigit{2}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}vs\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 1354
\end{tabular}
+ − 1355
\end{proposition}
+ − 1356
+ − 1357
\noindent One might prefer that statements \textit{(4)} and \textit{(5)}
+ − 1358
(respectively \textit{(6)} and \textit{(7)})
+ − 1359
are combined into a single \textit{iff}-statement (like the ones for \isa{Left} and \isa{Right}). Unfortunately this cannot be done easily: such
+ − 1360
a single statement would require an additional assumption about the
+ − 1361
two values \isa{Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}} and \isa{Seq\ w\isactrlsub {\isadigit{1}}\ w\isactrlsub {\isadigit{2}}}
+ − 1362
being inhabited by the same regular expression. The
+ − 1363
complexity of the proofs involved seems to not justify such a
+ − 1364
`cleaner' single statement. The statements given are just the properties that
+ − 1365
allow us to establish our theorems without any difficulty. The proofs
+ − 1366
for Proposition~\ref{ordintros} are routine.
+ − 1367
+ − 1368
+ − 1369
Next we establish how Okui and Suzuki's orderings relate to our
+ − 1370
definition of POSIX values. Given a \isa{POSIX} value \isa{v\isactrlsub {\isadigit{1}}}
+ − 1371
for \isa{r} and \isa{s}, then any other lexical value \isa{v\isactrlsub {\isadigit{2}}} in \isa{LV\ r\ s} is greater or equal than \isa{v\isactrlsub {\isadigit{1}}}, namely:
+ − 1372
+ − 1373
+ − 1374
\begin{theorem}\label{orderone}
+ − 1375
\isa{{\normalsize{}If\,}\ \mbox{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\isactrlsub {\isadigit{1}}}\ {\normalsize \,and\,}\ \mbox{v\isactrlsub {\isadigit{2}}\ {\isasymin}\ LV\ r\ s}\ {\normalsize \,then\,}\ v\isactrlsub {\isadigit{1}}\ \mbox{$\preccurlyeq$}\ v\isactrlsub {\isadigit{2}}{\isachardot}{\kern0pt}}
+ − 1376
\end{theorem}
+ − 1377
+ − 1378
\begin{proof} By induction on our POSIX rules. By
+ − 1379
Theorem~\ref{posixdeterm} and the definition of \isa{LV}, it is clear
+ − 1380
that \isa{v\isactrlsub {\isadigit{1}}} and \isa{v\isactrlsub {\isadigit{2}}} have the same
+ − 1381
underlying string \isa{s}. The three base cases are
+ − 1382
straightforward: for example for \isa{v\isactrlsub {\isadigit{1}}\ {\isacharequal}{\kern0pt}\ Empty}, we have
+ − 1383
that \isa{v\isactrlsub {\isadigit{2}}\ {\isasymin}\ LV\ \isactrlbold {\isadigit{1}}\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}} must also be of the form
+ − 1384
\mbox{\isa{v\isactrlsub {\isadigit{2}}\ {\isacharequal}{\kern0pt}\ Empty}}. Therefore we have \isa{v\isactrlsub {\isadigit{1}}\ \mbox{$\preccurlyeq$}\ v\isactrlsub {\isadigit{2}}}. The inductive cases for
+ − 1385
\isa{r} being of the form \isa{r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}} and
+ − 1386
\isa{r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}} are as follows:
+ − 1387
+ − 1388
+ − 1389
\begin{itemize}
+ − 1390
+ − 1391
\item[$\bullet$] Case \isa{P{\isacharplus}{\kern0pt}L} with \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Left\ w\isactrlsub {\isadigit{1}}}: In this case the value
+ − 1392
\isa{v\isactrlsub {\isadigit{2}}} is either of the
+ − 1393
form \isa{Left\ w\isactrlsub {\isadigit{2}}} or \isa{Right\ w\isactrlsub {\isadigit{2}}}. In the
+ − 1394
latter case we can immediately conclude with \mbox{\isa{v\isactrlsub {\isadigit{1}}\ \mbox{$\preccurlyeq$}\ v\isactrlsub {\isadigit{2}}}} since a \isa{Left}-value with the
+ − 1395
same underlying string \isa{s} is always smaller than a
+ − 1396
\isa{Right}-value by Proposition~\ref{ordintros}\textit{(1)}.
+ − 1397
In the former case we have \isa{w\isactrlsub {\isadigit{2}}\ {\isasymin}\ LV\ r\isactrlsub {\isadigit{1}}\ s} and can use the induction hypothesis to infer
+ − 1398
\isa{w\isactrlsub {\isadigit{1}}\ \mbox{$\preccurlyeq$}\ w\isactrlsub {\isadigit{2}}}. Because \isa{w\isactrlsub {\isadigit{1}}} and \isa{w\isactrlsub {\isadigit{2}}} have the same underlying string
+ − 1399
\isa{s}, we can conclude with \isa{Left\ w\isactrlsub {\isadigit{1}}\ \mbox{$\preccurlyeq$}\ Left\ w\isactrlsub {\isadigit{2}}} using
+ − 1400
Proposition~\ref{ordintros}\textit{(2)}.\smallskip
+ − 1401
+ − 1402
\item[$\bullet$] Case \isa{P{\isacharplus}{\kern0pt}R} with \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Right\ w\isactrlsub {\isadigit{1}}}: This case similar to the previous
+ − 1403
case, except that we additionally know \isa{s\ {\isasymnotin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}}. This is needed when \isa{v\isactrlsub {\isadigit{2}}} is of the form
+ − 1404
\mbox{\isa{Left\ w\isactrlsub {\isadigit{2}}}}. Since \mbox{\isa{{\isacharbar}{\kern0pt}v\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbar}{\kern0pt}w\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}} \isa{{\isacharequal}{\kern0pt}\ s}} and \isa{w\isactrlsub {\isadigit{2}}\ {\isacharcolon}{\kern0pt}\ r\isactrlsub {\isadigit{1}}}, we can derive a contradiction for \mbox{\isa{s\ {\isasymnotin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}}} using
+ − 1405
Proposition~\ref{inhabs}. So also in this case \mbox{\isa{v\isactrlsub {\isadigit{1}}\ \mbox{$\preccurlyeq$}\ v\isactrlsub {\isadigit{2}}}}.\smallskip
+ − 1406
+ − 1407
\item[$\bullet$] Case \isa{PS} with \isa{{\isacharparenleft}{\kern0pt}s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Seq\ w\isactrlsub {\isadigit{1}}\ w\isactrlsub {\isadigit{2}}}: We can assume \isa{v\isactrlsub {\isadigit{2}}\ {\isacharequal}{\kern0pt}\ Seq\ u\isactrlsub {\isadigit{1}}\ u\isactrlsub {\isadigit{2}}} with \isa{u\isactrlsub {\isadigit{1}}\ {\isacharcolon}{\kern0pt}\ r\isactrlsub {\isadigit{1}}} and \mbox{\isa{u\isactrlsub {\isadigit{2}}\ {\isacharcolon}{\kern0pt}\ r\isactrlsub {\isadigit{2}}}}. We have \isa{s\isactrlsub {\isadigit{1}}\ {\isacharat}{\kern0pt}\ s\isactrlsub {\isadigit{2}}\ {\isacharequal}{\kern0pt}\ {\isacharbar}{\kern0pt}u\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}\ {\isacharat}{\kern0pt}\ {\isacharbar}{\kern0pt}u\isactrlsub {\isadigit{2}}{\isacharbar}{\kern0pt}}. By the side-condition of the
+ − 1408
\isa{PS}-rule we know that either \isa{s\isactrlsub {\isadigit{1}}\ {\isacharequal}{\kern0pt}\ {\isacharbar}{\kern0pt}u\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}} or that \isa{{\isacharbar}{\kern0pt}u\isactrlsub {\isadigit{1}}{\isacharbar}{\kern0pt}} is a strict prefix of
+ − 1409
\isa{s\isactrlsub {\isadigit{1}}}. In the latter case we can infer \isa{w\isactrlsub {\isadigit{1}}\ {\isasymprec}\ u\isactrlsub {\isadigit{1}}} by
+ − 1410
Proposition~\ref{ordlen}\textit{(2)} and from this \isa{v\isactrlsub {\isadigit{1}}\ \mbox{$\preccurlyeq$}\ v\isactrlsub {\isadigit{2}}} by Proposition~\ref{ordintros}\textit{(5)}
+ − 1411
(as noted above \isa{v\isactrlsub {\isadigit{1}}} and \isa{v\isactrlsub {\isadigit{2}}} must have the
+ − 1412
same underlying string).
+ − 1413
In the former case we know
+ − 1414
\isa{u\isactrlsub {\isadigit{1}}\ {\isasymin}\ LV\ r\isactrlsub {\isadigit{1}}\ s\isactrlsub {\isadigit{1}}} and \isa{u\isactrlsub {\isadigit{2}}\ {\isasymin}\ LV\ r\isactrlsub {\isadigit{2}}\ s\isactrlsub {\isadigit{2}}}. With this we can use the
+ − 1415
induction hypotheses to infer \isa{w\isactrlsub {\isadigit{1}}\ \mbox{$\preccurlyeq$}\ u\isactrlsub {\isadigit{1}}} and \isa{w\isactrlsub {\isadigit{2}}\ \mbox{$\preccurlyeq$}\ u\isactrlsub {\isadigit{2}}}. By
+ − 1416
Proposition~\ref{ordintros}\textit{(4,5)} we can again infer
+ − 1417
\isa{v\isactrlsub {\isadigit{1}}\ \mbox{$\preccurlyeq$}\ v\isactrlsub {\isadigit{2}}}.
+ − 1418
+ − 1419
\end{itemize}
+ − 1420
+ − 1421
\noindent The case for \isa{P{\isasymstar}} is similar to the \isa{PS}-case and omitted.\qed
+ − 1422
\end{proof}
+ − 1423
+ − 1424
\noindent This theorem shows that our \isa{POSIX} value for a
+ − 1425
regular expression \isa{r} and string \isa{s} is in fact a
+ − 1426
minimal element of the values in \isa{LV\ r\ s}. By
+ − 1427
Proposition~\ref{ordlen}\textit{(2)} we also know that any value in
+ − 1428
\isa{LV\ r\ s{\isacharprime}{\kern0pt}}, with \isa{s{\isacharprime}{\kern0pt}} being a strict prefix, cannot be
+ − 1429
smaller than \isa{v\isactrlsub {\isadigit{1}}}. The next theorem shows the
+ − 1430
opposite---namely any minimal element in \isa{LV\ r\ s} must be a
+ − 1431
\isa{POSIX} value. This can be established by induction on \isa{r}, but the proof can be drastically simplified by using the fact
+ − 1432
from the previous section about the existence of a \isa{POSIX} value
+ − 1433
whenever a string \isa{s\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}}.
+ − 1434
+ − 1435
+ − 1436
\begin{theorem}
+ − 1437
\isa{{\normalsize{}If\,}\ \mbox{v\isactrlsub {\isadigit{1}}\ {\isasymin}\ LV\ r\ s}\ {\normalsize \,and\,}\ \mbox{{\isasymforall}v\isactrlsub {\isadigit{2}}{\isasymin}LV\ r\ s{\isachardot}{\kern0pt}\ v\isactrlsub {\isadigit{2}}\ \mbox{$\not\prec$}\ v\isactrlsub {\isadigit{1}}}\ {\normalsize \,then\,}\ {\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\isactrlsub {\isadigit{1}}{\isachardot}{\kern0pt}}
+ − 1438
\end{theorem}
+ − 1439
+ − 1440
\begin{proof}
+ − 1441
If \isa{v\isactrlsub {\isadigit{1}}\ {\isasymin}\ LV\ r\ s} then
+ − 1442
\isa{s\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}} by Proposition~\ref{inhabs}. Hence by Theorem~\ref{lexercorrect}(2)
+ − 1443
there exists a
+ − 1444
\isa{POSIX} value \isa{v\isactrlsub P} with \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\isactrlsub P}
+ − 1445
and by Lemma~\ref{LVposix} we also have \mbox{\isa{v\isactrlsub P\ {\isasymin}\ LV\ r\ s}}.
+ − 1446
By Theorem~\ref{orderone} we therefore have
+ − 1447
\isa{v\isactrlsub P\ \mbox{$\preccurlyeq$}\ v\isactrlsub {\isadigit{1}}}. If \isa{v\isactrlsub P\ {\isacharequal}{\kern0pt}\ v\isactrlsub {\isadigit{1}}} then
+ − 1448
we are done. Otherwise we have \isa{v\isactrlsub P\ {\isasymprec}\ v\isactrlsub {\isadigit{1}}}, which
+ − 1449
however contradicts the second assumption about \isa{v\isactrlsub {\isadigit{1}}} being the smallest
+ − 1450
element in \isa{LV\ r\ s}. So we are done in this case too.\qed
+ − 1451
\end{proof}
+ − 1452
+ − 1453
\noindent
+ − 1454
From this we can also show
+ − 1455
that if \isa{LV\ r\ s} is non-empty (or equivalently \isa{s\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}}) then
+ − 1456
it has a unique minimal element:
+ − 1457
+ − 1458
\begin{corollary}
+ − 1459
\isa{{\normalsize{}If\,}\ LV\ r\ s\ {\isasymnoteq}\ {\isasymemptyset}\ {\normalsize \,then\,}\ {\isasymexists}{\isacharbang}{\kern0pt}vmin{\isachardot}{\kern0pt}\ vmin\ {\isasymin}\ LV\ r\ s\ {\isasymand}\ {\isacharparenleft}{\kern0pt}{\isasymforall}v{\isasymin}LV\ r\ s{\isachardot}{\kern0pt}\ vmin\ \mbox{$\preccurlyeq$}\ v{\isacharparenright}{\kern0pt}{\isachardot}{\kern0pt}}
+ − 1460
\end{corollary}
+ − 1461
+ − 1462
+ − 1463
+ − 1464
\noindent To sum up, we have shown that the (unique) minimal elements
+ − 1465
of the ordering by Okui and Suzuki are exactly the \isa{POSIX}
+ − 1466
values we defined inductively in Section~\ref{posixsec}. This provides
+ − 1467
an independent confirmation that our ternary relation formalises the
+ − 1468
informal POSIX rules.%
+ − 1469
\end{isamarkuptext}\isamarkuptrue%
+ − 1470
%
+ − 1471
\isadelimdocument
+ − 1472
%
+ − 1473
\endisadelimdocument
+ − 1474
%
+ − 1475
\isatagdocument
+ − 1476
%
+ − 1477
\isamarkupsection{Bitcoded Lexing%
+ − 1478
}
+ − 1479
\isamarkuptrue%
+ − 1480
%
+ − 1481
\endisatagdocument
+ − 1482
{\isafolddocument}%
+ − 1483
%
+ − 1484
\isadelimdocument
+ − 1485
%
+ − 1486
\endisadelimdocument
+ − 1487
%
+ − 1488
\begin{isamarkuptext}%
+ − 1489
Incremental calculation of the value. To simplify the proof we first define the function
+ − 1490
\isa{flex} which calculates the ``iterated'' injection function. With this we can
+ − 1491
rewrite the lexer as
+ − 1492
+ − 1493
\begin{center}
+ − 1494
\isa{lexer\ r\ s\ {\isacharequal}{\kern0pt}\ {\isacharparenleft}{\kern0pt}\textrm{if}\ nullable\ {\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}s{\isacharparenright}{\kern0pt}\ \textrm{then}\ Some\ {\isacharparenleft}{\kern0pt}flex\ r\ id\ s\ {\isacharparenleft}{\kern0pt}mkeps\ {\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}s{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ \textrm{else}\ None{\isacharparenright}{\kern0pt}}
+ − 1495
\end{center}%
+ − 1496
\end{isamarkuptext}\isamarkuptrue%
+ − 1497
%
+ − 1498
\isadelimdocument
+ − 1499
%
+ − 1500
\endisadelimdocument
+ − 1501
%
+ − 1502
\isatagdocument
+ − 1503
%
+ − 1504
\isamarkupsection{Optimisations%
+ − 1505
}
+ − 1506
\isamarkuptrue%
+ − 1507
%
+ − 1508
\endisatagdocument
+ − 1509
{\isafolddocument}%
+ − 1510
%
+ − 1511
\isadelimdocument
+ − 1512
%
+ − 1513
\endisadelimdocument
+ − 1514
%
+ − 1515
\begin{isamarkuptext}%
+ − 1516
Derivatives as calculated by \Brz's method are usually more complex
+ − 1517
regular expressions than the initial one; the result is that the
+ − 1518
derivative-based matching and lexing algorithms are often abysmally slow.
+ − 1519
However, various optimisations are possible, such as the simplifications
+ − 1520
of \isa{\isactrlbold {\isadigit{0}}\ {\isacharplus}{\kern0pt}\ r}, \isa{r\ {\isacharplus}{\kern0pt}\ \isactrlbold {\isadigit{0}}}, \isa{\isactrlbold {\isadigit{1}}\ {\isasymcdot}\ r} and
+ − 1521
\isa{r\ {\isasymcdot}\ \isactrlbold {\isadigit{1}}} to \isa{r}. These simplifications can speed up the
+ − 1522
algorithms considerably, as noted in \cite{Sulzmann2014}. One of the
+ − 1523
advantages of having a simple specification and correctness proof is that
+ − 1524
the latter can be refined to prove the correctness of such simplification
+ − 1525
steps. While the simplification of regular expressions according to
+ − 1526
rules like
+ − 1527
+ − 1528
\begin{equation}\label{Simpl}
+ − 1529
\begin{array}{lcllcllcllcl}
+ − 1530
\isa{\isactrlbold {\isadigit{0}}\ {\isacharplus}{\kern0pt}\ r} & \isa{{\isasymRightarrow}} & \isa{r} \hspace{8mm}%\\
+ − 1531
\isa{r\ {\isacharplus}{\kern0pt}\ \isactrlbold {\isadigit{0}}} & \isa{{\isasymRightarrow}} & \isa{r} \hspace{8mm}%\\
+ − 1532
\isa{\isactrlbold {\isadigit{1}}\ {\isasymcdot}\ r} & \isa{{\isasymRightarrow}} & \isa{r} \hspace{8mm}%\\
+ − 1533
\isa{r\ {\isasymcdot}\ \isactrlbold {\isadigit{1}}} & \isa{{\isasymRightarrow}} & \isa{r}
+ − 1534
\end{array}
+ − 1535
\end{equation}
+ − 1536
+ − 1537
\noindent is well understood, there is an obstacle with the POSIX value
+ − 1538
calculation algorithm by Sulzmann and Lu: if we build a derivative regular
+ − 1539
expression and then simplify it, we will calculate a POSIX value for this
+ − 1540
simplified derivative regular expression, \emph{not} for the original (unsimplified)
+ − 1541
derivative regular expression. Sulzmann and Lu \cite{Sulzmann2014} overcome this obstacle by
+ − 1542
not just calculating a simplified regular expression, but also calculating
+ − 1543
a \emph{rectification function} that ``repairs'' the incorrect value.
+ − 1544
+ − 1545
The rectification functions can be (slightly clumsily) implemented in
+ − 1546
Isabelle/HOL as follows using some auxiliary functions:
+ − 1547
+ − 1548
\begin{center}
+ − 1549
\begin{tabular}{lcl}
+ − 1550
\isa{F\isactrlbsub Right\isactrlesub \ f\ v} & $\dn$ & \isa{Right\ {\isacharparenleft}{\kern0pt}f\ v{\isacharparenright}{\kern0pt}}\\
+ − 1551
\isa{F\isactrlbsub Left\isactrlesub \ f\ v} & $\dn$ & \isa{Left\ {\isacharparenleft}{\kern0pt}f\ v{\isacharparenright}{\kern0pt}}\\
+ − 1552
+ − 1553
\isa{F\isactrlbsub Alt\isactrlesub \ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}\ {\isacharparenleft}{\kern0pt}Right\ v{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{Right\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{2}}\ v{\isacharparenright}{\kern0pt}}\\
+ − 1554
\isa{F\isactrlbsub Alt\isactrlesub \ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}\ {\isacharparenleft}{\kern0pt}Left\ v{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{Left\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{1}}\ v{\isacharparenright}{\kern0pt}}\\
+ − 1555
+ − 1556
\isa{F\isactrlbsub Seq{\isadigit{1}}\isactrlesub \ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}\ v} & $\dn$ & \isa{Seq\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{1}}\ {\isacharparenleft}{\kern0pt}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{2}}\ v{\isacharparenright}{\kern0pt}}\\
+ − 1557
\isa{F\isactrlbsub Seq{\isadigit{2}}\isactrlesub \ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}\ v} & $\dn$ & \isa{Seq\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{1}}\ v{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{2}}\ {\isacharparenleft}{\kern0pt}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}}\\
+ − 1558
\isa{F\isactrlbsub Seq\isactrlesub \ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}\ {\isacharparenleft}{\kern0pt}Seq\ v\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{Seq\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{2}}\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\medskip\\
+ − 1559
%\end{tabular}
+ − 1560
%
+ − 1561
%\begin{tabular}{lcl}
+ − 1562
\isa{simp\isactrlbsub Alt\isactrlesub \ {\isacharparenleft}{\kern0pt}\isactrlbold {\isadigit{0}}{\isacharcomma}{\kern0pt}\ \underline{\hspace{2mm}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ F\isactrlbsub Right\isactrlesub \ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 1563
\isa{simp\isactrlbsub Alt\isactrlesub \ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}\isactrlbold {\isadigit{0}}{\isacharcomma}{\kern0pt}\ \underline{\hspace{2mm}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ F\isactrlbsub Left\isactrlesub \ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}}\\
+ − 1564
\isa{simp\isactrlbsub Alt\isactrlesub \ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ F\isactrlbsub Alt\isactrlesub \ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 1565
\isa{simp\isactrlbsub Seq\isactrlesub \ {\isacharparenleft}{\kern0pt}\isactrlbold {\isadigit{1}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ F\isactrlbsub Seq{\isadigit{1}}\isactrlesub \ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 1566
\isa{simp\isactrlbsub Seq\isactrlesub \ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}\isactrlbold {\isadigit{1}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ F\isactrlbsub Seq{\isadigit{2}}\isactrlesub \ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 1567
\isa{simp\isactrlbsub Seq\isactrlesub \ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ F\isactrlbsub Seq\isactrlesub \ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 1568
\end{tabular}
+ − 1569
\end{center}
+ − 1570
+ − 1571
\noindent
+ − 1572
The functions \isa{simp\isactrlbsub Alt\isactrlesub } and \isa{simp\isactrlbsub Seq\isactrlesub } encode the simplification rules
+ − 1573
in \eqref{Simpl} and compose the rectification functions (simplifications can occur
+ − 1574
deep inside the regular expression). The main simplification function is then
+ − 1575
+ − 1576
\begin{center}
+ − 1577
\begin{tabular}{lcl}
+ − 1578
\isa{simp\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{simp\isactrlbsub Alt\isactrlesub \ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 1579
\isa{simp\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} & $\dn$ & \isa{simp\isactrlbsub Seq\isactrlesub \ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}}\\
+ − 1580
\isa{simp\ r} & $\dn$ & \isa{{\isacharparenleft}{\kern0pt}r{\isacharcomma}{\kern0pt}\ id{\isacharparenright}{\kern0pt}}\\
+ − 1581
\end{tabular}
+ − 1582
\end{center}
+ − 1583
+ − 1584
\noindent where \isa{id} stands for the identity function. The
+ − 1585
function \isa{simp} returns a simplified regular expression and a corresponding
+ − 1586
rectification function. Note that we do not simplify under stars: this
+ − 1587
seems to slow down the algorithm, rather than speed it up. The optimised
+ − 1588
lexer is then given by the clauses:
+ − 1589
+ − 1590
\begin{center}
+ − 1591
\begin{tabular}{lcl}
+ − 1592
\isa{lexer\isactrlsup {\isacharplus}{\kern0pt}\ r\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}} & $\dn$ & \isa{\textrm{if}\ nullable\ r\ \textrm{then}\ Some\ {\isacharparenleft}{\kern0pt}mkeps\ r{\isacharparenright}{\kern0pt}\ \textrm{else}\ None}\\
+ − 1593
\isa{lexer\isactrlsup {\isacharplus}{\kern0pt}\ r\ {\isacharparenleft}{\kern0pt}c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s{\isacharparenright}{\kern0pt}} & $\dn$ &
+ − 1594
\isa{let\ {\isacharparenleft}{\kern0pt}r\isactrlsub s{\isacharcomma}{\kern0pt}\ f\isactrlsub r{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ simp\ {\isacharparenleft}{\kern0pt}r}$\backslash$\isa{c{\isacharparenright}{\kern0pt}\ in}\\
+ − 1595
& & \isa{case} \isa{lexer\isactrlsup {\isacharplus}{\kern0pt}\ r\isactrlsub s\ s} \isa{of}\\
+ − 1596
& & \phantom{$|$} \isa{None} \isa{{\isasymRightarrow}} \isa{None}\\
+ − 1597
& & $|$ \isa{Some\ v} \isa{{\isasymRightarrow}} \isa{Some\ {\isacharparenleft}{\kern0pt}inj\ r\ c\ {\isacharparenleft}{\kern0pt}f\isactrlsub r\ v{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}}
+ − 1598
\end{tabular}
+ − 1599
\end{center}
+ − 1600
+ − 1601
\noindent
+ − 1602
In the second clause we first calculate the derivative \isa{r{\isacharbackslash}{\kern0pt}c}
+ − 1603
and then simpli
+ − 1604
+ − 1605
text \isa{\ \ Incremental\ calculation\ of\ the\ value{\isachardot}{\kern0pt}\ To\ simplify\ the\ proof\ we\ first\ define\ the\ function\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}const\ flex{\isacharbraceright}{\kern0pt}\ which\ calculates\ the\ {\isacharbackquote}{\kern0pt}{\isacharbackquote}{\kern0pt}iterated{\isacharprime}{\kern0pt}{\isacharprime}{\kern0pt}\ injection\ function{\isachardot}{\kern0pt}\ With\ this\ we\ can\ rewrite\ the\ lexer\ as\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ lexer{\isacharunderscore}{\kern0pt}flex{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcl{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{5}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ {\isachardoublequote}{\kern0pt}v\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}v\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{5}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ {\isachardoublequote}{\kern0pt}v\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}v\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{6}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{6}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{7}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ code{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{7}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcl{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ areg{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}{\isacharequal}{\kern0pt}{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}AZERO{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}mid{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}AONE\ bs{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}mid{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}ACHAR\ bs\ c{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}mid{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}AALT\ bs\ r{\isadigit{1}}\ r{\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}mid{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}ASEQ\ bs\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}mid{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}ASTAR\ bs\ r{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ \ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcl{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{5}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{5}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{6}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ intern{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{6}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcl{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{5}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{5}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{6}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ erase{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{6}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ \ Some\ simple\ facts\ about\ erase\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}lemma{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}mbox{\isacharbraceleft}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ erase{\isacharunderscore}{\kern0pt}bder{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ erase{\isacharunderscore}{\kern0pt}intern{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}lemma{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcl{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{5}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{5}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{6}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bnullable{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{6}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}medskip{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ \ {\isacharpercent}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharpercent}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ \ {\isacharpercent}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ {\isacharpercent}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcl{\isacharbraceright}{\kern0pt}\ \ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{5}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{5}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{6}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bder{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{6}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ \ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcl{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bmkeps{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bmkeps{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bmkeps{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bmkeps{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bmkeps{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bmkeps{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{3}}{\isacharparenright}{\kern0pt}{\isacharbrackleft}{\kern0pt}of\ bs\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}\ {\isachardoublequote}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ bmkeps{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ bmkeps{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{4}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}medskip{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ \ \ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharbrackleft}{\kern0pt}mode{\isacharequal}{\kern0pt}IfThen{\isacharbrackright}{\kern0pt}\ bder{\isacharunderscore}{\kern0pt}retrieve{\isacharbraceright}{\kern0pt}\ \ By\ induction\ on\ {\isasymopen}r{\isasymclose}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}theorem{\isacharbraceright}{\kern0pt}{\isacharbrackleft}{\kern0pt}Main\ Lemma{\isacharbrackright}{\kern0pt}{\isacharbackslash}{\kern0pt}mbox{\isacharbraceleft}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharbrackleft}{\kern0pt}mode{\isacharequal}{\kern0pt}IfThen{\isacharbrackright}{\kern0pt}\ MAIN{\isacharunderscore}{\kern0pt}decode{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}theorem{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}noindent\ Definition\ of\ the\ bitcoded\ lexer\ \ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ blexer{\isacharunderscore}{\kern0pt}def{\isacharbraceright}{\kern0pt}\ \ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}theorem{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ blexer{\isacharunderscore}{\kern0pt}correctness{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}theorem{\isacharbraceright}{\kern0pt}\ \ }
+ − 1606
+ − 1607
section \isa{Optimisations}
+ − 1608
+ − 1609
text \isa{\ \ Derivatives\ as\ calculated\ by\ {\isacharbackslash}{\kern0pt}Brz{\isacharprime}{\kern0pt}s\ method\ are\ usually\ more\ complex\ regular\ expressions\ than\ the\ initial\ one{\isacharsemicolon}{\kern0pt}\ the\ result\ is\ that\ the\ derivative{\isacharminus}{\kern0pt}based\ matching\ and\ lexing\ algorithms\ are\ often\ abysmally\ slow{\isachardot}{\kern0pt}\ However{\isacharcomma}{\kern0pt}\ various\ optimisations\ are\ possible{\isacharcomma}{\kern0pt}\ such\ as\ the\ simplifications\ of\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}ALT\ ZERO\ r{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharcomma}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}ALT\ r\ ZERO{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharcomma}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}SEQ\ ONE\ r{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ and\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}SEQ\ r\ ONE{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ to\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ r{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ These\ simplifications\ can\ speed\ up\ the\ algorithms\ considerably{\isacharcomma}{\kern0pt}\ as\ noted\ in\ {\isacharbackslash}{\kern0pt}cite{\isacharbraceleft}{\kern0pt}Sulzmann{\isadigit{2}}{\isadigit{0}}{\isadigit{1}}{\isadigit{4}}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ One\ of\ the\ advantages\ of\ having\ a\ simple\ specification\ and\ correctness\ proof\ is\ that\ the\ latter\ can\ be\ refined\ to\ prove\ the\ correctness\ of\ such\ simplification\ steps{\isachardot}{\kern0pt}\ While\ the\ simplification\ of\ regular\ expressions\ according\ to\ rules\ like\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}equation{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}label{\isacharbraceleft}{\kern0pt}Simpl{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}array{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcllcllcllcl{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}ALT\ ZERO\ r{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isasymopen}{\isasymRightarrow}{\isasymclose}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ r{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}hspace{\isacharbraceleft}{\kern0pt}{\isadigit{8}}mm{\isacharbraceright}{\kern0pt}{\isacharpercent}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}ALT\ r\ ZERO{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isasymopen}{\isasymRightarrow}{\isasymclose}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ r{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}hspace{\isacharbraceleft}{\kern0pt}{\isadigit{8}}mm{\isacharbraceright}{\kern0pt}{\isacharpercent}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}SEQ\ ONE\ r{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ \ {\isacharampersand}{\kern0pt}\ {\isasymopen}{\isasymRightarrow}{\isasymclose}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ r{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}hspace{\isacharbraceleft}{\kern0pt}{\isadigit{8}}mm{\isacharbraceright}{\kern0pt}{\isacharpercent}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}SEQ\ r\ ONE{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ \ {\isacharampersand}{\kern0pt}\ {\isasymopen}{\isasymRightarrow}{\isasymclose}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ r{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}array{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}equation{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}noindent\ is\ well\ understood{\isacharcomma}{\kern0pt}\ there\ is\ an\ obstacle\ with\ the\ POSIX\ value\ calculation\ algorithm\ by\ Sulzmann\ and\ Lu{\isacharcolon}{\kern0pt}\ if\ we\ build\ a\ derivative\ regular\ expression\ and\ then\ simplify\ it{\isacharcomma}{\kern0pt}\ we\ will\ calculate\ a\ POSIX\ value\ for\ this\ simplified\ derivative\ regular\ expression{\isacharcomma}{\kern0pt}\ {\isacharbackslash}{\kern0pt}emph{\isacharbraceleft}{\kern0pt}not{\isacharbraceright}{\kern0pt}\ for\ the\ original\ {\isacharparenleft}{\kern0pt}unsimplified{\isacharparenright}{\kern0pt}\ derivative\ regular\ expression{\isachardot}{\kern0pt}\ Sulzmann\ and\ Lu\ {\isacharbackslash}{\kern0pt}cite{\isacharbraceleft}{\kern0pt}Sulzmann{\isadigit{2}}{\isadigit{0}}{\isadigit{1}}{\isadigit{4}}{\isacharbraceright}{\kern0pt}\ overcome\ this\ obstacle\ by\ not\ just\ calculating\ a\ simplified\ regular\ expression{\isacharcomma}{\kern0pt}\ but\ also\ calculating\ a\ {\isacharbackslash}{\kern0pt}emph{\isacharbraceleft}{\kern0pt}rectification\ function{\isacharbraceright}{\kern0pt}\ that\ {\isacharbackquote}{\kern0pt}{\isacharbackquote}{\kern0pt}repairs{\isacharprime}{\kern0pt}{\isacharprime}{\kern0pt}\ the\ incorrect\ value{\isachardot}{\kern0pt}\ \ The\ rectification\ functions\ can\ be\ {\isacharparenleft}{\kern0pt}slightly\ clumsily{\isacharparenright}{\kern0pt}\ implemented\ \ in\ Isabelle{\isacharslash}{\kern0pt}HOL\ as\ follows\ using\ some\ auxiliary\ functions{\isacharcolon}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcl{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}RIGHT{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isasymopen}Right\ {\isacharparenleft}{\kern0pt}f\ v{\isacharparenright}{\kern0pt}{\isasymclose}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}LEFT{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isasymopen}Left\ {\isacharparenleft}{\kern0pt}f\ v{\isacharparenright}{\kern0pt}{\isasymclose}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ \ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}ALT{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isasymopen}Right\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{2}}\ v{\isacharparenright}{\kern0pt}{\isasymclose}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}ALT{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isasymopen}Left\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{1}}\ v{\isacharparenright}{\kern0pt}{\isasymclose}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ \ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}SEQ{\isadigit{1}}{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isasymopen}Seq\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{1}}\ {\isacharparenleft}{\kern0pt}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{2}}\ v{\isacharparenright}{\kern0pt}{\isasymclose}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}SEQ{\isadigit{2}}{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isasymopen}Seq\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{1}}\ v{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{2}}\ {\isacharparenleft}{\kern0pt}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}{\isasymclose}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}SEQ{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isasymopen}Seq\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{1}}\ v\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}f\isactrlsub {\isadigit{2}}\ v\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isasymclose}{\isacharbackslash}{\kern0pt}medskip{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharpercent}{\kern0pt}{\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharpercent}{\kern0pt}\ {\isacharpercent}{\kern0pt}{\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcl{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}simp{\isacharunderscore}{\kern0pt}ALT\ {\isacharparenleft}{\kern0pt}ZERO{\isacharcomma}{\kern0pt}\ DUMMY{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}RIGHT\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}simp{\isacharunderscore}{\kern0pt}ALT\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}ZERO{\isacharcomma}{\kern0pt}\ DUMMY{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}LEFT\ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}simp{\isacharunderscore}{\kern0pt}ALT\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}{\isacharparenleft}{\kern0pt}ALT\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}ALT\ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}simp{\isacharunderscore}{\kern0pt}SEQ\ {\isacharparenleft}{\kern0pt}ONE{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}SEQ{\isadigit{1}}\ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}simp{\isacharunderscore}{\kern0pt}SEQ\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}ONE{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}SEQ{\isadigit{2}}\ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}simp{\isacharunderscore}{\kern0pt}SEQ\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}{\isacharparenleft}{\kern0pt}SEQ\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}{\isacharcomma}{\kern0pt}\ F{\isacharunderscore}{\kern0pt}SEQ\ f\isactrlsub {\isadigit{1}}\ f\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}noindent\ The\ functions\ {\isasymopen}simp\isactrlbsub Alt\isactrlesub {\isasymclose}\ and\ {\isasymopen}simp\isactrlbsub Seq\isactrlesub {\isasymclose}\ encode\ the\ simplification\ rules\ in\ {\isacharbackslash}{\kern0pt}eqref{\isacharbraceleft}{\kern0pt}Simpl{\isacharbraceright}{\kern0pt}\ and\ compose\ the\ rectification\ functions\ {\isacharparenleft}{\kern0pt}simplifications\ can\ occur\ deep\ inside\ the\ regular\ expression{\isacharparenright}{\kern0pt}{\isachardot}{\kern0pt}\ The\ main\ simplification\ function\ is\ then\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcl{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}ALT\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}simp{\isacharunderscore}{\kern0pt}ALT\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}SEQ\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}simp{\isacharunderscore}{\kern0pt}SEQ\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}simp\ r{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}{\isacharparenleft}{\kern0pt}r{\isacharcomma}{\kern0pt}\ id{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}noindent\ where\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}id{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ stands\ for\ the\ identity\ function{\isachardot}{\kern0pt}\ The\ function\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}const\ simp{\isacharbraceright}{\kern0pt}\ returns\ a\ simplified\ regular\ expression\ and\ a\ corresponding\ rectification\ function{\isachardot}{\kern0pt}\ Note\ that\ we\ do\ not\ simplify\ under\ stars{\isacharcolon}{\kern0pt}\ this\ seems\ to\ slow\ down\ the\ algorithm{\isacharcomma}{\kern0pt}\ rather\ than\ speed\ it\ up{\isachardot}{\kern0pt}\ The\ optimised\ lexer\ is\ then\ given\ by\ the\ clauses{\isacharcolon}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}lcl{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ slexer{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}rhs{\isacharparenright}{\kern0pt}\ slexer{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ {\isacharparenleft}{\kern0pt}lhs{\isacharparenright}{\kern0pt}\ slexer{\isachardot}{\kern0pt}simps{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}dn{\isachardollar}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isasymopen}let\ {\isacharparenleft}{\kern0pt}r\isactrlsub s{\isacharcomma}{\kern0pt}\ f\isactrlsub r{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ simp\ {\isacharparenleft}{\kern0pt}r\ {\isasymclose}{\isachardollar}{\kern0pt}{\isacharbackslash}{\kern0pt}backslash{\isachardollar}{\kern0pt}{\isasymopen}\ c{\isacharparenright}{\kern0pt}\ in{\isasymclose}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isasymopen}case{\isasymclose}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}slexer\ r\isactrlsub s\ s{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isasymopen}of{\isasymclose}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharbackslash}{\kern0pt}phantom{\isacharbraceleft}{\kern0pt}{\isachardollar}{\kern0pt}{\isacharbar}{\kern0pt}{\isachardollar}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}None{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ \ {\isasymopen}{\isasymRightarrow}{\isasymclose}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ None{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isachardollar}{\kern0pt}{\isacharbar}{\kern0pt}{\isachardollar}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}Some\ v{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ {\isasymopen}{\isasymRightarrow}{\isasymclose}\ {\isasymopen}Some\ {\isacharparenleft}{\kern0pt}inj\ r\ c\ {\isacharparenleft}{\kern0pt}f\isactrlsub r\ v{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}{\isasymclose}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}center{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}noindent\ In\ the\ second\ clause\ we\ first\ calculate\ the\ derivative\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}der\ c\ r{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ and\ then\ simplify\ the\ result{\isachardot}{\kern0pt}\ This\ gives\ us\ a\ simplified\ derivative\ {\isasymopen}r\isactrlsub s{\isasymclose}\ and\ a\ rectification\ function\ {\isasymopen}f\isactrlsub r{\isasymclose}{\isachardot}{\kern0pt}\ The\ lexer\ is\ then\ recursively\ called\ with\ the\ simplified\ derivative{\isacharcomma}{\kern0pt}\ but\ before\ we\ inject\ the\ character\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ c{\isacharbraceright}{\kern0pt}\ into\ the\ value\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ v{\isacharbraceright}{\kern0pt}{\isacharcomma}{\kern0pt}\ we\ need\ to\ rectify\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ v{\isacharbraceright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}that\ is\ construct\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}f\isactrlsub r\ v{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharparenright}{\kern0pt}{\isachardot}{\kern0pt}\ Before\ we\ can\ establish\ the\ correctness\ of\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}slexer{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharcomma}{\kern0pt}\ we\ need\ to\ show\ that\ simplification\ preserves\ the\ language\ and\ simplification\ preserves\ our\ POSIX\ relation\ once\ the\ value\ is\ rectified\ {\isacharparenleft}{\kern0pt}recall\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}const\ {\isachardoublequote}{\kern0pt}simp{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ generates\ a\ {\isacharparenleft}{\kern0pt}regular\ expression{\isacharcomma}{\kern0pt}\ rectification\ function{\isacharparenright}{\kern0pt}\ pair{\isacharparenright}{\kern0pt}{\isacharcolon}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}lemma{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}mbox{\isacharbraceleft}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}smallskip{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}label{\isacharbraceleft}{\kern0pt}slexeraux{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}{\isacharbraceleft}{\kern0pt}ll{\isacharbraceright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ L{\isacharunderscore}{\kern0pt}fst{\isacharunderscore}{\kern0pt}simp{\isacharbrackleft}{\kern0pt}symmetric{\isacharbrackright}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharbackslash}{\kern0pt}{\isacharbackslash}{\kern0pt}\ {\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isacharampersand}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm{\isacharbrackleft}{\kern0pt}mode{\isacharequal}{\kern0pt}IfThen{\isacharbrackright}{\kern0pt}\ Posix{\isacharunderscore}{\kern0pt}simp{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}tabular{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}lemma{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}proof{\isacharbraceright}{\kern0pt}\ Both\ are\ by\ induction\ on\ {\isasymopen}r{\isasymclose}{\isachardot}{\kern0pt}\ There\ is\ no\ interesting\ case\ for\ the\ first\ statement{\isachardot}{\kern0pt}\ For\ the\ second\ statement{\isacharcomma}{\kern0pt}\ of\ interest\ are\ the\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}r\ {\isacharequal}{\kern0pt}\ ALT\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ and\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}r\ {\isacharequal}{\kern0pt}\ SEQ\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ cases{\isachardot}{\kern0pt}\ In\ each\ case\ we\ have\ to\ analyse\ four\ subcases\ whether\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ and\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ equals\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}const\ ZERO{\isacharbraceright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}respectively\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}const\ ONE{\isacharbraceright}{\kern0pt}{\isacharparenright}{\kern0pt}{\isachardot}{\kern0pt}\ For\ example\ for\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}r\ {\isacharequal}{\kern0pt}\ ALT\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharcomma}{\kern0pt}\ consider\ the\ subcase\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ ZERO{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ and\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymnoteq}\ ZERO{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ By\ assumption\ we\ know\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymin}\ fst\ {\isacharparenleft}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}ALT\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ From\ this\ we\ can\ infer\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymin}\ fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ and\ by\ IH\ also\ {\isacharparenleft}{\kern0pt}{\isacharasterisk}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymin}\ r\isactrlsub {\isadigit{2}}\ {\isasymrightarrow}\ {\isacharparenleft}{\kern0pt}snd\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ v{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ Given\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ ZERO{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ we\ know\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}L\ {\isacharparenleft}{\kern0pt}fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isacharbraceleft}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ By\ the\ first\ statement\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}L\ r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ is\ the\ empty\ set{\isacharcomma}{\kern0pt}\ meaning\ {\isacharparenleft}{\kern0pt}{\isacharasterisk}{\kern0pt}{\isacharasterisk}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymnotin}\ L\ r\isactrlsub {\isadigit{1}}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ Taking\ {\isacharparenleft}{\kern0pt}{\isacharasterisk}{\kern0pt}{\isacharparenright}{\kern0pt}\ and\ {\isacharparenleft}{\kern0pt}{\isacharasterisk}{\kern0pt}{\isacharasterisk}{\kern0pt}{\isacharparenright}{\kern0pt}\ together\ gives\ by\ the\ {\isacharbackslash}{\kern0pt}mbox{\isacharbraceleft}{\kern0pt}{\isasymopen}P{\isacharplus}{\kern0pt}R{\isasymclose}{\isacharbraceright}{\kern0pt}{\isacharminus}{\kern0pt}rule\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymin}\ ALT\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}\ {\isasymrightarrow}\ Right\ {\isacharparenleft}{\kern0pt}snd\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ v{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ In\ turn\ this\ gives\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymin}\ ALT\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}\ {\isasymrightarrow}\ snd\ {\isacharparenleft}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}ALT\ r\isactrlsub {\isadigit{1}}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ v{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ as\ we\ need\ to\ show{\isachardot}{\kern0pt}\ The\ other\ cases\ are\ similar{\isachardot}{\kern0pt}{\isacharbackslash}{\kern0pt}qed\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}proof{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}noindent\ We\ can\ now\ prove\ relatively\ straightforwardly\ that\ the\ optimised\ lexer\ produces\ the\ expected\ result{\isacharcolon}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}theorem{\isacharbraceright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}thm\ slexer{\isacharunderscore}{\kern0pt}correctness{\isacharbraceright}{\kern0pt}\ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}theorem{\isacharbraceright}{\kern0pt}\ \ {\isacharbackslash}{\kern0pt}begin{\isacharbraceleft}{\kern0pt}proof{\isacharbraceright}{\kern0pt}\ By\ induction\ on\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ s{\isacharbraceright}{\kern0pt}\ generalising\ over\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ r{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ The\ case\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ is\ trivial{\isachardot}{\kern0pt}\ For\ the\ cons{\isacharminus}{\kern0pt}case\ suppose\ the\ string\ is\ of\ the\ form\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}c\ {\isacharhash}{\kern0pt}\ s{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ By\ induction\ hypothesis\ we\ know\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}slexer\ r\ s\ {\isacharequal}{\kern0pt}\ lexer\ r\ s{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ holds\ for\ all\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ r{\isacharbraceright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}in\ particular\ for\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}r{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ being\ the\ derivative\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}der\ c\ r{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharparenright}{\kern0pt}{\isachardot}{\kern0pt}\ Let\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}r\isactrlsub s{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ be\ the\ simplified\ derivative\ regular\ expression{\isacharcomma}{\kern0pt}\ that\ is\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}fst\ {\isacharparenleft}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}der\ c\ r{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharcomma}{\kern0pt}\ and\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}f\isactrlsub r{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ be\ the\ rectification\ function{\isacharcomma}{\kern0pt}\ that\ is\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}snd\ {\isacharparenleft}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}der\ c\ r{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ \ We\ distinguish\ the\ cases\ whether\ {\isacharparenleft}{\kern0pt}{\isacharasterisk}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymin}\ L\ {\isacharparenleft}{\kern0pt}der\ c\ r{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ or\ not{\isachardot}{\kern0pt}\ In\ the\ first\ case\ we\ have\ by\ Theorem{\isachartilde}{\kern0pt}{\isacharbackslash}{\kern0pt}ref{\isacharbraceleft}{\kern0pt}lexercorrect{\isacharbraceright}{\kern0pt}{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}\ a\ value\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}v{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ so\ that\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}lexer\ {\isacharparenleft}{\kern0pt}der\ c\ r{\isacharparenright}{\kern0pt}\ s\ {\isacharequal}{\kern0pt}\ Some\ v{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ and\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymin}\ der\ c\ r\ {\isasymrightarrow}\ v{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ hold{\isachardot}{\kern0pt}\ By\ Lemma{\isachartilde}{\kern0pt}{\isacharbackslash}{\kern0pt}ref{\isacharbraceleft}{\kern0pt}slexeraux{\isacharbraceright}{\kern0pt}{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}\ we\ can\ also\ infer\ from{\isachartilde}{\kern0pt}{\isacharparenleft}{\kern0pt}{\isacharasterisk}{\kern0pt}{\isacharparenright}{\kern0pt}\ that\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymin}\ L\ r\isactrlsub s{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ holds{\isachardot}{\kern0pt}\ \ Hence\ we\ know\ by\ Theorem{\isachartilde}{\kern0pt}{\isacharbackslash}{\kern0pt}ref{\isacharbraceleft}{\kern0pt}lexercorrect{\isacharbraceright}{\kern0pt}{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}\ that\ there\ exists\ a\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}v{\isacharprime}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ with\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}lexer\ r\isactrlsub s\ s\ {\isacharequal}{\kern0pt}\ Some\ v{\isacharprime}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ and\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymin}\ r\isactrlsub s\ {\isasymrightarrow}\ v{\isacharprime}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ From\ the\ latter\ we\ know\ by\ Lemma{\isachartilde}{\kern0pt}{\isacharbackslash}{\kern0pt}ref{\isacharbraceleft}{\kern0pt}slexeraux{\isacharbraceright}{\kern0pt}{\isacharparenleft}{\kern0pt}{\isadigit{2}}{\isacharparenright}{\kern0pt}\ that\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymin}\ der\ c\ r\ {\isasymrightarrow}\ {\isacharparenleft}{\kern0pt}f\isactrlsub r\ v{\isacharprime}{\kern0pt}{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ holds{\isachardot}{\kern0pt}\ By\ the\ uniqueness\ of\ the\ POSIX\ relation\ {\isacharparenleft}{\kern0pt}Theorem{\isachartilde}{\kern0pt}{\isacharbackslash}{\kern0pt}ref{\isacharbraceleft}{\kern0pt}posixdeterm{\isacharbraceright}{\kern0pt}{\isacharparenright}{\kern0pt}\ we\ can\ infer\ that\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ v{\isacharbraceright}{\kern0pt}\ is\ equal\ to\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}f\isactrlsub r\ v{\isacharprime}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isacharminus}{\kern0pt}{\isacharminus}{\kern0pt}{\isacharminus}{\kern0pt}that\ is\ the\ rectification\ function\ applied\ to\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}v{\isacharprime}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ produces\ the\ original\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}v{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ \ Now\ the\ case\ follows\ by\ the\ definitions\ of\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}const\ lexer{\isacharbraceright}{\kern0pt}\ and\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}const\ slexer{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ \ In\ the\ second\ case\ where\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymnotin}\ L\ {\isacharparenleft}{\kern0pt}der\ c\ r{\isacharparenright}{\kern0pt}{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ we\ have\ that\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}lexer\ {\isacharparenleft}{\kern0pt}der\ c\ r{\isacharparenright}{\kern0pt}\ s\ {\isacharequal}{\kern0pt}\ None{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ by\ Theorem{\isachartilde}{\kern0pt}{\isacharbackslash}{\kern0pt}ref{\isacharbraceleft}{\kern0pt}lexercorrect{\isacharbraceright}{\kern0pt}{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}{\isachardot}{\kern0pt}\ \ We\ also\ know\ by\ Lemma{\isachartilde}{\kern0pt}{\isacharbackslash}{\kern0pt}ref{\isacharbraceleft}{\kern0pt}slexeraux{\isacharbraceright}{\kern0pt}{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}\ that\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}s\ {\isasymnotin}\ L\ r\isactrlsub s{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ Hence\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}lexer\ r\isactrlsub s\ s\ {\isacharequal}{\kern0pt}\ None{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}\ by\ Theorem{\isachartilde}{\kern0pt}{\isacharbackslash}{\kern0pt}ref{\isacharbraceleft}{\kern0pt}lexercorrect{\isacharbraceright}{\kern0pt}{\isacharparenleft}{\kern0pt}{\isadigit{1}}{\isacharparenright}{\kern0pt}\ and\ by\ IH\ then\ also\ {\isacharat}{\kern0pt}{\isacharbraceleft}{\kern0pt}term\ {\isachardoublequote}{\kern0pt}slexer\ r\isactrlsub s\ s\ {\isacharequal}{\kern0pt}\ None{\isachardoublequote}{\kern0pt}{\isacharbraceright}{\kern0pt}{\isachardot}{\kern0pt}\ With\ this\ we\ can\ conclude\ in\ this\ case\ too{\isachardot}{\kern0pt}{\isacharbackslash}{\kern0pt}qed\ \ {\isacharbackslash}{\kern0pt}end{\isacharbraceleft}{\kern0pt}proof{\isacharbraceright}{\kern0pt}\ \ }
+ − 1610
fy the result. This gives us a simplified derivative
+ − 1611
\isa{r\isactrlsub s} and a rectification function \isa{f\isactrlsub r}. The lexer
+ − 1612
is then recursively called with the simplified derivative, but before
+ − 1613
we inject the character \isa{c} into the value \isa{v}, we need to rectify
+ − 1614
\isa{v} (that is construct \isa{f\isactrlsub r\ v}). Before we can establish the correctness
+ − 1615
of \isa{lexer\isactrlsup {\isacharplus}{\kern0pt}}, we need to show that simplification preserves the language
+ − 1616
and simplification preserves our POSIX relation once the value is rectified
+ − 1617
(recall \isa{simp} generates a (regular expression, rectification function) pair):
+ − 1618
+ − 1619
\begin{lemma}\mbox{}\smallskip\\\label{slexeraux}
+ − 1620
\begin{tabular}{ll}
+ − 1621
(1) & \isa{L{\isacharparenleft}{\kern0pt}fst\ {\isacharparenleft}{\kern0pt}simp\ r{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ L{\isacharparenleft}{\kern0pt}r{\isacharparenright}{\kern0pt}}\\
+ − 1622
(2) & \isa{{\normalsize{}If\,}\ {\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ fst\ {\isacharparenleft}{\kern0pt}simp\ r{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v\ {\normalsize \,then\,}\ {\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ snd\ {\isacharparenleft}{\kern0pt}simp\ r{\isacharparenright}{\kern0pt}\ v{\isachardot}{\kern0pt}}
+ − 1623
\end{tabular}
+ − 1624
\end{lemma}
+ − 1625
+ − 1626
\begin{proof} Both are by induction on \isa{r}. There is no
+ − 1627
interesting case for the first statement. For the second statement,
+ − 1628
of interest are the \isa{r\ {\isacharequal}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}} and \isa{r\ {\isacharequal}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isasymcdot}\ r\isactrlsub {\isadigit{2}}} cases. In each case we have to analyse four subcases whether
+ − 1629
\isa{fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}} and \isa{fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}} equals \isa{\isactrlbold {\isadigit{0}}} (respectively \isa{\isactrlbold {\isadigit{1}}}). For example for \isa{r\ {\isacharequal}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}}, consider the subcase \isa{fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ \isactrlbold {\isadigit{0}}} and
+ − 1630
\isa{fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymnoteq}\ \isactrlbold {\isadigit{0}}}. By assumption we know \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ fst\ {\isacharparenleft}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}. From this we can infer \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v}
+ − 1631
and by IH also (*) \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ snd\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ v}. Given \isa{fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ \isactrlbold {\isadigit{0}}}
+ − 1632
we know \isa{L{\isacharparenleft}{\kern0pt}fst\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isacharequal}{\kern0pt}\ {\isasymemptyset}}. By the first statement
+ − 1633
\isa{L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}} is the empty set, meaning (**) \isa{s\ {\isasymnotin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}{\isacharparenright}{\kern0pt}}.
+ − 1634
Taking (*) and (**) together gives by the \mbox{\isa{P{\isacharplus}{\kern0pt}R}}-rule
+ − 1635
\isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ Right\ {\isacharparenleft}{\kern0pt}snd\ {\isacharparenleft}{\kern0pt}simp\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ v{\isacharparenright}{\kern0pt}}. In turn this
+ − 1636
gives \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ snd\ {\isacharparenleft}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\ {\isacharplus}{\kern0pt}\ r\isactrlsub {\isadigit{2}}{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ v} as we need to show.
+ − 1637
The other cases are similar.\qed
+ − 1638
\end{proof}
+ − 1639
+ − 1640
\noindent We can now prove relatively straightforwardly that the
+ − 1641
optimised lexer produces the expected result:
+ − 1642
+ − 1643
\begin{theorem}
+ − 1644
\isa{lexer\isactrlsup {\isacharplus}{\kern0pt}\ r\ s\ {\isacharequal}{\kern0pt}\ lexer\ r\ s}
+ − 1645
\end{theorem}
+ − 1646
+ − 1647
\begin{proof} By induction on \isa{s} generalising over \isa{r}. The case \isa{{\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}} is trivial. For the cons-case suppose the
+ − 1648
string is of the form \isa{c\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}s}. By induction hypothesis we
+ − 1649
know \isa{lexer\isactrlsup {\isacharplus}{\kern0pt}\ r\ s\ {\isacharequal}{\kern0pt}\ lexer\ r\ s} holds for all \isa{r} (in
+ − 1650
particular for \isa{r} being the derivative \isa{r{\isacharbackslash}{\kern0pt}c}). Let \isa{r\isactrlsub s} be the simplified derivative regular expression, that is \isa{fst\ {\isacharparenleft}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}}, and \isa{f\isactrlsub r} be the rectification
+ − 1651
function, that is \isa{snd\ {\isacharparenleft}{\kern0pt}simp\ {\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}}. We distinguish the cases
+ − 1652
whether (*) \isa{s\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}} or not. In the first case we
+ − 1653
have by Theorem~\ref{lexercorrect}(2) a value \isa{v} so that \isa{lexer\ {\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ s\ {\isacharequal}{\kern0pt}\ Some\ v} and \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v} hold.
+ − 1654
By Lemma~\ref{slexeraux}(1) we can also infer from~(*) that \isa{s\ {\isasymin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub s{\isacharparenright}{\kern0pt}} holds. Hence we know by Theorem~\ref{lexercorrect}(2) that
+ − 1655
there exists a \isa{v{\isacharprime}{\kern0pt}} with \isa{lexer\ r\isactrlsub s\ s\ {\isacharequal}{\kern0pt}\ Some\ v{\isacharprime}{\kern0pt}} and
+ − 1656
\isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r\isactrlsub s{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ v{\isacharprime}{\kern0pt}}. From the latter we know by
+ − 1657
Lemma~\ref{slexeraux}(2) that \isa{{\isacharparenleft}{\kern0pt}s{\isacharcomma}{\kern0pt}\ r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymrightarrow}\ f\isactrlsub r\ v{\isacharprime}{\kern0pt}} holds.
+ − 1658
By the uniqueness of the POSIX relation (Theorem~\ref{posixdeterm}) we
+ − 1659
can infer that \isa{v} is equal to \isa{f\isactrlsub r\ v{\isacharprime}{\kern0pt}}---that is the
+ − 1660
rectification function applied to \isa{v{\isacharprime}{\kern0pt}}
+ − 1661
produces the original \isa{v}. Now the case follows by the
+ − 1662
definitions of \isa{lexer} and \isa{lexer\isactrlsup {\isacharplus}{\kern0pt}}.
+ − 1663
+ − 1664
In the second case where \isa{s\ {\isasymnotin}\ L{\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}} we have that
+ − 1665
\isa{lexer\ {\isacharparenleft}{\kern0pt}r{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ s\ {\isacharequal}{\kern0pt}\ None} by Theorem~\ref{lexercorrect}(1). We
+ − 1666
also know by Lemma~\ref{slexeraux}(1) that \isa{s\ {\isasymnotin}\ L{\isacharparenleft}{\kern0pt}r\isactrlsub s{\isacharparenright}{\kern0pt}}. Hence
+ − 1667
\isa{lexer\ r\isactrlsub s\ s\ {\isacharequal}{\kern0pt}\ None} by Theorem~\ref{lexercorrect}(1) and
+ − 1668
by IH then also \isa{lexer\isactrlsup {\isacharplus}{\kern0pt}\ r\isactrlsub s\ s\ {\isacharequal}{\kern0pt}\ None}. With this we can
+ − 1669
conclude in this case too.\qed
+ − 1670
+ − 1671
\end{proof}%
+ − 1672
\end{isamarkuptext}\isamarkuptrue%
+ − 1673
%
+ − 1674
\isadelimdocument
+ − 1675
%
+ − 1676
\endisadelimdocument
+ − 1677
%
+ − 1678
\isatagdocument
+ − 1679
%
+ − 1680
\isamarkupsection{HERE%
+ − 1681
}
+ − 1682
\isamarkuptrue%
+ − 1683
%
+ − 1684
\endisatagdocument
+ − 1685
{\isafolddocument}%
+ − 1686
%
+ − 1687
\isadelimdocument
+ − 1688
%
+ − 1689
\endisadelimdocument
+ − 1690
%
+ − 1691
\begin{isamarkuptext}%
+ − 1692
\begin{lemma}
+ − 1693
\isa{{\normalsize{}If\,}\ v\ {\isacharcolon}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}c\ {\normalsize \,then\,}\ retrieve\ {\isacharparenleft}{\kern0pt}r\mbox{$\bbslash$}c{\isacharparenright}{\kern0pt}\ v\ {\isacharequal}{\kern0pt}\ retrieve\ r\ {\isacharparenleft}{\kern0pt}inj\ {\isacharparenleft}{\kern0pt}r\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}\ c\ v{\isacharparenright}{\kern0pt}{\isachardot}{\kern0pt}}
+ − 1694
\end{lemma}
+ − 1695
+ − 1696
\begin{proof}
+ − 1697
By induction on the definition of \isa{r\mbox{$^\downarrow$}}. The cases for rule 1) and 2) are
+ − 1698
straightforward as \isa{\isactrlbold {\isadigit{0}}{\isacharbackslash}{\kern0pt}c} and \isa{\isactrlbold {\isadigit{1}}{\isacharbackslash}{\kern0pt}c} are both equal to
+ − 1699
\isa{\isactrlbold {\isadigit{0}}}. This means \isa{v\ {\isacharcolon}{\kern0pt}\ \isactrlbold {\isadigit{0}}} cannot hold. Similarly in case of rule 3)
+ − 1700
where \isa{r} is of the form \isa{ACHAR\ d} with \isa{c\ {\isacharequal}{\kern0pt}\ d}. Then by assumption
+ − 1701
we know \isa{v\ {\isacharcolon}{\kern0pt}\ \isactrlbold {\isadigit{1}}}, which implies \isa{v\ {\isacharequal}{\kern0pt}\ Empty}. The equation follows by
+ − 1702
simplification of left- and right-hand side. In case \isa{c\ {\isasymnoteq}\ d} we have again
+ − 1703
\isa{v\ {\isacharcolon}{\kern0pt}\ \isactrlbold {\isadigit{0}}}, which cannot hold.
+ − 1704
+ − 1705
For rule 4a) we have again \isa{v\ {\isacharcolon}{\kern0pt}\ \isactrlbold {\isadigit{0}}}. The property holds by IH for rule 4b).
+ − 1706
The induction hypothesis is
+ − 1707
\[
+ − 1708
\isa{retrieve\ {\isacharparenleft}{\kern0pt}r\mbox{$\bbslash$}c{\isacharparenright}{\kern0pt}\ v\ {\isacharequal}{\kern0pt}\ retrieve\ r\ {\isacharparenleft}{\kern0pt}inj\ {\isacharparenleft}{\kern0pt}r\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}\ c\ v{\isacharparenright}{\kern0pt}}
+ − 1709
\]
+ − 1710
which is what left- and right-hand side simplify to. The slightly more interesting case
+ − 1711
is for 4c). By assumption we have
+ − 1712
\isa{v\ {\isacharcolon}{\kern0pt}\ {\isacharparenleft}{\kern0pt}{\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isacharplus}{\kern0pt}\ {\isacharparenleft}{\kern0pt}{\isacharparenleft}{\kern0pt}{\isacharparenleft}{\kern0pt}AALTs\ bs\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}rs{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}}. This means we
+ − 1713
have either (*) \isa{v{\isadigit{1}}\ {\isacharcolon}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{1}}\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}c} with \isa{v\ {\isacharequal}{\kern0pt}\ Left\ v{\isadigit{1}}} or
+ − 1714
(**) \isa{v{\isadigit{2}}\ {\isacharcolon}{\kern0pt}\ {\isacharparenleft}{\kern0pt}{\isacharparenleft}{\kern0pt}AALTs\ bs\ {\isacharparenleft}{\kern0pt}r\isactrlsub {\isadigit{2}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}rs{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}c} with \isa{v\ {\isacharequal}{\kern0pt}\ Right\ v{\isadigit{2}}}.
+ − 1715
The former case is straightforward by simplification. The second case is \ldots TBD.
+ − 1716
+ − 1717
Rule 5) TBD.
+ − 1718
+ − 1719
Finally for rule 6) the reasoning is as follows: By assumption we have
+ − 1720
\isa{v\ {\isacharcolon}{\kern0pt}\ {\isacharparenleft}{\kern0pt}{\isacharparenleft}{\kern0pt}r\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}c{\isacharparenright}{\kern0pt}\ {\isasymcdot}\ {\isacharparenleft}{\kern0pt}r\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}\isactrlsup {\isasymstar}}. This means we also have
+ − 1721
\isa{v\ {\isacharequal}{\kern0pt}\ Seq\ v{\isadigit{1}}\ v{\isadigit{2}}}, \isa{v{\isadigit{1}}\ {\isacharcolon}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}{\isacharbackslash}{\kern0pt}c} and \isa{v{\isadigit{2}}\ {\isacharequal}{\kern0pt}\ Stars\ vs}.
+ − 1722
We want to prove
+ − 1723
\begin{align}
+ − 1724
& \isa{retrieve\ {\isacharparenleft}{\kern0pt}ASEQ\ bs\ {\isacharparenleft}{\kern0pt}fuse\ {\isacharbrackleft}{\kern0pt}Z{\isacharbrackright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\mbox{$\bbslash$}c{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}ASTAR\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ r{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ v}\\
+ − 1725
&= \isa{retrieve\ {\isacharparenleft}{\kern0pt}ASTAR\ bs\ r{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}inj\ {\isacharparenleft}{\kern0pt}{\isacharparenleft}{\kern0pt}r\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}\isactrlsup {\isasymstar}{\isacharparenright}{\kern0pt}\ c\ v{\isacharparenright}{\kern0pt}}
+ − 1726
\end{align}
+ − 1727
The right-hand side \isa{inj}-expression is equal to
+ − 1728
\isa{Stars\ {\isacharparenleft}{\kern0pt}inj\ {\isacharparenleft}{\kern0pt}r\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}\ c\ v{\isadigit{1}}\mbox{$\,$}{\isacharcolon}{\kern0pt}{\isacharcolon}{\kern0pt}\mbox{$\,$}vs{\isacharparenright}{\kern0pt}}, which means the \isa{retrieve}-expression
+ − 1729
simplifies to
+ − 1730
\[
+ − 1731
\isa{bs\ {\isacharat}{\kern0pt}\ {\isacharbrackleft}{\kern0pt}Z{\isacharbrackright}{\kern0pt}\ {\isacharat}{\kern0pt}\ retrieve\ r\ {\isacharparenleft}{\kern0pt}inj\ {\isacharparenleft}{\kern0pt}r\mbox{$^\downarrow$}{\isacharparenright}{\kern0pt}\ c\ v{\isadigit{1}}{\isacharparenright}{\kern0pt}\ {\isacharat}{\kern0pt}\ retrieve\ {\isacharparenleft}{\kern0pt}ASTAR\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}Stars\ vs{\isacharparenright}{\kern0pt}}
+ − 1732
\]
+ − 1733
The left-hand side (3) above simplifies to
+ − 1734
\[
+ − 1735
\isa{bs\ {\isacharat}{\kern0pt}\ retrieve\ {\isacharparenleft}{\kern0pt}fuse\ {\isacharbrackleft}{\kern0pt}Z{\isacharbrackright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}r\mbox{$\bbslash$}c{\isacharparenright}{\kern0pt}{\isacharparenright}{\kern0pt}\ v{\isadigit{1}}\ {\isacharat}{\kern0pt}\ retrieve\ {\isacharparenleft}{\kern0pt}ASTAR\ {\isacharbrackleft}{\kern0pt}{\isacharbrackright}{\kern0pt}\ r{\isacharparenright}{\kern0pt}\ {\isacharparenleft}{\kern0pt}Stars\ vs{\isacharparenright}{\kern0pt}}
+ − 1736
\]
+ − 1737
We can move out the \isa{fuse\ {\isacharbrackleft}{\kern0pt}Z{\isacharbrackright}{\kern0pt}} and then use the IH to show that left-hand side
+ − 1738
and right-hand side are equal. This completes the proof.
+ − 1739
\end{proof}
+ − 1740
+ − 1741
+ − 1742
+ − 1743
\bibliographystyle{plain}
+ − 1744
\bibliography{root}%
+ − 1745
\end{isamarkuptext}\isamarkuptrue%
+ − 1746
%
+ − 1747
\isadelimtheory
+ − 1748
%
+ − 1749
\endisadelimtheory
+ − 1750
%
+ − 1751
\isatagtheory
+ − 1752
%
+ − 1753
\endisatagtheory
+ − 1754
{\isafoldtheory}%
+ − 1755
%
+ − 1756
\isadelimtheory
+ − 1757
\isanewline
+ − 1758
%
+ − 1759
\endisadelimtheory
+ − 1760
\isanewline
+ − 1761
\isanewline
+ − 1762
%
+ − 1763
\end{isabellebody}%
+ − 1764
\endinput
386
+ − 1765
%:%file=Paper.tex%:%
384
+ − 1766
%:%50=134%:%
+ − 1767
%:%62=136%:%
+ − 1768
%:%63=137%:%
+ − 1769
%:%64=138%:%
+ − 1770
%:%65=139%:%
+ − 1771
%:%66=140%:%
+ − 1772
%:%67=141%:%
+ − 1773
%:%68=142%:%
+ − 1774
%:%69=143%:%
+ − 1775
%:%70=144%:%
+ − 1776
%:%71=145%:%
+ − 1777
%:%72=146%:%
+ − 1778
%:%73=147%:%
+ − 1779
%:%74=148%:%
+ − 1780
%:%75=149%:%
+ − 1781
%:%76=150%:%
+ − 1782
%:%77=151%:%
+ − 1783
%:%78=152%:%
+ − 1784
%:%79=153%:%
+ − 1785
%:%80=154%:%
+ − 1786
%:%81=155%:%
+ − 1787
%:%82=156%:%
+ − 1788
%:%83=157%:%
+ − 1789
%:%84=158%:%
+ − 1790
%:%85=159%:%
+ − 1791
%:%86=160%:%
+ − 1792
%:%87=161%:%
+ − 1793
%:%88=162%:%
+ − 1794
%:%89=163%:%
+ − 1795
%:%90=164%:%
+ − 1796
%:%91=165%:%
+ − 1797
%:%92=166%:%
+ − 1798
%:%93=167%:%
+ − 1799
%:%94=168%:%
+ − 1800
%:%95=169%:%
+ − 1801
%:%96=170%:%
+ − 1802
%:%97=171%:%
+ − 1803
%:%98=172%:%
+ − 1804
%:%99=173%:%
+ − 1805
%:%100=174%:%
+ − 1806
%:%101=175%:%
+ − 1807
%:%102=176%:%
+ − 1808
%:%103=177%:%
+ − 1809
%:%104=178%:%
+ − 1810
%:%105=179%:%
+ − 1811
%:%106=180%:%
+ − 1812
%:%107=181%:%
+ − 1813
%:%108=182%:%
+ − 1814
%:%109=183%:%
+ − 1815
%:%110=184%:%
+ − 1816
%:%111=185%:%
+ − 1817
%:%112=186%:%
+ − 1818
%:%113=187%:%
+ − 1819
%:%114=188%:%
+ − 1820
%:%115=189%:%
+ − 1821
%:%116=190%:%
+ − 1822
%:%117=191%:%
+ − 1823
%:%118=192%:%
+ − 1824
%:%119=193%:%
+ − 1825
%:%120=194%:%
+ − 1826
%:%121=195%:%
+ − 1827
%:%122=196%:%
+ − 1828
%:%123=197%:%
+ − 1829
%:%124=198%:%
+ − 1830
%:%125=199%:%
+ − 1831
%:%126=200%:%
+ − 1832
%:%127=201%:%
+ − 1833
%:%128=202%:%
+ − 1834
%:%129=203%:%
+ − 1835
%:%130=204%:%
+ − 1836
%:%131=205%:%
+ − 1837
%:%132=206%:%
+ − 1838
%:%133=207%:%
+ − 1839
%:%134=208%:%
+ − 1840
%:%135=209%:%
+ − 1841
%:%136=210%:%
+ − 1842
%:%137=211%:%
+ − 1843
%:%138=212%:%
+ − 1844
%:%139=213%:%
+ − 1845
%:%140=214%:%
+ − 1846
%:%141=215%:%
+ − 1847
%:%142=216%:%
+ − 1848
%:%143=217%:%
+ − 1849
%:%144=218%:%
+ − 1850
%:%145=219%:%
+ − 1851
%:%146=220%:%
+ − 1852
%:%147=221%:%
+ − 1853
%:%148=222%:%
+ − 1854
%:%149=223%:%
+ − 1855
%:%150=224%:%
+ − 1856
%:%151=225%:%
+ − 1857
%:%152=226%:%
+ − 1858
%:%153=227%:%
+ − 1859
%:%154=228%:%
+ − 1860
%:%155=229%:%
+ − 1861
%:%156=230%:%
+ − 1862
%:%157=231%:%
+ − 1863
%:%158=232%:%
+ − 1864
%:%159=233%:%
+ − 1865
%:%160=234%:%
+ − 1866
%:%161=235%:%
+ − 1867
%:%162=236%:%
+ − 1868
%:%163=237%:%
+ − 1869
%:%164=238%:%
+ − 1870
%:%165=239%:%
+ − 1871
%:%166=240%:%
+ − 1872
%:%167=241%:%
+ − 1873
%:%168=242%:%
+ − 1874
%:%169=243%:%
+ − 1875
%:%170=244%:%
+ − 1876
%:%171=245%:%
+ − 1877
%:%172=246%:%
+ − 1878
%:%173=247%:%
+ − 1879
%:%174=248%:%
+ − 1880
%:%175=249%:%
+ − 1881
%:%176=250%:%
+ − 1882
%:%177=251%:%
+ − 1883
%:%178=252%:%
+ − 1884
%:%179=253%:%
+ − 1885
%:%180=254%:%
+ − 1886
%:%181=255%:%
+ − 1887
%:%182=256%:%
+ − 1888
%:%183=257%:%
+ − 1889
%:%184=258%:%
+ − 1890
%:%185=259%:%
+ − 1891
%:%186=260%:%
+ − 1892
%:%187=261%:%
+ − 1893
%:%188=262%:%
+ − 1894
%:%189=263%:%
389
+ − 1895
%:%198=271%:%
+ − 1896
%:%210=275%:%
+ − 1897
%:%211=276%:%
+ − 1898
%:%212=277%:%
+ − 1899
%:%213=278%:%
+ − 1900
%:%214=279%:%
+ − 1901
%:%215=280%:%
+ − 1902
%:%216=281%:%
+ − 1903
%:%217=282%:%
+ − 1904
%:%218=283%:%
+ − 1905
%:%219=284%:%
+ − 1906
%:%220=285%:%
+ − 1907
%:%221=286%:%
+ − 1908
%:%222=287%:%
+ − 1909
%:%223=288%:%
+ − 1910
%:%224=289%:%
+ − 1911
%:%225=290%:%
+ − 1912
%:%226=291%:%
+ − 1913
%:%227=292%:%
+ − 1914
%:%228=293%:%
+ − 1915
%:%229=294%:%
+ − 1916
%:%230=295%:%
+ − 1917
%:%231=296%:%
+ − 1918
%:%232=297%:%
+ − 1919
%:%241=304%:%
+ − 1920
%:%253=310%:%
+ − 1921
%:%254=311%:%
+ − 1922
%:%255=312%:%
+ − 1923
%:%256=313%:%
+ − 1924
%:%256=314%:%
+ − 1925
%:%257=315%:%
+ − 1926
%:%258=316%:%
+ − 1927
%:%259=317%:%
+ − 1928
%:%260=318%:%
+ − 1929
%:%261=319%:%
+ − 1930
%:%262=320%:%
+ − 1931
%:%263=321%:%
+ − 1932
%:%264=322%:%
+ − 1933
%:%265=323%:%
+ − 1934
%:%266=324%:%
+ − 1935
%:%267=325%:%
+ − 1936
%:%268=326%:%
+ − 1937
%:%269=327%:%
+ − 1938
%:%270=328%:%
+ − 1939
%:%271=329%:%
+ − 1940
%:%272=330%:%
+ − 1941
%:%273=331%:%
+ − 1942
%:%274=332%:%
+ − 1943
%:%275=333%:%
+ − 1944
%:%276=334%:%
+ − 1945
%:%277=335%:%
+ − 1946
%:%278=336%:%
+ − 1947
%:%279=337%:%
+ − 1948
%:%280=338%:%
+ − 1949
%:%281=339%:%
+ − 1950
%:%282=340%:%
+ − 1951
%:%283=341%:%
+ − 1952
%:%284=342%:%
+ − 1953
%:%285=343%:%
+ − 1954
%:%286=344%:%
+ − 1955
%:%287=345%:%
+ − 1956
%:%288=346%:%
+ − 1957
%:%289=347%:%
+ − 1958
%:%290=348%:%
+ − 1959
%:%291=349%:%
+ − 1960
%:%292=350%:%
+ − 1961
%:%293=351%:%
+ − 1962
%:%294=352%:%
+ − 1963
%:%295=353%:%
+ − 1964
%:%296=354%:%
+ − 1965
%:%297=355%:%
+ − 1966
%:%298=356%:%
+ − 1967
%:%299=357%:%
+ − 1968
%:%300=358%:%
+ − 1969
%:%301=359%:%
+ − 1970
%:%302=360%:%
+ − 1971
%:%303=361%:%
+ − 1972
%:%304=362%:%
+ − 1973
%:%305=363%:%
+ − 1974
%:%306=364%:%
+ − 1975
%:%307=365%:%
+ − 1976
%:%308=366%:%
+ − 1977
%:%309=367%:%
+ − 1978
%:%310=368%:%
+ − 1979
%:%311=369%:%
+ − 1980
%:%312=370%:%
+ − 1981
%:%313=371%:%
+ − 1982
%:%314=372%:%
+ − 1983
%:%315=373%:%
+ − 1984
%:%316=374%:%
+ − 1985
%:%317=375%:%
+ − 1986
%:%318=376%:%
+ − 1987
%:%319=377%:%
+ − 1988
%:%320=378%:%
+ − 1989
%:%320=379%:%
+ − 1990
%:%321=380%:%
+ − 1991
%:%322=381%:%
+ − 1992
%:%323=382%:%
+ − 1993
%:%324=383%:%
+ − 1994
%:%325=384%:%
+ − 1995
%:%326=385%:%
+ − 1996
%:%327=386%:%
+ − 1997
%:%328=387%:%
+ − 1998
%:%329=388%:%
+ − 1999
%:%330=389%:%
+ − 2000
%:%331=390%:%
+ − 2001
%:%332=391%:%
+ − 2002
%:%333=392%:%
+ − 2003
%:%334=393%:%
+ − 2004
%:%335=394%:%
+ − 2005
%:%336=395%:%
+ − 2006
%:%337=396%:%
+ − 2007
%:%338=397%:%
+ − 2008
%:%339=398%:%
+ − 2009
%:%340=399%:%
+ − 2010
%:%341=400%:%
+ − 2011
%:%342=401%:%
+ − 2012
%:%343=402%:%
+ − 2013
%:%344=403%:%
+ − 2014
%:%345=404%:%
+ − 2015
%:%346=405%:%
+ − 2016
%:%347=406%:%
+ − 2017
%:%348=407%:%
+ − 2018
%:%349=408%:%
+ − 2019
%:%350=409%:%
+ − 2020
%:%351=410%:%
+ − 2021
%:%352=411%:%
+ − 2022
%:%353=412%:%
+ − 2023
%:%354=413%:%
+ − 2024
%:%355=414%:%
+ − 2025
%:%356=415%:%
+ − 2026
%:%357=416%:%
+ − 2027
%:%358=417%:%
+ − 2028
%:%359=418%:%
+ − 2029
%:%360=419%:%
+ − 2030
%:%361=420%:%
+ − 2031
%:%362=421%:%
+ − 2032
%:%363=422%:%
+ − 2033
%:%364=423%:%
+ − 2034
%:%365=424%:%
+ − 2035
%:%366=425%:%
+ − 2036
%:%367=426%:%
+ − 2037
%:%368=427%:%
+ − 2038
%:%369=428%:%
+ − 2039
%:%370=429%:%
+ − 2040
%:%371=430%:%
+ − 2041
%:%372=431%:%
+ − 2042
%:%373=432%:%
+ − 2043
%:%374=433%:%
+ − 2044
%:%375=434%:%
+ − 2045
%:%376=435%:%
+ − 2046
%:%377=436%:%
+ − 2047
%:%378=437%:%
+ − 2048
%:%379=438%:%
+ − 2049
%:%380=439%:%
+ − 2050
%:%381=440%:%
+ − 2051
%:%382=441%:%
+ − 2052
%:%383=442%:%
+ − 2053
%:%384=443%:%
+ − 2054
%:%385=444%:%
+ − 2055
%:%386=445%:%
+ − 2056
%:%387=446%:%
+ − 2057
%:%388=447%:%
+ − 2058
%:%389=448%:%
+ − 2059
%:%390=449%:%
+ − 2060
%:%391=450%:%
+ − 2061
%:%392=451%:%
+ − 2062
%:%393=452%:%
+ − 2063
%:%394=453%:%
+ − 2064
%:%395=454%:%
+ − 2065
%:%396=455%:%
+ − 2066
%:%397=456%:%
+ − 2067
%:%398=457%:%
+ − 2068
%:%399=458%:%
+ − 2069
%:%400=459%:%
+ − 2070
%:%401=460%:%
+ − 2071
%:%402=461%:%
+ − 2072
%:%403=462%:%
+ − 2073
%:%404=463%:%
+ − 2074
%:%405=464%:%
+ − 2075
%:%406=465%:%
+ − 2076
%:%407=466%:%
+ − 2077
%:%408=467%:%
+ − 2078
%:%409=468%:%
+ − 2079
%:%410=469%:%
+ − 2080
%:%411=470%:%
+ − 2081
%:%412=471%:%
+ − 2082
%:%413=472%:%
+ − 2083
%:%414=473%:%
+ − 2084
%:%415=474%:%
+ − 2085
%:%416=475%:%
+ − 2086
%:%417=476%:%
+ − 2087
%:%418=477%:%
+ − 2088
%:%419=478%:%
+ − 2089
%:%420=479%:%
+ − 2090
%:%421=480%:%
+ − 2091
%:%422=481%:%
+ − 2092
%:%423=482%:%
+ − 2093
%:%424=483%:%
+ − 2094
%:%425=484%:%
+ − 2095
%:%434=491%:%
+ − 2096
%:%446=493%:%
+ − 2097
%:%447=494%:%
+ − 2098
%:%447=495%:%
+ − 2099
%:%448=496%:%
+ − 2100
%:%449=497%:%
+ − 2101
%:%450=498%:%
+ − 2102
%:%451=499%:%
+ − 2103
%:%452=500%:%
+ − 2104
%:%453=501%:%
+ − 2105
%:%454=502%:%
+ − 2106
%:%455=503%:%
+ − 2107
%:%456=504%:%
+ − 2108
%:%457=505%:%
+ − 2109
%:%458=506%:%
+ − 2110
%:%459=507%:%
+ − 2111
%:%460=508%:%
+ − 2112
%:%461=509%:%
+ − 2113
%:%462=510%:%
+ − 2114
%:%463=511%:%
+ − 2115
%:%464=512%:%
+ − 2116
%:%465=513%:%
+ − 2117
%:%466=514%:%
+ − 2118
%:%467=515%:%
+ − 2119
%:%468=516%:%
+ − 2120
%:%469=517%:%
+ − 2121
%:%470=518%:%
+ − 2122
%:%471=519%:%
+ − 2123
%:%472=520%:%
+ − 2124
%:%473=521%:%
+ − 2125
%:%474=522%:%
+ − 2126
%:%475=523%:%
+ − 2127
%:%476=524%:%
+ − 2128
%:%477=525%:%
+ − 2129
%:%478=526%:%
+ − 2130
%:%479=527%:%
+ − 2131
%:%480=528%:%
+ − 2132
%:%481=529%:%
+ − 2133
%:%482=530%:%
+ − 2134
%:%483=531%:%
+ − 2135
%:%484=532%:%
+ − 2136
%:%485=533%:%
+ − 2137
%:%486=534%:%
+ − 2138
%:%486=535%:%
+ − 2139
%:%487=536%:%
+ − 2140
%:%488=537%:%
+ − 2141
%:%489=538%:%
+ − 2142
%:%490=539%:%
+ − 2143
%:%491=540%:%
+ − 2144
%:%491=541%:%
+ − 2145
%:%492=542%:%
+ − 2146
%:%493=543%:%
+ − 2147
%:%494=544%:%
+ − 2148
%:%495=545%:%
+ − 2149
%:%496=546%:%
+ − 2150
%:%497=547%:%
+ − 2151
%:%498=548%:%
+ − 2152
%:%499=549%:%
+ − 2153
%:%500=550%:%
+ − 2154
%:%501=551%:%
+ − 2155
%:%502=552%:%
+ − 2156
%:%503=553%:%
+ − 2157
%:%504=554%:%
+ − 2158
%:%505=555%:%
+ − 2159
%:%506=556%:%
+ − 2160
%:%507=557%:%
+ − 2161
%:%508=558%:%
+ − 2162
%:%509=559%:%
+ − 2163
%:%510=560%:%
+ − 2164
%:%511=561%:%
+ − 2165
%:%512=562%:%
+ − 2166
%:%513=563%:%
+ − 2167
%:%514=564%:%
+ − 2168
%:%515=565%:%
+ − 2169
%:%516=566%:%
+ − 2170
%:%517=567%:%
+ − 2171
%:%518=568%:%
+ − 2172
%:%519=569%:%
+ − 2173
%:%520=570%:%
+ − 2174
%:%521=571%:%
+ − 2175
%:%522=572%:%
+ − 2176
%:%523=573%:%
+ − 2177
%:%524=574%:%
+ − 2178
%:%525=575%:%
+ − 2179
%:%526=576%:%
+ − 2180
%:%527=577%:%
+ − 2181
%:%528=578%:%
+ − 2182
%:%529=579%:%
+ − 2183
%:%530=580%:%
+ − 2184
%:%531=581%:%
+ − 2185
%:%532=582%:%
+ − 2186
%:%533=583%:%
+ − 2187
%:%534=584%:%
+ − 2188
%:%535=585%:%
+ − 2189
%:%536=586%:%
+ − 2190
%:%537=587%:%
+ − 2191
%:%538=588%:%
+ − 2192
%:%539=589%:%
+ − 2193
%:%540=590%:%
+ − 2194
%:%541=591%:%
+ − 2195
%:%542=592%:%
+ − 2196
%:%543=593%:%
+ − 2197
%:%544=594%:%
+ − 2198
%:%545=595%:%
+ − 2199
%:%546=596%:%
+ − 2200
%:%547=597%:%
+ − 2201
%:%548=598%:%
+ − 2202
%:%549=599%:%
+ − 2203
%:%550=600%:%
+ − 2204
%:%551=601%:%
+ − 2205
%:%552=602%:%
+ − 2206
%:%553=603%:%
+ − 2207
%:%554=604%:%
+ − 2208
%:%555=605%:%
+ − 2209
%:%556=606%:%
+ − 2210
%:%557=607%:%
+ − 2211
%:%558=608%:%
+ − 2212
%:%559=609%:%
+ − 2213
%:%560=610%:%
+ − 2214
%:%561=611%:%
+ − 2215
%:%562=612%:%
+ − 2216
%:%563=613%:%
+ − 2217
%:%564=614%:%
+ − 2218
%:%565=615%:%
+ − 2219
%:%566=616%:%
+ − 2220
%:%567=617%:%
+ − 2221
%:%568=618%:%
+ − 2222
%:%569=619%:%
+ − 2223
%:%570=620%:%
+ − 2224
%:%571=621%:%
+ − 2225
%:%572=622%:%
+ − 2226
%:%573=623%:%
+ − 2227
%:%574=624%:%
+ − 2228
%:%575=625%:%
+ − 2229
%:%576=626%:%
+ − 2230
%:%577=627%:%
+ − 2231
%:%578=628%:%
+ − 2232
%:%579=629%:%
+ − 2233
%:%580=630%:%
+ − 2234
%:%589=634%:%
+ − 2235
%:%601=638%:%
+ − 2236
%:%602=639%:%
+ − 2237
%:%603=640%:%
+ − 2238
%:%604=641%:%
+ − 2239
%:%605=642%:%
+ − 2240
%:%606=643%:%
+ − 2241
%:%607=644%:%
+ − 2242
%:%608=645%:%
+ − 2243
%:%609=646%:%
+ − 2244
%:%610=647%:%
+ − 2245
%:%611=648%:%
+ − 2246
%:%612=649%:%
+ − 2247
%:%613=650%:%
+ − 2248
%:%614=651%:%
+ − 2249
%:%615=652%:%
+ − 2250
%:%616=653%:%
+ − 2251
%:%617=654%:%
+ − 2252
%:%618=655%:%
+ − 2253
%:%619=656%:%
+ − 2254
%:%620=657%:%
+ − 2255
%:%621=658%:%
+ − 2256
%:%622=659%:%
+ − 2257
%:%623=660%:%
+ − 2258
%:%624=661%:%
+ − 2259
%:%625=662%:%
+ − 2260
%:%626=663%:%
+ − 2261
%:%627=664%:%
+ − 2262
%:%628=665%:%
+ − 2263
%:%629=666%:%
+ − 2264
%:%630=667%:%
+ − 2265
%:%631=668%:%
+ − 2266
%:%632=669%:%
+ − 2267
%:%633=670%:%
+ − 2268
%:%634=671%:%
+ − 2269
%:%635=672%:%
+ − 2270
%:%636=673%:%
+ − 2271
%:%637=674%:%
+ − 2272
%:%638=675%:%
+ − 2273
%:%639=676%:%
+ − 2274
%:%640=677%:%
+ − 2275
%:%641=678%:%
+ − 2276
%:%642=679%:%
+ − 2277
%:%643=680%:%
+ − 2278
%:%644=681%:%
+ − 2279
%:%645=682%:%
+ − 2280
%:%646=683%:%
+ − 2281
%:%647=684%:%
+ − 2282
%:%648=685%:%
+ − 2283
%:%649=686%:%
+ − 2284
%:%650=687%:%
+ − 2285
%:%651=688%:%
+ − 2286
%:%652=689%:%
+ − 2287
%:%653=690%:%
+ − 2288
%:%654=691%:%
+ − 2289
%:%655=692%:%
+ − 2290
%:%656=693%:%
+ − 2291
%:%657=694%:%
+ − 2292
%:%658=695%:%
+ − 2293
%:%659=696%:%
+ − 2294
%:%660=697%:%
+ − 2295
%:%661=698%:%
+ − 2296
%:%662=699%:%
+ − 2297
%:%663=700%:%
+ − 2298
%:%664=701%:%
+ − 2299
%:%665=702%:%
+ − 2300
%:%666=703%:%
+ − 2301
%:%667=704%:%
+ − 2302
%:%668=705%:%
+ − 2303
%:%669=706%:%
+ − 2304
%:%670=707%:%
+ − 2305
%:%671=708%:%
+ − 2306
%:%672=709%:%
+ − 2307
%:%673=710%:%
+ − 2308
%:%674=711%:%
+ − 2309
%:%675=712%:%
+ − 2310
%:%676=713%:%
+ − 2311
%:%677=714%:%
+ − 2312
%:%678=715%:%
+ − 2313
%:%679=716%:%
+ − 2314
%:%680=717%:%
+ − 2315
%:%681=718%:%
+ − 2316
%:%682=719%:%
+ − 2317
%:%683=720%:%
+ − 2318
%:%684=721%:%
+ − 2319
%:%685=722%:%
+ − 2320
%:%686=723%:%
+ − 2321
%:%687=724%:%
+ − 2322
%:%688=725%:%
+ − 2323
%:%689=726%:%
+ − 2324
%:%690=727%:%
+ − 2325
%:%691=728%:%
+ − 2326
%:%692=729%:%
+ − 2327
%:%693=730%:%
+ − 2328
%:%694=731%:%
+ − 2329
%:%695=732%:%
+ − 2330
%:%696=733%:%
+ − 2331
%:%697=734%:%
+ − 2332
%:%698=735%:%
+ − 2333
%:%699=736%:%
+ − 2334
%:%700=737%:%
+ − 2335
%:%701=738%:%
+ − 2336
%:%702=739%:%
+ − 2337
%:%703=740%:%
+ − 2338
%:%704=741%:%
+ − 2339
%:%705=742%:%
+ − 2340
%:%706=743%:%
+ − 2341
%:%707=744%:%
+ − 2342
%:%708=745%:%
+ − 2343
%:%709=746%:%
+ − 2344
%:%710=747%:%
+ − 2345
%:%711=748%:%
+ − 2346
%:%712=749%:%
+ − 2347
%:%713=750%:%
+ − 2348
%:%714=751%:%
+ − 2349
%:%715=752%:%
+ − 2350
%:%715=753%:%
+ − 2351
%:%716=754%:%
+ − 2352
%:%716=755%:%
+ − 2353
%:%717=756%:%
+ − 2354
%:%718=757%:%
+ − 2355
%:%718=758%:%
+ − 2356
%:%719=759%:%
+ − 2357
%:%720=760%:%
+ − 2358
%:%721=761%:%
+ − 2359
%:%722=762%:%
+ − 2360
%:%723=763%:%
+ − 2361
%:%724=764%:%
+ − 2362
%:%725=765%:%
+ − 2363
%:%726=766%:%
+ − 2364
%:%727=767%:%
+ − 2365
%:%728=768%:%
+ − 2366
%:%729=769%:%
+ − 2367
%:%730=770%:%
+ − 2368
%:%731=771%:%
+ − 2369
%:%732=772%:%
+ − 2370
%:%733=773%:%
+ − 2371
%:%734=774%:%
+ − 2372
%:%735=775%:%
+ − 2373
%:%736=776%:%
+ − 2374
%:%737=777%:%
+ − 2375
%:%738=778%:%
+ − 2376
%:%739=779%:%
+ − 2377
%:%740=780%:%
+ − 2378
%:%741=781%:%
+ − 2379
%:%742=782%:%
+ − 2380
%:%743=783%:%
+ − 2381
%:%744=784%:%
+ − 2382
%:%745=785%:%
+ − 2383
%:%746=786%:%
+ − 2384
%:%747=787%:%
+ − 2385
%:%748=788%:%
+ − 2386
%:%749=789%:%
+ − 2387
%:%750=790%:%
+ − 2388
%:%751=791%:%
+ − 2389
%:%752=792%:%
+ − 2390
%:%753=793%:%
+ − 2391
%:%754=794%:%
+ − 2392
%:%755=795%:%
+ − 2393
%:%756=796%:%
+ − 2394
%:%757=797%:%
+ − 2395
%:%758=798%:%
+ − 2396
%:%759=799%:%
+ − 2397
%:%760=800%:%
+ − 2398
%:%761=801%:%
+ − 2399
%:%762=802%:%
+ − 2400
%:%763=803%:%
+ − 2401
%:%764=804%:%
+ − 2402
%:%765=805%:%
+ − 2403
%:%766=806%:%
+ − 2404
%:%767=807%:%
+ − 2405
%:%768=808%:%
+ − 2406
%:%769=809%:%
+ − 2407
%:%770=810%:%
+ − 2408
%:%771=811%:%
+ − 2409
%:%772=812%:%
+ − 2410
%:%773=813%:%
+ − 2411
%:%774=814%:%
+ − 2412
%:%774=815%:%
+ − 2413
%:%774=816%:%
+ − 2414
%:%775=817%:%
+ − 2415
%:%776=818%:%
+ − 2416
%:%777=819%:%
+ − 2417
%:%778=820%:%
+ − 2418
%:%779=821%:%
+ − 2419
%:%780=822%:%
+ − 2420
%:%781=823%:%
+ − 2421
%:%782=824%:%
+ − 2422
%:%783=825%:%
+ − 2423
%:%783=826%:%
+ − 2424
%:%784=827%:%
+ − 2425
%:%785=828%:%
+ − 2426
%:%786=829%:%
+ − 2427
%:%787=830%:%
+ − 2428
%:%788=831%:%
+ − 2429
%:%789=832%:%
+ − 2430
%:%790=833%:%
+ − 2431
%:%791=834%:%
+ − 2432
%:%792=835%:%
+ − 2433
%:%793=836%:%
+ − 2434
%:%794=837%:%
+ − 2435
%:%795=838%:%
+ − 2436
%:%796=839%:%
+ − 2437
%:%797=840%:%
+ − 2438
%:%798=841%:%
+ − 2439
%:%799=842%:%
+ − 2440
%:%800=843%:%
+ − 2441
%:%801=844%:%
+ − 2442
%:%802=845%:%
+ − 2443
%:%803=846%:%
+ − 2444
%:%804=847%:%
+ − 2445
%:%805=848%:%
+ − 2446
%:%806=849%:%
+ − 2447
%:%807=850%:%
+ − 2448
%:%808=851%:%
+ − 2449
%:%809=852%:%
+ − 2450
%:%810=853%:%
+ − 2451
%:%811=854%:%
+ − 2452
%:%812=855%:%
+ − 2453
%:%813=856%:%
+ − 2454
%:%814=857%:%
+ − 2455
%:%815=858%:%
+ − 2456
%:%816=859%:%
+ − 2457
%:%817=860%:%
+ − 2458
%:%818=861%:%
+ − 2459
%:%818=862%:%
+ − 2460
%:%819=863%:%
+ − 2461
%:%820=864%:%
+ − 2462
%:%821=865%:%
+ − 2463
%:%822=866%:%
+ − 2464
%:%823=867%:%
+ − 2465
%:%824=868%:%
+ − 2466
%:%825=869%:%
+ − 2467
%:%825=870%:%
+ − 2468
%:%826=871%:%
+ − 2469
%:%827=872%:%
+ − 2470
%:%828=873%:%
+ − 2471
%:%828=874%:%
+ − 2472
%:%829=875%:%
+ − 2473
%:%830=876%:%
+ − 2474
%:%831=877%:%
+ − 2475
%:%832=878%:%
+ − 2476
%:%833=879%:%
+ − 2477
%:%834=880%:%
+ − 2478
%:%835=881%:%
+ − 2479
%:%836=882%:%
+ − 2480
%:%837=883%:%
+ − 2481
%:%838=884%:%
+ − 2482
%:%839=885%:%
+ − 2483
%:%839=886%:%
+ − 2484
%:%840=887%:%
+ − 2485
%:%841=888%:%
+ − 2486
%:%842=889%:%
+ − 2487
%:%843=890%:%
+ − 2488
%:%843=891%:%
+ − 2489
%:%844=892%:%
+ − 2490
%:%845=893%:%
+ − 2491
%:%846=894%:%
+ − 2492
%:%847=895%:%
+ − 2493
%:%848=896%:%
+ − 2494
%:%849=897%:%
+ − 2495
%:%850=898%:%
+ − 2496
%:%851=899%:%
+ − 2497
%:%852=900%:%
+ − 2498
%:%853=901%:%
+ − 2499
%:%854=902%:%
+ − 2500
%:%855=903%:%
+ − 2501
%:%856=904%:%
+ − 2502
%:%857=905%:%
+ − 2503
%:%858=906%:%
+ − 2504
%:%859=907%:%
+ − 2505
%:%860=908%:%
+ − 2506
%:%861=909%:%
+ − 2507
%:%862=910%:%
+ − 2508
%:%863=911%:%
+ − 2509
%:%864=912%:%
+ − 2510
%:%865=913%:%
+ − 2511
%:%866=914%:%
+ − 2512
%:%867=915%:%
+ − 2513
%:%868=916%:%
+ − 2514
%:%869=917%:%
+ − 2515
%:%870=918%:%
+ − 2516
%:%871=919%:%
+ − 2517
%:%872=920%:%
+ − 2518
%:%873=921%:%
+ − 2519
%:%874=922%:%
+ − 2520
%:%875=923%:%
+ − 2521
%:%876=924%:%
+ − 2522
%:%877=925%:%
+ − 2523
%:%878=926%:%
+ − 2524
%:%879=927%:%
+ − 2525
%:%880=928%:%
+ − 2526
%:%881=929%:%
+ − 2527
%:%882=930%:%
+ − 2528
%:%883=931%:%
+ − 2529
%:%884=932%:%
+ − 2530
%:%885=933%:%
+ − 2531
%:%886=934%:%
+ − 2532
%:%887=935%:%
+ − 2533
%:%888=936%:%
+ − 2534
%:%889=937%:%
+ − 2535
%:%890=938%:%
+ − 2536
%:%891=939%:%
+ − 2537
%:%892=940%:%
+ − 2538
%:%893=941%:%
+ − 2539
%:%894=942%:%
+ − 2540
%:%895=943%:%
+ − 2541
%:%896=944%:%
+ − 2542
%:%897=945%:%
+ − 2543
%:%898=946%:%
+ − 2544
%:%899=947%:%
+ − 2545
%:%900=948%:%
+ − 2546
%:%901=949%:%
+ − 2547
%:%901=950%:%
+ − 2548
%:%902=951%:%
+ − 2549
%:%903=952%:%
+ − 2550
%:%904=953%:%
+ − 2551
%:%905=954%:%
+ − 2552
%:%906=955%:%
+ − 2553
%:%907=956%:%
+ − 2554
%:%908=957%:%
+ − 2555
%:%909=958%:%
+ − 2556
%:%910=959%:%
+ − 2557
%:%911=960%:%
+ − 2558
%:%912=961%:%
+ − 2559
%:%913=962%:%
+ − 2560
%:%914=963%:%
+ − 2561
%:%915=964%:%
+ − 2562
%:%916=965%:%
+ − 2563
%:%917=966%:%
+ − 2564
%:%918=967%:%
+ − 2565
%:%919=968%:%
+ − 2566
%:%920=969%:%
+ − 2567
%:%921=970%:%
+ − 2568
%:%922=971%:%
+ − 2569
%:%923=972%:%
+ − 2570
%:%924=973%:%
+ − 2571
%:%925=974%:%
+ − 2572
%:%926=975%:%
+ − 2573
%:%927=976%:%
+ − 2574
%:%928=977%:%
+ − 2575
%:%929=978%:%
+ − 2576
%:%930=979%:%
+ − 2577
%:%931=980%:%
+ − 2578
%:%932=981%:%
+ − 2579
%:%933=982%:%
+ − 2580
%:%934=983%:%
+ − 2581
%:%934=984%:%
+ − 2582
%:%935=985%:%
+ − 2583
%:%936=986%:%
+ − 2584
%:%937=987%:%
+ − 2585
%:%938=988%:%
+ − 2586
%:%939=989%:%
+ − 2587
%:%940=990%:%
+ − 2588
%:%941=991%:%
+ − 2589
%:%942=992%:%
+ − 2590
%:%943=993%:%
+ − 2591
%:%944=994%:%
+ − 2592
%:%945=995%:%
+ − 2593
%:%946=996%:%
+ − 2594
%:%947=997%:%
+ − 2595
%:%948=998%:%
+ − 2596
%:%949=999%:%
+ − 2597
%:%950=1000%:%
+ − 2598
%:%951=1001%:%
+ − 2599
%:%952=1002%:%
+ − 2600
%:%953=1003%:%
+ − 2601
%:%954=1004%:%
+ − 2602
%:%955=1005%:%
+ − 2603
%:%956=1006%:%
+ − 2604
%:%957=1007%:%
+ − 2605
%:%958=1008%:%
+ − 2606
%:%959=1009%:%
+ − 2607
%:%960=1010%:%
+ − 2608
%:%961=1011%:%
+ − 2609
%:%962=1012%:%
+ − 2610
%:%963=1013%:%
+ − 2611
%:%964=1014%:%
+ − 2612
%:%964=1015%:%
+ − 2613
%:%965=1016%:%
+ − 2614
%:%966=1017%:%
+ − 2615
%:%967=1018%:%
+ − 2616
%:%968=1019%:%
+ − 2617
%:%969=1020%:%
+ − 2618
%:%970=1021%:%
+ − 2619
%:%971=1022%:%
+ − 2620
%:%972=1023%:%
+ − 2621
%:%972=1024%:%
+ − 2622
%:%973=1025%:%
+ − 2623
%:%974=1026%:%
+ − 2624
%:%975=1027%:%
+ − 2625
%:%976=1028%:%
+ − 2626
%:%977=1029%:%
+ − 2627
%:%978=1030%:%
+ − 2628
%:%979=1031%:%
+ − 2629
%:%980=1032%:%
+ − 2630
%:%981=1033%:%
+ − 2631
%:%982=1034%:%
+ − 2632
%:%983=1035%:%
+ − 2633
%:%984=1036%:%
+ − 2634
%:%985=1037%:%
+ − 2635
%:%986=1038%:%
+ − 2636
%:%987=1039%:%
+ − 2637
%:%988=1040%:%
+ − 2638
%:%989=1041%:%
+ − 2639
%:%990=1042%:%
+ − 2640
%:%991=1043%:%
+ − 2641
%:%992=1044%:%
+ − 2642
%:%993=1045%:%
+ − 2643
%:%994=1046%:%
+ − 2644
%:%995=1047%:%
+ − 2645
%:%996=1048%:%
+ − 2646
%:%997=1049%:%
+ − 2647
%:%998=1050%:%
+ − 2648
%:%999=1051%:%
+ − 2649
%:%1000=1052%:%
+ − 2650
%:%1001=1053%:%
+ − 2651
%:%1002=1054%:%
+ − 2652
%:%1003=1055%:%
+ − 2653
%:%1004=1056%:%
+ − 2654
%:%1005=1057%:%
+ − 2655
%:%1006=1058%:%
+ − 2656
%:%1007=1059%:%
+ − 2657
%:%1008=1060%:%
387
+ − 2658
%:%1009=1061%:%
389
+ − 2659
%:%1009=1062%:%
+ − 2660
%:%1009=1063%:%
+ − 2661
%:%1010=1064%:%
+ − 2662
%:%1010=1065%:%
+ − 2663
%:%1010=1066%:%
+ − 2664
%:%1011=1067%:%
+ − 2665
%:%1012=1068%:%
+ − 2666
%:%1012=1069%:%
+ − 2667
%:%1013=1070%:%
+ − 2668
%:%1014=1071%:%
+ − 2669
%:%1015=1072%:%
+ − 2670
%:%1016=1073%:%
+ − 2671
%:%1017=1074%:%
+ − 2672
%:%1018=1075%:%
+ − 2673
%:%1019=1076%:%
+ − 2674
%:%1020=1077%:%
+ − 2675
%:%1021=1078%:%
+ − 2676
%:%1022=1079%:%
+ − 2677
%:%1023=1080%:%
+ − 2678
%:%1024=1081%:%
+ − 2679
%:%1025=1082%:%
+ − 2680
%:%1026=1083%:%
+ − 2681
%:%1027=1084%:%
+ − 2682
%:%1028=1085%:%
+ − 2683
%:%1029=1086%:%
+ − 2684
%:%1030=1087%:%
+ − 2685
%:%1031=1088%:%
+ − 2686
%:%1032=1089%:%
+ − 2687
%:%1033=1090%:%
+ − 2688
%:%1034=1091%:%
+ − 2689
%:%1035=1092%:%
+ − 2690
%:%1036=1093%:%
+ − 2691
%:%1037=1094%:%
+ − 2692
%:%1038=1095%:%
+ − 2693
%:%1039=1096%:%
+ − 2694
%:%1040=1097%:%
+ − 2695
%:%1041=1098%:%
+ − 2696
%:%1042=1099%:%
+ − 2697
%:%1043=1100%:%
+ − 2698
%:%1044=1101%:%
+ − 2699
%:%1045=1102%:%
+ − 2700
%:%1046=1103%:%
+ − 2701
%:%1046=1104%:%
+ − 2702
%:%1047=1105%:%
+ − 2703
%:%1048=1106%:%
+ − 2704
%:%1049=1107%:%
+ − 2705
%:%1049=1108%:%
+ − 2706
%:%1049=1109%:%
+ − 2707
%:%1049=1110%:%
+ − 2708
%:%1050=1111%:%
+ − 2709
%:%1051=1112%:%
+ − 2710
%:%1052=1113%:%
+ − 2711
%:%1053=1114%:%
+ − 2712
%:%1054=1115%:%
+ − 2713
%:%1055=1116%:%
+ − 2714
%:%1056=1117%:%
+ − 2715
%:%1057=1118%:%
+ − 2716
%:%1058=1119%:%
+ − 2717
%:%1059=1120%:%
+ − 2718
%:%1060=1121%:%
+ − 2719
%:%1061=1122%:%
+ − 2720
%:%1062=1123%:%
+ − 2721
%:%1063=1124%:%
+ − 2722
%:%1064=1125%:%
+ − 2723
%:%1065=1126%:%
+ − 2724
%:%1066=1127%:%
+ − 2725
%:%1067=1128%:%
+ − 2726
%:%1068=1129%:%
+ − 2727
%:%1069=1130%:%
+ − 2728
%:%1070=1131%:%
+ − 2729
%:%1071=1132%:%
+ − 2730
%:%1072=1133%:%
+ − 2731
%:%1073=1134%:%
+ − 2732
%:%1074=1135%:%
+ − 2733
%:%1075=1136%:%
+ − 2734
%:%1076=1137%:%
+ − 2735
%:%1077=1138%:%
+ − 2736
%:%1078=1139%:%
+ − 2737
%:%1079=1140%:%
+ − 2738
%:%1080=1141%:%
+ − 2739
%:%1081=1142%:%
+ − 2740
%:%1082=1143%:%
+ − 2741
%:%1083=1144%:%
+ − 2742
%:%1084=1145%:%
+ − 2743
%:%1085=1146%:%
+ − 2744
%:%1086=1147%:%
+ − 2745
%:%1095=1151%:%
+ − 2746
%:%1107=1155%:%
+ − 2747
%:%1108=1156%:%
+ − 2748
%:%1109=1157%:%
+ − 2749
%:%1110=1158%:%
+ − 2750
%:%1111=1159%:%
+ − 2751
%:%1112=1160%:%
+ − 2752
%:%1113=1161%:%
+ − 2753
%:%1114=1162%:%
+ − 2754
%:%1115=1163%:%
+ − 2755
%:%1116=1164%:%
+ − 2756
%:%1117=1165%:%
+ − 2757
%:%1118=1166%:%
+ − 2758
%:%1119=1167%:%
+ − 2759
%:%1120=1168%:%
+ − 2760
%:%1121=1169%:%
+ − 2761
%:%1122=1170%:%
+ − 2762
%:%1123=1171%:%
+ − 2763
%:%1124=1172%:%
+ − 2764
%:%1125=1173%:%
+ − 2765
%:%1126=1174%:%
+ − 2766
%:%1127=1175%:%
+ − 2767
%:%1128=1176%:%
+ − 2768
%:%1129=1177%:%
+ − 2769
%:%1130=1178%:%
+ − 2770
%:%1131=1179%:%
+ − 2771
%:%1132=1180%:%
+ − 2772
%:%1133=1181%:%
+ − 2773
%:%1134=1182%:%
+ − 2774
%:%1135=1183%:%
+ − 2775
%:%1136=1184%:%
+ − 2776
%:%1137=1185%:%
+ − 2777
%:%1138=1186%:%
+ − 2778
%:%1139=1187%:%
+ − 2779
%:%1140=1188%:%
+ − 2780
%:%1141=1189%:%
+ − 2781
%:%1142=1190%:%
+ − 2782
%:%1143=1191%:%
+ − 2783
%:%1144=1192%:%
+ − 2784
%:%1145=1193%:%
+ − 2785
%:%1146=1194%:%
+ − 2786
%:%1147=1195%:%
+ − 2787
%:%1148=1196%:%
+ − 2788
%:%1149=1197%:%
+ − 2789
%:%1150=1198%:%
+ − 2790
%:%1151=1199%:%
+ − 2791
%:%1152=1200%:%
+ − 2792
%:%1153=1201%:%
+ − 2793
%:%1154=1202%:%
+ − 2794
%:%1155=1203%:%
+ − 2795
%:%1156=1204%:%
+ − 2796
%:%1157=1205%:%
+ − 2797
%:%1158=1206%:%
+ − 2798
%:%1159=1207%:%
+ − 2799
%:%1160=1208%:%
+ − 2800
%:%1161=1209%:%
+ − 2801
%:%1162=1210%:%
+ − 2802
%:%1163=1211%:%
+ − 2803
%:%1164=1212%:%
+ − 2804
%:%1165=1213%:%
+ − 2805
%:%1166=1214%:%
+ − 2806
%:%1167=1215%:%
+ − 2807
%:%1168=1216%:%
+ − 2808
%:%1169=1217%:%
+ − 2809
%:%1170=1218%:%
+ − 2810
%:%1171=1219%:%
+ − 2811
%:%1172=1220%:%
+ − 2812
%:%1173=1221%:%
+ − 2813
%:%1174=1222%:%
+ − 2814
%:%1175=1223%:%
+ − 2815
%:%1176=1224%:%
+ − 2816
%:%1177=1225%:%
+ − 2817
%:%1178=1226%:%
+ − 2818
%:%1179=1227%:%
+ − 2819
%:%1180=1228%:%
+ − 2820
%:%1181=1229%:%
+ − 2821
%:%1182=1230%:%
+ − 2822
%:%1183=1231%:%
+ − 2823
%:%1184=1232%:%
+ − 2824
%:%1185=1233%:%
+ − 2825
%:%1186=1234%:%
+ − 2826
%:%1187=1235%:%
+ − 2827
%:%1188=1236%:%
+ − 2828
%:%1189=1237%:%
+ − 2829
%:%1190=1238%:%
+ − 2830
%:%1191=1239%:%
+ − 2831
%:%1192=1240%:%
+ − 2832
%:%1193=1241%:%
+ − 2833
%:%1194=1242%:%
+ − 2834
%:%1195=1243%:%
+ − 2835
%:%1196=1244%:%
+ − 2836
%:%1197=1245%:%
+ − 2837
%:%1198=1246%:%
+ − 2838
%:%1199=1247%:%
+ − 2839
%:%1200=1248%:%
+ − 2840
%:%1201=1249%:%
+ − 2841
%:%1202=1250%:%
+ − 2842
%:%1203=1251%:%
+ − 2843
%:%1204=1252%:%
+ − 2844
%:%1205=1253%:%
+ − 2845
%:%1206=1254%:%
+ − 2846
%:%1207=1255%:%
+ − 2847
%:%1208=1256%:%
+ − 2848
%:%1209=1257%:%
+ − 2849
%:%1210=1258%:%
+ − 2850
%:%1211=1259%:%
+ − 2851
%:%1212=1260%:%
+ − 2852
%:%1213=1261%:%
+ − 2853
%:%1214=1262%:%
+ − 2854
%:%1215=1263%:%
+ − 2855
%:%1216=1264%:%
+ − 2856
%:%1217=1265%:%
+ − 2857
%:%1218=1266%:%
+ − 2858
%:%1219=1267%:%
+ − 2859
%:%1220=1268%:%
+ − 2860
%:%1221=1269%:%
+ − 2861
%:%1222=1270%:%
+ − 2862
%:%1222=1271%:%
+ − 2863
%:%1223=1272%:%
+ − 2864
%:%1224=1273%:%
+ − 2865
%:%1225=1274%:%
+ − 2866
%:%1226=1275%:%
+ − 2867
%:%1227=1276%:%
+ − 2868
%:%1228=1277%:%
+ − 2869
%:%1229=1278%:%
+ − 2870
%:%1230=1279%:%
+ − 2871
%:%1231=1280%:%
+ − 2872
%:%1232=1281%:%
+ − 2873
%:%1233=1282%:%
+ − 2874
%:%1233=1283%:%
+ − 2875
%:%1234=1284%:%
+ − 2876
%:%1235=1285%:%
+ − 2877
%:%1236=1286%:%
+ − 2878
%:%1237=1287%:%
+ − 2879
%:%1238=1288%:%
+ − 2880
%:%1239=1289%:%
+ − 2881
%:%1240=1290%:%
+ − 2882
%:%1241=1291%:%
+ − 2883
%:%1242=1292%:%
+ − 2884
%:%1243=1293%:%
+ − 2885
%:%1244=1294%:%
+ − 2886
%:%1245=1295%:%
+ − 2887
%:%1246=1296%:%
+ − 2888
%:%1247=1297%:%
+ − 2889
%:%1248=1298%:%
+ − 2890
%:%1249=1299%:%
+ − 2891
%:%1250=1300%:%
+ − 2892
%:%1251=1301%:%
+ − 2893
%:%1252=1302%:%
+ − 2894
%:%1253=1303%:%
+ − 2895
%:%1254=1304%:%
+ − 2896
%:%1255=1305%:%
+ − 2897
%:%1256=1306%:%
+ − 2898
%:%1257=1307%:%
+ − 2899
%:%1258=1308%:%
+ − 2900
%:%1259=1309%:%
+ − 2901
%:%1260=1310%:%
+ − 2902
%:%1261=1311%:%
+ − 2903
%:%1262=1312%:%
+ − 2904
%:%1263=1313%:%
+ − 2905
%:%1264=1314%:%
+ − 2906
%:%1265=1315%:%
+ − 2907
%:%1266=1316%:%
+ − 2908
%:%1267=1317%:%
+ − 2909
%:%1268=1318%:%
+ − 2910
%:%1269=1319%:%
+ − 2911
%:%1270=1320%:%
+ − 2912
%:%1271=1321%:%
+ − 2913
%:%1272=1322%:%
+ − 2914
%:%1273=1323%:%
+ − 2915
%:%1274=1324%:%
+ − 2916
%:%1275=1325%:%
+ − 2917
%:%1276=1326%:%
+ − 2918
%:%1277=1327%:%
+ − 2919
%:%1278=1328%:%
+ − 2920
%:%1279=1329%:%
+ − 2921
%:%1280=1330%:%
+ − 2922
%:%1281=1331%:%
+ − 2923
%:%1282=1332%:%
+ − 2924
%:%1283=1333%:%
+ − 2925
%:%1284=1334%:%
+ − 2926
%:%1285=1335%:%
+ − 2927
%:%1286=1336%:%
+ − 2928
%:%1287=1337%:%
+ − 2929
%:%1287=1338%:%
+ − 2930
%:%1287=1339%:%
+ − 2931
%:%1288=1340%:%
+ − 2932
%:%1289=1341%:%
+ − 2933
%:%1289=1342%:%
+ − 2934
%:%1289=1343%:%
+ − 2935
%:%1289=1344%:%
+ − 2936
%:%1290=1345%:%
+ − 2937
%:%1291=1346%:%
+ − 2938
%:%1292=1347%:%
+ − 2939
%:%1293=1348%:%
+ − 2940
%:%1294=1349%:%
+ − 2941
%:%1294=1350%:%
+ − 2942
%:%1295=1351%:%
+ − 2943
%:%1296=1352%:%
+ − 2944
%:%1297=1353%:%
+ − 2945
%:%1298=1354%:%
+ − 2946
%:%1299=1355%:%
+ − 2947
%:%1300=1356%:%
+ − 2948
%:%1301=1357%:%
+ − 2949
%:%1302=1358%:%
+ − 2950
%:%1303=1359%:%
+ − 2951
%:%1304=1360%:%
+ − 2952
%:%1305=1361%:%
+ − 2953
%:%1306=1362%:%
+ − 2954
%:%1307=1363%:%
+ − 2955
%:%1308=1364%:%
+ − 2956
%:%1309=1365%:%
+ − 2957
%:%1310=1366%:%
+ − 2958
%:%1311=1367%:%
+ − 2959
%:%1312=1368%:%
+ − 2960
%:%1313=1369%:%
+ − 2961
%:%1314=1370%:%
+ − 2962
%:%1315=1371%:%
+ − 2963
%:%1316=1372%:%
+ − 2964
%:%1317=1373%:%
+ − 2965
%:%1318=1374%:%
+ − 2966
%:%1319=1375%:%
+ − 2967
%:%1320=1376%:%
+ − 2968
%:%1321=1377%:%
+ − 2969
%:%1322=1378%:%
+ − 2970
%:%1323=1379%:%
+ − 2971
%:%1324=1380%:%
+ − 2972
%:%1325=1381%:%
+ − 2973
%:%1326=1382%:%
+ − 2974
%:%1327=1383%:%
+ − 2975
%:%1328=1384%:%
+ − 2976
%:%1329=1385%:%
+ − 2977
%:%1330=1386%:%
+ − 2978
%:%1331=1387%:%
+ − 2979
%:%1332=1388%:%
+ − 2980
%:%1333=1389%:%
+ − 2981
%:%1334=1390%:%
+ − 2982
%:%1335=1391%:%
+ − 2983
%:%1336=1392%:%
+ − 2984
%:%1337=1393%:%
+ − 2985
%:%1338=1394%:%
+ − 2986
%:%1339=1395%:%
+ − 2987
%:%1340=1396%:%
+ − 2988
%:%1341=1397%:%
+ − 2989
%:%1342=1398%:%
+ − 2990
%:%1342=1399%:%
+ − 2991
%:%1343=1400%:%
+ − 2992
%:%1343=1401%:%
+ − 2993
%:%1344=1402%:%
+ − 2994
%:%1344=1403%:%
+ − 2995
%:%1345=1404%:%
+ − 2996
%:%1346=1405%:%
+ − 2997
%:%1347=1406%:%
+ − 2998
%:%1348=1407%:%
+ − 2999
%:%1349=1408%:%
+ − 3000
%:%1350=1409%:%
+ − 3001
%:%1351=1410%:%
+ − 3002
%:%1351=1411%:%
+ − 3003
%:%1352=1412%:%
+ − 3004
%:%1352=1413%:%
+ − 3005
%:%1353=1414%:%
+ − 3006
%:%1353=1415%:%
+ − 3007
%:%1354=1416%:%
+ − 3008
%:%1355=1417%:%
+ − 3009
%:%1356=1418%:%
+ − 3010
%:%1357=1419%:%
+ − 3011
%:%1358=1420%:%
+ − 3012
%:%1359=1421%:%
+ − 3013
%:%1360=1422%:%
+ − 3014
%:%1361=1423%:%
+ − 3015
%:%1362=1424%:%
+ − 3016
%:%1363=1425%:%
+ − 3017
%:%1364=1426%:%
+ − 3018
%:%1365=1427%:%
+ − 3019
%:%1366=1428%:%
+ − 3020
%:%1367=1429%:%
+ − 3021
%:%1368=1430%:%
+ − 3022
%:%1369=1431%:%
+ − 3023
%:%1370=1432%:%
+ − 3024
%:%1371=1433%:%
+ − 3025
%:%1372=1434%:%
+ − 3026
%:%1373=1435%:%
+ − 3027
%:%1374=1436%:%
+ − 3028
%:%1375=1437%:%
+ − 3029
%:%1376=1438%:%
+ − 3030
%:%1377=1439%:%
+ − 3031
%:%1378=1440%:%
+ − 3032
%:%1379=1441%:%
+ − 3033
%:%1380=1442%:%
+ − 3034
%:%1381=1443%:%
+ − 3035
%:%1382=1444%:%
+ − 3036
%:%1383=1445%:%
+ − 3037
%:%1384=1446%:%
+ − 3038
%:%1384=1447%:%
+ − 3039
%:%1385=1448%:%
+ − 3040
%:%1386=1449%:%
+ − 3041
%:%1387=1450%:%
+ − 3042
%:%1388=1451%:%
+ − 3043
%:%1389=1452%:%
+ − 3044
%:%1390=1453%:%
+ − 3045
%:%1391=1454%:%
+ − 3046
%:%1391=1455%:%
+ − 3047
%:%1392=1456%:%
+ − 3048
%:%1393=1457%:%
+ − 3049
%:%1394=1458%:%
+ − 3050
%:%1394=1459%:%
+ − 3051
%:%1395=1460%:%
+ − 3052
%:%1396=1461%:%
+ − 3053
%:%1397=1462%:%
+ − 3054
%:%1397=1463%:%
+ − 3055
%:%1398=1464%:%
+ − 3056
%:%1398=1465%:%
+ − 3057
%:%1399=1466%:%
+ − 3058
%:%1399=1467%:%
+ − 3059
%:%1400=1468%:%
+ − 3060
%:%1401=1469%:%
+ − 3061
%:%1402=1470%:%
+ − 3062
%:%1402=1471%:%
387
+ − 3063
%:%1403=1472%:%
389
+ − 3064
%:%1403=1473%:%
387
+ − 3065
%:%1404=1474%:%
389
+ − 3066
%:%1404=1475%:%
+ − 3067
%:%1404=1476%:%
+ − 3068
%:%1404=1477%:%
+ − 3069
%:%1405=1478%:%
+ − 3070
%:%1405=1479%:%
387
+ − 3071
%:%1406=1480%:%
389
+ − 3072
%:%1407=1481%:%
387
+ − 3073
%:%1407=1483%:%
+ − 3074
%:%1407=1484%:%
389
+ − 3075
%:%1407=1485%:%
+ − 3076
%:%1407=1486%:%
+ − 3077
%:%1407=1487%:%
+ − 3078
%:%1408=1488%:%
+ − 3079
%:%1408=1489%:%
+ − 3080
%:%1409=1490%:%
+ − 3081
%:%1409=1491%:%
+ − 3082
%:%1410=1492%:%
+ − 3083
%:%1410=1493%:%
+ − 3084
%:%1411=1494%:%
+ − 3085
%:%1412=1495%:%
+ − 3086
%:%1413=1496%:%
+ − 3087
%:%1414=1497%:%
+ − 3088
%:%1414=1498%:%
+ − 3089
%:%1415=1499%:%
+ − 3090
%:%1415=1500%:%
+ − 3091
%:%1416=1501%:%
+ − 3092
%:%1417=1502%:%
+ − 3093
%:%1417=1503%:%
+ − 3094
%:%1418=1504%:%
+ − 3095
%:%1419=1505%:%
+ − 3096
%:%1420=1506%:%
+ − 3097
%:%1421=1507%:%
+ − 3098
%:%1422=1508%:%
+ − 3099
%:%1423=1509%:%
+ − 3100
%:%1424=1510%:%
+ − 3101
%:%1425=1511%:%
+ − 3102
%:%1426=1512%:%
+ − 3103
%:%1427=1513%:%
+ − 3104
%:%1428=1514%:%
+ − 3105
%:%1429=1515%:%
+ − 3106
%:%1430=1516%:%
+ − 3107
%:%1431=1517%:%
+ − 3108
%:%1432=1518%:%
+ − 3109
%:%1433=1519%:%
+ − 3110
%:%1434=1520%:%
+ − 3111
%:%1435=1521%:%
+ − 3112
%:%1436=1522%:%
+ − 3113
%:%1437=1523%:%
+ − 3114
%:%1438=1524%:%
+ − 3115
%:%1439=1525%:%
+ − 3116
%:%1440=1526%:%
+ − 3117
%:%1441=1527%:%
+ − 3118
%:%1442=1528%:%
+ − 3119
%:%1443=1529%:%
+ − 3120
%:%1444=1530%:%
+ − 3121
%:%1445=1531%:%
+ − 3122
%:%1446=1532%:%
+ − 3123
%:%1447=1533%:%
+ − 3124
%:%1448=1534%:%
+ − 3125
%:%1449=1535%:%
+ − 3126
%:%1450=1536%:%
+ − 3127
%:%1451=1537%:%
+ − 3128
%:%1452=1538%:%
+ − 3129
%:%1453=1539%:%
+ − 3130
%:%1454=1540%:%
+ − 3131
%:%1455=1541%:%
+ − 3132
%:%1456=1542%:%
+ − 3133
%:%1457=1543%:%
+ − 3134
%:%1458=1544%:%
+ − 3135
%:%1459=1545%:%
+ − 3136
%:%1460=1546%:%
+ − 3137
%:%1461=1547%:%
+ − 3138
%:%1462=1548%:%
+ − 3139
%:%1463=1549%:%
+ − 3140
%:%1464=1550%:%
+ − 3141
%:%1465=1551%:%
+ − 3142
%:%1466=1552%:%
+ − 3143
%:%1467=1553%:%
+ − 3144
%:%1468=1554%:%
+ − 3145
%:%1477=1558%:%
+ − 3146
%:%1489=1565%:%
+ − 3147
%:%1490=1566%:%
+ − 3148
%:%1491=1567%:%
+ − 3149
%:%1492=1568%:%
+ − 3150
%:%1493=1569%:%
+ − 3151
%:%1494=1570%:%
+ − 3152
%:%1495=1571%:%
+ − 3153
%:%1504=1576%:%
+ − 3154
%:%1516=1580%:%
+ − 3155
%:%1517=1581%:%
+ − 3156
%:%1518=1582%:%
+ − 3157
%:%1519=1583%:%
+ − 3158
%:%1520=1584%:%
+ − 3159
%:%1521=1585%:%
+ − 3160
%:%1522=1586%:%
+ − 3161
%:%1523=1587%:%
+ − 3162
%:%1524=1588%:%
+ − 3163
%:%1525=1589%:%
+ − 3164
%:%1526=1590%:%
+ − 3165
%:%1527=1591%:%
+ − 3166
%:%1528=1592%:%
+ − 3167
%:%1529=1593%:%
+ − 3168
%:%1530=1594%:%
+ − 3169
%:%1531=1595%:%
+ − 3170
%:%1532=1596%:%
+ − 3171
%:%1533=1597%:%
+ − 3172
%:%1534=1598%:%
+ − 3173
%:%1535=1599%:%
+ − 3174
%:%1536=1600%:%
+ − 3175
%:%1537=1601%:%
+ − 3176
%:%1538=1602%:%
+ − 3177
%:%1539=1603%:%
+ − 3178
%:%1540=1604%:%
+ − 3179
%:%1541=1605%:%
+ − 3180
%:%1542=1606%:%
+ − 3181
%:%1543=1607%:%
+ − 3182
%:%1544=1608%:%
+ − 3183
%:%1545=1609%:%
+ − 3184
%:%1546=1610%:%
+ − 3185
%:%1547=1611%:%
+ − 3186
%:%1548=1612%:%
+ − 3187
%:%1549=1613%:%
+ − 3188
%:%1550=1614%:%
+ − 3189
%:%1551=1615%:%
+ − 3190
%:%1552=1616%:%
+ − 3191
%:%1553=1617%:%
+ − 3192
%:%1554=1618%:%
+ − 3193
%:%1555=1619%:%
+ − 3194
%:%1556=1620%:%
+ − 3195
%:%1557=1621%:%
+ − 3196
%:%1558=1622%:%
+ − 3197
%:%1559=1623%:%
+ − 3198
%:%1560=1624%:%
+ − 3199
%:%1561=1625%:%
+ − 3200
%:%1562=1626%:%
+ − 3201
%:%1563=1627%:%
+ − 3202
%:%1564=1628%:%
+ − 3203
%:%1565=1629%:%
+ − 3204
%:%1566=1630%:%
+ − 3205
%:%1567=1631%:%
+ − 3206
%:%1568=1632%:%
+ − 3207
%:%1569=1633%:%
+ − 3208
%:%1570=1634%:%
+ − 3209
%:%1571=1635%:%
+ − 3210
%:%1572=1636%:%
+ − 3211
%:%1573=1637%:%
+ − 3212
%:%1574=1638%:%
+ − 3213
%:%1575=1639%:%
+ − 3214
%:%1576=1640%:%
+ − 3215
%:%1577=1641%:%
+ − 3216
%:%1578=1642%:%
+ − 3217
%:%1579=1643%:%
+ − 3218
%:%1580=1644%:%
+ − 3219
%:%1581=1645%:%
+ − 3220
%:%1582=1646%:%
+ − 3221
%:%1583=1647%:%
+ − 3222
%:%1584=1648%:%
+ − 3223
%:%1585=1649%:%
+ − 3224
%:%1586=1650%:%
+ − 3225
%:%1587=1651%:%
+ − 3226
%:%1588=1652%:%
+ − 3227
%:%1589=1653%:%
+ − 3228
%:%1590=1654%:%
+ − 3229
%:%1591=1655%:%
+ − 3230
%:%1592=1656%:%
+ − 3231
%:%1593=1657%:%
+ − 3232
%:%1594=1658%:%
+ − 3233
%:%1595=1659%:%
+ − 3234
%:%1596=1660%:%
+ − 3235
%:%1597=1661%:%
+ − 3236
%:%1598=1662%:%
+ − 3237
%:%1599=1663%:%
+ − 3238
%:%1600=1664%:%
+ − 3239
%:%1601=1665%:%
+ − 3240
%:%1602=1666%:%
+ − 3241
%:%1603=1667%:%
+ − 3242
%:%1604=1668%:%
+ − 3243
%:%1605=1669%:%
+ − 3244
%:%1605=1785%:%
+ − 3245
%:%1606=1786%:%
+ − 3246
%:%1607=1787%:%
+ − 3247
%:%1608=1788%:%
+ − 3248
%:%1609=1789%:%
+ − 3249
%:%1609=1950%:%
+ − 3250
%:%1610=1951%:%
+ − 3251
%:%1611=1952%:%
+ − 3252
%:%1612=1953%:%
+ − 3253
%:%1613=1954%:%
+ − 3254
%:%1614=1955%:%
+ − 3255
%:%1615=1956%:%
+ − 3256
%:%1616=1957%:%
+ − 3257
%:%1617=1958%:%
+ − 3258
%:%1618=1959%:%
+ − 3259
%:%1619=1960%:%
+ − 3260
%:%1620=1961%:%
+ − 3261
%:%1621=1962%:%
+ − 3262
%:%1622=1963%:%
+ − 3263
%:%1623=1964%:%
+ − 3264
%:%1624=1965%:%
+ − 3265
%:%1625=1966%:%
+ − 3266
%:%1626=1967%:%
+ − 3267
%:%1627=1968%:%
+ − 3268
%:%1628=1969%:%
+ − 3269
%:%1628=1970%:%
+ − 3270
%:%1629=1971%:%
+ − 3271
%:%1629=1972%:%
+ − 3272
%:%1629=1973%:%
+ − 3273
%:%1630=1974%:%
+ − 3274
%:%1630=1975%:%
+ − 3275
%:%1631=1976%:%
+ − 3276
%:%1632=1977%:%
+ − 3277
%:%1633=1978%:%
+ − 3278
%:%1634=1979%:%
+ − 3279
%:%1635=1980%:%
+ − 3280
%:%1636=1981%:%
+ − 3281
%:%1637=1982%:%
+ − 3282
%:%1638=1983%:%
+ − 3283
%:%1639=1984%:%
+ − 3284
%:%1640=1985%:%
+ − 3285
%:%1641=1986%:%
+ − 3286
%:%1642=1987%:%
+ − 3287
%:%1643=1988%:%
+ − 3288
%:%1644=1989%:%
+ − 3289
%:%1645=1990%:%
+ − 3290
%:%1646=1991%:%
+ − 3291
%:%1647=1992%:%
+ − 3292
%:%1647=1993%:%
+ − 3293
%:%1648=1994%:%
+ − 3294
%:%1649=1995%:%
+ − 3295
%:%1650=1996%:%
+ − 3296
%:%1650=1997%:%
+ − 3297
%:%1650=1998%:%
+ − 3298
%:%1651=1999%:%
+ − 3299
%:%1652=2000%:%
+ − 3300
%:%1653=2001%:%
+ − 3301
%:%1653=2002%:%
+ − 3302
%:%1654=2003%:%
+ − 3303
%:%1654=2004%:%
+ − 3304
%:%1655=2005%:%
+ − 3305
%:%1656=2006%:%
+ − 3306
%:%1657=2007%:%
+ − 3307
%:%1658=2008%:%
+ − 3308
%:%1659=2009%:%
+ − 3309
%:%1660=2010%:%
+ − 3310
%:%1661=2011%:%
+ − 3311
%:%1662=2012%:%
+ − 3312
%:%1663=2013%:%
+ − 3313
%:%1664=2014%:%
+ − 3314
%:%1665=2015%:%
+ − 3315
%:%1666=2016%:%
+ − 3316
%:%1667=2017%:%
+ − 3317
%:%1668=2018%:%
+ − 3318
%:%1669=2019%:%
+ − 3319
%:%1670=2020%:%
+ − 3320
%:%1671=2021%:%
+ − 3321
%:%1680=2026%:%
+ − 3322
%:%1692=2030%:%
+ − 3323
%:%1693=2031%:%
+ − 3324
%:%1694=2032%:%
+ − 3325
%:%1695=2033%:%
+ − 3326
%:%1696=2034%:%
+ − 3327
%:%1697=2035%:%
+ − 3328
%:%1698=2036%:%
+ − 3329
%:%1699=2037%:%
+ − 3330
%:%1700=2038%:%
+ − 3331
%:%1701=2039%:%
+ − 3332
%:%1702=2040%:%
+ − 3333
%:%1703=2041%:%
+ − 3334
%:%1704=2042%:%
+ − 3335
%:%1705=2043%:%
+ − 3336
%:%1706=2044%:%
+ − 3337
%:%1707=2045%:%
+ − 3338
%:%1708=2046%:%
+ − 3339
%:%1709=2047%:%
+ − 3340
%:%1710=2048%:%
+ − 3341
%:%1711=2049%:%
+ − 3342
%:%1712=2050%:%
+ − 3343
%:%1713=2051%:%
+ − 3344
%:%1714=2052%:%
+ − 3345
%:%1715=2053%:%
+ − 3346
%:%1716=2054%:%
+ − 3347
%:%1717=2055%:%
+ − 3348
%:%1718=2056%:%
+ − 3349
%:%1719=2057%:%
+ − 3350
%:%1720=2058%:%
+ − 3351
%:%1721=2059%:%
+ − 3352
%:%1722=2060%:%
+ − 3353
%:%1723=2061%:%
+ − 3354
%:%1724=2062%:%
+ − 3355
%:%1725=2063%:%
+ − 3356
%:%1726=2064%:%
+ − 3357
%:%1727=2065%:%
+ − 3358
%:%1728=2066%:%
+ − 3359
%:%1729=2067%:%
+ − 3360
%:%1730=2068%:%
+ − 3361
%:%1731=2069%:%
+ − 3362
%:%1732=2070%:%
+ − 3363
%:%1733=2071%:%
+ − 3364
%:%1734=2072%:%
+ − 3365
%:%1735=2073%:%
+ − 3366
%:%1736=2074%:%
+ − 3367
%:%1737=2075%:%
+ − 3368
%:%1738=2076%:%
+ − 3369
%:%1739=2077%:%
+ − 3370
%:%1740=2078%:%
+ − 3371
%:%1741=2079%:%
+ − 3372
%:%1742=2080%:%
+ − 3373
%:%1743=2081%:%
+ − 3374
%:%1744=2082%:%
+ − 3375
%:%1757=2088%:%
+ − 3376
%:%1760=2089%:%
+ − 3377
%:%1761=2090%:%