(* Title: HOL/Nonstandard_Analysis/HyperNat.thy Author: Jacques D. Fleuriot Copyright: 1998 University of Cambridge Converted to Isar and polished by lcp *)
lemma hypnat_le0 [iff]: "∧n::hypnat. 0 ≤ n" by transfer (rule le0)
lemma hypnat_le_add1 [simp]: "∧x n::hypnat. x ≤ x + n" by transfer (rule le_add1)
lemma hypnat_add_self_le [simp]: "∧x n::hypnat. x ≤ n + x" by transfer (rule le_add2)
lemma hypnat_add_one_self_less [simp]: "x < x + 1"for x :: hypnat by (fact less_add_one)
lemma hypnat_neq0_conv [iff]: "∧n::hypnat. n ≠ 0 ⟷ 0 < n" by transfer (rule neq0_conv)
lemma hypnat_gt_zero_iff: "0 < n ⟷ 1 ≤ n"for n :: hypnat by (auto simp add: linorder_not_less [symmetric])
lemma hypnat_gt_zero_iff2: "0 < n ⟷ (∃m. n = m + 1)"for n :: hypnat by (auto intro!: add_nonneg_pos exI[of _ "n - 1"] simp: hypnat_gt_zero_iff)
lemma hypnat_add_self_not_less: "¬ x + y < x"for x y :: hypnat by (simp add: linorder_not_le [symmetric] add.commute [of x])
lemma hypnat_diff_split: "P (a - b) ⟷ (a < b ⟶ P 0) ∧ (∀d. a = b + d ⟶ P d)" for a b :: hypnat 🍋‹elimination of ‹-›on ‹hypnat›\› proof (cases "a < b" rule: case_split) case True thenshow ?thesis by (auto simp add: hypnat_add_self_not_less order_less_imp_le hypnat_diff_is_0_eq [THENiffD2]) next case False thenshow ?thesis by (auto simp add: linorder_not_less dest: order_le_less_trans) qed
subsection‹Properties of the set of embedded natural numbers›
lemma of_nat_eq_star_of [simp]: "of_nat = star_of" proof show"of_nat n = star_of n"for n by transfer simp qed
lemma Nats_eq_Standard: "(Nats :: nat star set) = Standard" by (auto simp: Nats_def Standard_def)
lemma hypnat_of_nat_mem_Nats [simp]: "hypnat_of_nat n ∈ Nats" by (simp add: Nats_eq_Standard)
lemma hypnat_of_nat_one [simp]: "hypnat_of_nat (Suc 0) = 1" by transfer simp
lemma hypnat_of_nat_Suc [simp]: "hypnat_of_nat (Suc n) = hypnat_of_nat n + 1" by transfer simp
lemma of_nat_eq_add: fixes d::hypnat shows"of_nat m = of_nat n + d ==> d ∈ range of_nat" proof (induct n arbitrary: d) case (Suc n) thenshow ?case by (metis Nats_def Nats_eq_Standard Standard_simps(4) hypnat_diff_add_inverse of_nat_in_Nats) qed auto
lemma Nats_diff [simp]: "a ∈ Nats ==> b ∈ Nats ==> a - b ∈ Nats"for a b :: hypnat by (simp add: Nats_eq_Standard)
text‹The set of infinite hypernatural numbers.› definition HNatInfinite :: "hypnat set" where"HNatInfinite = {n. n ∉ Nats}"
lemma Nats_not_HNatInfinite_iff: "x ∈ Nats ⟷ x ∉ HNatInfinite" by (simp add: HNatInfinite_def)
lemma HNatInfinite_not_Nats_iff: "x ∈ HNatInfinite ⟷ x ∉ Nats" by (simp add: HNatInfinite_def)
lemma star_of_neq_HNatInfinite: "N ∈ HNatInfinite ==> star_of n ≠ N" by (auto simp add: HNatInfinite_def Nats_eq_Standard)
lemma star_of_Suc_lessI: "∧N. star_of n < N ==> star_of (Suc n) ≠ N ==> star_of (Suc n) < N" by transfer (rule Suc_lessI)
lemma star_of_less_HNatInfinite: assumes N: "N ∈ HNatInfinite" shows"star_of n < N" proof (induct n) case 0 from N have"star_of 0 ≠ N" by (rule star_of_neq_HNatInfinite) thenshow ?caseby simp next case (Suc n) from N have"star_of (Suc n) ≠ N" by (rule star_of_neq_HNatInfinite) with Suc show ?case by (rule star_of_Suc_lessI) qed
lemma star_of_le_HNatInfinite: "N ∈ HNatInfinite ==> star_of n ≤ N" by (rule star_of_less_HNatInfinite [THEN order_less_imp_le])
subsubsection ‹Closure Rules›
lemma Nats_less_HNatInfinite: "x ∈ Nats ==> y ∈ HNatInfinite ==> x < y" by (auto simp add: Nats_def star_of_less_HNatInfinite)
lemma Nats_le_HNatInfinite: "x ∈ Nats ==> y ∈ HNatInfinite ==> x ≤ y" by (rule Nats_less_HNatInfinite [THEN order_less_imp_le])
lemma zero_not_mem_HNatInfinite [simp]: "0 ∉ HNatInfinite" by (simp add: HNatInfinite_def)
lemma Nats_downward_closed: "x ∈ Nats ==> y ≤ x ==> y ∈ Nats"for x y :: hypnat using HNatInfinite_not_Nats_iff Nats_le_HNatInfinite by fastforce
lemma HNatInfinite_upward_closed: "x ∈ HNatInfinite ==> x ≤ y ==> y ∈ HNatInfinite" using HNatInfinite_not_Nats_iff Nats_downward_closed by blast
lemma HNatInfinite_add: "x ∈ HNatInfinite ==> x + y ∈ HNatInfinite" using HNatInfinite_upward_closed hypnat_le_add1 by blast
lemma HNatInfinite_diff: "[x ∈ HNatInfinite; y ∈ Nats]==> x - y ∈ HNatInfinite" by (metis HNatInfinite_not_Nats_iff Nats_add Nats_le_HNatInfinite le_add_diff_inverse)
lemma HNatInfinite_is_Suc: "x ∈ HNatInfinite ==>∃y. x = y + 1"for x :: hypnat using hypnat_gt_zero_iff2 zero_less_HNatInfinite by blast
subsection‹Existence of an infinite hypernatural number›
text‹‹ψ›is in fact an infinite hypernatural number = ‹[🚫 2, 3, …>]›\› definition whn :: hypnat where hypnat_omega_def: "whn = star_n (λn::nat. n)"
lemma hypnat_of_nat_neq_whn: "hypnat_of_nat n ≠ whn" by (simp add: FreeUltrafilterNat.singleton' hypnat_omega_def star_of_def star_n_eq_iff)
lemma HNatInfinite_whn [simp]: "whn ∈ HNatInfinite" by (simp add: HNatInfinite_def)
lemma lemma_unbounded_set [simp]: "eventually (λn::nat. m < n) U" by (rule filter_leD[OF FreeUltrafilterNat.le_cofinite])
(auto simp add: cofinite_eq_sequentially eventually_at_top_dense)
lemma hypnat_of_nat_eq: "hypnat_of_nat m = star_n (λn::nat. m)" by (simp add: star_of_def)
lemma SHNat_eq: "Nats = {n. ∃N. n = hypnat_of_nat N}" by (simp add: Nats_def image_def)
lemma Nats_less_whn: "n ∈ Nats ==> n < whn" by (simp add: Nats_less_HNatInfinite)
lemma Nats_le_whn: "n ∈ Nats ==> n ≤ whn" by (simp add: Nats_le_HNatInfinite)
lemma hypnat_of_nat_less_whn [simp]: "hypnat_of_nat n < whn" by (simp add: Nats_less_whn)
lemma hypnat_of_nat_le_whn [simp]: "hypnat_of_nat n ≤ whn" by (simp add: Nats_le_whn)
lemma hypnat_zero_less_hypnat_omega [simp]: "0 < whn" by (simp add: Nats_less_whn)
lemma hypnat_one_less_hypnat_omega [simp]: "1 < whn" by (simp add: Nats_less_whn)
subsubsection ‹Alternative characterization of the set of infinite hypernaturals›
text‹🍋‹HNatInfinite = {N. ∀n ∈ Nats. n 🚫}›\›
text‹unused, but possibly interesting› lemma HNatInfinite_FreeUltrafilterNat_eventually: assumes"∧k::nat. eventually (λn. f n ≠ k) U" shows"eventually (λn. m < f n) U" proof (induct m) case 0 thenshow ?case using assms eventually_mono by fastforce next case (Suc m) thenshow ?case using assms [of "Suc m"] eventually_elim2 by fastforce qed
lemma HNatInfinite_iff: "HNatInfinite = {N. ∀n ∈ Nats. n < N}" using HNatInfinite_def Nats_less_HNatInfinite by auto
subsubsection ‹Alternative Characterization of 🍋‹HNatInfinite›using Free Ultrafilter›
lemma HNatInfinite_FreeUltrafilterNat: "star_n X ∈ HNatInfinite ==>∀u. eventually (λn. u < X n) U" by (metis (full_types) starP2_star_of starP_star_n star_less_def star_of_less_HNatInfinite)
lemma FreeUltrafilterNat_HNatInfinite: "∀u. eventually (λn. u < X n) U==> star_n X ∈ HNatInfinite" by (auto simp add: star_less_def starP2_star_n HNatInfinite_iff SHNat_eq hypnat_of_nat_eq)
lemma HNatInfinite_FreeUltrafilterNat_iff: "(star_n X ∈ HNatInfinite) = (∀u. eventually (λn. u < X n) U)" by (rule iffI [OF HNatInfinite_FreeUltrafilterNat FreeUltrafilterNat_HNatInfinite])
subsection‹Embedding of the Hypernaturals into other types›
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.