src/Doc/Typeclass_Hierarchy/Typeclass_Hierarchy.thy
author haftmann
Mon, 18 Apr 2016 20:56:18 +0200
changeset 63026 9a9c2d846d4a
child 63555 d00db72d8697
permissions -rw-r--r--
fragment of a HOL type class primer
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
63026
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
     1
theory Typeclass_Hierarchy
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
     2
imports Setup
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
     3
begin
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
     4
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
     5
section \<open>Introduction\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
     6
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
     7
text \<open>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
     8
  The {Isabelle/HOL} type-class hierarchy entered the stage
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
     9
  in a quite ancient era -- first related \emph{NEWS} entries date
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    10
  back to release {Isabelle99-1}.  Since then, there have been
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    11
  ongoing modifications and additions, leading to ({Isabelle2016})
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    12
  more than 180 type-classes.  This sheer complexity makes access
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    13
  and understanding of that type-class hierarchy difficult and
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    14
  involved, let alone maintenance.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    15
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    16
  The purpose of this primer is to shed some light on this,
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    17
  not only on the mere ingredients, but also on the design
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    18
  principles which have evolved and proven useful over time.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    19
\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    20
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    21
section \<open>Foundations\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    22
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    23
subsection \<open>Locales and type classes\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    24
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    25
text \<open>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    26
  Some familiarity with the Isabelle module system is assumed:
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    27
  defining locales and type-classes, interpreting locales and
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    28
  instantiating type-classes, adding relationships between
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    29
  locales (@{command sublocale}) and type-classes
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    30
  (@{command subclass}).  Handy introductions are the
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    31
  respective tutorials \cite{isabelle-locale}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    32
  \cite{isabelle-classes}.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    33
\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    34
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    35
subsection \<open>Strengths and restrictions of type classes\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    36
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    37
text \<open>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    38
  The primary motivation for using type classes in {Isabelle/HOL}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    39
  always have been numerical types, which form an inclusion chain:
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    40
  
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    41
  \begin{center}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    42
    @{typ nat} @{text \<sqsubset>} @{typ int} @{text \<sqsubset>} @{typ rat}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    43
      @{text \<sqsubset>} @{typ real} @{text \<sqsubset>} @{typ complex}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    44
  \end{center}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    45
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    46
  \noindent The inclusion @{text \<sqsubset>} means that any value of the numerical
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    47
  type to the left hand side mathematically can be transferred
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    48
  to the numerical type on the right hand side.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    49
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    50
  How to accomplish this given the quite restrictive type system
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    51
  of {Isabelle/HOL}?  Paulson \cite{paulson-numerical} explains
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    52
  that each numerical type has some characteristic properties
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    53
  which define an characteristic algebraic structure;  @{text \<sqsubset>}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    54
  then corresponds to specialization of the corresponding
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    55
  characteristic algebraic structures.  These algebraic structures
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    56
  are expressed using algebraic type classes and embeddings
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    57
  of numerical types into them:
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    58
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    59
  \begin{center}\begin{tabular}{lccc}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    60
    @{term of_nat} @{text "::"}  & @{typ nat}  & @{text \<Rightarrow>} & @{typ [source] "'a::semiring_1"} \\
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    61
                                 & @{text \<sqinter>}   &            & @{text \<up>} \\
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    62
    @{term of_int} @{text "::"}  & @{typ int}  & @{text \<Rightarrow>} & @{typ [source] "'a::ring_1"} \\
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    63
                                 & @{text \<sqinter>}   &            & @{text \<up>} \\
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    64
    @{term of_rat} @{text "::"}  & @{typ rat}  & @{text \<Rightarrow>} & @{typ [source] "'a::field_char_0"} \\
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    65
                                 & @{text \<sqinter>}   &            & @{text \<up>} \\
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    66
    @{term of_real} @{text "::"} & @{typ real} & @{text \<Rightarrow>} & @{typ [source] "'a::real_algebra_1"} \\
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    67
                                 & @{text \<sqinter>} \\
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    68
                                 & @{typ complex}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    69
  \end{tabular}\end{center}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    70
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    71
  \noindent @{text "d \<leftarrow> c"} means that @{text c} is subclass of @{text d}.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    72
  Hence each characteristic embedding @{text of_num} can transform
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    73
  any value of type @{text num} to any numerical type further
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    74
  up in the inclusion chain.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    75
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    76
  This canonical example exhibits key strengths of type classes:
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    77
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    78
    \<^item> Sharing of operations and facts among different
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    79
      types, hence also sharing of notation and names: there
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    80
      is only one plus operation using infix syntax @{text "+"},
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    81
      only one zero written @{text 0}, and neutrality
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    82
      (@{thm add_0_left [all, no_vars]} and
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    83
      @{thm add_0_right [all, no_vars]})
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    84
      is referred to
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    85
      uniformly by names @{fact add_0_left} and @{fact add_0_right}.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    86
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    87
    \<^item> Proof tool setups are shared implicitly:
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    88
      @{fact add_0} and @{fact add_0_right} are simplification
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    89
      rules by default.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    90
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    91
    \<^item> Hence existing proofs about particular numerical
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    92
      types are often easy to generalize to algebraic structures,
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    93
      given that they do not depend on specific properties of
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    94
      those numerical types.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    95
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    96
  Considerable restrictions include:
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    97
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    98
    \<^item> Type class operations are restricted to one
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
    99
      type parameter; this is insufficient e.g. for expressing
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   100
      a unified power operation adequately (see \secref{sec:power}).
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   101
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   102
    \<^item> Parameters are fixed over the whole type class
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   103
      hierarchy and cannot be refined in specific situations:
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   104
      think of integral domains with a predicate @{term is_unit};
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   105
      for natural numbers, this degenerates to the much simpler
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   106
      @{term [source] "HOL.equal (1::nat)"} but facts
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   107
      refer to @{term is_unit} nonetheless.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   108
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   109
    \<^item> Type classes are not apt for meta-theory.  There
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   110
      is no practically usable way to express that the units
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   111
      of an integral domain form a multiplicative group using
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   112
      type classes.  But see session @{text "HOL-Algebra"}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   113
      which provides locales with an explicit carrier.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   114
