512 fun Collect_conv cv ctxt ct = |
512 fun Collect_conv cv ctxt ct = |
513 (case Thm.term_of ct of |
513 (case Thm.term_of ct of |
514 Const (@{const_name Set.Collect}, _) $ Abs _ => Conv.arg_conv (Conv.abs_conv cv ctxt) ct |
514 Const (@{const_name Set.Collect}, _) $ Abs _ => Conv.arg_conv (Conv.abs_conv cv ctxt) ct |
515 | _ => raise CTERM ("Collect_conv", [ct])) |
515 | _ => raise CTERM ("Collect_conv", [ct])) |
516 |
516 |
517 fun eq_conv cv1 cv2 ct = |
|
518 (case Thm.term_of ct of |
|
519 Const (@{const_name HOL.eq}, _) $ _ $ _ => Conv.combination_conv (Conv.arg_conv cv1) cv2 ct |
|
520 | _ => raise CTERM ("eq_conv", [ct])) |
|
521 |
|
522 fun conj_conv cv1 cv2 ct = |
|
523 (case Thm.term_of ct of |
|
524 Const (@{const_name HOL.conj}, _) $ _ $ _ => Conv.combination_conv (Conv.arg_conv cv1) cv2 ct |
|
525 | _ => raise CTERM ("conj_conv", [ct])) |
|
526 |
|
527 fun rewr_conv' th = Conv.rewr_conv (mk_meta_eq th) |
517 fun rewr_conv' th = Conv.rewr_conv (mk_meta_eq th) |
528 |
518 |
529 fun conjunct_assoc_conv ct = |
519 fun conjunct_assoc_conv ct = |
530 Conv.try_conv |
520 Conv.try_conv |
531 (rewr_conv' @{thm conj_assoc} then_conv conj_conv Conv.all_conv conjunct_assoc_conv) ct |
521 (rewr_conv' @{thm conj_assoc} then_conv HOLogic.conj_conv Conv.all_conv conjunct_assoc_conv) ct |
532 |
522 |
533 fun right_hand_set_comprehension_conv conv ctxt = |
523 fun right_hand_set_comprehension_conv conv ctxt = |
534 HOLogic.Trueprop_conv (eq_conv Conv.all_conv |
524 HOLogic.Trueprop_conv (HOLogic.eq_conv Conv.all_conv |
535 (Collect_conv (all_exists_conv conv o #2) ctxt)) |
525 (Collect_conv (all_exists_conv conv o #2) ctxt)) |
536 |
526 |
537 |
527 |
538 (* term abstraction of list comprehension patterns *) |
528 (* term abstraction of list comprehension patterns *) |
539 |
529 |
591 Splitter.split_tac [@{thm split_if}] 1 |
581 Splitter.split_tac [@{thm split_if}] 1 |
592 THEN rtac @{thm conjI} 1 |
582 THEN rtac @{thm conjI} 1 |
593 THEN rtac @{thm impI} 1 |
583 THEN rtac @{thm impI} 1 |
594 THEN Subgoal.FOCUS (fn {prems, context, ...} => |
584 THEN Subgoal.FOCUS (fn {prems, context, ...} => |
595 CONVERSION (right_hand_set_comprehension_conv (K |
585 CONVERSION (right_hand_set_comprehension_conv (K |
596 (conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_TrueI})) Conv.all_conv |
586 (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_TrueI})) Conv.all_conv |
597 then_conv |
587 then_conv |
598 rewr_conv' @{lemma "(True & P) = P" by simp})) context) 1) ctxt 1 |
588 rewr_conv' @{lemma "(True & P) = P" by simp})) context) 1) ctxt 1 |
599 THEN tac ctxt cont |
589 THEN tac ctxt cont |
600 THEN rtac @{thm impI} 1 |
590 THEN rtac @{thm impI} 1 |
601 THEN Subgoal.FOCUS (fn {prems, context, ...} => |
591 THEN Subgoal.FOCUS (fn {prems, context, ...} => |
602 CONVERSION (right_hand_set_comprehension_conv (K |
592 CONVERSION (right_hand_set_comprehension_conv (K |
603 (conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_FalseI})) Conv.all_conv |
593 (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_FalseI})) Conv.all_conv |
604 then_conv rewr_conv' @{lemma "(False & P) = False" by simp})) context) 1) ctxt 1 |
594 then_conv rewr_conv' @{lemma "(False & P) = False" by simp})) context) 1) ctxt 1 |
605 THEN rtac set_Nil_I 1 |
595 THEN rtac set_Nil_I 1 |
606 | tac ctxt (Case (T, i) :: cont) = |
596 | tac ctxt (Case (T, i) :: cont) = |
607 let |
597 let |
608 val info = Datatype.the_info thy (fst (dest_Type T)) |
598 val info = Datatype.the_info thy (fst (dest_Type T)) |
615 THEN rtac @{thm impI} 1 |
605 THEN rtac @{thm impI} 1 |
616 THEN (if i' = i then |
606 THEN (if i' = i then |
617 (* continue recursively *) |
607 (* continue recursively *) |
618 Subgoal.FOCUS (fn {prems, context, ...} => |
608 Subgoal.FOCUS (fn {prems, context, ...} => |
619 CONVERSION (Thm.eta_conversion then_conv right_hand_set_comprehension_conv (K |
609 CONVERSION (Thm.eta_conversion then_conv right_hand_set_comprehension_conv (K |
620 ((conj_conv |
610 ((HOLogic.conj_conv |
621 (eq_conv Conv.all_conv (rewr_conv' (List.last prems)) then_conv |
611 (HOLogic.eq_conv Conv.all_conv (rewr_conv' (List.last prems)) then_conv |
622 (Conv.try_conv (Conv.rewrs_conv (map mk_meta_eq (#inject info))))) |
612 (Conv.try_conv (Conv.rewrs_conv (map mk_meta_eq (#inject info))))) |
623 Conv.all_conv) |
613 Conv.all_conv) |
624 then_conv (Conv.try_conv (Conv.rewr_conv del_refl_eq)) |
614 then_conv (Conv.try_conv (Conv.rewr_conv del_refl_eq)) |
625 then_conv conjunct_assoc_conv)) context |
615 then_conv conjunct_assoc_conv)) context |
626 then_conv (HOLogic.Trueprop_conv (eq_conv Conv.all_conv (Collect_conv (fn (_, ctxt) => |
616 then_conv (HOLogic.Trueprop_conv (HOLogic.eq_conv Conv.all_conv (Collect_conv (fn (_, ctxt) => |
627 Conv.repeat_conv |
617 Conv.repeat_conv |
628 (all_but_last_exists_conv |
618 (all_but_last_exists_conv |
629 (K (rewr_conv' |
619 (K (rewr_conv' |
630 @{lemma "(EX x. x = t & P x) = P t" by simp})) ctxt)) context)))) 1) ctxt 1 |
620 @{lemma "(EX x. x = t & P x) = P t" by simp})) ctxt)) context)))) 1) ctxt 1 |
631 THEN tac ctxt cont |
621 THEN tac ctxt cont |
632 else |
622 else |
633 Subgoal.FOCUS (fn {prems, context, ...} => |
623 Subgoal.FOCUS (fn {prems, context, ...} => |
634 CONVERSION |
624 CONVERSION |
635 (right_hand_set_comprehension_conv (K |
625 (right_hand_set_comprehension_conv (K |
636 (conj_conv |
626 (HOLogic.conj_conv |
637 ((eq_conv Conv.all_conv |
627 ((HOLogic.eq_conv Conv.all_conv |
638 (rewr_conv' (List.last prems))) then_conv |
628 (rewr_conv' (List.last prems))) then_conv |
639 (Conv.rewrs_conv (map (fn th => th RS @{thm Eq_FalseI}) (#distinct info)))) |
629 (Conv.rewrs_conv (map (fn th => th RS @{thm Eq_FalseI}) (#distinct info)))) |
640 Conv.all_conv then_conv |
630 Conv.all_conv then_conv |
641 (rewr_conv' @{lemma "(False & P) = False" by simp}))) context then_conv |
631 (rewr_conv' @{lemma "(False & P) = False" by simp}))) context then_conv |
642 HOLogic.Trueprop_conv |
632 HOLogic.Trueprop_conv |
643 (eq_conv Conv.all_conv |
633 (HOLogic.eq_conv Conv.all_conv |
644 (Collect_conv (fn (_, ctxt) => |
634 (Collect_conv (fn (_, ctxt) => |
645 Conv.repeat_conv |
635 Conv.repeat_conv |
646 (Conv.bottom_conv |
636 (Conv.bottom_conv |
647 (K (rewr_conv' |
637 (K (rewr_conv' |
648 @{lemma "(EX x. P) = P" by simp})) ctxt)) context))) 1) ctxt 1 |
638 @{lemma "(EX x. P) = P" by simp})) ctxt)) context))) 1) ctxt 1 |