doc-src/TutorialI/Types/Overloading1.thy
author wenzelm
Sat, 01 Dec 2001 18:52:32 +0100
changeset 12338 de0f4a63baa5
parent 11494 23a118849801
child 12815 1f073030b97a
permissions -rw-r--r--
renamed class "term" to "type" (actually "HOL.type");
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)theory Overloading1 = Main:(*>*)
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     2
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10396
diff changeset
     3
subsubsection{*Controlled Overloading with Type Classes*}
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     4
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     5
text{*
11494
23a118849801 revisions and indexing
paulson
parents: 11310
diff changeset
     6
We now start with the theory of ordering relations, which we shall phrase
11277
a2bff98d6e5d *** empty log message ***
nipkow
parents: 11161
diff changeset
     7
in terms of the two binary symbols @{text"<<"} and @{text"<<="}
a2bff98d6e5d *** empty log message ***
nipkow
parents: 11161
diff changeset
     8
to avoid clashes with @{text"<"} and @{text"\<le>"} in theory @{text
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     9
Main}. To restrict the application of @{text"<<"} and @{text"<<="} we
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    10
introduce the class @{text ordrel}:
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    11
*}
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    12
12338
de0f4a63baa5 renamed class "term" to "type" (actually "HOL.type");
wenzelm
parents: 11494
diff changeset
    13
axclass ordrel < type
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    14
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    15
text{*\noindent
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    16
This introduces a new class @{text ordrel} and makes it a subclass of
12338
de0f4a63baa5 renamed class "term" to "type" (actually "HOL.type");
wenzelm
parents: 11494
diff changeset
    17
the predefined class @{text type}, which
de0f4a63baa5 renamed class "term" to "type" (actually "HOL.type");
wenzelm
parents: 11494
diff changeset
    18
is the class of all HOL types.
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    19
This is a degenerate form of axiomatic type class without any axioms.
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    20
Its sole purpose is to restrict the use of overloaded constants to meaningful
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    21
instances:
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    22
*}
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    23
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    24
consts less :: "('a::ordrel) \<Rightarrow> 'a \<Rightarrow> bool"     (infixl "<<"  50)
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    25
       le   :: "('a::ordrel) \<Rightarrow> 'a \<Rightarrow> bool"     (infixl "<<=" 50)
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    26
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    27
text{*\noindent
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10328
diff changeset
    28
Note that only one occurrence of a type variable in a type needs to be
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10328
diff changeset
    29
constrained with a class; the constraint is propagated to the other
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10328
diff changeset
    30
occurrences automatically.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10328
diff changeset
    31
11494
23a118849801 revisions and indexing
paulson
parents: 11310
diff changeset
    32
So far there are no types of class @{text ordrel}. To breathe life
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    33
into @{text ordrel} we need to declare a type to be an \bfindex{instance} of
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    34
@{text ordrel}:
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    35
*}
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    36
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    37
instance bool :: ordrel
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    38
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    39
txt{*\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    40
Command \isacommand{instance} actually starts a proof, namely that
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    41
@{typ bool} satisfies all axioms of @{text ordrel}.
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    42
There are none, but we still need to finish that proof, which we do
11494
23a118849801 revisions and indexing
paulson
parents: 11310
diff changeset
    43
by invoking the \methdx{intro_classes} method:
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    44
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    45
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    46
by intro_classes
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    47
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    48
text{*\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    49
More interesting \isacommand{instance} proofs will arise below
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    50
in the context of proper axiomatic type classes.
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    51
11161
166f7d87b37f *** empty log message ***
nipkow
parents: 10885
diff changeset
    52
Although terms like @{prop"False <<= P"} are now legal, we still need to say
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    53
what the relation symbols actually mean at type @{typ bool}:
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    54
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    55
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    56
defs (overloaded)
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    57
le_bool_def:  "P <<= Q \<equiv> P \<longrightarrow> Q"
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    58
less_bool_def: "P << Q \<equiv> \<not>P \<and> Q"
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    59
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    60
text{*\noindent
11494
23a118849801 revisions and indexing
paulson
parents: 11310
diff changeset
    61
Now @{prop"False <<= P"} is provable:
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    62
*}
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    63
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    64
lemma "False <<= P"
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    65
by(simp add: le_bool_def)
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    66
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    67
text{*\noindent
11494
23a118849801 revisions and indexing
paulson
parents: 11310
diff changeset
    68
At this point, @{text"[] <<= []"} is not even well-typed.
23a118849801 revisions and indexing
paulson
parents: 11310
diff changeset
    69
To make it well-typed,
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    70
we need to make lists a type of class @{text ordrel}:*}(*<*)end(*>*)