handouts/ho02.tex
author Christian Urban <christian dot urban at kcl dot ac dot uk>
Sun, 14 Sep 2014 14:21:59 +0100
changeset 243 8d5aaf5b0031
parent 217 cd6066f1056a
child 251 5b5a68df6d16
permissions -rw-r--r--
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
123
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     1
\documentclass{article}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     2
\usepackage{hyperref}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     3
\usepackage{amssymb}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     4
\usepackage{amsmath}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     5
\usepackage[T1]{fontenc}
217
cd6066f1056a updated handouts
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 140
diff changeset
     6
\usepackage{../langs}
123
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     7
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     8
\newcommand{\dn}{\stackrel{\mbox{\scriptsize def}}{=}}%
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     9
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    10
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    11
\begin{document}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    12
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    13
\section*{Handout 2}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    14
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    15
Having specified what problem our matching algorithm, $match$, is supposed to solve, namely
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    16
for a given regular expression $r$ and string $s$ answer $true$ if and only if
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    17
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    18
\[
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    19
s \in L(r)
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    20
\]
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    21
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    22
\noindent
140
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
    23
we can look at an algorithm to solve this problem.
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
    24
Clearly we cannot use the function $L$ directly for this, because in general
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
    25
the set of strings $L$ returns is infinite (recall what $L(a^*)$ is). In such cases there is no way we can implement
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
    26
an exhaustive test for whether a string is member of this set or not.
123
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    27
140
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
    28
The algorithm we will define below consists of two parts. One is the function $nullable$ which takes a
124
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    29
regular expression as argument and decides whether it can match the empty string (this means it returns a 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    30
boolean). This can be easily defined recursively as follows:
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    31
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    32
\begin{center}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    33
\begin{tabular}{@ {}l@ {\hspace{2mm}}c@ {\hspace{2mm}}l@ {}}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    34
$nullable(\varnothing)$      & $\dn$ & $f\!\/alse$\\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    35
$nullable(\epsilon)$           & $\dn$ &  $true$\\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    36
$nullable (c)$                    & $\dn$ &  $f\!alse$\\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    37
$nullable (r_1 + r_2)$       & $\dn$ &  $nullable(r_1) \vee nullable(r_2)$\\ 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    38
$nullable (r_1 \cdot r_2)$ & $\dn$ &  $nullable(r_1) \wedge nullable(r_2)$\\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    39
$nullable (r^*)$                & $\dn$ & $true$ \\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    40
\end{tabular}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    41
\end{center}
123
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    42
124
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    43
\noindent
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    44
The idea behind this function is that the following property holds:
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    45
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    46
\[
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    47
nullable(r) \;\;\text{if and only if}\;\; ""\in L(r)
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    48
\]
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    49
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    50
\noindent
140
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
    51
Note on the left-hand side we have a function we can implement; on the right we have its specification. 
124
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    52
140
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
    53
The other function of our matching algorithm calculates a \emph{derivative} of a regular expression. This is a function
124
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    54
which will take a regular expression, say $r$, and a character, say $c$, as argument and return 
140
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
    55
a new regular expression. Be careful that the intuition behind this function is not so easy to grasp on first
124
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 123
diff changeset
    56
reading. Essentially this function solves the following problem: if $r$ can match a string of the form
125
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    57
$c\!::\!s$, what does the regular expression look like that can match just $s$. The definition of this
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    58
function is as follows:
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    59
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    60
\begin{center}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    61
\begin{tabular}{@ {}l@ {\hspace{2mm}}c@ {\hspace{2mm}}l@ {\hspace{-10mm}}l@ {}}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    62
  $der\, c\, (\varnothing)$      & $\dn$ & $\varnothing$ & \\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    63
  $der\, c\, (\epsilon)$           & $\dn$ & $\varnothing$ & \\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    64
  $der\, c\, (d)$                     & $\dn$ & if $c = d$ then $\epsilon$ else $\varnothing$ & \\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    65
  $der\, c\, (r_1 + r_2)$        & $\dn$ & $der\, c\, r_1 + der\, c\, r_2$ & \\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    66
  $der\, c\, (r_1 \cdot r_2)$  & $\dn$  & if $nullable (r_1)$\\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    67
  & & then $(der\,c\,r_1) \cdot r_2 + der\, c\, r_2$\\ 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    68
  & & else $(der\, c\, r_1) \cdot r_2$\\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    69
  $der\, c\, (r^*)$          & $\dn$ & $(der\,c\,r) \cdot (r^*)$ &
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    70
  \end{tabular}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    71
