88 val nrecBzero = mk_beta_rl "nrec(zero,t,u) = t"; |
88 val nrecBzero = mk_beta_rl "nrec(zero,t,u) = t"; |
89 val nrecBsucc = mk_beta_rl "nrec(succ(n),t,u) = u(n,nrec(n,t,u))"; |
89 val nrecBsucc = mk_beta_rl "nrec(succ(n),t,u) = u(n,nrec(n,t,u))"; |
90 val nrecBbot = mk_beta_rl "nrec(bot,t,u) = bot"; |
90 val nrecBbot = mk_beta_rl "nrec(bot,t,u) = bot"; |
91 |
91 |
92 val lcaseBnil = mk_beta_rl "lcase([],t,u) = t"; |
92 val lcaseBnil = mk_beta_rl "lcase([],t,u) = t"; |
93 val lcaseBcons = mk_beta_rl "lcase(x.xs,t,u) = u(x,xs)"; |
93 val lcaseBcons = mk_beta_rl "lcase(x$xs,t,u) = u(x,xs)"; |
94 val lcaseBbot = mk_beta_rl "lcase(bot,t,u) = bot"; |
94 val lcaseBbot = mk_beta_rl "lcase(bot,t,u) = bot"; |
95 val lrecBnil = mk_beta_rl "lrec([],t,u) = t"; |
95 val lrecBnil = mk_beta_rl "lrec([],t,u) = t"; |
96 val lrecBcons = mk_beta_rl "lrec(x.xs,t,u) = u(x,xs,lrec(xs,t,u))"; |
96 val lrecBcons = mk_beta_rl "lrec(x$xs,t,u) = u(x,xs,lrec(xs,t,u))"; |
97 val lrecBbot = mk_beta_rl "lrec(bot,t,u) = bot"; |
97 val lrecBbot = mk_beta_rl "lrec(bot,t,u) = bot"; |
98 |
98 |
99 val letrec2B = raw_mk_beta_rl (data_defs @ [letrec2_def]) |
99 val letrec2B = raw_mk_beta_rl (data_defs @ [letrec2_def]) |
100 "letrec g x y be h(x,y,g) in g(p,q) = \ |
100 "letrec g x y be h(x,y,g) in g(p,q) = \ |
101 \ h(p,q,%u v.letrec g x y be h(x,y,g) in g(u,v))"; |
101 \ h(p,q,%u v.letrec g x y be h(x,y,g) in g(u,v))"; |
118 val term_injs = map (mk_inj_rl Term.thy |
118 val term_injs = map (mk_inj_rl Term.thy |
119 [applyB,splitB,whenBinl,whenBinr,ncaseBsucc,lcaseBcons]) |
119 [applyB,splitB,whenBinl,whenBinr,ncaseBsucc,lcaseBcons]) |
120 ["(inl(a) = inl(a')) <-> (a=a')", |
120 ["(inl(a) = inl(a')) <-> (a=a')", |
121 "(inr(a) = inr(a')) <-> (a=a')", |
121 "(inr(a) = inr(a')) <-> (a=a')", |
122 "(succ(a) = succ(a')) <-> (a=a')", |
122 "(succ(a) = succ(a')) <-> (a=a')", |
123 "(a.b = a'.b') <-> (a=a' & b=b')"]; |
123 "(a$b = a'$b') <-> (a=a' & b=b')"]; |
124 |
124 |
125 (*** Constructors are distinct ***) |
125 (*** Constructors are distinct ***) |
126 |
126 |
127 val term_dstncts = mkall_dstnct_thms Term.thy data_defs (ccl_injs @ term_injs) |
127 val term_dstncts = mkall_dstnct_thms Term.thy data_defs (ccl_injs @ term_injs) |
128 [["bot","inl","inr"],["bot","zero","succ"],["bot","nil","op ."]]; |
128 [["bot","inl","inr"],["bot","zero","succ"],["bot","nil","op $"]]; |
129 |
129 |
130 (*** Rules for pre-order [= ***) |
130 (*** Rules for pre-order [= ***) |
131 |
131 |
132 local |
132 local |
133 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 _ => |
134 [simp_tac (ccl_ss addsimps (ccl_porews)) 1]); |
134 [simp_tac (ccl_ss addsimps (ccl_porews)) 1]); |
135 in |
135 in |
136 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'", |
137 "inr(b) [= inr(b') <-> b [= b'", |
137 "inr(b) [= inr(b') <-> b [= b'", |
138 "succ(n) [= succ(n') <-> n [= n'", |
138 "succ(n) [= succ(n') <-> n [= n'", |
139 "x.xs [= x'.xs' <-> x [= x' & xs [= xs'"]; |
139 "x$xs [= x'$xs' <-> x [= x' & xs [= xs'"]; |
140 end; |
140 end; |
141 |
141 |
142 (*** Rewriting and Proving ***) |
142 (*** Rewriting and Proving ***) |
143 |
143 |
144 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; |