doc-src/TutorialI/document/Axioms.tex
author ballarin
Wed, 15 Aug 2012 23:06:17 +0200
changeset 48824 45d0e40b07af
parent 48519 5deda0549f97
permissions -rw-r--r--
Clarification: free variables allowed in interpreted locale instances.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     1
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     2
\begin{isabellebody}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     3
\def\isabellecontext{Axioms}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     4
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     5
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     6
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     7
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     8
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     9
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    10
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    11
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    12
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    13
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    14
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    15
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    16
\endisadelimtheory
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    17
%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    18
\isamarkupsubsection{Axioms%
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    19
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    20
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    21
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    22
\begin{isamarkuptext}%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    23
Attaching axioms to our classes lets us reason on the level of
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    24
classes.  The results will be applicable to all types in a class, just
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    25
as in axiomatic mathematics.
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    26
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    27
\begin{warn}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    28
Proofs in this section use structured \emph{Isar} proofs, which are not
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    29
covered in this tutorial; but see \cite{Nipkow-TYPES02}.%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    30
\end{warn}%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    31
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    32
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    33
%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    34
\isamarkupsubsubsection{Semigroups%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    35
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    36
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    37
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    38
\begin{isamarkuptext}%
31682
358cdcdf56d2 corrected some issues
haftmann
parents: 31678
diff changeset
    39
We specify \emph{semigroups} as subclass of \isa{plus}:%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    40
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    41
\isamarkuptrue%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    42
\isacommand{class}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
    43
\ semigroup\ {\isaliteral{3D}{\isacharequal}}\ plus\ {\isaliteral{2B}{\isacharplus}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
    44
\ \ \isakeyword{assumes}\ assoc{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z\ {\isaliteral{3D}{\isacharequal}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{28}{\isacharparenleft}}y\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    45
\begin{isamarkuptext}%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    46
\noindent This \hyperlink{command.class}{\mbox{\isa{\isacommand{class}}}} specification requires that
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
    47
all instances of \isa{semigroup} obey \hyperlink{fact.assoc:}{\mbox{\isa{assoc{\isaliteral{3A}{\isacharcolon}}}}}~\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C416E643E}{\isasymAnd}}x\ y\ z\ {\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}\ {\isaliteral{27}{\isacharprime}}a{\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}semigroup{\isaliteral{2E}{\isachardot}}\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z\ {\isaliteral{3D}{\isacharequal}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{28}{\isacharparenleft}}y\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}.
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    48
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    49
We can use this class axiom to derive further abstract theorems
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    50
relative to class \isa{semigroup}:%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    51
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    52
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    53
\isacommand{lemma}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
    54
\ assoc{\isaliteral{5F}{\isacharunderscore}}left{\isaliteral{3A}{\isacharcolon}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
    55
\ \ \isakeyword{fixes}\ x\ y\ z\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}semigroup{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
    56
\ \ \isakeyword{shows}\ {\isaliteral{22}{\isachardoublequoteopen}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{28}{\isacharparenleft}}y\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    57
%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    58
\isadelimproof
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    59
\ \ %
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    60
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    61
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    62
\isatagproof
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    63
\isacommand{using}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    64
\ assoc\ \isacommand{by}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
    65
\ {\isaliteral{28}{\isacharparenleft}}rule\ sym{\isaliteral{29}{\isacharparenright}}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    66
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    67
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    68
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    69
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    70
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    71
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    72
%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    73
\begin{isamarkuptext}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
    74
\noindent The \isa{semigroup} constraint on type \isa{{\isaliteral{27}{\isacharprime}}a} restricts instantiations of \isa{{\isaliteral{27}{\isacharprime}}a} to types of class
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    75
\isa{semigroup} and during the proof enables us to use the fact
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    76
\hyperlink{fact.assoc}{\mbox{\isa{assoc}}} whose type parameter is itself constrained to class
31682
358cdcdf56d2 corrected some issues
haftmann
parents: 31678
diff changeset
    77
\isa{semigroup}.  The main advantage of classes is that theorems
358cdcdf56d2 corrected some issues
haftmann
parents: 31678
diff changeset
    78
can be proved in the abstract and freely reused for each instance.
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    79
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    80
On instantiation, we have to give a proof that the given operations
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    81
obey the class axioms:%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    82
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    83
\isamarkuptrue%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    84
\isacommand{instantiation}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
    85
\ nat\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ semigroup\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    86
\isakeyword{begin}\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    87
\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    88
\isacommand{instance}\isamarkupfalse%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    89
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    90
\isadelimproof
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    91
\ %
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    92
\endisadelimproof
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    93
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    94
\isatagproof
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    95
\isacommand{proof}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    96
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    97
\begin{isamarkuptxt}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
    98
\noindent The proof opens with a default proof step, which for
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
    99
instance judgements invokes method \hyperlink{method.intro-classes}{\mbox{\isa{intro{\isaliteral{5F}{\isacharunderscore}}classes}}}.%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   100
\end{isamarkuptxt}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   101
\isamarkuptrue%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   102
\ \ \isacommand{fix}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   103
\ m\ n\ q\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ nat\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   104
\ \ \isacommand{show}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   105
\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}m\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ q\ {\isaliteral{3D}{\isacharequal}}\ m\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{28}{\isacharparenleft}}n\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ q{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   106
\ \ \ \ \isacommand{by}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   107
\ {\isaliteral{28}{\isacharparenleft}}induct\ m{\isaliteral{29}{\isacharparenright}}\ simp{\isaliteral{5F}{\isacharunderscore}}all\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   108
\isacommand{qed}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   109
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   110
\endisatagproof
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   111
{\isafoldproof}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   112
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   113
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   114
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   115
\endisadelimproof
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   116
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   117
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   118
\isacommand{end}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   119
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   120
\begin{isamarkuptext}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   121
\noindent Again, the interesting things enter the stage with
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   122
parametric types:%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   123
\end{isamarkuptext}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   124
\isamarkuptrue%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   125
\isacommand{instantiation}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   126
\ prod\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{28}{\isacharparenleft}}semigroup{\isaliteral{2C}{\isacharcomma}}\ semigroup{\isaliteral{29}{\isacharparenright}}\ semigroup\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   127
\isakeyword{begin}\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   128
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   129
\isacommand{instance}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   130
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   131
\isadelimproof
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   132
\ %
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   133
\endisadelimproof
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   134
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   135
\isatagproof
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   136
\isacommand{proof}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   137
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   138
\ \ \isacommand{fix}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   139
\ p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}\ p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{2}}\ p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{3}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}semigroup\ {\isaliteral{5C3C74696D65733E}{\isasymtimes}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}semigroup{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   140
\ \ \isacommand{show}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   141
\ {\isaliteral{22}{\isachardoublequoteopen}}p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{2}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{3}}\ {\isaliteral{3D}{\isacharequal}}\ p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{28}{\isacharparenleft}}p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{2}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{3}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   142
\ \ \ \ \isacommand{by}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   143
\ {\isaliteral{28}{\isacharparenleft}}cases\ p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ cases\ p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{2}}{\isaliteral{2C}{\isacharcomma}}\ cases\ p\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{3}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ assoc{\isaliteral{29}{\isacharparenright}}%
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   144
\begin{isamarkuptxt}%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   145
\noindent Associativity of product semigroups is established
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   146
using the hypothetical associativity \hyperlink{fact.assoc}{\mbox{\isa{assoc}}} of the type
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   147
components, which holds due to the \isa{semigroup} constraints
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   148
imposed on the type components by the \hyperlink{command.instance}{\mbox{\isa{\isacommand{instance}}}} proposition.
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   149
Indeed, this pattern often occurs with parametric types and type
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   150
classes.%
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   151
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   152
\isamarkuptrue%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   153
\isacommand{qed}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   154
%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   155
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   156
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   157
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   158
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   159
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   160
\endisadelimproof
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   161
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   162
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   163
\isacommand{end}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   164
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   165
\isamarkupsubsubsection{Monoids%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   166
}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   167
\isamarkuptrue%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   168
%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   169
\begin{isamarkuptext}%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   170
We define a subclass \isa{monoidl} (a semigroup with a
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   171
left-hand neutral) by extending \isa{semigroup} with one additional
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   172
parameter \isa{neutral} together with its property:%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   173
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   174
\isamarkuptrue%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   175
\isacommand{class}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   176
\ monoidl\ {\isaliteral{3D}{\isacharequal}}\ semigroup\ {\isaliteral{2B}{\isacharplus}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   177
\ \ \isakeyword{fixes}\ neutral\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C7A65726F3E}{\isasymzero}}{\isaliteral{22}{\isachardoublequoteclose}}{\isaliteral{29}{\isacharparenright}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   178
\ \ \isakeyword{assumes}\ neutl{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C7A65726F3E}{\isasymzero}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ x\ {\isaliteral{3D}{\isacharequal}}\ x{\isaliteral{22}{\isachardoublequoteclose}}%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   179
\begin{isamarkuptext}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   180
\noindent Again, we prove some instances, by providing
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   181
suitable parameter definitions and proofs for the additional
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   182
specifications.%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   183
\end{isamarkuptext}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   184
\isamarkuptrue%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   185
\isacommand{instantiation}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   186
\ nat\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ monoidl\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   187
\isakeyword{begin}\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   188
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   189
\isacommand{definition}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   190
\isanewline
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   191
\ \ neutral{\isaliteral{5F}{\isacharunderscore}}nat{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C7A65726F3E}{\isasymzero}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}{\isadigit{0}}{\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}nat{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   192
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   193
\isacommand{instance}\isamarkupfalse%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   194
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   195
\isadelimproof
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   196
\ %
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   197
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   198
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   199
\isatagproof
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   200
\isacommand{proof}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   201
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   202
\ \ \isacommand{fix}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   203
\ n\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ nat\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   204
\ \ \isacommand{show}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   205
\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C7A65726F3E}{\isasymzero}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ n\ {\isaliteral{3D}{\isacharequal}}\ n{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   206
\ \ \ \ \isacommand{unfolding}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   207
\ neutral{\isaliteral{5F}{\isacharunderscore}}nat{\isaliteral{5F}{\isacharunderscore}}def\ \isacommand{by}\isamarkupfalse%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   208
\ simp\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   209
\isacommand{qed}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   210
%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   211
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   212
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   213
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   214
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   215
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   216
\endisadelimproof
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   217
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   218
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   219
\isacommand{end}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   220
%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   221
\begin{isamarkuptext}%
31682
358cdcdf56d2 corrected some issues
haftmann
parents: 31678
diff changeset
   222
\noindent In contrast to the examples above, we here have both
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   223
specification of class operations and a non-trivial instance proof.
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   224
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   225
This covers products as well:%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   226
\end{isamarkuptext}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   227
\isamarkuptrue%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   228
\isacommand{instantiation}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   229
\ prod\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{28}{\isacharparenleft}}monoidl{\isaliteral{2C}{\isacharcomma}}\ monoidl{\isaliteral{29}{\isacharparenright}}\ monoidl\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   230
\isakeyword{begin}\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   231
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   232
\isacommand{definition}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   233
\isanewline
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   234
\ \ neutral{\isaliteral{5F}{\isacharunderscore}}prod{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C7A65726F3E}{\isasymzero}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C7A65726F3E}{\isasymzero}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C7A65726F3E}{\isasymzero}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   235
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   236
\isacommand{instance}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   237
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   238
\isadelimproof
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   239
\ %
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   240
\endisadelimproof
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   241
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   242
\isatagproof
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   243
\isacommand{proof}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   244
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   245
\ \ \isacommand{fix}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   246
\ p\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}monoidl\ {\isaliteral{5C3C74696D65733E}{\isasymtimes}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}monoidl{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   247
\ \ \isacommand{show}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   248
\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C7A65726F3E}{\isasymzero}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ p\ {\isaliteral{3D}{\isacharequal}}\ p{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   249
\ \ \ \ \isacommand{by}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   250
\ {\isaliteral{28}{\isacharparenleft}}cases\ p{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ neutral{\isaliteral{5F}{\isacharunderscore}}prod{\isaliteral{5F}{\isacharunderscore}}def\ neutl{\isaliteral{29}{\isacharparenright}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   251
\isacommand{qed}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   252
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   253
\endisatagproof
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   254
{\isafoldproof}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   255
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   256
\isadelimproof
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   257
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   258
\endisadelimproof
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   259
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   260
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   261
\isacommand{end}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   262
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   263
\begin{isamarkuptext}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   264
\noindent Fully-fledged monoids are modelled by another
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   265
subclass which does not add new parameters but tightens the
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   266
specification:%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   267
\end{isamarkuptext}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   268
\isamarkuptrue%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   269
\isacommand{class}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   270
\ monoid\ {\isaliteral{3D}{\isacharequal}}\ monoidl\ {\isaliteral{2B}{\isacharplus}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   271
\ \ \isakeyword{assumes}\ neutr{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{5C3C7A65726F3E}{\isasymzero}}\ {\isaliteral{3D}{\isacharequal}}\ x{\isaliteral{22}{\isachardoublequoteclose}}%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   272
\begin{isamarkuptext}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   273
\noindent Corresponding instances for \isa{nat} and products
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   274
are left as an exercise to the reader.%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   275
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   276
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   277
%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   278
\isamarkupsubsubsection{Groups%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   279
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   280
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   281
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   282
\begin{isamarkuptext}%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   283
\noindent To finish our small algebra example, we add a \isa{group} class:%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   284
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   285
\isamarkuptrue%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   286
\isacommand{class}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   287
\ group\ {\isaliteral{3D}{\isacharequal}}\ monoidl\ {\isaliteral{2B}{\isacharplus}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   288
\ \ \isakeyword{fixes}\ inv\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6469763E}{\isasymdiv}}\ {\isaliteral{5F}{\isacharunderscore}}{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isadigit{8}}{\isadigit{1}}{\isaliteral{5D}{\isacharbrackright}}\ {\isadigit{8}}{\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   289
\ \ \isakeyword{assumes}\ invl{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6469763E}{\isasymdiv}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ x\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5C3C7A65726F3E}{\isasymzero}}{\isaliteral{22}{\isachardoublequoteclose}}%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   290
\begin{isamarkuptext}%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   291
\noindent We continue with a further example for abstract
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   292
proofs relative to type classes:%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   293
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   294
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   295
\isacommand{lemma}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   296
\ left{\isaliteral{5F}{\isacharunderscore}}cancel{\isaliteral{3A}{\isacharcolon}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   297
\ \ \isakeyword{fixes}\ x\ y\ z\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}group{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   298
\ \ \isakeyword{shows}\ {\isaliteral{22}{\isachardoublequoteopen}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ y\ {\isaliteral{3D}{\isacharequal}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z\ {\isaliteral{5C3C6C6F6E676C65667472696768746172726F773E}{\isasymlongleftrightarrow}}\ y\ {\isaliteral{3D}{\isacharequal}}\ z{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   299
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   300
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   301
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   302
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   303
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   304
\isatagproof
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   305
\isacommand{proof}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   306
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   307
\ \ \isacommand{assume}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   308
\ {\isaliteral{22}{\isachardoublequoteopen}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ y\ {\isaliteral{3D}{\isacharequal}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   309
\ \ \isacommand{then}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   310
\ \isacommand{have}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   311
\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6469763E}{\isasymdiv}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5C3C6469763E}{\isasymdiv}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\ \isacommand{by}\isamarkupfalse%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   312
\ simp\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   313
\ \ \isacommand{then}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   314
\ \isacommand{have}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   315
\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6469763E}{\isasymdiv}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ x{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ y\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6469763E}{\isasymdiv}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ x{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z{\isaliteral{22}{\isachardoublequoteclose}}\ \isacommand{by}\isamarkupfalse%
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   316
\ {\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ assoc{\isaliteral{29}{\isacharparenright}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   317
\ \ \isacommand{then}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   318
\ \isacommand{show}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   319
\ {\isaliteral{22}{\isachardoublequoteopen}}y\ {\isaliteral{3D}{\isacharequal}}\ z{\isaliteral{22}{\isachardoublequoteclose}}\ \isacommand{by}\isamarkupfalse%
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   320
\ {\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ invl\ neutl{\isaliteral{29}{\isacharparenright}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   321
\isacommand{next}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   322
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   323
\ \ \isacommand{assume}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   324
\ {\isaliteral{22}{\isachardoublequoteopen}}y\ {\isaliteral{3D}{\isacharequal}}\ z{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   325
\ \ \isacommand{then}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   326
\ \isacommand{show}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   327
\ {\isaliteral{22}{\isachardoublequoteopen}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ y\ {\isaliteral{3D}{\isacharequal}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z{\isaliteral{22}{\isachardoublequoteclose}}\ \isacommand{by}\isamarkupfalse%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   328
\ simp\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   329
\isacommand{qed}\isamarkupfalse%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   330
%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   331
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   332
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   333
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   334
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   335
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   336
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   337
%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   338
\begin{isamarkuptext}%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   339
\noindent Any \isa{group} is also a \isa{monoid}; this
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   340
can be made explicit by claiming an additional subclass relation,
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   341
together with a proof of the logical difference:%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   342
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   343
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   344
\isacommand{instance}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   345
\ group\ {\isaliteral{5C3C73756273657465713E}{\isasymsubseteq}}\ monoid\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   346
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   347
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   348
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   349
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   350
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   351
\isatagproof
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   352
\isacommand{proof}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   353
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   354
\ \ \isacommand{fix}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   355
\ x\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   356
\ \ \isacommand{from}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   357
\ invl\ \isacommand{have}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   358
\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6469763E}{\isasymdiv}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ x\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5C3C7A65726F3E}{\isasymzero}}{\isaliteral{22}{\isachardoublequoteclose}}\ \isacommand{{\isaliteral{2E}{\isachardot}}}\isamarkupfalse%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   359
\isanewline
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   360
\ \ \isacommand{then}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   361
\ \isacommand{have}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   362
\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6469763E}{\isasymdiv}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{5C3C7A65726F3E}{\isasymzero}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5C3C6469763E}{\isasymdiv}}\ x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ x{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   363
\ \ \ \ \isacommand{by}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   364
\ {\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ neutl\ invl\ assoc\ {\isaliteral{5B}{\isacharbrackleft}}symmetric{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   365
\ \ \isacommand{then}\isamarkupfalse%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   366
\ \isacommand{show}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   367
\ {\isaliteral{22}{\isachardoublequoteopen}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{5C3C7A65726F3E}{\isasymzero}}\ {\isaliteral{3D}{\isacharequal}}\ x{\isaliteral{22}{\isachardoublequoteclose}}\ \isacommand{by}\isamarkupfalse%
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   368
\ {\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ left{\isaliteral{5F}{\isacharunderscore}}cancel{\isaliteral{29}{\isacharparenright}}\isanewline
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   369
\isacommand{qed}\isamarkupfalse%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   370
%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   371
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   372
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   373
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   374
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   375
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   376
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   377
%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   378
\begin{isamarkuptext}%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   379
\noindent The proof result is propagated to the type system,
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   380
making \isa{group} an instance of \isa{monoid} by adding an
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   381
additional edge to the graph of subclass relation; see also
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   382
Figure~\ref{fig:subclass}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   383
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   384
\begin{figure}[htbp]
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   385
 \begin{center}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   386
   \small
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   387
   \unitlength 0.6mm
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   388
   \begin{picture}(40,60)(0,0)
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   389
     \put(20,60){\makebox(0,0){\isa{semigroup}}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   390
     \put(20,40){\makebox(0,0){\isa{monoidl}}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   391
     \put(00,20){\makebox(0,0){\isa{monoid}}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   392
     \put(40,00){\makebox(0,0){\isa{group}}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   393
     \put(20,55){\vector(0,-1){10}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   394
     \put(15,35){\vector(-1,-1){10}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   395
     \put(25,35){\vector(1,-3){10}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   396
   \end{picture}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   397
   \hspace{8em}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   398
   \begin{picture}(40,60)(0,0)
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   399
     \put(20,60){\makebox(0,0){\isa{semigroup}}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   400
     \put(20,40){\makebox(0,0){\isa{monoidl}}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   401
     \put(00,20){\makebox(0,0){\isa{monoid}}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   402
     \put(40,00){\makebox(0,0){\isa{group}}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   403
     \put(20,55){\vector(0,-1){10}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   404
     \put(15,35){\vector(-1,-1){10}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   405
     \put(05,15){\vector(3,-1){30}}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   406
   \end{picture}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   407
   \caption{Subclass relationship of monoids and groups:
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   408
      before and after establishing the relationship
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   409
      \isa{group\ {\isaliteral{5C3C73756273657465713E}{\isasymsubseteq}}\ monoid};  transitive edges are left out.}
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   410
   \label{fig:subclass}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   411
 \end{center}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   412
\end{figure}%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   413
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   414
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   415
%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   416
\isamarkupsubsubsection{Inconsistencies%
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   417
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   418
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   419
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   420
\begin{isamarkuptext}%
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   421
The reader may be wondering what happens if we attach an
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   422
inconsistent set of axioms to a class. So far we have always avoided
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   423
to add new axioms to HOL for fear of inconsistencies and suddenly it
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   424
seems that we are throwing all caution to the wind. So why is there no
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   425
problem?
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   426
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   427
The point is that by construction, all type variables in the axioms of
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   428
a \isacommand{class} are automatically constrained with the class
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   429
being defined (as shown for axiom \isa{refl} above). These
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   430
constraints are always carried around and Isabelle takes care that
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   431
they are never lost, unless the type variable is instantiated with a
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   432
type that has been shown to belong to that class. Thus you may be able
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   433
to prove \isa{False} from your axioms, but Isabelle will remind you
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   434
that this theorem has the hidden hypothesis that the class is
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   435
non-empty.
12332
aea72a834c85 *** empty log message ***
nipkow
parents: 11866
diff changeset
   436
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   437
Even if each individual class is consistent, intersections of
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   438
(unrelated) classes readily become inconsistent in practice. Now we
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   439
know this need not worry us.%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   440
\end{isamarkuptext}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   441
\isamarkuptrue%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   442
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   443
\isamarkupsubsubsection{Syntactic Classes and Predefined Overloading%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   444
}
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   445
\isamarkuptrue%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   446
%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   447
\begin{isamarkuptext}%
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   448
In our algebra example, we have started with a \emph{syntactic
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   449
class} \isa{plus} which only specifies operations but no axioms; it
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   450
would have been also possible to start immediately with class \isa{semigroup}, specifying the \isa{{\isaliteral{5C3C6F706C75733E}{\isasymoplus}}} operation and associativity at
31678
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   451
the same time.
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   452
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   453
Which approach is more appropriate depends.  Usually it is more
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   454
convenient to introduce operations and axioms in the same class: then
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   455
the type checker will automatically insert the corresponding class
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   456
constraints whenever the operations occur, reducing the need of manual
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   457
annotations.  However, when operations are decorated with popular
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   458
syntax, syntactic classes can be an option to re-use the syntax in
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   459
different contexts; this is indeed the way most overloaded constants
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   460
in HOL are introduced, of which the most important are listed in
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   461
Table~\ref{tab:overloading} in the appendix.  Section
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   462
\ref{sec:numeric-classes} covers a range of corresponding classes
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   463
\emph{with} axioms.
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   464
752f23a37240 reworked section on type classes
haftmann
parents: 27027
diff changeset
   465
Further note that classes may contain axioms but \emph{no} operations.
46525
af3df09590f9 updated generated documents
haftmann
parents: 40406
diff changeset
   466
An example is class \isa{finite} from theory \isa{Finite{\isaliteral{5F}{\isacharunderscore}}Set}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 38325
diff changeset
   467
which specifies a type to be finite: \isa{{\isaliteral{22}{\isachardoublequote}}finite\ {\isaliteral{28}{\isacharparenleft}}UNIV\ {\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}\ {\isaliteral{27}{\isacharprime}}a{\isaliteral{5C3C436F6C6F6E3E}{\isasymColon}}finite\ set{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}.%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   468
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   469
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   470
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   471
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   472
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   473
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   474
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   475
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   476
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   477
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   478
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   479
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   480
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   481
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   482
\endisadelimtheory
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   483
\end{isabellebody}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   484
%%% Local Variables:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   485
%%% mode: latex
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   486
%%% TeX-master: "root"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   487
%%% End: