225 val eqn = mk_eq (y, list_ccomb (con, vs)) |
225 val eqn = mk_eq (y, list_ccomb (con, vs)) |
226 val conj = foldr1 mk_conj (eqn :: map mk_defined nonlazy) |
226 val conj = foldr1 mk_conj (eqn :: map mk_defined nonlazy) |
227 in Library.foldr mk_ex (vs, conj) end |
227 in Library.foldr mk_ex (vs, conj) end |
228 val goal = mk_trp (foldr1 mk_disj (mk_undef y :: map one_con spec')) |
228 val goal = mk_trp (foldr1 mk_disj (mk_undef y :: map one_con spec')) |
229 (* first rules replace "y = bottom \/ P" with "rep$y = bottom \/ P" *) |
229 (* first rules replace "y = bottom \/ P" with "rep$y = bottom \/ P" *) |
230 fun tacs {context = ctxt, prems} = [ |
230 fun tacs ctxt = [ |
231 rtac (iso_locale RS @{thm iso.casedist_rule}) 1, |
231 rtac (iso_locale RS @{thm iso.casedist_rule}) 1, |
232 rewrite_goals_tac ctxt [mk_meta_eq (iso_locale RS @{thm iso.iso_swap})], |
232 rewrite_goals_tac ctxt [mk_meta_eq (iso_locale RS @{thm iso.iso_swap})], |
233 rtac thm3 1] |
233 rtac thm3 1] |
234 in |
234 in |
235 val nchotomy = prove thy con_betas goal tacs |
235 val nchotomy = prove thy con_betas goal (tacs o #context) |
236 val exhaust = |
236 val exhaust = |
237 (nchotomy RS @{thm exh_casedist0}) |
237 (nchotomy RS @{thm exh_casedist0}) |
238 |> rewrite_rule (Proof_Context.init_global thy) @{thms exh_casedists} |
238 |> rewrite_rule (Proof_Context.init_global thy) @{thms exh_casedists} |
239 |> Drule.zero_var_indexes |
239 |> Drule.zero_var_indexes |
240 end |
240 end |
270 fun one_strict v' = |
270 fun one_strict v' = |
271 let |
271 let |
272 val bottom = mk_bottom (fastype_of v') |
272 val bottom = mk_bottom (fastype_of v') |
273 val vs' = map (fn v => if v = v' then bottom else v) vs |
273 val vs' = map (fn v => if v = v' then bottom else v) vs |
274 val goal = mk_trp (mk_undef (list_ccomb (con, vs'))) |
274 val goal = mk_trp (mk_undef (list_ccomb (con, vs'))) |
275 val tacs = [simp_tac (Simplifier.global_context thy HOL_basic_ss addsimps rules) 1] |
275 fun tacs ctxt = [simp_tac (put_simpset HOL_basic_ss ctxt addsimps rules) 1] |
276 in prove thy con_betas goal (K tacs) end |
276 in prove thy con_betas goal (tacs o #context) end |
277 in map one_strict nonlazy end |
277 in map one_strict nonlazy end |
278 |
278 |
279 fun con_defin (con, args) = |
279 fun con_defin (con, args) = |
280 let |
280 let |
281 fun iff_disj (t, []) = HOLogic.mk_not t |
281 fun iff_disj (t, []) = HOLogic.mk_not t |
284 val lhs = mk_undef (list_ccomb (con, vs)) |
284 val lhs = mk_undef (list_ccomb (con, vs)) |
285 val rhss = map mk_undef nonlazy |
285 val rhss = map mk_undef nonlazy |
286 val goal = mk_trp (iff_disj (lhs, rhss)) |
286 val goal = mk_trp (iff_disj (lhs, rhss)) |
287 val rule1 = iso_locale RS @{thm iso.abs_bottom_iff} |
287 val rule1 = iso_locale RS @{thm iso.abs_bottom_iff} |
288 val rules = rule1 :: @{thms con_bottom_iff_rules} |
288 val rules = rule1 :: @{thms con_bottom_iff_rules} |
289 val tacs = [simp_tac (Simplifier.global_context thy HOL_ss addsimps rules) 1] |
289 fun tacs ctxt = [simp_tac (put_simpset HOL_ss ctxt addsimps rules) 1] |
290 in prove thy con_betas goal (K tacs) end |
290 in prove thy con_betas goal (tacs o #context) end |
291 in |
291 in |
292 val con_stricts = maps con_strict spec' |
292 val con_stricts = maps con_strict spec' |
293 val con_defins = map con_defin spec' |
293 val con_defins = map con_defin spec' |
294 val con_rews = con_stricts @ con_defins |
294 val con_rews = con_stricts @ con_defins |
295 end |
295 end |
315 let |
315 let |
316 val abs_below = iso_locale RS @{thm iso.abs_below} |
316 val abs_below = iso_locale RS @{thm iso.abs_below} |
317 val rules1 = abs_below :: @{thms sinl_below sinr_below spair_below up_below} |
317 val rules1 = abs_below :: @{thms sinl_below sinr_below spair_below up_below} |
318 val rules2 = @{thms up_defined spair_defined ONE_defined} |
318 val rules2 = @{thms up_defined spair_defined ONE_defined} |
319 val rules = rules1 @ rules2 |
319 val rules = rules1 @ rules2 |
320 val tacs = [asm_simp_tac (Simplifier.global_context thy simple_ss addsimps rules) 1] |
320 fun tacs ctxt = [asm_simp_tac (put_simpset simple_ss ctxt addsimps rules) 1] |
321 in map (fn c => pgterm mk_below c (K tacs)) cons' end |
321 in map (fn c => pgterm mk_below c (tacs o #context)) cons' end |
322 val injects = |
322 val injects = |
323 let |
323 let |
324 val abs_eq = iso_locale RS @{thm iso.abs_eq} |
324 val abs_eq = iso_locale RS @{thm iso.abs_eq} |
325 val rules1 = abs_eq :: @{thms sinl_eq sinr_eq spair_eq up_eq} |
325 val rules1 = abs_eq :: @{thms sinl_eq sinr_eq spair_eq up_eq} |
326 val rules2 = @{thms up_defined spair_defined ONE_defined} |
326 val rules2 = @{thms up_defined spair_defined ONE_defined} |
327 val rules = rules1 @ rules2 |
327 val rules = rules1 @ rules2 |
328 val tacs = [asm_simp_tac (Simplifier.global_context thy simple_ss addsimps rules) 1] |
328 fun tacs ctxt = [asm_simp_tac (put_simpset simple_ss ctxt addsimps rules) 1] |
329 in map (fn c => pgterm mk_eq c (K tacs)) cons' end |
329 in map (fn c => pgterm mk_eq c (tacs o #context)) cons' end |
330 end |
330 end |
331 |
331 |
332 (* prove distinctness of constructors *) |
332 (* prove distinctness of constructors *) |
333 local |
333 local |
334 fun map_dist (f : 'a -> 'a -> 'b) (xs : 'a list) : 'b list = |
334 fun map_dist (f : 'a -> 'a -> 'b) (xs : 'a list) : 'b list = |
348 val lhs = mk_below (list_ccomb (con1, vs1), list_ccomb (con2, vs2)) |
348 val lhs = mk_below (list_ccomb (con1, vs1), list_ccomb (con2, vs2)) |
349 val rhss = map mk_undef zs1 |
349 val rhss = map mk_undef zs1 |
350 val goal = mk_trp (iff_disj (lhs, rhss)) |
350 val goal = mk_trp (iff_disj (lhs, rhss)) |
351 val rule1 = iso_locale RS @{thm iso.abs_below} |
351 val rule1 = iso_locale RS @{thm iso.abs_below} |
352 val rules = rule1 :: @{thms con_below_iff_rules} |
352 val rules = rule1 :: @{thms con_below_iff_rules} |
353 val tacs = [simp_tac (Simplifier.global_context thy HOL_ss addsimps rules) 1] |
353 fun tacs ctxt = [simp_tac (put_simpset HOL_ss ctxt addsimps rules) 1] |
354 in prove thy con_betas goal (K tacs) end |
354 in prove thy con_betas goal (tacs o #context) end |
355 fun dist_eq (con1, args1) (con2, args2) = |
355 fun dist_eq (con1, args1) (con2, args2) = |
356 let |
356 let |
357 val (vs1, zs1) = get_vars args1 |
357 val (vs1, zs1) = get_vars args1 |
358 val (vs2, zs2) = get_vars args2 |> pairself (map prime) |
358 val (vs2, zs2) = get_vars args2 |> pairself (map prime) |
359 val lhs = mk_eq (list_ccomb (con1, vs1), list_ccomb (con2, vs2)) |
359 val lhs = mk_eq (list_ccomb (con1, vs1), list_ccomb (con2, vs2)) |
360 val rhss1 = map mk_undef zs1 |
360 val rhss1 = map mk_undef zs1 |
361 val rhss2 = map mk_undef zs2 |
361 val rhss2 = map mk_undef zs2 |
362 val goal = mk_trp (iff_disj2 (lhs, rhss1, rhss2)) |
362 val goal = mk_trp (iff_disj2 (lhs, rhss1, rhss2)) |
363 val rule1 = iso_locale RS @{thm iso.abs_eq} |
363 val rule1 = iso_locale RS @{thm iso.abs_eq} |
364 val rules = rule1 :: @{thms con_eq_iff_rules} |
364 val rules = rule1 :: @{thms con_eq_iff_rules} |
365 val tacs = [simp_tac (Simplifier.global_context thy HOL_ss addsimps rules) 1] |
365 fun tacs ctxt = [simp_tac (put_simpset HOL_ss ctxt addsimps rules) 1] |
366 in prove thy con_betas goal (K tacs) end |
366 in prove thy con_betas goal (tacs o #context) end |
367 in |
367 in |
368 val dist_les = map_dist dist_le spec' |
368 val dist_les = map_dist dist_le spec' |
369 val dist_eqs = map_dist dist_eq spec' |
369 val dist_eqs = map_dist dist_eq spec' |
370 end |
370 end |
371 |
371 |
516 val defs = case_beta :: con_betas |
516 val defs = case_beta :: con_betas |
517 val rules1 = @{thms strictify2 sscase2 sscase3 ssplit2 fup2 ID1} |
517 val rules1 = @{thms strictify2 sscase2 sscase3 ssplit2 fup2 ID1} |
518 val rules2 = @{thms con_bottom_iff_rules} |
518 val rules2 = @{thms con_bottom_iff_rules} |
519 val rules3 = @{thms cfcomp2 one_case2} |
519 val rules3 = @{thms cfcomp2 one_case2} |
520 val rules = abs_inverse :: rules1 @ rules2 @ rules3 |
520 val rules = abs_inverse :: rules1 @ rules2 @ rules3 |
521 val tacs = [asm_simp_tac (Simplifier.global_context thy beta_ss addsimps rules) 1] |
521 fun tacs ctxt = [asm_simp_tac (put_simpset beta_ss ctxt addsimps rules) 1] |
522 in prove thy defs goal (K tacs) end |
522 in prove thy defs goal (tacs o #context) end |
523 in |
523 in |
524 val case_apps = map2 one_case spec fs |
524 val case_apps = map2 one_case spec fs |
525 end |
525 end |
526 |
526 |
527 in |
527 in |
584 |
584 |
585 (* prove selector strictness rules *) |
585 (* prove selector strictness rules *) |
586 val sel_stricts : thm list = |
586 val sel_stricts : thm list = |
587 let |
587 let |
588 val rules = rep_strict :: @{thms sel_strict_rules} |
588 val rules = rep_strict :: @{thms sel_strict_rules} |
589 val tacs = [simp_tac (Simplifier.global_context thy HOL_basic_ss addsimps rules) 1] |
589 fun tacs ctxt = [simp_tac (put_simpset HOL_basic_ss ctxt addsimps rules) 1] |
590 fun sel_strict sel = |
590 fun sel_strict sel = |
591 let |
591 let |
592 val goal = mk_trp (mk_strict sel) |
592 val goal = mk_trp (mk_strict sel) |
593 in |
593 in |
594 prove thy sel_defs goal (K tacs) |
594 prove thy sel_defs goal (tacs o #context) |
595 end |
595 end |
596 in |
596 in |
597 map sel_strict sel_consts |
597 map sel_strict sel_consts |
598 end |
598 end |
599 |
599 |
600 (* prove selector application rules *) |
600 (* prove selector application rules *) |
601 val sel_apps : thm list = |
601 val sel_apps : thm list = |
602 let |
602 let |
603 val defs = con_betas @ sel_defs |
603 val defs = con_betas @ sel_defs |
604 val rules = abs_inv :: @{thms sel_app_rules} |
604 val rules = abs_inv :: @{thms sel_app_rules} |
605 val tacs = [asm_simp_tac (Simplifier.global_context thy simple_ss addsimps rules) 1] |
605 fun tacs ctxt = [asm_simp_tac (put_simpset simple_ss ctxt addsimps rules) 1] |
606 fun sel_apps_of (i, (con, args: (bool * term option * typ) list)) = |
606 fun sel_apps_of (i, (con, args: (bool * term option * typ) list)) = |
607 let |
607 let |
608 val Ts : typ list = map #3 args |
608 val Ts : typ list = map #3 args |
609 val ns : string list = Datatype_Prop.make_tnames Ts |
609 val ns : string list = Datatype_Prop.make_tnames Ts |
610 val vs : term list = map Free (ns ~~ Ts) |
610 val vs : term list = map Free (ns ~~ Ts) |
615 val xs = map snd (filter_out fst (nth_drop n vs')) |
615 val xs = map snd (filter_out fst (nth_drop n vs')) |
616 val assms = map (mk_trp o mk_defined) xs |
616 val assms = map (mk_trp o mk_defined) xs |
617 val concl = mk_trp (mk_eq (sel ` con_app, nth vs n)) |
617 val concl = mk_trp (mk_eq (sel ` con_app, nth vs n)) |
618 val goal = Logic.list_implies (assms, concl) |
618 val goal = Logic.list_implies (assms, concl) |
619 in |
619 in |
620 prove thy defs goal (K tacs) |
620 prove thy defs goal (tacs o #context) |
621 end |
621 end |
622 fun one_diff (_, sel, T) = |
622 fun one_diff (_, sel, T) = |
623 let |
623 let |
624 val goal = mk_trp (mk_eq (sel ` con_app, mk_bottom T)) |
624 val goal = mk_trp (mk_eq (sel ` con_app, mk_bottom T)) |
625 in |
625 in |
626 prove thy defs goal (K tacs) |
626 prove thy defs goal (tacs o #context) |
627 end |
627 end |
628 fun one_con (j, (_, args')) : thm list = |
628 fun one_con (j, (_, args')) : thm list = |
629 let |
629 let |
630 fun prep (_, (_, NONE, _)) = NONE |
630 fun prep (_, (_, NONE, _)) = NONE |
631 | prep (i, (_, SOME sel, T)) = SOME (i, sel, T) |
631 | prep (i, (_, SOME sel, T)) = SOME (i, sel, T) |
645 |
645 |
646 (* prove selector definedness rules *) |
646 (* prove selector definedness rules *) |
647 val sel_defins : thm list = |
647 val sel_defins : thm list = |
648 let |
648 let |
649 val rules = rep_bottom_iff :: @{thms sel_bottom_iff_rules} |
649 val rules = rep_bottom_iff :: @{thms sel_bottom_iff_rules} |
650 val tacs = [simp_tac (Simplifier.global_context thy HOL_basic_ss addsimps rules) 1] |
650 fun tacs ctxt = [simp_tac (put_simpset HOL_basic_ss ctxt addsimps rules) 1] |
651 fun sel_defin sel = |
651 fun sel_defin sel = |
652 let |
652 let |
653 val (T, U) = dest_cfunT (fastype_of sel) |
653 val (T, U) = dest_cfunT (fastype_of sel) |
654 val x = Free ("x", T) |
654 val x = Free ("x", T) |
655 val lhs = mk_eq (sel ` x, mk_bottom U) |
655 val lhs = mk_eq (sel ` x, mk_bottom U) |
656 val rhs = mk_eq (x, mk_bottom T) |
656 val rhs = mk_eq (x, mk_bottom T) |
657 val goal = mk_trp (mk_eq (lhs, rhs)) |
657 val goal = mk_trp (mk_eq (lhs, rhs)) |
658 in |
658 in |
659 prove thy sel_defs goal (K tacs) |
659 prove thy sel_defs goal (tacs o #context) |
660 end |
660 end |
661 fun one_arg (false, SOME sel, _) = SOME (sel_defin sel) |
661 fun one_arg (false, SOME sel, _) = SOME (sel_defin sel) |
662 | one_arg _ = NONE |
662 | one_arg _ = NONE |
663 in |
663 in |
664 case spec2 of |
664 case spec2 of |
722 val lhs = dis ` list_ccomb (con, vs) |
722 val lhs = dis ` list_ccomb (con, vs) |
723 val rhs = if i = j then @{term TT} else @{term FF} |
723 val rhs = if i = j then @{term TT} else @{term FF} |
724 val assms = map (mk_trp o mk_defined) nonlazy |
724 val assms = map (mk_trp o mk_defined) nonlazy |
725 val concl = mk_trp (mk_eq (lhs, rhs)) |
725 val concl = mk_trp (mk_eq (lhs, rhs)) |
726 val goal = Logic.list_implies (assms, concl) |
726 val goal = Logic.list_implies (assms, concl) |
727 val tacs = [asm_simp_tac (Simplifier.global_context thy beta_ss addsimps case_rews) 1] |
727 fun tacs ctxt = [asm_simp_tac (put_simpset beta_ss ctxt addsimps case_rews) 1] |
728 in prove thy dis_defs goal (K tacs) end |
728 in prove thy dis_defs goal (tacs o #context) end |
729 fun one_dis (i, dis) = |
729 fun one_dis (i, dis) = |
730 map_index (dis_app (i, dis)) spec |
730 map_index (dis_app (i, dis)) spec |
731 in |
731 in |
732 val dis_apps = flat (map_index one_dis dis_consts) |
732 val dis_apps = flat (map_index one_dis dis_consts) |
733 end |
733 end |
736 local |
736 local |
737 fun dis_defin dis = |
737 fun dis_defin dis = |
738 let |
738 let |
739 val x = Free ("x", lhsT) |
739 val x = Free ("x", lhsT) |
740 val simps = dis_apps @ @{thms dist_eq_tr} |
740 val simps = dis_apps @ @{thms dist_eq_tr} |
741 val tacs = |
741 fun tacs ctxt = |
742 [rtac @{thm iffI} 1, |
742 [rtac @{thm iffI} 1, |
743 asm_simp_tac (Simplifier.global_context thy HOL_basic_ss addsimps dis_stricts) 2, |
743 asm_simp_tac (put_simpset HOL_basic_ss ctxt addsimps dis_stricts) 2, |
744 rtac exhaust 1, atac 1, |
744 rtac exhaust 1, atac 1, |
745 ALLGOALS (asm_full_simp_tac (Simplifier.global_context thy simple_ss addsimps simps))] |
745 ALLGOALS (asm_full_simp_tac (put_simpset simple_ss ctxt addsimps simps))] |
746 val goal = mk_trp (mk_eq (mk_undef (dis ` x), mk_undef x)) |
746 val goal = mk_trp (mk_eq (mk_undef (dis ` x), mk_undef x)) |
747 in prove thy [] goal (K tacs) end |
747 in prove thy [] goal (tacs o #context) end |
748 in |
748 in |
749 val dis_defins = map dis_defin dis_consts |
749 val dis_defins = map dis_defin dis_consts |
750 end |
750 end |
751 |
751 |
752 in |
752 in |
811 fun match_strict mat = |
811 fun match_strict mat = |
812 let |
812 let |
813 val (T, (U, V)) = apsnd dest_cfunT (dest_cfunT (fastype_of mat)) |
813 val (T, (U, V)) = apsnd dest_cfunT (dest_cfunT (fastype_of mat)) |
814 val k = Free ("k", U) |
814 val k = Free ("k", U) |
815 val goal = mk_trp (mk_eq (mat ` mk_bottom T ` k, mk_bottom V)) |
815 val goal = mk_trp (mk_eq (mat ` mk_bottom T ` k, mk_bottom V)) |
816 val tacs = [asm_simp_tac (Simplifier.global_context thy beta_ss addsimps case_rews) 1] |
816 fun tacs ctxt = [asm_simp_tac (put_simpset beta_ss ctxt addsimps case_rews) 1] |
817 in prove thy match_defs goal (K tacs) end |
817 in prove thy match_defs goal (tacs o #context) end |
818 in |
818 in |
819 val match_stricts = map match_strict match_consts |
819 val match_stricts = map match_strict match_consts |
820 end |
820 end |
821 |
821 |
822 (* prove match/constructor rules *) |
822 (* prove match/constructor rules *) |
830 val lhs = mat ` list_ccomb (con, vs) ` k |
830 val lhs = mat ` list_ccomb (con, vs) ` k |
831 val rhs = if i = j then list_ccomb (k, vs) else fail |
831 val rhs = if i = j then list_ccomb (k, vs) else fail |
832 val assms = map (mk_trp o mk_defined) nonlazy |
832 val assms = map (mk_trp o mk_defined) nonlazy |
833 val concl = mk_trp (mk_eq (lhs, rhs)) |
833 val concl = mk_trp (mk_eq (lhs, rhs)) |
834 val goal = Logic.list_implies (assms, concl) |
834 val goal = Logic.list_implies (assms, concl) |
835 val tacs = [asm_simp_tac (Simplifier.global_context thy beta_ss addsimps case_rews) 1] |
835 fun tacs ctxt = [asm_simp_tac (put_simpset beta_ss ctxt addsimps case_rews) 1] |
836 in prove thy match_defs goal (K tacs) end |
836 in prove thy match_defs goal (tacs o #context) end |
837 fun one_match (i, mat) = |
837 fun one_match (i, mat) = |
838 map_index (match_app (i, mat)) spec |
838 map_index (match_app (i, mat)) spec |
839 in |
839 in |
840 val match_apps = flat (map_index one_match match_consts) |
840 val match_apps = flat (map_index one_match match_consts) |
841 end |
841 end |