diff -r 6f6ee78c7357 -r ba7e81531c6d Quot/Examples/LamEx.thy --- a/Quot/Examples/LamEx.thy Fri Jan 01 11:30:00 2010 +0100 +++ b/Quot/Examples/LamEx.thy Fri Jan 01 23:59:32 2010 +0100 @@ -4,33 +4,44 @@ atom_decl name -thm abs_fresh(1) - -nominal_datatype rlam = +datatype rlam = rVar "name" | rApp "rlam" "rlam" | rLam "name" "rlam" -print_theorems - -function +fun rfv :: "rlam \ name set" where rfv_var: "rfv (rVar a) = {a}" | rfv_app: "rfv (rApp t1 t2) = (rfv t1) \ (rfv t2)" | rfv_lam: "rfv (rLam a t) = (rfv t) - {a}" -sorry + +overloading + perm_rlam \ "perm :: 'x prm \ rlam \ rlam" (unchecked) +begin -termination rfv sorry +fun + perm_rlam +where + "perm_rlam pi (rVar a) = rVar (pi \ a)" +| "perm_rlam pi (rApp t1 t2) = rApp (perm_rlam pi t1) (perm_rlam pi t2)" +| "perm_rlam pi (rLam a t) = rLam (pi \ a) (perm_rlam pi t)" + +end inductive alpha :: "rlam \ rlam \ bool" ("_ \ _" [100, 100] 100) where a1: "a = b \ (rVar a) \ (rVar b)" | a2: "\t1 \ t2; s1 \ s2\ \ rApp t1 s1 \ rApp t2 s2" -| a3: "\t \ ([(a,b)]\s); a \ rfv (rLam b t)\ \ rLam a t \ rLam b s" +| a3: "\t \ ([(a,b)] \ s); a \ rfv (rLam b t)\ \ rLam a t \ rLam b s" -print_theorems +lemma helper: + fixes t::"rlam" + and a::"name" + shows "[(a, a)] \ t = t" +by (induct t) + (auto simp add: calc_atm) lemma alpha_refl: fixes t::"rlam" @@ -39,10 +50,7 @@ apply(simp add: a1) apply(simp add: a2) apply(rule a3) - apply(subst pt_swap_bij'') - apply(rule pt_name_inst) - apply(rule at_name_inst) - apply(simp) + apply(simp add: helper) apply(simp) done @@ -51,10 +59,8 @@ sorry quotient_type lam = rlam / alpha - apply(rule alpha_equivp) - done + by (rule alpha_equivp) -print_quotients quotient_definition "Var :: name \ lam" @@ -71,15 +77,14 @@ as "rLam" -thm Var_def -thm App_def -thm Lam_def - quotient_definition "fv :: lam \ name set" as "rfv" +thm Var_def +thm App_def +thm Lam_def thm fv_def (* definition of overloaded permutation function *) @@ -97,22 +102,36 @@ thm perm_lam_def -(* lemmas that need to lift *) -lemma pi_var_com: +(* lemmas that need to be lifted *) +lemma pi_var_eqvt1: fixes pi::"'x prm" - shows "(pi\rVar a) \ rVar (pi\a)" - sorry + shows "(pi \ rVar a) \ rVar (pi \ a)" + by (simp add: alpha_refl) -lemma pi_app_com: +lemma pi_var_eqvt2: + fixes pi::"'x prm" + shows "(pi \ rVar a) = rVar (pi \ a)" + by (simp) + +lemma pi_app_eqvt1: fixes pi::"'x prm" - shows "(pi\rApp t1 t2) \ rApp (pi\t1) (pi\t2)" - sorry + shows "(pi \ rApp t1 t2) \ rApp (pi \ t1) (pi \ t2)" + by (simp add: alpha_refl) + +lemma pi_app_eqvt2: + fixes pi::"'x prm" + shows "(pi \ rApp t1 t2) = rApp (pi \ t1) (pi \ t2)" + by (simp) -lemma pi_lam_com: +lemma pi_lam_eqvt1: fixes pi::"'x prm" - shows "(pi\rLam a t) \ rLam (pi\a) (pi\t)" - sorry + shows "(pi \ rLam a t) \ rLam (pi \ a) (pi \ t)" + by (simp add: alpha_refl) +lemma pi_lam_eqvt2: + fixes pi::"'x prm" + shows "(pi \ rLam a t) = rLam (pi \ a) (pi \ t)" + by (simp add: alpha) lemma real_alpha: @@ -136,25 +155,20 @@ lemma rVar_rsp[quot_respect]: "(op = ===> alpha) rVar rVar" -by (auto intro:a1) +by (auto intro: a1) lemma rApp_rsp[quot_respect]: "(alpha ===> alpha ===> alpha) rApp rApp" -by (auto intro:a2) +by (auto intro: a2) lemma rLam_rsp[quot_respect]: "(op = ===> alpha ===> alpha) rLam rLam" apply(auto) apply(rule a3) - apply(rule_tac t="[(x,x)]\y" and s="y" in subst) - apply(rule sym) - apply(rule trans) - apply(rule pt_name3) - apply(rule at_ds1[OF at_name_inst]) - apply(simp add: pt_name1) - apply(assumption) - apply(simp add: abs_fresh) + apply(simp add: helper) + apply(simp) done -lemma rfv_rsp[quot_respect]: "(alpha ===> op =) rfv rfv" +lemma rfv_rsp[quot_respect]: + "(alpha ===> op =) rfv rfv" sorry lemma rvar_inject: "rVar a \ rVar b = (a = b)" @@ -164,76 +178,86 @@ done -lemma pi_var: "(pi\('x \ 'x) list) \ Var a = Var (pi \ a)" -apply (lifting pi_var_com) -done +lemma pi_var1: + fixes pi::"'x prm" + shows "pi \ Var a = Var (pi \ a)" + by (lifting pi_var_eqvt1) -lemma pi_app: "(pi\('x \ 'x) list) \ App (x\lam) (xa\lam) = App (pi \ x) (pi \ xa)" -apply (lifting pi_app_com) -done +lemma pi_var2: + fixes pi::"'x prm" + shows "pi \ Var a = Var (pi \ a)" + by (lifting pi_var_eqvt2) + -lemma pi_lam: "(pi\('x \ 'x) list) \ Lam (a\name) (x\lam) = Lam (pi \ a) (pi \ x)" -apply (lifting pi_lam_com) -done +lemma pi_app: + fixes pi::"'x prm" + shows "pi \ App t1 t2 = App (pi \ t1) (pi \ t2)" + by (lifting pi_app_eqvt2) -lemma fv_var: "fv (Var (a\name)) = {a}" -apply (lifting rfv_var) -done +lemma pi_lam: + fixes pi::"'x prm" + shows "pi \ Lam a t = Lam (pi \ a) (pi \ t)" + by (lifting pi_lam_eqvt2) -lemma fv_app: "fv (App (x\lam) (xa\lam)) = fv x \ fv xa" -apply (lifting rfv_app) -done +lemma fv_var: + shows "fv (Var a) = {a}" + by (lifting rfv_var) -lemma fv_lam: "fv (Lam (a\name) (x\lam)) = fv x - {a}" -apply (lifting rfv_lam) -done +lemma fv_app: + shows "fv (App t1 t2) = fv t1 \ fv t2" + by (lifting rfv_app) + +lemma fv_lam: + shows "fv (Lam a t) = fv t - {a}" + by (lifting rfv_lam) -lemma a1: "(a\name) = (b\name) \ Var a = Var b" -apply (lifting a1) -done +lemma a1: + "a = b \ Var a = Var b" + by (lifting a1) -lemma a2: "\(x\lam) = (xa\lam); (xb\lam) = (xc\lam)\ \ App x xb = App xa xc" -apply (lifting a2) -done +lemma a2: + "\x = xa; xb = xc\ \ App x xb = App xa xc" + by (lifting a2) -lemma a3: "\(x\lam) = [(a\name, b\name)] \ (xa\lam); a \ fv (Lam b x)\ \ Lam a x = Lam b xa" -apply (lifting a3) -done +lemma a3: + "\x = [(a, b)] \ xa; a \ fv (Lam b x)\ \ Lam a x = Lam b xa" + by (lifting a3) -lemma alpha_cases: "\a1 = a2; \a b. \a1 = Var a; a2 = Var b; a = b\ \ P; - \x xa xb xc. \a1 = App x xb; a2 = App xa xc; x = xa; xb = xc\ \ P; - \x a b xa. \a1 = Lam a x; a2 = Lam b xa; x = [(a, b)] \ xa; a \ fv (Lam b x)\ \ P\ +lemma alpha_cases: + "\a1 = a2; \a b. \a1 = Var a; a2 = Var b; a = b\ \ P; + \x xa xb xc. \a1 = App x xb; a2 = App xa xc; x = xa; xb = xc\ \ P; + \x a b xa. \a1 = Lam a x; a2 = Lam b xa; x = [(a, b)] \ xa; a \ fv (Lam b x)\ \ P\ \ P" -apply (lifting alpha.cases) -done + by (lifting alpha.cases) -lemma alpha_induct: "\(qx\lam) = (qxa\lam); \(a\name) b\name. a = b \ (qxb\lam \ lam \ bool) (Var a) (Var b); - \(x\lam) (xa\lam) (xb\lam) xc\lam. \x = xa; qxb x xa; xb = xc; qxb xb xc\ \ qxb (App x xb) (App xa xc); - \(x\lam) (a\name) (b\name) xa\lam. +lemma alpha_induct: + "\qx = qxa; \a b. a = b \ qxb (Var a) (Var b); + \x xa xb xc. \x = xa; qxb x xa; xb = xc; qxb xb xc\ \ qxb (App x xb) (App xa xc); + \x a b xa. \x = [(a, b)] \ xa; qxb x ([(a, b)] \ xa); a \ fv (Lam b x)\ \ qxb (Lam a x) (Lam b xa)\ \ qxb qx qxa" -apply (lifting alpha.induct) -done + by (lifting alpha.induct) + +lemma var_inject: + "(Var a = Var b) = (a = b)" + by (lifting rvar_inject) -lemma var_inject: "(Var a = Var b) = (a = b)" -apply (lifting rvar_inject) -done - -lemma lam_induct:" \\name. P (Var name); \lam1 lam2. \P lam1; P lam2\ \ P (App lam1 lam2); - \name lam. P lam \ P (Lam name lam)\ \ P lam" -apply (lifting rlam.induct) -done +lemma lam_induct: + "\\name. P (Var name); + \lam1 lam2. \P lam1; P lam2\ \ P (App lam1 lam2); + \name lam. P lam \ P (Lam name lam)\ \ P lam" + by (lifting rlam.induct) lemma var_supp: shows "supp (Var a) = ((supp a)::name set)" apply(simp add: supp_def) - apply(simp add: pi_var) + apply(simp add: pi_var2) apply(simp add: var_inject) done lemma var_fresh: fixes a::"name" - shows "(a\(Var b)) = (a\b)" + shows "(a \ (Var b)) = (a \ b)" apply(simp add: fresh_def) apply(simp add: var_supp) done