equal
deleted
inserted
replaced
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 |