\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   115
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   116
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   117
subsection \<open>Navigating the hierarchy\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   118
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   119
text \<open>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   120
  An indispensable tool to inspect the class hierarchy is
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   121
  @{command class_deps} which displays the graph of classes,
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   122
  optionally showing the logical content for each class also.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   123
  Optional parameters restrict the graph to a particular segment
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   124
  which is useful to get a graspable view.  See
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   125
  the Isar reference manual \cite{isabelle-isar-ref} for details.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   126
\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   127
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   128
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   129
section \<open>The hierarchy\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   130
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   131
subsection \<open>Syntactic type classes\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   132
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   133
text \<open>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   134
  At the top of the hierarchy there are a couple of syntactic type
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   135
  classes, ie. classes with operations but with no axioms,
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   136
  most notably:
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   137
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   138
    \<^item> @{class plus} with @{term [source] "(a::'a::plus) + b"}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   139
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   140
    \<^item> @{class zero} with @{term [source] "0::'a::zero"}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   141
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   142
    \<^item> @{class times} with @{term [source] "(a::'a::times) * b"}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   143
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   144
    \<^item> @{class one} with @{term [source] "1::'a::one"}
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   145
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   146
  \noindent Before the introduction of the @{command class} statement in
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   147
  Isabelle \cite{Haftmann-Wenzel:2006:classes} it was impossible
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   148
  to define operations with associated axioms in the same class,
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   149
  hence there were always pairs of syntactic and logical type
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   150
  classes.  This restriction is lifted nowadays, but there are
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   151
  still reasons to maintain syntactic type classes:
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   152
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   153
    \<^item> Syntactic type classes allow generic notation to be used
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   154
      regardless of a particular logical interpretation; e.g.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   155
      although multiplication @{text "*"} is usually associative,
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   156
      there are examples where it is not (e.g. octonions), and
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   157
      leaving @{text "*"} without axioms allows to re-use this
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   158
      syntax by means of type class instantiation also for such
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   159
      exotic examples.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   160
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   161
    \<^item> Type classes might share operations but not necessarily
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   162
      axioms on them, e.g. @{term gcd} (see \secref{sec:gcd}).
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   163
      Hence their common base is a syntactic type class.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   164
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   165
  \noindent However syntactic type classes should only be used with striking
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   166
  cause.  Otherwise there is risk for confusion if the notation
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   167
  suggests properties which do not hold without particular
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   168
  constraints.  This can be illustrated using numerals
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   169
  (see \secref{sec:numerals}):  @{lemma "2 + 2 = 4" by simp} is
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   170
  provable without further ado, and this also meets the typical
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   171
  expectation towards a numeral notation;  in more ancient releases
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   172
  numerals were purely syntactic and @{prop "2 + 2 = 4"} was
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   173
  not provable without particular type constraints.
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   174
\<close>
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   175
9a9c2d846d4a fragment of a HOL type class primer
haftmann
parents:
diff changeset
   176
end