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