diff -r 1b7c034c9e9e -r 0440bc1a2438 Nominal/Nominal2_Abs.thy --- a/Nominal/Nominal2_Abs.thy Mon Jun 18 14:50:02 2012 +0100 +++ b/Nominal/Nominal2_Abs.thy Thu Jul 12 10:11:32 2012 +0100 @@ -792,103 +792,175 @@ section {* Abstractions of single atoms *} lemma Abs1_eq: - fixes x::"'a::fs" - shows "Abs_set {a} x = Abs_set {a} y \ x = y" - and "Abs_res {a} x = Abs_res {a} y \ x = y" - and "Abs_lst [c] x = Abs_lst [c] y \ x = y" + 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 apply(simp_all add: supp_perm_singleton fresh_star_def fresh_zero_perm) apply(blast)+ done +lemma Abs1_eq_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) + then have "[{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) + then have "[{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) + then have "[{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) + then have "[{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) + then have "[[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) + then have "[[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_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 \ (a, b, x, y, z) \ (a \ c) \ x = (b \ c) \ y)" + and "[{atom a}]res. x = [{atom b}]res. y \ (\c. atom c \ (a, b, x, y, z) \ (a \ c) \ x = (b \ c) \ y)" + and "[[atom a]]lst. x = [[atom b]]lst. y \ (\c. atom c \ (a, b, x, y, z) \ (a \ c) \ x = (b \ c) \ y)" +apply - +apply(auto) +apply(simp add: Abs1_eq_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_fresh(1)) +apply(auto simp add: fresh_Pair)[1] +apply(assumption) +apply(simp add: Abs1_eq_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_fresh(2)) +apply(auto simp add: fresh_Pair)[1] +apply(assumption) +apply(simp add: Abs1_eq_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_fresh(3)) +apply(auto simp add: fresh_Pair)[1] +apply(assumption) +done + lemma Abs1_eq_iff: - fixes x::"'a::fs" - assumes "sort_of a = sort_of b" - and "sort_of c = sort_of d" - shows "Abs_set {a} x = Abs_set {b} y \ (a = b \ x = y) \ (a \ b \ x = (a \ b) \ y \ a \ y)" - and "Abs_res {a} x = Abs_res {b} y \ (a = b \ x = y) \ (a \ b \ x = (a \ b) \ y \ a \ y)" - and "Abs_lst [c] x = Abs_lst [d] y \ (c = d \ x = y) \ (c \ d \ x = (c \ d) \ y \ c \ y)" + 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" - then have "Abs_set {a} x = Abs_set {b} y \ (a = b \ x = y)" by (simp add: Abs1_eq) + then have "[{atom a}]set. x = [{atom b}]set. y \ (a = b \ x = y)" by (simp add: Abs1_eq) } moreover - { assume *: "a \ b" and **: "Abs_set {a} x = Abs_set {b} y" - have #: "a \ Abs_set {b} y" by (simp add: **[symmetric] Abs_fresh_iff) - have "Abs_set {a} ((a \ b) \ y) = (a \ b) \ (Abs_set {b} y)" by (simp add: permute_set_def assms) - also have "\ = Abs_set {b} y" - by (rule swap_fresh_fresh) (simp add: #, simp add: Abs_fresh_iff) - also have "\ = Abs_set {a} x" using ** by simp - finally have "a \ b \ x = (a \ b) \ y \ a \ y" using # * by (simp add: Abs1_eq Abs_fresh_iff) + { assume *: "a \ b" and **: "Abs_set {atom a} x = Abs_set {atom b} y" + have #: "atom a \ Abs_set {atom b} y" by (simp add: **[symmetric] Abs_fresh_iff) + have "Abs_set {atom a} ((a \ b) \ y) = (a \ b) \ (Abs_set {atom b} y)" by (simp) + also have "\ = Abs_set {atom b} y" + by (rule flip_fresh_fresh) (simp add: #, simp add: Abs_fresh_iff) + also have "\ = Abs_set {atom a} x" using ** by simp + finally have "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 \ a \ y" - have "Abs_set {a} x = Abs_set {a} ((a \ b) \ y)" using ** by simp - also have "\ = (a \ b) \ Abs_set {b} y" by (simp add: permute_set_def assms) - also have "\ = Abs_set {b} y" - by (rule swap_fresh_fresh) (simp add: Abs_fresh_iff **, simp add: Abs_fresh_iff) - finally have "Abs_set {a} x = Abs_set {b} y" . + { assume *: "a \ b" and **: "x = (a \ b) \ y \ atom a \ y" + have "Abs_set {atom a} x = Abs_set {atom a} ((a \ b) \ y)" using ** by simp + also have "\ = (a \ b) \ Abs_set {atom b} y" by (simp add: permute_set_def assms) + also have "\ = Abs_set {atom b} y" + by (rule flip_fresh_fresh) (simp add: Abs_fresh_iff **, simp add: Abs_fresh_iff) + finally have "Abs_set {atom a} x = Abs_set {atom b} y" . } ultimately - show "Abs_set {a} x = Abs_set {b} y \ (a = b \ x = y) \ (a \ b \ x = (a \ b) \ y \ a \ y)" + show "Abs_set {atom a} x = Abs_set {atom b} y \ (a = b \ x = y) \ (a \ b \ x = (a \ b) \ y \ atom a \ y)" by blast next { assume "a = b" - then have "Abs_res {a} x = Abs_res {b} y \ (a = b \ x = y)" by (simp add: Abs1_eq) + then have "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 {a} x = Abs_res {b} y" - have #: "a \ Abs_res {b} y" by (simp add: **[symmetric] Abs_fresh_iff) - have "Abs_res {a} ((a \ b) \ y) = (a \ b) \ (Abs_res {b} y)" by (simp add: permute_set_def assms) - also have "\ = Abs_res {b} y" - by (rule swap_fresh_fresh) (simp add: #, simp add: Abs_fresh_iff) - also have "\ = Abs_res {a} x" using ** by simp - finally have "a \ b \ x = (a \ b) \ y \ a \ y" using # * by (simp add: Abs1_eq Abs_fresh_iff) + { 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 add: assms) + also have "\ = Abs_res {atom b} y" + by (rule flip_fresh_fresh) (simp add: #, simp add: Abs_fresh_iff) + also have "\ = Abs_res {atom a} x" using ** by simp + finally have "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 \ a \ y" - have "Abs_res {a} x = Abs_res {a} ((a \ b) \ y)" using ** by simp - also have "\ = (a \ b) \ Abs_res {b} y" by (simp add: permute_set_def assms) - also have "\ = Abs_res {b} y" - by (rule swap_fresh_fresh) (simp add: Abs_fresh_iff **, simp add: Abs_fresh_iff) - finally have "Abs_res {a} x = Abs_res {b} y" . + { 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 + also have "\ = (a \ b) \ Abs_res {atom b} y" by (simp add: permute_set_def assms) + also have "\ = Abs_res {atom b} y" + by (rule flip_fresh_fresh) (simp add: Abs_fresh_iff **, simp add: Abs_fresh_iff) + finally have "Abs_res {atom a} x = Abs_res {atom b} y" . } ultimately - show "Abs_res {a} x = Abs_res {b} y \ (a = b \ x = y) \ (a \ b \ x = (a \ b) \ y \ a \ y)" + 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 "c = d" - then have "Abs_lst [c] x = Abs_lst [d] y \ (c = d \ x = y)" by (simp add: Abs1_eq) + { assume "a = b" + then have "Abs_lst [atom a] x = Abs_lst [atom b] y \ (a = b \ x = y)" by (simp add: Abs1_eq) } moreover - { assume *: "c \ d" and **: "Abs_lst [c] x = Abs_lst [d] y" - have #: "c \ Abs_lst [d] y" by (simp add: **[symmetric] Abs_fresh_iff) - have "Abs_lst [c] ((c \ d) \ y) = (c \ d) \ (Abs_lst [d] y)" by (simp add: assms) - also have "\ = Abs_lst [d] y" - by (rule swap_fresh_fresh) (simp add: #, simp add: Abs_fresh_iff) - also have "\ = Abs_lst [c] x" using ** by simp - finally have "c \ d \ x = (c \ d) \ y \ c \ y" using # * by (simp add: Abs1_eq Abs_fresh_iff) + { 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 add: assms) + also have "\ = Abs_lst [atom b] y" + by (rule flip_fresh_fresh) (simp add: #, simp add: Abs_fresh_iff) + also have "\ = Abs_lst [atom a] x" using ** by simp + finally have "a \ b \ x = (a \ b) \ y \ atom a \ y" using # * by (simp add: Abs1_eq Abs_fresh_iff) } moreover - { assume *: "c \ d" and **: "x = (c \ d) \ y \ c \ y" - have "Abs_lst [c] x = Abs_lst [c] ((c \ d) \ y)" using ** by simp - also have "\ = (c \ d) \ Abs_lst [d] y" by (simp add: assms) - also have "\ = Abs_lst [d] y" - by (rule swap_fresh_fresh) (simp add: Abs_fresh_iff **, simp add: Abs_fresh_iff) - finally have "Abs_lst [c] x = Abs_lst [d] y" . + { 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 + also have "\ = (a \ b) \ Abs_lst [atom b] y" by (simp add: assms) + also have "\ = Abs_lst [atom b] y" + by (rule flip_fresh_fresh) (simp add: Abs_fresh_iff **, simp add: Abs_fresh_iff) + finally have "Abs_lst [atom a] x = Abs_lst [atom b] y" . } ultimately - show "Abs_lst [c] x = Abs_lst [d] y \ (c = d \ x = y) \ (c \ d \ x = (c \ d) \ y \ c \ y)" + 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" - assumes "sort_of a = sort_of b" - and "sort_of c = sort_of d" - shows "Abs_set {a} x = Abs_set {b} y \ (a = b \ x = y) \ (a \ b \ (b \ a) \ x = y \ b \ x)" - and "Abs_res {a} x = Abs_res {b} y \ (a = b \ x = y) \ (a \ b \ (b \ a) \ x = y \ b \ x)" - and "Abs_lst [c] x = Abs_lst [d] y \ (c = d \ x = y) \ (c \ d \ (d \ c) \ x = y \ d \ x)" + 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)" using assms by (auto simp add: Abs1_eq_iff fresh_permute_left)