Theory WO1_AC
theory WO1_AC
imports AC_Equiv
begin
theorem WO1_AC1: "WO1 ⟹ AC1"
by (unfold AC1_def WO1_def, fast elim!: ex_choice_fun)
lemma lemma1: "⟦WO1; ∀B ∈ A. ∃C ∈ D(B). P(C,B)⟧ ⟹ ∃f. ∀B ∈ A. P(f`B,B)"
unfolding WO1_def
apply (erule_tac x = "⋃({{C ∈ D (B) . P (C,B) }. B ∈ A}) " in allE)
apply (erule exE, drule ex_choice_fun, fast)
apply (erule exE)
apply (rule_tac x = "λx ∈ A. f`{C ∈ D (x) . P (C,x) }" in exI)
apply (simp, blast dest!: apply_type [OF _ RepFunI])
done
lemma lemma2_1: "⟦¬Finite(B); WO1⟧ ⟹ |B| + |B| ≈ B"
unfolding WO1_def
apply (rule eqpoll_trans)
prefer 2 apply (fast elim!: well_ord_cardinal_eqpoll)
apply (rule eqpoll_sym [THEN eqpoll_trans])
apply (fast elim!: well_ord_cardinal_eqpoll)
apply (drule spec [of _ B])
apply (clarify dest!: eqpoll_imp_Finite_iff [OF well_ord_cardinal_eqpoll])
apply (simp add: cadd_def [symmetric]
eqpoll_refl InfCard_cdouble_eq Card_cardinal Inf_Card_is_InfCard)
done
lemma lemma2_2:
"f ∈ bij(D+D, B) ⟹ {{f`Inl(i), f`Inr(i)}. i ∈ D} ∈ Pow(Pow(B))"
by (fast elim!: bij_is_fun [THEN apply_type])
lemma lemma2_3:
"f ∈ bij(D+D, B) ⟹ pairwise_disjoint({{f`Inl(i), f`Inr(i)}. i ∈ D})"
unfolding pairwise_disjoint_def
apply (blast dest: bij_is_inj [THEN inj_apply_equality])
done
lemma lemma2_4:
"⟦f ∈ bij(D+D, B); 1≤n⟧
⟹ sets_of_size_between({{f`Inl(i), f`Inr(i)}. i ∈ D}, 2, succ(n))"
apply (simp (no_asm_simp) add: sets_of_size_between_def succ_def)
apply (blast intro!: cons_lepoll_cong
intro: singleton_eqpoll_1 [THEN eqpoll_imp_lepoll]
le_imp_subset [THEN subset_imp_lepoll] lepoll_trans
dest: bij_is_inj [THEN inj_apply_equality] elim!: mem_irrefl)
done
lemma lemma2_5:
"f ∈ bij(D+D, B) ⟹ ⋃({{f`Inl(i), f`Inr(i)}. i ∈ D})=B"
unfolding bij_def surj_def
apply (fast elim!: inj_is_fun [THEN apply_type])
done
lemma lemma2:
"⟦WO1; ¬Finite(B); 1≤n⟧
⟹ ∃C ∈ Pow(Pow(B)). pairwise_disjoint(C) ∧
sets_of_size_between(C, 2, succ(n)) ∧
⋃(C)=B"
apply (drule lemma2_1 [THEN eqpoll_def [THEN def_imp_iff, THEN iffD1]],
assumption)
apply (blast intro!: lemma2_2 lemma2_3 lemma2_4 lemma2_5)
done
theorem WO1_AC10: "⟦WO1; 1≤n⟧ ⟹ AC10(n)"
unfolding AC10_def
apply (fast intro!: lemma1 elim!: lemma2)
done
end