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}% |
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% |
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}.% |