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