35 } |
35 } |
36 \isamarkuptrue% |
36 \isamarkuptrue% |
37 % |
37 % |
38 \begin{isamarkuptext}% |
38 \begin{isamarkuptext}% |
39 Record types are not primitive in Isabelle and have a delicate |
39 Record types are not primitive in Isabelle and have a delicate |
40 internal representation based on nested copies of the primitive |
40 internal representation \cite{NaraschewskiW-TPHOLs98}, based on |
41 product type. A \commdx{record} declaration introduces a new record |
41 nested copies of the primitive product type. A \commdx{record} |
42 type scheme by specifying its fields, which are packaged internally |
42 declaration introduces a new record type scheme by specifying its |
43 to hold up the perception of the record as a distinguished entity.% |
43 fields, which are packaged internally to hold up the perception of |
|
44 the record as a distinguished entity. Here is a simply example.% |
44 \end{isamarkuptext}% |
45 \end{isamarkuptext}% |
45 \isamarkuptrue% |
46 \isamarkuptrue% |
46 \isacommand{record}\ point\ {\isacharequal}\isanewline |
47 \isacommand{record}\ point\ {\isacharequal}\isanewline |
47 \ \ Xcoord\ {\isacharcolon}{\isacharcolon}\ int\isanewline |
48 \ \ Xcoord\ {\isacharcolon}{\isacharcolon}\ int\isanewline |
48 \ \ Ycoord\ {\isacharcolon}{\isacharcolon}\ int\isamarkupfalse% |
49 \ \ Ycoord\ {\isacharcolon}{\isacharcolon}\ int\isamarkupfalse% |
58 \ \ {\isachardoublequote}pt{\isadigit{1}}\ {\isasymequiv}\ {\isacharparenleft}{\isacharbar}\ Xcoord\ {\isacharequal}\ {\isadigit{9}}{\isadigit{9}}{\isadigit{9}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ {\isadigit{2}}{\isadigit{3}}\ {\isacharbar}{\isacharparenright}{\isachardoublequote}\isamarkupfalse% |
59 \ \ {\isachardoublequote}pt{\isadigit{1}}\ {\isasymequiv}\ {\isacharparenleft}{\isacharbar}\ Xcoord\ {\isacharequal}\ {\isadigit{9}}{\isadigit{9}}{\isadigit{9}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ {\isadigit{2}}{\isadigit{3}}\ {\isacharbar}{\isacharparenright}{\isachardoublequote}\isamarkupfalse% |
59 % |
60 % |
60 \begin{isamarkuptext}% |
61 \begin{isamarkuptext}% |
61 We see above the ASCII notation for record brackets. You can also |
62 We see above the ASCII notation for record brackets. You can also |
62 use the symbolic brackets \isa{{\isasymlparr}} and \isa{{\isasymrparr}}. Record type |
63 use the symbolic brackets \isa{{\isasymlparr}} and \isa{{\isasymrparr}}. Record type |
63 expressions can be written directly as well, without referring to |
64 expressions can be also written directly with individual fields. |
64 previously declared names (which happen to be mere type |
65 The type name above is merely an abbreviations.% |
65 abbreviations):% |
|
66 \end{isamarkuptext}% |
66 \end{isamarkuptext}% |
67 \isamarkuptrue% |
67 \isamarkuptrue% |
68 \isacommand{constdefs}\isanewline |
68 \isacommand{constdefs}\isanewline |
69 \ \ pt{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharcolon}\ int{\isacharcomma}\ Ycoord\ {\isacharcolon}{\isacharcolon}\ int{\isasymrparr}{\isachardoublequote}\isanewline |
69 \ \ pt{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharcolon}\ int{\isacharcomma}\ Ycoord\ {\isacharcolon}{\isacharcolon}\ int{\isasymrparr}{\isachardoublequote}\isanewline |
70 \ \ {\isachardoublequote}pt{\isadigit{2}}\ {\isasymequiv}\ {\isasymlparr}Xcoord\ {\isacharequal}\ {\isacharminus}{\isadigit{4}}{\isadigit{5}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ {\isadigit{9}}{\isadigit{7}}{\isasymrparr}{\isachardoublequote}\isamarkupfalse% |
70 \ \ {\isachardoublequote}pt{\isadigit{2}}\ {\isasymequiv}\ {\isasymlparr}Xcoord\ {\isacharequal}\ {\isacharminus}{\isadigit{4}}{\isadigit{5}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ {\isadigit{9}}{\isadigit{7}}{\isasymrparr}{\isachardoublequote}\isamarkupfalse% |
80 \isacommand{by}\ simp\isamarkupfalse% |
80 \isacommand{by}\ simp\isamarkupfalse% |
81 % |
81 % |
82 \begin{isamarkuptext}% |
82 \begin{isamarkuptext}% |
83 The \emph{update}\index{update!record} operation is functional. For |
83 The \emph{update}\index{update!record} operation is functional. For |
84 example, \isa{p{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharequal}\ {\isadigit{0}}{\isasymrparr}} is a record whose \isa{Xcoord} |
84 example, \isa{p{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharequal}\ {\isadigit{0}}{\isasymrparr}} is a record whose \isa{Xcoord} |
85 value is zero and whose \isa{Ycoord} value is copied from~\isa{p}. Updates are also simplified automatically:% |
85 value is zero and whose \isa{Ycoord} value is copied from~\isa{p}. Updates of explicit records are also simplified automatically:% |
86 \end{isamarkuptext}% |
86 \end{isamarkuptext}% |
87 \isamarkuptrue% |
87 \isamarkuptrue% |
88 \isacommand{lemma}\ {\isachardoublequote}{\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharequal}\ {\isadigit{0}}{\isasymrparr}\ {\isacharequal}\isanewline |
88 \isacommand{lemma}\ {\isachardoublequote}{\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharequal}\ {\isadigit{0}}{\isasymrparr}\ {\isacharequal}\isanewline |
89 \ \ \ \ {\isasymlparr}Xcoord\ {\isacharequal}\ {\isadigit{0}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}{\isachardoublequote}\isanewline |
89 \ \ \ \ {\isasymlparr}Xcoord\ {\isacharequal}\ {\isadigit{0}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}{\isachardoublequote}\isanewline |
90 \ \ \isamarkupfalse% |
90 \ \ \isamarkupfalse% |
116 \isacommand{record}\ cpoint\ {\isacharequal}\ point\ {\isacharplus}\isanewline |
116 \isacommand{record}\ cpoint\ {\isacharequal}\ point\ {\isacharplus}\isanewline |
117 \ \ col\ {\isacharcolon}{\isacharcolon}\ colour\isamarkupfalse% |
117 \ \ col\ {\isacharcolon}{\isacharcolon}\ colour\isamarkupfalse% |
118 % |
118 % |
119 \begin{isamarkuptext}% |
119 \begin{isamarkuptext}% |
120 The fields of this new type are \isa{Xcoord}, \isa{Ycoord} and |
120 The fields of this new type are \isa{Xcoord}, \isa{Ycoord} and |
121 \isa{col}, in that order:% |
121 \isa{col}, in that order.% |
122 \end{isamarkuptext}% |
122 \end{isamarkuptext}% |
123 \isamarkuptrue% |
123 \isamarkuptrue% |
124 \isacommand{constdefs}\isanewline |
124 \isacommand{constdefs}\isanewline |
125 \ \ cpt{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ cpoint\isanewline |
125 \ \ cpt{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ cpoint\isanewline |
126 \ \ {\isachardoublequote}cpt{\isadigit{1}}\ {\isasymequiv}\ {\isasymlparr}Xcoord\ {\isacharequal}\ {\isadigit{9}}{\isadigit{9}}{\isadigit{9}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ {\isadigit{2}}{\isadigit{3}}{\isacharcomma}\ col\ {\isacharequal}\ Green{\isasymrparr}{\isachardoublequote}\isamarkupfalse% |
126 \ \ {\isachardoublequote}cpt{\isadigit{1}}\ {\isasymequiv}\ {\isasymlparr}Xcoord\ {\isacharequal}\ {\isadigit{9}}{\isadigit{9}}{\isadigit{9}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ {\isadigit{2}}{\isadigit{3}}{\isacharcomma}\ col\ {\isacharequal}\ Green{\isasymrparr}{\isachardoublequote}\isamarkupfalse% |
127 % |
127 % |
128 \begin{isamarkuptext}% |
128 \begin{isamarkuptext}% |
129 We can define generic operations that work on arbitrary instances of |
129 We can define generic operations that work on arbitrary instances of |
130 a record scheme, e.g.\ covering \isa{point}, \isa{cpoint} and any |
130 a record scheme, e.g.\ covering \isa{point}, \isa{cpoint}, and any |
131 further extensions. Every record structure has an implicit |
131 further extensions. Every record structure has an implicit |
132 pseudo-field, \cdx{more}, that keeps the extension as an explicit |
132 pseudo-field, \cdx{more}, that keeps the extension as an explicit |
133 value. Its type is declared as completely polymorphic:~\isa{{\isacharprime}a}. |
133 value. Its type is declared as completely polymorphic:~\isa{{\isacharprime}a}. |
134 When a fixed record value is expressed using just its standard |
134 When a fixed record value is expressed using just its standard |
135 fields, the value of \isa{more} is implicitly set to \isa{{\isacharparenleft}{\isacharparenright}}, |
135 fields, the value of \isa{more} is implicitly set to \isa{{\isacharparenleft}{\isacharparenright}}, |
136 the empty tuple, which has type \isa{unit}. Within the record |
136 the empty tuple, which has type \isa{unit}. Within the record |
137 brackets, you can refer to the \isa{more} field by writing \isa{{\isasymdots}} (three dots):% |
137 brackets, you can refer to the \isa{more} field by writing |
|
138 ``\isa{{\isasymdots}}'' (three dots):% |
138 \end{isamarkuptext}% |
139 \end{isamarkuptext}% |
139 \isamarkuptrue% |
140 \isamarkuptrue% |
140 \isacommand{lemma}\ {\isachardoublequote}Xcoord\ {\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ p{\isasymrparr}\ {\isacharequal}\ a{\isachardoublequote}\isanewline |
141 \isacommand{lemma}\ {\isachardoublequote}Xcoord\ {\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ p{\isasymrparr}\ {\isacharequal}\ a{\isachardoublequote}\isanewline |
141 \ \ \isamarkupfalse% |
142 \ \ \isamarkupfalse% |
142 \isacommand{by}\ simp\isamarkupfalse% |
143 \isacommand{by}\ simp\isamarkupfalse% |
143 % |
144 % |
144 \begin{isamarkuptext}% |
145 \begin{isamarkuptext}% |
145 This lemma applies to any record whose first two fields are \isa{Xcoord} and~\isa{Ycoord}. Note that \isa{{\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ {\isacharparenleft}{\isacharparenright}{\isasymrparr}} is really the same as \isa{{\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}}. Selectors and updates are always polymorphic wrt.\ the \isa{more} part of a record scheme, its value is just ignored (for |
146 This lemma applies to any record whose first two fields are \isa{Xcoord} and~\isa{Ycoord}. Note that \isa{{\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ {\isacharparenleft}{\isacharparenright}{\isasymrparr}} is exactly the same as \isa{{\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}}. Selectors and updates are always polymorphic wrt.\ the |
|
147 \isa{more} part of a record scheme, its value is just ignored (for |
146 select) or copied (for update). |
148 select) or copied (for update). |
147 |
149 |
148 The \isa{more} pseudo-field may be manipulated directly as well, |
150 The \isa{more} pseudo-field may be manipulated directly as well, |
149 but the identifier needs to be qualified:% |
151 but the identifier needs to be qualified:% |
150 \end{isamarkuptext}% |
152 \end{isamarkuptext}% |
152 \isacommand{lemma}\ {\isachardoublequote}point{\isachardot}more\ cpt{\isadigit{1}}\ {\isacharequal}\ {\isasymlparr}col\ {\isacharequal}\ Green{\isasymrparr}{\isachardoublequote}\isanewline |
154 \isacommand{lemma}\ {\isachardoublequote}point{\isachardot}more\ cpt{\isadigit{1}}\ {\isacharequal}\ {\isasymlparr}col\ {\isacharequal}\ Green{\isasymrparr}{\isachardoublequote}\isanewline |
153 \ \ \isamarkupfalse% |
155 \ \ \isamarkupfalse% |
154 \isacommand{by}\ {\isacharparenleft}simp\ add{\isacharcolon}\ cpt{\isadigit{1}}{\isacharunderscore}def{\isacharparenright}\isamarkupfalse% |
156 \isacommand{by}\ {\isacharparenleft}simp\ add{\isacharcolon}\ cpt{\isadigit{1}}{\isacharunderscore}def{\isacharparenright}\isamarkupfalse% |
155 % |
157 % |
156 \begin{isamarkuptext}% |
158 \begin{isamarkuptext}% |
157 We see that the colour attached to this \isa{point} is a |
159 We see that the colour part attached to this \isa{point} is a |
158 (rudimentary) record in its own right, namely \isa{{\isasymlparr}col\ {\isacharequal}\ Green{\isasymrparr}}. In order to select or update \isa{col}, this fragment |
160 (rudimentary) record in its own right, namely \isa{{\isasymlparr}col\ {\isacharequal}\ Green{\isasymrparr}}. In order to select or update \isa{col}, this fragment |
159 needs to be put back into the context of the parent type scheme, say |
161 needs to be put back into the context of the parent type scheme, say |
160 as \isa{more} part of another \isa{point}. |
162 as \isa{more} part of another \isa{point}. |
161 |
163 |
162 To define generic operations, we need to know a bit more about |
164 To define generic operations, we need to know a bit more about |
163 records. Our definition of \isa{point} above generated two type |
165 records. Our definition of \isa{point} above has generated two |
164 abbreviations: |
166 type abbreviations: |
165 |
167 |
166 \medskip |
168 \medskip |
167 \begin{tabular}{l} |
169 \begin{tabular}{l} |
168 \isa{point}~\isa{{\isacharequal}}~\isa{{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharcolon}\ int{\isacharcomma}\ Ycoord\ {\isacharcolon}{\isacharcolon}\ int{\isasymrparr}} \\ |
170 \isa{point}~\isa{{\isacharequal}}~\isa{{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharcolon}\ int{\isacharcomma}\ Ycoord\ {\isacharcolon}{\isacharcolon}\ int{\isasymrparr}} \\ |
169 \isa{{\isacharprime}a\ point{\isacharunderscore}scheme}~\isa{{\isacharequal}}~\isa{{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharcolon}\ int{\isacharcomma}\ Ycoord\ {\isacharcolon}{\isacharcolon}\ int{\isacharcomma}\ {\isasymdots}\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a{\isasymrparr}} \\ |
171 \isa{{\isacharprime}a\ point{\isacharunderscore}scheme}~\isa{{\isacharequal}}~\isa{{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharcolon}\ int{\isacharcomma}\ Ycoord\ {\isacharcolon}{\isacharcolon}\ int{\isacharcomma}\ {\isasymdots}\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a{\isasymrparr}} \\ |
191 \isa{point} (including \isa{cpoint} etc.):% |
193 \isa{point} (including \isa{cpoint} etc.):% |
192 \end{isamarkuptext}% |
194 \end{isamarkuptext}% |
193 \isamarkuptrue% |
195 \isamarkuptrue% |
194 \isacommand{constdefs}\isanewline |
196 \isacommand{constdefs}\isanewline |
195 \ \ incX\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharprime}a\ point{\isacharunderscore}scheme\ {\isasymRightarrow}\ {\isacharprime}a\ point{\isacharunderscore}scheme{\isachardoublequote}\isanewline |
197 \ \ incX\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharprime}a\ point{\isacharunderscore}scheme\ {\isasymRightarrow}\ {\isacharprime}a\ point{\isacharunderscore}scheme{\isachardoublequote}\isanewline |
196 \ \ {\isachardoublequote}incX\ r\ {\isasymequiv}\ {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord\ r\ {\isacharplus}\ {\isadigit{1}}{\isacharcomma}\isanewline |
198 \ \ {\isachardoublequote}incX\ r\ {\isasymequiv}\isanewline |
197 \ \ \ \ Ycoord\ {\isacharequal}\ Ycoord\ r{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ point{\isachardot}more\ r{\isasymrparr}{\isachardoublequote}\isamarkupfalse% |
199 \ \ \ \ {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord\ r\ {\isacharplus}\ {\isadigit{1}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord\ r{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ point{\isachardot}more\ r{\isasymrparr}{\isachardoublequote}\isamarkupfalse% |
198 % |
200 % |
199 \begin{isamarkuptext}% |
201 \begin{isamarkuptext}% |
200 Generic theorems can be proved about generic methods. This trivial |
202 Generic theorems can be proved about generic methods. This trivial |
201 lemma relates \isa{incX} to \isa{getX} and \isa{setX}:% |
203 lemma relates \isa{incX} to \isa{getX} and \isa{setX}:% |
202 \end{isamarkuptext}% |
204 \end{isamarkuptext}% |
221 } |
223 } |
222 \isamarkuptrue% |
224 \isamarkuptrue% |
223 % |
225 % |
224 \begin{isamarkuptext}% |
226 \begin{isamarkuptext}% |
225 Two records are equal\index{equality!of records} if all pairs of |
227 Two records are equal\index{equality!of records} if all pairs of |
226 corresponding fields are equal. Record equalities are simplified |
228 corresponding fields are equal. Concrete record equalities are |
227 automatically:% |
229 simplified automatically:% |
228 \end{isamarkuptext}% |
230 \end{isamarkuptext}% |
229 \isamarkuptrue% |
231 \isamarkuptrue% |
230 \isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}{\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}\ {\isacharequal}\ {\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharprime}{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isacharprime}{\isasymrparr}{\isacharparenright}\ {\isacharequal}\isanewline |
232 \isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}{\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}\ {\isacharequal}\ {\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharprime}{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isacharprime}{\isasymrparr}{\isacharparenright}\ {\isacharequal}\isanewline |
231 \ \ \ \ {\isacharparenleft}a\ {\isacharequal}\ a{\isacharprime}\ {\isasymand}\ b\ {\isacharequal}\ b{\isacharprime}{\isacharparenright}{\isachardoublequote}\isanewline |
233 \ \ \ \ {\isacharparenleft}a\ {\isacharequal}\ a{\isacharprime}\ {\isasymand}\ b\ {\isacharequal}\ b{\isacharprime}{\isacharparenright}{\isachardoublequote}\isanewline |
232 \ \ \isamarkupfalse% |
234 \ \ \isamarkupfalse% |
332 % |
334 % |
333 \begin{isamarkuptext}% |
335 \begin{isamarkuptext}% |
334 The generic cases method does not admit references to locally bound |
336 The generic cases method does not admit references to locally bound |
335 parameters of a goal. In longer proof scripts one might have to |
337 parameters of a goal. In longer proof scripts one might have to |
336 fall back on the primitive \isa{rule{\isacharunderscore}tac} used together with the |
338 fall back on the primitive \isa{rule{\isacharunderscore}tac} used together with the |
337 internal representation rules of records. E.g.\ the above use of |
339 internal field representation rules of records. E.g.\ the above use |
338 \isa{{\isacharparenleft}cases\ r{\isacharparenright}} would become \isa{{\isacharparenleft}rule{\isacharunderscore}tac\ r\ {\isacharequal}\ r\ in\ point{\isachardot}cases{\isacharunderscore}scheme{\isacharparenright}}.% |
340 of \isa{{\isacharparenleft}cases\ r{\isacharparenright}} would become \isa{{\isacharparenleft}rule{\isacharunderscore}tac\ r\ {\isacharequal}\ r\ in\ point{\isachardot}cases{\isacharunderscore}scheme{\isacharparenright}}.% |
339 \end{isamarkuptext}% |
341 \end{isamarkuptext}% |
340 \isamarkuptrue% |
342 \isamarkuptrue% |
341 % |
343 % |
342 \isamarkupsubsection{Extending and Truncating Records% |
344 \isamarkupsubsection{Extending and Truncating Records% |
343 } |
345 } |