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