src/HOL/Complex/NSInduct.thy
author paulson
Mon, 15 Mar 2004 10:58:29 +0100
changeset 14469 c7674b7034f5
parent 14409 91181ee5860c
permissions -rw-r--r--
heavy tidying
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
     1
(*  Title:       NSInduct.thy
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
     2
    Author:      Jacques D. Fleuriot
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
     3
    Copyright:   2001  University of Edinburgh
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
     4
*)
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
     5
14409
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
     6
header{*Nonstandard Characterization of Induction*}
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
     7
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
     8
theory NSInduct =  Complex:
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
     9
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    10
constdefs
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    11
14409
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    12
  starPNat :: "(nat => bool) => hypnat => bool"  ("*pNat* _" [80] 80)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    13
  "*pNat* P == (%x. \<exists>X. (X \<in> Rep_hypnat(x) &
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    14
                      {n. P(X n)} \<in> FreeUltrafilterNat))"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    15
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    16
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    17
  starPNat2 :: "(nat => nat => bool) => hypnat =>hypnat => bool"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    18
               ("*pNat2* _" [80] 80)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    19
  "*pNat2* P == (%x y. \<exists>X. \<exists>Y. (X \<in> Rep_hypnat(x) & Y \<in> Rep_hypnat(y) &
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    20
                      {n. P(X n) (Y n)} \<in> FreeUltrafilterNat))"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    21
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    22
  hSuc :: "hypnat => hypnat"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    23
  "hSuc n == n + 1"
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    24
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    25
14409
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    26
lemma starPNat:
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    27
     "(( *pNat* P) (Abs_hypnat(hypnatrel``{%n. X n}))) =
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    28
      ({n. P (X n)} \<in> FreeUltrafilterNat)"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    29
by (auto simp add: starPNat_def, ultra)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    30
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    31
lemma starPNat_hypnat_of_nat [simp]: "( *pNat* P) (hypnat_of_nat n) = P n"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    32
by (auto simp add: starPNat hypnat_of_nat_eq)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    33
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    34
lemma hypnat_induct_obj:
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    35
    "(( *pNat* P) 0 &
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    36
            (\<forall>n. ( *pNat* P)(n) --> ( *pNat* P)(n + 1)))
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    37
       --> ( *pNat* P)(n)"
14469
c7674b7034f5 heavy tidying
paulson
parents: 14409
diff changeset
    38
apply (cases n)
14409
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    39
apply (auto simp add: hypnat_zero_def hypnat_one_def starPNat, ultra)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    40
apply (erule nat_induct)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    41
apply (drule_tac x = "hypnat_of_nat n" in spec)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    42
apply (rule ccontr)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    43
apply (auto simp add: starPNat hypnat_of_nat_eq hypnat_add)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    44
done
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    45
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    46
lemma hypnat_induct:
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    47
  "[| ( *pNat* P) 0;
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    48
      !!n. ( *pNat* P)(n) ==> ( *pNat* P)(n + 1)|]
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    49
     ==> ( *pNat* P)(n)"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    50
by (insert hypnat_induct_obj [of P n], auto)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    51
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    52
lemma starPNat2:
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    53
"(( *pNat2* P) (Abs_hypnat(hypnatrel``{%n. X n}))
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    54
             (Abs_hypnat(hypnatrel``{%n. Y n}))) =
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    55
      ({n. P (X n) (Y n)} \<in> FreeUltrafilterNat)"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    56
by (auto simp add: starPNat2_def, ultra)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    57
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    58
lemma starPNat2_eq_iff: "( *pNat2* (op =)) = (op =)"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    59
apply (simp add: starPNat2_def)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    60
apply (rule ext)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    61
apply (rule ext)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    62
apply (rule_tac z = x in eq_Abs_hypnat)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    63
apply (rule_tac z = y in eq_Abs_hypnat)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    64
apply (auto, ultra)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    65
done
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    66
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    67
lemma starPNat2_eq_iff2: "( *pNat2* (%x y. x = y)) X Y = (X = Y)"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    68
by (simp add: starPNat2_eq_iff)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    69
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    70
lemma lemma_hyp: "(\<exists>h. P(h::hypnat)) = (\<exists>x. P(Abs_hypnat(hypnatrel `` {x})))"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    71
apply auto
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    72
apply (rule_tac z = h in eq_Abs_hypnat, auto)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    73
done
13957
10dbf16be15f new session Complex for the complex numbers
paulson
parents:
diff changeset
    74
