src/Pure/proofterm.ML
changeset 30146 a77fc0209723
parent 29642 be22ba214475
child 30711 952fdbee1b48
equal deleted inserted replaced
30145:09817540ccae 30146:a77fc0209723
   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)