src/HOL/Hyperreal/HyperNat.thy
author paulson
Thu, 04 Jan 2001 10:23:01 +0100
changeset 10778 2c6605049646
parent 10751 a81ea5d3dd41
child 10797 028d22926a41
permissions -rw-r--r--
more tidying, especially to remove real_of_posnat
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     1
(*  Title       : HyperNat.thy
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     2
    Author      : Jacques D. Fleuriot
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     3
    Copyright   : 1998  University of Cambridge
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     4
    Description : Explicit construction of hypernaturals using 
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     5
                  ultrafilters
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     6
*) 
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     7
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     8
HyperNat = Star + 
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     9
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    10
constdefs
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    11
    hypnatrel :: "((nat=>nat)*(nat=>nat)) set"
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    12
    "hypnatrel == {p. EX X Y. p = ((X::nat=>nat),Y) & 
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    13
                       {n::nat. X(n) = Y(n)} : FreeUltrafilterNat}"
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    14
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    15
typedef hypnat = "UNIV//hypnatrel"              (Equiv.quotient_def)
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    16
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    17
instance
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    18
   hypnat  :: {ord,zero,plus,times,minus}
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    19
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    20
consts
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    21
  "1hn"       :: hypnat               ("1hn")  
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    22
  "whn"       :: hypnat               ("whn")  
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    23
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    24
constdefs
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    25
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    26
  (* embedding the naturals in the hypernaturals *)
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    27
  hypnat_of_nat   :: nat => hypnat
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    28
  "hypnat_of_nat m  == Abs_hypnat(hypnatrel^^{%n::nat. m})"
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    29
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    30
  (* hypernaturals as members of the hyperreals; the set is defined as  *)
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    31
  (* the nonstandard extension of set of naturals embedded in the reals *)
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    32
  HNat         :: "hypreal set"
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    33
  "HNat         == *s* {n. EX no. n = real_of_nat no}"
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    34
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    35
  (* the set of infinite hypernatural numbers *)
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    36
  HNatInfinite :: "hypnat set"
10778
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    37
  "HNatInfinite == {n. n ~: SNat}"
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    38
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    39
  (* explicit embedding of the hypernaturals in the hyperreals *)    
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    40
  hypreal_of_hypnat :: hypnat => hypreal
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    41
  "hypreal_of_hypnat N  == Abs_hypreal(UN X: Rep_hypnat(N). 
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    42
                            hyprel^^{%n::nat. real_of_nat (X n)})"
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    43
  
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    44
defs
10778
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    45
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    46
  (** the overloaded constant "SNat" **)
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    47
  
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    48
  (* set of naturals embedded in the hyperreals*)
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    49
  SNat_def             "SNat == {n. EX N. n = hypreal_of_nat N}"  
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    50
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    51
  (* set of naturals embedded in the hypernaturals*)
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    52
  SHNat_def            "SNat == {n. EX N. n = hypnat_of_nat N}"  
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    53
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    54
  (** hypernatural arithmetic **)
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    55
  
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    56
  hypnat_zero_def      "0 == Abs_hypnat(hypnatrel^^{%n::nat. 0})"
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    57
  hypnat_one_def       "1hn == Abs_hypnat(hypnatrel^^{%n::nat. 1})"
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    58
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    59
  (* omega is in fact an infinite hypernatural number = [<1,2,3,...>] *)
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    60
  hypnat_omega_def     "whn == Abs_hypnat(hypnatrel^^{%n::nat. n})"
2c6605049646 more tidying, especially to remove real_of_posnat
paulson
parents: 10751
diff changeset
    61
 
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    62
  hypnat_add_def  
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    63
  "P + Q == Abs_hypnat(UN X:Rep_hypnat(P). UN Y:Rep_hypnat(Q).
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    64
                hypnatrel^^{%n::nat. X n + Y n})"
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    65
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    66
  hypnat_mult_def  
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    67
  "P * Q == Abs_hypnat(UN X:Rep_hypnat(P). UN Y:Rep_hypnat(Q).
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    68
                hypnatrel^^{%n::nat. X n * Y n})"
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    69
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    70
  hypnat_minus_def  
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    71
  "P - Q == Abs_hypnat(UN X:Rep_hypnat(P). UN Y:Rep_hypnat(Q).
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    72
                hypnatrel^^{%n::nat. X n - Y n})"
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    73
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    74
  hypnat_less_def
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    75
  "P < (Q::hypnat) == EX X Y. X: Rep_hypnat(P) & 
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    76
                               Y: Rep_hypnat(Q) & 
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    77
                               {n::nat. X n < Y n} : FreeUltrafilterNat"
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    78
  hypnat_le_def
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    79
  "P <= (Q::hypnat) == ~(Q < P)" 
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    80
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    81
end
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    82
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    83
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    84