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