doc-src/TutorialI/Types/Overloading1.thy
author nipkow
Mon, 23 Oct 2000 20:58:12 +0200
changeset 10305 adff80268127
child 10328 bf33cbd76c05
permissions -rw-r--r--
*** empty log message ***
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
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     3
subsubsection{*Controlled overloading with type classes*}
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     4
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     5
text{*
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     6
We now start with the theory of ordering relations, which we want to phrase
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     7
in terms of the two binary symbols @{text"<<"} and @{text"<<="}: they have
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     8
been chosen to avoid clashes with @{text"\<le>"} and @{text"<"} in theory @{text
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
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    13
axclass ordrel < "term"
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    14
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    15
text{*\noindent
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    16
This is a degenerate form of axiomatic type class without any axioms.
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    17
Its sole purpose is to restrict the use of overloaded constants to meaningful
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    18
instances:
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    19
*}
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    20
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    21
consts
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    22
  "<<"        :: "('a::ordrel) \<Rightarrow> 'a \<Rightarrow> bool"             (infixl 50)
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    23
  "<<="       :: "('a::ordrel) \<Rightarrow> 'a \<Rightarrow> bool"             (infixl 50)
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    24
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    25
instance bool :: ordrel
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    26
by intro_classes
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    27
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    28
defs (overloaded)
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    29
le_bool_def:  "P <<= Q \<equiv> P \<longrightarrow> Q"
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    30
less_bool_def: "P << Q \<equiv> \<not>P \<and> Q"
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    31
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    32
text{*
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    33
Now @{prop"False <<= False"} is provable
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    34
*}
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    35
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    36
lemma "False <<= False"
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    37
by(simp add: le_bool_def)
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    38
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    39
text{*\noindent
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    40
whereas @{text"[] <<= []"} is not even welltyped. In order to make it welltyped
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    41
we need to make lists a type of class @{text ordrel}:*}(*<*)end(*>*)