5 For AList.thy. |
5 For AList.thy. |
6 *) |
6 *) |
7 |
7 |
8 open AList; |
8 open AList; |
9 |
9 |
10 (*********) |
|
11 |
|
12 val al_defs = [alist_rec_def,assoc_def]; |
|
13 |
|
14 val alist_ss = prod_ss addsimps [Nil_not_Cons,Cons_not_Nil,Cons_Cons_eq, |
|
15 list_rec_Nil,list_rec_Cons]; |
|
16 |
|
17 val al_rews = |
10 val al_rews = |
18 let fun mk_thm s = prove_goalw AList.thy al_defs s |
11 let fun mk_thm s = prove_goalw AList.thy [alist_rec_def,assoc_def] s |
19 (fn _ => [simp_tac alist_ss 1]) |
12 (fn _ => [simp_tac list_ss 1]) |
20 in map mk_thm |
13 in map mk_thm |
21 ["alist_rec(Nil,c,d) = c", |
14 ["alist_rec([],c,d) = c", |
22 "alist_rec(<a,b>#al,c,d) = d(a,b,al,alist_rec(al,c,d))", |
15 "alist_rec(<a,b>#al,c,d) = d(a,b,al,alist_rec(al,c,d))", |
23 "assoc(v,d,Nil) = d", |
16 "assoc(v,d,[]) = d", |
24 "assoc(v,d,<a,b>#al) = if(v=a,b,assoc(v,d,al))"] end; |
17 "assoc(v,d,<a,b>#al) = if(v=a,b,assoc(v,d,al))"] end; |
25 |
18 |
26 (*********) |
|
27 |
|
28 val prems = goal AList.thy |
19 val prems = goal AList.thy |
29 "[| P(Nil); \ |
20 "[| P([]); \ |
30 \ !!x y xs. P(xs) ==> P(<x,y>#xs) |] ==> P(l)"; |
21 \ !!x y xs. P(xs) ==> P(<x,y>#xs) |] ==> P(l)"; |
31 by (list_ind_tac "l" 1); |
22 by (list.induct_tac "l" 1); |
32 by (resolve_tac prems 1); |
23 by (resolve_tac prems 1); |
33 by (rtac PairE 1); |
24 by (rtac PairE 1); |
34 by (etac ssubst 1); |
25 by (etac ssubst 1); |
35 by (resolve_tac prems 1); |
26 by (resolve_tac prems 1); |
36 by (assume_tac 1); |
27 by (assume_tac 1); |
38 |
29 |
39 (*Perform induction on xs. *) |
30 (*Perform induction on xs. *) |
40 fun alist_ind_tac a M = |
31 fun alist_ind_tac a M = |
41 EVERY [res_inst_tac [("l",a)] alist_induct M, |
32 EVERY [res_inst_tac [("l",a)] alist_induct M, |
42 rename_last_tac a ["1"] (M+1)]; |
33 rename_last_tac a ["1"] (M+1)]; |
43 |
|
44 (* |
|
45 val prems = goal AList.thy |
|
46 "[| P(Nil); !! x y xs. P(xs) --> P(<x,y>#xs) |] ==> P(a)"; |
|
47 by (alist_ind_tac "a" 1); |
|
48 by (ALLGOALS (cut_facts_tac prems THEN' fast_tac HOL_cs)); |
|
49 qed "alist_induct2"; |
|
50 |
|
51 add_inds alist_induct2; |
|
52 *) |
|