468 fun prf_subst_bounds args prf = |
468 fun prf_subst_bounds args prf = |
469 let |
469 let |
470 val n = length args; |
470 val n = length args; |
471 fun subst' lev (Bound i) = |
471 fun subst' lev (Bound i) = |
472 (if i<lev then raise SAME (*var is locally bound*) |
472 (if i<lev then raise SAME (*var is locally bound*) |
473 else incr_boundvars lev (List.nth (args, i-lev)) |
473 else incr_boundvars lev (nth args (i-lev)) |
474 handle Subscript => Bound (i-n) (*loose: change it*)) |
474 handle Subscript => Bound (i-n)) (*loose: change it*) |
475 | subst' lev (Abs (a, T, body)) = Abs (a, T, subst' (lev+1) body) |
475 | subst' lev (Abs (a, T, body)) = Abs (a, T, subst' (lev+1) body) |
476 | subst' lev (f $ t) = (subst' lev f $ substh' lev t |
476 | subst' lev (f $ t) = (subst' lev f $ substh' lev t |
477 handle SAME => f $ subst' lev t) |
477 handle SAME => f $ subst' lev t) |
478 | subst' _ _ = raise SAME |
478 | subst' _ _ = raise SAME |
479 and substh' lev t = (subst' lev t handle SAME => t); |
479 and substh' lev t = (subst' lev t handle SAME => t); |
492 fun prf_subst_pbounds args prf = |
492 fun prf_subst_pbounds args prf = |
493 let |
493 let |
494 val n = length args; |
494 val n = length args; |
495 fun subst (PBound i) Plev tlev = |
495 fun subst (PBound i) Plev tlev = |
496 (if i < Plev then raise SAME (*var is locally bound*) |
496 (if i < Plev then raise SAME (*var is locally bound*) |
497 else incr_pboundvars Plev tlev (List.nth (args, i-Plev)) |
497 else incr_pboundvars Plev tlev (nth args (i-Plev)) |
498 handle Subscript => PBound (i-n) (*loose: change it*)) |
498 handle Subscript => PBound (i-n) (*loose: change it*)) |
499 | subst (AbsP (a, t, body)) Plev tlev = AbsP (a, t, subst body (Plev+1) tlev) |
499 | subst (AbsP (a, t, body)) Plev tlev = AbsP (a, t, subst body (Plev+1) tlev) |
500 | subst (Abst (a, T, body)) Plev tlev = Abst (a, T, subst body Plev (tlev+1)) |
500 | subst (Abst (a, T, body)) Plev tlev = Abst (a, T, subst body Plev (tlev+1)) |
501 | subst (prf %% prf') Plev tlev = (subst prf Plev tlev %% substh prf' Plev tlev |
501 | subst (prf %% prf') Plev tlev = (subst prf Plev tlev %% substh prf' Plev tlev |
502 handle SAME => prf %% subst prf' Plev tlev) |
502 handle SAME => prf %% subst prf' Plev tlev) |
933 | shrink' ls lev ts prfs (prf as prf1 % t) = |
933 | shrink' ls lev ts prfs (prf as prf1 % t) = |
934 let val (is, ch, (ch', t')::ts', prf') = shrink' ls lev (t::ts) prfs prf1 |
934 let val (is, ch, (ch', t')::ts', prf') = shrink' ls lev (t::ts) prfs prf1 |
935 in (is, ch orelse ch', ts', |
935 in (is, ch orelse ch', ts', |
936 if ch orelse ch' then prf' % t' else prf) end |
936 if ch orelse ch' then prf' % t' else prf) end |
937 | shrink' ls lev ts prfs (prf as PBound i) = |
937 | shrink' ls lev ts prfs (prf as PBound i) = |
938 (if exists (fn SOME (Bound j) => lev-j <= List.nth (ls, i) | _ => true) ts |
938 (if exists (fn SOME (Bound j) => lev-j <= nth ls i | _ => true) ts |
939 orelse has_duplicates (op =) |
939 orelse has_duplicates (op =) |
940 (Library.foldl (fn (js, SOME (Bound j)) => j :: js | (js, _) => js) ([], ts)) |
940 (Library.foldl (fn (js, SOME (Bound j)) => j :: js | (js, _) => js) ([], ts)) |
941 orelse exists #1 prfs then [i] else [], false, map (pair false) ts, prf) |
941 orelse exists #1 prfs then [i] else [], false, map (pair false) ts, prf) |
942 | shrink' ls lev ts prfs (Hyp t) = ([], false, map (pair false) ts, Hyp t) |
942 | shrink' ls lev ts prfs (Hyp t) = ([], false, map (pair false) ts, Hyp t) |
943 | shrink' ls lev ts prfs MinProof = ([], false, map (pair false) ts, MinProof) |
943 | shrink' ls lev ts prfs MinProof = ([], false, map (pair false) ts, MinProof) |