17 val ind_defs = ind_can_defs @ ind_ncan_defs; |
17 val ind_defs = ind_can_defs @ ind_ncan_defs; |
18 |
18 |
19 val data_defs = simp_defs @ ind_defs @ [napply_def]; |
19 val data_defs = simp_defs @ ind_defs @ [napply_def]; |
20 val genrec_defs = [letrec_def,letrec2_def,letrec3_def]; |
20 val genrec_defs = [letrec_def,letrec2_def,letrec3_def]; |
21 |
21 |
22 val term_congs = ccl_mk_congs Term.thy |
|
23 ["inl","inr","succ","op .","split","if","when","ncase","nrec","lcase","lrec", |
|
24 "fst","snd","thd","let","letrec","letrec2","letrec3","napply"]; |
|
25 |
|
26 (*** Beta Rules, including strictness ***) |
22 (*** Beta Rules, including strictness ***) |
27 |
23 |
28 goalw Term.thy [let_def] "~ t=bot--> let x be t in f(x) = f(t)"; |
24 goalw Term.thy [let_def] "~ t=bot--> let x be t in f(x) = f(t)"; |
29 by (res_inst_tac [("t","t")] term_case 1); |
25 by (res_inst_tac [("t","t")] term_case 1); |
30 by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam]))); |
26 by (ALLGOALS(simp_tac(CCL_ss addsimps [caseBtrue,caseBfalse,caseBpair,caseBlam]))); |
31 val letB = result() RS mp; |
27 val letB = result() RS mp; |
32 |
28 |
33 goalw Term.thy [let_def] "let x be bot in f(x) = bot"; |
29 goalw Term.thy [let_def] "let x be bot in f(x) = bot"; |
34 br caseBbot 1; |
30 br caseBbot 1; |
35 val letBabot = result(); |
31 val letBabot = result(); |
36 |
32 |
37 goalw Term.thy [let_def] "let x be t in bot = bot"; |
33 goalw Term.thy [let_def] "let x be t in bot = bot"; |
38 brs ([caseBbot] RL [term_case]) 1; |
34 brs ([caseBbot] RL [term_case]) 1; |
39 by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam]))); |
35 by (ALLGOALS(simp_tac(CCL_ss addsimps [caseBtrue,caseBfalse,caseBpair,caseBlam]))); |
40 val letBbbot = result(); |
36 val letBbbot = result(); |
41 |
37 |
42 goalw Term.thy [apply_def] "(lam x.b(x)) ` a = b(a)"; |
38 goalw Term.thy [apply_def] "(lam x.b(x)) ` a = b(a)"; |
43 by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam]))); |
39 by (ALLGOALS(simp_tac(CCL_ss addsimps [caseBtrue,caseBfalse,caseBpair,caseBlam]))); |
44 val applyB = result(); |
40 val applyB = result(); |
45 |
41 |
46 goalw Term.thy [apply_def] "bot ` a = bot"; |
42 goalw Term.thy [apply_def] "bot ` a = bot"; |
47 br caseBbot 1; |
43 br caseBbot 1; |
48 val applyBbot = result(); |
44 val applyBbot = result(); |
55 "letrec g x be h(x,g) in g(a) = h(a,%y.letrec g x be h(x,g) in g(y))"; |
51 "letrec g x be h(x,g) in g(a) = h(a,%y.letrec g x be h(x,g) in g(y))"; |
56 by (resolve_tac [fixB RS ssubst] 1 THEN |
52 by (resolve_tac [fixB RS ssubst] 1 THEN |
57 resolve_tac [applyB RS ssubst] 1 THEN resolve_tac [refl] 1); |
53 resolve_tac [applyB RS ssubst] 1 THEN resolve_tac [refl] 1); |
58 val letrecB = result(); |
54 val letrecB = result(); |
59 |
55 |
60 val rawBs = caseBs @ [applyB,applyBbot,letrecB]; |
56 val rawBs = caseBs @ [applyB,applyBbot]; |
61 |
57 |
62 fun raw_mk_beta_rl defs s = prove_goalw Term.thy defs s |
58 fun raw_mk_beta_rl defs s = prove_goalw Term.thy defs s |
63 (fn _ => [SIMP_TAC (CCL_ss addrews rawBs addcongs term_congs) 1]); |
59 (fn _ => [rtac (letrecB RS ssubst) 1, |
|
60 simp_tac (CCL_ss addsimps rawBs) 1]); |
|
61 fun mk_beta_rl s = raw_mk_beta_rl data_defs s; |
|
62 |
|
63 fun raw_mk_beta_rl defs s = prove_goalw Term.thy defs s |
|
64 (fn _ => [simp_tac (CCL_ss addsimps rawBs |
|
65 setloop (rtac (letrecB RS ssubst))) 1]); |
64 fun mk_beta_rl s = raw_mk_beta_rl data_defs s; |
66 fun mk_beta_rl s = raw_mk_beta_rl data_defs s; |
65 |
67 |
66 val ifBtrue = mk_beta_rl "if true then t else u = t"; |
68 val ifBtrue = mk_beta_rl "if true then t else u = t"; |
67 val ifBfalse = mk_beta_rl "if false then t else u = u"; |
69 val ifBfalse = mk_beta_rl "if false then t else u = u"; |
68 val ifBbot = mk_beta_rl "if bot then t else u = bot"; |
70 val ifBbot = mk_beta_rl "if bot then t else u = bot"; |
112 napplyBzero,napplyBsucc]; |
114 napplyBzero,napplyBsucc]; |
113 |
115 |
114 (*** Constructors are injective ***) |
116 (*** Constructors are injective ***) |
115 |
117 |
116 val term_injs = map (mk_inj_rl Term.thy |
118 val term_injs = map (mk_inj_rl Term.thy |
117 [applyB,splitB,whenBinl,whenBinr,ncaseBsucc,lcaseBcons] |
119 [applyB,splitB,whenBinl,whenBinr,ncaseBsucc,lcaseBcons]) |
118 (ccl_congs @ term_congs)) |
|
119 ["(inl(a) = inl(a')) <-> (a=a')", |
120 ["(inl(a) = inl(a')) <-> (a=a')", |
120 "(inr(a) = inr(a')) <-> (a=a')", |
121 "(inr(a) = inr(a')) <-> (a=a')", |
121 "(succ(a) = succ(a')) <-> (a=a')", |
122 "(succ(a) = succ(a')) <-> (a=a')", |
122 "(a.b = a'.b') <-> (a=a' & b=b')"]; |
123 "(a.b = a'.b') <-> (a=a' & b=b')"]; |
123 |
124 |
128 |
129 |
129 (*** Rules for pre-order [= ***) |
130 (*** Rules for pre-order [= ***) |
130 |
131 |
131 local |
132 local |
132 fun mk_thm s = prove_goalw Term.thy data_defs s (fn _ => |
133 fun mk_thm s = prove_goalw Term.thy data_defs s (fn _ => |
133 [SIMP_TAC (ccl_ss addrews (ccl_porews)) 1]); |
134 [simp_tac (ccl_ss addsimps (ccl_porews)) 1]); |
134 in |
135 in |
135 val term_porews = map mk_thm ["inl(a) [= inl(a') <-> a [= a'", |
136 val term_porews = map mk_thm ["inl(a) [= inl(a') <-> a [= a'", |
136 "inr(b) [= inr(b') <-> b [= b'", |
137 "inr(b) [= inr(b') <-> b [= b'", |
137 "succ(n) [= succ(n') <-> n [= n'", |
138 "succ(n) [= succ(n') <-> n [= n'", |
138 "x.xs [= x'.xs' <-> x [= x' & xs [= xs'"]; |
139 "x.xs [= x'.xs' <-> x [= x' & xs [= xs'"]; |
139 end; |
140 end; |
140 |
141 |
141 (*** Rewriting and Proving ***) |
142 (*** Rewriting and Proving ***) |
142 |
143 |
143 val term_rews = termBs @ term_injs @ term_dstncts @ ccl_porews @ term_porews; |
144 val term_rews = termBs @ term_injs @ term_dstncts @ ccl_porews @ term_porews; |
144 val term_ss = ccl_ss addrews term_rews addcongs term_congs; |
145 val term_ss = ccl_ss addsimps term_rews; |
145 |
146 |
146 val term_cs = ccl_cs addSEs (term_dstncts RL [notE]) addSDs (XH_to_Ds term_injs); |
147 val term_cs = ccl_cs addSEs (term_dstncts RL [notE]) |
|
148 addSDs (XH_to_Ds term_injs); |