17 val al_rews = |
17 val al_rews = |
18 let fun mk_thm s = prove_goalw AList.thy al_defs s |
18 let fun mk_thm s = prove_goalw AList.thy al_defs s |
19 (fn _ => [simp_tac alist_ss 1]) |
19 (fn _ => [simp_tac alist_ss 1]) |
20 in map mk_thm |
20 in map mk_thm |
21 ["alist_rec(Nil,c,d) = c", |
21 ["alist_rec(Nil,c,d) = c", |
22 "alist_rec(Cons(<a,b>,al),c,d) = d(a,b,al,alist_rec(al,c,d))", |
22 "alist_rec(<a,b>#al,c,d) = d(a,b,al,alist_rec(al,c,d))", |
23 "assoc(v,d,Nil) = d", |
23 "assoc(v,d,Nil) = d", |
24 "assoc(v,d,Cons(<a,b>,al)) = if(v=a,b,assoc(v,d,al))"] end; |
24 "assoc(v,d,<a,b>#al) = if(v=a,b,assoc(v,d,al))"] end; |
25 |
25 |
26 (*********) |
26 (*********) |
27 |
27 |
28 val prems = goal AList.thy |
28 val prems = goal AList.thy |
29 "[| P(Nil); \ |
29 "[| P(Nil); \ |
30 \ !!x y xs. P(xs) ==> P(Cons(<x,y>,xs)) |] ==> P(l)"; |
30 \ !!x y xs. P(xs) ==> P(<x,y>#xs) |] ==> P(l)"; |
31 by (list_ind_tac "l" 1); |
31 by (list_ind_tac "l" 1); |
32 by (resolve_tac prems 1); |
32 by (resolve_tac prems 1); |
33 by (rtac PairE 1); |
33 by (rtac PairE 1); |
34 by (etac ssubst 1); |
34 by (etac ssubst 1); |
35 by (resolve_tac prems 1); |
35 by (resolve_tac prems 1); |
41 EVERY [res_inst_tac [("l",a)] alist_induct M, |
41 EVERY [res_inst_tac [("l",a)] alist_induct M, |
42 rename_last_tac a ["1"] (M+1)]; |
42 rename_last_tac a ["1"] (M+1)]; |
43 |
43 |
44 (* |
44 (* |
45 val prems = goal AList.thy |
45 val prems = goal AList.thy |
46 "[| P(Nil); !! x y xs. P(xs) --> P(Cons(<x,y>,xs)) |] ==> P(a)"; |
46 "[| P(Nil); !! x y xs. P(xs) --> P(<x,y>#xs) |] ==> P(a)"; |
47 by (alist_ind_tac "a" 1); |
47 by (alist_ind_tac "a" 1); |
48 by (ALLGOALS (cut_facts_tac prems THEN' fast_tac HOL_cs)); |
48 by (ALLGOALS (cut_facts_tac prems THEN' fast_tac HOL_cs)); |
49 val alist_induct2 = result(); |
49 val alist_induct2 = result(); |
50 |
50 |
51 add_inds alist_induct2; |
51 add_inds alist_induct2; |