changed parser so that the binding mode is indicated as "bind (list)", "bind (set)" or "bind (res)"; if only "bind" is given, then bind (list) is assumed as default
theory SingleLet+ −
imports "../NewParser"+ −
begin+ −
+ −
atom_decl name+ −
+ −
declare [[STEPS = 20]]+ −
+ −
+ −
nominal_datatype trm =+ −
Var "name"+ −
| App "trm" "trm"+ −
| Lam x::"name" t::"trm" bind x in t+ −
| Let a::"assg" t::"trm" bind (set) "bn a" in t+ −
| Foo x::"name" y::"name" t::"trm" t1::"trm" t2::"trm" bind (set) x in y t t1 t2+ −
| Bar x::"name" y::"name" t::"trm" bind y x in t x y+ −
| Baz x::"name" t1::"trm" t2::"trm" bind x in t1, bind x in t2 + −
and assg =+ −
As "name" x::"name" t::"trm" bind x in t+ −
binder+ −
bn::"assg \<Rightarrow> atom set"+ −
where+ −
"bn (As x y t) = {atom x}"+ −
+ −
+ −
+ −
+ −
ML {* Function.prove_termination *}+ −
+ −
text {* can lift *}+ −
+ −
thm distinct+ −
thm trm_raw_assg_raw.inducts+ −
thm trm_raw.exhaust+ −
thm assg_raw.exhaust+ −
thm fv_defs+ −
thm perm_simps+ −
thm perm_laws+ −
thm trm_raw_assg_raw.size(9 - 16)+ −
thm eq_iff+ −
thm eq_iff_simps+ −
thm bn_defs+ −
thm fv_eqvt+ −
thm bn_eqvt+ −
thm size_eqvt+ −
+ −
+ −
ML {*+ −
val thms_d = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms distinct}+ −
*}+ −
+ −
ML {* + −
val thms_i = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms trm_raw_assg_raw.inducts}+ −
*}+ −
+ −
ML {* + −
val thms_i = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms trm_raw.exhaust}+ −
*}+ −
+ −
ML {* + −
val thms_i = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms assg_raw.exhaust}+ −
*}+ −
+ −
ML {*+ −
val thms_f = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms fv_defs}+ −
*}+ −
+ −
ML {* + −
val thms_i = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms trm_raw_assg_raw.size(9 - 16)}+ −
*}+ −
+ −
ML {*+ −
val thms_p = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms perm_simps}+ −
*}+ −
+ −
ML {*+ −
val thms_f = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms perm_laws}+ −
*}+ −
+ −
ML {*+ −
val thms_e = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) + −
@{thms eq_iff[unfolded alphas permute_prod.simps prod_fv.simps prod_alpha_def prod_rel.simps+ −
prod.cases]}+ −
*}+ −
+ −
ML {*+ −
val thms_e = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) + −
@{thms eq_iff_simps[unfolded alphas permute_prod.simps prod_fv.simps prod_alpha_def prod_rel.simps+ −
prod.cases]}+ −
*}+ −
+ −
ML {*+ −
val thms_f = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms bn_defs}+ −
*}+ −
+ −
ML {*+ −
val thms_f = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms bn_eqvt}+ −
*}+ −
+ −
ML {*+ −
val thms_f = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms fv_eqvt}+ −
*}+ −
+ −
ML {*+ −
val thms_f = map (lift_thm [@{typ trm}, @{typ assg}] @{context}) @{thms size_eqvt}+ −
*}+ −
+ −
+ −
+ −
lemma supp_fv:+ −
"supp t = fv_trm t"+ −
"supp b = fv_bn b"+ −
apply(induct t and b rule: i1)+ −
apply(simp_all add: f1)+ −
apply(simp_all add: supp_def)+ −
apply(simp_all add: b1)+ −
sorry+ −
+ −
consts perm_bn_trm :: "perm \<Rightarrow> trm \<Rightarrow> trm"+ −
consts perm_bn_assg :: "perm \<Rightarrow> assg \<Rightarrow> assg"+ −
+ −
lemma y:+ −
"perm_bn_trm p (Var x) = (Var x)"+ −
"perm_bn_trm p (App t1 t2) = (App t1 t2)"+ −
"perm_bn_trm p ("+ −
+ −
+ −
+ −
typ trm+ −
typ assg+ −
+ −
thm trm_assg.fv+ −
thm trm_assg.supp+ −
thm trm_assg.eq_iff+ −
thm trm_assg.bn+ −
thm trm_assg.perm+ −
thm trm_assg.induct+ −
thm trm_assg.inducts+ −
thm trm_assg.distinct+ −
ML {* Sign.of_sort @{theory} (@{typ trm}, @{sort fs}) *}+ −
+ −
(* TEMPORARY+ −
thm trm_assg.fv[simplified trm_assg.supp(1-2)]+ −
*)+ −
+ −
end+ −
+ −
+ −
+ −