theory Nominal2_Abs imports Nominal2_Base "HOL-Library.Quotient_List" "HOL-Library.Quotient_Product" begin
section‹Abstractions›
fun
alpha_set where
alpha_set[simp del]: "alpha_set (bs, x) R f p (cs, y) ⟷ f x - bs = f y - cs ∧ (f x - bs) ♯* p ∧ R (p ∙ x) y ∧ p ∙ bs = cs"
fun
alpha_res where
alpha_res[simp del]: "alpha_res (bs, x) R f p (cs, y) ⟷ f x - bs = f y - cs ∧ (f x - bs) ♯* p ∧ R (p ∙ x) y"
fun
alpha_lst where
alpha_lst[simp del]: "alpha_lst (bs, x) R f p (cs, y) ⟷ f x - set bs = f y - set cs ∧ (f x - set bs) ♯* p ∧ R (p ∙ x) y ∧ p ∙ bs = cs"
lemma alpha_eqvt[eqvt]: shows"(bs, x) ≈set R f q (cs, y) ==> (p ∙ bs, p ∙ x) ≈set (p ∙ R) (p ∙ f) (p ∙ q) (p ∙ cs, p ∙ y)" and"(bs, x) ≈res R f q (cs, y) ==> (p ∙ bs, p ∙ x) ≈res (p ∙ R) (p ∙ f) (p ∙ q) (p ∙ cs, p ∙ y)" and"(ds, x) ≈lst R f q (es, y) ==> (p ∙ ds, p ∙ x) ≈lst (p ∙ R) (p ∙ f) (p ∙ q) (p ∙ es, p ∙ y)" unfolding alphas unfolding permute_eqvt[symmetric] unfolding set_eqvt[symmetric] unfolding permute_fun_app_eq[symmetric] unfolding Diff_eqvt[symmetric] unfolding eq_eqvt[symmetric] unfolding fresh_star_eqvt[symmetric] by (auto simp only: permute_bool_def)
section‹Equivalence›
lemma alpha_refl: assumes a: "R x x" shows"(bs, x) ≈set R f 0 (bs, x)" and"(bs, x) ≈res R f 0 (bs, x)" and"(cs, x) ≈lst R f 0 (cs, x)" using a unfolding alphas unfolding fresh_star_def by (simp_all add: fresh_zero_perm)
lemma alpha_sym: assumes a: "R (p ∙ x) y ==> R (- p ∙ y) x" shows"(bs, x) ≈set R f p (cs, y) ==> (cs, y) ≈set R f (- p) (bs, x)" and"(bs, x) ≈res R f p (cs, y) ==> (cs, y) ≈res R f (- p) (bs, x)" and"(ds, x) ≈lst R f p (es, y) ==> (es, y) ≈lst R f (- p) (ds, x)" unfolding alphas fresh_star_def using a by (auto simp: fresh_minus_perm)
lemma alpha_trans: assumes a: "[R (p ∙ x) y; R (q ∙ y) z]==> R ((q + p) ∙ x) z" shows"[(bs, x) ≈set R f p (cs, y); (cs, y) ≈set R f q (ds, z)]==> (bs, x) ≈set R f (q + p) (ds, z)" and"[(bs, x) ≈res R f p (cs, y); (cs, y) ≈res R f q (ds, z)]==> (bs, x) ≈res R f (q + p) (ds, z)" and"[(es, x) ≈lst R f p (gs, y); (gs, y) ≈lst R f q (hs, z)]==> (es, x) ≈lst R f (q + p) (hs, z)" using a unfolding alphas fresh_star_def by (simp_all add: fresh_plus_perm)
lemma alpha_sym_eqvt: assumes a: "R (p ∙ x) y ==> R y (p ∙ x)" and b: "p ∙ R = R" shows"(bs, x) ≈set R f p (cs, y) ==> (cs, y) ≈set R f (- p) (bs, x)" and"(bs, x) ≈res R f p (cs, y) ==> (cs, y) ≈res R f (- p) (bs, x)" and"(ds, x) ≈lst R f p (es, y) ==> (es, y) ≈lst R f (- p) (ds, x)" apply(auto intro!: alpha_sym) apply(drule_tac [!] a) apply(rule_tac [!] p="p"in permute_boolE) apply(simp_all add: b permute_self) done
lemma alpha_set_trans_eqvt: assumes b: "(cs, y) ≈set R f q (ds, z)" and a: "(bs, x) ≈set R f p (cs, y)" and d: "q ∙ R = R" and c: "[R (p ∙ x) y; R y (- q ∙ z)]==> R (p ∙ x) (- q ∙ z)" shows"(bs, x) ≈set R f (q + p) (ds, z)" apply(rule alpha_trans(1)[OF _ a b]) apply(drule c) apply(rule_tac p="q"in permute_boolE) apply(simp add: d permute_self) apply(rotate_tac -1) apply(drule_tac p="q"in permute_boolI) apply(simp add: d permute_self permute_eqvt[symmetric]) done
lemma alpha_res_trans_eqvt: assumes b: "(cs, y) ≈res R f q (ds, z)" and a: "(bs, x) ≈res R f p (cs, y)" and d: "q ∙ R = R" and c: "[R (p ∙ x) y; R y (- q ∙ z)]==> R (p ∙ x) (- q ∙ z)" shows"(bs, x) ≈res R f (q + p) (ds, z)" apply(rule alpha_trans(2)[OF _ a b]) apply(drule c) apply(rule_tac p="q"in permute_boolE) apply(simp add: d permute_self) apply(rotate_tac -1) apply(drule_tac p="q"in permute_boolI) apply(simp add: d permute_self permute_eqvt[symmetric]) done
lemma alpha_lst_trans_eqvt: assumes b: "(cs, y) ≈lst R f q (ds, z)" and a: "(bs, x) ≈lst R f p (cs, y)" and d: "q ∙ R = R" and c: "[R (p ∙ x) y; R y (- q ∙ z)]==> R (p ∙ x) (- q ∙ z)" shows"(bs, x) ≈lst R f (q + p) (ds, z)" apply(rule alpha_trans(3)[OF _ a b]) apply(drule c) apply(rule_tac p="q"in permute_boolE) apply(simp add: d permute_self) apply(rotate_tac -1) apply(drule_tac p="q"in permute_boolI) apply(simp add: d permute_self permute_eqvt[symmetric]) done
lemma disjoint_right_eq: assumes a: "A ∪ B1 = A ∪ B2" and b: "A ∩ B1 = {}""A ∩ B2 = {}" shows"B1 = B2" using a b by (metis Int_Un_distrib2 Int_absorb2 Int_commute Un_upper2)
lemma supp_property_res: assumes a: "(as, x) ≈res (=) supp p (as', x')" shows"p ∙ (supp x ∩ as) = supp x' ∩ as'" proof - from a have"(supp x - as) ♯* p"by (auto simp only: alphas) thenhave *: "p ∙ (supp x - as) = (supp x - as)" by (simp add: atom_set_perm_eq) have"(supp x' - as') ∪ (supp x' ∩ as') = supp x'"by auto alsohave"… = supp (p ∙ x)"using a by (simp add: alphas) alsohave"… = p ∙ (supp x)"by (simp add: supp_eqvt) alsohave"… = p ∙ ((supp x - as) ∪ (supp x ∩ as))"by auto alsohave"… = (p ∙ (supp x - as)) ∪ (p ∙ (supp x ∩ as))"by (simp add: union_eqvt) alsohave"… = (supp x - as) ∪ (p ∙ (supp x ∩ as))"using * by simp alsohave"… = (supp x' - as') ∪ (p ∙ (supp x ∩ as))"using a by (simp add: alphas) finallyhave"(supp x' - as') ∪ (supp x' ∩ as') = (supp x' - as') ∪ (p ∙ (supp x ∩ as))" . moreover have"(supp x' - as') ∩ (supp x' ∩ as') = {}"by auto moreover have"(supp x - as) ∩ (supp x ∩ as) = {}"by auto thenhave"p ∙ ((supp x - as) ∩ (supp x ∩ as) = {})"by (simp add: permute_bool_def) thenhave"(p ∙ (supp x - as)) ∩ (p ∙ (supp x ∩ as)) = {}"by (perm_simp) (simp) thenhave"(supp x - as) ∩ (p ∙ (supp x ∩ as)) = {}"using * by simp thenhave"(supp x' - as') ∩ (p ∙ (supp x ∩ as)) = {}"using a by (simp add: alphas) ultimatelyshow"p ∙ (supp x ∩ as) = supp x' ∩ as'" by (auto dest: disjoint_right_eq) qed
lemma alpha_abs_res_stronger1_aux: assumes asm: "(as, x) ≈res (=) supp p' (as', x')" shows"∃p. (as, x) ≈res (=) supp p (as', x') ∧ supp p ⊆ (supp x ∩ as) ∪ (supp x' ∩ as')" proof - from asm have0: "(supp x - as) ♯* p'"by (auto simp only: alphas) thenhave #: "p' ∙ (supp x - as) = (supp x - as)" by (simp add: atom_set_perm_eq) obtain p where *: "∀b ∈ supp x. p ∙ b = p' ∙ b"and **: "supp p ⊆ supp x ∪ p' ∙ supp x" using set_renaming_perm2 by blast from * have a: "p ∙ x = p' ∙ x"using supp_perm_perm_eq by auto from0have1: "(supp x - as) ♯* p"using * by (auto simp: fresh_star_def fresh_perm) thenhave2: "(supp x - as) ∩ supp p = {}" by (auto simp: fresh_star_def fresh_def) have b: "supp x = (supp x - as) ∪ (supp x ∩ as)"by auto have"supp p ⊆ supp x ∪ p' ∙ supp x"using ** by simp alsohave"… = (supp x - as) ∪ (supp x ∩ as) ∪ (p' ∙ ((supp x - as) ∪ (supp x ∩ as)))" using b by simp alsohave"… = (supp x - as) ∪ (supp x ∩ as) ∪ ((p' ∙ (supp x - as)) ∪ (p' ∙ (supp x ∩ as)))" by (simp add: union_eqvt) alsohave"… = (supp x - as) ∪ (supp x ∩ as) ∪ (p' ∙ (supp x ∩ as))" using # by auto alsohave"… = (supp x - as) ∪ (supp x ∩ as) ∪ (supp x' ∩ as')"using asm by (simp add: supp_property_res) finallyhave"supp p ⊆ (supp x - as) ∪ (supp x ∩ as) ∪ (supp x' ∩ as')" . then have"supp p ⊆ (supp x ∩ as) ∪ (supp x' ∩ as')"using2by auto moreover have"(as, x) ≈res (=) supp p (as', x')"using asm 1 a by (simp add: alphas) ultimately show"∃p. (as, x) ≈res (=) supp p (as', x') ∧ supp p ⊆ (supp x ∩ as) ∪ (supp x' ∩ as')"by blast qed
lemma alpha_abs_res_minimal: assumes asm: "(as, x) ≈res (=) supp p (as', x')" shows"(as ∩ supp x, x) ≈res (=) supp p (as' ∩ supp x', x')" using asm unfolding alpha_res by (auto simp: Diff_Int)
lemma alpha_abs_res_abs_set: assumes asm: "(as, x) ≈res (=) supp p (as', x')" shows"(as ∩ supp x, x) ≈set (=) supp p (as' ∩ supp x', x')" proof - have c: "p ∙ x = x'" using alpha_abs_res_minimal[OF asm] unfolding alpha_res by clarify thenhave a: "supp x - as ∩ supp x = supp (p ∙ x) - as' ∩ supp (p ∙ x)" using alpha_abs_res_minimal[OF asm] by (simp add: alpha_res) have b: "(supp x - as ∩ supp x) ♯* p" using alpha_abs_res_minimal[OF asm] unfolding alpha_res by clarify have"p ∙ (as ∩ supp x) = as' ∩ supp (p ∙ x)" by (metis Int_commute asm c supp_property_res) thenshow ?thesis using a b c unfolding alpha_set by simp qed
lemma alpha_abs_set_abs_res: assumes asm: "(as ∩ supp x, x) ≈set (=) supp p (as' ∩ supp x', x')" shows"(as, x) ≈res (=) supp p (as', x')" using asm unfolding alphas by (auto simp: Diff_Int)
lemma alpha_abs_res_stronger1: assumes asm: "(as, x) ≈res (=) supp p' (as', x')" shows"∃p. (as, x) ≈res (=) supp p (as', x') ∧ supp p ⊆ as ∪ as'" using alpha_abs_res_stronger1_aux[OF asm] by auto
lemma alpha_abs_set_stronger1: assumes asm: "(as, x) ≈set (=) supp p' (as', x')" shows"∃p. (as, x) ≈set (=) supp p (as', x') ∧ supp p ⊆ as ∪ as'" proof - from asm have0: "(supp x - as) ♯* p'"by (auto simp only: alphas) thenhave #: "p' ∙ (supp x - as) = (supp x - as)" by (simp add: atom_set_perm_eq) obtain p where *: "∀b ∈ (supp x ∪ as). p ∙ b = p' ∙ b" and **: "supp p ⊆ (supp x ∪ as) ∪ p' ∙ (supp x ∪ as)" using set_renaming_perm2 by blast from * have"∀b ∈ supp x. p ∙ b = p' ∙ b"by blast thenhave a: "p ∙ x = p' ∙ x"using supp_perm_perm_eq by auto from * have"∀b ∈ as. p ∙ b = p' ∙ b"by blast thenhave zb: "p ∙ as = p' ∙ as" apply(auto simp: permute_set_def) apply(rule_tac x="xa"in exI) apply(simp) done have zc: "p' ∙ as = as'"using asm by (simp add: alphas) from0have1: "(supp x - as) ♯* p"using * by (auto simp: fresh_star_def fresh_perm) thenhave2: "(supp x - as) ∩ supp p = {}" by (auto simp: fresh_star_def fresh_def) have b: "supp x = (supp x - as) ∪ (supp x ∩ as)"by auto have"supp p ⊆ supp x ∪ as ∪ p' ∙ supp x ∪ p' ∙ as"using ** using union_eqvt by blast alsohave"… = (supp x - as) ∪ (supp x ∩ as) ∪ as ∪ (p' ∙ ((supp x - as) ∪ (supp x∩ as))) ∪ p' ∙ as" using b by simp alsohave"… = (supp x - as) ∪ (supp x ∩ as) ∪ as ∪ ((p' ∙ (supp x - as)) ∪ (p' ∙ (supp x ∩ as))) ∪ p' ∙ as"by (simp add: union_eqvt) alsohave"… = (supp x - as) ∪ (supp x ∩ as) ∪ as ∪ (p' ∙ (supp x ∩ as)) ∪ p' ∙ as" using # by auto alsohave"… = (supp x - as) ∪ (supp x ∩ as) ∪ as ∪ p' ∙ ((supp x ∩ as) ∪ as)"using union_eqvt by auto alsohave"… = (supp x - as) ∪ (supp x ∩ as) ∪ as ∪ p' ∙ as" by (metis Int_commute Un_commute sup_inf_absorb) alsohave"… = (supp x - as) ∪ as ∪ p' ∙ as"by blast finallyhave"supp p ⊆ (supp x - as) ∪ as ∪ p' ∙ as" . thenhave"supp p ⊆ as ∪ p' ∙ as"using2by blast moreover have"(as, x) ≈set (=) supp p (as', x')"using asm 1 a zb by (simp add: alphas) ultimately show"∃p. (as, x) ≈set (=) supp p (as', x') ∧ supp p ⊆ as ∪ as'"using zc by blast qed
lemma alpha_abs_lst_stronger1: assumes asm: "(as, x) ≈lst (=) supp p' (as', x')" shows"∃p. (as, x) ≈lst (=) supp p (as', x') ∧ supp p ⊆ set as ∪ set as'" proof - from asm have0: "(supp x - set as) ♯* p'"by (auto simp only: alphas) thenhave #: "p' ∙ (supp x - set as) = (supp x - set as)" by (simp add: atom_set_perm_eq) obtain p where *: "∀b ∈ (supp x ∪ set as). p ∙ b = p' ∙ b" and **: "supp p ⊆ (supp x ∪ set as) ∪ p' ∙ (supp x ∪ set as)" using set_renaming_perm2 by blast from * have"∀b ∈ supp x. p ∙ b = p' ∙ b"by blast thenhave a: "p ∙ x = p' ∙ x"using supp_perm_perm_eq by auto from * have"∀b ∈ set as. p ∙ b = p' ∙ b"by blast thenhave zb: "p ∙ as = p' ∙ as"by (induct as) (auto) have zc: "p' ∙ set as = set as'"using asm by (simp add: alphas set_eqvt) from0have1: "(supp x - set as) ♯* p"using * by (auto simp: fresh_star_def fresh_perm) thenhave2: "(supp x - set as) ∩ supp p = {}" by (auto simp: fresh_star_def fresh_def) have b: "supp x = (supp x - set as) ∪ (supp x ∩ set as)"by auto have"supp p ⊆ supp x ∪ set as ∪ p' ∙ supp x ∪ p' ∙ set as"using ** using union_eqvt by blast alsohave"… = (supp x - set as) ∪ (supp x ∩ set as) ∪ set as ∪ (p' ∙ ((supp x - set as) ∪ (supp x ∩ set as))) ∪ p' ∙ set as"using b by simp alsohave"… = (supp x - set as) ∪ (supp x ∩ set as) ∪ set as ∪ ((p' ∙ (supp x - set as)) ∪ (p' ∙ (supp x ∩ set as))) ∪ p' ∙ set as"by (simp add: union_eqvt) alsohave"… = (supp x - set as) ∪ (supp x ∩ set as) ∪ set as ∪ (p' ∙ (supp x ∩ set as)) ∪ p' ∙ set as"using # by auto alsohave"… = (supp x - set as) ∪ (supp x ∩ set as) ∪ set as ∪ p' ∙ ((supp x ∩ set as) ∪ set as)" using union_eqvt by auto alsohave"… = (supp x - set as) ∪ (supp x ∩ set as) ∪ set as ∪ p' ∙ set as" by (metis Int_commute Un_commute sup_inf_absorb) alsohave"… = (supp x - set as) ∪ set as ∪ p' ∙ set as"by blast finallyhave"supp p ⊆ (supp x - set as) ∪ set as ∪ p' ∙ set as" . thenhave"supp p ⊆ set as ∪ p' ∙ set as"using2by blast moreover have"(as, x) ≈lst (=) supp p (as', x')"using asm 1 a zb by (simp add: alphas) ultimately show"∃p. (as, x) ≈lst (=) supp p (as', x') ∧ supp p ⊆ set as ∪ set as'"using zc byblast qed
quotient_definition
Abs_set (‹[_]set. _› [60, 60] 60) where "Abs_set::atom set ==> ('a::pt) ==> 'a abs_set" is "Pair::atom set ==> ('a::pt) ==> (atom set × 'a)" .
quotient_definition
Abs_res (‹[_]res. _› [60, 60] 60) where "Abs_res::atom set ==> ('a::pt) ==> 'a abs_res" is "Pair::atom set ==> ('a::pt) ==> (atom set × 'a)" .
quotient_definition
Abs_lst (‹[_]lst. _› [60, 60] 60) where "Abs_lst::atom list ==> ('a::pt) ==> 'a abs_lst" is "Pair::atom list ==> ('a::pt) ==> (atom list × 'a)" .
lemma Abs_eq_iff: shows"[bs]set. x = [bs']set. y ⟷ (∃p. (bs, x) ≈set (=) supp p (bs', y))" and"[bs]res. x = [bs']res. y ⟷ (∃p. (bs, x) ≈res (=) supp p (bs', y))" and"[cs]lst. x = [cs']lst. y ⟷ (∃p. (cs, x) ≈lst (=) supp p (cs', y))" by (lifting alphas_abs)
lemma Abs_eq_iff2: shows"[bs]set. x = [bs']set. y ⟷ (∃p. (bs, x) ≈set ((=)) supp p (bs', y) ∧ supp p ⊆ bs ∪ bs')" and"[bs]res. x = [bs']res. y ⟷ (∃p. (bs, x) ≈res ((=)) supp p (bs', y) ∧ supp p ⊆ bs ∪ bs')" and"[cs]lst. x = [cs']lst. y ⟷ (∃p. (cs, x) ≈lst ((=)) supp p (cs', y) ∧ supp p ⊆ set cs ∪ set cs')" by (lifting alphas_abs_stronger)
lemma Abs_eq_res_set: shows"[bs]res. x = [cs]res. y ⟷ [bs ∩ supp x]set. x = [cs ∩ supp y]set. y" unfolding Abs_eq_iff alpha_res_alpha_set by rule
lemma Abs_eq_res_supp: assumes asm: "supp x ⊆ bs" shows"[as]res. x = [as ∩ bs]res. x" unfolding Abs_eq_iff alphas apply (rule_tac x="0::perm"in exI) apply (simp add: fresh_star_zero) using asm by blast
lemma Abs_fresh_iff: fixes x::"'a::fs" shows"a ♯ [bs]set. x ⟷ a ∈ bs ∨ (a ∉ bs ∧ a ♯ x)" and"a ♯ [bs]res. x ⟷ a ∈ bs ∨ (a ∉ bs ∧ a ♯ x)" and"a ♯ [cs]lst. x ⟷ a ∈ (set cs) ∨ (a ∉ (set cs) ∧ a ♯ x)" unfolding fresh_def unfolding supp_Abs by auto
lemma Abs_fresh_star2: fixes x::"'a::fs" shows"as ∩ bs = {} ==> as ♯* ([bs]set. x) ⟷ as ♯* x" and"as ∩ bs = {} ==> as ♯* ([bs]res. x) ⟷ as ♯* x" and"cs ∩ set ds = {} ==> cs ♯* ([ds]lst. x) ⟷ cs ♯* x" unfolding fresh_star_def Abs_fresh_iff by auto
section‹Abstractions of single atoms›
lemma Abs1_eq: fixes x y::"'a::fs" shows"[{atom a}]set. x = [{atom a}]set. y ⟷ x = y" and"[{atom a}]res. x = [{atom a}]res. y ⟷ x = y" and"[[atom a]]lst. x = [[atom a]]lst. y ⟷ x = y" unfolding Abs_eq_iff2 alphas by (auto simp: supp_perm_singleton fresh_star_def fresh_zero_perm)
lemma Abs1_eq_iff_fresh: fixes x y::"'a::fs" and a b c::"'b::at" assumes"atom c ♯ (a, b, x, y)" shows"[{atom a}]set. x = [{atom b}]set. y ⟷ (a ↔ c) ∙ x = (b ↔ c) ∙ y" and"[{atom a}]res. x = [{atom b}]res. y ⟷ (a ↔ c) ∙ x = (b ↔ c) ∙ y" and"[[atom a]]lst. x = [[atom b]]lst. y ⟷ (a ↔ c) ∙ x = (b ↔ c) ∙ y" proof - have"[{atom a}]set. x = (a ↔ c) ∙ ([{atom a}]set. x)" by (rule_tac flip_fresh_fresh[symmetric]) (simp_all add: Abs_fresh_iff assms) thenhave"[{atom a}]set. x = [{atom c}]set. ((a ↔ c) ∙ x)"by simp moreover have"[{atom b}]set. y = (b ↔ c) ∙ ([{atom b}]set. y)" by (rule_tac flip_fresh_fresh[symmetric]) (simp_all add: Abs_fresh_iff assms) thenhave"[{atom b}]set. y = [{atom c}]set. ((b ↔ c) ∙ y)"by simp ultimately show"[{atom a}]set. x = [{atom b}]set. y ⟷ (a ↔ c) ∙ x = (b ↔ c) ∙ y" by (simp add: Abs1_eq) next have"[{atom a}]res. x = (a ↔ c) ∙ ([{atom a}]res. x)" by (rule_tac flip_fresh_fresh[symmetric]) (simp_all add: Abs_fresh_iff assms) thenhave"[{atom a}]res. x = [{atom c}]res. ((a ↔ c) ∙ x)"by simp moreover have"[{atom b}]res. y = (b ↔ c) ∙ ([{atom b}]res. y)" by (rule_tac flip_fresh_fresh[symmetric]) (simp_all add: Abs_fresh_iff assms) thenhave"[{atom b}]res. y = [{atom c}]res. ((b ↔ c) ∙ y)"by simp ultimately show"[{atom a}]res. x = [{atom b}]res. y ⟷ (a ↔ c) ∙ x = (b ↔ c) ∙ y" by (simp add: Abs1_eq) next have"[[atom a]]lst. x = (a ↔ c) ∙ ([[atom a]]lst. x)" by (rule_tac flip_fresh_fresh[symmetric]) (simp_all add: Abs_fresh_iff assms) thenhave"[[atom a]]lst. x = [[atom c]]lst. ((a ↔ c) ∙ x)"by simp moreover have"[[atom b]]lst. y = (b ↔ c) ∙ ([[atom b]]lst. y)" by (rule_tac flip_fresh_fresh[symmetric]) (simp_all add: Abs_fresh_iff assms) thenhave"[[atom b]]lst. y = [[atom c]]lst. ((b ↔ c) ∙ y)"by simp ultimately show"[[atom a]]lst. x = [[atom b]]lst. y ⟷ (a ↔ c) ∙ x = (b ↔ c) ∙ y" by (simp add: Abs1_eq) qed
lemma Abs1_eq_iff_all: fixes x y::"'a::fs" and z::"'c::fs" and a b::"'b::at" shows"[{atom a}]set. x = [{atom b}]set. y ⟷ (∀c. atom c ♯ z ⟶ atom c ♯ (a, b, x, y) ⟶ (a ↔ c) ∙ x = (b ↔ c) ∙ y)" and"[{atom a}]res. x = [{atom b}]res. y ⟷ (∀c. atom c ♯ z ⟶ atom c ♯ (a, b, x, y) ⟶ (a ↔ c) ∙ x = (b ↔ c) ∙ y)" and"[[atom a]]lst. x = [[atom b]]lst. y ⟷ (∀c. atom c ♯ z ⟶ atom c ♯ (a, b, x, y) ⟶ (a ↔ c) ∙ x = (b ↔ c) ∙ y)" apply(auto) apply(simp add: Abs1_eq_iff_fresh(1)[symmetric]) apply(rule_tac ?'a="'b::at"and x="(a, b, x, y, z)"in obtain_fresh) apply(drule_tac x="aa"in spec) apply(simp) apply(subst Abs1_eq_iff_fresh(1)) apply(auto simp: fresh_Pair)[2] apply(simp add: Abs1_eq_iff_fresh(2)[symmetric]) apply(rule_tac ?'a="'b::at"and x="(a, b, x, y, z)"in obtain_fresh) apply(drule_tac x="aa"in spec) apply(simp) apply(subst Abs1_eq_iff_fresh(2)) apply(auto simp: fresh_Pair)[2] apply(simp add: Abs1_eq_iff_fresh(3)[symmetric]) apply(rule_tac ?'a="'b::at"and x="(a, b, x, y, z)"in obtain_fresh) apply(drule_tac x="aa"in spec) apply(simp) apply(subst Abs1_eq_iff_fresh(3)) apply(auto simp: fresh_Pair)[2] done
lemma Abs1_eq_iff: fixes x y::"'a::fs" and a b::"'b::at" shows"[{atom a}]set. x = [{atom b}]set. y ⟷ (a = b ∧ x = y) ∨ (a ≠ b ∧ x = (a ↔ b) ∙ y ∧ atom a ♯ y)" and"[{atom a}]res. x = [{atom b}]res. y ⟷ (a = b ∧ x = y) ∨ (a ≠ b ∧ x = (a ↔ b) ∙ y ∧ atom a ♯ y)" and"[[atom a]]lst. x = [[atom b]]lst. y ⟷ (a = b ∧ x = y) ∨ (a ≠ b ∧ x = (a ↔ b) ∙ y ∧ atom a ♯ y)" proof -
{ assume"a = b" thenhave"[{atom a}]set. x = [{atom b}]set. y ⟷ (a = b ∧ x = y)"by (simp add: Abs1_eq)
} moreover
{ assume *: "a ≠ b"and **: "[{atom a}]set. x = [{atom b}]set. y" have #: "atom a ♯ [{atom b}]set. y"by (simp add: **[symmetric] Abs_fresh_iff) have"[{atom a}]set. ((a ↔ b) ∙ y) = (a ↔ b) ∙ ([{atom b}]set. y)"by (simp) alsohave"… = [{atom b}]set. y" by (rule flip_fresh_fresh) (simp add: #, simp add: Abs_fresh_iff) alsohave"… = [{atom a}]set. x"using ** by simp finallyhave"a ≠ b ∧ x = (a ↔ b) ∙ y ∧ atom a ♯ y"using # * by (simp add: Abs1_eq Abs_fresh_iff)
} moreover
{ assume *: "a ≠ b"and **: "x = (a ↔ b) ∙ y ∧ atom a ♯ y" have"[{atom a}]set. x = [{atom a}]set. ((a ↔ b) ∙ y)"using ** by simp alsohave"… = (a ↔ b) ∙ ([{atom b}]set. y)"by (simp add: permute_set_def) alsohave"… = [{atom b}]set. y" by (rule flip_fresh_fresh) (simp add: Abs_fresh_iff **, simp add: Abs_fresh_iff) finallyhave"[{atom a}]set. x = [{atom b}]set. y" .
} ultimately show"[{atom a}]set. x = [{atom b}]set. y ⟷ (a = b ∧ x = y) ∨ (a ≠ b ∧ x = (a ↔ b)∙ y ∧ atom a ♯ y)" by blast next
{ assume"a = b" thenhave"Abs_res {atom a} x = Abs_res {atom b} y ⟷ (a = b ∧ x = y)"by (simp add: Abs1_eq)
} moreover
{ assume *: "a ≠ b"and **: "Abs_res {atom a} x = Abs_res {atom b} y" have #: "atom a ♯ Abs_res {atom b} y"by (simp add: **[symmetric] Abs_fresh_iff) have"Abs_res {atom a} ((a ↔ b) ∙ y) = (a ↔ b) ∙ (Abs_res {atom b} y)"by simp alsohave"… = Abs_res {atom b} y" by (rule flip_fresh_fresh) (simp add: #, simp add: Abs_fresh_iff) alsohave"… = Abs_res {atom a} x"using ** by simp finallyhave"a ≠ b ∧ x = (a ↔ b) ∙ y ∧ atom a ♯ y"using # * by (simp add: Abs1_eq Abs_fresh_iff)
} moreover
{ assume *: "a ≠ b"and **: "x = (a ↔ b) ∙ y ∧ atom a ♯ y" have"Abs_res {atom a} x = Abs_res {atom a} ((a ↔ b) ∙ y)"using ** by simp alsohave"… = (a ↔ b) ∙ Abs_res {atom b} y"by (simp add: permute_set_def) alsohave"… = Abs_res {atom b} y" by (rule flip_fresh_fresh) (simp add: Abs_fresh_iff **, simp add: Abs_fresh_iff) finallyhave"Abs_res {atom a} x = Abs_res {atom b} y" .
} ultimately show"Abs_res {atom a} x = Abs_res {atom b} y ⟷ (a = b ∧ x = y) ∨ (a ≠ b ∧ x = (a↔ b) ∙ y ∧ atom a ♯ y)" by blast next
{ assume"a = b" thenhave"Abs_lst [atom a] x = Abs_lst [atom b] y ⟷ (a = b ∧ x = y)"by (simp add: Abs1_eq)
} moreover
{ assume *: "a ≠ b"and **: "Abs_lst [atom a] x = Abs_lst [atom b] y" have #: "atom a ♯ Abs_lst [atom b] y"by (simp add: **[symmetric] Abs_fresh_iff) have"Abs_lst [atom a] ((a ↔ b) ∙ y) = (a ↔ b) ∙ (Abs_lst [atom b] y)"by simp alsohave"… = Abs_lst [atom b] y" by (rule flip_fresh_fresh) (simp add: #, simp add: Abs_fresh_iff) alsohave"… = Abs_lst [atom a] x"using ** by simp finallyhave"a ≠ b ∧ x = (a ↔ b) ∙ y ∧ atom a ♯ y"using # * by (simp add: Abs1_eq Abs_fresh_iff)
} moreover
{ assume *: "a ≠ b"and **: "x = (a ↔ b) ∙ y ∧ atom a ♯ y" have"Abs_lst [atom a] x = Abs_lst [atom a] ((a ↔ b) ∙ y)"using ** by simp alsohave"… = (a ↔ b) ∙ Abs_lst [atom b] y"by simp alsohave"… = Abs_lst [atom b] y" by (rule flip_fresh_fresh) (simp add: Abs_fresh_iff **, simp add: Abs_fresh_iff) finallyhave"Abs_lst [atom a] x = Abs_lst [atom b] y" .
} ultimately show"Abs_lst [atom a] x = Abs_lst [atom b] y ⟷ (a = b ∧ x = y) ∨ (a ≠ b ∧ x = (a↔ b) ∙ y ∧ atom a ♯ y)" by blast qed
lemma Abs1_eq_iff': fixes x::"'a::fs" and a b::"'b::at" shows"[{atom a}]set. x = [{atom b}]set. y ⟷ (a = b ∧ x = y) ∨ (a ≠ b ∧ (b ↔ a) ∙x = y ∧ atom b ♯ x)" and"[{atom a}]res. x = [{atom b}]res. y ⟷ (a = b ∧ x = y) ∨ (a ≠ b ∧ (b ↔ a) ∙ x = y ∧ atom b ♯ x)" and"[[atom a]]lst. x = [[atom b]]lst. y ⟷ (a = b ∧ x = y) ∨ (a ≠ b ∧ (b ↔ a) ∙ x = y ∧ atom b ♯ x)" by (auto simp: Abs1_eq_iff fresh_permute_left)
ML ‹
alpha_single_simproc thm _ ctxt ctrm =
let
val thy = Proof_Context.theory_of ctxt
val _ $ (_ $ x) $ (_ $ y) = Thm.term_of ctrm
val cvrs = union (op =) (Term.add_frees x []) (Term.add_frees y [])
|> filter (fn (_, ty) => Sign.of_sort thy (ty, @{sort fs}))
|> map Free
|> HOLogic.mk_tuple
|> Thm.cterm_of ctxt
val cvrs_ty = Thm.ctyp_of_cterm cvrs
val thm' = thm
|> Thm.instantiate' [NONE, NONE, SOME cvrs_ty] [NONE, NONE, NONE, NONE, SOME cvrs]
in
SOME thm'
end ›
lemma [mono]: shows"A <= B ==> C <= D ==> prod_alpha A C <= prod_alpha B D" unfolding prod_alpha_def by auto
lemma [eqvt]: shows"p ∙ prod_alpha A B x y = prod_alpha (p ∙ A) (p ∙ B) (p ∙ x) (p ∙ y)" unfolding prod_alpha_def unfolding rel_prod_conv by (perm_simp) (rule refl)
lemma [eqvt]: shows"p ∙ prod_fv A B (x, y) = prod_fv (p ∙ A) (p ∙ B) (p ∙ x, p ∙ y)" unfolding prod_fv.simps by (perm_simp) (rule refl)
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.