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 |