lemma oSuc_less_oSuc [iff]: "(oSuc x < oSuc y) = (x < y)" by (simp add: less_oSuc_eq_le oSuc_le_eq_less)
lemma oSuc_eq_oSuc [iff]: "(oSuc x = oSuc y) = (x = y)" by (metis less_oSuc less_oSuc_eq_le order_antisym)
lemma oSuc_le_oSuc [iff]: "(oSuc x ≤ oSuc y) = (x ≤ y)" by (simp add: order_le_less)
lemma le_oSucE: "[x ≤ oSuc y; x ≤ y ==> R; x = oSuc y ==> R]==> R" by (auto simp add: order_le_less less_oSuc_eq_le)
lemma less_oSucE: "[x < oSuc y; x < y ==> P; x = y ==> P]==> P" by (auto simp add: less_oSuc_eq_le order_le_less)
subsection‹Strict monotonicity›
locale strict_mono = fixes f assumes strict_mono: "A < B ==> f A < f B"
lemmas strict_monoI = strict_mono.intro and strict_monoD = strict_mono.strict_mono
lemma strict_mono_natI: fixes f :: "nat ==> 'a::order" shows"(∧n. f n < f (Suc n)) ==> strict_mono f" using OrdinalInduct.strict_monoI lift_Suc_mono_less by blast
lemma mono_natI: fixes f :: "nat ==> 'a::order" shows"(∧n. f n ≤ f (Suc n)) ==> mono f" by (simp add: mono_iff_le_Suc)
lemma strict_mono_mono: fixes f :: "'a::order ==> 'b::order" shows"strict_mono f ==> mono f" by (auto intro!: monoI simp add: order_le_less strict_monoD)
lemma strict_mono_monoD: fixes f :: "'a::order ==> 'b::order" shows"[strict_mono f; A ≤ B]==> f A ≤ f B" by (rule monoD[OF strict_mono_mono])
lemma strict_mono_cancel_eq: fixes f :: "'a::linorder ==> 'b::linorder" shows"strict_mono f ==> (f x = f y) = (x = y)" by (metis OrdinalInduct.strict_monoD not_less_iff_gr_or_eq)
lemma strict_mono_cancel_less: fixes f :: "'a::linorder ==> 'b::linorder" shows"strict_mono f ==> (f x < f y) = (x < y)" using OrdinalInduct.strict_monoD linorder_neq_iff by fastforce
lemma strict_mono_cancel_le: fixes f :: "'a::linorder ==> 'b::linorder" shows"strict_mono f ==> (f x ≤ f y) = (x ≤ y)" by (meson linorder_not_less strict_mono_cancel_less)
subsection‹Limit ordinals›
definition
oLimit :: "(nat ==> ordinal) ==> ordinal"where "oLimit f = (LEAST k. ∀n. f n ≤ k)"
lemma oLimit_leI: "∀n. f n ≤ x ==> oLimit f ≤ x" by (simp add: oLimit_def wellorder_Least_lemma(2))
lemma le_oLimit [iff]: "f n ≤ oLimit f" by (smt (verit, best) LeastI_ex leD oLimit_def oStrictLimit_ub ordinal_linear)
lemma le_oLimitI: "x ≤ f n ==> x ≤ oLimit f" by (erule order_trans, rule le_oLimit)
lemma less_oLimitI: "x < f n ==> x < oLimit f" by (erule order_less_le_trans, rule le_oLimit)
lemma less_oLimitD: "x < oLimit f ==>∃n. x < f n" by (meson linorder_not_le oLimit_leI)
lemma less_oLimitE: "[x < oLimit f; ∧n. x < f n ==> P]==> P" by (auto dest: less_oLimitD)
lemma le_oLimitE: "[x ≤ oLimit f; ∧n. x ≤ f n ==> R; x = oLimit f ==> R]==> R" by (auto simp add: order_le_less dest: less_oLimitD)
lemma oSuc_less_limit_ordinal: "limit_ordinal x ==> (oSuc w < x) = (w < x)" by (metis limit_ordinal_not_oSuc oSuc_le_eq_less order_le_less)
lemma limit_ordinal_oLimitI: "∀n. f n < oLimit f ==> limit_ordinal (oLimit f)" by (metis less_oLimitD less_oSuc less_oSucE limit_ordinal_def order_less_imp_triv ordinal_neq_0)
lemma strict_mono_limit_ordinal: "strict_mono f ==> limit_ordinal (oLimit f)" by (simp add: limit_ordinal_oLimitI strict_mono_less_oLimit)
lemma limit_ordinalI: "[0 < z; ∀x<z. oSuc x < z]==> limit_ordinal z" using limit_ordinal_def by blast
subsubsection‹Making strict monotonic sequences›
primrec make_mono :: "(nat ==> ordinal) ==> nat ==> nat" where "make_mono f 0 = 0"
| "make_mono f (Suc n) = (LEAST x. f (make_mono f n) < f x)"
lemma f_make_mono_less: "∀n. f n < oLimit f ==> f (make_mono f n) < f (make_mono f (Suc n))" by (metis less_oLimitD make_mono.simps(2) wellorder_Least_lemma(1))
lemma strict_mono_f_make_mono: "∀n. f n < oLimit f ==> strict_mono (λn. f (make_mono f n))" by (rule strict_mono_natI, erule f_make_mono_less)
lemma le_f_make_mono: "[∀n. f n < oLimit f; m ≤ make_mono f n]==> f m ≤ f (make_mono f n)" apply (auto simp add: order_le_less) apply (case_tac n, simp_all) by (metis LeastI less_oLimitD linorder_le_less_linear not_less_Least order_le_less_trans)
lemma make_mono_less: "∀n. f n < oLimit f ==> make_mono f n < make_mono f (Suc n)" by (meson f_make_mono_less le_f_make_mono linorder_not_less)
declare make_mono.simps [simp del]
lemma oLimit_make_mono_eq: assumes"∀n. f n < oLimit f"shows"oLimit (λn. f (make_mono f n)) = oLimit f" proof - have"k ≤ make_mono f k"for k by (induction k) (auto simp: Suc_leI assms make_mono_less order_le_less_trans) thenshow ?thesis by (meson assms le_f_make_mono oLimit_eqI) qed
subsection‹Induction principle for ordinals›
lemma oLimit_le_oStrictLimit: "oLimit f ≤ oStrictLimit f" by (simp add: oLimit_leI oStrictLimit_ub order_less_imp_le)
lemma oLimit_induct [case_names zero suc lim]: assumes zero: "P 0" and suc: "∧x. P x ==> P (oSuc x)" and lim: "∧f. [strict_mono f; ∀n. P (f n)]==> P (oLimit f)" shows"P a" apply (rule oStrictLimit_induct) apply (rule zero[unfolded ordinal_zero_def]) apply (cut_tac f=f in oLimit_le_oStrictLimit) apply (simp add: order_le_less, erule disjE) apply (metis dual_order.order_iff_strict leD le_oLimit less_oStrictLimitD oSuc_le_eq_less suc) by (metis lim oLimit_make_mono_eq oStrictLimit_ub strict_mono_f_make_mono)
lemma ordinal_cases [case_names zero suc lim]: assumes zero: "a = 0 ==> P" and suc: "∧x. a = oSuc x ==> P" and lim: "∧f. [strict_mono f; a = oLimit f]==> P" shows"P" apply (subgoal_tac "∀x. a = x ⟶ P", force) apply (rule allI) apply (rule_tac a=x in oLimit_induct) apply (rule impI, erule zero) apply (rule impI, erule suc) apply (rule impI, erule lim, assumption) done
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.