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 |