\end{center}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    72
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    73
\noindent
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    74
The first two clauses can be rationalised as follows: recall that $der$ should calculate a regular
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    75
expression, if the ``input'' regular expression can match a string of the form $c\!::\!s$. Since neither
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    76
$\varnothing$ nor $\epsilon$ can match such a string we return $\varnothing$. In the third case
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    77
we have to make a case-distinction: In case the regular expression is $c$, then clearly it can recognise
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    78
a string of the form $c\!::\!s$, just that $s$ is the empty string. Therefore we return the $\epsilon$-regular 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    79
expression. In the other case we again return $\varnothing$ since no string of the $c\!::\!s$ can be matched.
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    80
The $+$-case is relatively straightforward: all strings of the form $c\!::\!s$ are either matched by the
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    81
regular expression $r_1$ or $r_2$. So we just have to recursively call $der$ with these two regular
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    82
expressions and compose the results again with $+$. The $\cdot$-case is more complicated:
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    83
if $r_1\cdot r_2$ matches a string of the form $c\!::\!s$, then the first part must be matched by $r_1$.
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    84
Consequently, it makes sense to construct the regular expression for $s$ by calling $der$ with $r_1$ and
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    85
``appending'' $r_2$. There is however one exception to this simple rule: if $r_1$ can match the empty
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    86
string, then all of $c\!::\!s$ is matched by $r_2$. So in case $r_1$ is nullable (that is can match the
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    87
empty string) we have to allow the choice $der\,c\,r_2$ for calculating the regular expression that can match 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    88
$s$. The $*$-case is again simple: if $r^*$ matches a string of the form $c\!::\!s$, then the first part must be
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    89
``matched'' by a single copy of $r$. Therefore we call recursively $der\,c\,r$ and ``append'' $r^*$ in order to 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    90
match the rest of $s$.
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    91
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    92
Another way to rationalise the definition of $der$ is to consider the following operation on sets:
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    93
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    94
\[
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    95
Der\,c\,A\;\dn\;\{s\,|\,c\!::\!s \in A\}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    96
\]
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    97
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    98
\noindent
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
    99
which essentially transforms a set of strings $A$ by filtering out all strings that do not start with $c$ and then
140
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   100
strips off the $c$ from all the remaining strings. For example suppose $A = \{"f\!oo", "bar", "f\!rak"\}$ then
125
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   101
\[
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   102
Der\,f\,A = \{"oo", "rak"\}\quad,\quad
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   103
Der\,b\,A = \{"ar"\}  \quad \text{and} \quad
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   104
Der\,a\,A = \varnothing
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   105
\]
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   106
 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   107
\noindent
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   108
Note that in the last case $Der$ is empty, because no string in $A$ starts with $a$. With this operation we can
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   109
state the following property about $der$:
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   110
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   111
\[
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   112
L(der\,c\,r) = Der\,c\,(L(r))
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   113
\]
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   114
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   115
\noindent
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   116
This property clarifies what regular expression $der$ calculates, namely take the set of strings
140
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   117
that $r$ can match (that is $L(r)$), filter out all strings not starting with $c$ and strip off the $c$ from the
125
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   118
remaining strings---this is exactly the language that $der\,c\,r$ can match.
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   119
140
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   120
If we want to find out whether the string $"abc"$ is matched by the regular expression $r$
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   121
then we can iteratively apply $Der$ as follows
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   122
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   123
\begin{enumerate}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   124
\item $Der\,a\,(L(r))$
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   125
\item $Der\,b\,(Der\,a\,(L(r)))$
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   126
\item $Der\,c\,(Der\,b\,(Der\,a\,(L(r))))$
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   127
\end{enumerate}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   128
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   129
\noindent
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   130
In the last step we need to test whether the empty string is in the set. Our matching algorithm will work similarly, 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 133
diff changeset
   131
just using regular expression instead of sets. For this we need to lift the notion of derivatives from characters to strings. This can be
125
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   132
done using the following function, taking a string and regular expression as input and a regular expression 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   133
as output.
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   134
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   135
\begin{center}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   136
\begin{tabular}{@ {}l@ {\hspace{2mm}}c@ {\hspace{2mm}}l@ {\hspace{-10mm}}l@ {}}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   137
  $der\!s\, []\, r$     & $\dn$ & $r$ & \\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   138
  $der\!s\, (c\!::\!s)\, r$ & $\dn$ & $der\!s\,s\,(der\,c\,r)$ & \\
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   139
  \end{tabular}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   140
\end{center}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   141
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   142
\noindent
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   143
Having $ders$ in place, we can finally define our matching algorithm:
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   144
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   145
\[
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   146
match\,s\,r = nullable(ders\,s\,r)
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   147
\]
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   148
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   149
\noindent
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   150
We claim that
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   151
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   152
\[
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   153
match\,s\,r\quad\text{if and only if}\quad s\in L(r)
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   154
\]
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   155
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 124
diff changeset
   156
\noindent
133
09efdf5cf07c updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 126
diff changeset
   157
holds, which means our algorithm satisfies the specification. This algorithm was introduced by
09efdf5cf07c updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 126
diff changeset
   158
Janus Brzozowski in 1964. Its main attractions are simplicity and being fast, as well as
09efdf5cf07c updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 126
diff changeset
   159
being easily extendable for other regular expressions such as $r^{\{n\}}$, $r^?$, $\sim{}r$ and so on.
126
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 125
diff changeset
   160
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 125
diff changeset
   161
\begin{figure}[p]
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 125
diff changeset
   162
{\lstset{language=Scala}\texttt{\lstinputlisting{../progs/app5.scala}}}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 125
diff changeset
   163
{\lstset{language=Scala}\texttt{\lstinputlisting{../progs/app6.scala}}}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 125
diff changeset
   164
\caption{Scala implementation of the nullable and derivatives functions.}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 125
diff changeset
   165
\end{figure}
123
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   166
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   167
\end{document}
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   168
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   169
%%% Local Variables: 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   170
%%% mode: latex
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   171
%%% TeX-master: t
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   172
%%% End: