doc-src/TutorialI/Types/document/Records.tex
changeset 27015 f8537d69f514
parent 26318 967323f93c67
child 40406 313a24b66a8d
equal deleted inserted replaced
27014:a5f53d9d2b60 27015:f8537d69f514
    59 \isacommand{record}\isamarkupfalse%
    59 \isacommand{record}\isamarkupfalse%
    60 \ point\ {\isacharequal}\isanewline
    60 \ point\ {\isacharequal}\isanewline
    61 \ \ Xcoord\ {\isacharcolon}{\isacharcolon}\ int\isanewline
    61 \ \ Xcoord\ {\isacharcolon}{\isacharcolon}\ int\isanewline
    62 \ \ Ycoord\ {\isacharcolon}{\isacharcolon}\ int%
    62 \ \ Ycoord\ {\isacharcolon}{\isacharcolon}\ int%
    63 \begin{isamarkuptext}%
    63 \begin{isamarkuptext}%
    64 Records of type \isa{point} have two fields named \isa{Xcoord}
    64 \noindent
       
    65   Records of type \isa{point} have two fields named \isa{Xcoord}
    65   and \isa{Ycoord}, both of type~\isa{int}.  We now define a
    66   and \isa{Ycoord}, both of type~\isa{int}.  We now define a
    66   constant of type \isa{point}:%
    67   constant of type \isa{point}:%
    67 \end{isamarkuptext}%
    68 \end{isamarkuptext}%
    68 \isamarkuptrue%
    69 \isamarkuptrue%
    69 \isacommand{constdefs}\isamarkupfalse%
    70 \isacommand{definition}\isamarkupfalse%
    70 \isanewline
    71 \ pt{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ point\ \isakeyword{where}\isanewline
    71 \ \ pt{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ point\isanewline
    72 {\isachardoublequoteopen}pt{\isadigit{1}}\ {\isasymequiv}\ {\isacharparenleft}{\isacharbar}\ Xcoord\ {\isacharequal}\ {\isadigit{9}}{\isadigit{9}}{\isadigit{9}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ {\isadigit{2}}{\isadigit{3}}\ {\isacharbar}{\isacharparenright}{\isachardoublequoteclose}%
    72 \ \ {\isachardoublequoteopen}pt{\isadigit{1}}\ {\isasymequiv}\ {\isacharparenleft}{\isacharbar}\ Xcoord\ {\isacharequal}\ {\isadigit{9}}{\isadigit{9}}{\isadigit{9}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ {\isadigit{2}}{\isadigit{3}}\ {\isacharbar}{\isacharparenright}{\isachardoublequoteclose}%
    73 \begin{isamarkuptext}%
    73 \begin{isamarkuptext}%
    74 \noindent
    74 We see above the ASCII notation for record brackets.  You can also
    75   We see above the ASCII notation for record brackets.  You can also
    75   use the symbolic brackets \isa{{\isasymlparr}} and \isa{{\isasymrparr}}.  Record type
    76   use the symbolic brackets \isa{{\isasymlparr}} and \isa{{\isasymrparr}}.  Record type
    76   expressions can be also written directly with individual fields.
    77   expressions can be also written directly with individual fields.
    77   The type name above is merely an abbreviation.%
    78   The type name above is merely an abbreviation.%
    78 \end{isamarkuptext}%
    79 \end{isamarkuptext}%
    79 \isamarkuptrue%
    80 \isamarkuptrue%
    80 \isacommand{constdefs}\isamarkupfalse%
    81 \isacommand{definition}\isamarkupfalse%
    81 \isanewline
    82 \ pt{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharcolon}\ int{\isacharcomma}\ Ycoord\ {\isacharcolon}{\isacharcolon}\ int{\isasymrparr}{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
    82 \ \ pt{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharcolon}\ int{\isacharcomma}\ Ycoord\ {\isacharcolon}{\isacharcolon}\ int{\isasymrparr}{\isachardoublequoteclose}\isanewline
    83 {\isachardoublequoteopen}pt{\isadigit{2}}\ {\isasymequiv}\ {\isasymlparr}Xcoord\ {\isacharequal}\ {\isacharminus}{\isadigit{4}}{\isadigit{5}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ {\isadigit{9}}{\isadigit{7}}{\isasymrparr}{\isachardoublequoteclose}%
    83 \ \ {\isachardoublequoteopen}pt{\isadigit{2}}\ {\isasymequiv}\ {\isasymlparr}Xcoord\ {\isacharequal}\ {\isacharminus}{\isadigit{4}}{\isadigit{5}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ {\isadigit{9}}{\isadigit{7}}{\isasymrparr}{\isachardoublequoteclose}%
       
    84 \begin{isamarkuptext}%
    84 \begin{isamarkuptext}%
    85 For each field, there is a \emph{selector}\index{selector!record}
    85 For each field, there is a \emph{selector}\index{selector!record}
    86   function of the same name.  For example, if \isa{p} has type \isa{point} then \isa{Xcoord\ p} denotes the value of the \isa{Xcoord} field of~\isa{p}.  Expressions involving field selection
    86   function of the same name.  For example, if \isa{p} has type \isa{point} then \isa{Xcoord\ p} denotes the value of the \isa{Xcoord} field of~\isa{p}.  Expressions involving field selection
    87   of explicit records are simplified automatically:%
    87   of explicit records are simplified automatically:%
    88 \end{isamarkuptext}%
    88 \end{isamarkuptext}%
   110   value is zero and whose \isa{Ycoord} value is copied from~\isa{p}.  Updates of explicit records are also simplified automatically:%
   110   value is zero and whose \isa{Ycoord} value is copied from~\isa{p}.  Updates of explicit records are also simplified automatically:%
   111 \end{isamarkuptext}%
   111 \end{isamarkuptext}%
   112 \isamarkuptrue%
   112 \isamarkuptrue%
   113 \isacommand{lemma}\isamarkupfalse%
   113 \isacommand{lemma}\isamarkupfalse%
   114 \ {\isachardoublequoteopen}{\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharequal}\ {\isadigit{0}}{\isasymrparr}\ {\isacharequal}\isanewline
   114 \ {\isachardoublequoteopen}{\isasymlparr}Xcoord\ {\isacharequal}\ a{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharequal}\ {\isadigit{0}}{\isasymrparr}\ {\isacharequal}\isanewline
   115 \ \ \ \ {\isasymlparr}Xcoord\ {\isacharequal}\ {\isadigit{0}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}{\isachardoublequoteclose}\isanewline
   115 \ \ \ \ \ \ \ \ \ {\isasymlparr}Xcoord\ {\isacharequal}\ {\isadigit{0}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ b{\isasymrparr}{\isachardoublequoteclose}\isanewline
   116 %
   116 %
   117 \isadelimproof
   117 \isadelimproof
   118 \ \ %
   118 \ \ %
   119 \endisadelimproof
   119 \endisadelimproof
   120 %
   120 %
   153 \isanewline
   153 \isanewline
   154 \isacommand{record}\isamarkupfalse%
   154 \isacommand{record}\isamarkupfalse%
   155 \ cpoint\ {\isacharequal}\ point\ {\isacharplus}\isanewline
   155 \ cpoint\ {\isacharequal}\ point\ {\isacharplus}\isanewline
   156 \ \ col\ {\isacharcolon}{\isacharcolon}\ colour%
   156 \ \ col\ {\isacharcolon}{\isacharcolon}\ colour%
   157 \begin{isamarkuptext}%
   157 \begin{isamarkuptext}%
   158 The fields of this new type are \isa{Xcoord}, \isa{Ycoord} and
   158 \noindent
       
   159   The fields of this new type are \isa{Xcoord}, \isa{Ycoord} and
   159   \isa{col}, in that order.%
   160   \isa{col}, in that order.%
   160 \end{isamarkuptext}%
   161 \end{isamarkuptext}%
   161 \isamarkuptrue%
   162 \isamarkuptrue%
   162 \isacommand{constdefs}\isamarkupfalse%
   163 \isacommand{definition}\isamarkupfalse%
   163 \isanewline
   164 \ cpt{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ cpoint\ \isakeyword{where}\isanewline
   164 \ \ cpt{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ cpoint\isanewline
   165 {\isachardoublequoteopen}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}{\isachardoublequoteclose}%
   165 \ \ {\isachardoublequoteopen}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}{\isachardoublequoteclose}%
   166 \begin{isamarkuptext}%
   166 \begin{isamarkuptext}%
   167 We can define generic operations that work on arbitrary
   167 \medskip We can define generic operations that work on arbitrary
       
   168   instances of a record scheme, e.g.\ covering \isa{point}, \isa{cpoint}, and any further extensions.  Every record structure has an
   168   instances of a record scheme, e.g.\ covering \isa{point}, \isa{cpoint}, and any further extensions.  Every record structure has an
   169   implicit pseudo-field, \cdx{more}, that keeps the extension as an
   169   implicit pseudo-field, \cdx{more}, that keeps the extension as an
   170   explicit value.  Its type is declared as completely
   170   explicit value.  Its type is declared as completely
   171   polymorphic:~\isa{{\isacharprime}a}.  When a fixed record value is expressed
   171   polymorphic:~\isa{{\isacharprime}a}.  When a fixed record value is expressed
   172   using just its standard fields, the value of \isa{more} is
   172   using just its standard fields, the value of \isa{more} is
   217 \isadelimproof
   217 \isadelimproof
   218 %
   218 %
   219 \endisadelimproof
   219 \endisadelimproof
   220 %
   220 %
   221 \begin{isamarkuptext}%
   221 \begin{isamarkuptext}%
   222 We see that the colour part attached to this \isa{point} is a
   222 \noindent
       
   223   We see that the colour part attached to this \isa{point} is a
   223   rudimentary record in its own right, namely \isa{{\isasymlparr}col\ {\isacharequal}\ Green{\isasymrparr}}.  In order to select or update \isa{col}, this fragment
   224   rudimentary record in its own right, namely \isa{{\isasymlparr}col\ {\isacharequal}\ Green{\isasymrparr}}.  In order to select or update \isa{col}, this fragment
   224   needs to be put back into the context of the parent type scheme, say
   225   needs to be put back into the context of the parent type scheme, say
   225   as \isa{more} part of another \isa{point}.
   226   as \isa{more} part of another \isa{point}.
   226 
   227 
   227   To define generic operations, we need to know a bit more about
   228   To define generic operations, we need to know a bit more about
   228   records.  Our definition of \isa{point} above has generated two
   229   records.  Our definition of \isa{point} above has generated two
   229   type abbreviations:
   230   type abbreviations:
   230 
   231 
   231   \medskip
   232   \medskip
   232   \begin{tabular}{l}
   233   \begin{tabular}{l}
   233   \isa{point}~\isa{{\isacharequal}}~\isa{point} \\
   234   \isa{point}~\isa{{\isacharequal}}~\isa{{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharcolon}\ int{\isacharcomma}\ Ycoord\ {\isacharcolon}{\isacharcolon}\ int{\isasymrparr}} \\
   234   \isa{{\isacharprime}a\ point{\isacharunderscore}scheme}~\isa{{\isacharequal}}~\isa{{\isacharprime}a\ point{\isacharunderscore}scheme} \\
   235   \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}} \\
   235   \end{tabular}
   236   \end{tabular}
   236   \medskip
   237   \medskip
   237 
   238   
       
   239 \noindent
   238   Type \isa{point} is for fixed records having exactly the two fields
   240   Type \isa{point} is for fixed records having exactly the two fields
   239   \isa{Xcoord} and~\isa{Ycoord}, while the polymorphic type \isa{{\isacharprime}a\ point{\isacharunderscore}scheme} comprises all possible extensions to those two
   241   \isa{Xcoord} and~\isa{Ycoord}, while the polymorphic type \isa{{\isacharprime}a\ point{\isacharunderscore}scheme} comprises all possible extensions to those two
   240   fields.  Note that \isa{unit\ point{\isacharunderscore}scheme} coincides with \isa{point}, and \isa{{\isasymlparr}col\ {\isacharcolon}{\isacharcolon}\ colour{\isasymrparr}\ point{\isacharunderscore}scheme} with \isa{cpoint}.
   242   fields.  Note that \isa{unit\ point{\isacharunderscore}scheme} coincides with \isa{point}, and \isa{{\isasymlparr}col\ {\isacharcolon}{\isacharcolon}\ colour{\isasymrparr}\ point{\isacharunderscore}scheme} with \isa{cpoint}.
   241 
   243 
   242   In the following example we define two operations --- methods, if we
   244   In the following example we define two operations --- methods, if we
   243   regard records as objects --- to get and set any point's \isa{Xcoord} field.%
   245   regard records as objects --- to get and set any point's \isa{Xcoord} field.%
   244 \end{isamarkuptext}%
   246 \end{isamarkuptext}%
   245 \isamarkuptrue%
   247 \isamarkuptrue%
   246 \isacommand{constdefs}\isamarkupfalse%
   248 \isacommand{definition}\isamarkupfalse%
   247 \isanewline
   249 \ getX\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ point{\isacharunderscore}scheme\ {\isasymRightarrow}\ int{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
   248 \ \ getX\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ point{\isacharunderscore}scheme\ {\isasymRightarrow}\ int{\isachardoublequoteclose}\isanewline
   250 {\isachardoublequoteopen}getX\ r\ {\isasymequiv}\ Xcoord\ r{\isachardoublequoteclose}\isanewline
   249 \ \ {\isachardoublequoteopen}getX\ r\ {\isasymequiv}\ Xcoord\ r{\isachardoublequoteclose}\isanewline
   251 \isacommand{definition}\isamarkupfalse%
   250 \ \ setX\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ point{\isacharunderscore}scheme\ {\isasymRightarrow}\ int\ {\isasymRightarrow}\ {\isacharprime}a\ point{\isacharunderscore}scheme{\isachardoublequoteclose}\isanewline
   252 \ setX\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ point{\isacharunderscore}scheme\ {\isasymRightarrow}\ int\ {\isasymRightarrow}\ {\isacharprime}a\ point{\isacharunderscore}scheme{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
   251 \ \ {\isachardoublequoteopen}setX\ r\ a\ {\isasymequiv}\ r{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharequal}\ a{\isasymrparr}{\isachardoublequoteclose}%
   253 {\isachardoublequoteopen}setX\ r\ a\ {\isasymequiv}\ r{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharequal}\ a{\isasymrparr}{\isachardoublequoteclose}%
   252 \begin{isamarkuptext}%
   254 \begin{isamarkuptext}%
   253 Here is a generic method that modifies a point, incrementing its
   255 Here is a generic method that modifies a point, incrementing its
   254   \isa{Xcoord} field.  The \isa{Ycoord} and \isa{more} fields
   256   \isa{Xcoord} field.  The \isa{Ycoord} and \isa{more} fields
   255   are copied across.  It works for any record type scheme derived from
   257   are copied across.  It works for any record type scheme derived from
   256   \isa{point} (including \isa{cpoint} etc.):%
   258   \isa{point} (including \isa{cpoint} etc.):%
   257 \end{isamarkuptext}%
   259 \end{isamarkuptext}%
   258 \isamarkuptrue%
   260 \isamarkuptrue%
   259 \isacommand{constdefs}\isamarkupfalse%
   261 \isacommand{definition}\isamarkupfalse%
   260 \isanewline
   262 \ incX\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ point{\isacharunderscore}scheme\ {\isasymRightarrow}\ {\isacharprime}a\ point{\isacharunderscore}scheme{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
   261 \ \ incX\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ point{\isacharunderscore}scheme\ {\isasymRightarrow}\ {\isacharprime}a\ point{\isacharunderscore}scheme{\isachardoublequoteclose}\isanewline
   263 {\isachardoublequoteopen}incX\ r\ {\isasymequiv}\isanewline
   262 \ \ {\isachardoublequoteopen}incX\ r\ {\isasymequiv}\isanewline
   264 \ \ {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord\ r\ {\isacharplus}\ {\isadigit{1}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord\ r{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ point{\isachardot}more\ r{\isasymrparr}{\isachardoublequoteclose}%
   263 \ \ \ \ {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord\ r\ {\isacharplus}\ {\isadigit{1}}{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord\ r{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ point{\isachardot}more\ r{\isasymrparr}{\isachardoublequoteclose}%
       
   264 \begin{isamarkuptext}%
   265 \begin{isamarkuptext}%
   265 Generic theorems can be proved about generic methods.  This trivial
   266 Generic theorems can be proved about generic methods.  This trivial
   266   lemma relates \isa{incX} to \isa{getX} and \isa{setX}:%
   267   lemma relates \isa{incX} to \isa{getX} and \isa{setX}:%
   267 \end{isamarkuptext}%
   268 \end{isamarkuptext}%
   268 \isamarkuptrue%
   269 \isamarkuptrue%
   344 \isadelimproof
   345 \isadelimproof
   345 %
   346 %
   346 \endisadelimproof
   347 \endisadelimproof
   347 %
   348 %
   348 \begin{isamarkuptext}%
   349 \begin{isamarkuptext}%
   349 We see above the syntax for iterated updates.  We could equivalently
   350 \noindent
       
   351   We see above the syntax for iterated updates.  We could equivalently
   350   have written the left-hand side as \isa{r{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharequal}\ a{\isasymrparr}{\isasymlparr}Ycoord\ {\isacharcolon}{\isacharequal}\ b{\isasymrparr}}.
   352   have written the left-hand side as \isa{r{\isasymlparr}Xcoord\ {\isacharcolon}{\isacharequal}\ a{\isasymrparr}{\isasymlparr}Ycoord\ {\isacharcolon}{\isacharequal}\ b{\isasymrparr}}.
   351 
   353 
   352   \medskip Record equality is \emph{extensional}:
   354   Record equality is \emph{extensional}:
   353   \index{extensionality!for records} a record is determined entirely
   355   \index{extensionality!for records} a record is determined entirely
   354   by the values of its fields.%
   356   by the values of its fields.%
   355 \end{isamarkuptext}%
   357 \end{isamarkuptext}%
   356 \isamarkuptrue%
   358 \isamarkuptrue%
   357 \isacommand{lemma}\isamarkupfalse%
   359 \isacommand{lemma}\isamarkupfalse%
   370 \isadelimproof
   372 \isadelimproof
   371 %
   373 %
   372 \endisadelimproof
   374 \endisadelimproof
   373 %
   375 %
   374 \begin{isamarkuptext}%
   376 \begin{isamarkuptext}%
   375 The generic version of this equality includes the pseudo-field
   377 \noindent
       
   378   The generic version of this equality includes the pseudo-field
   376   \isa{more}:%
   379   \isa{more}:%
   377 \end{isamarkuptext}%
   380 \end{isamarkuptext}%
   378 \isamarkuptrue%
   381 \isamarkuptrue%
   379 \isacommand{lemma}\isamarkupfalse%
   382 \isacommand{lemma}\isamarkupfalse%
   380 \ {\isachardoublequoteopen}r\ {\isacharequal}\ {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord\ r{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord\ r{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ point{\isachardot}more\ r{\isasymrparr}{\isachardoublequoteclose}\isanewline
   383 \ {\isachardoublequoteopen}r\ {\isacharequal}\ {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord\ r{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord\ r{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ point{\isachardot}more\ r{\isasymrparr}{\isachardoublequoteclose}\isanewline
   392 \isadelimproof
   395 \isadelimproof
   393 %
   396 %
   394 \endisadelimproof
   397 \endisadelimproof
   395 %
   398 %
   396 \begin{isamarkuptext}%
   399 \begin{isamarkuptext}%
   397 \medskip The simplifier can prove many record equalities
   400 The simplifier can prove many record equalities
   398   automatically, but general equality reasoning can be tricky.
   401   automatically, but general equality reasoning can be tricky.
   399   Consider proving this obvious fact:%
   402   Consider proving this obvious fact:%
   400 \end{isamarkuptext}%
   403 \end{isamarkuptext}%
   401 \isamarkuptrue%
   404 \isamarkuptrue%
   402 \isacommand{lemma}\isamarkupfalse%
   405 \isacommand{lemma}\isamarkupfalse%
   417 \isadelimproof
   420 \isadelimproof
   418 %
   421 %
   419 \endisadelimproof
   422 \endisadelimproof
   420 %
   423 %
   421 \begin{isamarkuptext}%
   424 \begin{isamarkuptext}%
   422 Here the simplifier can do nothing, since general record equality is
   425 \noindent
       
   426   Here the simplifier can do nothing, since general record equality is
   423   not eliminated automatically.  One way to proceed is by an explicit
   427   not eliminated automatically.  One way to proceed is by an explicit
   424   forward step that applies the selector \isa{Xcoord} to both sides
   428   forward step that applies the selector \isa{Xcoord} to both sides
   425   of the assumed record equality:%
   429   of the assumed record equality:%
   426 \end{isamarkuptext}%
   430 \end{isamarkuptext}%
   427 \isamarkuptrue%
   431 \isamarkuptrue%
   534   \item Function \cdx{truncate} takes a record (possibly an extension
   538   \item Function \cdx{truncate} takes a record (possibly an extension
   535   of the original record type) and returns a fixed record, removing
   539   of the original record type) and returns a fixed record, removing
   536   any additional fields.
   540   any additional fields.
   537 
   541 
   538   \end{itemize}
   542   \end{itemize}
   539 
       
   540   These functions provide useful abbreviations for standard
   543   These functions provide useful abbreviations for standard
   541   record expressions involving constructors and selectors.  The
   544   record expressions involving constructors and selectors.  The
   542   definitions, which are \emph{not} unfolded by default, are made
   545   definitions, which are \emph{not} unfolded by default, are made
   543   available by the collective name of \isa{defs} (\isa{point{\isachardot}defs}, \isa{cpoint{\isachardot}defs}, etc.).
   546   available by the collective name of \isa{defs} (\isa{point{\isachardot}defs}, \isa{cpoint{\isachardot}defs}, etc.).
   544 
       
   545   For example, here are the versions of those functions generated for
   547   For example, here are the versions of those functions generated for
   546   record \isa{point}.  We omit \isa{point{\isachardot}fields}, which happens to
   548   record \isa{point}.  We omit \isa{point{\isachardot}fields}, which happens to
   547   be the same as \isa{point{\isachardot}make}.
   549   be the same as \isa{point{\isachardot}make}.
   548 
   550 
   549   \begin{isabelle}%
   551   \begin{isabelle}%
   550 point{\isachardot}make\ Xcoord\ Ycoord\ {\isasymequiv}\ {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord{\isasymrparr}\isasep\isanewline%
   552 point{\isachardot}make\ Xcoord\ Ycoord\ {\isasymequiv}\ {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord{\isasymrparr}\isasep\isanewline%
   551 point{\isachardot}extend\ r\ more\ {\isasymequiv}\isanewline
   553 point{\isachardot}extend\ r\ more\ {\isasymequiv}\isanewline
   552 {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord\ r{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord\ r{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ more{\isasymrparr}\isasep\isanewline%
   554 {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord\ r{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord\ r{\isacharcomma}\ {\isasymdots}\ {\isacharequal}\ more{\isasymrparr}\isasep\isanewline%
   553 point{\isachardot}truncate\ r\ {\isasymequiv}\ {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord\ r{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord\ r{\isasymrparr}%
   555 point{\isachardot}truncate\ r\ {\isasymequiv}\ {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord\ r{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord\ r{\isasymrparr}%
   554 \end{isabelle}
   556 \end{isabelle}
   555 
       
   556   Contrast those with the corresponding functions for record \isa{cpoint}.  Observe \isa{cpoint{\isachardot}fields} in particular.
   557   Contrast those with the corresponding functions for record \isa{cpoint}.  Observe \isa{cpoint{\isachardot}fields} in particular.
   557 
       
   558   \begin{isabelle}%
   558   \begin{isabelle}%
   559 cpoint{\isachardot}make\ Xcoord\ Ycoord\ col\ {\isasymequiv}\isanewline
   559 cpoint{\isachardot}make\ Xcoord\ Ycoord\ col\ {\isasymequiv}\isanewline
   560 {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord{\isacharcomma}\ col\ {\isacharequal}\ col{\isasymrparr}\isasep\isanewline%
   560 {\isasymlparr}Xcoord\ {\isacharequal}\ Xcoord{\isacharcomma}\ Ycoord\ {\isacharequal}\ Ycoord{\isacharcomma}\ col\ {\isacharequal}\ col{\isasymrparr}\isasep\isanewline%
   561 cpoint{\isachardot}fields\ col\ {\isasymequiv}\ {\isasymlparr}col\ {\isacharequal}\ col{\isasymrparr}\isasep\isanewline%
   561 cpoint{\isachardot}fields\ col\ {\isasymequiv}\ {\isasymlparr}col\ {\isacharequal}\ col{\isasymrparr}\isasep\isanewline%
   562 cpoint{\isachardot}extend\ r\ more\ {\isasymequiv}\isanewline
   562 cpoint{\isachardot}extend\ r\ more\ {\isasymequiv}\isanewline
   569   extending an ordinary point.  Function \isa{point{\isachardot}extend} augments
   569   extending an ordinary point.  Function \isa{point{\isachardot}extend} augments
   570   \isa{pt{\isadigit{1}}} with a colour value, which is converted into an
   570   \isa{pt{\isadigit{1}}} with a colour value, which is converted into an
   571   appropriate record fragment by \isa{cpoint{\isachardot}fields}.%
   571   appropriate record fragment by \isa{cpoint{\isachardot}fields}.%
   572 \end{isamarkuptext}%
   572 \end{isamarkuptext}%
   573 \isamarkuptrue%
   573 \isamarkuptrue%
   574 \isacommand{constdefs}\isamarkupfalse%
   574 \isacommand{definition}\isamarkupfalse%
   575 \isanewline
   575 \ cpt{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ cpoint\ \isakeyword{where}\isanewline
   576 \ \ cpt{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ cpoint\isanewline
   576 {\isachardoublequoteopen}cpt{\isadigit{2}}\ {\isasymequiv}\ point{\isachardot}extend\ pt{\isadigit{1}}\ {\isacharparenleft}cpoint{\isachardot}fields\ Green{\isacharparenright}{\isachardoublequoteclose}%
   577 \ \ {\isachardoublequoteopen}cpt{\isadigit{2}}\ {\isasymequiv}\ point{\isachardot}extend\ pt{\isadigit{1}}\ {\isacharparenleft}cpoint{\isachardot}fields\ Green{\isacharparenright}{\isachardoublequoteclose}%
       
   578 \begin{isamarkuptext}%
   577 \begin{isamarkuptext}%
   579 The coloured points \isa{cpt{\isadigit{1}}} and \isa{cpt{\isadigit{2}}} are equal.  The
   578 The coloured points \isa{cpt{\isadigit{1}}} and \isa{cpt{\isadigit{2}}} are equal.  The
   580   proof is trivial, by unfolding all the definitions.  We deliberately
   579   proof is trivial, by unfolding all the definitions.  We deliberately
   581   omit the definition of~\isa{pt{\isadigit{1}}} in order to reveal the underlying
   580   omit the definition of~\isa{pt{\isadigit{1}}} in order to reveal the underlying
   582   comparison on type \isa{point}.%
   581   comparison on type \isa{point}.%