src/Pure/Proof/extraction.ML
changeset 59058 a78612c67ec0
parent 58950 d07464875dd4
child 59582 0fbed69ff081
equal deleted inserted replaced
59057:5b649fb2f2e1 59058:a78612c67ec0
   101         get_first (fn (_, (prems, (tm1, tm2))) =>
   101         get_first (fn (_, (prems, (tm1, tm2))) =>
   102         let
   102         let
   103           fun ren t = the_default t (Term.rename_abs tm1 tm t);
   103           fun ren t = the_default t (Term.rename_abs tm1 tm t);
   104           val inc = Logic.incr_indexes ([], maxidx_of_term tm + 1);
   104           val inc = Logic.incr_indexes ([], maxidx_of_term tm + 1);
   105           val env as (Tenv, tenv) = Pattern.match thy (inc tm1, tm) (Vartab.empty, Vartab.empty);
   105           val env as (Tenv, tenv) = Pattern.match thy (inc tm1, tm) (Vartab.empty, Vartab.empty);
   106           val prems' = map (pairself (Envir.subst_term env o inc o ren)) prems;
   106           val prems' = map (apply2 (Envir.subst_term env o inc o ren)) prems;
   107           val env' = Envir.Envir
   107           val env' = Envir.Envir
   108             {maxidx = fold (fn (t, u) => Term.maxidx_term t #> Term.maxidx_term u) prems' ~1,
   108             {maxidx = fold (fn (t, u) => Term.maxidx_term t #> Term.maxidx_term u) prems' ~1,
   109              tenv = tenv, tyenv = Tenv};
   109              tenv = tenv, tyenv = Tenv};
   110           val env'' = fold (Pattern.unify (Context.Theory thy) o pairself (lookup rew)) prems' env';
   110           val env'' = fold (Pattern.unify (Context.Theory thy) o apply2 (lookup rew)) prems' env';
   111         in SOME (Envir.norm_term env'' (inc (ren tm2)))
   111         in SOME (Envir.norm_term env'' (inc (ren tm2)))
   112         end handle Pattern.MATCH => NONE | Pattern.Unif => NONE)
   112         end handle Pattern.MATCH => NONE | Pattern.Unif => NONE)
   113           (sort (int_ord o pairself fst)
   113           (sort (int_ord o apply2 fst)
   114             (Net.match_term rules (Envir.eta_contract tm)))
   114             (Net.match_term rules (Envir.eta_contract tm)))
   115       end;
   115       end;
   116 
   116 
   117   in rew end;
   117   in rew end;
   118 
   118 
   205       {realizes_eqns = realizes_eqns2, typeof_eqns = typeof_eqns2, types = types2,
   205       {realizes_eqns = realizes_eqns2, typeof_eqns = typeof_eqns2, types = types2,
   206        realizers = realizers2, defs = defs2, expand = expand2, prep = prep2}) : T =
   206        realizers = realizers2, defs = defs2, expand = expand2, prep = prep2}) : T =
   207     {realizes_eqns = merge_rules realizes_eqns1 realizes_eqns2,
   207     {realizes_eqns = merge_rules realizes_eqns1 realizes_eqns2,
   208      typeof_eqns = merge_rules typeof_eqns1 typeof_eqns2,
   208      typeof_eqns = merge_rules typeof_eqns1 typeof_eqns2,
   209      types = AList.merge (op =) (K true) (types1, types2),
   209      types = AList.merge (op =) (K true) (types1, types2),
   210      realizers = Symtab.merge_list (eq_set (op =) o pairself #1) (realizers1, realizers2),
   210      realizers = Symtab.merge_list (eq_set (op =) o apply2 #1) (realizers1, realizers2),
   211      defs = Library.merge Thm.eq_thm (defs1, defs2),
   211      defs = Library.merge Thm.eq_thm (defs1, defs2),
   212      expand = Library.merge (op =) (expand1, expand2),
   212      expand = Library.merge (op =) (expand1, expand2),
   213      prep = if is_some prep1 then prep1 else prep2};
   213      prep = if is_some prep1 then prep1 else prep2};
   214 );
   214 );
   215 
   215