src/HOL/Tools/coinduction.ML
changeset 58839 ccda99401bc8
parent 58814 4c0ad4162cb7
child 59058 a78612c67ec0
equal deleted inserted replaced
58838:59203adfc33f 58839:ccda99401bc8
    35 
    35 
    36 fun DELETE_PREMS_AFTER skip tac i st =
    36 fun DELETE_PREMS_AFTER skip tac i st =
    37   let
    37   let
    38     val n = nth (prems_of st) (i - 1) |> Logic.strip_assums_hyp |> length;
    38     val n = nth (prems_of st) (i - 1) |> Logic.strip_assums_hyp |> length;
    39   in
    39   in
    40     (THEN_ALL_NEW_SKIP skip tac (REPEAT_DETERM_N n o etac thin_rl)) i st
    40     (THEN_ALL_NEW_SKIP skip tac (REPEAT_DETERM_N n o eresolve_tac [thin_rl])) i st
    41   end;
    41   end;
    42 
    42 
    43 fun coinduction_tac ctxt raw_vars opt_raw_thm prems = HEADGOAL (SUBGOAL_CASES (fn (goal, _, _) =>
    43 fun coinduction_tac ctxt raw_vars opt_raw_thm prems = HEADGOAL (SUBGOAL_CASES (fn (goal, _, _) =>
    44   let
    44   let
    45     val lhs_of_eq = HOLogic.dest_Trueprop #> HOLogic.dest_eq #> fst;
    45     val lhs_of_eq = HOLogic.dest_Trueprop #> HOLogic.dest_eq #> fst;
    85             |> certify ctxt;
    85             |> certify ctxt;
    86           val thm = cterm_instantiate_pos [SOME phi] raw_thm;
    86           val thm = cterm_instantiate_pos [SOME phi] raw_thm;
    87           val e = length eqs;
    87           val e = length eqs;
    88           val p = length prems;
    88           val p = length prems;
    89         in
    89         in
    90           HEADGOAL (EVERY' [rtac thm,
    90           HEADGOAL (EVERY' [resolve_tac [thm],
    91             EVERY' (map (fn var =>
    91             EVERY' (map (fn var =>
    92               rtac (cterm_instantiate_pos [NONE, SOME (certify ctxt var)] exI)) vars),
    92               resolve_tac [cterm_instantiate_pos [NONE, SOME (certify ctxt var)] exI]) vars),
    93             if p = 0 then CONJ_WRAP' (K (rtac refl)) eqs
    93             if p = 0 then CONJ_WRAP' (K (resolve_tac [refl])) eqs
    94             else REPEAT_DETERM_N e o (rtac conjI THEN' rtac refl) THEN' CONJ_WRAP' rtac prems,
    94             else
       
    95               REPEAT_DETERM_N e o (resolve_tac [conjI] THEN' resolve_tac [refl]) THEN'
       
    96               CONJ_WRAP' (resolve_tac o single) prems,
    95             K (ALLGOALS_SKIP skip
    97             K (ALLGOALS_SKIP skip
    96                (REPEAT_DETERM_N (length vars) o (etac exE THEN' rotate_tac ~1) THEN'
    98                (REPEAT_DETERM_N (length vars) o (eresolve_tac [exE] THEN' rotate_tac ~1) THEN'
    97                DELETE_PREMS_AFTER 0 (Subgoal.FOCUS (fn {prems, params, context = ctxt, ...} =>
    99                DELETE_PREMS_AFTER 0 (Subgoal.FOCUS (fn {prems, params, context = ctxt, ...} =>
    98                  (case prems of
   100                  (case prems of
    99                    [] => all_tac
   101                    [] => all_tac
   100                  | inv::case_prems =>
   102                  | inv::case_prems =>
   101                      let
   103                      let