src/HOL/Nominal/nominal_primrec.ML
changeset 59582 0fbed69ff081
parent 59580 cbc38731d42f
child 59621 291934bac95e
equal deleted inserted replaced
59580:cbc38731d42f 59582:0fbed69ff081
   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