110 (*** instantiation of adm_subst theorem (a bit tricky) ***) |
110 (*** instantiation of adm_subst theorem (a bit tricky) ***) |
111 |
111 |
112 fun inst_adm_subst_thm state i params s T subt t paths = |
112 fun inst_adm_subst_thm state i params s T subt t paths = |
113 let val {sign, maxidx, ...} = rep_thm state; |
113 let val {sign, maxidx, ...} = rep_thm state; |
114 val j = maxidx+1; |
114 val j = maxidx+1; |
115 val tsig = Sign.tsig_of sign; |
|
116 val parTs = map snd (rev params); |
115 val parTs = map snd (rev params); |
117 val rule = lift_rule (state, i) adm_subst; |
116 val rule = lift_rule (state, i) adm_subst; |
118 val types = valOf o (fst (types_sorts rule)); |
117 val types = valOf o (fst (types_sorts rule)); |
119 val tT = types ("t", j); |
118 val tT = types ("t", j); |
120 val PT = types ("P", j); |
119 val PT = types ("P", j); |
121 fun mk_abs [] t = t |
120 fun mk_abs [] t = t |
122 | mk_abs ((a,T)::Ts) t = Abs (a, T, mk_abs Ts t); |
121 | mk_abs ((a,T)::Ts) t = Abs (a, T, mk_abs Ts t); |
123 val tt = cterm_of sign (mk_abs (params @ [(s, T)]) subt); |
122 val tt = cterm_of sign (mk_abs (params @ [(s, T)]) subt); |
124 val Pt = cterm_of sign (mk_abs (params @ [(s, fastype_of1 (T::parTs, subt))]) |
123 val Pt = cterm_of sign (mk_abs (params @ [(s, fastype_of1 (T::parTs, subt))]) |
125 (make_term t [] paths 0)); |
124 (make_term t [] paths 0)); |
126 val tye = Type.typ_match tsig (Vartab.empty, (tT, #T (rep_cterm tt))); |
125 val tye = Sign.typ_match sign (tT, #T (rep_cterm tt)) Vartab.empty; |
127 val tye' = Type.typ_match tsig (tye, (PT, #T (rep_cterm Pt))); |
126 val tye' = Sign.typ_match sign (PT, #T (rep_cterm Pt)) tye; |
128 val ctye = map (fn (ixn, (S, T)) => |
127 val ctye = map (fn (ixn, (S, T)) => |
129 (ctyp_of sign (TVar (ixn, S)), ctyp_of sign T)) (Vartab.dest tye'); |
128 (ctyp_of sign (TVar (ixn, S)), ctyp_of sign T)) (Vartab.dest tye'); |
130 val tv = cterm_of sign (Var (("t", j), Envir.typ_subst_TVars tye' tT)); |
129 val tv = cterm_of sign (Var (("t", j), Envir.typ_subst_TVars tye' tT)); |
131 val Pv = cterm_of sign (Var (("P", j), Envir.typ_subst_TVars tye' PT)); |
130 val Pv = cterm_of sign (Var (("P", j), Envir.typ_subst_TVars tye' PT)); |
132 val rule' = instantiate (ctye, [(tv, tt), (Pv, Pt)]) rule |
131 val rule' = instantiate (ctye, [(tv, tt), (Pv, Pt)]) rule |