doc-src/TutorialI/Types/Overloading.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 Overloading = Overloading1:(*>*)
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     2
instance list :: ("term")ordrel
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     3
by intro_classes
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     4
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     5
text{*\noindent
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     6
This means. Of course we should also define the meaning of @{text <<=} and
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     7
@{text <<} on lists.
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     8
*}
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     9
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    10
defs (overloaded)
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    11
prefix_def:
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    12
  "xs <<= (ys::'a::ordrel list)  \<equiv>  \<exists>zs. ys = xs@zs"
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    13
strict_prefix_def:
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    14
  "xs << (ys::'a::ordrel list)   \<equiv>  xs <<= ys \<and> xs \<noteq> ys"
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    15
  
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    16
text{*
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    17
We could also have made the second definition non-overloaded once and for
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    18
all: @{prop"x << y \<equiv> x <<= y \<and> x \<noteq> y"}.  This would have saved us writing
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    19
many similar definitions at different types, but it would also have fixed
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    20
that @{text <<} is defined in terms of @{text <<=} and never the other way
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    21
around. Below you will see why we want to avoid this asymmetry.
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    22
*}
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    23
(*<*)end(*>*)