src/Pure/proofterm.ML
changeset 33037 b22e44496dc2
parent 32810 f3466a5645fa
child 33038 8f9594c31de4
equal deleted inserted replaced
33015:575bd6548df9 33037:b22e44496dc2
   898   | is_fun (TVar _) = true
   898   | is_fun (TVar _) = true
   899   | is_fun _ = false;
   899   | is_fun _ = false;
   900 
   900 
   901 fun add_funvars Ts (vs, t) =
   901 fun add_funvars Ts (vs, t) =
   902   if is_fun (fastype_of1 (Ts, t)) then
   902   if is_fun (fastype_of1 (Ts, t)) then
   903     vs union map_filter (fn Var (ixn, T) =>
   903     gen_union (op =) (vs, map_filter (fn Var (ixn, T) =>
   904       if is_fun T then SOME ixn else NONE | _ => NONE) (vars_of t)
   904       if is_fun T then SOME ixn else NONE | _ => NONE) (vars_of t))
   905   else vs;
   905   else vs;
   906 
   906 
   907 fun add_npvars q p Ts (vs, Const ("==>", _) $ t $ u) =
   907 fun add_npvars q p Ts (vs, Const ("==>", _) $ t $ u) =
   908       add_npvars q p Ts (add_npvars q (not p) Ts (vs, t), u)
   908       add_npvars q p Ts (add_npvars q (not p) Ts (vs, t), u)
   909   | add_npvars q p Ts (vs, Const ("all", Type (_, [Type (_, [T, _]), _])) $ t) =
   909   | add_npvars q p Ts (vs, Const ("all", Type (_, [Type (_, [T, _]), _])) $ t) =
   916         (AList.update (op =) (ixn,
   916         (AList.update (op =) (ixn,
   917           Library.foldl (add_funvars Ts) ((these ooo AList.lookup) (op =) vs ixn, ts)) vs, ts)
   917           Library.foldl (add_funvars Ts) ((these ooo AList.lookup) (op =) vs ixn, ts)) vs, ts)
   918   | (Abs (_, T, u), ts) => Library.foldl (add_npvars' (T::Ts)) (vs, u :: ts)
   918   | (Abs (_, T, u), ts) => Library.foldl (add_npvars' (T::Ts)) (vs, u :: ts)
   919   | (_, ts) => Library.foldl (add_npvars' Ts) (vs, ts));
   919   | (_, ts) => Library.foldl (add_npvars' Ts) (vs, ts));
   920 
   920 
   921 fun prop_vars (Const ("==>", _) $ P $ Q) = prop_vars P union prop_vars Q
   921 fun prop_vars (Const ("==>", _) $ P $ Q) = gen_union (op =) (prop_vars P, prop_vars Q)
   922   | prop_vars (Const ("all", _) $ Abs (_, _, t)) = prop_vars t
   922   | prop_vars (Const ("all", _) $ Abs (_, _, t)) = prop_vars t
   923   | prop_vars t = (case strip_comb t of
   923   | prop_vars t = (case strip_comb t of
   924       (Var (ixn, _), _) => [ixn] | _ => []);
   924       (Var (ixn, _), _) => [ixn] | _ => []);
   925 
   925 
   926 fun is_proj t =
   926 fun is_proj t =
   934         Bound _ => true
   934         Bound _ => true
   935       | t' => is_p 0 t')
   935       | t' => is_p 0 t')
   936   end;
   936   end;
   937 
   937 
   938 fun needed_vars prop =
   938 fun needed_vars prop =
   939   Library.foldl (op union)
   939   gen_union (op =) (Library.foldl (gen_union (op =))
   940     ([], map (uncurry (insert (op =))) (add_npvars true true [] ([], prop))) union
   940     ([], map (uncurry (insert (op =))) (add_npvars true true [] ([], prop))),
   941   prop_vars prop;
   941   prop_vars prop);
   942 
   942 
   943 fun gen_axm_proof c name prop =
   943 fun gen_axm_proof c name prop =
   944   let
   944   let
   945     val nvs = needed_vars prop;
   945     val nvs = needed_vars prop;
   946     val args = map (fn (v as Var (ixn, _)) =>
   946     val args = map (fn (v as Var (ixn, _)) =>
   973           in (false, is, ch, prf') end
   973           in (false, is, ch, prf') end
   974     and shrink' ls lev ts prfs (prf as prf1 %% prf2) =
   974     and shrink' ls lev ts prfs (prf as prf1 %% prf2) =
   975           let
   975           let
   976             val p as (_, is', ch', prf') = shrink ls lev prf2;
   976             val p as (_, is', ch', prf') = shrink ls lev prf2;
   977             val (is, ch, ts', prf'') = shrink' ls lev ts (p::prfs) prf1
   977             val (is, ch, ts', prf'') = shrink' ls lev ts (p::prfs) prf1
   978           in (is union is', ch orelse ch', ts',
   978           in (gen_union (op =) (is, is'), ch orelse ch', ts',
   979               if ch orelse ch' then prf'' %% prf' else prf)
   979               if ch orelse ch' then prf'' %% prf' else prf)
   980           end
   980           end
   981       | shrink' ls lev ts prfs (prf as prf1 % t) =
   981       | shrink' ls lev ts prfs (prf as prf1 % t) =
   982           let val (is, ch, (ch', t')::ts', prf') = shrink' ls lev (t::ts) prfs prf1
   982           let val (is, ch, (ch', t')::ts', prf') = shrink' ls lev (t::ts) prfs prf1
   983           in (is, ch orelse ch', ts',
   983           in (is, ch orelse ch', ts',
  1002             val vs = vars_of prop;
  1002             val vs = vars_of prop;
  1003             val (ts', ts'') = chop (length vs) ts;
  1003             val (ts', ts'') = chop (length vs) ts;
  1004             val insts = Library.take (length ts', map (fst o dest_Var) vs) ~~ ts';
  1004             val insts = Library.take (length ts', map (fst o dest_Var) vs) ~~ ts';
  1005             val nvs = Library.foldl (fn (ixns', (ixn, ixns)) =>
  1005             val nvs = Library.foldl (fn (ixns', (ixn, ixns)) =>
  1006               insert (op =) ixn (case AList.lookup (op =) insts ixn of
  1006               insert (op =) ixn (case AList.lookup (op =) insts ixn of
  1007                   SOME (SOME t) => if is_proj t then ixns union ixns' else ixns'
  1007                   SOME (SOME t) => if is_proj t then gen_union (op =) (ixns, ixns') else ixns'
  1008                 | _ => ixns union ixns'))
  1008                 | _ => gen_union (op =) (ixns, ixns')))
  1009                   (needed prop ts'' prfs, add_npvars false true [] ([], prop));
  1009                   (needed prop ts'' prfs, add_npvars false true [] ([], prop));
  1010             val insts' = map
  1010             val insts' = map
  1011               (fn (ixn, x as SOME _) => if member (op =) nvs ixn then (false, x) else (true, NONE)
  1011               (fn (ixn, x as SOME _) => if member (op =) nvs ixn then (false, x) else (true, NONE)
  1012                 | (_, x) => (false, x)) insts
  1012                 | (_, x) => (false, x)) insts
  1013           in ([], false, insts' @ map (pair false) ts'', prf) end
  1013           in ([], false, insts' @ map (pair false) ts'', prf) end
  1014     and needed (Const ("==>", _) $ t $ u) ts ((b, _, _, _)::prfs) =
  1014     and needed (Const ("==>", _) $ t $ u) ts ((b, _, _, _)::prfs) =
  1015           (if b then map (fst o dest_Var) (vars_of t) else []) union needed u ts prfs
  1015           gen_union (op =) (if b then map (fst o dest_Var) (vars_of t) else [], needed u ts prfs)
  1016       | needed (Var (ixn, _)) (_::_) _ = [ixn]
  1016       | needed (Var (ixn, _)) (_::_) _ = [ixn]
  1017       | needed _ _ _ = [];
  1017       | needed _ _ _ = [];
  1018   in shrink end;
  1018   in shrink end;
  1019 
  1019 
  1020 
  1020