10 *) |
10 *) |
11 |
11 |
12 open Eta; |
12 open Eta; |
13 |
13 |
14 Addsimps eta.intrs; |
14 Addsimps eta.intrs; |
15 Addsimps [imp_disj]; |
|
16 |
15 |
17 val eta_cases = map (eta.mk_cases db.simps) |
16 val eta_cases = map (eta.mk_cases db.simps) |
18 ["Fun s -e> z","s @ t -e> u","Var i -e> t"]; |
17 ["Fun s -e> z","s @ t -e> u","Var i -e> t"]; |
19 |
18 |
20 val beta_cases = map (beta.mk_cases db.simps) |
19 val beta_cases = map (beta.mk_cases db.simps) |
21 ["s @ t -> u","Var i -> t"]; |
20 ["s @ t -> u","Var i -> t"]; |
22 |
21 |
23 AddIs eta.intrs; |
22 AddIs eta.intrs; |
24 AddSEs (beta_cases@eta_cases); |
23 AddSEs (beta_cases@eta_cases); |
25 |
|
26 section "Arithmetic lemmas"; |
|
27 |
|
28 goal HOL.thy "!!P. P ==> P=True"; |
|
29 by (fast_tac HOL_cs 1); |
|
30 qed "True_eq"; |
|
31 |
|
32 Addsimps [less_not_sym RS True_eq]; |
|
33 |
|
34 goal Arith.thy "i < j --> pred i < j"; |
|
35 by (nat_ind_tac "j" 1); |
|
36 by (ALLGOALS(asm_simp_tac(!simpset addsimps [less_Suc_eq]))); |
|
37 by (nat_ind_tac "j1" 1); |
|
38 by (ALLGOALS Asm_simp_tac); |
|
39 qed_spec_mp "less_imp_pred_less"; |
|
40 |
|
41 goal Arith.thy "i<j --> ~ pred j < i"; |
|
42 by (nat_ind_tac "j" 1); |
|
43 by (ALLGOALS(asm_simp_tac(!simpset addsimps [less_Suc_eq]))); |
|
44 qed_spec_mp "less_imp_not_pred_less"; |
|
45 Addsimps [less_imp_not_pred_less]; |
|
46 |
|
47 goal Nat.thy "i < j --> j < Suc(Suc i) --> j = Suc i"; |
|
48 by (nat_ind_tac "j" 1); |
|
49 by (ALLGOALS Simp_tac); |
|
50 by (simp_tac(!simpset addsimps [less_Suc_eq])1); |
|
51 by (fast_tac (HOL_cs addDs [less_not_sym]) 1); |
|
52 qed_spec_mp "less_interval1"; |
|
53 |
|
54 |
24 |
55 section "decr and free"; |
25 section "decr and free"; |
56 |
26 |
57 goal Eta.thy "!i k. free (lift t k) i = \ |
27 goal Eta.thy "!i k. free (lift t k) i = \ |
58 \ (i < k & free t i | k < i & free t (pred i))"; |
28 \ (i < k & free t i | k < i & free t (pred i))"; |
59 by (db.induct_tac "t" 1); |
29 by (db.induct_tac "t" 1); |
60 by (ALLGOALS(asm_full_simp_tac (addsplit (!simpset) addcongs [conj_cong]))); |
30 by (ALLGOALS(asm_full_simp_tac (addsplit (!simpset) addcongs [conj_cong]))); |
61 by (fast_tac HOL_cs 2); |
31 by (fast_tac HOL_cs 2); |
62 by (safe_tac (HOL_cs addSIs [iffI])); |
32 by(simp_tac (!simpset addsimps [pred_def] |
63 by (dtac Suc_mono 1); |
33 setloop (split_tac [expand_nat_case])) 1); |
64 by (ALLGOALS(Asm_full_simp_tac)); |
34 by (safe_tac HOL_cs); |
65 by (dtac less_trans_Suc 1 THEN atac 1); |
35 by (ALLGOALS trans_tac); |
66 by (dtac less_trans_Suc 2 THEN atac 2); |
|
67 by (ALLGOALS(Asm_full_simp_tac)); |
|
68 qed "free_lift"; |
36 qed "free_lift"; |
69 Addsimps [free_lift]; |
37 Addsimps [free_lift]; |
70 |
38 |
71 goal Eta.thy "!i k t. free (s[t/k]) i = \ |
39 goal Eta.thy "!i k t. free (s[t/k]) i = \ |
72 \ (free s k & free t i | free s (if i<k then i else Suc i))"; |
40 \ (free s k & free t i | free s (if i<k then i else Suc i))"; |
73 by (db.induct_tac "s" 1); |
41 by (db.induct_tac "s" 1); |
74 by (ALLGOALS(asm_full_simp_tac (addsplit (!simpset) addsimps |
42 by (Asm_simp_tac 2); |
75 [less_not_refl2,less_not_refl2 RS not_sym]))); |
43 by (Fast_tac 2); |
76 by (fast_tac HOL_cs 2); |
44 by (asm_full_simp_tac (addsplit (!simpset)) 2); |
77 by (safe_tac (HOL_cs addSIs [iffI])); |
45 by(simp_tac (!simpset addsimps [pred_def,subst_Var] |
78 by (ALLGOALS(Asm_simp_tac)); |
46 setloop (split_tac [expand_if,expand_nat_case])) 1); |
79 by (fast_tac (HOL_cs addEs [less_imp_not_pred_less RS notE]) 1); |
47 by (safe_tac (HOL_cs addSEs [nat_neqE])); |
80 by (fast_tac (HOL_cs addDs [less_not_sym]) 1); |
48 by (ALLGOALS trans_tac); |
81 by (dtac Suc_mono 1); |
|
82 by (dtac less_interval1 1 THEN atac 1); |
|
83 by (asm_full_simp_tac (!simpset addsimps [eq_sym_conv]) 1); |
|
84 by (dtac less_trans_Suc 1 THEN atac 1); |
|
85 by (Asm_full_simp_tac 1); |
|
86 qed "free_subst"; |
49 qed "free_subst"; |
87 Addsimps [free_subst]; |
50 Addsimps [free_subst]; |
88 |
51 |
89 goal Eta.thy "!!s. s -e> t ==> !i. free t i = free s i"; |
52 goal Eta.thy "!!s. s -e> t ==> !i. free t i = free s i"; |
90 by (etac eta.induct 1); |
53 by (etac eta.induct 1); |