sum.thy
author clasohm
Wed, 02 Mar 1994 12:26:55 +0100
changeset 48 21291189b51e
parent 38 7ef6ba42914b
child 51 934a58983311
permissions -rw-r--r--
changed "." to "$" and Cons to infix "#" to eliminate ambiguity
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	HOL/sum
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Lawrence C Paulson, Cambridge University Computer Laboratory
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1992  University of Cambridge
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     5
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     6
The disjoint sum of two types
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     7
*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     8
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     9
Sum = Prod +
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    10
types   "+" 2      (infixl 10)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    11
arities "+"     :: (term,term)term
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    12
consts
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    13
   Inl_Rep	:: "['a,'a,'b,bool] => bool"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    14
   Inr_Rep	:: "['b,'a,'b,bool] => bool"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    15
   Sum		:: "(['a,'b,bool] => bool)set"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    16
   Rep_Sum	:: "'a + 'b => (['a,'b,bool] => bool)"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    17
   Abs_Sum	:: "(['a,'b,bool] => bool) => 'a+'b"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    18
   Inl		:: "'a => 'a+'b"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    19
   Inr		:: "'b => 'a+'b"
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 0
diff changeset
    20
   sum_case	:: "['a+'b, 'a=>'c,'b=>'c] =>'c"
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    21
rules
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    22
  Inl_Rep_def	"Inl_Rep == (%a. %x y p. x=a & p)"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    23
  Inr_Rep_def	"Inr_Rep == (%b. %x y p. y=b & ~p)"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    24
  Sum_def "Sum == {f. (? a. f = Inl_Rep(a)) | (? b. f = Inr_Rep(b))}"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    25
    (*faking a type definition...*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    26
  Rep_Sum 		"Rep_Sum(s): Sum"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    27
  Rep_Sum_inverse 	"Abs_Sum(Rep_Sum(s)) = s"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    28
  Abs_Sum_inverse 	"f: Sum ==> Rep_Sum(Abs_Sum(f)) = f"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    29
    (*defining the abstract constants*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    30
  Inl_def  		"Inl == (%a. Abs_Sum(Inl_Rep(a)))"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    31
  Inr_def 		"Inr == (%b. Abs_Sum(Inr_Rep(b)))"
38
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 0
diff changeset
    32
  sum_case_def	"sum_case == (%p f g. @z.  (!x. p=Inl(x) --> z=f(x))\
7ef6ba42914b sum: renamed case to sum_case
nipkow
parents: 0
diff changeset
    33
\                                        & (!y. p=Inr(y) --> z=g(y)))"
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    34
end