src/HOLCF/adm_tac.ML
changeset 16935 4d7f19d340e8
parent 16842 5979c46853d1
child 17956 369e2af8ee45
equal deleted inserted replaced
16934:9ef19e3c7fdd 16935:4d7f19d340e8
   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