src/Pure/proofterm.ML
changeset 56245 84fc7dfa3cd4
parent 52696 38466f4f3483
child 59058 a78612c67ec0
equal deleted inserted replaced
56244:3298b7a2795a 56245:84fc7dfa3cd4
   863     val k = length ps;
   863     val k = length ps;
   864 
   864 
   865     fun mk_app b (i, j, prf) =
   865     fun mk_app b (i, j, prf) =
   866           if b then (i-1, j, prf %% PBound i) else (i, j-1, prf %> Bound j);
   866           if b then (i-1, j, prf %% PBound i) else (i, j-1, prf %> Bound j);
   867 
   867 
   868     fun lift Us bs i j (Const ("==>", _) $ A $ B) =
   868     fun lift Us bs i j (Const ("Pure.imp", _) $ A $ B) =
   869             AbsP ("H", NONE (*A*), lift Us (true::bs) (i+1) j B)
   869             AbsP ("H", NONE (*A*), lift Us (true::bs) (i+1) j B)
   870       | lift Us bs i j (Const ("all", _) $ Abs (a, T, t)) =
   870       | lift Us bs i j (Const ("Pure.all", _) $ Abs (a, T, t)) =
   871             Abst (a, NONE (*T*), lift (T::Us) (false::bs) i (j+1) t)
   871             Abst (a, NONE (*T*), lift (T::Us) (false::bs) i (j+1) t)
   872       | lift Us bs i j _ = proof_combP (lifth' (rev Us) [] prf,
   872       | lift Us bs i j _ = proof_combP (lifth' (rev Us) [] prf,
   873             map (fn k => (#3 (fold_rev mk_app bs (i-1, j-1, PBound k))))
   873             map (fn k => (#3 (fold_rev mk_app bs (i-1, j-1, PBound k))))
   874               (i + k - 1 downto i));
   874               (i + k - 1 downto i));
   875   in
   875   in
   884 (***** proof by assumption *****)
   884 (***** proof by assumption *****)
   885 
   885 
   886 fun mk_asm_prf t i m =
   886 fun mk_asm_prf t i m =
   887   let
   887   let
   888     fun imp_prf _ i 0 = PBound i
   888     fun imp_prf _ i 0 = PBound i
   889       | imp_prf (Const ("==>", _) $ A $ B) i m = AbsP ("H", NONE (*A*), imp_prf B (i+1) (m-1))
   889       | imp_prf (Const ("Pure.imp", _) $ A $ B) i m = AbsP ("H", NONE (*A*), imp_prf B (i+1) (m-1))
   890       | imp_prf _ i _ = PBound i;
   890       | imp_prf _ i _ = PBound i;
   891     fun all_prf (Const ("all", _) $ Abs (a, T, t)) = Abst (a, NONE (*T*), all_prf t)
   891     fun all_prf (Const ("Pure.all", _) $ Abs (a, T, t)) = Abst (a, NONE (*T*), all_prf t)
   892       | all_prf t = imp_prf t (~i) m
   892       | all_prf t = imp_prf t (~i) m
   893   in all_prf t end;
   893   in all_prf t end;
   894 
   894 
   895 fun assumption_proof Bs Bi n prf =
   895 fun assumption_proof Bs Bi n prf =
   896   mk_AbsP (length Bs, proof_combP (prf,
   896   mk_AbsP (length Bs, proof_combP (prf,
   897     map PBound (length Bs - 1 downto 0) @ [mk_asm_prf Bi n ~1]));
   897     map PBound (length Bs - 1 downto 0) @ [mk_asm_prf Bi n ~1]));
   898 
   898 
   899 
   899 
   900 (***** Composition of object rule with proof state *****)
   900 (***** Composition of object rule with proof state *****)
   901 
   901 
   902 fun flatten_params_proof i j n (Const ("==>", _) $ A $ B, k) =
   902 fun flatten_params_proof i j n (Const ("Pure.imp", _) $ A $ B, k) =
   903       AbsP ("H", NONE (*A*), flatten_params_proof (i+1) j n (B, k))
   903       AbsP ("H", NONE (*A*), flatten_params_proof (i+1) j n (B, k))
   904   | flatten_params_proof i j n (Const ("all", _) $ Abs (a, T, t), k) =
   904   | flatten_params_proof i j n (Const ("Pure.all", _) $ Abs (a, T, t), k) =
   905       Abst (a, NONE (*T*), flatten_params_proof i (j+1) n (t, k))
   905       Abst (a, NONE (*T*), flatten_params_proof i (j+1) n (t, k))
   906   | flatten_params_proof i j n (_, k) = proof_combP (proof_combt (PBound (k+i),
   906   | flatten_params_proof i j n (_, k) = proof_combP (proof_combt (PBound (k+i),
   907       map Bound (j-1 downto 0)), map PBound (remove (op =) (i-n) (i-1 downto 0)));
   907       map Bound (j-1 downto 0)), map PBound (remove (op =) (i-n) (i-1 downto 0)));
   908 
   908 
   909 fun bicompose_proof flatten Bs oldAs newAs A n m rprf sprf =
   909 fun bicompose_proof flatten Bs oldAs newAs A n m rprf sprf =
  1089   if is_fun (fastype_of1 (Ts, t)) then
  1089   if is_fun (fastype_of1 (Ts, t)) then
  1090     union (op =) vs (map_filter (fn Var (ixn, T) =>
  1090     union (op =) vs (map_filter (fn Var (ixn, T) =>
  1091       if is_fun T then SOME ixn else NONE | _ => NONE) (vars_of t))
  1091       if is_fun T then SOME ixn else NONE | _ => NONE) (vars_of t))
  1092   else vs;
  1092   else vs;
  1093 
  1093 
  1094 fun add_npvars q p Ts (vs, Const ("==>", _) $ t $ u) =
  1094 fun add_npvars q p Ts (vs, Const ("Pure.imp", _) $ t $ u) =
  1095       add_npvars q p Ts (add_npvars q (not p) Ts (vs, t), u)
  1095       add_npvars q p Ts (add_npvars q (not p) Ts (vs, t), u)
  1096   | add_npvars q p Ts (vs, Const ("all", Type (_, [Type (_, [T, _]), _])) $ t) =
  1096   | add_npvars q p Ts (vs, Const ("Pure.all", Type (_, [Type (_, [T, _]), _])) $ t) =
  1097       add_npvars q p Ts (vs, if p andalso q then betapply (t, Var (("",0), T)) else t)
  1097       add_npvars q p Ts (vs, if p andalso q then betapply (t, Var (("",0), T)) else t)
  1098   | add_npvars q p Ts (vs, Abs (_, T, t)) = add_npvars q p (T::Ts) (vs, t)
  1098   | add_npvars q p Ts (vs, Abs (_, T, t)) = add_npvars q p (T::Ts) (vs, t)
  1099   | add_npvars _ _ Ts (vs, t) = add_npvars' Ts (vs, t)
  1099   | add_npvars _ _ Ts (vs, t) = add_npvars' Ts (vs, t)
  1100 and add_npvars' Ts (vs, t) = (case strip_comb t of
  1100 and add_npvars' Ts (vs, t) = (case strip_comb t of
  1101     (Var (ixn, _), ts) => if test_args [] ts then vs
  1101     (Var (ixn, _), ts) => if test_args [] ts then vs
  1103         (AList.update (op =) (ixn,
  1103         (AList.update (op =) (ixn,
  1104           Library.foldl (add_funvars Ts) ((these ooo AList.lookup) (op =) vs ixn, ts)) vs, ts)
  1104           Library.foldl (add_funvars Ts) ((these ooo AList.lookup) (op =) vs ixn, ts)) vs, ts)
  1105   | (Abs (_, T, u), ts) => Library.foldl (add_npvars' (T::Ts)) (vs, u :: ts)
  1105   | (Abs (_, T, u), ts) => Library.foldl (add_npvars' (T::Ts)) (vs, u :: ts)
  1106   | (_, ts) => Library.foldl (add_npvars' Ts) (vs, ts));
  1106   | (_, ts) => Library.foldl (add_npvars' Ts) (vs, ts));
  1107 
  1107 
  1108 fun prop_vars (Const ("==>", _) $ P $ Q) = union (op =) (prop_vars P) (prop_vars Q)
  1108 fun prop_vars (Const ("Pure.imp", _) $ P $ Q) = union (op =) (prop_vars P) (prop_vars Q)
  1109   | prop_vars (Const ("all", _) $ Abs (_, _, t)) = prop_vars t
  1109   | prop_vars (Const ("Pure.all", _) $ Abs (_, _, t)) = prop_vars t
  1110   | prop_vars t = (case strip_comb t of
  1110   | prop_vars t = (case strip_comb t of
  1111       (Var (ixn, _), _) => [ixn] | _ => []);
  1111       (Var (ixn, _), _) => [ixn] | _ => []);
  1112 
  1112 
  1113 fun is_proj t =
  1113 fun is_proj t =
  1114   let
  1114   let
  1194                   (needed prop ts'' prfs, add_npvars false true [] ([], prop));
  1194                   (needed prop ts'' prfs, add_npvars false true [] ([], prop));
  1195             val insts' = map
  1195             val insts' = map
  1196               (fn (ixn, x as SOME _) => if member (op =) nvs ixn then (false, x) else (true, NONE)
  1196               (fn (ixn, x as SOME _) => if member (op =) nvs ixn then (false, x) else (true, NONE)
  1197                 | (_, x) => (false, x)) insts
  1197                 | (_, x) => (false, x)) insts
  1198           in ([], false, insts' @ map (pair false) ts'', prf) end
  1198           in ([], false, insts' @ map (pair false) ts'', prf) end
  1199     and needed (Const ("==>", _) $ t $ u) ts ((b, _, _, _)::prfs) =
  1199     and needed (Const ("Pure.imp", _) $ t $ u) ts ((b, _, _, _)::prfs) =
  1200           union (op =) (if b then map (fst o dest_Var) (vars_of t) else []) (needed u ts prfs)
  1200           union (op =) (if b then map (fst o dest_Var) (vars_of t) else []) (needed u ts prfs)
  1201       | needed (Var (ixn, _)) (_::_) _ = [ixn]
  1201       | needed (Var (ixn, _)) (_::_) _ = [ixn]
  1202       | needed _ _ _ = [];
  1202       | needed _ _ _ = [];
  1203   in shrink end;
  1203   in shrink end;
  1204 
  1204