294 (fn (_, (_, _, _, _, eq')) => eq = eq') eqns'' |
294 (fn (_, (_, _, _, _, eq')) => eq = eq') eqns'' |
295 in (i, find_index (fn (cname', _) => cname = cname') constrs, cargs) end; |
295 in (i, find_index (fn (cname', _) => cname = cname') constrs, cargs) end; |
296 |
296 |
297 val rec_rewritess = |
297 val rec_rewritess = |
298 unflat (map (fn (_, (_, _, constrs)) => constrs) descr) rec_rewrites; |
298 unflat (map (fn (_, (_, _, constrs)) => constrs) descr) rec_rewrites; |
299 val fvars = rec_rewrites |> hd |> concl_of |> HOLogic.dest_Trueprop |> |
299 val fvars = rec_rewrites |> hd |> Thm.concl_of |> HOLogic.dest_Trueprop |> |
300 HOLogic.dest_eq |> fst |> strip_comb |> snd |> take_prefix is_Var |> fst; |
300 HOLogic.dest_eq |> fst |> strip_comb |> snd |> take_prefix is_Var |> fst; |
301 val (pvars, ctxtvars) = List.partition |
301 val (pvars, ctxtvars) = List.partition |
302 (equal HOLogic.boolT o body_type o snd) |
302 (equal HOLogic.boolT o body_type o snd) |
303 (subtract (op =) |
303 (subtract (op =) |
304 (Term.add_vars (concl_of (hd rec_rewrites)) []) |
304 (Term.add_vars (Thm.concl_of (hd rec_rewrites)) []) |
305 (fold_rev (Term.add_vars o Logic.strip_assums_concl) |
305 (fold_rev (Term.add_vars o Logic.strip_assums_concl) |
306 (prems_of (hd rec_rewrites)) [])); |
306 (Thm.prems_of (hd rec_rewrites)) [])); |
307 val cfs = defs' |> hd |> snd |> strip_comb |> snd |> |
307 val cfs = defs' |> hd |> snd |> strip_comb |> snd |> |
308 curry (List.take o swap) (length fvars) |> map cert; |
308 curry (List.take o swap) (length fvars) |> map cert; |
309 val invs' = (case invs of |
309 val invs' = (case invs of |
310 NONE => map (fn (i, _) => |
310 NONE => map (fn (i, _) => |
311 Abs ("x", fastype_of (snd (nth defs' i)), @{term True})) descr |
311 Abs ("x", fastype_of (snd (nth defs' i)), @{term True})) descr |
318 | _ => []); |
318 | _ => []); |
319 val rec_rewrites' = map (fn eq => |
319 val rec_rewrites' = map (fn eq => |
320 let |
320 let |
321 val (i, j, cargs) = mk_idx eq |
321 val (i, j, cargs) = mk_idx eq |
322 val th = nth (nth rec_rewritess i) j; |
322 val th = nth (nth rec_rewritess i) j; |
323 val cargs' = th |> concl_of |> HOLogic.dest_Trueprop |> |
323 val cargs' = th |> Thm.concl_of |> HOLogic.dest_Trueprop |> |
324 HOLogic.dest_eq |> fst |> strip_comb |> snd |> List.last |> |
324 HOLogic.dest_eq |> fst |> strip_comb |> snd |> List.last |> |
325 strip_comb |> snd |
325 strip_comb |> snd |
326 in (cargs, Logic.strip_imp_prems eq, |
326 in (cargs, Logic.strip_imp_prems eq, |
327 Drule.cterm_instantiate (inst @ |
327 Drule.cterm_instantiate (inst @ |
328 (map cert cargs' ~~ map (cert o Free) cargs)) th) |
328 (map cert cargs' ~~ map (cert o Free) cargs)) th) |
329 end) eqns'; |
329 end) eqns'; |
330 |
330 |
331 val prems = foldr1 (common_prefix op aconv) (map (prems_of o #3) rec_rewrites'); |
331 val prems = foldr1 (common_prefix op aconv) (map (Thm.prems_of o #3) rec_rewrites'); |
332 val cprems = map cert prems; |
332 val cprems = map cert prems; |
333 val asms = map Thm.assume cprems; |
333 val asms = map Thm.assume cprems; |
334 val premss = map (fn (cargs, eprems, eqn) => |
334 val premss = map (fn (cargs, eprems, eqn) => |
335 map (fn t => fold_rev (Logic.all o Free) cargs (Logic.list_implies (eprems, t))) |
335 map (fn t => fold_rev (Logic.all o Free) cargs (Logic.list_implies (eprems, t))) |
336 (List.drop (prems_of eqn, length prems))) rec_rewrites'; |
336 (List.drop (Thm.prems_of eqn, length prems))) rec_rewrites'; |
337 val cpremss = map (map cert) premss; |
337 val cpremss = map (map cert) premss; |
338 val asmss = map (map Thm.assume) cpremss; |
338 val asmss = map (map Thm.assume) cpremss; |
339 |
339 |
340 fun mk_eqn ((cargs, eprems, eqn), asms') = |
340 fun mk_eqn ((cargs, eprems, eqn), asms') = |
341 let |
341 let |