427 (* mark equality constraints in cases rule *) |
427 (* mark equality constraints in cases rule *) |
428 |
428 |
429 val equal_def' = Thm.symmetric Induct_Args.equal_def; |
429 val equal_def' = Thm.symmetric Induct_Args.equal_def; |
430 |
430 |
431 fun mark_constraints n ctxt = Conv.fconv_rule |
431 fun mark_constraints n ctxt = Conv.fconv_rule |
432 (Conv.prems_conv (~1) (Conv.params_conv ~1 (K (Conv.prems_conv n |
432 (Conv.prems_conv ~1 (Conv.params_conv ~1 (K (Conv.prems_conv n |
433 (Raw_Simplifier.rewrite false [equal_def']))) ctxt)); |
433 (Raw_Simplifier.rewrite false [equal_def']))) ctxt)); |
434 |
434 |
435 val unmark_constraints = Conv.fconv_rule |
435 val unmark_constraints = Conv.fconv_rule |
436 (Raw_Simplifier.rewrite true [Induct_Args.equal_def]); |
436 (Raw_Simplifier.rewrite true [Induct_Args.equal_def]); |
437 |
437 |
761 |
761 |
762 fun rule_cases ctxt rule cases = |
762 fun rule_cases ctxt rule cases = |
763 let |
763 let |
764 val rule' = Rule_Cases.internalize_params rule; |
764 val rule' = Rule_Cases.internalize_params rule; |
765 val rule'' = (if simp then simplified_rule ctxt else I) rule'; |
765 val rule'' = (if simp then simplified_rule ctxt else I) rule'; |
766 val nonames = map (fn ((cn,_),cls) => ((cn,[]),cls)) |
766 val nonames = map (fn ((cn, _), cls) => ((cn, []), cls)); |
767 val cases' = |
767 val cases' = if Thm.eq_thm_prop (rule', rule'') then cases else nonames cases; |
768 if Thm.eq_thm_prop (rule', rule'') then cases else nonames cases |
768 in Rule_Cases.make_nested (Thm.prop_of rule'') (rulified_term rule'') cases' end; |
769 in Rule_Cases.make_nested (Thm.prop_of rule'') (rulified_term rule'') |
|
770 cases' |
|
771 end; |
|
772 in |
769 in |
773 (fn i => fn st => |
770 (fn i => fn st => |
774 ruleq |
771 ruleq |
775 |> Seq.maps (Rule_Cases.consume (flat defs) facts) |
772 |> Seq.maps (Rule_Cases.consume (flat defs) facts) |
776 |> Seq.maps (fn (((cases, concls), (more_consumes, more_facts)), rule) => |
773 |> Seq.maps (fn (((cases, concls), (more_consumes, more_facts)), rule) => |
777 (PRECISE_CONJUNCTS (length concls) (ALLGOALS (fn j => |
774 (PRECISE_CONJUNCTS (length concls) (ALLGOALS (fn j => |
778 (CONJUNCTS (ALLGOALS |
775 (CONJUNCTS (ALLGOALS |
779 let |
776 let |
780 val adefs = nth_list atomized_defs (j - 1); |
777 val adefs = nth_list atomized_defs (j - 1); |
781 val frees = fold (Term.add_frees o prop_of) adefs []; |
778 val frees = fold (Term.add_frees o Thm.prop_of) adefs []; |
782 val xs = nth_list arbitrary (j - 1); |
779 val xs = nth_list arbitrary (j - 1); |
783 val k = nth concls (j - 1) + more_consumes |
780 val k = nth concls (j - 1) + more_consumes |
784 in |
781 in |
785 Method.insert_tac (more_facts @ adefs) THEN' |
782 Method.insert_tac (more_facts @ adefs) THEN' |
786 (if simp then |
783 (if simp then |
787 rotate_tac k (length adefs) THEN' |
784 rotate_tac k (length adefs) THEN' |
788 fix_tac defs_ctxt k |
785 fix_tac defs_ctxt k (List.partition (member op = frees) xs |> op @) |
789 (List.partition (member op = frees) xs |> op @) |
|
790 else |
786 else |
791 fix_tac defs_ctxt k xs) |
787 fix_tac defs_ctxt k xs) |
792 end) |
788 end) |
793 THEN' inner_atomize_tac) j)) |
789 THEN' inner_atomize_tac) j)) |
794 THEN' atomize_tac) i st |> Seq.maps (fn st' => |
790 THEN' atomize_tac) i st |> Seq.maps (fn st' => |
795 guess_instance ctxt (internalize more_consumes rule) i st' |
791 guess_instance ctxt (internalize more_consumes rule) i st' |
796 |> Seq.map (rule_instance ctxt (burrow_options (Variable.polymorphic ctxt) taking)) |
792 |> Seq.map (rule_instance ctxt (burrow_options (Variable.polymorphic ctxt) taking)) |
797 |> Seq.maps (fn rule' => |
793 |> Seq.maps (fn rule' => |
798 CASES (rule_cases ctxt rule' cases) |
794 CASES (rule_cases ctxt rule' cases) |
799 (Tactic.rtac rule' i THEN |
795 (rtac rule' i THEN |
800 PRIMITIVE (singleton (Proof_Context.export defs_ctxt ctxt))) st')))) |
796 PRIMITIVE (singleton (Proof_Context.export defs_ctxt ctxt))) st')))) |
801 THEN_ALL_NEW_CASES |
797 THEN_ALL_NEW_CASES |
802 ((if simp then simplify_tac ctxt THEN' (TRY o trivial_tac) |
798 ((if simp then simplify_tac ctxt THEN' (TRY o trivial_tac) |
803 else K all_tac) |
799 else K all_tac) |
804 THEN_ALL_NEW rulify_tac) |
800 THEN_ALL_NEW rulify_tac) |
805 end; |
801 end; |
806 |
802 |
807 val induct_tac = gen_induct_tac (K I); |
803 val induct_tac = gen_induct_tac (K I); |
|
804 |
|
805 |
808 |
806 |
809 (** coinduct method **) |
807 (** coinduct method **) |
810 |
808 |
811 (* |
809 (* |
812 rule selection scheme: |
810 rule selection scheme: |