# HG changeset patch # User paulson # Date 1556141343 -3600 # Node ID da497279f492b570f9760ba6396dc0d785913759 # Parent 49a65e3f04c94ea12d254b95d18fa3355769f644 getting rid of most apply steps diff -r 49a65e3f04c9 -r da497279f492 src/HOL/ex/Tarski.thy --- a/src/HOL/ex/Tarski.thy Mon Apr 22 09:33:55 2019 +0000 +++ b/src/HOL/ex/Tarski.thy Wed Apr 24 22:29:03 2019 +0100 @@ -100,24 +100,18 @@ assumes cl_co: "cl \ CompleteLattice" sublocale CL < po?: PO - apply (simp_all add: A_def r_def) - apply unfold_locales - using cl_co unfolding CompleteLattice_def - apply auto - done + unfolding A_def r_def + using CompleteLattice_def PO.intro cl_co by fastforce locale CLF = S + fixes f :: "'a \ 'a" and P :: "'a set" - assumes f_cl: "(cl, f) \ CLF_set" (*was the equivalent "f \ CLF_set``{cl}"*) + assumes f_cl: "(cl, f) \ CLF_set" defines P_def: "P \ fix f A" sublocale CLF < cl?: CL - apply (simp_all add: A_def r_def) - apply unfold_locales - using f_cl unfolding CLF_set_def - apply auto - done + unfolding A_def r_def CL_def + using CLF_set_def f_cl by blast locale Tarski = CLF + fixes Y :: "'a set" @@ -136,11 +130,10 @@ begin lemma dual: "PO (dual cl)" - apply unfold_locales - using cl_po - unfolding PartialOrder_def dual_def - apply auto - done +proof + show "dual cl \ PartialOrder" + using cl_po unfolding PartialOrder_def dual_def by auto +qed lemma PO_imp_refl_on [simp]: "refl_on A r" using cl_po by (simp add: PartialOrder_def A_def r_def) @@ -163,19 +156,20 @@ lemma monotoneE: "\monotone f A r; x \ A; y \ A; (x, y) \ r\ \ (f x, f y) \ r" by (simp add: monotone_def) -lemma po_subset_po: "S \ A \ \pset = S, order = induced S r\ \ PartialOrder" - apply (simp add: PartialOrder_def) - apply auto - \ \refl\ - apply (simp add: refl_on_def induced_def) - apply (blast intro: reflE) - \ \antisym\ - apply (simp add: antisym_def induced_def) - apply (blast intro: antisymE) - \ \trans\ - apply (simp add: trans_def induced_def) - apply (blast intro: transE) - done +lemma po_subset_po: + assumes "S \ A" shows "\pset = S, order = induced S r\ \ PartialOrder" +proof - + have "refl_on S (induced S r)" + using \S \ A\ by (auto simp: refl_on_def induced_def intro: reflE) + moreover + have "antisym (induced S r)" + by (auto simp add: antisym_def induced_def intro: antisymE) + moreover + have "trans (induced S r)" + by (auto simp add: trans_def induced_def intro: transE) + ultimately show ?thesis + by (simp add: PartialOrder_def) +qed lemma indE: "\(x, y) \ induced S r; S \ A\ \ (x, y) \ r" by (simp add: induced_def) @@ -206,17 +200,15 @@ using cl_po by (simp add: PartialOrder_def dual_def) lemma Rdual: - "\S. (S \ A \ (\L. isLub S \pset = A, order = r\ L)) - \ \S. S \ A \ (\G. isGlb S \pset = A, order = r\ G)" - apply safe - apply (rule_tac x = "lub {y. y \ A \ (\k \ S. (y, k) \ r)} \pset = A, order = r\" in exI) - apply (drule_tac x = "{y. y \ A \ (\k \ S. (y, k) \ r)}" in spec) - apply (drule mp) - apply fast - apply (simp add: isLub_lub isGlb_def) - apply (simp add: isLub_def) - apply blast - done + assumes major: "\S. S \ A \ \L. isLub S po L" and "S \ A" and "A = pset po" + shows "\G. isGlb S po G" +proof + show "isGlb S po (lub {y \ A. \k\S. (y, k) \ order po} po)" + using major [of "{y. y \ A \ (\k \ S. (y, k) \ order po)}"] \S \ A\ \A = pset po\ + apply (simp add: isLub_lub isGlb_def) + apply (auto simp add: isLub_def) + done +qed lemma lub_dual_glb: "lub S cl = glb S (dual cl)" by (simp add: lub_def glb_def least_def greatest_def dual_def converse_unfold) @@ -229,10 +221,6 @@ lemmas CL_imp_PO = CL_subset_PO [THEN subsetD] -(*declare CL_imp_PO [THEN PO.PO_imp_refl, simp] -declare CL_imp_PO [THEN PO.PO_imp_sym, simp] -declare CL_imp_PO [THEN PO.PO_imp_trans, simp]*) - context CL begin @@ -256,53 +244,36 @@ lemma (in CL) CL_dualCL: "dual cl \ CompleteLattice" using cl_co apply (simp add: CompleteLattice_def dual_def) - apply (fold dual_def) - apply (simp add: isLub_dual_isGlb [symmetric] isGlb_dual_isLub [symmetric] dualPO) + apply (simp add: dualPO flip: dual_def isLub_dual_isGlb isGlb_dual_isLub) done context PO begin -lemma dualA_iff: "pset (dual cl) = pset cl" +lemma dualA_iff [simp]: "pset (dual cl) = pset cl" by (simp add: dual_def) -lemma dualr_iff: "(x, y) \ (order (dual cl)) \ (y, x) \ order cl" +lemma dualr_iff [simp]: "(x, y) \ (order (dual cl)) \ (y, x) \ order cl" by (simp add: dual_def) lemma monotone_dual: "monotone f (pset cl) (order cl) \ monotone f (pset (dual cl)) (order(dual cl))" - by (simp add: monotone_def dualA_iff dualr_iff) + by (simp add: monotone_def) lemma interval_dual: "\x \ A; y \ A\ \ interval r x y = interval (order(dual cl)) y x" - apply (simp add: interval_def dualr_iff) - apply (fold r_def) - apply fast - done - -lemma trans: "(x, y) \ r \ (y, z) \ r \ (x, z) \ r" - using cl_po - apply (auto simp add: PartialOrder_def r_def) - unfolding trans_def - apply blast - done + unfolding interval_def dualr_iff by (auto simp flip: r_def) lemma interval_not_empty: "interval r a b \ {} \ (a, b) \ r" - by (simp add: interval_def) (use trans in blast) + by (simp add: interval_def) (use transE in blast) lemma interval_imp_mem: "x \ interval r a b \ (a, x) \ r" by (simp add: interval_def) lemma left_in_interval: "\a \ A; b \ A; interval r a b \ {}\ \ a \ interval r a b" - apply (simp (no_asm_simp) add: interval_def) - apply (simp add: interval_not_empty) - apply (simp add: reflE) - done + using interval_def interval_not_empty reflE by fastforce lemma right_in_interval: "\a \ A; b \ A; interval r a b \ {}\ \ b \ interval r a b" - apply (simp (no_asm_simp) add: interval_def) - apply (simp add: interval_not_empty) - apply (simp add: reflE) - done + by (simp add: A_def PO.dual PO.left_in_interval PO_axioms interval_dual) end @@ -318,12 +289,11 @@ by (simp add: sublattice_def A_def r_def) lemma (in CL) dual: "CL (dual cl)" - apply unfold_locales +proof + show "dual cl \ CompleteLattice" using cl_co - unfolding CompleteLattice_def - apply (simp add: dualPO isGlb_dual_isLub [symmetric] isLub_dual_isGlb [symmetric] dualA_iff) - done - + by (simp add: CompleteLattice_def dualPO flip: isGlb_dual_isLub isLub_dual_isGlb) +qed subsection \lub\ @@ -333,47 +303,46 @@ lemma lub_unique: "\S \ A; isLub S cl x; isLub S cl L\ \ x = L" by (rule antisymE) (auto simp add: isLub_def r_def) -lemma lub_upper: "\S \ A; x \ S\ \ (x, lub S cl) \ r" - apply (rule CL_imp_ex_isLub [THEN exE], assumption) - apply (unfold lub_def least_def) - apply (rule some_equality [THEN ssubst]) - apply (simp add: isLub_def) - apply (simp add: lub_unique A_def isLub_def) - apply (simp add: isLub_def r_def) - done +lemma lub_upper: + assumes "S \ A" "x \ S" shows "(x, lub S cl) \ r" +proof - + obtain L where "isLub S cl L" + using CL_imp_ex_isLub \S \ A\ by auto + then show ?thesis + by (metis assms(2) isLub_def isLub_lub r_def) +qed -lemma lub_least: "\S \ A; L \ A; \x \ S. (x, L) \ r\ \ (lub S cl, L) \ r" - apply (rule CL_imp_ex_isLub [THEN exE], assumption) - apply (unfold lub_def least_def) - apply (rule_tac s=x in some_equality [THEN ssubst]) - apply (simp add: isLub_def) - apply (simp add: lub_unique A_def isLub_def) - apply (simp add: isLub_def r_def A_def) - done +lemma lub_least: + assumes "S \ A" and L: "L \ A" "\x \ S. (x, L) \ r" shows "(lub S cl, L) \ r" +proof - + obtain L' where "isLub S cl L'" + using CL_imp_ex_isLub \S \ A\ by auto + then show ?thesis + by (metis A_def L isLub_def isLub_lub r_def) +qed -lemma lub_in_lattice: "S \ A \ lub S cl \ A" - apply (rule CL_imp_ex_isLub [THEN exE], assumption) - apply (unfold lub_def least_def) - apply (subst some_equality) - apply (simp add: isLub_def) - prefer 2 apply (simp add: isLub_def A_def) - apply (simp add: lub_unique A_def isLub_def) - done +lemma lub_in_lattice: + assumes "S \ A" shows "lub S cl \ A" +proof - + obtain L where "isLub S cl L" + using CL_imp_ex_isLub \S \ A\ by auto + then show ?thesis + by (metis A_def isLub_def isLub_lub) +qed lemma lubI: - "\S \ A; L \ A; \x \ S. (x, L) \ r; - \z \ A. (\y \ S. (y, z) \ r) \ (L, z) \ r\ \ L = lub S cl" - apply (rule lub_unique, assumption) - apply (simp add: isLub_def A_def r_def) - apply (unfold isLub_def) - apply (rule conjI) - apply (fold A_def r_def) - apply (rule lub_in_lattice, assumption) - apply (simp add: lub_upper lub_least) - done + assumes A: "S \ A" "L \ A" and r: "\x \ S. (x, L) \ r" + and clo: "\z. \z \ A; (\y \ S. (y, z) \ r)\ \ (L, z) \ r" + shows "L = lub S cl" +proof - + obtain L where "isLub S cl L" + using CL_imp_ex_isLub assms(1) by auto + then show ?thesis + by (simp add: antisymE A clo lub_in_lattice lub_least lub_upper r) +qed lemma lubIa: "\S \ A; isLub S cl L\ \ L = lub S cl" - by (simp add: lubI isLub_def A_def r_def) + by (meson isLub_lub lub_unique) lemma isLub_in_lattice: "isLub S cl L \ L \ A" by (simp add: isLub_def A_def) @@ -397,22 +366,10 @@ begin lemma glb_in_lattice: "S \ A \ glb S cl \ A" - apply (subst glb_dual_lub) - apply (simp add: A_def) - apply (rule dualA_iff [THEN subst]) - apply (rule CL.lub_in_lattice) - apply (rule dual) - apply (simp add: dualA_iff) - done + by (metis A_def CL.lub_in_lattice dualA_iff glb_dual_lub local.dual) lemma glb_lower: "\S \ A; x \ S\ \ (glb S cl, x) \ r" - apply (subst glb_dual_lub) - apply (simp add: r_def) - apply (rule dualr_iff [THEN subst]) - apply (rule CL.lub_upper) - apply (rule dual) - apply (simp add: dualA_iff A_def, assumption) - done + by (metis A_def CL.lub_upper dualA_iff dualr_iff glb_dual_lub local.dual r_def) end @@ -437,7 +394,12 @@ by (simp add: A_def r_def) lemma CLF_dual: "(dual cl, f) \ CLF_set" - by (simp add: CLF_set_def CL_dualCL monotone_dual) (simp add: dualA_iff) +proof - + have "Tarski.monotone f A (order (dual cl))" + by (metis (no_types) A_def PO.monotone_dual PO_axioms dualA_iff monotone_f r_def) + then show ?thesis + by (simp add: A_def CLF_set_def CL_dualCL) +qed lemma dual: "CLF (dual cl) f" by (rule CLF.intro) (rule CLF_dual) @@ -462,94 +424,87 @@ context CLF begin -lemma lubH_le_flubH: "H = {x. (x, f x) \ r \ x \ A} \ (lub H cl, f (lub H cl)) \ r" - apply (rule lub_least, fast) - apply (rule f_in_funcset [THEN funcset_mem]) - apply (rule lub_in_lattice, fast) - \ \\\x:H. (x, f (lub H r)) \ r\\ - apply (rule ballI) - apply (rule transE) - \ \instantiates \(x, ???z) \ order cl to (x, f x)\,\ - \ \because of the def of \H\\ - apply fast - \ \so it remains to show \(f x, f (lub H cl)) \ r\\ - apply (rule_tac f = "f" in monotoneE) - apply (rule monotone_f, fast) - apply (rule lub_in_lattice, fast) - apply (rule lub_upper, fast) - apply assumption - done +lemma lubH_le_flubH: + assumes "H = {x \ A. (x, f x) \ r}" + shows "(lub H cl, f (lub H cl)) \ r" +proof (intro lub_least ballI) + show "H \ A" + using assms + by auto + show "f (lub H cl) \ A" + using \H \ A\ f_in_funcset lub_in_lattice by auto + show "(x, f (lub H cl)) \ r" if "x \ H" for x + proof - + have "(f x, f (lub H cl)) \ r" + by (meson \H \ A\ in_mono lub_in_lattice lub_upper monotoneE monotone_f that) + moreover have "(x, f x) \ r" + using assms that by blast + ultimately show ?thesis + using po.transE by blast + qed +qed -lemma flubH_le_lubH: "\H = {x. (x, f x) \ r \ x \ A}\ \ (f (lub H cl), lub H cl) \ r" - apply (rule lub_upper, fast) - apply (rule_tac t = "H" in ssubst, assumption) - apply (rule CollectI) - apply (rule conjI) - apply (rule_tac [2] f_in_funcset [THEN funcset_mem]) - apply (rule_tac [2] lub_in_lattice) - prefer 2 apply fast - apply (rule_tac f = f in monotoneE) - apply (rule monotone_f) - apply (blast intro: lub_in_lattice) - apply (blast intro: lub_in_lattice f_in_funcset [THEN funcset_mem]) - apply (simp add: lubH_le_flubH) - done +lemma flubH_le_lubH: + assumes "H = {x \ A. (x, f x) \ r}" + shows "(f (lub H cl), lub H cl) \ r" +proof - + have "(lub H cl, f (lub H cl)) \ r" + using assms lubH_le_flubH by blast + then have "(f (lub H cl), f (f (lub H cl))) \ r" + by (meson PO_imp_refl_on monotoneE monotone_f refl_on_domain) + then have "f (lub H cl) \ H" + by (metis (no_types, lifting) PO_imp_refl_on assms mem_Collect_eq refl_on_domain) + then show ?thesis + by (simp add: assms lub_upper) +qed -lemma lubH_is_fixp: "H = {x. (x, f x) \ r \ x \ A} \ lub H cl \ fix f A" - apply (simp add: fix_def) - apply (rule conjI) - apply (rule lub_in_lattice, fast) - apply (rule antisymE) - apply (simp add: flubH_le_lubH) - apply (simp add: lubH_le_flubH) - done + -lemma fix_in_H: "\H = {x. (x, f x) \ r \ x \ A}; x \ P\ \ x \ H" +lemma lubH_is_fixp: "H = {x \ A. (x, f x) \ r} \ lub H cl \ fix f A" + by (simp add: fix_def antisymE flubH_le_lubH lubH_le_flubH lub_in_lattice) + +lemma fix_in_H: "\H = {x \ A. (x, f x) \ r}; x \ P\ \ x \ H" by (simp add: P_def fix_imp_eq [of _ f A] reflE fix_subset [of f A, THEN subsetD]) -lemma fixf_le_lubH: "H = {x. (x, f x) \ r \ x \ A} \ \x \ fix f A. (x, lub H cl) \ r" - apply (rule ballI) - apply (rule lub_upper) - apply fast - apply (rule fix_in_H) - apply (simp_all add: P_def) - done +lemma fixf_le_lubH: "H = {x \ A. (x, f x) \ r} \ \x \ fix f A. (x, lub H cl) \ r" + by (metis (no_types, lifting) P_def fix_in_H lub_upper mem_Collect_eq subset_eq) lemma lubH_least_fixf: - "H = {x. (x, f x) \ r \ x \ A} \ \L. (\y \ fix f A. (y,L) \ r) \ (lub H cl, L) \ r" - apply (rule allI) - apply (rule impI) - apply (erule bspec) - apply (rule lubH_is_fixp, assumption) - done + "H = {x \ A. (x, f x) \ r} \ \L. (\y \ fix f A. (y,L) \ r) \ (lub H cl, L) \ r" + using lubH_is_fixp by blast subsection \Tarski fixpoint theorem 1, first part\ -lemma T_thm_1_lub: "lub P cl = lub {x. (x, f x) \ r \ x \ A} cl" - apply (rule sym) - apply (simp add: P_def) - apply (rule lubI) - apply (rule fix_subset) - apply (rule lub_in_lattice, fast) - apply (simp add: fixf_le_lubH) - apply (simp add: lubH_least_fixf) - done +lemma T_thm_1_lub: "lub P cl = lub {x \ A. (x, f x) \ r} cl" +proof - + have "lub {x \ A. (x, f x) \ r} cl = lub (fix f A) cl" + proof (rule antisymE) + show "(lub {x \ A. (x, f x) \ r} cl, lub (fix f A) cl) \ r" + by (simp add: fix_subset lubH_is_fixp lub_upper) + have "\a. a \ fix f A \ a \ A" + by (meson fix_subset subset_iff) + then show "(lub (fix f A) cl, lub {x \ A. (x, f x) \ r} cl) \ r" + by (simp add: fix_subset fixf_le_lubH lubH_is_fixp lub_least) + qed + then show ?thesis + using P_def by auto +qed -lemma glbH_is_fixp: "H = {x. (f x, x) \ r \ x \ A} \ glb H cl \ P" +lemma glbH_is_fixp: + assumes "H = {x \ A. (f x, x) \ r}" shows "glb H cl \ P" \ \Tarski for glb\ - apply (simp add: glb_dual_lub P_def A_def r_def) - apply (rule dualA_iff [THEN subst]) - apply (rule CLF.lubH_is_fixp) - apply (rule dual) - apply (simp add: dualr_iff dualA_iff) - done +proof - + have "glb H cl \ fix f (pset (dual cl))" + using assms CLF.lubH_is_fixp [OF dual] PO.dualr_iff PO_axioms + by (fastforce simp add: A_def r_def glb_dual_lub) + then show ?thesis + by (simp add: A_def P_def) +qed -lemma T_thm_1_glb: "glb P cl = glb {x. (f x, x) \ r \ x \ A} cl" - apply (simp add: glb_dual_lub P_def A_def r_def) - apply (rule dualA_iff [THEN subst]) - apply (simp add: CLF.T_thm_1_lub [of _ f, OF dual] dualPO CL_dualCL CLF_dual dualr_iff) - done +lemma T_thm_1_glb: "glb P cl = glb {x \ A. (f x, x) \ r} cl" + unfolding glb_dual_lub P_def A_def r_def + using CLF.T_thm_1_lub dualA_iff dualr_iff local.dual by force subsection \interval\ @@ -572,31 +527,28 @@ lemma a_less_lub: "\S \ A; S \ {}; \x \ S. (a,x) \ r; \y \ S. (y, L) \ r\ \ (a, L) \ r" by (blast intro: transE) -lemma glb_less_b: "\S \ A; S \ {}; \x \ S. (x,b) \ r; \y \ S. (G, y) \ r\ \ (G, b) \ r" - by (blast intro: transE) - lemma S_intv_cl: "\a \ A; b \ A; S \ interval r a b\ \ S \ A" by (simp add: subset_trans [OF _ interval_subset]) lemma L_in_interval: - "\a \ A; b \ A; S \ interval r a b; - S \ {}; isLub S cl L; interval r a b \ {}\ \ L \ interval r a b" - apply (rule intervalI) - apply (rule a_less_lub) - prefer 2 apply assumption - apply (simp add: S_intv_cl) - apply (rule ballI) - apply (simp add: interval_lemma1) - apply (simp add: isLub_upper) - \ \\(L, b) \ r\\ - apply (simp add: isLub_least interval_lemma2) - done + assumes "b \ A" and S: "S \ interval r a b" "isLub S cl L" "S \ {}" + shows "L \ interval r a b" +proof (rule intervalI) + show "(a, L) \ r" + by (meson PO_imp_trans all_not_in_conv S interval_lemma1 isLub_upper transD) + show "(L, b) \ r" + using \b \ A\ assms interval_lemma2 isLub_least by auto +qed lemma G_in_interval: - "\a \ A; b \ A; interval r a b \ {}; S \ interval r a b; isGlb S cl G; S \ {}\ - \ G \ interval r a b" - by (simp add: interval_dual) - (simp add: CLF.L_in_interval [of _ f, OF dual] dualA_iff A_def isGlb_dual_isLub) + assumes "b \ A" and S: "S \ interval r a b" "isGlb S cl G" "S \ {}" + shows "G \ interval r a b" +proof - + have "a \ A" + using S(1) \S \ {}\ interval_lemma1 rel_imp_elem by blast + with assms show ?thesis + by (metis (no_types) A_def CLF.L_in_interval dualA_iff interval_dual isGlb_dual_isLub local.dual) +qed lemma intervalPO: "\a \ A; b \ A; interval r a b \ {}\ @@ -604,66 +556,38 @@ by (rule po_subset_po) (simp add: interval_subset) lemma intv_CL_lub: - "\a \ A; b \ A; interval r a b \ {}\ \ - \S. S \ interval r a b \ - (\L. isLub S \pset = interval r a b, order = induced (interval r a b) r\ L)" - apply (intro strip) - apply (frule S_intv_cl [THEN CL_imp_ex_isLub]) - prefer 2 apply assumption - apply assumption - apply (erule exE) - \ \define the lub for the interval as\ - apply (rule_tac x = "if S = {} then a else L" in exI) - apply (simp (no_asm_simp) add: isLub_def split del: if_split) - apply (intro impI conjI) - \ \\(if S = {} then a else L) \ interval r a b\\ - apply (simp add: CL_imp_PO L_in_interval) - apply (simp add: left_in_interval) - \ \lub prop 1\ - apply (case_tac "S = {}") - \ \\S = {}, y \ S = False \ everything\\ - apply fast - \ \\S \ {}\\ - apply simp - \ \\\y\S. (y, L) \ induced (interval r a b) r\\ - apply (rule ballI) - apply (simp add: induced_def L_in_interval) - apply (rule conjI) - apply (rule subsetD) - apply (simp add: S_intv_cl, assumption) - apply (simp add: isLub_upper) - \ \\\z\interval r a b. - (\y\S. (y, z) \ induced (interval r a b) r \ - (if S = {} then a else L, z) \ induced (interval r a b) r\\ - apply (rule ballI) - apply (rule impI) - apply (case_tac "S = {}") - \ \\S = {}\\ - apply simp - apply (simp add: induced_def interval_def) - apply (rule conjI) - apply (rule reflE, assumption) - apply (rule interval_not_empty) - apply (simp add: interval_def) - \ \\S \ {}\\ - apply simp - apply (simp add: induced_def L_in_interval) - apply (rule isLub_least, assumption) - apply (rule subsetD) - prefer 2 apply assumption - apply (simp add: S_intv_cl, fast) - done + assumes "a \ A" "b \ A" "interval r a b \ {}" and S: "S \ interval r a b" + shows "\L. isLub S \pset = interval r a b, order = induced (interval r a b) r\ L" +proof - + obtain L where L: "isLub S cl L" + by (meson CL_imp_ex_isLub S_intv_cl assms(1) assms(2) assms(4)) + show ?thesis + unfolding isLub_def potype.simps + proof (intro exI impI conjI ballI) + let ?L = "(if S = {} then a else L)" + show Lin: "?L \ interval r a b" + using L L_in_interval assms left_in_interval by auto + show "(y, ?L) \ induced (interval r a b) r" if "y \ S" for y + proof - + have "S \ {}" + using that by blast + then show ?thesis + using L Lin S indI isLub_upper that by auto + qed + show "(?L, z) \ induced (interval r a b) r" + if "z \ interval r a b" and "\y\S. (y, z) \ induced (interval r a b) r" for z + using that L + apply (simp add: isLub_def induced_def interval_imp_mem) + by (metis (full_types) A_def Lin \a \ A\ \b \ A\ interval_subset r_def subset_eq) + qed +qed lemmas intv_CL_glb = intv_CL_lub [THEN Rdual] lemma interval_is_sublattice: "\a \ A; b \ A; interval r a b \ {}\ \ interval r a b <<= cl" apply (rule sublatticeI) apply (simp add: interval_subset) - apply (rule CompleteLatticeI) - apply (simp add: intervalPO) - apply (simp add: intv_CL_lub) - apply (simp add: intv_CL_glb) - done + by (simp add: CompleteLatticeI intervalPO intv_CL_glb intv_CL_lub) lemmas interv_is_compl_latt = interval_is_sublattice [THEN sublattice_imp_CL] @@ -671,55 +595,32 @@ subsection \Top and Bottom\ lemma Top_dual_Bot: "Top cl = Bot (dual cl)" - by (simp add: Top_def Bot_def least_def greatest_def dualA_iff dualr_iff) + by (simp add: Top_def Bot_def least_def greatest_def) lemma Bot_dual_Top: "Bot cl = Top (dual cl)" - by (simp add: Top_def Bot_def least_def greatest_def dualA_iff dualr_iff) + by (simp add: Top_def Bot_def least_def greatest_def) lemma Bot_in_lattice: "Bot cl \ A" - apply (simp add: Bot_def least_def) + unfolding Bot_def least_def apply (rule_tac a = "glb A cl" in someI2) - apply (simp_all add: glb_in_lattice glb_lower r_def [symmetric] A_def [symmetric]) - done + using glb_in_lattice glb_lower by (auto simp: A_def r_def) lemma Top_in_lattice: "Top cl \ A" - apply (simp add: Top_dual_Bot A_def) - apply (rule dualA_iff [THEN subst]) - apply (rule CLF.Bot_in_lattice [OF dual]) - done + using A_def CLF.Bot_in_lattice Top_dual_Bot local.dual by force lemma Top_prop: "x \ A \ (x, Top cl) \ r" - apply (simp add: Top_def greatest_def) + unfolding Top_def greatest_def apply (rule_tac a = "lub A cl" in someI2) - apply (rule someI2) - apply (simp_all add: lub_in_lattice lub_upper - r_def [symmetric] A_def [symmetric]) - done + using lub_in_lattice lub_upper by (auto simp: A_def r_def) lemma Bot_prop: "x \ A \ (Bot cl, x) \ r" - apply (simp add: Bot_dual_Top r_def) - apply (rule dualr_iff [THEN subst]) - apply (rule CLF.Top_prop [OF dual]) - apply (simp add: dualA_iff A_def) - done + using A_def Bot_dual_Top CLF.Top_prop dualA_iff dualr_iff local.dual r_def by fastforce lemma Top_intv_not_empty: "x \ A \ interval r x (Top cl) \ {}" - apply (rule notI) - apply (drule_tac a = "Top cl" in equals0D) - apply (simp add: interval_def) - apply (simp add: refl_on_def Top_in_lattice Top_prop) - done + using Top_prop intervalI reflE by force lemma Bot_intv_not_empty: "x \ A \ interval r (Bot cl) x \ {}" - apply (simp add: Bot_dual_Top) - apply (subst interval_dual) - prefer 2 apply assumption - apply (simp add: A_def) - apply (rule dualA_iff [THEN subst]) - apply (rule CLF.Top_in_lattice [OF dual]) - apply (rule CLF.Top_intv_not_empty [OF dual]) - apply (simp add: dualA_iff A_def) - done + using Bot_dual_Top Bot_prop intervalI reflE by fastforce subsection \fixed points form a partial order\ @@ -739,47 +640,34 @@ by (rule Y_subset_A [THEN lub_in_lattice]) lemma lubY_le_flubY: "(lub Y cl, f (lub Y cl)) \ r" - apply (rule lub_least) - apply (rule Y_subset_A) - apply (rule f_in_funcset [THEN funcset_mem]) - apply (rule lubY_in_A) - \ \\Y \ P \ f x = x\\ - apply (rule ballI) - apply (rule_tac t = x in fix_imp_eq [THEN subst]) - apply (erule Y_ss [simplified P_def, THEN subsetD]) - \ \\reduce (f x, f (lub Y cl)) \ r to (x, lub Y cl) \ r\ by monotonicity\ - apply (rule_tac f = "f" in monotoneE) - apply (rule monotone_f) - apply (simp add: Y_subset_A [THEN subsetD]) - apply (rule lubY_in_A) - apply (simp add: lub_upper Y_subset_A) - done +proof (intro lub_least Y_subset_A ballI) + show "f (lub Y cl) \ A" + by (meson Tarski.monotone_def lubY_in_A monotone_f reflE rel_imp_elem) + show "(x, f (lub Y cl)) \ r" if "x \ Y" for x + proof + have "\A. Y \ A \ x \ A" + using that by blast + moreover have "(x, lub Y cl) \ r" + using that by (simp add: Y_subset_A lub_upper) + ultimately show "(x, f (lub Y cl)) \ r" + by (metis (no_types) Tarski.Y_ss Tarski_axioms Y_subset_A fix_imp_eq lubY_in_A monotoneE monotone_f) + qed auto +qed lemma intY1_subset: "intY1 \ A" - apply (unfold intY1_def) - apply (rule interval_subset) - apply (rule lubY_in_A) - apply (rule Top_in_lattice) - done + unfolding intY1_def using Top_in_lattice interval_subset lubY_in_A by auto lemmas intY1_elem = intY1_subset [THEN subsetD] -lemma intY1_f_closed: "x \ intY1 \ f x \ intY1" - apply (simp add: intY1_def interval_def) - apply (rule conjI) - apply (rule transE) - apply (rule lubY_le_flubY) - \ \\(f (lub Y cl), f x) \ r\\ - apply (rule_tac f=f in monotoneE) - apply (rule monotone_f) - apply (rule lubY_in_A) - apply (simp add: intY1_def interval_def intY1_elem) - apply (simp add: intY1_def interval_def) - \ \\(f x, Top cl) \ r\\ - apply (rule Top_prop) - apply (rule f_in_funcset [THEN funcset_mem]) - apply (simp add: intY1_def interval_def intY1_elem) - done +lemma intY1_f_closed: + assumes "x \ intY1" shows "f x \ intY1" +proof (simp add: intY1_def interval_def, rule conjI) + show "(lub Y cl, f x) \ r" + using assms intY1_elem interval_imp_mem lubY_in_A unfolding intY1_def + using lubY_le_flubY monotoneE monotone_f po.transE by blast + then show "(f x, Top cl) \ r" + by (meson PO_imp_refl_on Top_prop refl_onD2) +qed lemma intY1_mono: "monotone (\ x \ intY1. f x) intY1 (induced intY1 r)" apply (auto simp add: monotone_def induced_def intY1_f_closed) @@ -787,92 +675,68 @@ done lemma intY1_is_cl: "\pset = intY1, order = induced intY1 r\ \ CompleteLattice" - apply (unfold intY1_def) - apply (rule interv_is_compl_latt) - apply (rule lubY_in_A) - apply (rule Top_in_lattice) - apply (rule Top_intv_not_empty) - apply (rule lubY_in_A) - done + unfolding intY1_def + by (simp add: Top_in_lattice Top_intv_not_empty interv_is_compl_latt lubY_in_A) lemma v_in_P: "v \ P" - apply (unfold P_def) - apply (rule_tac A = intY1 in fixf_subset) - apply (rule intY1_subset) - unfolding v_def - apply (rule CLF.glbH_is_fixp - [OF CLF.intro, unfolded CLF_set_def, of "\pset = intY1, order = induced intY1 r\", simplified]) - apply auto - apply (rule intY1_is_cl) - apply (erule intY1_f_closed) - apply (rule intY1_mono) - done +proof - + have "v \ fix (restrict f intY1) intY1" + unfolding v_def + apply (rule CLF.glbH_is_fixp + [OF CLF.intro, unfolded CLF_set_def, of "\pset = intY1, order = induced intY1 r\", simplified]) + using intY1_f_closed intY1_is_cl intY1_mono apply blast+ + done + then show ?thesis + unfolding P_def + by (meson fixf_subset intY1_subset) +qed lemma z_in_interval: "\z \ P; \y\Y. (y, z) \ induced P r\ \ z \ intY1" - apply (unfold intY1_def P_def) - apply (rule intervalI) - prefer 2 - apply (erule fix_subset [THEN subsetD, THEN Top_prop]) - apply (rule lub_least) - apply (rule Y_subset_A) - apply (fast elim!: fix_subset [THEN subsetD]) - apply (simp add: induced_def) - done - -lemma f'z_in_int_rel: "\z \ P; \y\Y. (y, z) \ induced P r\ - \ ((\x \ intY1. f x) z, z) \ induced intY1 r" - by (simp add: induced_def intY1_f_closed z_in_interval P_def) - (simp add: fix_imp_eq [of _ f A] fix_subset [of f A, THEN subsetD] reflE) + unfolding intY1_def P_def + by (meson Top_prop Y_subset_A fix_subset in_mono indE intervalI lub_least) lemma tarski_full_lemma: "\L. isLub Y \pset = P, order = induced P r\ L" - apply (rule_tac x = "v" in exI) - apply (simp add: isLub_def) - \ \\v \ P\\ - apply (simp add: v_in_P) - apply (rule conjI) - \ \\v\ is lub\ - \ \\1. \y:Y. (y, v) \ induced P r\\ - apply (rule ballI) - apply (simp add: induced_def subsetD v_in_P) - apply (rule conjI) - apply (erule Y_ss [THEN subsetD]) - apply (rule_tac b = "lub Y cl" in transE) - apply (rule lub_upper) - apply (rule Y_subset_A, assumption) - apply (rule_tac b = "Top cl" in interval_imp_mem) - apply (simp add: v_def) - apply (fold intY1_def) - apply (rule CL.glb_in_lattice [OF CL.intro [OF intY1_is_cl], simplified]) - apply auto - apply (rule indI) - prefer 3 apply assumption - prefer 2 apply (simp add: v_in_P) - apply (unfold v_def) - apply (rule indE) - apply (rule_tac [2] intY1_subset) - apply (rule CL.glb_lower [OF CL.intro [OF intY1_is_cl], simplified]) - apply (simp add: CL_imp_PO intY1_is_cl) - apply force - apply (simp add: induced_def intY1_f_closed z_in_interval) - apply (simp add: P_def fix_imp_eq [of _ f A] reflE fix_subset [of f A, THEN subsetD]) - done +proof + have "(y, v) \ induced P r" if "y \ Y" for y + proof - + have "(y, lub Y cl) \ r" + by (simp add: Y_subset_A lub_upper that) + moreover have "(lub Y cl, v) \ r" + by (metis (no_types, lifting) CL.glb_in_lattice CL.intro intY1_def intY1_is_cl interval_imp_mem lub_dual_glb mem_Collect_eq select_convs(1) subsetI v_def) + ultimately have "(y, v) \ r" + using po.transE by blast + then show ?thesis + using Y_ss indI that v_in_P by auto + qed + moreover have "(v, z) \ induced P r" if "z \ P" "\y\Y. (y, z) \ induced P r" for z + proof (rule indI) + have "((\x \ intY1. f x) z, z) \ induced intY1 r" + by (metis P_def fix_imp_eq in_mono indI intY1_subset reflE restrict_apply' that z_in_interval) + then show "(v, z) \ r" + by (metis (no_types, lifting) CL.glb_lower CL_def indE intY1_is_cl intY1_subset mem_Collect_eq select_convs(1,2) subsetI that v_def z_in_interval) + qed (auto simp: that v_in_P) + ultimately + show "isLub Y \pset = P, order = induced P r\ v" + by (simp add: isLub_def v_in_P) +qed end lemma CompleteLatticeI_simp: - "\\pset = A, order = r\ \ PartialOrder; - \S. S \ A \ (\L. isLub S \pset = A, order = r\ L)\ - \ \pset = A, order = r\ \ CompleteLattice" - by (simp add: CompleteLatticeI Rdual) + "\po \ PartialOrder; \S. S \ A \ \L. isLub S po L; A = pset po\ + \ po \ CompleteLattice" + by (metis CompleteLatticeI Rdual) + theorem (in CLF) Tarski_full: "\pset = P, order = induced P r\ \ CompleteLattice" - apply (rule CompleteLatticeI_simp) - apply (rule fixf_po) - apply clarify - apply (simp add: P_def A_def r_def) - apply (rule Tarski.tarski_full_lemma [OF Tarski.intro [OF _ Tarski_axioms.intro]]) -proof - - show "CLF cl f" .. -qed +proof (intro CompleteLatticeI_simp allI impI) + show "\pset = P, order = induced P r\ \ PartialOrder" + by (simp add: fixf_po) + show "\S. S \ P \ \L. isLub S \pset = P, order = induced P r\ L" + unfolding P_def A_def r_def + proof (rule Tarski.tarski_full_lemma [OF Tarski.intro [OF _ Tarski_axioms.intro]]) + show "CLF cl f" .. + qed +qed auto end