src/HOL/Tools/transfer.ML
changeset 46497 89ccf66aa73d
parent 45620 f2a587696afb
equal deleted inserted replaced
46496:b8920f3fd259 46497:89ccf66aa73d
   107   let
   107   let
   108     (* identify morphism function *)
   108     (* identify morphism function *)
   109     val ([a, D], ctxt2) = ctxt1
   109     val ([a, D], ctxt2) = ctxt1
   110       |> Variable.import true (map Drule.mk_term [raw_a, raw_D])
   110       |> Variable.import true (map Drule.mk_term [raw_a, raw_D])
   111       |>> map Drule.dest_term o snd;
   111       |>> map Drule.dest_term o snd;
   112     val transform = Thm.capply @{cterm "Trueprop"} o Thm.capply D;
   112     val transform = Thm.apply @{cterm "Trueprop"} o Thm.apply D;
   113     val T = Thm.typ_of (Thm.ctyp_of_term a);
   113     val T = Thm.typ_of (Thm.ctyp_of_term a);
   114     val (aT, bT) = (Term.range_type T, Term.domain_type T);
   114     val (aT, bT) = (Term.range_type T, Term.domain_type T);
   115     
   115     
   116     (* determine variables to transfer *)
   116     (* determine variables to transfer *)
   117     val ctxt3 = ctxt2
   117     val ctxt3 = ctxt2
   122     val vars = filter (fn ((v, _), T) => Type.could_unify (T, aT) andalso
   122     val vars = filter (fn ((v, _), T) => Type.could_unify (T, aT) andalso
   123       not (member (op =) leave v)) (Term.add_vars (Thm.prop_of thm) []);
   123       not (member (op =) leave v)) (Term.add_vars (Thm.prop_of thm) []);
   124     val c_vars = map (certify o Var) vars;
   124     val c_vars = map (certify o Var) vars;
   125     val (vs', ctxt4) = Variable.variant_fixes (map (fst o fst) vars) ctxt3;
   125     val (vs', ctxt4) = Variable.variant_fixes (map (fst o fst) vars) ctxt3;
   126     val c_vars' = map (certify o (fn v => Free (v, bT))) vs';
   126     val c_vars' = map (certify o (fn v => Free (v, bT))) vs';
   127     val c_exprs' = map (Thm.capply a) c_vars';
   127     val c_exprs' = map (Thm.apply a) c_vars';
   128 
   128 
   129     (* transfer *)
   129     (* transfer *)
   130     val (hyps, ctxt5) = ctxt4
   130     val (hyps, ctxt5) = ctxt4
   131       |> Assumption.add_assumes (map transform c_vars');
   131       |> Assumption.add_assumes (map transform c_vars');
   132     val simpset =
   132     val simpset =