14409
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    75
lemma hSuc_not_zero [iff]: "hSuc m \<noteq> 0"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    76
by (simp add: hSuc_def)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    77
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    78
lemmas zero_not_hSuc = hSuc_not_zero [THEN not_sym, standard, iff]
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    79
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    80
lemma hSuc_hSuc_eq [iff]: "(hSuc m = hSuc n) = (m = n)"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    81
by (simp add: hSuc_def hypnat_one_def)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    82
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    83
lemma nonempty_nat_set_Least_mem: "c \<in> (S :: nat set) ==> (LEAST n. n  \<in> S)  \<in> S"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    84
by (erule LeastI)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    85
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    86
lemma nonempty_InternalNatSet_has_least:
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    87
    "[| S \<in> InternalNatSets; S \<noteq> {} |] ==> \<exists>n \<in> S. \<forall>m \<in> S. n \<le> m"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    88
apply (auto simp add: InternalNatSets_def starsetNat_n_def lemma_hyp)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    89
apply (rule_tac z = x in eq_Abs_hypnat)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    90
apply (auto dest!: bspec simp add: hypnat_le)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    91
apply (drule_tac x = "%m. LEAST n. n \<in> As m" in spec, auto)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    92
apply (ultra, force dest: nonempty_nat_set_Least_mem)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    93
apply (drule_tac x = x in bspec, auto)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    94
apply (ultra, auto intro: Least_le)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    95
done
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    96
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    97
text{* Goldblatt page 129 Thm 11.3.2*}
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    98
lemma internal_induct:
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
    99
     "[| X \<in> InternalNatSets; 0 \<in> X; \<forall>n. n \<in> X --> n + 1 \<in> X |]
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   100
      ==> X = (UNIV:: hypnat set)"
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   101
apply (rule ccontr)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   102
apply (frule InternalNatSets_Compl)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   103
apply (drule_tac S = "- X" in nonempty_InternalNatSet_has_least, auto)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   104
apply (subgoal_tac "1 \<le> n")
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   105
apply (drule_tac x = "n - 1" in bspec, safe)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   106
apply (drule_tac x = "n - 1" in spec)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   107
apply (drule_tac [2] c = 1 and a = n in add_right_mono)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   108
apply (auto simp add: linorder_not_less [symmetric] iff del: hypnat_neq0_conv)
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   109
done
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   110
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   111
ML
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   112
{*
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   113
val starPNat = thm "starPNat";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   114
val starPNat_hypnat_of_nat = thm "starPNat_hypnat_of_nat";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   115
val hypnat_induct = thm "hypnat_induct";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   116
val starPNat2 = thm "starPNat2";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   117
val starPNat2_eq_iff = thm "starPNat2_eq_iff";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   118
val starPNat2_eq_iff2 = thm "starPNat2_eq_iff2";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   119
val hSuc_not_zero = thm "hSuc_not_zero";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   120
val zero_not_hSuc = thms "zero_not_hSuc";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   121
val hSuc_hSuc_eq = thm "hSuc_hSuc_eq";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   122
val nonempty_nat_set_Least_mem = thm "nonempty_nat_set_Least_mem";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   123
val nonempty_InternalNatSet_has_least = thm "nonempty_InternalNatSet_has_least";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   124
val internal_induct = thm "internal_induct";
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   125
*}
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   126
91181ee5860c converted HOL/Complex/NSInduct to Isar script
paulson
parents: 14387
diff changeset
   127
end