src/Tools/induct.ML
changeset 59586 ddf6deaadfe8
parent 59582 0fbed69ff081
child 59621 291934bac95e
equal deleted inserted replaced
59585:68a770a8a09f 59586:ddf6deaadfe8
   396   let
   396   let
   397     val cert = Thm.cterm_of (Proof_Context.theory_of ctxt);
   397     val cert = Thm.cterm_of (Proof_Context.theory_of ctxt);
   398     fun prep_var (x, SOME t) =
   398     fun prep_var (x, SOME t) =
   399           let
   399           let
   400             val cx = cert x;
   400             val cx = cert x;
   401             val xT = #T (Thm.rep_cterm cx);
   401             val xT = Thm.typ_of_cterm cx;
   402             val ct = cert (tune t);
   402             val ct = cert (tune t);
   403             val tT = #T (Thm.rep_cterm ct);
   403             val tT = Thm.typ_of_cterm ct;
   404           in
   404           in
   405             if Type.could_unify (tT, xT) then SOME (cx, ct)
   405             if Type.could_unify (tT, xT) then SOME (cx, ct)
   406             else error (Pretty.string_of (Pretty.block
   406             else error (Pretty.string_of (Pretty.block
   407              [Pretty.str "Ill-typed instantiation:", Pretty.fbrk,
   407              [Pretty.str "Ill-typed instantiation:", Pretty.fbrk,
   408               Syntax.pretty_term ctxt (Thm.term_of ct), Pretty.str " ::", Pretty.brk 1,
   408               Syntax.pretty_term ctxt (Thm.term_of ct), Pretty.str " ::", Pretty.brk 1,
   574     val cert = Thm.cterm_of thy;
   574     val cert = Thm.cterm_of thy;
   575     val certT = Thm.ctyp_of thy;
   575     val certT = Thm.ctyp_of thy;
   576     val pairs = Vartab.dest (Envir.term_env env);
   576     val pairs = Vartab.dest (Envir.term_env env);
   577     val types = Vartab.dest (Envir.type_env env);
   577     val types = Vartab.dest (Envir.type_env env);
   578     val ts = map (cert o Envir.norm_term env o #2 o #2) pairs;
   578     val ts = map (cert o Envir.norm_term env o #2 o #2) pairs;
   579     val xs = map2 (curry (cert o Var)) (map #1 pairs) (map (#T o Thm.rep_cterm) ts);
   579     val xs = map2 (curry (cert o Var)) (map #1 pairs) (map Thm.typ_of_cterm ts);
   580   in (map (fn (xi, (S, T)) => (certT (TVar (xi, S)), certT T)) types, xs ~~ ts) end;
   580   in (map (fn (xi, (S, T)) => (certT (TVar (xi, S)), certT T)) types, xs ~~ ts) end;
   581 
   581 
   582 in
   582 in
   583 
   583 
   584 fun guess_instance ctxt rule i st =
   584 fun guess_instance ctxt rule i st =