doc-src/TutorialI/Types/document/Overloading.tex
changeset 40406 313a24b66a8d
parent 38325 6daf896bca5e
equal deleted inserted replaced
40405:42671298f037 40406:313a24b66a8d
    24 \isamarkupsubsubsection{Overloading%
    24 \isamarkupsubsubsection{Overloading%
    25 }
    25 }
    26 \isamarkuptrue%
    26 \isamarkuptrue%
    27 %
    27 %
    28 \begin{isamarkuptext}%
    28 \begin{isamarkuptext}%
    29 We can introduce a binary infix addition operator \isa{{\isasymotimes}}
    29 We can introduce a binary infix addition operator \isa{{\isaliteral{5C3C6F74696D65733E}{\isasymotimes}}}
    30 for arbitrary types by means of a type class:%
    30 for arbitrary types by means of a type class:%
    31 \end{isamarkuptext}%
    31 \end{isamarkuptext}%
    32 \isamarkuptrue%
    32 \isamarkuptrue%
    33 \isacommand{class}\isamarkupfalse%
    33 \isacommand{class}\isamarkupfalse%
    34 \ plus\ {\isacharequal}\isanewline
    34 \ plus\ {\isaliteral{3D}{\isacharequal}}\isanewline
    35 \ \ \isakeyword{fixes}\ plus\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ {\isacharparenleft}\isakeyword{infixl}\ {\isachardoublequoteopen}{\isasymoplus}{\isachardoublequoteclose}\ {\isadigit{7}}{\isadigit{0}}{\isacharparenright}%
    35 \ \ \isakeyword{fixes}\ plus\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{28}{\isacharparenleft}}\isakeyword{infixl}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6F706C75733E}{\isasymoplus}}{\isaliteral{22}{\isachardoublequoteclose}}\ {\isadigit{7}}{\isadigit{0}}{\isaliteral{29}{\isacharparenright}}%
    36 \begin{isamarkuptext}%
    36 \begin{isamarkuptext}%
    37 \noindent This introduces a new class \isa{plus},
    37 \noindent This introduces a new class \isa{plus},
    38 along with a constant \isa{plus} with nice infix syntax.
    38 along with a constant \isa{plus} with nice infix syntax.
    39 \isa{plus} is also named \emph{class operation}.  The type
    39 \isa{plus} is also named \emph{class operation}.  The type
    40 of \isa{plus} carries a class constraint \isa{{\isachardoublequote}{\isacharprime}a\ {\isacharcolon}{\isacharcolon}\ plus{\isachardoublequote}} on its type variable, meaning that only types of class
    40 of \isa{plus} carries a class constraint \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ plus{\isaliteral{22}{\isachardoublequote}}} on its type variable, meaning that only types of class
    41 \isa{plus} can be instantiated for \isa{{\isachardoublequote}{\isacharprime}a{\isachardoublequote}}.
    41 \isa{plus} can be instantiated for \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{22}{\isachardoublequote}}}.
    42 To breathe life into \isa{plus} we need to declare a type
    42 To breathe life into \isa{plus} we need to declare a type
    43 to be an \bfindex{instance} of \isa{plus}:%
    43 to be an \bfindex{instance} of \isa{plus}:%
    44 \end{isamarkuptext}%
    44 \end{isamarkuptext}%
    45 \isamarkuptrue%
    45 \isamarkuptrue%
    46 \isacommand{instantiation}\isamarkupfalse%
    46 \isacommand{instantiation}\isamarkupfalse%
    47 \ nat\ {\isacharcolon}{\isacharcolon}\ plus\isanewline
    47 \ nat\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ plus\isanewline
    48 \isakeyword{begin}%
    48 \isakeyword{begin}%
    49 \begin{isamarkuptext}%
    49 \begin{isamarkuptext}%
    50 \noindent Command \isacommand{instantiation} opens a local
    50 \noindent Command \isacommand{instantiation} opens a local
    51 theory context.  Here we can now instantiate \isa{plus} on
    51 theory context.  Here we can now instantiate \isa{plus} on
    52 \isa{nat}:%
    52 \isa{nat}:%
    53 \end{isamarkuptext}%
    53 \end{isamarkuptext}%
    54 \isamarkuptrue%
    54 \isamarkuptrue%
    55 \isacommand{primrec}\isamarkupfalse%
    55 \isacommand{primrec}\isamarkupfalse%
    56 \ plus{\isacharunderscore}nat\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
    56 \ plus{\isaliteral{5F}{\isacharunderscore}}nat\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline
    57 \ \ \ \ {\isachardoublequoteopen}{\isacharparenleft}{\isadigit{0}}{\isacharcolon}{\isacharcolon}nat{\isacharparenright}\ {\isasymoplus}\ n\ {\isacharequal}\ n{\isachardoublequoteclose}\isanewline
    57 \ \ \ \ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isadigit{0}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}nat{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ n\ {\isaliteral{3D}{\isacharequal}}\ n{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
    58 \ \ {\isacharbar}\ {\isachardoublequoteopen}Suc\ m\ {\isasymoplus}\ n\ {\isacharequal}\ Suc\ {\isacharparenleft}m\ {\isasymoplus}\ n{\isacharparenright}{\isachardoublequoteclose}%
    58 \ \ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}Suc\ m\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ n\ {\isaliteral{3D}{\isacharequal}}\ Suc\ {\isaliteral{28}{\isacharparenleft}}m\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
    59 \begin{isamarkuptext}%
    59 \begin{isamarkuptext}%
    60 \noindent Note that the name \isa{plus} carries a
    60 \noindent Note that the name \isa{plus} carries a
    61 suffix \isa{{\isacharunderscore}nat}; by default, the local name of a class operation
    61 suffix \isa{{\isaliteral{5F}{\isacharunderscore}}nat}; by default, the local name of a class operation
    62 \isa{f} to be instantiated on type constructor \isa{{\isasymkappa}} is mangled
    62 \isa{f} to be instantiated on type constructor \isa{{\isaliteral{5C3C6B617070613E}{\isasymkappa}}} is mangled
    63 as \isa{f{\isacharunderscore}{\isasymkappa}}.  In case of uncertainty, these names may be inspected
    63 as \isa{f{\isaliteral{5F}{\isacharunderscore}}{\isaliteral{5C3C6B617070613E}{\isasymkappa}}}.  In case of uncertainty, these names may be inspected
    64 using the \hyperlink{command.print-context}{\mbox{\isa{\isacommand{print{\isacharunderscore}context}}}} command or the corresponding
    64 using the \hyperlink{command.print-context}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}context}}}} command or the corresponding
    65 ProofGeneral button.
    65 ProofGeneral button.
    66 
    66 
    67 Although class \isa{plus} has no axioms, the instantiation must be
    67 Although class \isa{plus} has no axioms, the instantiation must be
    68 formally concluded by a (trivial) instantiation proof ``..'':%
    68 formally concluded by a (trivial) instantiation proof ``..'':%
    69 \end{isamarkuptext}%
    69 \end{isamarkuptext}%
    73 \isadelimproof
    73 \isadelimproof
    74 \ %
    74 \ %
    75 \endisadelimproof
    75 \endisadelimproof
    76 %
    76 %
    77 \isatagproof
    77 \isatagproof
    78 \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
    78 \isacommand{{\isaliteral{2E}{\isachardot}}{\isaliteral{2E}{\isachardot}}}\isamarkupfalse%
    79 %
    79 %
    80 \endisatagproof
    80 \endisatagproof
    81 {\isafoldproof}%
    81 {\isafoldproof}%
    82 %
    82 %
    83 \isadelimproof
    83 \isadelimproof
    92 \end{isamarkuptext}%
    92 \end{isamarkuptext}%
    93 \isamarkuptrue%
    93 \isamarkuptrue%
    94 \isacommand{end}\isamarkupfalse%
    94 \isacommand{end}\isamarkupfalse%
    95 %
    95 %
    96 \begin{isamarkuptext}%
    96 \begin{isamarkuptext}%
    97 \noindent From now on, terms like \isa{Suc\ {\isacharparenleft}m\ {\isasymoplus}\ {\isadigit{2}}{\isacharparenright}} are
    97 \noindent From now on, terms like \isa{Suc\ {\isaliteral{28}{\isacharparenleft}}m\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isadigit{2}}{\isaliteral{29}{\isacharparenright}}} are
    98 legal.%
    98 legal.%
    99 \end{isamarkuptext}%
    99 \end{isamarkuptext}%
   100 \isamarkuptrue%
   100 \isamarkuptrue%
   101 \isacommand{instantiation}\isamarkupfalse%
   101 \isacommand{instantiation}\isamarkupfalse%
   102 \ prod\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}plus{\isacharcomma}\ plus{\isacharparenright}\ plus\isanewline
   102 \ prod\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{28}{\isacharparenleft}}plus{\isaliteral{2C}{\isacharcomma}}\ plus{\isaliteral{29}{\isacharparenright}}\ plus\isanewline
   103 \isakeyword{begin}%
   103 \isakeyword{begin}%
   104 \begin{isamarkuptext}%
   104 \begin{isamarkuptext}%
   105 \noindent Here we instantiate the product type \isa{prod} to
   105 \noindent Here we instantiate the product type \isa{prod} to
   106 class \isa{plus}, given that its type arguments are of
   106 class \isa{plus}, given that its type arguments are of
   107 class \isa{plus}:%
   107 class \isa{plus}:%
   108 \end{isamarkuptext}%
   108 \end{isamarkuptext}%
   109 \isamarkuptrue%
   109 \isamarkuptrue%
   110 \isacommand{fun}\isamarkupfalse%
   110 \isacommand{fun}\isamarkupfalse%
   111 \ plus{\isacharunderscore}prod\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymtimes}\ {\isacharprime}b\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}b\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}b{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
   111 \ plus{\isaliteral{5F}{\isacharunderscore}}prod\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C74696D65733E}{\isasymtimes}}\ {\isaliteral{27}{\isacharprime}}b\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C74696D65733E}{\isasymtimes}}\ {\isaliteral{27}{\isacharprime}}b\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C74696D65733E}{\isasymtimes}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\isanewline
   112 \ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}\ {\isasymoplus}\ {\isacharparenleft}w{\isacharcomma}\ z{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}x\ {\isasymoplus}\ w{\isacharcomma}\ y\ {\isasymoplus}\ z{\isacharparenright}{\isachardoublequoteclose}%
   112 \ \ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ {\isaliteral{28}{\isacharparenleft}}w{\isaliteral{2C}{\isacharcomma}}\ z{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ w{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{5C3C6F706C75733E}{\isasymoplus}}\ z{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
   113 \begin{isamarkuptext}%
   113 \begin{isamarkuptext}%
   114 \noindent Obviously, overloaded specifications may include
   114 \noindent Obviously, overloaded specifications may include
   115 recursion over the syntactic structure of types.%
   115 recursion over the syntactic structure of types.%
   116 \end{isamarkuptext}%
   116 \end{isamarkuptext}%
   117 \isamarkuptrue%
   117 \isamarkuptrue%
   120 \isadelimproof
   120 \isadelimproof
   121 \ %
   121 \ %
   122 \endisadelimproof
   122 \endisadelimproof
   123 %
   123 %
   124 \isatagproof
   124 \isatagproof
   125 \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
   125 \isacommand{{\isaliteral{2E}{\isachardot}}{\isaliteral{2E}{\isachardot}}}\isamarkupfalse%
   126 %
   126 %
   127 \endisatagproof
   127 \endisatagproof
   128 {\isafoldproof}%
   128 {\isafoldproof}%
   129 %
   129 %
   130 \isadelimproof
   130 \isadelimproof