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 |