| author | wenzelm | 
| Tue, 24 Mar 2009 18:21:58 +0100 | |
| changeset 30709 | d9ca766bf24c | 
| parent 24893 | b8ef7afe3a6b | 
| child 32960 | 69916a850301 | 
| permissions | -rw-r--r-- | 
| 9284 | 1  | 
(* Title: ZF/Resid/Substitution.thy  | 
| 1048 | 2  | 
ID: $Id$  | 
| 1478 | 3  | 
Author: Ole Rasmussen  | 
| 1048 | 4  | 
Copyright 1995 University of Cambridge  | 
5  | 
Logic Image: ZF  | 
|
6  | 
*)  | 
|
7  | 
||
| 16417 | 8  | 
theory Substitution imports Redex begin  | 
| 1048 | 9  | 
|
| 6046 | 10  | 
(** The clumsy _aux functions are required because other arguments vary  | 
11  | 
in the recursive calls ***)  | 
|
12  | 
||
| 24892 | 13  | 
consts  | 
14  | 
lift_aux :: "i=>i"  | 
|
| 6046 | 15  | 
primrec  | 
| 12593 | 16  | 
"lift_aux(Var(i)) = (\<lambda>k \<in> nat. if i<k then Var(i) else Var(succ(i)))"  | 
| 6046 | 17  | 
|
| 12593 | 18  | 
"lift_aux(Fun(t)) = (\<lambda>k \<in> nat. Fun(lift_aux(t) ` succ(k)))"  | 
| 6046 | 19  | 
|
| 12593 | 20  | 
"lift_aux(App(b,f,a)) = (\<lambda>k \<in> nat. App(b, lift_aux(f)`k, lift_aux(a)`k))"  | 
| 6046 | 21  | 
|
| 24893 | 22  | 
definition  | 
23  | 
lift_rec :: "[i,i]=> i" where  | 
|
| 24892 | 24  | 
"lift_rec(r,k) == lift_aux(r)`k"  | 
| 1048 | 25  | 
|
| 24892 | 26  | 
abbreviation  | 
27  | 
lift :: "i=>i" where  | 
|
28  | 
"lift(r) == lift_rec(r,0)"  | 
|
29  | 
||
30  | 
||
31  | 
consts  | 
|
32  | 
subst_aux :: "i=>i"  | 
|
| 6046 | 33  | 
primrec  | 
34  | 
"subst_aux(Var(i)) =  | 
|
| 24892 | 35  | 
(\<lambda>r \<in> redexes. \<lambda>k \<in> nat. if k<i then Var(i #- 1)  | 
| 6068 | 36  | 
else if k=i then r else Var(i))"  | 
| 6046 | 37  | 
"subst_aux(Fun(t)) =  | 
| 12593 | 38  | 
(\<lambda>r \<in> redexes. \<lambda>k \<in> nat. Fun(subst_aux(t) ` lift(r) ` succ(k)))"  | 
| 6046 | 39  | 
|
| 24892 | 40  | 
"subst_aux(App(b,f,a)) =  | 
| 12593 | 41  | 
(\<lambda>r \<in> redexes. \<lambda>k \<in> nat. App(b, subst_aux(f)`r`k, subst_aux(a)`r`k))"  | 
42  | 
||
| 24893 | 43  | 
definition  | 
44  | 
subst_rec :: "[i,i,i]=> i" (**NOTE THE ARGUMENT ORDER BELOW**) where  | 
|
| 24892 | 45  | 
"subst_rec(u,r,k) == subst_aux(r)`u`k"  | 
46  | 
||
47  | 
abbreviation  | 
|
48  | 
subst :: "[i,i]=>i" (infixl "'/" 70) where  | 
|
49  | 
"u/v == subst_rec(u,v,0)"  | 
|
50  | 
||
51  | 
||
| 12593 | 52  | 
|
53  | 
(* ------------------------------------------------------------------------- *)  | 
|
54  | 
(* Arithmetic extensions *)  | 
|
55  | 
(* ------------------------------------------------------------------------- *)  | 
|
56  | 
||
57  | 
lemma gt_not_eq: "p < n ==> n\<noteq>p"  | 
|
58  | 
by blast  | 
|
59  | 
||
60  | 
lemma succ_pred [rule_format, simp]: "j \<in> nat ==> i < j --> succ(j #- 1) = j"  | 
|
61  | 
by (induct_tac "j", auto)  | 
|
62  | 
||
63  | 
lemma lt_pred: "[|succ(x)<n; n \<in> nat|] ==> x < n #- 1 "  | 
|
64  | 
apply (rule succ_leE)  | 
|
65  | 
apply (simp add: succ_pred)  | 
|
66  | 
done  | 
|
67  | 
||
68  | 
lemma gt_pred: "[|n < succ(x); p<n; n \<in> nat|] ==> n #- 1 < x "  | 
|
69  | 
apply (rule succ_leE)  | 
|
70  | 
apply (simp add: succ_pred)  | 
|
71  | 
done  | 
|
72  | 
||
73  | 
||
74  | 
declare not_lt_iff_le [simp] if_P [simp] if_not_P [simp]  | 
|
75  | 
||
76  | 
||
77  | 
(* ------------------------------------------------------------------------- *)  | 
|
78  | 
(* lift_rec equality rules *)  | 
|
79  | 
(* ------------------------------------------------------------------------- *)  | 
|
80  | 
lemma lift_rec_Var:  | 
|
81  | 
"n \<in> nat ==> lift_rec(Var(i),n) = (if i<n then Var(i) else Var(succ(i)))"  | 
|
82  | 
by (simp add: lift_rec_def)  | 
|
83  | 
||
84  | 
lemma lift_rec_le [simp]:  | 
|
85  | 
"[|i \<in> nat; k\<le>i|] ==> lift_rec(Var(i),k) = Var(succ(i))"  | 
|
86  | 
by (simp add: lift_rec_def le_in_nat)  | 
|
87  | 
||
88  | 
lemma lift_rec_gt [simp]: "[| k \<in> nat; i<k |] ==> lift_rec(Var(i),k) = Var(i)"  | 
|
89  | 
by (simp add: lift_rec_def)  | 
|
90  | 
||
91  | 
lemma lift_rec_Fun [simp]:  | 
|
92  | 
"k \<in> nat ==> lift_rec(Fun(t),k) = Fun(lift_rec(t,succ(k)))"  | 
|
93  | 
by (simp add: lift_rec_def)  | 
|
94  | 
||
95  | 
lemma lift_rec_App [simp]:  | 
|
96  | 
"k \<in> nat ==> lift_rec(App(b,f,a),k) = App(b,lift_rec(f,k),lift_rec(a,k))"  | 
|
97  | 
by (simp add: lift_rec_def)  | 
|
98  | 
||
99  | 
||
100  | 
(* ------------------------------------------------------------------------- *)  | 
|
101  | 
(* substitution quality rules *)  | 
|
102  | 
(* ------------------------------------------------------------------------- *)  | 
|
103  | 
||
104  | 
lemma subst_Var:  | 
|
| 24892 | 105  | 
"[|k \<in> nat; u \<in> redexes|]  | 
106  | 
==> subst_rec(u,Var(i),k) =  | 
|
| 12593 | 107  | 
(if k<i then Var(i #- 1) else if k=i then u else Var(i))"  | 
108  | 
by (simp add: subst_rec_def gt_not_eq leI)  | 
|
109  | 
||
110  | 
||
111  | 
lemma subst_eq [simp]:  | 
|
112  | 
"[|n \<in> nat; u \<in> redexes|] ==> subst_rec(u,Var(n),n) = u"  | 
|
113  | 
by (simp add: subst_rec_def)  | 
|
114  | 
||
115  | 
lemma subst_gt [simp]:  | 
|
116  | 
"[|u \<in> redexes; p \<in> nat; p<n|] ==> subst_rec(u,Var(n),p) = Var(n #- 1)"  | 
|
117  | 
by (simp add: subst_rec_def)  | 
|
118  | 
||
119  | 
lemma subst_lt [simp]:  | 
|
120  | 
"[|u \<in> redexes; p \<in> nat; n<p|] ==> subst_rec(u,Var(n),p) = Var(n)"  | 
|
121  | 
by (simp add: subst_rec_def gt_not_eq leI lt_nat_in_nat)  | 
|
122  | 
||
123  | 
lemma subst_Fun [simp]:  | 
|
124  | 
"[|p \<in> nat; u \<in> redexes|]  | 
|
125  | 
==> subst_rec(u,Fun(t),p) = Fun(subst_rec(lift(u),t,succ(p))) "  | 
|
126  | 
by (simp add: subst_rec_def)  | 
|
127  | 
||
128  | 
lemma subst_App [simp]:  | 
|
129  | 
"[|p \<in> nat; u \<in> redexes|]  | 
|
130  | 
==> subst_rec(u,App(b,f,a),p) = App(b,subst_rec(u,f,p),subst_rec(u,a,p))"  | 
|
131  | 
by (simp add: subst_rec_def)  | 
|
132  | 
||
133  | 
||
134  | 
lemma lift_rec_type [rule_format, simp]:  | 
|
135  | 
"u \<in> redexes ==> \<forall>k \<in> nat. lift_rec(u,k) \<in> redexes"  | 
|
136  | 
apply (erule redexes.induct)  | 
|
137  | 
apply (simp_all add: lift_rec_Var lift_rec_Fun lift_rec_App)  | 
|
138  | 
done  | 
|
139  | 
||
140  | 
lemma subst_type [rule_format, simp]:  | 
|
141  | 
"v \<in> redexes ==> \<forall>n \<in> nat. \<forall>u \<in> redexes. subst_rec(u,v,n) \<in> redexes"  | 
|
142  | 
apply (erule redexes.induct)  | 
|
143  | 
apply (simp_all add: subst_Var lift_rec_type)  | 
|
144  | 
done  | 
|
145  | 
||
146  | 
||
147  | 
(* ------------------------------------------------------------------------- *)  | 
|
148  | 
(* lift and substitution proofs *)  | 
|
149  | 
(* ------------------------------------------------------------------------- *)  | 
|
150  | 
||
151  | 
(*The i\<in>nat is redundant*)  | 
|
152  | 
lemma lift_lift_rec [rule_format]:  | 
|
| 24892 | 153  | 
"u \<in> redexes  | 
154  | 
==> \<forall>n \<in> nat. \<forall>i \<in> nat. i\<le>n -->  | 
|
| 12593 | 155  | 
(lift_rec(lift_rec(u,i),succ(n)) = lift_rec(lift_rec(u,n),i))"  | 
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
156  | 
apply (erule redexes.induct, auto)  | 
| 12593 | 157  | 
apply (case_tac "n < i")  | 
158  | 
apply (frule lt_trans2, assumption)  | 
|
159  | 
apply (simp_all add: lift_rec_Var leI)  | 
|
160  | 
done  | 
|
161  | 
||
162  | 
lemma lift_lift:  | 
|
| 24892 | 163  | 
"[|u \<in> redexes; n \<in> nat|]  | 
| 12593 | 164  | 
==> lift_rec(lift(u),succ(n)) = lift(lift_rec(u,n))"  | 
165  | 
by (simp add: lift_lift_rec)  | 
|
166  | 
||
167  | 
lemma lt_not_m1_lt: "\<lbrakk>m < n; n \<in> nat; m \<in> nat\<rbrakk>\<Longrightarrow> ~ n #- 1 < m"  | 
|
168  | 
by (erule natE, auto)  | 
|
169  | 
||
170  | 
lemma lift_rec_subst_rec [rule_format]:  | 
|
| 24892 | 171  | 
"v \<in> redexes ==>  | 
172  | 
\<forall>n \<in> nat. \<forall>m \<in> nat. \<forall>u \<in> redexes. n\<le>m-->  | 
|
173  | 
lift_rec(subst_rec(u,v,n),m) =  | 
|
| 12593 | 174  | 
subst_rec(lift_rec(u,m),lift_rec(v,succ(m)),n)"  | 
175  | 
apply (erule redexes.induct, simp_all (no_asm_simp) add: lift_lift)  | 
|
176  | 
apply safe  | 
|
| 24892 | 177  | 
apply (rename_tac n n' m u)  | 
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
178  | 
apply (case_tac "n < n'")  | 
| 
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
179  | 
apply (frule_tac j = n' in lt_trans2, assumption)  | 
| 
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
180  | 
apply (simp add: leI, simp)  | 
| 
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
181  | 
apply (erule_tac j=n in leE)  | 
| 12593 | 182  | 
apply (auto simp add: lift_rec_Var subst_Var leI lt_not_m1_lt)  | 
183  | 
done  | 
|
184  | 
||
185  | 
||
186  | 
lemma lift_subst:  | 
|
| 24892 | 187  | 
"[|v \<in> redexes; u \<in> redexes; n \<in> nat|]  | 
| 12593 | 188  | 
==> lift_rec(u/v,n) = lift_rec(u,n)/lift_rec(v,succ(n))"  | 
189  | 
by (simp add: lift_rec_subst_rec)  | 
|
190  | 
||
191  | 
||
192  | 
lemma lift_rec_subst_rec_lt [rule_format]:  | 
|
| 24892 | 193  | 
"v \<in> redexes ==>  | 
194  | 
\<forall>n \<in> nat. \<forall>m \<in> nat. \<forall>u \<in> redexes. m\<le>n-->  | 
|
195  | 
lift_rec(subst_rec(u,v,n),m) =  | 
|
| 12593 | 196  | 
subst_rec(lift_rec(u,m),lift_rec(v,m),succ(n))"  | 
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
197  | 
apply (erule redexes.induct, simp_all (no_asm_simp) add: lift_lift)  | 
| 12593 | 198  | 
apply safe  | 
| 24892 | 199  | 
apply (rename_tac n n' m u)  | 
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
200  | 
apply (case_tac "n < n'")  | 
| 
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
201  | 
apply (case_tac "n < m")  | 
| 12593 | 202  | 
apply (simp_all add: leI)  | 
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
203  | 
apply (erule_tac i=n' in leE)  | 
| 12593 | 204  | 
apply (frule lt_trans1, assumption)  | 
205  | 
apply (simp_all add: succ_pred leI gt_pred)  | 
|
206  | 
done  | 
|
207  | 
||
208  | 
||
209  | 
lemma subst_rec_lift_rec [rule_format]:  | 
|
| 24892 | 210  | 
"u \<in> redexes ==>  | 
| 12593 | 211  | 
\<forall>n \<in> nat. \<forall>v \<in> redexes. subst_rec(v,lift_rec(u,n),n) = u"  | 
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
212  | 
apply (erule redexes.induct, auto)  | 
| 
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
213  | 
apply (case_tac "n < na", auto)  | 
| 12593 | 214  | 
done  | 
215  | 
||
216  | 
lemma subst_rec_subst_rec [rule_format]:  | 
|
| 24892 | 217  | 
"v \<in> redexes ==>  | 
218  | 
\<forall>m \<in> nat. \<forall>n \<in> nat. \<forall>u \<in> redexes. \<forall>w \<in> redexes. m\<le>n -->  | 
|
219  | 
subst_rec(subst_rec(w,u,n),subst_rec(lift_rec(w,m),v,succ(n)),m) =  | 
|
| 12593 | 220  | 
subst_rec(w,subst_rec(u,v,m),n)"  | 
221  | 
apply (erule redexes.induct)  | 
|
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
222  | 
apply (simp_all add: lift_lift [symmetric] lift_rec_subst_rec_lt, safe)  | 
| 24892 | 223  | 
apply (rename_tac n' u w)  | 
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
224  | 
apply (case_tac "n \<le> succ(n') ")  | 
| 
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
225  | 
apply (erule_tac i = n in leE)  | 
| 12593 | 226  | 
apply (simp_all add: succ_pred subst_rec_lift_rec leI)  | 
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
227  | 
apply (case_tac "n < m")  | 
| 
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
228  | 
apply (frule lt_trans2, assumption, simp add: gt_pred)  | 
| 12593 | 229  | 
apply simp  | 
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
230  | 
apply (erule_tac j = n in leE, simp add: gt_pred)  | 
| 12593 | 231  | 
apply (simp add: subst_rec_lift_rec)  | 
232  | 
(*final case*)  | 
|
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
233  | 
apply (frule nat_into_Ord [THEN le_refl, THEN lt_trans], assumption)  | 
| 12593 | 234  | 
apply (erule leE)  | 
| 
13339
 
0f89104dd377
Fixed quantified variable name preservation for ball and bex (bounded quants)
 
paulson 
parents: 
12593 
diff
changeset
 | 
235  | 
apply (frule succ_leI [THEN lt_trans], assumption)  | 
| 24892 | 236  | 
apply (frule_tac i = m in nat_into_Ord [THEN le_refl, THEN lt_trans],  | 
| 12593 | 237  | 
assumption)  | 
238  | 
apply (simp_all add: succ_pred lt_pred)  | 
|
239  | 
done  | 
|
240  | 
||
241  | 
||
242  | 
lemma substitution:  | 
|
243  | 
"[|v \<in> redexes; u \<in> redexes; w \<in> redexes; n \<in> nat|]  | 
|
244  | 
==> subst_rec(w,u,n)/subst_rec(lift(w),v,succ(n)) = subst_rec(w,u/v,n)"  | 
|
245  | 
by (simp add: subst_rec_subst_rec)  | 
|
246  | 
||
247  | 
||
248  | 
(* ------------------------------------------------------------------------- *)  | 
|
249  | 
(* Preservation lemmas *)  | 
|
250  | 
(* Substitution preserves comp and regular *)  | 
|
251  | 
(* ------------------------------------------------------------------------- *)  | 
|
252  | 
||
253  | 
||
254  | 
lemma lift_rec_preserve_comp [rule_format, simp]:  | 
|
255  | 
"u ~ v ==> \<forall>m \<in> nat. lift_rec(u,m) ~ lift_rec(v,m)"  | 
|
256  | 
by (erule Scomp.induct, simp_all add: comp_refl)  | 
|
257  | 
||
258  | 
lemma subst_rec_preserve_comp [rule_format, simp]:  | 
|
| 24892 | 259  | 
"u2 ~ v2 ==> \<forall>m \<in> nat. \<forall>u1 \<in> redexes. \<forall>v1 \<in> redexes.  | 
| 12593 | 260  | 
u1 ~ v1--> subst_rec(u1,u2,m) ~ subst_rec(v1,v2,m)"  | 
| 24892 | 261  | 
by (erule Scomp.induct,  | 
| 12593 | 262  | 
simp_all add: subst_Var lift_rec_preserve_comp comp_refl)  | 
263  | 
||
264  | 
lemma lift_rec_preserve_reg [simp]:  | 
|
265  | 
"regular(u) ==> \<forall>m \<in> nat. regular(lift_rec(u,m))"  | 
|
266  | 
by (erule Sreg.induct, simp_all add: lift_rec_Var)  | 
|
267  | 
||
268  | 
lemma subst_rec_preserve_reg [simp]:  | 
|
| 24892 | 269  | 
"regular(v) ==>  | 
| 12593 | 270  | 
\<forall>m \<in> nat. \<forall>u \<in> redexes. regular(u)-->regular(subst_rec(u,v,m))"  | 
271  | 
by (erule Sreg.induct, simp_all add: subst_Var lift_rec_preserve_reg)  | 
|
| 1048 | 272  | 
|
273  | 
end  |