# HG changeset patch # User urbanc # Date 1155835243 -7200 # Node ID 9a60e315124445fab1fec445731555fc8ed8f828 # Parent 21227c43ba26f820c5fc06680f0ebbca9a153a67 added definition for size and substitution using the recursion combinator diff -r 21227c43ba26 -r 9a60e3151244 src/HOL/Nominal/Examples/Fsub.thy --- a/src/HOL/Nominal/Examples/Fsub.thy Thu Aug 17 09:24:56 2006 +0200 +++ b/src/HOL/Nominal/Examples/Fsub.thy Thu Aug 17 19:20:43 2006 +0200 @@ -237,24 +237,233 @@ only be defined manually via some laborious proof constructions. Therefore we just assume them here. Cheat! *} -consts size_ty :: "ty \ nat" +types 'a f1_ty = "tyvrs\('a::pt_tyvrs)" + 'a f2_ty = "('a::pt_tyvrs)" + 'a f3_ty = "ty\ty\'a\'a\('a::pt_tyvrs)" + 'a f4_ty = "tyvrs\ty\ty\'a\'a\('a::pt_tyvrs)" + +constdefs + rfun :: "'a f1_ty \ 'a f2_ty \ 'a f3_ty \ 'a f4_ty \ ty \ ('a::pt_tyvrs)" + "rfun f1 f2 f3 f4 T \ (THE r. (T,r) \ ty_rec_set f1 f2 f3 f4)" + +lemma rfun_Tvar: + assumes f1: "finite ((supp f1)::tyvrs set)" + and f2: "finite ((supp f2)::tyvrs set)" + and f3: "finite ((supp f3)::tyvrs set)" + and f4: "finite ((supp f4)::tyvrs set)" + and fcb: "\X T1 T2 r1 r2. \X\f4; X\T2; X\r2\ \ X\f4 X T1 T2 r1 r2" + shows "rfun f1 f2 f3 f4 (Tvar X) = (f1 X)" +apply(simp add: rfun_def) +apply(rule trans) +apply(rule the1_equality) +apply(rule ty.rec_unique[where P="\_. True"]) +apply(simp_all add: f1 f2 f3 f4 fcb) +apply(rule ty_rec_set.intros) +done + +lemma rfun_Top: + assumes f1: "finite ((supp f1)::tyvrs set)" + and f2: "finite ((supp f2)::tyvrs set)" + and f3: "finite ((supp f3)::tyvrs set)" + and f4: "finite ((supp f4)::tyvrs set)" + and fcb: "\X T1 T2 r1 r2. \X\f4; X\T2; X\r2\ \ X\f4 X T1 T2 r1 r2" + shows "rfun f1 f2 f3 f4 (Top) = f2" +apply(simp add: rfun_def) +apply(rule trans) +apply(rule the1_equality) +apply(rule ty.rec_unique[where P="\_. True"]) +apply(simp_all add: f1 f2 f3 f4 fcb) +apply(rule ty_rec_set.intros) +done + +lemma rfun_Fun: + assumes f1: "finite ((supp f1)::tyvrs set)" + and f2: "finite ((supp f2)::tyvrs set)" + and f3: "finite ((supp f3)::tyvrs set)" + and f4: "finite ((supp f4)::tyvrs set)" + and fcb: "\X T1 T2 r1 r2. \X\f4; X\T2; X\r2\ \ X\f4 X T1 T2 r1 r2" + shows "rfun f1 f2 f3 f4 (T1\T2) = f3 T1 T2 (rfun f1 f2 f3 f4 T1) (rfun f1 f2 f3 f4 T2)" +apply(simp add: rfun_def) +apply(rule trans) +apply(rule the1_equality) +apply(rule ty.rec_unique[where P="\_. True"]) +apply(simp_all add: f1 f2 f3 f4 fcb) +apply(rule ty_rec_set.intros) +apply(rule theI') +apply(rule ty.rec_unique[where P="\_. True"]) +apply(simp_all add: f1 f2 f3 f4 fcb) +apply(rule theI') +apply(rule ty.rec_unique[where P="\_. True"]) +apply(simp_all add: f1 f2 f3 f4 fcb) +done + +lemma rfun_All: + assumes f1: "finite ((supp f1)::tyvrs set)" + and f2: "finite ((supp f2)::tyvrs set)" + and f3: "finite ((supp f3)::tyvrs set)" + and f4: "finite ((supp f4)::tyvrs set)" + and fcb: "\X T1 T2 r1 r2. \X\f4; X\T2; X\r2\ \ X\f4 X T1 T2 r1 r2" + and fr: "X\f1" "X\f2" "X\f3" "X\f4" "X\T2" + shows "rfun f1 f2 f3 f4 (\[X<:T2].T1) = f4 X T1 T2 (rfun f1 f2 f3 f4 T1) (rfun f1 f2 f3 f4 T2)" +apply(simp add: rfun_def) +apply(rule trans) +apply(rule the1_equality) +apply(rule ty.rec_unique[where P="\_. True"]) +apply(simp_all add: f1 f2 f3 f4 fcb) +apply(rule ty_rec_set.intros) +apply(simp_all add: fr) +apply(rule theI') +apply(rule ty.rec_unique[where P="\_. True"]) +apply(simp_all add: f1 f2 f3 f4 fcb) +apply(rule theI') +apply(rule ty.rec_unique[where P="\_. True"]) +apply(simp_all add: f1 f2 f3 f4 fcb) +done + +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 \ rfun 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) lemma size_ty[simp]: shows "size_ty (Tvar X) = 1" and "size_ty (Top) = 1" - and "\size_ty T\<^isub>1 = m; size_ty T\<^isub>2 = n\ \ size_ty (T\<^isub>1 \ T\<^isub>2) = m + n + 1" - and "\size_ty T\<^isub>1 = m; size_ty T\<^isub>2 = n\ \ size_ty (\[X<:T\<^isub>1].T\<^isub>2) = m + n + 1" -sorry + 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 rfun_Tvar) +apply(simp_all add: fin_size_ty fcb_size_ty_All) +apply(simp add: size_ty_Tvar_def) +apply(rule trans, rule rfun_Top) +apply(simp_all add: fin_size_ty fcb_size_ty_All) +apply(simp add: size_ty_Top_def) +apply(rule trans, rule rfun_Fun) +apply(simp_all add: fin_size_ty fcb_size_ty_All) +apply(simp add: size_ty_Fun_def) +apply(rule trans, rule rfun_All) +apply(simp_all add: fin_size_ty fcb_size_ty_All) +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 + +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 \ rfun (subst_Tvar X T) (subst_Top X T) (subst_Fun X T) (subst_All X T)" -consts subst_ty :: "ty \ tyvrs \ ty \ ty" ("_[_:=_]\<^isub>t\<^isub>y" [100,100,100] 100) +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) + +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 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 + +syntax + subst_ty_syn :: "ty \ tyvrs \ ty \ ty" ("_[_:=_]\<^isub>t\<^isub>y" [100,100,100] 100) + +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))" + 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].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))" - and "\X\Y; X\T\ \ (\[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))" -sorry + 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 rfun_Tvar[OF fin_supp_subst, OF fcb_subst_All]) +apply(assumption)+ +apply(simp add: subst_Tvar_def) +apply(rule trans) +apply(rule rfun_Top[OF fin_supp_subst, OF fcb_subst_All]) +apply(assumption)+ +apply(simp add: subst_Top_def) +apply(rule trans) +apply(rule rfun_Fun[OF fin_supp_subst, OF fcb_subst_All]) +apply(assumption)+ +apply(simp add: subst_Fun_def) +apply(rule trans) +apply(rule rfun_All[OF fin_supp_subst, OF 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 consts subst_tyc :: "ty_context \ tyvrs \ ty \ ty_context" ("_[_:=_]\<^isub>t\<^isub>y\<^isub>c" [100,100,100] 100) primrec @@ -800,7 +1009,7 @@ have lh_drv_prm\<^isub>2: "((X,Q\<^isub>1)#\) \ S\<^isub>2 <: Q\<^isub>2" by fact have fresh_cond: "X\\" "X\Q\<^isub>1" by fact from `\[X<:Q\<^isub>1].Q\<^isub>2 = Q` - have Q\<^isub>1\<^isub>2_less: "size_ty Q\<^isub>1 < size_ty Q" "size_ty Q\<^isub>2 < size_ty Q " by auto + have Q\<^isub>1\<^isub>2_less: "size_ty Q\<^isub>1 < size_ty Q" "size_ty Q\<^isub>2 < size_ty Q " using fresh_cond by auto from rh_drv have "T=Top \ (\T\<^isub>1 T\<^isub>2. T=\[X<:T\<^isub>1].T\<^isub>2 \ \\T\<^isub>1<:Q\<^isub>1 \ ((X,T\<^isub>1)#\)\Q\<^isub>2<:T\<^isub>2)" using fresh_cond by (simp add: S_ForallE_left)