# HG changeset patch # User berghofe # Date 1164632408 -3600 # Node ID 0625898865a9461991f1faee35ed03f307e47281 # Parent 3dd27eda91b98d8a09fdfbcd40c7ba4c26b84bfa Adapted to new nominal_primrec command. diff -r 3dd27eda91b9 -r 0625898865a9 src/HOL/Nominal/Examples/Fsub.thy --- a/src/HOL/Nominal/Examples/Fsub.thy Mon Nov 27 13:42:49 2006 +0100 +++ b/src/HOL/Nominal/Examples/Fsub.thy Mon Nov 27 14:00:08 2006 +0100 @@ -232,113 +232,27 @@ section {* Size and Capture-Avoiding Substitution for Types *} -constdefs - size_ty_Tvar :: "tyvrs \ nat" - "size_ty_Tvar \ \_. 1" - - size_ty_Top :: "nat" - "size_ty_Top \ 1" - - size_ty_Fun :: "ty \ ty \ nat \ nat \ nat" - "size_ty_Fun \ \_ _ r1 r2. r1 + r2 + 1" - - size_ty_All :: "tyvrs \ ty \ ty \ nat \ nat \ nat" - "size_ty_All \ \_ _ _ r1 r2. r1 + r2 + 1" - - size_ty :: "ty \ nat" - "size_ty \ ty_rec size_ty_Tvar size_ty_Top size_ty_Fun size_ty_All" - -lemma fin_size_ty: - shows "finite ((supp size_ty_Tvar)::tyvrs set)" - and "finite ((supp size_ty_Top)::tyvrs set)" - and "finite ((supp size_ty_Fun)::tyvrs set)" - and "finite ((supp size_ty_All)::tyvrs set)" -by (finite_guess add: size_ty_Tvar_def size_ty_Top_def size_ty_Fun_def size_ty_All_def perm_nat_def)+ - -lemma fcb_size_ty_All: - assumes "X\size_ty_All" "X\T2" "X\r2" - shows "X\(size_ty_All X T1 T2 r1 r2)" -by (simp add: fresh_def supp_nat) - -lemmas ty_recs = ty.recs[where P="\_. True" and z="()", simplified] - -lemma size_ty[simp]: - shows "size_ty (Tvar X) = 1" - and "size_ty (Top) = 1" - and "size_ty (T1 \ T2) = (size_ty T1) + (size_ty T2) + 1" - and "X\T1 \ size_ty (\[X<:T1].T2) = (size_ty T1) + (size_ty T2) + 1" -apply(unfold size_ty_def) -apply(rule trans, rule ty_recs) -apply(simp_all add: fin_size_ty fcb_size_ty_All supp_unit) -apply(simp add: size_ty_Tvar_def) -apply(rule trans, rule ty_recs) -apply(simp_all add: fin_size_ty fcb_size_ty_All supp_unit) -apply(simp add: size_ty_Top_def) -apply(rule trans, rule ty_recs) -apply(simp_all add: fin_size_ty fcb_size_ty_All supp_unit) -apply(simp add: size_ty_Fun_def) -apply(rule trans, rule ty_recs) -apply(simp_all add: fin_size_ty fcb_size_ty_All supp_unit) -apply(fresh_guess add: perm_nat_def size_ty_Tvar_def size_ty_Top_def size_ty_Fun_def size_ty_All_def)+ -apply(simp add: size_ty_All_def) -done +consts size_ty :: "ty \ nat" -constdefs - subst_Tvar :: "tyvrs \ty \ tyvrs \ ty" - "subst_Tvar X T \ \Y. (if Y=X then T else (Tvar Y))" - - subst_Top :: "tyvrs \ ty \ ty" - "subst_Top X T \ Top" - - subst_Fun :: "tyvrs \ ty \ ty \ ty \ ty \ ty \ ty" - "subst_Fun X T \ \_ _ r1 r2. r1 \ r2" - - subst_All :: "tyvrs \ ty \ tyvrs \ ty \ ty \ ty \ ty \ ty" - "subst_All X T \ \Y _ _ r1 r2. \[Y<:r2].r1" - - subst_ty :: "tyvrs \ ty \ ty \ ty" - "subst_ty X T \ ty_rec (subst_Tvar X T) (subst_Top X T) (subst_Fun X T) (subst_All X T)" - -lemma supports_subst_Tvar: - shows "((supp (X,T))::tyvrs set) supports (subst_Tvar X T)" -apply(supports_simp add: subst_Tvar_def) -apply(rule impI) -apply(drule pt_bij1[OF pt_tyvrs_inst, OF at_tyvrs_inst]) -apply(perm_simp) -done - -lemma supports_subst_Top: - shows "((supp (X,T))::tyvrs set) supports subst_Top X T" -by (supports_simp add: subst_Top_def) +nominal_primrec + "size_ty (Tvar X) = 1" + "size_ty (Top) = 1" + "size_ty (T1 \ T2) = (size_ty T1) + (size_ty T2) + 1" + "X\T1 \ size_ty (\[X<:T1].T2) = (size_ty T1) + (size_ty T2) + 1" + apply (finite_guess add: perm_nat_def)+ + apply (rule TrueI)+ + apply (simp add: fresh_def supp_nat) + apply (assumption | fresh_guess add: perm_nat_def)+ + done -lemma supports_subst_Fun: - shows "((supp (X,T))::tyvrs set) supports subst_Fun X T" - by (supports_simp add: subst_Fun_def) - -lemma supports_subst_All: - shows "((supp (X,T))::tyvrs set) supports subst_All X T" -apply(supports_simp add: subst_All_def) -apply(perm_full_simp) -done +lemma eq_eqvt: + fixes pi::"tyvrs prm" + and x::"'a::pt_tyvrs" + shows "pi\(x=y) = ((pi\x)=(pi\y))" + apply(simp add: perm_bool perm_bij) + done -lemma fin_supp_subst: - shows "finite ((supp (subst_Tvar X T))::tyvrs set)" - and "finite ((supp (subst_Top X T))::tyvrs set)" - and "finite ((supp (subst_Fun X T))::tyvrs set)" - and "finite ((supp (subst_All X T))::tyvrs set)" -apply - -apply(rule supports_finite) -apply(rule supports_subst_Tvar) -apply(simp add: fs_tyvrs1) -apply(finite_guess add: subst_Top_def subst_Fun_def subst_All_def fs_tyvrs1)+ -apply(perm_full_simp) -done - -lemma fcb_subst_All: - assumes fr: "X\(subst_All Y T)" "X\T2" "X\r2" - shows "X\(subst_All Y T) X T1 T2 r1 r2" - apply (simp add: subst_All_def abs_fresh fr) - done +consts subst_ty :: "tyvrs \ ty \ ty \ ty" syntax subst_ty_syn :: "ty \ tyvrs \ ty \ ty" ("_[_:=_]\<^isub>t\<^isub>y" [100,100,100] 100) @@ -346,46 +260,26 @@ translations "T1[Y:=T2]\<^isub>t\<^isub>y" \ "subst_ty Y T2 T1" -lemma subst_ty[simp]: - shows "(Tvar X)[Y:=T]\<^isub>t\<^isub>y= (if X=Y then T else (Tvar X))" - and "(Top)[Y:=T]\<^isub>t\<^isub>y = Top" - and "(T\<^isub>1 \ T\<^isub>2)[Y:=T]\<^isub>t\<^isub>y = (T\<^isub>1[Y:=T]\<^isub>t\<^isub>y) \ (T\<^isub>2[Y:=T]\<^isub>t\<^isub>y)" - and "\X\(Y,T); X\T\<^isub>1\ \ (\[X<:T\<^isub>1].T\<^isub>2)[Y:=T]\<^isub>t\<^isub>y = (\[X<:(T\<^isub>1[Y:=T]\<^isub>t\<^isub>y)].(T\<^isub>2[Y:=T]\<^isub>t\<^isub>y))" -apply - -apply(unfold subst_ty_def) -apply(rule trans) -apply(rule ty_recs) -apply(simp add: fin_supp_subst supp_unit)+ -apply(rule fcb_subst_All) -apply(assumption)+ -apply(simp add: subst_Tvar_def) -apply(rule trans) -apply(rule ty_recs) -apply(simp add: fin_supp_subst supp_unit)+ -apply(rule fcb_subst_All) -apply(assumption)+ -apply(simp add: subst_Top_def) -apply(rule trans) -apply(rule ty_recs) -apply(simp add: fin_supp_subst supp_unit)+ -apply(rule fcb_subst_All) -apply(assumption)+ -apply(simp add: subst_Fun_def) -apply(rule trans) -apply(rule ty_recs) -apply(simp add: fin_supp_subst supp_unit)+ -apply(rule fcb_subst_All) -apply(assumption)+ -apply(rule supports_fresh) -apply(rule supports_subst_Tvar) -apply(simp add: fs_tyvrs1, simp add: fresh_def) -apply(fresh_guess add: fresh_prod subst_Top_def fs_tyvrs1) -apply(fresh_guess add: fresh_prod subst_Fun_def fs_tyvrs1) -apply(fresh_guess add: fresh_prod subst_All_def fs_tyvrs1) -apply(perm_full_simp) -apply(assumption) -apply(simp add: subst_All_def) -done +nominal_primrec + "(Tvar X)[Y:=T]\<^isub>t\<^isub>y= (if X=Y then T else (Tvar X))" + "(Top)[Y:=T]\<^isub>t\<^isub>y = Top" + "(T\<^isub>1 \ T\<^isub>2)[Y:=T]\<^isub>t\<^isub>y = (T\<^isub>1[Y:=T]\<^isub>t\<^isub>y) \ (T\<^isub>2[Y:=T]\<^isub>t\<^isub>y)" + "\X\(Y,T); X\T\<^isub>1\ \ (\[X<:T\<^isub>1].T\<^isub>2)[Y:=T]\<^isub>t\<^isub>y = (\[X<:(T\<^isub>1[Y:=T]\<^isub>t\<^isub>y)].(T\<^isub>2[Y:=T]\<^isub>t\<^isub>y))" + apply (finite_guess add: perm_if eq_eqvt fs_tyvrs1) + apply finite_guess + apply finite_guess + apply finite_guess + apply perm_full_simp + apply (simp add: supp_unit) + apply (rule TrueI)+ + apply (simp add: abs_fresh) + apply (fresh_guess add: fs_tyvrs1 perm_if eq_eqvt) + apply fresh_guess + apply fresh_guess + apply fresh_guess + apply perm_full_simp + apply assumption + done consts subst_tyc :: "ty_context \ tyvrs \ ty \ ty_context" ("_[_:=_]\<^isub>t\<^isub>y\<^isub>c" [100,100,100] 100) primrec