253 fun elim_defs thy r defs prf = |
253 fun elim_defs thy r defs prf = |
254 let |
254 let |
255 val defs' = map (Logic.dest_equals o |
255 val defs' = map (Logic.dest_equals o |
256 map_types Type.strip_sorts o Thm.prop_of o Drule.abs_def) defs; |
256 map_types Type.strip_sorts o Thm.prop_of o Drule.abs_def) defs; |
257 val defnames = map Thm.derivation_name defs; |
257 val defnames = map Thm.derivation_name defs; |
258 val f = if not r then I else |
258 val prf' = |
259 let |
259 if r then |
260 val cnames = map (fst o dest_Const o fst) defs'; |
260 let |
261 val thms = Proofterm.fold_proof_atoms true |
261 val cnames = map (fst o dest_Const o fst) defs'; |
262 (fn PThm ({name, prop, ...}, _) => |
262 val thms = Proofterm.fold_proof_atoms true |
263 if member (op =) defnames name orelse |
263 (fn PThm ({name, prop, ...}, _) => |
264 not (exists_Const (member (op =) cnames o #1) prop) |
264 if member (op =) defnames name orelse |
265 then I |
265 not (exists_Const (member (op =) cnames o #1) prop) |
266 else cons (name, SOME prop) |
266 then I |
267 | _ => I) [prf] []; |
267 else cons (name, SOME prop) |
268 in Proofterm.expand_proof thy thms end; |
268 | _ => I) [prf] []; |
|
269 in Proofterm.expand_proof thy thms prf end |
|
270 else prf; |
269 in |
271 in |
270 rewrite_terms (Pattern.rewrite_term thy defs' []) |
272 rewrite_terms (Pattern.rewrite_term thy defs' []) |
271 (fst (insert_refl defnames [] (f prf))) |
273 (fst (insert_refl defnames [] prf')) |
272 end; |
274 end; |
273 |
275 |
274 |
276 |
275 (**** eliminate all variables that don't occur in the proposition ****) |
277 (**** eliminate all variables that don't occur in the proposition ****) |
276 |
278 |