author | wenzelm |
Tue, 21 Feb 2012 13:10:13 +0100 | |
changeset 46563 | 0ad69b30b39c |
parent 46523 | 7ca897381b26 |
child 48501 | e59778bc71a0 |
permissions | -rw-r--r-- |
38406 | 1 |
% |
2 |
\begin{isabellebody}% |
|
3 |
\def\isabellecontext{Refinement}% |
|
4 |
% |
|
5 |
\isadelimtheory |
|
6 |
% |
|
7 |
\endisadelimtheory |
|
8 |
% |
|
9 |
\isatagtheory |
|
10 |
\isacommand{theory}\isamarkupfalse% |
|
11 |
\ Refinement\isanewline |
|
12 |
\isakeyword{imports}\ Setup\isanewline |
|
13 |
\isakeyword{begin}% |
|
14 |
\endisatagtheory |
|
15 |
{\isafoldtheory}% |
|
16 |
% |
|
17 |
\isadelimtheory |
|
18 |
% |
|
19 |
\endisadelimtheory |
|
20 |
% |
|
21 |
\isamarkupsection{Program and datatype refinement \label{sec:refinement}% |
|
22 |
} |
|
23 |
\isamarkuptrue% |
|
24 |
% |
|
38451 | 25 |
\begin{isamarkuptext}% |
26 |
Code generation by shallow embedding (cf.~\secref{sec:principle}) |
|
27 |
allows to choose code equations and datatype constructors freely, |
|
28 |
given that some very basic syntactic properties are met; this |
|
29 |
flexibility opens up mechanisms for refinement which allow to extend |
|
30 |
the scope and quality of generated code dramatically.% |
|
31 |
\end{isamarkuptext}% |
|
32 |
\isamarkuptrue% |
|
33 |
% |
|
34 |
\isamarkupsubsection{Program refinement% |
|
35 |
} |
|
36 |
\isamarkuptrue% |
|
37 |
% |
|
38 |
\begin{isamarkuptext}% |
|
39 |
Program refinement works by choosing appropriate code equations |
|
40352 | 40 |
explicitly (cf.~\secref{sec:equations}); as example, we use Fibonacci |
38451 | 41 |
numbers:% |
42 |
\end{isamarkuptext}% |
|
43 |
\isamarkuptrue% |
|
44 |
% |
|
45 |
\isadelimquote |
|
46 |
% |
|
47 |
\endisadelimquote |
|
48 |
% |
|
49 |
\isatagquote |
|
50 |
\isacommand{fun}\isamarkupfalse% |
|
40406 | 51 |
\ fib\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline |
52 |
\ \ \ \ {\isaliteral{22}{\isachardoublequoteopen}}fib\ {\isadigit{0}}\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{0}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
53 |
\ \ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}fib\ {\isaliteral{28}{\isacharparenleft}}Suc\ {\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ Suc\ {\isadigit{0}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
54 |
\ \ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}fib\ {\isaliteral{28}{\isacharparenleft}}Suc\ {\isaliteral{28}{\isacharparenleft}}Suc\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ fib\ n\ {\isaliteral{2B}{\isacharplus}}\ fib\ {\isaliteral{28}{\isacharparenleft}}Suc\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}% |
|
38451 | 55 |
\endisatagquote |
56 |
{\isafoldquote}% |
|
57 |
% |
|
58 |
\isadelimquote |
|
59 |
% |
|
60 |
\endisadelimquote |
|
61 |
% |
|
62 |
\begin{isamarkuptext}% |
|
63 |
\noindent The runtime of the corresponding code grows exponential due |
|
64 |
to two recursive calls:% |
|
65 |
\end{isamarkuptext}% |
|
66 |
\isamarkuptrue% |
|
67 |
% |
|
39745 | 68 |
\isadelimquotetypewriter |
38451 | 69 |
% |
39745 | 70 |
\endisadelimquotetypewriter |
38451 | 71 |
% |
39745 | 72 |
\isatagquotetypewriter |
38451 | 73 |
% |
74 |
\begin{isamarkuptext}% |
|
40406 | 75 |
fib\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ Nat\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ Nat{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
76 |
fib\ Zero{\isaliteral{5F}{\isacharunderscore}}nat\ {\isaliteral{3D}{\isacharequal}}\ Zero{\isaliteral{5F}{\isacharunderscore}}nat{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
77 |
fib\ {\isaliteral{28}{\isacharparenleft}}Suc\ Zero{\isaliteral{5F}{\isacharunderscore}}nat{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ Suc\ Zero{\isaliteral{5F}{\isacharunderscore}}nat{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
78 |
fib\ {\isaliteral{28}{\isacharparenleft}}Suc\ {\isaliteral{28}{\isacharparenleft}}Suc\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ plus{\isaliteral{5F}{\isacharunderscore}}nat\ {\isaliteral{28}{\isacharparenleft}}fib\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}fib\ {\isaliteral{28}{\isacharparenleft}}Suc\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline% |
|
38451 | 79 |
\end{isamarkuptext}% |
80 |
\isamarkuptrue% |
|
81 |
% |
|
39745 | 82 |
\endisatagquotetypewriter |
83 |
{\isafoldquotetypewriter}% |
|
38451 | 84 |
% |
39745 | 85 |
\isadelimquotetypewriter |
38451 | 86 |
% |
39745 | 87 |
\endisadelimquotetypewriter |
38451 | 88 |
% |
89 |
\begin{isamarkuptext}% |
|
90 |
\noindent A more efficient implementation would use dynamic |
|
91 |
programming, e.g.~sharing of common intermediate results between |
|
92 |
recursive calls. This idea is expressed by an auxiliary operation |
|
93 |
which computes a Fibonacci number and its successor simultaneously:% |
|
94 |
\end{isamarkuptext}% |
|
95 |
\isamarkuptrue% |
|
96 |
% |
|
97 |
\isadelimquote |
|
98 |
% |
|
99 |
\endisadelimquote |
|
100 |
% |
|
101 |
\isatagquote |
|
102 |
\isacommand{definition}\isamarkupfalse% |
|
40406 | 103 |
\ fib{\isaliteral{5F}{\isacharunderscore}}step\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat\ {\isaliteral{5C3C74696D65733E}{\isasymtimes}}\ nat{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline |
104 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}fib{\isaliteral{5F}{\isacharunderscore}}step\ n\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}fib\ {\isaliteral{28}{\isacharparenleft}}Suc\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{2C}{\isacharcomma}}\ fib\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}% |
|
38451 | 105 |
\endisatagquote |
106 |
{\isafoldquote}% |
|
107 |
% |
|
108 |
\isadelimquote |
|
109 |
% |
|
110 |
\endisadelimquote |
|
111 |
% |
|
112 |
\begin{isamarkuptext}% |
|
113 |
\noindent This operation can be implemented by recursion using |
|
114 |
dynamic programming:% |
|
115 |
\end{isamarkuptext}% |
|
116 |
\isamarkuptrue% |
|
117 |
% |
|
118 |
\isadelimquote |
|
119 |
% |
|
120 |
\endisadelimquote |
|
121 |
% |
|
122 |
\isatagquote |
|
123 |
\isacommand{lemma}\isamarkupfalse% |
|
40406 | 124 |
\ {\isaliteral{5B}{\isacharbrackleft}}code{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\isanewline |
125 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}fib{\isaliteral{5F}{\isacharunderscore}}step\ {\isadigit{0}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}Suc\ {\isadigit{0}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{0}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
126 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}fib{\isaliteral{5F}{\isacharunderscore}}step\ {\isaliteral{28}{\isacharparenleft}}Suc\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}let\ {\isaliteral{28}{\isacharparenleft}}m{\isaliteral{2C}{\isacharcomma}}\ q{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ fib{\isaliteral{5F}{\isacharunderscore}}step\ n\ in\ {\isaliteral{28}{\isacharparenleft}}m\ {\isaliteral{2B}{\isacharplus}}\ q{\isaliteral{2C}{\isacharcomma}}\ m{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
38451 | 127 |
\ \ \isacommand{by}\isamarkupfalse% |
40406 | 128 |
\ {\isaliteral{28}{\isacharparenleft}}simp{\isaliteral{5F}{\isacharunderscore}}all\ add{\isaliteral{3A}{\isacharcolon}}\ fib{\isaliteral{5F}{\isacharunderscore}}step{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\isacharparenright}}% |
38451 | 129 |
\endisatagquote |
130 |
{\isafoldquote}% |
|
131 |
% |
|
132 |
\isadelimquote |
|
133 |
% |
|
134 |
\endisadelimquote |
|
135 |
% |
|
136 |
\begin{isamarkuptext}% |
|
40406 | 137 |
\noindent What remains is to implement \isa{fib} by \isa{fib{\isaliteral{5F}{\isacharunderscore}}step} as follows:% |
38451 | 138 |
\end{isamarkuptext}% |
139 |
\isamarkuptrue% |
|
140 |
% |
|
141 |
\isadelimquote |
|
142 |
% |
|
143 |
\endisadelimquote |
|
144 |
% |
|
145 |
\isatagquote |
|
146 |
\isacommand{lemma}\isamarkupfalse% |
|
40406 | 147 |
\ {\isaliteral{5B}{\isacharbrackleft}}code{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\isanewline |
148 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}fib\ {\isadigit{0}}\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{0}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
149 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}fib\ {\isaliteral{28}{\isacharparenleft}}Suc\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ fst\ {\isaliteral{28}{\isacharparenleft}}fib{\isaliteral{5F}{\isacharunderscore}}step\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
38451 | 150 |
\ \ \isacommand{by}\isamarkupfalse% |
40406 | 151 |
\ {\isaliteral{28}{\isacharparenleft}}simp{\isaliteral{5F}{\isacharunderscore}}all\ add{\isaliteral{3A}{\isacharcolon}}\ fib{\isaliteral{5F}{\isacharunderscore}}step{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\isacharparenright}}% |
38451 | 152 |
\endisatagquote |
153 |
{\isafoldquote}% |
|
154 |
% |
|
155 |
\isadelimquote |
|
156 |
% |
|
157 |
\endisadelimquote |
|
158 |
% |
|
159 |
\begin{isamarkuptext}% |
|
160 |
\noindent The resulting code shows only linear growth of runtime:% |
|
161 |
\end{isamarkuptext}% |
|
162 |
\isamarkuptrue% |
|
163 |
% |
|
39745 | 164 |
\isadelimquotetypewriter |
38451 | 165 |
% |
39745 | 166 |
\endisadelimquotetypewriter |
38451 | 167 |
% |
39745 | 168 |
\isatagquotetypewriter |
38451 | 169 |
% |
170 |
\begin{isamarkuptext}% |
|
40406 | 171 |
fib{\isaliteral{5F}{\isacharunderscore}}step\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ Nat\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{28}{\isacharparenleft}}Nat{\isaliteral{2C}{\isacharcomma}}\ Nat{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
172 |
fib{\isaliteral{5F}{\isacharunderscore}}step\ {\isaliteral{28}{\isacharparenleft}}Suc\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ let\ {\isaliteral{7B}{\isacharbraceleft}}\isanewline |
|
173 |
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\isaliteral{28}{\isacharparenleft}}m{\isaliteral{2C}{\isacharcomma}}\ q{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ fib{\isaliteral{5F}{\isacharunderscore}}step\ n{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
174 |
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {\isaliteral{7D}{\isacharbraceright}}\ in\ {\isaliteral{28}{\isacharparenleft}}plus{\isaliteral{5F}{\isacharunderscore}}nat\ m\ q{\isaliteral{2C}{\isacharcomma}}\ m{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
175 |
fib{\isaliteral{5F}{\isacharunderscore}}step\ Zero{\isaliteral{5F}{\isacharunderscore}}nat\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}Suc\ Zero{\isaliteral{5F}{\isacharunderscore}}nat{\isaliteral{2C}{\isacharcomma}}\ Zero{\isaliteral{5F}{\isacharunderscore}}nat{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
176 |
\isanewline |
40406 | 177 |
fib\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ Nat\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ Nat{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
178 |
fib\ {\isaliteral{28}{\isacharparenleft}}Suc\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ fst\ {\isaliteral{28}{\isacharparenleft}}fib{\isaliteral{5F}{\isacharunderscore}}step\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
179 |
fib\ Zero{\isaliteral{5F}{\isacharunderscore}}nat\ {\isaliteral{3D}{\isacharequal}}\ Zero{\isaliteral{5F}{\isacharunderscore}}nat{\isaliteral{3B}{\isacharsemicolon}}\isanewline% |
|
38451 | 180 |
\end{isamarkuptext}% |
181 |
\isamarkuptrue% |
|
182 |
% |
|
39745 | 183 |
\endisatagquotetypewriter |
184 |
{\isafoldquotetypewriter}% |
|
38451 | 185 |
% |
39745 | 186 |
\isadelimquotetypewriter |
38451 | 187 |
% |
39745 | 188 |
\endisadelimquotetypewriter |
38451 | 189 |
% |
38459 | 190 |
\isamarkupsubsection{Datatype refinement% |
38437 | 191 |
} |
192 |
\isamarkuptrue% |
|
193 |
% |
|
194 |
\begin{isamarkuptext}% |
|
38459 | 195 |
Selecting specific code equations \emph{and} datatype constructors |
196 |
leads to datatype refinement. As an example, we will develop an |
|
197 |
alternative representation of the queue example given in |
|
198 |
\secref{sec:queue_example}. The amortised representation is |
|
199 |
convenient for generating code but exposes its \qt{implementation} |
|
200 |
details, which may be cumbersome when proving theorems about it. |
|
201 |
Therefore, here is a simple, straightforward representation of |
|
202 |
queues:% |
|
38437 | 203 |
\end{isamarkuptext}% |
204 |
\isamarkuptrue% |
|
205 |
% |
|
206 |
\isadelimquote |
|
207 |
% |
|
208 |
\endisadelimquote |
|
209 |
% |
|
210 |
\isatagquote |
|
211 |
\isacommand{datatype}\isamarkupfalse% |
|
40406 | 212 |
\ {\isaliteral{27}{\isacharprime}}a\ queue\ {\isaliteral{3D}{\isacharequal}}\ Queue\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ list{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
38437 | 213 |
\isanewline |
214 |
\isacommand{definition}\isamarkupfalse% |
|
40406 | 215 |
\ empty\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ queue{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline |
216 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}empty\ {\isaliteral{3D}{\isacharequal}}\ Queue\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
38437 | 217 |
\isanewline |
218 |
\isacommand{primrec}\isamarkupfalse% |
|
40406 | 219 |
\ enqueue\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ queue\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ queue{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline |
220 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}enqueue\ x\ {\isaliteral{28}{\isacharparenleft}}Queue\ xs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ Queue\ {\isaliteral{28}{\isacharparenleft}}xs\ {\isaliteral{40}{\isacharat}}\ {\isaliteral{5B}{\isacharbrackleft}}x{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
38437 | 221 |
\isanewline |
222 |
\isacommand{fun}\isamarkupfalse% |
|
40406 | 223 |
\ dequeue\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ queue\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ option\ {\isaliteral{5C3C74696D65733E}{\isasymtimes}}\ {\isaliteral{27}{\isacharprime}}a\ queue{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline |
224 |
\ \ \ \ {\isaliteral{22}{\isachardoublequoteopen}}dequeue\ {\isaliteral{28}{\isacharparenleft}}Queue\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}None{\isaliteral{2C}{\isacharcomma}}\ Queue\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
225 |
\ \ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}dequeue\ {\isaliteral{28}{\isacharparenleft}}Queue\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{23}{\isacharhash}}\ xs{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}Some\ x{\isaliteral{2C}{\isacharcomma}}\ Queue\ xs{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}% |
|
38437 | 226 |
\endisatagquote |
227 |
{\isafoldquote}% |
|
228 |
% |
|
229 |
\isadelimquote |
|
230 |
% |
|
231 |
\endisadelimquote |
|
232 |
% |
|
233 |
\begin{isamarkuptext}% |
|
234 |
\noindent This we can use directly for proving; for executing, |
|
235 |
we provide an alternative characterisation:% |
|
236 |
\end{isamarkuptext}% |
|
237 |
\isamarkuptrue% |
|
238 |
% |
|
239 |
\isadelimquote |
|
240 |
% |
|
241 |
\endisadelimquote |
|
242 |
% |
|
243 |
\isatagquote |
|
244 |
\isacommand{definition}\isamarkupfalse% |
|
40406 | 245 |
\ AQueue\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ queue{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline |
246 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}AQueue\ xs\ ys\ {\isaliteral{3D}{\isacharequal}}\ Queue\ {\isaliteral{28}{\isacharparenleft}}ys\ {\isaliteral{40}{\isacharat}}\ rev\ xs{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
38437 | 247 |
\isanewline |
40406 | 248 |
\isacommand{code{\isaliteral{5F}{\isacharunderscore}}datatype}\isamarkupfalse% |
38437 | 249 |
\ AQueue% |
250 |
\endisatagquote |
|
251 |
{\isafoldquote}% |
|
252 |
% |
|
253 |
\isadelimquote |
|
254 |
% |
|
255 |
\endisadelimquote |
|
256 |
% |
|
257 |
\begin{isamarkuptext}% |
|
258 |
\noindent Here we define a \qt{constructor} \isa{AQueue} which |
|
259 |
is defined in terms of \isa{Queue} and interprets its arguments |
|
260 |
according to what the \emph{content} of an amortised queue is supposed |
|
38459 | 261 |
to be. |
262 |
||
263 |
The prerequisite for datatype constructors is only syntactical: a |
|
40406 | 264 |
constructor must be of type \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C6B617070613E}{\isasymkappa}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E697375623E}{}\isactrlisub n} where \isa{{\isaliteral{7B}{\isacharbraceleft}}{\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E697375623E}{}\isactrlisub n{\isaliteral{7D}{\isacharbraceright}}} is exactly the set of \emph{all} type variables in |
265 |
\isa{{\isaliteral{5C3C7461753E}{\isasymtau}}}; then \isa{{\isaliteral{5C3C6B617070613E}{\isasymkappa}}} is its corresponding datatype. The |
|
38459 | 266 |
HOL datatype package by default registers any new datatype with its |
40406 | 267 |
constructors, but this may be changed using \indexdef{}{command}{code\_datatype}\hypertarget{command.code-datatype}{\hyperlink{command.code-datatype}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}datatype}}}}}; the currently chosen constructors can be inspected |
268 |
using the \hyperlink{command.print-codesetup}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}codesetup}}}} command. |
|
38459 | 269 |
|
270 |
Equipped with this, we are able to prove the following equations |
|
38437 | 271 |
for our primitive queue operations which \qt{implement} the simple |
272 |
queues in an amortised fashion:% |
|
273 |
\end{isamarkuptext}% |
|
274 |
\isamarkuptrue% |
|
275 |
% |
|
276 |
\isadelimquote |
|
277 |
% |
|
278 |
\endisadelimquote |
|
279 |
% |
|
280 |
\isatagquote |
|
281 |
\isacommand{lemma}\isamarkupfalse% |
|
40406 | 282 |
\ empty{\isaliteral{5F}{\isacharunderscore}}AQueue\ {\isaliteral{5B}{\isacharbrackleft}}code{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\isanewline |
283 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}empty\ {\isaliteral{3D}{\isacharequal}}\ AQueue\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
40755 | 284 |
\ \ \isacommand{by}\isamarkupfalse% |
285 |
\ {\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ AQueue{\isaliteral{5F}{\isacharunderscore}}def\ empty{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\isacharparenright}}\isanewline |
|
38437 | 286 |
\isanewline |
287 |
\isacommand{lemma}\isamarkupfalse% |
|
40406 | 288 |
\ enqueue{\isaliteral{5F}{\isacharunderscore}}AQueue\ {\isaliteral{5B}{\isacharbrackleft}}code{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\isanewline |
289 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}enqueue\ x\ {\isaliteral{28}{\isacharparenleft}}AQueue\ xs\ ys{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ AQueue\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{23}{\isacharhash}}\ xs{\isaliteral{29}{\isacharparenright}}\ ys{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
40755 | 290 |
\ \ \isacommand{by}\isamarkupfalse% |
291 |
\ {\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ AQueue{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\isacharparenright}}\isanewline |
|
38437 | 292 |
\isanewline |
293 |
\isacommand{lemma}\isamarkupfalse% |
|
40406 | 294 |
\ dequeue{\isaliteral{5F}{\isacharunderscore}}AQueue\ {\isaliteral{5B}{\isacharbrackleft}}code{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\isanewline |
295 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}dequeue\ {\isaliteral{28}{\isacharparenleft}}AQueue\ xs\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\isanewline |
|
296 |
\ \ \ \ {\isaliteral{28}{\isacharparenleft}}if\ xs\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ then\ {\isaliteral{28}{\isacharparenleft}}None{\isaliteral{2C}{\isacharcomma}}\ AQueue\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}\isanewline |
|
297 |
\ \ \ \ else\ dequeue\ {\isaliteral{28}{\isacharparenleft}}AQueue\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{28}{\isacharparenleft}}rev\ xs{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
298 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}dequeue\ {\isaliteral{28}{\isacharparenleft}}AQueue\ xs\ {\isaliteral{28}{\isacharparenleft}}y\ {\isaliteral{23}{\isacharhash}}\ ys{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}Some\ y{\isaliteral{2C}{\isacharcomma}}\ AQueue\ xs\ ys{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
40755 | 299 |
\ \ \isacommand{by}\isamarkupfalse% |
300 |
\ {\isaliteral{28}{\isacharparenleft}}simp{\isaliteral{5F}{\isacharunderscore}}all\ add{\isaliteral{3A}{\isacharcolon}}\ AQueue{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\isacharparenright}}% |
|
38437 | 301 |
\endisatagquote |
302 |
{\isafoldquote}% |
|
303 |
% |
|
304 |
\isadelimquote |
|
305 |
% |
|
306 |
\endisadelimquote |
|
307 |
% |
|
308 |
\begin{isamarkuptext}% |
|
40755 | 309 |
\noindent It is good style, although no absolute requirement, to |
310 |
provide code equations for the original artefacts of the implemented |
|
311 |
type, if possible; in our case, these are the datatype constructor |
|
312 |
\isa{Queue} and the case combinator \isa{queue{\isaliteral{5F}{\isacharunderscore}}case}:% |
|
38437 | 313 |
\end{isamarkuptext}% |
314 |
\isamarkuptrue% |
|
315 |
% |
|
316 |
\isadelimquote |
|
317 |
% |
|
318 |
\endisadelimquote |
|
319 |
% |
|
320 |
\isatagquote |
|
321 |
\isacommand{lemma}\isamarkupfalse% |
|
40755 | 322 |
\ Queue{\isaliteral{5F}{\isacharunderscore}}AQueue\ {\isaliteral{5B}{\isacharbrackleft}}code{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\isanewline |
323 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}Queue\ {\isaliteral{3D}{\isacharequal}}\ AQueue\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
324 |
\ \ \isacommand{by}\isamarkupfalse% |
|
325 |
\ {\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ AQueue{\isaliteral{5F}{\isacharunderscore}}def\ fun{\isaliteral{5F}{\isacharunderscore}}eq{\isaliteral{5F}{\isacharunderscore}}iff{\isaliteral{29}{\isacharparenright}}\isanewline |
|
326 |
\isanewline |
|
327 |
\isacommand{lemma}\isamarkupfalse% |
|
40406 | 328 |
\ queue{\isaliteral{5F}{\isacharunderscore}}case{\isaliteral{5F}{\isacharunderscore}}AQueue\ {\isaliteral{5B}{\isacharbrackleft}}code{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\isanewline |
329 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}queue{\isaliteral{5F}{\isacharunderscore}}case\ f\ {\isaliteral{28}{\isacharparenleft}}AQueue\ xs\ ys{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ f\ {\isaliteral{28}{\isacharparenleft}}ys\ {\isaliteral{40}{\isacharat}}\ rev\ xs{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
40755 | 330 |
\ \ \isacommand{by}\isamarkupfalse% |
331 |
\ {\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ AQueue{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\isacharparenright}}% |
|
38437 | 332 |
\endisatagquote |
333 |
{\isafoldquote}% |
|
334 |
% |
|
335 |
\isadelimquote |
|
336 |
% |
|
337 |
\endisadelimquote |
|
338 |
% |
|
339 |
\begin{isamarkuptext}% |
|
340 |
\noindent The resulting code looks as expected:% |
|
341 |
\end{isamarkuptext}% |
|
342 |
\isamarkuptrue% |
|
343 |
% |
|
39745 | 344 |
\isadelimquotetypewriter |
38437 | 345 |
% |
39745 | 346 |
\endisadelimquotetypewriter |
38437 | 347 |
% |
39745 | 348 |
\isatagquotetypewriter |
38437 | 349 |
% |
350 |
\begin{isamarkuptext}% |
|
40406 | 351 |
structure\ Example\ {\isaliteral{3A}{\isacharcolon}}\ sig\isanewline |
352 |
\ \ val\ id\ {\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}a\isanewline |
|
353 |
\ \ val\ fold\ {\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}b\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}b\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}b\isanewline |
|
354 |
\ \ val\ rev\ {\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}a\ list\isanewline |
|
355 |
\ \ val\ null\ {\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ bool\isanewline |
|
356 |
\ \ datatype\ {\isaliteral{27}{\isacharprime}}a\ queue\ {\isaliteral{3D}{\isacharequal}}\ AQueue\ of\ {\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{2A}{\isacharasterisk}}\ {\isaliteral{27}{\isacharprime}}a\ list\isanewline |
|
357 |
\ \ val\ empty\ {\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{27}{\isacharprime}}a\ queue\isanewline |
|
40755 | 358 |
\ \ val\ queue\ {\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}a\ queue\isanewline |
40406 | 359 |
\ \ val\ dequeue\ {\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{27}{\isacharprime}}a\ queue\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}a\ option\ {\isaliteral{2A}{\isacharasterisk}}\ {\isaliteral{27}{\isacharprime}}a\ queue\isanewline |
360 |
\ \ val\ enqueue\ {\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}a\ queue\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}a\ queue\isanewline |
|
40755 | 361 |
\ \ val\ queue{\isaliteral{5F}{\isacharunderscore}}case\ {\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}a\ queue\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{27}{\isacharprime}}b\isanewline |
40406 | 362 |
end\ {\isaliteral{3D}{\isacharequal}}\ struct\isanewline |
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
363 |
\isanewline |
40406 | 364 |
fun\ id\ x\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}fn\ xa\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{3E}{\isachargreater}}\ xa{\isaliteral{29}{\isacharparenright}}\ x{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
365 |
\isanewline |
40406 | 366 |
fun\ fold\ f\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{3D}{\isacharequal}}\ id\isanewline |
367 |
\ \ {\isaliteral{7C}{\isacharbar}}\ fold\ f\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ xs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ fold\ f\ xs\ o\ f\ x{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
368 |
\isanewline |
40406 | 369 |
fun\ rev\ xs\ {\isaliteral{3D}{\isacharequal}}\ fold\ {\isaliteral{28}{\isacharparenleft}}fn\ a\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{3E}{\isachargreater}}\ fn\ b\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{3E}{\isachargreater}}\ a\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ b{\isaliteral{29}{\isacharparenright}}\ xs\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
370 |
\isanewline |
40406 | 371 |
fun\ null\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{3D}{\isacharequal}}\ true\isanewline |
372 |
\ \ {\isaliteral{7C}{\isacharbar}}\ null\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ xs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ false{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
373 |
\isanewline |
40406 | 374 |
datatype\ {\isaliteral{27}{\isacharprime}}a\ queue\ {\isaliteral{3D}{\isacharequal}}\ AQueue\ of\ {\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{2A}{\isacharasterisk}}\ {\isaliteral{27}{\isacharprime}}a\ list{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
375 |
\isanewline |
40406 | 376 |
val\ empty\ {\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{27}{\isacharprime}}a\ queue\ {\isaliteral{3D}{\isacharequal}}\ AQueue\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
377 |
\isanewline |
40755 | 378 |
fun\ queue\ x\ {\isaliteral{3D}{\isacharequal}}\ AQueue\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{2C}{\isacharcomma}}\ x{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
379 |
\isanewline |
|
40406 | 380 |
fun\ dequeue\ {\isaliteral{28}{\isacharparenleft}}AQueue\ {\isaliteral{28}{\isacharparenleft}}xs{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ ys{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}SOME\ y{\isaliteral{2C}{\isacharcomma}}\ AQueue\ {\isaliteral{28}{\isacharparenleft}}xs{\isaliteral{2C}{\isacharcomma}}\ ys{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\isanewline |
381 |
\ \ {\isaliteral{7C}{\isacharbar}}\ dequeue\ {\isaliteral{28}{\isacharparenleft}}AQueue\ {\isaliteral{28}{\isacharparenleft}}xs{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\isanewline |
|
382 |
\ \ \ \ {\isaliteral{28}{\isacharparenleft}}if\ null\ xs\ then\ {\isaliteral{28}{\isacharparenleft}}NONE{\isaliteral{2C}{\isacharcomma}}\ AQueue\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\isanewline |
|
383 |
\ \ \ \ \ \ else\ dequeue\ {\isaliteral{28}{\isacharparenleft}}AQueue\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{2C}{\isacharcomma}}\ rev\ xs{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
384 |
\isanewline |
40406 | 385 |
fun\ enqueue\ x\ {\isaliteral{28}{\isacharparenleft}}AQueue\ {\isaliteral{28}{\isacharparenleft}}xs{\isaliteral{2C}{\isacharcomma}}\ ys{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ AQueue\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ xs{\isaliteral{2C}{\isacharcomma}}\ ys{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
386 |
\isanewline |
40755 | 387 |
fun\ queue{\isaliteral{5F}{\isacharunderscore}}case\ f\ {\isaliteral{28}{\isacharparenleft}}AQueue\ {\isaliteral{28}{\isacharparenleft}}xs{\isaliteral{2C}{\isacharcomma}}\ ys{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ f\ {\isaliteral{28}{\isacharparenleft}}ys\ {\isaliteral{40}{\isacharat}}\ rev\ xs{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
388 |
\isanewline |
|
40406 | 389 |
end{\isaliteral{3B}{\isacharsemicolon}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{2A}{\isacharasterisk}}struct\ Example{\isaliteral{2A}{\isacharasterisk}}{\isaliteral{29}{\isacharparenright}}\isanewline% |
38437 | 390 |
\end{isamarkuptext}% |
391 |
\isamarkuptrue% |
|
392 |
% |
|
39745 | 393 |
\endisatagquotetypewriter |
394 |
{\isafoldquotetypewriter}% |
|
38437 | 395 |
% |
39745 | 396 |
\isadelimquotetypewriter |
38437 | 397 |
% |
39745 | 398 |
\endisadelimquotetypewriter |
38437 | 399 |
% |
400 |
\begin{isamarkuptext}% |
|
38459 | 401 |
The same techniques can also be applied to types which are not |
402 |
specified as datatypes, e.g.~type \isa{int} is originally specified |
|
38511 | 403 |
as quotient type by means of \indexdef{}{command}{typedef}\hypertarget{command.typedef}{\hyperlink{command.typedef}{\mbox{\isa{\isacommand{typedef}}}}}, but for code |
38459 | 404 |
generation constants allowing construction of binary numeral values |
405 |
are used as constructors for \isa{int}. |
|
38437 | 406 |
|
38459 | 407 |
This approach however fails if the representation of a type demands |
408 |
invariants; this issue is discussed in the next section.% |
|
409 |
\end{isamarkuptext}% |
|
410 |
\isamarkuptrue% |
|
411 |
% |
|
39599 | 412 |
\isamarkupsubsection{Datatype refinement involving invariants \label{sec:invariant}% |
38459 | 413 |
} |
414 |
\isamarkuptrue% |
|
415 |
% |
|
416 |
\begin{isamarkuptext}% |
|
38502 | 417 |
Datatype representation involving invariants require a dedicated |
418 |
setup for the type and its primitive operations. As a running |
|
40406 | 419 |
example, we implement a type \isa{{\isaliteral{27}{\isacharprime}}a\ dlist} of list consisting |
38502 | 420 |
of distinct elements. |
421 |
||
422 |
The first step is to decide on which representation the abstract |
|
40406 | 423 |
type (in our example \isa{{\isaliteral{27}{\isacharprime}}a\ dlist}) should be implemented. |
424 |
Here we choose \isa{{\isaliteral{27}{\isacharprime}}a\ list}. Then a conversion from the concrete |
|
38502 | 425 |
type to the abstract type must be specified, here:% |
426 |
\end{isamarkuptext}% |
|
427 |
\isamarkuptrue% |
|
428 |
% |
|
429 |
\isadelimquote |
|
430 |
% |
|
431 |
\endisadelimquote |
|
432 |
% |
|
433 |
\isatagquote |
|
434 |
% |
|
435 |
\begin{isamarkuptext}% |
|
40406 | 436 |
\isa{Dlist\ {\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}\ {\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ dlist}% |
38502 | 437 |
\end{isamarkuptext}% |
438 |
\isamarkuptrue% |
|
439 |
% |
|
440 |
\endisatagquote |
|
441 |
{\isafoldquote}% |
|
442 |
% |
|
443 |
\isadelimquote |
|
444 |
% |
|
445 |
\endisadelimquote |
|
446 |
% |
|
447 |
\begin{isamarkuptext}% |
|
448 |
\noindent Next follows the specification of a suitable \emph{projection}, |
|
449 |
i.e.~a conversion from abstract to concrete type:% |
|
450 |
\end{isamarkuptext}% |
|
451 |
\isamarkuptrue% |
|
452 |
% |
|
453 |
\isadelimquote |
|
454 |
% |
|
455 |
\endisadelimquote |
|
456 |
% |
|
457 |
\isatagquote |
|
458 |
% |
|
459 |
\begin{isamarkuptext}% |
|
40406 | 460 |
\isa{list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ {\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}\ {\isaliteral{27}{\isacharprime}}a\ dlist\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ list}% |
38502 | 461 |
\end{isamarkuptext}% |
462 |
\isamarkuptrue% |
|
463 |
% |
|
464 |
\endisatagquote |
|
465 |
{\isafoldquote}% |
|
466 |
% |
|
467 |
\isadelimquote |
|
468 |
% |
|
469 |
\endisadelimquote |
|
470 |
% |
|
471 |
\begin{isamarkuptext}% |
|
472 |
\noindent This projection must be specified such that the following |
|
473 |
\emph{abstract datatype certificate} can be proven:% |
|
474 |
\end{isamarkuptext}% |
|
475 |
\isamarkuptrue% |
|
476 |
% |
|
477 |
\isadelimquote |
|
478 |
% |
|
479 |
\endisadelimquote |
|
480 |
% |
|
481 |
\isatagquote |
|
482 |
\isacommand{lemma}\isamarkupfalse% |
|
40406 | 483 |
\ {\isaliteral{5B}{\isacharbrackleft}}code\ abstype{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\isanewline |
484 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}Dlist\ {\isaliteral{28}{\isacharparenleft}}list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ dxs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ dxs{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
38502 | 485 |
\ \ \isacommand{by}\isamarkupfalse% |
40406 | 486 |
\ {\isaliteral{28}{\isacharparenleft}}fact\ Dlist{\isaliteral{5F}{\isacharunderscore}}list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist{\isaliteral{29}{\isacharparenright}}% |
38502 | 487 |
\endisatagquote |
488 |
{\isafoldquote}% |
|
489 |
% |
|
490 |
\isadelimquote |
|
491 |
% |
|
492 |
\endisadelimquote |
|
493 |
% |
|
494 |
\begin{isamarkuptext}% |
|
495 |
\noindent Note that so far the invariant on representations |
|
40406 | 496 |
(\isa{distinct\ {\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}\ {\isaliteral{27}{\isacharprime}}a\ list\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ bool}) has never been mentioned explicitly: |
38502 | 497 |
the invariant is only referred to implicitly: all values in |
40406 | 498 |
set \isa{{\isaliteral{7B}{\isacharbraceleft}}xs{\isaliteral{2E}{\isachardot}}\ list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ {\isaliteral{28}{\isacharparenleft}}Dlist\ xs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ xs{\isaliteral{7D}{\isacharbraceright}}} are invariant, |
499 |
and in our example this is exactly \isa{{\isaliteral{7B}{\isacharbraceleft}}xs{\isaliteral{2E}{\isachardot}}\ distinct\ xs{\isaliteral{7D}{\isacharbraceright}}}. |
|
38502 | 500 |
|
40406 | 501 |
The primitive operations on \isa{{\isaliteral{27}{\isacharprime}}a\ dlist} are specified |
502 |
indirectly using the projection \isa{list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist}. For |
|
503 |
the empty \isa{dlist}, \isa{Dlist{\isaliteral{2E}{\isachardot}}empty}, we finally want |
|
38502 | 504 |
the code equation% |
505 |
\end{isamarkuptext}% |
|
506 |
\isamarkuptrue% |
|
507 |
% |
|
508 |
\isadelimquote |
|
509 |
% |
|
510 |
\endisadelimquote |
|
511 |
% |
|
512 |
\isatagquote |
|
513 |
% |
|
514 |
\begin{isamarkuptext}% |
|
40406 | 515 |
\isa{Dlist{\isaliteral{2E}{\isachardot}}empty\ {\isaliteral{3D}{\isacharequal}}\ Dlist\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}}% |
38502 | 516 |
\end{isamarkuptext}% |
517 |
\isamarkuptrue% |
|
518 |
% |
|
519 |
\endisatagquote |
|
520 |
{\isafoldquote}% |
|
521 |
% |
|
522 |
\isadelimquote |
|
523 |
% |
|
524 |
\endisadelimquote |
|
525 |
% |
|
526 |
\begin{isamarkuptext}% |
|
527 |
\noindent This we have to prove indirectly as follows:% |
|
528 |
\end{isamarkuptext}% |
|
529 |
\isamarkuptrue% |
|
530 |
% |
|
531 |
\isadelimquote |
|
532 |
% |
|
533 |
\endisadelimquote |
|
534 |
% |
|
535 |
\isatagquote |
|
536 |
\isacommand{lemma}\isamarkupfalse% |
|
40406 | 537 |
\ {\isaliteral{5B}{\isacharbrackleft}}code\ abstract{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\isanewline |
538 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ Dlist{\isaliteral{2E}{\isachardot}}empty\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
38502 | 539 |
\ \ \isacommand{by}\isamarkupfalse% |
40406 | 540 |
\ {\isaliteral{28}{\isacharparenleft}}fact\ list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist{\isaliteral{5F}{\isacharunderscore}}empty{\isaliteral{29}{\isacharparenright}}% |
38502 | 541 |
\endisatagquote |
542 |
{\isafoldquote}% |
|
543 |
% |
|
544 |
\isadelimquote |
|
545 |
% |
|
546 |
\endisadelimquote |
|
547 |
% |
|
548 |
\begin{isamarkuptext}% |
|
549 |
\noindent This equation logically encodes both the desired code |
|
550 |
equation and that the expression \isa{Dlist} is applied to obeys |
|
551 |
the implicit invariant. Equations for insertion and removal are |
|
552 |
similar:% |
|
553 |
\end{isamarkuptext}% |
|
554 |
\isamarkuptrue% |
|
555 |
% |
|
556 |
\isadelimquote |
|
557 |
% |
|
558 |
\endisadelimquote |
|
559 |
% |
|
560 |
\isatagquote |
|
561 |
\isacommand{lemma}\isamarkupfalse% |
|
40406 | 562 |
\ {\isaliteral{5B}{\isacharbrackleft}}code\ abstract{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\isanewline |
563 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ {\isaliteral{28}{\isacharparenleft}}Dlist{\isaliteral{2E}{\isachardot}}insert\ x\ dxs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ List{\isaliteral{2E}{\isachardot}}insert\ x\ {\isaliteral{28}{\isacharparenleft}}list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ dxs{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
38502 | 564 |
\ \ \isacommand{by}\isamarkupfalse% |
40406 | 565 |
\ {\isaliteral{28}{\isacharparenleft}}fact\ list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist{\isaliteral{5F}{\isacharunderscore}}insert{\isaliteral{29}{\isacharparenright}}\isanewline |
38502 | 566 |
\isanewline |
567 |
\isacommand{lemma}\isamarkupfalse% |
|
40406 | 568 |
\ {\isaliteral{5B}{\isacharbrackleft}}code\ abstract{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\isanewline |
569 |
\ \ {\isaliteral{22}{\isachardoublequoteopen}}list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ {\isaliteral{28}{\isacharparenleft}}Dlist{\isaliteral{2E}{\isachardot}}remove\ x\ dxs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ remove{\isadigit{1}}\ x\ {\isaliteral{28}{\isacharparenleft}}list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ dxs{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline |
|
38502 | 570 |
\ \ \isacommand{by}\isamarkupfalse% |
40406 | 571 |
\ {\isaliteral{28}{\isacharparenleft}}fact\ list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist{\isaliteral{5F}{\isacharunderscore}}remove{\isaliteral{29}{\isacharparenright}}% |
38502 | 572 |
\endisatagquote |
573 |
{\isafoldquote}% |
|
574 |
% |
|
575 |
\isadelimquote |
|
576 |
% |
|
577 |
\endisadelimquote |
|
578 |
% |
|
579 |
\begin{isamarkuptext}% |
|
580 |
\noindent Then the corresponding code is as follows:% |
|
581 |
\end{isamarkuptext}% |
|
582 |
\isamarkuptrue% |
|
583 |
% |
|
39745 | 584 |
\isadelimquotetypewriter |
38502 | 585 |
% |
39745 | 586 |
\endisadelimquotetypewriter |
38502 | 587 |
% |
39745 | 588 |
\isatagquotetypewriter |
38502 | 589 |
% |
590 |
\begin{isamarkuptext}% |
|
40406 | 591 |
module\ Example\ where\ {\isaliteral{7B}{\isacharbraceleft}}\isanewline |
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
592 |
\isanewline |
40406 | 593 |
newtype\ Dlist\ a\ {\isaliteral{3D}{\isacharequal}}\ Dlist\ {\isaliteral{5B}{\isacharbrackleft}}a{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
594 |
\isanewline |
40406 | 595 |
empty\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ forall\ a{\isaliteral{2E}{\isachardot}}\ Dlist\ a{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
596 |
empty\ {\isaliteral{3D}{\isacharequal}}\ Dlist\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
597 |
\isanewline |
40406 | 598 |
member\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ forall\ a{\isaliteral{2E}{\isachardot}}\ {\isaliteral{28}{\isacharparenleft}}Eq\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{5B}{\isacharbrackleft}}a{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ a\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ Bool{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
599 |
member\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ y\ {\isaliteral{3D}{\isacharequal}}\ False{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
600 |
member\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{3A}{\isacharcolon}}\ xs{\isaliteral{29}{\isacharparenright}}\ y\ {\isaliteral{3D}{\isacharequal}}\ x\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{3D}{\isacharequal}}\ y\ {\isaliteral{7C}{\isacharbar}}{\isaliteral{7C}{\isacharbar}}\ member\ xs\ y{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
601 |
\isanewline |
40406 | 602 |
insert\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ forall\ a{\isaliteral{2E}{\isachardot}}\ {\isaliteral{28}{\isacharparenleft}}Eq\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{3E}{\isachargreater}}\ a\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{5B}{\isacharbrackleft}}a{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{5B}{\isacharbrackleft}}a{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
603 |
insert\ x\ xs\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}if\ member\ xs\ x\ then\ xs\ else\ x\ {\isaliteral{3A}{\isacharcolon}}\ xs{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
604 |
\isanewline |
40406 | 605 |
list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ forall\ a{\isaliteral{2E}{\isachardot}}\ Dlist\ a\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{5B}{\isacharbrackleft}}a{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
606 |
list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ {\isaliteral{28}{\isacharparenleft}}Dlist\ x{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ x{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
607 |
\isanewline |
40406 | 608 |
inserta\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ forall\ a{\isaliteral{2E}{\isachardot}}\ {\isaliteral{28}{\isacharparenleft}}Eq\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{3E}{\isachargreater}}\ a\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ Dlist\ a\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ Dlist\ a{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
609 |
inserta\ x\ dxs\ {\isaliteral{3D}{\isacharequal}}\ Dlist\ {\isaliteral{28}{\isacharparenleft}}insert\ x\ {\isaliteral{28}{\isacharparenleft}}list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ dxs{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
610 |
\isanewline |
40406 | 611 |
remove{\isadigit{1}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ forall\ a{\isaliteral{2E}{\isachardot}}\ {\isaliteral{28}{\isacharparenleft}}Eq\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{3E}{\isachargreater}}\ a\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{5B}{\isacharbrackleft}}a{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ {\isaliteral{5B}{\isacharbrackleft}}a{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
612 |
remove{\isadigit{1}}\ x\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
613 |
remove{\isadigit{1}}\ x\ {\isaliteral{28}{\isacharparenleft}}y\ {\isaliteral{3A}{\isacharcolon}}\ xs{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}if\ x\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{3D}{\isacharequal}}\ y\ then\ xs\ else\ y\ {\isaliteral{3A}{\isacharcolon}}\ remove{\isadigit{1}}\ x\ xs{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
614 |
\isanewline |
40406 | 615 |
remove\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ forall\ a{\isaliteral{2E}{\isachardot}}\ {\isaliteral{28}{\isacharparenleft}}Eq\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{3E}{\isachargreater}}\ a\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ Dlist\ a\ {\isaliteral{2D}{\isacharminus}}{\isaliteral{3E}{\isachargreater}}\ Dlist\ a{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
616 |
remove\ x\ dxs\ {\isaliteral{3D}{\isacharequal}}\ Dlist\ {\isaliteral{28}{\isacharparenleft}}remove{\isadigit{1}}\ x\ {\isaliteral{28}{\isacharparenleft}}list{\isaliteral{5F}{\isacharunderscore}}of{\isaliteral{5F}{\isacharunderscore}}dlist\ dxs{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{3B}{\isacharsemicolon}}\isanewline |
|
39664
0afaf89ab591
more canonical type setting of type writer code examples
haftmann
parents:
39599
diff
changeset
|
617 |
\isanewline |
40406 | 618 |
{\isaliteral{7D}{\isacharbraceright}}\isanewline% |
38502 | 619 |
\end{isamarkuptext}% |
620 |
\isamarkuptrue% |
|
621 |
% |
|
39745 | 622 |
\endisatagquotetypewriter |
623 |
{\isafoldquotetypewriter}% |
|
38502 | 624 |
% |
39745 | 625 |
\isadelimquotetypewriter |
38502 | 626 |
% |
39745 | 627 |
\endisadelimquotetypewriter |
38502 | 628 |
% |
629 |
\begin{isamarkuptext}% |
|
630 |
Typical data structures implemented by representations involving |
|
46563 | 631 |
invariants are available in the library, theory \isa{Mapping} |
46523 | 632 |
specifies key-value-mappings (type \isa{{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ mapping}); |
46563 | 633 |
these can be implemented by red-black-trees (theory \isa{RBT}).% |
38437 | 634 |
\end{isamarkuptext}% |
635 |
\isamarkuptrue% |
|
636 |
% |
|
38406 | 637 |
\isadelimtheory |
638 |
% |
|
639 |
\endisadelimtheory |
|
640 |
% |
|
641 |
\isatagtheory |
|
642 |
\isacommand{end}\isamarkupfalse% |
|
643 |
% |
|
644 |
\endisatagtheory |
|
645 |
{\isafoldtheory}% |
|
646 |
% |
|
647 |
\isadelimtheory |
|
648 |
% |
|
649 |
\endisadelimtheory |
|
650 |
\isanewline |
|
46523 | 651 |
\isanewline |
38406 | 652 |
\end{isabellebody}% |
653 |
%%% Local Variables: |
|
654 |
%%% mode: latex |
|
655 |
%%% TeX-master: "root" |
|
656 |
%%% End: |