# HG changeset patch # User Cezary Kaliszyk # Date 1267004678 -3600 # Node ID ae73578feb6466ec319f6aa243caefd20b4ba6d4 # Parent c88159ffa7a3d2541bb2e83fb58c812c6420dbae Use the infrastructure in LF. Much shorter :). diff -r c88159ffa7a3 -r ae73578feb64 Quot/Nominal/LFex.thy --- a/Quot/Nominal/LFex.thy Wed Feb 24 10:38:45 2010 +0100 +++ b/Quot/Nominal/LFex.thy Wed Feb 24 10:44:38 2010 +0100 @@ -19,49 +19,8 @@ | Lam "rty" "name" "rtrm" -instantiation rkind and rty and rtrm :: pt -begin - -primrec - permute_rkind -and permute_rty -and permute_rtrm -where - "permute_rkind pi Type = Type" -| "permute_rkind pi (KPi t n k) = KPi (permute_rty pi t) (pi \ n) (permute_rkind pi k)" -| "permute_rty pi (TConst i) = TConst (pi \ i)" -| "permute_rty pi (TApp A M) = TApp (permute_rty pi A) (permute_rtrm pi M)" -| "permute_rty pi (TPi A x B) = TPi (permute_rty pi A) (pi \ x) (permute_rty pi B)" -| "permute_rtrm pi (Const i) = Const (pi \ i)" -| "permute_rtrm pi (Var x) = Var (pi \ x)" -| "permute_rtrm pi (App M N) = App (permute_rtrm pi M) (permute_rtrm pi N)" -| "permute_rtrm pi (Lam A x M) = Lam (permute_rty pi A) (pi \ x) (permute_rtrm pi M)" +setup {* snd o define_raw_perms ["rkind", "rty", "rtrm"] ["LFex.rkind", "LFex.rty", "LFex.rtrm"] *} -lemma rperm_zero_ok: - "0 \ (x :: rkind) = x" - "0 \ (y :: rty) = y" - "0 \ (z :: rtrm) = z" -apply(induct x and y and z rule: rkind_rty_rtrm.inducts) -apply(simp_all) -done - -lemma rperm_plus_ok: - "(p + q) \ (x :: rkind) = p \ q \ x" - "(p + q) \ (y :: rty) = p \ q \ y" - "(p + q) \ (z :: rtrm) = p \ q \ z" -apply(induct x and y and z rule: rkind_rty_rtrm.inducts) -apply(simp_all) -done - -instance -apply default -apply (simp_all only:rperm_zero_ok rperm_plus_ok) -done - -end - -(* -setup {* snd o define_raw_perms ["rkind", "rty", "rtrm"] ["LFex.rkind", "LFex.rty", "LFex.rtrm"] *} local_setup {* snd o define_fv_alpha "LFex.rkind" [[ [], [[], [(NONE, 1)], [(NONE, 1)]] ], @@ -75,96 +34,12 @@ local_setup {* (fn ctxt => snd (Local_Theory.note ((@{binding alpha_rkind_alpha_rty_alpha_rtrm_inj}, []), (build_alpha_inj @{thms alpha_rkind_alpha_rty_alpha_rtrm.intros} @{thms rkind.distinct rty.distinct rtrm.distinct rkind.inject rty.inject rtrm.inject} @{thms alpha_rkind.cases alpha_rty.cases alpha_rtrm.cases} ctxt)) ctxt)) *} thm alpha_rkind_alpha_rty_alpha_rtrm_inj -lemma alpha_eqvt: - "t1 \ki s1 \ (pi \ t1) \ki (pi \ s1)" - "t2 \ty s2 \ (pi \ t2) \ty (pi \ s2)" - "t3 \tr s3 \ (pi \ t3) \tr (pi \ s3)" -sorry - -local_setup {* (fn ctxt => snd (Local_Theory.note ((@{binding alpha_equivps}, []), - (build_equivps [@{term alpha_rkind}, @{term alpha_rty}, @{term alpha_rtrm}] - @{thm rkind_rty_rtrm.induct} @{thm alpha_rkind_alpha_rty_alpha_rtrm.induct} - @{thms rkind.inject rty.inject rtrm.inject} @{thms alpha_rkind_alpha_rty_alpha_rtrm_inj} - @{thms rkind.distinct rty.distinct rtrm.distinct} - @{thms alpha_rkind.cases alpha_rty.cases alpha_rtrm.cases} - @{thms alpha_eqvt} ctxt)) ctxt)) *} -thm alpha_equivps -*) - -primrec - fv_rkind :: "rkind \ atom set" -and fv_rty :: "rty \ atom set" -and fv_rtrm :: "rtrm \ atom set" -where - "fv_rkind (Type) = {}" -| "fv_rkind (KPi A x K) = (fv_rty A) \ ((fv_rkind K) - {atom x})" -| "fv_rty (TConst i) = {atom i}" -| "fv_rty (TApp A M) = (fv_rty A) \ (fv_rtrm M)" -| "fv_rty (TPi A x B) = (fv_rty A) \ ((fv_rty B) - {atom x})" -| "fv_rtrm (Const i) = {atom i}" -| "fv_rtrm (Var x) = {atom x}" -| "fv_rtrm (App M N) = (fv_rtrm M) \ (fv_rtrm N)" -| "fv_rtrm (Lam A x M) = (fv_rty A) \ ((fv_rtrm M) - {atom x})" - -inductive - alpha_rkind :: "rkind \ rkind \ bool" ("_ \ki _" [100, 100] 100) -and alpha_rty :: "rty \ rty \ bool" ("_ \ty _" [100, 100] 100) -and alpha_rtrm :: "rtrm \ rtrm \ bool" ("_ \tr _" [100, 100] 100) -where - a1: "(Type) \ki (Type)" -| a2: "\A \ty A'; \pi. (({atom a}, K) \gen alpha_rkind fv_rkind pi ({atom b}, K'))\ \ (KPi A a K) \ki (KPi A' b K')" -| a3: "i = j \ (TConst i) \ty (TConst j)" -| a4: "\A \ty A'; M \tr M'\ \ (TApp A M) \ty (TApp A' M')" -| a5: "\A \ty A'; \pi. (({atom a}, B) \gen alpha_rty fv_rty pi ({atom b}, B'))\ \ (TPi A a B) \ty (TPi A' b B')" -| a6: "i = j \ (Const i) \tr (Const j)" -| a7: "x = y \ (Var x) \tr (Var y)" -| a8: "\M \tr M'; N \tr N'\ \ (App M N) \tr (App M' N')" -| a9: "\A \ty A'; \pi. (({atom a}, M) \gen alpha_rtrm fv_rtrm pi ({atom b}, M'))\ \ (Lam A a M) \tr (Lam A' b M')" - -lemma alpha_rkind_alpha_rty_alpha_rtrm_inj: - "(Type) \ki (Type) = True" - "((KPi A a K) \ki (KPi A' b K')) = ((A \ty A') \ (\pi. ({atom a}, K) \gen alpha_rkind fv_rkind pi ({atom b}, K')))" - "(TConst i) \ty (TConst j) = (i = j)" - "(TApp A M) \ty (TApp A' M') = (A \ty A' \ M \tr M')" - "((TPi A a B) \ty (TPi A' b B')) = ((A \ty A') \ (\pi. (({atom a}, B) \gen alpha_rty fv_rty pi ({atom b}, B'))))" - "(Const i) \tr (Const j) = (i = j)" - "(Var x) \tr (Var y) = (x = y)" - "(App M N) \tr (App M' N') = (M \tr M' \ N \tr N')" - "((Lam A a M) \tr (Lam A' b M')) = ((A \ty A') \ (\pi. (({atom a}, M) \gen alpha_rtrm fv_rtrm pi ({atom b}, M'))))" -apply - -apply (simp add: alpha_rkind_alpha_rty_alpha_rtrm.intros) - -apply rule apply (erule alpha_rkind.cases) apply simp apply blast -apply (simp only: alpha_rkind_alpha_rty_alpha_rtrm.intros) - -apply rule apply (erule alpha_rty.cases) apply simp apply simp apply simp -apply (simp only: alpha_rkind_alpha_rty_alpha_rtrm.intros) - -apply rule apply (erule alpha_rty.cases) apply simp apply simp apply simp -apply (simp only: alpha_rkind_alpha_rty_alpha_rtrm.intros) - -apply rule apply (erule alpha_rty.cases) apply simp apply simp apply blast -apply (simp only: alpha_rkind_alpha_rty_alpha_rtrm.intros) - -apply rule apply (erule alpha_rtrm.cases) apply simp apply simp apply simp apply blast -apply (simp only: alpha_rkind_alpha_rty_alpha_rtrm.intros) - -apply rule apply (erule alpha_rtrm.cases) apply simp apply simp apply simp apply blast -apply (simp only: alpha_rkind_alpha_rty_alpha_rtrm.intros) - -apply rule apply (erule alpha_rtrm.cases) apply simp apply simp apply simp apply blast -apply (simp only: alpha_rkind_alpha_rty_alpha_rtrm.intros) - -apply rule apply (erule alpha_rtrm.cases) apply simp apply simp apply simp apply blast -apply (simp only: alpha_rkind_alpha_rty_alpha_rtrm.intros) -done - lemma rfv_eqvt[eqvt]: "((pi\fv_rkind t1) = fv_rkind (pi\t1))" "((pi\fv_rty t2) = fv_rty (pi\t2))" "((pi\fv_rtrm t3) = fv_rtrm (pi\t3))" apply(induct t1 and t2 and t3 rule: rkind_rty_rtrm.inducts) -apply(simp_all add: union_eqvt Diff_eqvt) +apply(simp_all add: union_eqvt Diff_eqvt) apply(simp_all add: permute_set_eq atom_eqvt) done @@ -186,94 +61,14 @@ apply assumption done -lemma al_refl: - fixes K::"rkind" - and A::"rty" - and M::"rtrm" - shows "K \ki K" - and "A \ty A" - and "M \tr M" - apply(induct K and A and M rule: rkind_rty_rtrm.inducts) - apply(auto intro: alpha_rkind_alpha_rty_alpha_rtrm.intros) - apply (rule alpha_rkind_alpha_rty_alpha_rtrm.intros(2)) - apply auto - apply(rule_tac x="0" in exI) - apply(simp_all add: fresh_star_def fresh_zero_perm alpha_gen) - apply (rule alpha_rkind_alpha_rty_alpha_rtrm.intros(5)) - apply auto - apply(rule_tac x="0" in exI) - apply(simp_all add: fresh_star_def fresh_zero_perm alpha_gen) - apply (rule alpha_rkind_alpha_rty_alpha_rtrm.intros(9)) - apply auto - apply(rule_tac x="0" in exI) - apply(simp_all add: fresh_star_def fresh_zero_perm alpha_gen) - done - -lemma al_sym: - fixes K K'::"rkind" and A A'::"rty" and M M'::"rtrm" - shows "K \ki K' \ K' \ki K" - and "A \ty A' \ A' \ty A" - and "M \tr M' \ M' \tr M" - apply(induct K K' and A A' and M M' rule: alpha_rkind_alpha_rty_alpha_rtrm.inducts) - apply(simp_all add: alpha_rkind_alpha_rty_alpha_rtrm.intros) - apply (simp_all add: alpha_rkind_alpha_rty_alpha_rtrm_inj) - apply(erule alpha_gen_compose_sym) - apply(erule alpha_eqvt) - apply(erule alpha_gen_compose_sym) - apply(erule alpha_eqvt) - apply(erule alpha_gen_compose_sym) - apply(erule alpha_eqvt) - done - -lemma al_trans: - fixes K K' K''::"rkind" and A A' A''::"rty" and M M' M''::"rtrm" - shows "K \ki K' \ K' \ki K'' \ K \ki K''" - and "A \ty A' \ A' \ty A'' \ A \ty A''" - and "M \tr M' \ M' \tr M'' \ M \tr M''" - apply(induct K K' and A A' and M M' arbitrary: K'' and A'' and M'' rule: alpha_rkind_alpha_rty_alpha_rtrm.inducts) - apply(simp_all add: alpha_rkind_alpha_rty_alpha_rtrm.intros) - apply(erule alpha_rkind.cases) - apply(simp_all add: alpha_rkind_alpha_rty_alpha_rtrm.intros) - apply(simp add: alpha_rkind_alpha_rty_alpha_rtrm_inj) - apply(erule alpha_gen_compose_trans) - apply(assumption) - apply(erule alpha_eqvt) - apply(rotate_tac 4) - apply(erule alpha_rty.cases) - apply(simp_all add: alpha_rkind_alpha_rty_alpha_rtrm.intros) - apply(rotate_tac 3) - apply(erule alpha_rty.cases) - apply(simp_all add: alpha_rkind_alpha_rty_alpha_rtrm.intros) - apply(simp add: alpha_rkind_alpha_rty_alpha_rtrm_inj) - apply(erule alpha_gen_compose_trans) - apply(assumption) - apply(erule alpha_eqvt) - apply(rotate_tac 4) - apply(erule alpha_rtrm.cases) - apply(simp_all add: alpha_rkind_alpha_rty_alpha_rtrm.intros) - apply(rotate_tac 3) - apply(erule alpha_rtrm.cases) - apply(simp_all add: alpha_rkind_alpha_rty_alpha_rtrm.intros) - apply(simp add: alpha_rkind_alpha_rty_alpha_rtrm_inj) - apply(erule alpha_gen_compose_trans) - apply(assumption) - apply(erule alpha_eqvt) - done - -lemma alpha_equivps: - shows "equivp alpha_rkind" - and "equivp alpha_rty" - and "equivp alpha_rtrm" - apply(rule equivpI) - unfolding reflp_def symp_def transp_def - apply(auto intro: al_refl al_sym al_trans) - apply(rule equivpI) - unfolding reflp_def symp_def transp_def - apply(auto intro: al_refl al_sym al_trans) - apply(rule equivpI) - unfolding reflp_def symp_def transp_def - apply(auto intro: al_refl al_sym al_trans) - done +local_setup {* (fn ctxt => snd (Local_Theory.note ((@{binding alpha_equivps}, []), + (build_equivps [@{term alpha_rkind}, @{term alpha_rty}, @{term alpha_rtrm}] + @{thm rkind_rty_rtrm.induct} @{thm alpha_rkind_alpha_rty_alpha_rtrm.induct} + @{thms rkind.inject rty.inject rtrm.inject} @{thms alpha_rkind_alpha_rty_alpha_rtrm_inj} + @{thms rkind.distinct rty.distinct rtrm.distinct} + @{thms alpha_rkind.cases alpha_rty.cases alpha_rtrm.cases} + @{thms alpha_eqvt} ctxt)) ctxt)) *} +thm alpha_equivps quotient_type RKIND = rkind / alpha_rkind by (rule alpha_equivps) @@ -469,7 +264,8 @@ "supp (CONS i) = {atom i}" "supp (VAR x) = {atom x}" "supp (APP M N) = supp M \ supp N" -apply (simp_all add: supp_def permute_ktt RKIND_RTY_RTRM_INJECT) +apply (simp_all add: supp_def permute_ktt) +apply (simp_all only: RKIND_RTY_RTRM_INJECT) apply (simp_all only: supp_at_base[simplified supp_def]) apply (simp_all add: Collect_imp_eq Collect_neg_eq) done