# HG changeset patch # User Cezary Kaliszyk # Date 1324449838 -32400 # Node ID c95afd0dc594878bc586be265f2bc3406a2c5e62 # Parent 3750c08f627e5da9ec214ba6952d9bcd2a5f599a SFT: Rename Lambda to LambdaTerms, rename constants to match Lambda, remove smt proofs. diff -r 3750c08f627e -r c95afd0dc594 Nominal/Ex/SFT/Consts.thy --- a/Nominal/Ex/SFT/Consts.thy Wed Dec 21 14:25:05 2011 +0900 +++ b/Nominal/Ex/SFT/Consts.thy Wed Dec 21 15:43:58 2011 +0900 @@ -4,77 +4,82 @@ fun Umn :: "nat \ nat \ lam" where - [simp del]: "Umn 0 n = \(cn 0). V (cn n)" + [simp del]: "Umn 0 n = \(cn 0). Var (cn n)" | [simp del]: "Umn (Suc m) n = \(cn (Suc m)). Umn m n" lemma [simp]: "2 = Suc 1" by auto +lemma split_lemma: + "(a = b \ X) \ (a \ b \ Y) \ (a = b \ X) \ (a \ b \ Y)" + by blast + lemma Lam_U: - "x \ y \ y \ z \ x \ z \ Umn 2 0 = \x. \y. \z. V z" - "x \ y \ y \ z \ x \ z \ Umn 2 1 = \x. \y. \z. V y" - "x \ y \ y \ z \ x \ z \ Umn 2 2 = \x. \y. \z. V x" - apply (simp_all add: Umn.simps Abs1_eq_iff lam.fresh fresh_at_base flip_def[symmetric] Umn.simps) - apply (smt Zero_not_Suc cnd flip_at_base_simps flip_at_simps)+ + assumes "x \ y" "y \ z" "x \ z" + shows "Umn 2 0 = \x. \y. \z. Var z" + "Umn 2 1 = \x. \y. \z. Var y" + "Umn 2 2 = \x. \y. \z. Var x" + apply (simp_all add: Umn.simps Abs1_eq_iff lam.fresh fresh_at_base flip_def[symmetric] Umn.simps cnd permute_flip_at assms assms[symmetric] split_lemma) + apply (intro impI conjI) + apply (metis assms)+ done -lemma a: "n \ m \ atom (cn n) \ supp (Umn m n)" - apply (induct m) - apply (auto simp add: lam.supp supp_at_base Umn.simps) - by smt +lemma supp_U1: "n \ m \ atom (cn n) \ supp (Umn m n)" + by (induct m) + (auto simp add: lam.supp supp_at_base Umn.simps le_Suc_eq) -lemma b: "supp (Umn m n) \ {atom (cn n)}" +lemma supp_U2: "supp (Umn m n) \ {atom (cn n)}" by (induct m) (auto simp add: lam.supp supp_at_base Umn.simps) lemma supp_U[simp]: "n \ m \ supp (Umn m n) = {}" - using a b + using supp_U1 supp_U2 by blast lemma U_eqvt: "n \ m \ p \ (Umn m n) = Umn m n" by (rule_tac [!] perm_supp_eq) (simp_all add: fresh_star_def fresh_def) -definition Var where "Var \ \cx. \cy. (V cy \ (Umn 2 2) \ V cx \ V cy)" -definition "App \ \cx. \cy. \cz. (V cz \ Umn 2 1 \ V cx \ V cy \ V cz)" -definition "Abs \ \cx. \cy. (V cy \ Umn 2 0 \ V cx \ V cy)" +definition VAR where "VAR \ \cx. \cy. (Var cy \ (Umn 2 2) \ Var cx \ Var cy)" +definition "APP \ \cx. \cy. \cz. (Var cz \ Umn 2 1 \ Var cx \ Var cy \ Var cz)" +definition "Abs \ \cx. \cy. (Var cy \ Umn 2 0 \ Var cx \ Var cy)" -lemma Var_App_Abs: - "x \ e \ Var = \x. \e. (V e \ Umn 2 2 \ V x \ V e)" - "e \ x \ e \ y \ x \ y \ App = \x. \y. \e. (V e \ Umn 2 1 \ V x \ V y \ V e)" - "x \ e \ Abs = \x. \e. (V e \ Umn 2 0 \ V x \ V e)" - unfolding Var_def App_def Abs_def - by (simp_all add: Abs1_eq_iff lam.fresh flip_def[symmetric] U_eqvt fresh_def lam.supp supp_at_base) - (smt cx_cy_cz permute_flip_at Zero_not_Suc cnd flip_at_base_simps flip_at_simps)+ +lemma VAR_APP_Abs: + "x \ e \ VAR = \x. \e. (Var e \ Umn 2 2 \ Var x \ Var e)" + "e \ x \ e \ y \ x \ y \ APP = \x. \y. \e. (Var e \ Umn 2 1 \ Var x \ Var y \ Var e)" + "x \ e \ Abs = \x. \e. (Var e \ Umn 2 0 \ Var x \ Var e)" + unfolding VAR_def APP_def Abs_def + by (simp_all add: Abs1_eq_iff lam.fresh flip_def[symmetric] U_eqvt fresh_def lam.supp supp_at_base split_lemma permute_flip_at) + (auto simp only: cx_cy_cz cx_cy_cz[symmetric]) -lemma Var_app: - "Var \ x \ e \ e \ Umn 2 2 \ x \ e" - by (rule lam2_fast_app) (simp_all add: Var_App_Abs) +lemma VAR_app: + "VAR \ x \ e \ e \ Umn 2 2 \ x \ e" + by (rule lam2_fast_app[OF VAR_APP_Abs(1)]) simp_all -lemma App_app: - "App \ x \ y \ e \ e \ Umn 2 1 \ x \ y \ e" - by (rule lam3_fast_app[OF Var_App_Abs(2)]) (simp_all) +lemma APP_app: + "APP \ x \ y \ e \ e \ Umn 2 1 \ x \ y \ e" + by (rule lam3_fast_app[OF VAR_APP_Abs(2)]) (simp_all) lemma Abs_app: "Abs \ x \ e \ e \ Umn 2 0 \ x \ e" - by (rule lam2_fast_app) (simp_all add: Var_App_Abs) + by (rule lam2_fast_app[OF VAR_APP_Abs(3)]) simp_all -lemma supp_Var_App_Abs[simp]: - "supp Var = {}" "supp App = {}" "supp Abs = {}" - by (simp_all add: Var_def App_def Abs_def lam.supp supp_at_base) blast+ +lemma supp_VAR_APP_Abs[simp]: + "supp VAR = {}" "supp APP = {}" "supp Abs = {}" + by (simp_all add: VAR_def APP_def Abs_def lam.supp supp_at_base) blast+ -lemma Var_App_Abs_eqvt[eqvt]: - "p \ Var = Var" "p \ App = App" "p \ Abs = Abs" +lemma VAR_APP_Abs_eqvt[eqvt]: + "p \ VAR = VAR" "p \ APP = APP" "p \ Abs = Abs" by (rule_tac [!] perm_supp_eq) (simp_all add: fresh_star_def fresh_def) nominal_primrec Numeral :: "lam \ lam" ("\_\" 1000) where - "\V x\ = Var \ (V x)" -| Ap: "\M \ N\ = App \ \M\ \ \N\" + "\Var x\ = VAR \ (Var x)" +| Ap: "\M \ N\ = APP \ \M\ \ \N\" | "\\x. M\ = Abs \ (\x. \M\)" proof auto fix x :: lam and P - assume "\xa. x = V xa \ P" "\M N. x = M \ N \ P" "\xa M. x = \ xa. M \ P" + assume "\xa. x = Var xa \ P" "\M N. x = M \ N \ P" "\xa M. x = \ xa. M \ P" then show "P" by (rule_tac y="x" and c="0 :: perm" in lam.strong_exhaust) (auto simp add: Abs1_eq_iff fresh_star_def)[3] @@ -106,8 +111,8 @@ unfolding fresh_def by simp fun app_lst :: "var \ lam list \ lam" where - "app_lst n [] = V n" -| "app_lst n (h # t) = Ap (app_lst n t) h" + "app_lst n [] = Var n" +| "app_lst n (h # t) = (app_lst n t) \ h" lemma app_lst_eqvt[eqvt]: "p \ (app_lst t ts) = app_lst (p \ t) (p \ ts)" by (induct ts arbitrary: t p) (simp_all add: eqvts) @@ -164,7 +169,7 @@ proof - obtain x :: var where "atom x \ (M, N, P, R)" using obtain_fresh by auto then have *: "atom x \ (M,N,P)" "atom x \ R" using fresh_Pair by simp_all - then have s: "V x \ M \ N \ P [x ::= R] \ R \ M \ N \ P" using b1 by simp + then have s: "Var x \ M \ N \ P [x ::= R] \ R \ M \ N \ P" using b1 by simp show ?thesis using * apply (subst Ltgt.simps) apply (simp add: fresh_Cons fresh_Nil fresh_Pair_elim) @@ -205,18 +210,17 @@ by (rule b3, rule Ltgt3_app, rule lam3_fast_app, rule Lam_U, simp_all) (rule b3, rule Ltgt3_app, rule lam3_fast_app, rule Lam_U[simplified], simp_all)+ -definition "F1 \ \cx. (App \ \Var\ \ (Var \ V cx))" -definition "F2 \ \cx. \cy. \cz. ((App \ (App \ \App\ \ (V cz \ V cx))) \ (V cz \ V cy))" -definition "F3 \ \cx. \cy. (App \ \Abs\ \ (Abs \ (\cz. (V cy \ (V cx \ V cz)))))" +definition "F1 \ \cx. (APP \ \VAR\ \ (VAR \ Var cx))" +definition "F2 \ \cx. \cy. \cz. ((APP \ (APP \ \APP\ \ (Var cz \ Var cx))) \ (Var cz \ Var cy))" +definition "F3 \ \cx. \cy. (APP \ \Abs\ \ (Abs \ (\cz. (Var cy \ (Var cx \ Var cz)))))" lemma Lam_F: - "F1 = \x. (App \ \Var\ \ (Var \ V x))" - "a \ b \ a \ c \ c \ b \ F2 = \a. \b. \c. ((App \ (App \ \App\ \ (V c \ V a))) \ (V c \ V b))" - "a \ b \ a \ x \ x \ b \ F3 = \a. \b. (App \ \Abs\ \ (Abs \ (\x. (V b \ (V a \ V x)))))" - apply (simp_all add: F1_def F2_def F3_def Abs1_eq_iff lam.fresh supp_at_base Var_App_Abs_eqvt Numeral.eqvt flip_def[symmetric] fresh_at_base) - apply (smt cx_cy_cz permute_flip_at)+ - done + "F1 = \x. (APP \ \VAR\ \ (VAR \ Var x))" + "a \ b \ a \ c \ c \ b \ F2 = \a. \b. \c. ((APP \ (APP \ \APP\ \ (Var c \ Var a))) \ (Var c \ Var b))" + "a \ b \ a \ x \ x \ b \ F3 = \a. \b. (APP \ \Abs\ \ (Abs \ (\x. (Var b \ (Var a \ Var x)))))" + by (simp_all add: F1_def F2_def F3_def Abs1_eq_iff lam.fresh supp_at_base VAR_APP_Abs_eqvt Numeral.eqvt flip_def[symmetric] fresh_at_base split_lemma permute_flip_at) + (auto simp add: cx_cy_cz cx_cy_cz[symmetric]) lemma supp_F[simp]: "supp F1 = {}" "supp F2 = {}" "supp F3 = {}" @@ -229,14 +233,14 @@ (simp_all add: fresh_star_def fresh_def) lemma F_app: - "F1 \ A \ App \ \Var\ \ (Var \ A)" - "F2 \ A \ B \ C \ (App \ (App \ \App\ \ (C \ A))) \ (C \ B)" + "F1 \ A \ APP \ \VAR\ \ (VAR \ A)" + "F2 \ A \ B \ C \ (APP \ (APP \ \APP\ \ (C \ A))) \ (C \ B)" by (rule lam1_fast_app, rule Lam_F, simp_all) (rule lam3_fast_app, rule Lam_F, simp_all) lemma F3_app: assumes f: "atom x \ A" "atom x \ B" (* or A and B have empty support *) - shows "F3 \ A \ B \ App \ \Abs\ \ (Abs \ (\x. (B \ (A \ V x))))" + shows "F3 \ A \ B \ APP \ \Abs\ \ (Abs \ (\x. (B \ (A \ Var x))))" proof - obtain y :: var where b: "atom y \ (x, A, B)" using obtain_fresh by blast obtain z :: var where c: "atom z \ (x, y, A, B)" using obtain_fresh by blast @@ -258,16 +262,15 @@ done qed -definition Lam_A1_pre : "A1 \ \cx. \cy. (F1 \ V cx)" -definition Lam_A2_pre : "A2 \ \cx. \cy. \cz. (F2 \ V cx \ V cy \ \[V cz]\)" -definition Lam_A3_pre : "A3 \ \cx. \cy. (F3 \ V cx \ \[V cy]\)" +definition Lam_A1_pre : "A1 \ \cx. \cy. (F1 \ Var cx)" +definition Lam_A2_pre : "A2 \ \cx. \cy. \cz. (F2 \ Var cx \ Var cy \ \[Var cz]\)" +definition Lam_A3_pre : "A3 \ \cx. \cy. (F3 \ Var cx \ \[Var cy]\)" lemma Lam_A: - "x \ y \ A1 = \x. \y. (F1 \ V x)" - "a \ b \ a \ c \ c \ b \ A2 = \a. \b. \c. (F2 \ V a \ V b \ \[V c]\)" - "a \ b \ A3 = \a. \b. (F3 \ V a \ \[V b]\)" - apply (simp_all add: Lam_A1_pre Lam_A2_pre Lam_A3_pre Abs1_eq_iff lam.fresh supp_at_base Var_App_Abs_eqvt Numeral.eqvt flip_def[symmetric] fresh_at_base F_eqvt Ltgt.eqvt) - apply (smt cx_cy_cz permute_flip_at)+ - done + "x \ y \ A1 = \x. \y. (F1 \ Var x)" + "a \ b \ a \ c \ c \ b \ A2 = \a. \b. \c. (F2 \ Var a \ Var b \ \[Var c]\)" + "a \ b \ A3 = \a. \b. (F3 \ Var a \ \[Var b]\)" + by (simp_all add: Lam_A1_pre Lam_A2_pre Lam_A3_pre Abs1_eq_iff lam.fresh supp_at_base VAR_APP_Abs_eqvt Numeral.eqvt flip_def[symmetric] fresh_at_base F_eqvt Ltgt.eqvt split_lemma permute_flip_at cx_cy_cz cx_cy_cz[symmetric]) + auto lemma supp_A[simp]: "supp A1 = {}" "supp A2 = {}" "supp A3 = {}" diff -r 3750c08f627e -r c95afd0dc594 Nominal/Ex/SFT/Lambda.thy --- a/Nominal/Ex/SFT/Lambda.thy Wed Dec 21 14:25:05 2011 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -header {* Definition of Lambda terms and convertibility *} - -theory Lambda imports "../../Nominal2" begin - -lemma [simp]: "supp x = {} \ y \ x" - unfolding fresh_def by blast - -atom_decl var - -nominal_datatype lam = - V "var" -| Ap "lam" "lam" (infixl "\" 98) -| Lm x::"var" l::"lam" binds x in l ("\ _. _" [97, 97] 99) - -nominal_primrec - subst :: "lam \ var \ lam \ lam" ("_ [_ ::= _]" [90, 90, 90] 90) -where - "(V x)[y ::= s] = (if x = y then s else (V x))" -| "(t1 \ t2)[y ::= s] = (t1[y ::= s]) \ (t2[y ::= s])" -| "atom x \ (y, s) \ (\x. t)[y ::= s] = \x.(t[y ::= s])" -proof auto - fix a b :: lam and aa :: var and P - assume "\x y s. a = V x \ aa = y \ b = s \ P" - "\t1 t2 y s. a = t1 \ t2 \ aa = y \ b = s \ P" - "\x y s t. \atom x \ (y, s); a = \ x. t \ aa = y \ b = s\ \ P" - then show "P" - by (rule_tac y="a" and c="(aa, b)" in lam.strong_exhaust) - (blast, blast, simp add: fresh_star_def) -next - fix x :: var and t and xa :: var and ya sa ta - assume *: "eqvt_at subst_sumC (t, ya, sa)" - "atom x \ (ya, sa)" "atom xa \ (ya, sa)" - "[[atom x]]lst. t = [[atom xa]]lst. ta" - then show "[[atom x]]lst. subst_sumC (t, ya, sa) = [[atom xa]]lst. subst_sumC (ta, ya, sa)" - apply - - apply (erule Abs_lst1_fcb) - apply(simp (no_asm) add: Abs_fresh_iff) - apply(drule_tac a="atom xa" in fresh_eqvt_at) - apply(simp add: finite_supp) - apply(simp_all add: fresh_Pair_elim Abs_fresh_iff Abs1_eq_iff) - apply(subgoal_tac "(atom x \ atom xa) \ ya = ya") - apply(subgoal_tac "(atom x \ atom xa) \ sa = sa") - apply(simp add: atom_eqvt eqvt_at_def) - apply(rule perm_supp_eq, simp add: supp_swap fresh_star_def fresh_Pair)+ - done -next - show "eqvt subst_graph" unfolding eqvt_def subst_graph_def - by (rule, perm_simp, rule) -qed - -termination (eqvt) by lexicographic_order - -lemma forget[simp]: - shows "atom x \ t \ t[x ::= s] = t" - by (nominal_induct t avoiding: x s rule: lam.strong_induct) - (auto simp add: lam.fresh fresh_at_base) - -lemma forget_closed[simp]: "supp t = {} \ t[x ::= s] = t" - by (simp add: fresh_def) - -lemma subst_id[simp]: "M [x ::= V x] = M" - by (rule_tac lam="M" and c="x" in lam.strong_induct) - (simp_all add: fresh_star_def lam.fresh fresh_Pair) - -inductive - beta :: "lam \ lam \ bool" (infix "\" 80) -where - bI: "(\x. M) \ N \ M[x ::= N]" -| b1: "M \ M" -| b2: "M \ N \ N \ M" -| b3: "M \ N \ N \ L \ M \ L" -| b4: "M \ N \ Z \ M \ Z \ N" -| b5: "M \ N \ M \ Z \ N \ Z" -| b6: "M \ N \ \x. M \ \x. N" - -lemmas [trans] = b3 -equivariance beta - -end diff -r 3750c08f627e -r c95afd0dc594 Nominal/Ex/SFT/LambdaTerms.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Nominal/Ex/SFT/LambdaTerms.thy Wed Dec 21 15:43:58 2011 +0900 @@ -0,0 +1,83 @@ +header {* Definition of Lambda terms and convertibility *} + +theory LambdaTerms imports "../../Nominal2" begin + +lemma [simp]: "supp x = {} \ y \ x" + unfolding fresh_def by blast + +atom_decl var + +nominal_datatype lam = + Var "var" +| App "lam" "lam" +| Lam x::"var" l::"lam" binds x in l ("Lam [_]. _" [100, 100] 100) + +notation + App (infixl "\" 98) and + Lam ("\ _. _" [97, 97] 99) + +nominal_primrec + subst :: "lam \ var \ lam \ lam" ("_ [_ ::= _]" [90, 90, 90] 90) +where + "(Var x)[y ::= s] = (if x = y then s else (Var x))" +| "(t1 \ t2)[y ::= s] = (t1[y ::= s]) \ (t2[y ::= s])" +| "atom x \ (y, s) \ (\x. t)[y ::= s] = \x.(t[y ::= s])" +proof auto + fix a b :: lam and aa :: var and P + assume "\x y s. a = Var x \ aa = y \ b = s \ P" + "\t1 t2 y s. a = t1 \ t2 \ aa = y \ b = s \ P" + "\x y s t. \atom x \ (y, s); a = \ x. t \ aa = y \ b = s\ \ P" + then show "P" + by (rule_tac y="a" and c="(aa, b)" in lam.strong_exhaust) + (blast, blast, simp add: fresh_star_def) +next + fix x :: var and t and xa :: var and ya sa ta + assume *: "eqvt_at subst_sumC (t, ya, sa)" + "atom x \ (ya, sa)" "atom xa \ (ya, sa)" + "[[atom x]]lst. t = [[atom xa]]lst. ta" + then show "[[atom x]]lst. subst_sumC (t, ya, sa) = [[atom xa]]lst. subst_sumC (ta, ya, sa)" + apply - + apply (erule Abs_lst1_fcb) + apply(simp (no_asm) add: Abs_fresh_iff) + apply(drule_tac a="atom xa" in fresh_eqvt_at) + apply(simp add: finite_supp) + apply(simp_all add: fresh_Pair_elim Abs_fresh_iff Abs1_eq_iff) + apply(subgoal_tac "(atom x \ atom xa) \ ya = ya") + apply(subgoal_tac "(atom x \ atom xa) \ sa = sa") + apply(simp add: atom_eqvt eqvt_at_def) + apply(rule perm_supp_eq, simp add: supp_swap fresh_star_def fresh_Pair)+ + done +next + show "eqvt subst_graph" unfolding eqvt_def subst_graph_def + by (rule, perm_simp, rule) +qed + +termination (eqvt) by lexicographic_order + +lemma forget[simp]: + shows "atom x \ t \ t[x ::= s] = t" + by (nominal_induct t avoiding: x s rule: lam.strong_induct) + (auto simp add: lam.fresh fresh_at_base) + +lemma forget_closed[simp]: "supp t = {} \ t[x ::= s] = t" + by (simp add: fresh_def) + +lemma subst_id[simp]: "M [x ::= Var x] = M" + by (rule_tac lam="M" and c="x" in lam.strong_induct) + (simp_all add: fresh_star_def lam.fresh fresh_Pair) + +inductive + beta :: "lam \ lam \ bool" (infix "\" 80) +where + bI: "(\x. M) \ N \ M[x ::= N]" +| b1: "M \ M" +| b2: "M \ N \ N \ M" +| b3: "M \ N \ N \ L \ M \ L" +| b4: "M \ N \ Z \ M \ Z \ N" +| b5: "M \ N \ M \ Z \ N \ Z" +| b6: "M \ N \ \x. M \ \x. N" + +lemmas [trans] = b3 +equivariance beta + +end diff -r 3750c08f627e -r c95afd0dc594 Nominal/Ex/SFT/Theorem.thy --- a/Nominal/Ex/SFT/Theorem.thy Wed Dec 21 14:25:05 2011 +0900 +++ b/Nominal/Ex/SFT/Theorem.thy Wed Dec 21 15:43:58 2011 +0900 @@ -8,31 +8,31 @@ lemma Num: shows "Num \ \M\ \ \\M\\" proof (induct M rule: lam.induct) - case (V n) - have "Num \ \V n\ = Num \ (Var \ V n)" by simp - also have "... = \[\[A1,A2,A3]\]\ \ (Var \ V n)" by simp - also have "... \ Var \ V n \ \[A1,A2,A3]\" using app . - also have "... \ \[A1,A2,A3]\ \ Umn 2 2 \ V n \ \[A1,A2,A3]\" using Var_app . - also have "... \ A1 \ V n \ \[A1,A2,A3]\" using U_app by simp - also have "... \ F1 \ V n" using A_app(1) . - also have "... \ App \ \Var\ \ (Var \ V n)" using F_app(1) . - also have "... = \\V n\\" by simp - finally show "Num \ \V n\ \ \\V n\\". + case (Var n) + have "Num \ \Var n\ = Num \ (VAR \ Var n)" by simp + also have "... = \[\[A1,A2,A3]\]\ \ (VAR \ Var n)" by simp + also have "... \ VAR \ Var n \ \[A1,A2,A3]\" using app . + also have "... \ \[A1,A2,A3]\ \ Umn 2 2 \ Var n \ \[A1,A2,A3]\" using VAR_app . + also have "... \ A1 \ Var n \ \[A1,A2,A3]\" using U_app by simp + also have "... \ F1 \ Var n" using A_app(1) . + also have "... \ APP \ \VAR\ \ (VAR \ Var n)" using F_app(1) . + also have "... = \\Var n\\" by simp + finally show "Num \ \Var n\ \ \\Var n\\". next - case (Ap M N) + case (App M N) assume IH: "Num \ \M\ \ \\M\\" "Num \ \N\ \ \\N\\" - have "Num \ \M \ N\ = Num \ (App \ \M\ \ \N\)" by simp - also have "... = \[\[A1,A2,A3]\]\ \ (App \ \M\ \ \N\)" by simp - also have "... \ App \ \M\ \ \N\ \ \[A1,A2,A3]\" using app . - also have "... \ \[A1,A2,A3]\ \ Umn 2 1 \ \M\ \ \N\ \ \[A1,A2,A3]\" using App_app . + have "Num \ \M \ N\ = Num \ (APP \ \M\ \ \N\)" by simp + also have "... = \[\[A1,A2,A3]\]\ \ (APP \ \M\ \ \N\)" by simp + also have "... \ APP \ \M\ \ \N\ \ \[A1,A2,A3]\" using app . + also have "... \ \[A1,A2,A3]\ \ Umn 2 1 \ \M\ \ \N\ \ \[A1,A2,A3]\" using APP_app . also have "... \ A2 \ \M\ \ \N\ \ \[A1,A2,A3]\" using U_app by simp also have "... \ F2 \ \M\ \ \N\ \ Num" using A_app(2) by simp - also have "... \ App \ (App \ \App\ \ (Num \ \M\)) \ (Num \ \N\)" using F_app(2) . - also have "... \ App \ (App \ \App\ \ (\\M\\)) \ (Num \ \N\)" using IH by simp + also have "... \ APP \ (APP \ \APP\ \ (Num \ \M\)) \ (Num \ \N\)" using F_app(2) . + also have "... \ APP \ (APP \ \APP\ \ (\\M\\)) \ (Num \ \N\)" using IH by simp also have "... \ \\M \ N\\" using IH by simp finally show "Num \ \M \ N\ \ \\M \ N\\". next - case (Lm x P) + case (Lam x P) assume IH: "Num \ \P\ \ \\P\\" have "Num \ \\ x. P\ = Num \ (Abs \ \ x. \P\)" by simp also have "... = \[\[A1,A2,A3]\]\ \ (Abs \ \ x. \P\)" by simp @@ -41,9 +41,9 @@ also have "... \ A3 \ (\ x. \P\) \ \[A1,A2,A3]\" using U_app by simp also have "... \ F3 \ (\ x. \P\) \ \[\[A1,A2,A3]\]\" using A_app(3) . also have "... = F3 \ (\ x. \P\) \ Num" by simp - also have "... \ App \ \Abs\ \ (Abs \ \ x. (Num \ ((\ x. \P\) \ V x)))" by (rule F3_app) simp_all - also have "... \ App \ \Abs\ \ (Abs \ \ x. (Num \ \P\))" using beta_app by simp - also have "... \ App \ \Abs\ \ (Abs \ \ x. \\P\\)" using IH by simp + also have "... \ APP \ \Abs\ \ (Abs \ \ x. (Num \ ((\ x. \P\) \ Var x)))" by (rule F3_app) simp_all + also have "... \ APP \ \Abs\ \ (Abs \ \ x. (Num \ \P\))" using beta_app by simp + also have "... \ APP \ \Abs\ \ (Abs \ \ x. \\P\\)" using IH by simp also have "... = \\\ x. P\\" by simp finally show "Num \ \\ x. P\ \ \\\ x. P\\" . qed @@ -56,12 +56,12 @@ shows "\X. X \ F \ \X\" proof - obtain x :: var where [simp]:"atom x \ F" using obtain_fresh by blast - def W \ "\x. (F \ (App \ V x \ (Num \ V x)))" + def W \ "\x. (F \ (APP \ Var x \ (Num \ Var x)))" def X \ "W \ \W\" have a: "X = W \ \W\" unfolding X_def .. - also have "... = (\x. (F \ (App \ V x \ (Num \ V x)))) \ \W\" unfolding W_def .. - also have "... \ F \ (App \ \W\ \ (Num \ \W\))" by simp - also have "... \ F \ (App \ \W\ \ \\W\\)" by simp + also have "... = (\x. (F \ (APP \ Var x \ (Num \ Var x)))) \ \W\" unfolding W_def .. + also have "... \ F \ (APP \ \W\ \ (Num \ \W\))" by simp + also have "... \ F \ (APP \ \W\ \ \\W\\)" by simp also have "... \ F \ \W \ \W\\" by simp also have "... = F \ \X\" unfolding X_def .. finally show ?thesis by blast diff -r 3750c08f627e -r c95afd0dc594 Nominal/Ex/SFT/Utils.thy --- a/Nominal/Ex/SFT/Utils.thy Wed Dec 21 14:25:05 2011 +0900 +++ b/Nominal/Ex/SFT/Utils.thy Wed Dec 21 15:43:58 2011 +0900 @@ -1,9 +1,9 @@ header {* Utilities for defining constants and functions *} -theory Utils imports Lambda begin +theory Utils imports LambdaTerms begin lemma beta_app: - "(\ x. M) \ V x \ M" + "(\ x. M) \ Var x \ M" by (rule b3, rule bI) (simp add: b1) @@ -72,7 +72,7 @@ done qed -definition cn :: "nat \ var" where "cn n \ Abs_var (Atom (Sort ''Lambda.var'' []) n)" +definition cn :: "nat \ var" where "cn n \ Abs_var (Atom (Sort ''LambdaTerms.var'' []) n)" lemma cnd[simp]: "m \ n \ cn m \ cn n" unfolding cn_def using Abs_var_inject by simp