src/Provers/induct_method.ML
changeset 12799 5472afdd3bd3
parent 12305 3c3f98b3d9e7
child 12852 c6a8e310aec5
equal deleted inserted replaced
12798:f7e2d0d32ea7 12799:5472afdd3bd3
    46   let
    46   let
    47     fun prep_var (x, Some t) =
    47     fun prep_var (x, Some t) =
    48           let
    48           let
    49             val cx = cert x;
    49             val cx = cert x;
    50             val {T = xT, sign, ...} = Thm.rep_cterm cx;
    50             val {T = xT, sign, ...} = Thm.rep_cterm cx;
    51             val orig_ct = cert t;
    51             val ct = cert (tune t);
    52             val ct = tune orig_ct;
       
    53           in
    52           in
    54             if Sign.typ_instance sign (#T (Thm.rep_cterm ct), xT) then Some (cx, ct)
    53             if Sign.typ_instance sign (#T (Thm.rep_cterm ct), xT) then Some (cx, ct)
    55             else raise ERROR_MESSAGE (Pretty.string_of (Pretty.block
    54             else raise ERROR_MESSAGE (Pretty.string_of (Pretty.block
    56              [Pretty.str "Ill-typed instantiation:", Pretty.fbrk,
    55              [Pretty.str "Ill-typed instantiation:", Pretty.fbrk,
    57               Display.pretty_cterm ct, Pretty.str " ::", Pretty.brk 1,
    56               Display.pretty_cterm ct, Pretty.str " ::", Pretty.brk 1,
    79 local
    78 local
    80 
    79 
    81 fun resolveq_cases_tac make ruleq i st =
    80 fun resolveq_cases_tac make ruleq i st =
    82   ruleq |> Seq.map (fn (rule, (cases, facts)) =>
    81   ruleq |> Seq.map (fn (rule, (cases, facts)) =>
    83     (Method.insert_tac facts THEN' Tactic.rtac rule) i st
    82     (Method.insert_tac facts THEN' Tactic.rtac rule) i st
    84     |> Seq.map (rpair (make rule cases)))
    83     |> Seq.map (rpair (make (Thm.sign_of_thm rule, Thm.prop_of rule) cases)))
    85   |> Seq.flat;
    84   |> Seq.flat;
    86 
    85 
    87 fun find_casesT ctxt ((Some t :: _) :: _) = InductAttrib.find_casesT ctxt (fastype_of t)
    86 fun find_casesT ctxt ((Some t :: _) :: _) = InductAttrib.find_casesT ctxt (fastype_of t)
    88   | find_casesT _ _ = [];
    87   | find_casesT _ _ = [];
    89 
    88 
   136 local
   135 local
   137 
   136 
   138 
   137 
   139 (* atomize and rulify *)
   138 (* atomize and rulify *)
   140 
   139 
   141 fun atomize_cterm ct =
   140 fun atomize_term sg =
   142   Thm.cterm_fun (ObjectLogic.drop_judgment (#sign (Thm.rep_cterm ct)))
   141   ObjectLogic.drop_judgment sg o MetaSimplifier.rewrite_term sg Data.atomize;
   143     (Tactic.rewrite_cterm true Data.atomize ct);
   142 
       
   143 fun rulified_term thm =
       
   144   let val sg = Thm.sign_of_thm thm in
       
   145     Thm.prop_of thm
       
   146     |> MetaSimplifier.rewrite_term sg Data.rulify1
       
   147     |> MetaSimplifier.rewrite_term sg Data.rulify2
       
   148     |> pair sg
       
   149   end;
   144 
   150 
   145 val atomize_tac = Tactic.rewrite_goal_tac Data.atomize;
   151 val atomize_tac = Tactic.rewrite_goal_tac Data.atomize;
   146 val rulify = Tactic.simplify true Data.rulify2 o Tactic.simplify true Data.rulify1;
       
   147 
   152 
   148 val rulify_tac =
   153 val rulify_tac =
   149   Tactic.rewrite_goal_tac Data.rulify1 THEN'
   154   Tactic.rewrite_goal_tac Data.rulify1 THEN'
   150   Tactic.rewrite_goal_tac Data.rulify2 THEN'
   155   Tactic.rewrite_goal_tac Data.rulify2 THEN'
   151   Tactic.norm_hhf_tac;
   156   Tactic.norm_hhf_tac;
   152 
   157 
   153 val localize = Tactic.norm_hhf o Tactic.simplify false Data.localize;
   158 val localize = Tactic.norm_hhf_rule o Tactic.simplify false Data.localize;
   154 
   159 
   155 
   160 
   156 (* imp_intr --- limited to atomic prems *)
   161 (* imp_intr --- limited to atomic prems *)
   157 
   162 
   158 fun imp_intr i raw_th =
   163 fun imp_intr i raw_th =
   224 
   229 
   225 fun resolveq_cases_tac' make ruleq i st =
   230 fun resolveq_cases_tac' make ruleq i st =
   226   ruleq |> Seq.map (fn (rule, (cases, k, more_facts)) => st
   231   ruleq |> Seq.map (fn (rule, (cases, k, more_facts)) => st
   227     |> (Method.insert_tac more_facts THEN' atomize_tac) i
   232     |> (Method.insert_tac more_facts THEN' atomize_tac) i
   228     |> Seq.map (fn st' => divinate_inst (internalize k rule) i st' |> Seq.map (fn rule' =>
   233     |> Seq.map (fn st' => divinate_inst (internalize k rule) i st' |> Seq.map (fn rule' =>
   229           st' |> Tactic.rtac rule' i |> Seq.map (rpair (make (rulify rule') cases))) |> Seq.flat)
   234           st' |> Tactic.rtac rule' i
       
   235           |> Seq.map (rpair (make (rulified_term rule') cases)))
       
   236       |> Seq.flat)
   230     |> Seq.flat)
   237     |> Seq.flat)
   231   |> Seq.flat;
   238   |> Seq.flat;
   232 
   239 
   233 infix 1 THEN_ALL_NEW_CASES;
   240 infix 1 THEN_ALL_NEW_CASES;
   234 
   241 
   261 
   268 
   262     val inst_rule = apfst (fn r =>
   269     val inst_rule = apfst (fn r =>
   263       if null insts then r
   270       if null insts then r
   264       else (align_right "Rule has fewer conclusions than arguments given"
   271       else (align_right "Rule has fewer conclusions than arguments given"
   265           (Data.dest_concls (Thm.concl_of r)) insts
   272           (Data.dest_concls (Thm.concl_of r)) insts
   266         |> (flat o map (prep_inst align_right cert atomize_cterm))
   273         |> (flat o map (prep_inst align_right cert (atomize_term sg)))
   267         |> Drule.cterm_instantiate) r);
   274         |> Drule.cterm_instantiate) r);
   268 
   275 
   269     val ruleq =
   276     val ruleq =
   270       (case opt_rule of
   277       (case opt_rule of
   271         None =>
   278         None =>