52 (* ------------------------------------------------------------------------- *) |
52 (* ------------------------------------------------------------------------- *) |
53 |
53 |
54 lemma gt_not_eq: "p < n ==> n\<noteq>p" |
54 lemma gt_not_eq: "p < n ==> n\<noteq>p" |
55 by blast |
55 by blast |
56 |
56 |
57 lemma succ_pred [rule_format, simp]: "j \<in> nat ==> i < j --> succ(j #- 1) = j" |
57 lemma succ_pred [rule_format, simp]: "j \<in> nat ==> i < j \<longrightarrow> succ(j #- 1) = j" |
58 by (induct_tac "j", auto) |
58 by (induct_tac "j", auto) |
59 |
59 |
60 lemma lt_pred: "[|succ(x)<n; n \<in> nat|] ==> x < n #- 1 " |
60 lemma lt_pred: "[|succ(x)<n; n \<in> nat|] ==> x < n #- 1 " |
61 apply (rule succ_leE) |
61 apply (rule succ_leE) |
62 apply (simp add: succ_pred) |
62 apply (simp add: succ_pred) |
146 (* ------------------------------------------------------------------------- *) |
146 (* ------------------------------------------------------------------------- *) |
147 |
147 |
148 (*The i\<in>nat is redundant*) |
148 (*The i\<in>nat is redundant*) |
149 lemma lift_lift_rec [rule_format]: |
149 lemma lift_lift_rec [rule_format]: |
150 "u \<in> redexes |
150 "u \<in> redexes |
151 ==> \<forall>n \<in> nat. \<forall>i \<in> nat. i\<le>n --> |
151 ==> \<forall>n \<in> nat. \<forall>i \<in> nat. i\<le>n \<longrightarrow> |
152 (lift_rec(lift_rec(u,i),succ(n)) = lift_rec(lift_rec(u,n),i))" |
152 (lift_rec(lift_rec(u,i),succ(n)) = lift_rec(lift_rec(u,n),i))" |
153 apply (erule redexes.induct, auto) |
153 apply (erule redexes.induct, auto) |
154 apply (case_tac "n < i") |
154 apply (case_tac "n < i") |
155 apply (frule lt_trans2, assumption) |
155 apply (frule lt_trans2, assumption) |
156 apply (simp_all add: lift_rec_Var leI) |
156 apply (simp_all add: lift_rec_Var leI) |
164 lemma lt_not_m1_lt: "\<lbrakk>m < n; n \<in> nat; m \<in> nat\<rbrakk>\<Longrightarrow> ~ n #- 1 < m" |
164 lemma lt_not_m1_lt: "\<lbrakk>m < n; n \<in> nat; m \<in> nat\<rbrakk>\<Longrightarrow> ~ n #- 1 < m" |
165 by (erule natE, auto) |
165 by (erule natE, auto) |
166 |
166 |
167 lemma lift_rec_subst_rec [rule_format]: |
167 lemma lift_rec_subst_rec [rule_format]: |
168 "v \<in> redexes ==> |
168 "v \<in> redexes ==> |
169 \<forall>n \<in> nat. \<forall>m \<in> nat. \<forall>u \<in> redexes. n\<le>m--> |
169 \<forall>n \<in> nat. \<forall>m \<in> nat. \<forall>u \<in> redexes. n\<le>m\<longrightarrow> |
170 lift_rec(subst_rec(u,v,n),m) = |
170 lift_rec(subst_rec(u,v,n),m) = |
171 subst_rec(lift_rec(u,m),lift_rec(v,succ(m)),n)" |
171 subst_rec(lift_rec(u,m),lift_rec(v,succ(m)),n)" |
172 apply (erule redexes.induct, simp_all (no_asm_simp) add: lift_lift) |
172 apply (erule redexes.induct, simp_all (no_asm_simp) add: lift_lift) |
173 apply safe |
173 apply safe |
174 apply (rename_tac n n' m u) |
174 apply (rename_tac n n' m u) |
186 by (simp add: lift_rec_subst_rec) |
186 by (simp add: lift_rec_subst_rec) |
187 |
187 |
188 |
188 |
189 lemma lift_rec_subst_rec_lt [rule_format]: |
189 lemma lift_rec_subst_rec_lt [rule_format]: |
190 "v \<in> redexes ==> |
190 "v \<in> redexes ==> |
191 \<forall>n \<in> nat. \<forall>m \<in> nat. \<forall>u \<in> redexes. m\<le>n--> |
191 \<forall>n \<in> nat. \<forall>m \<in> nat. \<forall>u \<in> redexes. m\<le>n\<longrightarrow> |
192 lift_rec(subst_rec(u,v,n),m) = |
192 lift_rec(subst_rec(u,v,n),m) = |
193 subst_rec(lift_rec(u,m),lift_rec(v,m),succ(n))" |
193 subst_rec(lift_rec(u,m),lift_rec(v,m),succ(n))" |
194 apply (erule redexes.induct, simp_all (no_asm_simp) add: lift_lift) |
194 apply (erule redexes.induct, simp_all (no_asm_simp) add: lift_lift) |
195 apply safe |
195 apply safe |
196 apply (rename_tac n n' m u) |
196 apply (rename_tac n n' m u) |
210 apply (case_tac "n < na", auto) |
210 apply (case_tac "n < na", auto) |
211 done |
211 done |
212 |
212 |
213 lemma subst_rec_subst_rec [rule_format]: |
213 lemma subst_rec_subst_rec [rule_format]: |
214 "v \<in> redexes ==> |
214 "v \<in> redexes ==> |
215 \<forall>m \<in> nat. \<forall>n \<in> nat. \<forall>u \<in> redexes. \<forall>w \<in> redexes. m\<le>n --> |
215 \<forall>m \<in> nat. \<forall>n \<in> nat. \<forall>u \<in> redexes. \<forall>w \<in> redexes. m\<le>n \<longrightarrow> |
216 subst_rec(subst_rec(w,u,n),subst_rec(lift_rec(w,m),v,succ(n)),m) = |
216 subst_rec(subst_rec(w,u,n),subst_rec(lift_rec(w,m),v,succ(n)),m) = |
217 subst_rec(w,subst_rec(u,v,m),n)" |
217 subst_rec(w,subst_rec(u,v,m),n)" |
218 apply (erule redexes.induct) |
218 apply (erule redexes.induct) |
219 apply (simp_all add: lift_lift [symmetric] lift_rec_subst_rec_lt, safe) |
219 apply (simp_all add: lift_lift [symmetric] lift_rec_subst_rec_lt, safe) |
220 apply (rename_tac n' u w) |
220 apply (rename_tac n' u w) |
252 "u ~ v ==> \<forall>m \<in> nat. lift_rec(u,m) ~ lift_rec(v,m)" |
252 "u ~ v ==> \<forall>m \<in> nat. lift_rec(u,m) ~ lift_rec(v,m)" |
253 by (erule Scomp.induct, simp_all add: comp_refl) |
253 by (erule Scomp.induct, simp_all add: comp_refl) |
254 |
254 |
255 lemma subst_rec_preserve_comp [rule_format, simp]: |
255 lemma subst_rec_preserve_comp [rule_format, simp]: |
256 "u2 ~ v2 ==> \<forall>m \<in> nat. \<forall>u1 \<in> redexes. \<forall>v1 \<in> redexes. |
256 "u2 ~ v2 ==> \<forall>m \<in> nat. \<forall>u1 \<in> redexes. \<forall>v1 \<in> redexes. |
257 u1 ~ v1--> subst_rec(u1,u2,m) ~ subst_rec(v1,v2,m)" |
257 u1 ~ v1\<longrightarrow> subst_rec(u1,u2,m) ~ subst_rec(v1,v2,m)" |
258 by (erule Scomp.induct, |
258 by (erule Scomp.induct, |
259 simp_all add: subst_Var lift_rec_preserve_comp comp_refl) |
259 simp_all add: subst_Var lift_rec_preserve_comp comp_refl) |
260 |
260 |
261 lemma lift_rec_preserve_reg [simp]: |
261 lemma lift_rec_preserve_reg [simp]: |
262 "regular(u) ==> \<forall>m \<in> nat. regular(lift_rec(u,m))" |
262 "regular(u) ==> \<forall>m \<in> nat. regular(lift_rec(u,m))" |
263 by (erule Sreg.induct, simp_all add: lift_rec_Var) |
263 by (erule Sreg.induct, simp_all add: lift_rec_Var) |
264 |
264 |
265 lemma subst_rec_preserve_reg [simp]: |
265 lemma subst_rec_preserve_reg [simp]: |
266 "regular(v) ==> |
266 "regular(v) ==> |
267 \<forall>m \<in> nat. \<forall>u \<in> redexes. regular(u)-->regular(subst_rec(u,v,m))" |
267 \<forall>m \<in> nat. \<forall>u \<in> redexes. regular(u)\<longrightarrow>regular(subst_rec(u,v,m))" |
268 by (erule Sreg.induct, simp_all add: subst_Var lift_rec_preserve_reg) |
268 by (erule Sreg.induct, simp_all add: subst_Var lift_rec_preserve_reg) |
269 |
269 |
270 end |
270 end |