diff -r 3bbe7cab8037 -r 65a9a30b8ece src/HOL/Nominal/Examples/CR.thy --- a/src/HOL/Nominal/Examples/CR.thy Tue Oct 10 15:33:25 2006 +0200 +++ b/src/HOL/Nominal/Examples/CR.thy Tue Oct 10 16:26:59 2006 +0200 @@ -7,69 +7,74 @@ text {* The Church-Rosser proof from Barendregt's book *} lemma forget: - assumes a: "a\t1" - shows "t1[a::=t2] = t1" -using a -proof (nominal_induct t1 avoiding: a t2 rule: lam.induct) - case (Var b) - thus ?case by (simp add: fresh_atm) + assumes asm: "x\L" + shows "L[x::=P] = L" +using asm +proof (nominal_induct L avoiding: x P rule: lam.induct) + case (Var z) + have "x\Var z" by fact + thus "(Var z)[x::=P] = (Var z)" by (simp add: fresh_atm) next - case App - thus ?case by simp + case (App M1 M2) + have "x\App M1 M2" by fact + moreover + have ih1: "x\M1 \ M1[x::=P] = M1" by fact + moreover + have ih1: "x\M2 \ M2[x::=P] = M2" by fact + ultimately show "(App M1 M2)[x::=P] = (App M1 M2)" by simp next - case (Lam c t) - have ih: "\c t2. c\t \ t[c::=t2] = t" by fact - have a: "c\t2" by fact - have "c\a" by fact - hence b: "a\c" by (simp add: fresh_atm) - have "a\Lam [c].t" by fact - hence "a\t" using b by (simp add: abs_fresh) - hence "t[a::=t2] = t" using ih by simp - thus "(Lam [c].t)[a::=t2] = Lam [c].t" using a b by simp + case (Lam z M) + have vc: "z\x" "z\P" by fact + have ih: "x\M \ M[x::=P] = M" by fact + have asm: "x\Lam [z].M" by fact + with vc have "x\M" by (simp add: fresh_atm abs_fresh) + hence "M[x::=P] = M" using ih by simp + thus "(Lam [z].M)[x::=P] = Lam [z].M" using vc by simp qed lemma forget_automatic: - assumes asm: "a\t\<^isub>1" - shows "t\<^isub>1[a::=t\<^isub>2] = t\<^isub>1" - using asm by (nominal_induct t\<^isub>1 avoiding: a t\<^isub>2 rule: lam.induct) + assumes asm: "x\L" + shows "L[x::=P] = L" + using asm by (nominal_induct L avoiding: x P rule: lam.induct) (auto simp add: abs_fresh fresh_atm) lemma fresh_fact: - fixes a :: "name" - assumes a: "a\t1" - and b: "a\t2" - shows "a\(t1[b::=t2])" -using a b -proof (nominal_induct t1 avoiding: a b t2 rule: lam.induct) - case (Var c) - thus ?case by simp + fixes z::"name" + assumes asms: "z\N" "z\L" + shows "z\(N[y::=L])" +using asms +proof (nominal_induct N avoiding: z y L rule: lam.induct) + case (Var u) + have "z\(Var u)" "z\L" by fact + thus "z\((Var u)[y::=L])" by simp next - case App thus ?case by simp + case (App N1 N2) + have ih1: "\z\N1; z\L\ \ z\N1[y::=L]" by fact + moreover + have ih2: "\z\N2; z\L\ \ z\N2[y::=L]" by fact + moreover + have "z\App N1 N2" "z\L" by fact + ultimately show "z\((App N1 N2)[y::=L])" by simp next - case (Lam c t) - have ih: "\(a::name) b t2. a\t \ a\t2 \ a\(t[b::=t2])" by fact - have fr: "c\a" "c\b" "c\t2" by fact+ - hence fr': "c\a" by (simp add: fresh_atm) - have a1: "a\t2" by fact - have a2: "a\Lam [c].t" by fact - hence "a\t" using fr' by (simp add: abs_fresh) - hence "a\t[b::=t2]" using a1 ih by simp - thus "a\(Lam [c].t)[b::=t2]" using fr by (simp add: abs_fresh) + case (Lam u N1) + have vc: "u\z" "u\y" "u\L" by fact + have "z\Lam [u].N1" by fact + hence "z\N1" using vc by (simp add: abs_fresh fresh_atm) + moreover + have ih: "\z\N1; z\L\ \ z\(N1[y::=L])" by fact + moreover + have "z\L" by fact + ultimately show "z\(Lam [u].N1)[y::=L]" using vc by (simp add: abs_fresh) qed lemma fresh_fact_automatic: - fixes a::"name" - assumes asm: "a\t\<^isub>1" "a\t\<^isub>2" - shows "a\(t\<^isub>1[b::=t\<^isub>2])" -using asm by (nominal_induct t\<^isub>1 avoiding: a b t\<^isub>2 rule: lam.induct) - (auto simp add: abs_fresh fresh_atm) + fixes z::"name" + assumes asms: "z\N" "z\L" + shows "z\(N[y::=L])" +using asms by (nominal_induct N avoiding: z y L rule: lam.induct) + (auto simp add: abs_fresh fresh_atm) -lemma subs_lemma: - fixes x::"name" - and y::"name" - and L::"lam" - and M::"lam" - and N::"lam" +lemma substitution_lemma: assumes a: "x\y" and b: "x\L" shows "M[x::=N][y::=L] = M[y::=L][x::=N[y::=L]]" @@ -88,7 +93,7 @@ } moreover { (*Case 1.2*) - assume "z\x" and "z=y" + assume "z=y" and "z\x" have "(1)": "?LHS = L" using `z\x` `z=y` by force have "(2)": "?RHS = L[x::=N[y::=L]]" using `z=y` by force have "(3)": "L[x::=N[y::=L]] = L" using `x\L` by (simp add: forget) @@ -105,13 +110,13 @@ qed next case (Lam z M1) (* case 2: lambdas *) - have ih: "\x y N L. \x\y; x\L\ \ M1[x::=N][y::=L] = M1[y::=L][x::=N[y::=L]]" by fact + have ih: "\x\y; x\L\ \ M1[x::=N][y::=L] = M1[y::=L][x::=N[y::=L]]" by fact have "x\y" by fact have "x\L" by fact have fs: "z\x" "z\y" "z\N" "z\L" by fact hence "z\N[y::=L]" by (simp add: fresh_fact) show "(Lam [z].M1)[x::=N][y::=L] = (Lam [z].M1)[y::=L][x::=N[y::=L]]" (is "?LHS=?RHS") - proof - + proof - have "?LHS = Lam [z].(M1[x::=N][y::=L])" using `z\x` `z\y` `z\N` `z\L` by simp also from ih have "\ = Lam [z].(M1[y::=L][x::=N[y::=L]])" using `x\y` `x\L` by simp also have "\ = (Lam [z].(M1[y::=L]))[x::=N[y::=L]]" using `z\x` `z\N[y::=L]` by simp @@ -123,7 +128,7 @@ thus ?case by simp qed -lemma subs_lemma_automatic: +lemma substitution_lemma_automatic: assumes asm: "x\y" "x\L" shows "M[x::=N][y::=L] = M[y::=L][x::=N[y::=L]]" using asm by (nominal_induct M avoiding: x y N L rule: lam.induct) @@ -509,7 +514,7 @@ also have "App (Lam [a].(M1[x::=N])) (N1[x::=N]) \\<^isub>1 M2[x::=N'][a::=N2[x::=N']]" using o4 b by force also have "M2[x::=N'][a::=N2[x::=N']] = M2[a::=N2][x::=N']" - using e3 by (simp add: subs_lemma fresh_atm) + using e3 by (simp add: substitution_lemma fresh_atm) ultimately show "(App (Lam [a].M1) N1)[x::=N] \\<^isub>1 M2[a::=N2][x::=N']" by simp qed qed @@ -520,7 +525,7 @@ shows "M[x::=N]\\<^isub>1M'[x::=N']" using a b apply(nominal_induct M M' avoiding: N N' x rule: one_induct) -apply(auto simp add: one_subst_aux subs_lemma fresh_atm) +apply(auto simp add: one_subst_aux substitution_lemma fresh_atm) done lemma diamond[rule_format]: