623 fun tac _ [] = rtac set_singleton 1 ORELSE rtac inst_Collect_mem_eq 1 |
623 fun tac _ [] = rtac set_singleton 1 ORELSE rtac inst_Collect_mem_eq 1 |
624 | tac ctxt (If :: cont) = |
624 | tac ctxt (If :: cont) = |
625 Splitter.split_tac ctxt @{thms split_if} 1 |
625 Splitter.split_tac ctxt @{thms split_if} 1 |
626 THEN rtac @{thm conjI} 1 |
626 THEN rtac @{thm conjI} 1 |
627 THEN rtac @{thm impI} 1 |
627 THEN rtac @{thm impI} 1 |
628 THEN Subgoal.FOCUS (fn {prems, context, ...} => |
628 THEN Subgoal.FOCUS (fn {prems, context = ctxt', ...} => |
629 CONVERSION (right_hand_set_comprehension_conv (K |
629 CONVERSION (right_hand_set_comprehension_conv (K |
630 (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_TrueI})) Conv.all_conv |
630 (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_TrueI})) Conv.all_conv |
631 then_conv |
631 then_conv |
632 rewr_conv' @{lemma "(True \<and> P) = P" by simp})) context) 1) ctxt 1 |
632 rewr_conv' @{lemma "(True \<and> P) = P" by simp})) ctxt') 1) ctxt 1 |
633 THEN tac ctxt cont |
633 THEN tac ctxt cont |
634 THEN rtac @{thm impI} 1 |
634 THEN rtac @{thm impI} 1 |
635 THEN Subgoal.FOCUS (fn {prems, context, ...} => |
635 THEN Subgoal.FOCUS (fn {prems, context = ctxt', ...} => |
636 CONVERSION (right_hand_set_comprehension_conv (K |
636 CONVERSION (right_hand_set_comprehension_conv (K |
637 (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_FalseI})) Conv.all_conv |
637 (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_FalseI})) Conv.all_conv |
638 then_conv rewr_conv' @{lemma "(False \<and> P) = False" by simp})) context) 1) ctxt 1 |
638 then_conv rewr_conv' @{lemma "(False \<and> P) = False" by simp})) ctxt') 1) ctxt 1 |
639 THEN rtac set_Nil_I 1 |
639 THEN rtac set_Nil_I 1 |
640 | tac ctxt (Case (T, i) :: cont) = |
640 | tac ctxt (Case (T, i) :: cont) = |
641 let |
641 let |
642 val SOME {injects, distincts, case_thms, split, ...} = |
642 val SOME {injects, distincts, case_thms, split, ...} = |
643 Ctr_Sugar.ctr_sugar_of ctxt (fst (dest_Type T)) |
643 Ctr_Sugar.ctr_sugar_of ctxt (fst (dest_Type T)) |
648 (if i' < length case_thms - 1 then rtac @{thm conjI} 1 else all_tac) |
648 (if i' < length case_thms - 1 then rtac @{thm conjI} 1 else all_tac) |
649 THEN REPEAT_DETERM (rtac @{thm allI} 1) |
649 THEN REPEAT_DETERM (rtac @{thm allI} 1) |
650 THEN rtac @{thm impI} 1 |
650 THEN rtac @{thm impI} 1 |
651 THEN (if i' = i then |
651 THEN (if i' = i then |
652 (* continue recursively *) |
652 (* continue recursively *) |
653 Subgoal.FOCUS (fn {prems, context, ...} => |
653 Subgoal.FOCUS (fn {prems, context = ctxt', ...} => |
654 CONVERSION (Thm.eta_conversion then_conv right_hand_set_comprehension_conv (K |
654 CONVERSION (Thm.eta_conversion then_conv right_hand_set_comprehension_conv (K |
655 ((HOLogic.conj_conv |
655 ((HOLogic.conj_conv |
656 (HOLogic.eq_conv Conv.all_conv (rewr_conv' (List.last prems)) then_conv |
656 (HOLogic.eq_conv Conv.all_conv (rewr_conv' (List.last prems)) then_conv |
657 (Conv.try_conv (Conv.rewrs_conv (map mk_meta_eq injects)))) |
657 (Conv.try_conv (Conv.rewrs_conv (map mk_meta_eq injects)))) |
658 Conv.all_conv) |
658 Conv.all_conv) |
659 then_conv (Conv.try_conv (Conv.rewr_conv del_refl_eq)) |
659 then_conv (Conv.try_conv (Conv.rewr_conv del_refl_eq)) |
660 then_conv conjunct_assoc_conv)) context |
660 then_conv conjunct_assoc_conv)) ctxt' |
661 then_conv (HOLogic.Trueprop_conv (HOLogic.eq_conv Conv.all_conv (Collect_conv (fn (_, ctxt) => |
661 then_conv |
662 Conv.repeat_conv |
662 (HOLogic.Trueprop_conv |
663 (all_but_last_exists_conv |
663 (HOLogic.eq_conv Conv.all_conv (Collect_conv (fn (_, ctxt'') => |
664 (K (rewr_conv' |
664 Conv.repeat_conv |
665 @{lemma "(\<exists>x. x = t \<and> P x) = P t" by simp})) ctxt)) context)))) 1) ctxt 1 |
665 (all_but_last_exists_conv |
|
666 (K (rewr_conv' |
|
667 @{lemma "(\<exists>x. x = t \<and> P x) = P t" by simp})) ctxt'')) ctxt')))) 1) ctxt 1 |
666 THEN tac ctxt cont |
668 THEN tac ctxt cont |
667 else |
669 else |
668 Subgoal.FOCUS (fn {prems, context, ...} => |
670 Subgoal.FOCUS (fn {prems, context = ctxt', ...} => |
669 CONVERSION |
671 CONVERSION |
670 (right_hand_set_comprehension_conv (K |
672 (right_hand_set_comprehension_conv (K |
671 (HOLogic.conj_conv |
673 (HOLogic.conj_conv |
672 ((HOLogic.eq_conv Conv.all_conv |
674 ((HOLogic.eq_conv Conv.all_conv |
673 (rewr_conv' (List.last prems))) then_conv |
675 (rewr_conv' (List.last prems))) then_conv |
674 (Conv.rewrs_conv (map (fn th => th RS @{thm Eq_FalseI}) distincts))) |
676 (Conv.rewrs_conv (map (fn th => th RS @{thm Eq_FalseI}) distincts))) |
675 Conv.all_conv then_conv |
677 Conv.all_conv then_conv |
676 (rewr_conv' @{lemma "(False \<and> P) = False" by simp}))) context then_conv |
678 (rewr_conv' @{lemma "(False \<and> P) = False" by simp}))) ctxt' then_conv |
677 HOLogic.Trueprop_conv |
679 HOLogic.Trueprop_conv |
678 (HOLogic.eq_conv Conv.all_conv |
680 (HOLogic.eq_conv Conv.all_conv |
679 (Collect_conv (fn (_, ctxt) => |
681 (Collect_conv (fn (_, ctxt'') => |
680 Conv.repeat_conv |
682 Conv.repeat_conv |
681 (Conv.bottom_conv |
683 (Conv.bottom_conv |
682 (K (rewr_conv' |
684 (K (rewr_conv' @{lemma "(\<exists>x. P) = P" by simp})) ctxt'')) ctxt'))) 1) ctxt 1 |
683 @{lemma "(\<exists>x. P) = P" by simp})) ctxt)) context))) 1) ctxt 1 |
|
684 THEN rtac set_Nil_I 1)) case_thms) |
685 THEN rtac set_Nil_I 1)) case_thms) |
685 end |
686 end |
686 |
687 |
687 in |
688 in |
688 |
689 |
729 val rhs = HOLogic.mk_Collect ("x", rT, inner_t) |
730 val rhs = HOLogic.mk_Collect ("x", rT, inner_t) |
730 val rewrite_rule_t = HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)) |
731 val rewrite_rule_t = HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs)) |
731 in |
732 in |
732 SOME |
733 SOME |
733 ((Goal.prove ctxt [] [] rewrite_rule_t |
734 ((Goal.prove ctxt [] [] rewrite_rule_t |
734 (fn {context, ...} => tac context (rev Tis))) RS @{thm eq_reflection}) |
735 (fn {context = ctxt', ...} => tac ctxt' (rev Tis))) RS @{thm eq_reflection}) |
735 end)) |
736 end)) |
736 in |
737 in |
737 make_inner_eqs [] [] [] (dest_set (Thm.term_of redex)) |
738 make_inner_eqs [] [] [] (dest_set (Thm.term_of redex)) |
738 end |
739 end |
739 |
740 |
740 end |
741 end |
741 |
742 |
742 end |
743 end |
743 *} |
744 *} |
744 |
745 |
745 simproc_setup list_to_set_comprehension ("set xs") = {* K List_to_Set_Comprehension.simproc *} |
746 simproc_setup list_to_set_comprehension ("set xs") = |
|
747 {* K List_to_Set_Comprehension.simproc *} |
746 |
748 |
747 code_datatype set coset |
749 code_datatype set coset |
748 |
|
749 hide_const (open) coset |
750 hide_const (open) coset |
750 |
751 |
751 |
752 |
752 subsubsection {* @{const Nil} and @{const Cons} *} |
753 subsubsection {* @{const Nil} and @{const Cons} *} |
753 |
754 |