8890
|
1 |
|
9146
|
2 |
header {* Syntactic classes *}
|
8890
|
3 |
|
9146
|
4 |
theory Product = Main:
|
8890
|
5 |
|
8903
|
6 |
text {*
|
|
7 |
\medskip\noindent There is still a feature of Isabelle's type system
|
8907
|
8 |
left that we have not yet discussed. When declaring polymorphic
|
10140
|
9 |
constants @{text "c \<Colon> \<sigma>"}, the type variables occurring in @{text \<sigma>}
|
|
10 |
may be constrained by type classes (or even general sorts) in an
|
8907
|
11 |
arbitrary way. Note that by default, in Isabelle/HOL the declaration
|
11071
|
12 |
@{text "\<odot> \<Colon> 'a \<Rightarrow> 'a \<Rightarrow> 'a"} is actually an abbreviation for @{text "\<odot>
|
|
13 |
\<Colon> 'a\<Colon>term \<Rightarrow> 'a \<Rightarrow> 'a"} Since class @{text "term"} is the universal
|
|
14 |
class of HOL, this is not really a constraint at all.
|
8903
|
15 |
|
10140
|
16 |
The @{text product} class below provides a less degenerate example of
|
8903
|
17 |
syntactic type classes.
|
9146
|
18 |
*}
|
8903
|
19 |
|
8890
|
20 |
axclass
|
11099
|
21 |
product \<subseteq> "term"
|
8890
|
22 |
consts
|
10140
|
23 |
product :: "'a\<Colon>product \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "\<odot>" 70)
|
8890
|
24 |
|
8903
|
25 |
text {*
|
10140
|
26 |
Here class @{text product} is defined as subclass of @{text term}
|
|
27 |
without any additional axioms. This effects in logical equivalence
|
|
28 |
of @{text product} and @{text term}, as is reflected by the trivial
|
|
29 |
introduction rule generated for this definition.
|
8903
|
30 |
|
11071
|
31 |
\medskip So what is the difference of declaring @{text "\<odot> \<Colon>
|
|
32 |
'a\<Colon>product \<Rightarrow> 'a \<Rightarrow> 'a"} vs.\ declaring @{text "\<odot> \<Colon> 'a\<Colon>term \<Rightarrow> 'a \<Rightarrow> 'a"}
|
|
33 |
anyway? In this particular case where @{text "product \<equiv> term"}, it
|
|
34 |
should be obvious that both declarations are the same from the
|
|
35 |
logic's point of view. It even makes the most sense to remove sort
|
|
36 |
constraints from constant declarations, as far as the purely logical
|
|
37 |
meaning is concerned \cite{Wenzel:1997:TPHOL}.
|
8903
|
38 |
|
|
39 |
On the other hand there are syntactic differences, of course.
|
10140
|
40 |
Constants @{text \<odot>} on some type @{text \<tau>} are rejected by the
|
|
41 |
type-checker, unless the arity @{text "\<tau> \<Colon> product"} is part of the
|
|
42 |
type signature. In our example, this arity may be always added when
|
10309
|
43 |
required by means of an $\INSTANCE$ with the default proof $\DDOT$.
|
8903
|
44 |
|
|
45 |
\medskip Thus, we may observe the following discipline of using
|
|
46 |
syntactic classes. Overloaded polymorphic constants have their type
|
10140
|
47 |
arguments restricted to an associated (logically trivial) class
|
|
48 |
@{text c}. Only immediately before \emph{specifying} these constants
|
|
49 |
on a certain type @{text \<tau>} do we instantiate @{text "\<tau> \<Colon> c"}.
|
8903
|
50 |
|
10140
|
51 |
This is done for class @{text product} and type @{typ bool} as
|
|
52 |
follows.
|
9146
|
53 |
*}
|
8903
|
54 |
|
10309
|
55 |
instance bool :: product ..
|
9306
|
56 |
defs (overloaded)
|
10140
|
57 |
product_bool_def: "x \<odot> y \<equiv> x \<and> y"
|
8890
|
58 |
|
8903
|
59 |
text {*
|
10140
|
60 |
The definition @{text prod_bool_def} becomes syntactically
|
|
61 |
well-formed only after the arity @{text "bool \<Colon> product"} is made
|
|
62 |
known to the type checker.
|
8903
|
63 |
|
|
64 |
\medskip It is very important to see that above $\DEFS$ are not
|
10223
|
65 |
directly connected with $\INSTANCE$ at all! We were just following
|
|
66 |
our convention to specify @{text \<odot>} on @{typ bool} after having
|
|
67 |
instantiated @{text "bool \<Colon> product"}. Isabelle does not require
|
|
68 |
these definitions, which is in contrast to programming languages like
|
|
69 |
Haskell \cite{haskell-report}.
|
8903
|
70 |
|
|
71 |
\medskip While Isabelle type classes and those of Haskell are almost
|
|
72 |
the same as far as type-checking and type inference are concerned,
|
8907
|
73 |
there are important semantic differences. Haskell classes require
|
|
74 |
their instances to \emph{provide operations} of certain \emph{names}.
|
8903
|
75 |
Therefore, its \texttt{instance} has a \texttt{where} part that tells
|
|
76 |
the system what these ``member functions'' should be.
|
|
77 |
|
10140
|
78 |
This style of \texttt{instance} would not make much sense in
|
|
79 |
Isabelle's meta-logic, because there is no internal notion of
|
|
80 |
``providing operations'' or even ``names of functions''.
|
9146
|
81 |
*}
|
8903
|
82 |
|
9146
|
83 |
end |