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