src/Tools/induct.ML
changeset 45130 563caf031b50
parent 45014 0e847655b2d8
child 45131 d7e4a7ab1061
equal deleted inserted replaced
45129:1fce03e3e8ad 45130:563caf031b50
   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 
   505         let val rule' =
   505         let val rule' =
   506           (if simp then simplified_rule' ctxt #> unmark_constraints else I) rule
   506           (if simp then simplified_rule' ctxt #> unmark_constraints else I) rule
   507         in
   507         in
   508           CASES (Rule_Cases.make_common (thy,
   508           CASES (Rule_Cases.make_common (thy,
   509               Thm.prop_of (Rule_Cases.internalize_params rule')) cases)
   509               Thm.prop_of (Rule_Cases.internalize_params rule')) cases)
   510             ((Method.insert_tac more_facts THEN' Tactic.rtac rule' THEN_ALL_NEW
   510             ((Method.insert_tac more_facts THEN' rtac rule' THEN_ALL_NEW
   511                 (if simp then TRY o trivial_tac else K all_tac)) i) st
   511                 (if simp then TRY o trivial_tac else K all_tac)) i) st
   512         end)
   512         end)
   513   end;
   513   end;
   514 
   514 
   515 end;
   515 end;
   729   |> filter_out (forall Rule_Cases.is_inner_rule);
   729   |> filter_out (forall Rule_Cases.is_inner_rule);
   730 
   730 
   731 fun get_inductP ctxt (fact :: _) = map single (find_inductP ctxt (Thm.concl_of fact))
   731 fun get_inductP ctxt (fact :: _) = map single (find_inductP ctxt (Thm.concl_of fact))
   732   | get_inductP _ _ = [];
   732   | get_inductP _ _ = [];
   733 
   733 
   734 type case_data = (((string * string list) * string list) list * int)
   734 type case_data = (((string * string list) * string list) list * int);
   735 
   735 
   736 fun gen_induct_tac mod_cases ctxt simp def_insts arbitrary taking opt_rule facts =
   736 fun gen_induct_tac mod_cases ctxt simp def_insts arbitrary taking opt_rule facts =
   737   let
   737   let
   738     val thy = Proof_Context.theory_of ctxt;
   738     val thy = Proof_Context.theory_of ctxt;
   739 
   739 
   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:
   851         guess_instance ctxt rule i st
   849         guess_instance ctxt rule i st
   852         |> Seq.map (rule_instance ctxt (burrow_options (Variable.polymorphic ctxt) taking))
   850         |> Seq.map (rule_instance ctxt (burrow_options (Variable.polymorphic ctxt) taking))
   853         |> Seq.maps (fn rule' =>
   851         |> Seq.maps (fn rule' =>
   854           CASES (Rule_Cases.make_common (thy,
   852           CASES (Rule_Cases.make_common (thy,
   855               Thm.prop_of (Rule_Cases.internalize_params rule')) cases)
   853               Thm.prop_of (Rule_Cases.internalize_params rule')) cases)
   856             (Method.insert_tac more_facts i THEN Tactic.rtac rule' i) st)))
   854             (Method.insert_tac more_facts i THEN rtac rule' i) st)))
   857   end;
   855   end;
   858 
   856 
   859 end;
   857 end;
   860 
   858 
   861 
   859