src/HOL/Hyperreal/NatStar.thy
author nipkow
Mon, 07 Feb 2005 08:02:14 +0100
changeset 15502 9d012c7fadab
parent 15360 300e09825d8b
child 17290 a39d1430d271
permissions -rw-r--r--
fixed latex problems
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       : NatStar.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
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
     4
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
     5
Converted to Isar and polished by lcp
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
     6
*)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
     7
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
     8
header{*Star-transforms for the Hypernaturals*}
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
     9
15131
c69542757a4d New theory header syntax.
nipkow
parents: 15085
diff changeset
    10
theory NatStar
15360
300e09825d8b Added "ALL x > y" and relatives.
nipkow
parents: 15169
diff changeset
    11
imports HyperPow
15131
c69542757a4d New theory header syntax.
nipkow
parents: 15085
diff changeset
    12
begin
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    13
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    14
text{*Extends sets of nats, and functions from the nats to nats or reals*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    15
10751
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
constdefs
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    18
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    19
  (* internal sets and nonstandard extensions -- see Star.thy as well *)
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    20
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    21
    starsetNat :: "nat set => hypnat set"          ("*sNat* _" [80] 80)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    22
    "*sNat* A ==
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    23
       {x. \<forall>X\<in>Rep_hypnat(x). {n::nat. X n \<in> A}: FreeUltrafilterNat}"
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    24
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    25
   starsetNat_n :: "(nat => nat set) => hypnat set"      ("*sNatn* _" [80] 80)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    26
    "*sNatn* As ==
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    27
       {x. \<forall>X\<in>Rep_hypnat(x). {n::nat. X n \<in> (As n)}: FreeUltrafilterNat}"
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    28
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    29
   InternalNatSets :: "hypnat set set"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    30
    "InternalNatSets == {X. \<exists>As. X = *sNatn* As}"
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    31
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    32
    (* star transform of functions f:Nat --> Real *)
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    33
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    34
    starfunNat :: "(nat => real) => hypnat => hypreal"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    35
                  ("*fNat* _" [80] 80)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    36
    "*fNat* f  == (%x. Abs_hypreal(\<Union>X\<in>Rep_hypnat(x). hyprel``{%n. f (X n)}))"
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    37
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    38
   starfunNat_n :: "(nat => (nat => real)) => hypnat => hypreal"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    39
                   ("*fNatn* _" [80] 80)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    40
    "*fNatn* F ==
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    41
      (%x. Abs_hypreal(\<Union>X\<in>Rep_hypnat(x). hyprel``{%n. (F n)(X n)}))"
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    42
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    43
   InternalNatFuns :: "(hypnat => hypreal) set"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    44
    "InternalNatFuns == {X. \<exists>F. X = *fNatn* F}"
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    45
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    46
    (* star transform of functions f:Nat --> Nat *)
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
    47
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    48
   starfunNat2 :: "(nat => nat) => hypnat => hypnat"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    49
                   ("*fNat2* _" [80] 80)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    50
    "*fNat2* f == %x. Abs_hypnat(\<Union>X\<in>Rep_hypnat(x). hypnatrel``{%n. f (X n)})"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    51
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    52
   starfunNat2_n :: "(nat => (nat => nat)) => hypnat => hypnat"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    53
                     ("*fNat2n* _" [80] 80)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    54
    "*fNat2n* F == 
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    55
        %x. Abs_hypnat(\<Union>X\<in>Rep_hypnat(x). hypnatrel``{%n. (F n)(X n)})"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    56
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    57
   InternalNatFuns2 :: "(hypnat => hypnat) set"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    58
    "InternalNatFuns2 == {X. \<exists>F. X = *fNat2n* F}"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    59
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    60
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    61
lemma NatStar_real_set: "*sNat*(UNIV::nat set) = (UNIV::hypnat set)"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    62
by (simp add: starsetNat_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    63
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    64
lemma NatStar_empty_set [simp]: "*sNat* {} = {}"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    65
by (simp add: starsetNat_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    66
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    67
lemma NatStar_Un: "*sNat* (A Un B) = *sNat* A Un *sNat* B"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    68
apply (auto simp add: starsetNat_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    69
 prefer 2 apply (blast intro: FreeUltrafilterNat_subset)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    70
 prefer 2 apply (blast intro: FreeUltrafilterNat_subset)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    71
apply (drule FreeUltrafilterNat_Compl_mem)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    72
apply (drule bspec, assumption)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    73
apply (rule_tac z = x in eq_Abs_hypnat, auto, ultra)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    74
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    75
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    76
lemma starsetNat_n_Un: "*sNatn* (%n. (A n) Un (B n)) = *sNatn* A Un *sNatn* B"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    77
apply (auto simp add: starsetNat_n_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    78
apply (drule_tac x = Xa in bspec)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    79
apply (rule_tac [2] z = x in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    80
apply (auto dest!: bspec, ultra+)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    81
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    82
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    83
lemma InternalNatSets_Un:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    84
     "[| X \<in> InternalNatSets; Y \<in> InternalNatSets |]
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    85
      ==> (X Un Y) \<in> InternalNatSets"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    86
by (auto simp add: InternalNatSets_def starsetNat_n_Un [symmetric])
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    87
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    88
lemma NatStar_Int: "*sNat* (A Int B) = *sNat* A Int *sNat* B"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    89
apply (auto simp add: starsetNat_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    90
prefer 3 apply (blast intro: FreeUltrafilterNat_Int FreeUltrafilterNat_subset)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    91
apply (blast intro: FreeUltrafilterNat_subset)+
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    92
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    93
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    94
lemma starsetNat_n_Int:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    95
      "*sNatn* (%n. (A n) Int (B n)) = *sNatn* A Int *sNatn* B"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    96
apply (auto simp add: starsetNat_n_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    97
apply (auto dest!: bspec, ultra+)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    98
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
    99
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   100
lemma InternalNatSets_Int:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   101
     "[| X \<in> InternalNatSets; Y \<in> InternalNatSets |]
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   102
      ==> (X Int Y) \<in> InternalNatSets"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   103
by (auto simp add: InternalNatSets_def starsetNat_n_Int [symmetric])
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   104
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   105
lemma NatStar_Compl: "*sNat* (-A) = -( *sNat* A)"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   106
apply (auto simp add: starsetNat_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   107
apply (rule_tac z = x in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   108
apply (rule_tac [2] z = x in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   109
apply (auto dest!: bspec, ultra+)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   110
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   111
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   112
lemma starsetNat_n_Compl: "*sNatn* ((%n. - A n)) = -( *sNatn* A)"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   113
apply (auto simp add: starsetNat_n_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   114
apply (rule_tac z = x in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   115
apply (rule_tac [2] z = x in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   116
apply (auto dest!: bspec, ultra+)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   117
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   118
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   119
lemma InternalNatSets_Compl: "X \<in> InternalNatSets ==> -X \<in> InternalNatSets"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   120
by (auto simp add: InternalNatSets_def starsetNat_n_Compl [symmetric])
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   121
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   122
lemma starsetNat_n_diff: "*sNatn* (%n. (A n) - (B n)) = *sNatn* A - *sNatn* B"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   123
apply (auto simp add: starsetNat_n_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   124
apply (rule_tac [2] z = x in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   125
apply (rule_tac [3] z = x in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   126
apply (auto dest!: bspec, ultra+)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   127
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   128
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   129
lemma InternalNatSets_diff:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   130
     "[| X \<in> InternalNatSets; Y \<in> InternalNatSets |]
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   131
      ==> (X - Y) \<in> InternalNatSets"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   132
by (auto simp add: InternalNatSets_def starsetNat_n_diff [symmetric])
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   133
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   134
lemma NatStar_subset: "A \<le> B ==> *sNat* A \<le> *sNat* B"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   135
apply (simp add: starsetNat_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   136
apply (blast intro: FreeUltrafilterNat_subset)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   137
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   138
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   139
lemma NatStar_mem: "a \<in> A ==> hypnat_of_nat a \<in> *sNat* A"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   140
by (auto intro: FreeUltrafilterNat_subset 
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   141
         simp add: starsetNat_def hypnat_of_nat_eq)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   142
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   143
lemma NatStar_hypreal_of_real_image_subset: "hypnat_of_nat ` A \<le> *sNat* A"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   144
apply (auto simp add: starsetNat_def hypnat_of_nat_eq)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   145
apply (blast intro: FreeUltrafilterNat_subset)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   146
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   147
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   148
lemma NatStar_SHNat_subset: "Nats \<le> *sNat* (UNIV:: nat set)"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   149
by (simp add: starsetNat_def SHNat_eq hypnat_of_nat_eq)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   150
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   151
lemma NatStar_hypreal_of_real_Int:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   152
     "*sNat* X Int Nats = hypnat_of_nat ` X"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   153
apply (auto simp add: starsetNat_def hypnat_of_nat_eq SHNat_eq)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   154
apply (simp add: hypnat_of_nat_eq [symmetric])
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   155
apply (rule imageI, rule ccontr)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   156
apply (drule bspec)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   157
apply (rule lemma_hypnatrel_refl)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   158
prefer 2 apply (blast intro: FreeUltrafilterNat_subset, auto)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   159
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   160
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   161
lemma starsetNat_starsetNat_n_eq: "*sNat* X = *sNatn* (%n. X)"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   162
by (simp add: starsetNat_n_def starsetNat_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   163
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   164
lemma InternalNatSets_starsetNat_n [simp]: "( *sNat* X) \<in> InternalNatSets"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   165
by (auto simp add: InternalNatSets_def starsetNat_starsetNat_n_eq)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   166
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   167
lemma InternalNatSets_UNIV_diff:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   168
     "X \<in> InternalNatSets ==> UNIV - X \<in> InternalNatSets"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   169
by (auto intro: InternalNatSets_Compl)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   170
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   171
text{*Nonstandard extension of a set (defined using a constant
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   172
   sequence) as a special case of an internal set*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   173
lemma starsetNat_n_starsetNat: "\<forall>n. (As n = A) ==> *sNatn* As = *sNat* A"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   174
by (simp add: starsetNat_n_def starsetNat_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   175
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   176
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   177
subsection{*Nonstandard Extensions of Functions*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   178
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   179
text{* Nonstandard extension of a function (defined using a constant
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   180
   sequence) as a special case of an internal function*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   181
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   182
lemma starfunNat_n_starfunNat: "\<forall>n. (F n = f) ==> *fNatn* F = *fNat* f"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   183
by (simp add: starfunNat_n_def starfunNat_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   184
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   185
lemma starfunNat2_n_starfunNat2: "\<forall>n. (F n = f) ==> *fNat2n* F = *fNat2* f"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   186
by (simp add: starfunNat2_n_def starfunNat2_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   187
15169
2b5da07a0b89 new "respects" syntax for quotienting
paulson
parents: 15140
diff changeset
   188
lemma starfunNat_congruent: "(%X. hypnatrel``{%n. f (X n)}) respects hypnatrel"
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   189
apply (simp add: congruent_def, safe)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   190
apply (ultra+)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   191
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   192
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   193
(* f::nat=>real *)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   194
lemma starfunNat:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   195
      "( *fNat* f) (Abs_hypnat(hypnatrel``{%n. X n})) =
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   196
       Abs_hypreal(hyprel `` {%n. f (X n)})"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   197
apply (simp add: starfunNat_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   198
apply (rule arg_cong [where f = Abs_hypreal])
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   199
apply (auto, ultra)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   200
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   201
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   202
(* f::nat=>nat *)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   203
lemma starfunNat2:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   204
      "( *fNat2* f) (Abs_hypnat(hypnatrel``{%n. X n})) =
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   205
       Abs_hypnat(hypnatrel `` {%n. f (X n)})"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   206
apply (simp add: starfunNat2_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   207
apply (rule arg_cong [where f = Abs_hypnat])
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   208
apply (simp add: hypnatrel_in_hypnat [THEN Abs_hypnat_inverse]
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   209
         UN_equiv_class [OF equiv_hypnatrel starfunNat_congruent])
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   210
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   211
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   212
subsubsection{*Multiplication: @{text "( *f) x ( *g) = *(f x g)"}*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   213
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   214
lemma starfunNat_mult:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   215
     "( *fNat* f) z * ( *fNat* g) z = ( *fNat* (%x. f x * g x)) z"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   216
apply (cases z)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   217
apply (simp add: starfunNat hypreal_mult)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   218
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   219
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   220
lemma starfunNat2_mult:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   221
     "( *fNat2* f) z * ( *fNat2* g) z = ( *fNat2* (%x. f x * g x)) z"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   222
apply (cases z)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   223
apply (simp add: starfunNat2 hypnat_mult)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   224
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   225
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   226
subsubsection{*Addition: @{text "( *f) + ( *g) = *(f + g)"}*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   227
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   228
lemma starfunNat_add:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   229
     "( *fNat* f) z + ( *fNat* g) z = ( *fNat* (%x. f x + g x)) z"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   230
apply (cases z)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   231
apply (simp add: starfunNat hypreal_add)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   232
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   233
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   234
lemma starfunNat2_add:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   235
     "( *fNat2* f) z + ( *fNat2* g) z = ( *fNat2* (%x. f x + g x)) z"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   236
apply (cases z)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   237
apply (simp add: starfunNat2 hypnat_add)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   238
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   239
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   240
lemma starfunNat2_minus:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   241
     "( *fNat2* f) z - ( *fNat2* g) z = ( *fNat2* (%x. f x - g x)) z"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   242
apply (cases z)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   243
apply (simp add: starfunNat2 hypnat_minus)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   244
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   245
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   246
subsubsection{*Composition: @{text "( *f) o ( *g) = *(f o g)"}*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   247
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   248
(***** ( *f::nat=>real) o ( *g::nat=>nat) = *(f o g) *****)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   249
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   250
lemma starfunNatNat2_o:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   251
     "( *fNat* f) o ( *fNat2* g) = ( *fNat* (f o g))"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   252
apply (rule ext)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   253
apply (rule_tac z = x in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   254
apply (simp add: starfunNat2 starfunNat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   255
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   256
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   257
lemma starfunNatNat2_o2:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   258
     "(%x. ( *fNat* f) (( *fNat2* g) x)) = ( *fNat* (%x. f(g x)))"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   259
apply (insert starfunNatNat2_o [of f g]) 
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   260
apply (simp add: o_def) 
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   261
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   262
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   263
(***** ( *f::nat=>nat) o ( *g::nat=>nat) = *(f o g) *****)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   264
lemma starfunNat2_o: "( *fNat2* f) o ( *fNat2* g) = ( *fNat2* (f o g))"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   265
apply (rule ext)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   266
apply (rule_tac z = x in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   267
apply (simp add: starfunNat2)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   268
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   269
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   270
(***** ( *f::real=>real) o ( *g::nat=>real) = *(f o g) *****)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   271
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   272
lemma starfun_stafunNat_o: "( *f* f) o ( *fNat* g) = ( *fNat* (f o g))"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   273
apply (rule ext)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   274
apply (rule_tac z = x in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   275
apply (simp add: starfunNat starfun)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   276
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   277
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   278
lemma starfun_stafunNat_o2:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   279
     "(%x. ( *f* f) (( *fNat* g) x)) = ( *fNat* (%x. f (g x)))"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   280
apply (insert starfun_stafunNat_o [of f g]) 
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   281
apply (simp add: o_def) 
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   282
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   283
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   284
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   285
text{*NS extension of constant function*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   286
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   287
lemma starfunNat_const_fun [simp]: "( *fNat* (%x. k)) z = hypreal_of_real k"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   288
apply (cases z)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   289
apply (simp add: starfunNat hypreal_of_real_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   290
done
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
   291
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   292
lemma starfunNat2_const_fun [simp]: "( *fNat2* (%x. k)) z = hypnat_of_nat  k"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   293
apply (cases z)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   294
apply (simp add: starfunNat2 hypnat_of_nat_eq)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   295
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   296
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   297
lemma starfunNat_minus: "- ( *fNat* f) x = ( *fNat* (%x. - f x)) x"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   298
apply (cases x)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   299
apply (simp add: starfunNat hypreal_minus)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   300
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   301
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   302
lemma starfunNat_inverse:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   303
     "inverse (( *fNat* f) x) = ( *fNat* (%x. inverse (f x))) x"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   304
apply (cases x)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   305
apply (simp add: starfunNat hypreal_inverse)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   306
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   307
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   308
text{* Extended function has same solution as its standard
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   309
   version for natural arguments. i.e they are the same
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   310
   for all natural arguments (c.f. Hoskins pg. 107- SEQ)*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   311
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   312
lemma starfunNat_eq [simp]:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   313
     "( *fNat* f) (hypnat_of_nat a) = hypreal_of_real (f a)"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   314
by (simp add: starfunNat hypnat_of_nat_eq hypreal_of_real_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   315
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   316
lemma starfunNat2_eq [simp]:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   317
     "( *fNat2* f) (hypnat_of_nat a) = hypnat_of_nat (f a)"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   318
by (simp add: starfunNat2 hypnat_of_nat_eq)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   319
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   320
lemma starfunNat_approx:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   321
     "( *fNat* f) (hypnat_of_nat a) @= hypreal_of_real (f a)"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   322
by auto
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   323
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   324
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   325
text{* Example of transfer of a property from reals to hyperreals
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   326
    --- used for limit comparison of sequences*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   327
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   328
lemma starfun_le_mono:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   329
     "\<forall>n. N \<le> n --> f n \<le> g n
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   330
      ==> \<forall>n. hypnat_of_nat N \<le> n --> ( *fNat* f) n \<le> ( *fNat* g) n"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   331
apply safe
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   332
apply (rule_tac z = n in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   333
apply (auto simp add: starfunNat hypnat_of_nat_eq hypreal_le hypreal_less hypnat_le hypnat_less, ultra, auto)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   334
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   335
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   336
(*****----- and another -----*****)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   337
lemma starfun_less_mono:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   338
     "\<forall>n. N \<le> n --> f n < g n
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   339
      ==> \<forall>n. hypnat_of_nat N \<le> n --> ( *fNat* f) n < ( *fNat* g) n"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   340
apply safe
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   341
apply (rule_tac z = n in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   342
apply (auto simp add: starfunNat hypnat_of_nat_eq hypreal_le hypreal_less hypnat_le hypnat_less, ultra, auto)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   343
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   344
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   345
text{*Nonstandard extension when we increment the argument by one*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   346
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   347
lemma starfunNat_shift_one:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   348
     "( *fNat* (%n. f (Suc n))) N = ( *fNat* f) (N + (1::hypnat))"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   349
apply (cases N)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   350
apply (simp add: starfunNat hypnat_one_def hypnat_add)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   351
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   352
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   353
text{*Nonstandard extension with absolute value*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   354
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   355
lemma starfunNat_rabs: "( *fNat* (%n. abs (f n))) N = abs(( *fNat* f) N)"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   356
apply (cases N)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   357
apply (simp add: starfunNat hypreal_hrabs)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   358
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   359
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   360
text{*The hyperpow function as a nonstandard extension of realpow*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   361
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   362
lemma starfunNat_pow: "( *fNat* (%n. r ^ n)) N = (hypreal_of_real r) pow N"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   363
apply (cases N)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   364
apply (simp add: hyperpow hypreal_of_real_def starfunNat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   365
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   366
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   367
lemma starfunNat_pow2:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   368
     "( *fNat* (%n. (X n) ^ m)) N = ( *fNat* X) N pow hypnat_of_nat m"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   369
apply (cases N)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   370
apply (simp add: hyperpow hypnat_of_nat_eq starfunNat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   371
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   372
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   373
lemma starfun_pow: "( *f* (%r. r ^ n)) R = (R) pow hypnat_of_nat n"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   374
apply (rule_tac z = R in eq_Abs_hypreal)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   375
apply (simp add: hyperpow starfun hypnat_of_nat_eq)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   376
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   377
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   378
text{*The @{term hypreal_of_hypnat} function as a nonstandard extension of
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   379
  @{term real_of_nat} *}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   380
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   381
lemma starfunNat_real_of_nat: "( *fNat* real) = hypreal_of_hypnat"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   382
apply (rule ext)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   383
apply (rule_tac z = x in eq_Abs_hypnat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   384
apply (simp add: hypreal_of_hypnat starfunNat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   385
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   386
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   387
lemma starfunNat_inverse_real_of_nat_eq:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   388
     "N \<in> HNatInfinite
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   389
   ==> ( *fNat* (%x::nat. inverse(real x))) N = inverse(hypreal_of_hypnat N)"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   390
apply (rule_tac f1 = inverse in starfun_stafunNat_o2 [THEN subst])
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   391
apply (subgoal_tac "hypreal_of_hypnat N ~= 0")
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   392
apply (simp_all add: HNatInfinite_not_eq_zero starfunNat_real_of_nat starfun_inverse_inverse)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   393
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   394
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   395
text{*Internal functions - some redundancy with *fNat* now*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   396
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   397
lemma starfunNat_n_congruent:
15169
2b5da07a0b89 new "respects" syntax for quotienting
paulson
parents: 15140
diff changeset
   398
      "(%X. hypnatrel``{%n. f n (X n)}) respects hypnatrel"
2b5da07a0b89 new "respects" syntax for quotienting
paulson
parents: 15140
diff changeset
   399
by (auto simp add: congruent_def, ultra+)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   400
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   401
lemma starfunNat_n:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   402
     "( *fNatn* f) (Abs_hypnat(hypnatrel``{%n. X n})) =
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   403
      Abs_hypreal(hyprel `` {%n. f n (X n)})"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   404
apply (simp add: starfunNat_n_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   405
apply (rule_tac f = Abs_hypreal in arg_cong, auto, ultra)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   406
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   407
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   408
text{*Multiplication: @{text "( *fn) x ( *gn) = *(fn x gn)"}*}
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
   409
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   410
lemma starfunNat_n_mult:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   411
     "( *fNatn* f) z * ( *fNatn* g) z = ( *fNatn* (% i x. f i x * g i x)) z"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   412
apply (cases z)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   413
apply (simp add: starfunNat_n hypreal_mult)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   414
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   416
text{*Addition: @{text "( *fn) + ( *gn) = *(fn + gn)"}*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   417
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   418
lemma starfunNat_n_add:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   419
     "( *fNatn* f) z + ( *fNatn* g) z = ( *fNatn* (%i x. f i x + g i x)) z"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   420
apply (cases z)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   421
apply (simp add: starfunNat_n hypreal_add)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   422
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   423
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   424
text{*Subtraction: @{text "( *fn) - ( *gn) = *(fn + - gn)"}*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   425
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   426
lemma starfunNat_n_add_minus:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   427
     "( *fNatn* f) z + -( *fNatn* g) z = ( *fNatn* (%i x. f i x + -g i x)) z"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   428
apply (cases z)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   429
apply (simp add: starfunNat_n hypreal_minus hypreal_add)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   430
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   431
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   432
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   433
text{*Composition: @{text "( *fn) o ( *gn) = *(fn o gn)"}*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   434
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   435
lemma starfunNat_n_const_fun [simp]:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   436
     "( *fNatn* (%i x. k)) z = hypreal_of_real  k"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   437
apply (cases z)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   438
apply (simp add: starfunNat_n hypreal_of_real_def)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   439
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   440
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   441
lemma starfunNat_n_minus: "- ( *fNatn* f) x = ( *fNatn* (%i x. - (f i) x)) x"
14468
6be497cacab5 heavy tidying
paulson
parents: 14415
diff changeset
   442
apply (cases x)
14415
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   443
apply (simp add: starfunNat_n hypreal_minus)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   444
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   445
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   446
lemma starfunNat_n_eq [simp]:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   447
     "( *fNatn* f) (hypnat_of_nat n) = Abs_hypreal(hyprel `` {%i. f i n})"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   448
by (simp add: starfunNat_n hypnat_of_nat_eq)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   449
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   450
lemma starfun_eq_iff: "(( *fNat* f) = ( *fNat* g)) = (f = g)"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   451
apply auto
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   452
apply (rule ext, rule ccontr)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   453
apply (drule_tac x = "hypnat_of_nat (x) " in fun_cong)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   454
apply (simp add: starfunNat hypnat_of_nat_eq)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   455
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   456
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   457
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   458
lemma starfunNat_inverse_real_of_nat_Infinitesimal [simp]:
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   459
     "N \<in> HNatInfinite ==> ( *fNat* (%x. inverse (real x))) N \<in> Infinitesimal"
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   460
apply (rule_tac f1 = inverse in starfun_stafunNat_o2 [THEN subst])
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   461
apply (subgoal_tac "hypreal_of_hypnat N ~= 0")
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   462
apply (simp_all add: HNatInfinite_not_eq_zero starfunNat_real_of_nat)
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   463
done
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   464
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   465
ML
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   466
{*
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   467
val starsetNat_def = thm "starsetNat_def";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   468
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   469
val NatStar_real_set = thm "NatStar_real_set";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   470
val NatStar_empty_set = thm "NatStar_empty_set";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   471
val NatStar_Un = thm "NatStar_Un";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   472
val starsetNat_n_Un = thm "starsetNat_n_Un";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   473
val InternalNatSets_Un = thm "InternalNatSets_Un";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   474
val NatStar_Int = thm "NatStar_Int";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   475
val starsetNat_n_Int = thm "starsetNat_n_Int";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   476
val InternalNatSets_Int = thm "InternalNatSets_Int";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   477
val NatStar_Compl = thm "NatStar_Compl";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   478
val starsetNat_n_Compl = thm "starsetNat_n_Compl";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   479
val InternalNatSets_Compl = thm "InternalNatSets_Compl";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   480
val starsetNat_n_diff = thm "starsetNat_n_diff";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   481
val InternalNatSets_diff = thm "InternalNatSets_diff";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   482
val NatStar_subset = thm "NatStar_subset";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   483
val NatStar_mem = thm "NatStar_mem";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   484
val NatStar_hypreal_of_real_image_subset = thm "NatStar_hypreal_of_real_image_subset";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   485
val NatStar_SHNat_subset = thm "NatStar_SHNat_subset";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   486
val NatStar_hypreal_of_real_Int = thm "NatStar_hypreal_of_real_Int";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   487
val starsetNat_starsetNat_n_eq = thm "starsetNat_starsetNat_n_eq";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   488
val InternalNatSets_starsetNat_n = thm "InternalNatSets_starsetNat_n";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   489
val InternalNatSets_UNIV_diff = thm "InternalNatSets_UNIV_diff";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   490
val starsetNat_n_starsetNat = thm "starsetNat_n_starsetNat";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   491
val starfunNat_n_starfunNat = thm "starfunNat_n_starfunNat";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   492
val starfunNat2_n_starfunNat2 = thm "starfunNat2_n_starfunNat2";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   493
val starfunNat_congruent = thm "starfunNat_congruent";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   494
val starfunNat = thm "starfunNat";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   495
val starfunNat2 = thm "starfunNat2";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   496
val starfunNat_mult = thm "starfunNat_mult";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   497
val starfunNat2_mult = thm "starfunNat2_mult";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   498
val starfunNat_add = thm "starfunNat_add";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   499
val starfunNat2_add = thm "starfunNat2_add";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   500
val starfunNat2_minus = thm "starfunNat2_minus";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   501
val starfunNatNat2_o = thm "starfunNatNat2_o";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   502
val starfunNatNat2_o2 = thm "starfunNatNat2_o2";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   503
val starfunNat2_o = thm "starfunNat2_o";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   504
val starfun_stafunNat_o = thm "starfun_stafunNat_o";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   505
val starfun_stafunNat_o2 = thm "starfun_stafunNat_o2";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   506
val starfunNat_const_fun = thm "starfunNat_const_fun";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   507
val starfunNat2_const_fun = thm "starfunNat2_const_fun";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   508
val starfunNat_minus = thm "starfunNat_minus";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   509
val starfunNat_inverse = thm "starfunNat_inverse";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   510
val starfunNat_eq = thm "starfunNat_eq";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   511
val starfunNat2_eq = thm "starfunNat2_eq";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   512
val starfunNat_approx = thm "starfunNat_approx";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   513
val starfun_le_mono = thm "starfun_le_mono";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   514
val starfun_less_mono = thm "starfun_less_mono";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   515
val starfunNat_shift_one = thm "starfunNat_shift_one";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   516
val starfunNat_rabs = thm "starfunNat_rabs";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   517
val starfunNat_pow = thm "starfunNat_pow";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   518
val starfunNat_pow2 = thm "starfunNat_pow2";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   519
val starfun_pow = thm "starfun_pow";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   520
val starfunNat_real_of_nat = thm "starfunNat_real_of_nat";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   521
val starfunNat_inverse_real_of_nat_eq = thm "starfunNat_inverse_real_of_nat_eq";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   522
val starfunNat_n_congruent = thm "starfunNat_n_congruent";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   523
val starfunNat_n = thm "starfunNat_n";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   524
val starfunNat_n_mult = thm "starfunNat_n_mult";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   525
val starfunNat_n_add = thm "starfunNat_n_add";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   526
val starfunNat_n_add_minus = thm "starfunNat_n_add_minus";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   527
val starfunNat_n_const_fun = thm "starfunNat_n_const_fun";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   528
val starfunNat_n_minus = thm "starfunNat_n_minus";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   529
val starfunNat_n_eq = thm "starfunNat_n_eq";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   530
val starfun_eq_iff = thm "starfun_eq_iff";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   531
val starfunNat_inverse_real_of_nat_Infinitesimal = thm "starfunNat_inverse_real_of_nat_Infinitesimal";
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   532
*}
60aa114e2dba converted Hyperreal/NatStar to Isar script
paulson
parents: 10834
diff changeset
   533
14641
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   534
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   535
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   536
subsection{*Nonstandard Characterization of Induction*}
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   537
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   538
constdefs
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   539
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   540
  starPNat :: "(nat => bool) => hypnat => bool"  ("*pNat* _" [80] 80)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   541
  "*pNat* P == (%x. \<exists>X. (X \<in> Rep_hypnat(x) &
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   542
                      {n. P(X n)} \<in> FreeUltrafilterNat))"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   543
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   544
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   545
  starPNat2 :: "(nat => nat => bool) => hypnat =>hypnat => bool"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   546
               ("*pNat2* _" [80] 80)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   547
  "*pNat2* P == (%x y. \<exists>X. \<exists>Y. (X \<in> Rep_hypnat(x) & Y \<in> Rep_hypnat(y) &
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   548
                      {n. P(X n) (Y n)} \<in> FreeUltrafilterNat))"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   549
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   550
  hSuc :: "hypnat => hypnat"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   551
  "hSuc n == n + 1"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   552
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   553
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   554
lemma starPNat:
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   555
     "(( *pNat* P) (Abs_hypnat(hypnatrel``{%n. X n}))) =
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   556
      ({n. P (X n)} \<in> FreeUltrafilterNat)"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   557
by (auto simp add: starPNat_def, ultra)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   558
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   559
lemma starPNat_hypnat_of_nat [simp]: "( *pNat* P) (hypnat_of_nat n) = P n"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   560
by (auto simp add: starPNat hypnat_of_nat_eq)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   561
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   562
lemma hypnat_induct_obj:
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   563
    "(( *pNat* P) 0 &
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   564
            (\<forall>n. ( *pNat* P)(n) --> ( *pNat* P)(n + 1)))
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   565
       --> ( *pNat* P)(n)"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   566
apply (cases n)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   567
apply (auto simp add: hypnat_zero_def hypnat_one_def starPNat, ultra)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   568
apply (erule nat_induct)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   569
apply (drule_tac x = "hypnat_of_nat n" in spec)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   570
apply (rule ccontr)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   571
apply (auto simp add: starPNat hypnat_of_nat_eq hypnat_add)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   572
done
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   573
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   574
lemma hypnat_induct:
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   575
  "[| ( *pNat* P) 0;
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   576
      !!n. ( *pNat* P)(n) ==> ( *pNat* P)(n + 1)|]
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   577
     ==> ( *pNat* P)(n)"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   578
by (insert hypnat_induct_obj [of P n], auto)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   579
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   580
lemma starPNat2:
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   581
"(( *pNat2* P) (Abs_hypnat(hypnatrel``{%n. X n}))
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   582
             (Abs_hypnat(hypnatrel``{%n. Y n}))) =
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   583
      ({n. P (X n) (Y n)} \<in> FreeUltrafilterNat)"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   584
by (auto simp add: starPNat2_def, ultra)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   585
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   586
lemma starPNat2_eq_iff: "( *pNat2* (op =)) = (op =)"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   587
apply (simp add: starPNat2_def)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   588
apply (rule ext)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   589
apply (rule ext)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   590
apply (rule_tac z = x in eq_Abs_hypnat)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   591
apply (rule_tac z = y in eq_Abs_hypnat)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   592
apply (auto, ultra)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   593
done
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   594
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   595
lemma starPNat2_eq_iff2: "( *pNat2* (%x y. x = y)) X Y = (X = Y)"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   596
by (simp add: starPNat2_eq_iff)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   597
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   598
lemma lemma_hyp: "(\<exists>h. P(h::hypnat)) = (\<exists>x. P(Abs_hypnat(hypnatrel `` {x})))"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   599
apply auto
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   600
apply (rule_tac z = h in eq_Abs_hypnat, auto)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   601
done
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   602
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   603
lemma hSuc_not_zero [iff]: "hSuc m \<noteq> 0"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   604
by (simp add: hSuc_def)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   605
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   606
lemmas zero_not_hSuc = hSuc_not_zero [THEN not_sym, standard, iff]
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   607
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   608
lemma hSuc_hSuc_eq [iff]: "(hSuc m = hSuc n) = (m = n)"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   609
by (simp add: hSuc_def hypnat_one_def)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   610
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   611
lemma nonempty_nat_set_Least_mem: "c \<in> (S :: nat set) ==> (LEAST n. n  \<in> S)  \<in> S"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   612
by (erule LeastI)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   613
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   614
lemma nonempty_InternalNatSet_has_least:
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   615
    "[| S \<in> InternalNatSets; S \<noteq> {} |] ==> \<exists>n \<in> S. \<forall>m \<in> S. n \<le> m"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   616
apply (auto simp add: InternalNatSets_def starsetNat_n_def lemma_hyp)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   617
apply (rule_tac z = x in eq_Abs_hypnat)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   618
apply (auto dest!: bspec simp add: hypnat_le)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   619
apply (drule_tac x = "%m. LEAST n. n \<in> As m" in spec, auto)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   620
apply (ultra, force dest: nonempty_nat_set_Least_mem)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   621
apply (drule_tac x = x in bspec, auto)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   622
apply (ultra, auto intro: Least_le)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   623
done
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   624
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   625
text{* Goldblatt page 129 Thm 11.3.2*}
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   626
lemma internal_induct:
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   627
     "[| X \<in> InternalNatSets; 0 \<in> X; \<forall>n. n \<in> X --> n + 1 \<in> X |]
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   628
      ==> X = (UNIV:: hypnat set)"
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   629
apply (rule ccontr)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   630
apply (frule InternalNatSets_Compl)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   631
apply (drule_tac S = "- X" in nonempty_InternalNatSet_has_least, auto)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   632
apply (subgoal_tac "1 \<le> n")
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   633
apply (drule_tac x = "n - 1" in bspec, safe)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   634
apply (drule_tac x = "n - 1" in spec)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   635
apply (drule_tac [2] c = 1 and a = n in add_right_mono)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   636
apply (auto simp add: linorder_not_less [symmetric] iff del: hypnat_neq0_conv)
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   637
done
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   638
79b7bd936264 moved Complex/NSInduct and Hyperreal/IntFloor to more appropriate
paulson
parents: 14468
diff changeset
   639
10751
a81ea5d3dd41 separation of HOL-Hyperreal from HOL-Real
paulson
parents:
diff changeset
   640
end