equal
deleted
inserted
replaced
18 thm lam.eq_iff |
18 thm lam.eq_iff |
19 thm lam.fv_bn_eqvt |
19 thm lam.fv_bn_eqvt |
20 thm lam.size_eqvt |
20 thm lam.size_eqvt |
21 |
21 |
22 |
22 |
23 section {* Strong Induction Lemma via Induct_schema *} |
|
24 |
|
25 |
|
26 lemma strong_induct: |
|
27 fixes c::"'a::fs" |
|
28 assumes a1: "\<And>name c. P c (Var name)" |
|
29 and a2: "\<And>lam1 lam2 c. \<lbrakk>\<And>d. P d lam1; \<And>d. P d lam2\<rbrakk> \<Longrightarrow> P c (App lam1 lam2)" |
|
30 and a3: "\<And>name lam c. \<lbrakk>{atom name} \<sharp>* c; \<And>d. P d lam\<rbrakk> \<Longrightarrow> P c (Lam name lam)" |
|
31 shows "P c lam" |
|
32 using assms |
|
33 apply(induction_schema) |
|
34 apply(rule_tac y="lam" in lam.strong_exhaust) |
|
35 apply(blast) |
|
36 apply(blast) |
|
37 apply(blast) |
|
38 apply(relation "measure (\<lambda>(x,y). size y)") |
|
39 apply(simp_all add: lam.size) |
|
40 done |
|
41 |
|
42 section {* Typing *} |
23 section {* Typing *} |
43 |
24 |
44 nominal_datatype ty = |
25 nominal_datatype ty = |
45 TVar string |
26 TVar string |
46 | TFun ty ty |
27 | TFun ty ty ("_ \<rightarrow> _") |
47 |
28 |
48 notation |
|
49 TFun ("_ \<rightarrow> _") |
|
50 |
29 |
51 (* |
30 (* |
52 declare ty.perm[eqvt] |
31 declare ty.perm[eqvt] |
53 |
32 |
54 inductive |
33 inductive |