doc-src/TutorialI/Types/document/Records.tex
changeset 12656 efcf26bb1361
parent 12634 3baa6143a9c4
child 12658 3939e7dea202
equal deleted inserted replaced
12655:b8c130dc46be 12656:efcf26bb1361
    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 }