{-# LANGUAGE ScopedTypeVariables #-} {-# OPTIONS_GHC -Wall #-} module Data.Logic.Harrison.Resolution ( resolution1 , resolution2 , resolution3 , presolution , matchAtomsEq ) where import Data.Logic.Classes.Atom (Atom(match)) import Data.Logic.Classes.Combine (Combination(..)) import Data.Logic.Classes.Equals (AtomEq, zipAtomsEq) import Data.Logic.Classes.FirstOrder (FirstOrderFormula(..), zipFirstOrder) import Data.Logic.Classes.Literal (Literal) import Data.Logic.Classes.Negate ((.~.), positive) import Data.Logic.Classes.Propositional (PropositionalFormula) import Data.Logic.Classes.Term (Term(vt, foldTerm)) import Data.Logic.Classes.Variable (Variable(prefix)) import Data.Logic.Failing (Failing(..), failing) import Data.Logic.Harrison.FOL (subst, fv, generalize, list_disj, list_conj) import Data.Logic.Harrison.Lib (settryfind, allpairs, allsubsets, setAny, setAll, allnonemptysubsets, (|->), apply, defined) import Data.Logic.Harrison.Normal (simpdnf, simpcnf, trivial) import Data.Logic.Harrison.Skolem (pnf, SkolemT, askolemize, specialize) import Data.Logic.Harrison.Tableaux (unify_literals) import Data.Logic.Harrison.Unif (solve) import qualified Data.Map as Map import Data.Maybe (fromMaybe) import qualified Data.Set as Set -- ========================================================================= -- Resolution. -- -- Copyright (c) 2003-2007, John Harrison. (See "LICENSE.txt" for details.) -- ========================================================================= -- ------------------------------------------------------------------------- -- MGU of a set of literals. -- ------------------------------------------------------------------------- mgu :: forall lit atom term v f. (Literal lit atom, Term term v f, Atom atom term v) => Set.Set lit -> Map.Map v term -> Failing (Map.Map v term) mgu l env = case Set.minView l of Just (a, rest) -> case Set.minView rest of Just (b, _) -> unify_literals env a b >>= mgu rest _ -> Success (solve env) _ -> Success (solve env) unifiable :: (Literal lit atom, Term term v f, Atom atom term v) => lit -> lit -> Bool unifiable p q = failing (const False) (const True) (unify_literals Map.empty p q) -- ------------------------------------------------------------------------- -- Rename a clause. -- ------------------------------------------------------------------------- rename :: (FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => (v -> v) -> Set.Set fof -> Set.Set fof rename pfx cls = Set.map (subst (Map.fromList (zip fvs vvs))) cls where -- fvs :: [v] fvs = Set.toList (fv (list_disj cls)) -- vvs :: [term] vvs = map (vt . pfx) fvs -- ------------------------------------------------------------------------- -- General resolution rule, incorporating factoring as in Robinson's paper. -- ------------------------------------------------------------------------- resolvents :: (Literal fof atom, FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => Set.Set fof -> Set.Set fof -> fof -> Set.Set fof -> Set.Set fof resolvents cl1 cl2 p acc = if Set.null ps2 then acc else Set.fold doPair acc pairs where doPair (s1,s2) sof = case mgu (Set.union s1 (Set.map (.~.) s2)) Map.empty of Success mp -> Set.union (Set.map (subst mp) (Set.union (Set.difference cl1 s1) (Set.difference cl2 s2))) sof Failure _ -> sof -- pairs :: Set.Set (Set.Set fof, Set.Set fof) pairs = allpairs (,) (Set.map (Set.insert p) (allsubsets ps1)) (allnonemptysubsets ps2) -- ps1 :: Set.Set fof ps1 = Set.filter (\ q -> q /= p && unifiable p q) cl1 -- ps2 :: Set.Set fof ps2 = Set.filter (unifiable ((.~.) p)) cl2 resolve_clauses :: forall fof atom v term f. (Literal fof atom, FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => Set.Set fof -> Set.Set fof -> Set.Set fof resolve_clauses cls1 cls2 = let cls1' = rename (prefix "x") cls1 cls2' = rename (prefix "y") cls2 in Set.fold (resolvents cls1' cls2') Set.empty cls1' -- ------------------------------------------------------------------------- -- Basic "Argonne" loop. -- ------------------------------------------------------------------------- resloop1 :: forall atom v term f fof. (Literal fof atom, FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => Set.Set (Set.Set fof) -> Set.Set (Set.Set fof) -> Failing Bool resloop1 used unused = maybe (Failure ["No proof found"]) step (Set.minView unused) where step (cl, ros) = if Set.member Set.empty news then return True else resloop1 used' (Set.union ros news) where used' = Set.insert cl used -- resolve_clauses is not in the Failing monad, so setmapfilter isn't appropriate. news = Set.fold Set.insert Set.empty ({-setmapfilter-} Set.map (resolve_clauses cl) used') pure_resolution1 :: forall fof atom v term f. (Literal fof atom, FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => fof -> Failing Bool pure_resolution1 fm = resloop1 Set.empty (simpcnf (specialize (pnf fm))) resolution1 :: forall m fof term f atom v. (Literal fof atom, FirstOrderFormula fof atom v, PropositionalFormula fof atom, Term term v f, Atom atom term v, Ord fof, Monad m) => fof -> SkolemT v term m (Set.Set (Failing Bool)) resolution1 fm = askolemize ((.~.)(generalize fm)) >>= return . Set.map (pure_resolution1 . list_conj) . (simpdnf :: fof -> Set.Set (Set.Set fof)) -- ------------------------------------------------------------------------- -- Matching of terms and literals. -- ------------------------------------------------------------------------- term_match :: forall term v f. (Term term v f) => Map.Map v term -> [(term, term)] -> Failing (Map.Map v term) term_match env [] = Success env term_match env ((p, q) : oth) = foldTerm v fn p where v x = if not (defined env x) then term_match ((x |-> q) env) oth else if apply env x == Just q then term_match env oth else Failure ["term_match"] fn f fa = foldTerm v' fn' q where fn' g ga | f == g && length fa == length ga = term_match env (zip fa ga ++ oth) fn' _ _ = Failure ["term_match"] v' _ = Failure ["term_match"] {- case eqs of [] -> Success env (Fn f fa, Fn g ga) : oth | f == g && length fa == length ga -> term_match env (zip fa ga ++ oth) (Var x, t) : oth -> if not (defined env x) then term_match ((x |-> t) env) oth else if apply env x == t then term_match env oth else Failure ["term_match"] _ -> Failure ["term_match"] -} match_literals :: forall term f v fof atom. (FirstOrderFormula fof atom v, Atom atom term v, Term term v f) => Map.Map v term -> fof -> fof -> Failing (Map.Map v term) match_literals env t1 t2 = fromMaybe err (zipFirstOrder qu co tf at t1 t2) where qu _ _ _ _ _ _ = Nothing co ((:~:) p) ((:~:) q) = Just $ match_literals env p q co _ _ = Nothing tf a b = if a == b then Just (Success env) else Nothing at a1 a2 = Just (match env a1 a2) err = Failure ["match_literals"] -- Identical to unifyAtomsEq except calls term_match instead of unify. matchAtomsEq :: forall v f atom p term. (AtomEq atom p term, Term term v f) => Map.Map v term -> atom -> atom -> Failing (Map.Map v term) matchAtomsEq env a1 a2 = fromMaybe err (zipAtomsEq ap tf eq a1 a2) where ap p ts1 q ts2 = if p == q && length ts1 == length ts2 then Just (term_match env (zip ts1 ts2)) else Nothing tf p q = if p == q then Just (Success env) else Nothing eq pl pr ql qr = Just (term_match env [(pl, ql), (pr, qr)]) err = Failure ["matchAtomsEq"] {- case tmp of (Atom (R p a1), Atom(R q a2)) -> term_match env [(Fn p a1, Fn q a2)] (Not (Atom (R p a1)), Not (Atom (R q a2))) -> term_match env [(Fn p a1, Fn q a2)] _ -> Failure ["match_literals"] -} -- ------------------------------------------------------------------------- -- Test for subsumption -- ------------------------------------------------------------------------- subsumes_clause :: forall term f v fof atom. (FirstOrderFormula fof atom v, Term term v f, Atom atom term v) => Set.Set fof -> Set.Set fof -> Bool subsumes_clause cls1 cls2 = failing (const False) (const True) (subsume Map.empty cls1) where -- subsume :: Map.Map v term -> Set.Set fof -> Failing (Map.Map v term) subsume env cls = case Set.minView cls of Nothing -> Success env Just (l1, clt) -> settryfind (\ l2 -> case (match_literals env l1 l2) of Success env' -> subsume env' clt Failure msgs -> Failure msgs) cls2 -- ------------------------------------------------------------------------- -- With deletion of tautologies and bi-subsumption with "unused". -- ------------------------------------------------------------------------- replace :: forall term f v fof atom. (FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => Set.Set fof -> Set.Set (Set.Set fof) -> Set.Set (Set.Set fof) replace cl st = case Set.minView st of Nothing -> Set.singleton cl Just (c, st') -> if subsumes_clause cl c then Set.insert cl st' else Set.insert c (replace cl st') incorporate :: forall fof term f v atom. (FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => Set.Set fof -> Set.Set fof -> Set.Set (Set.Set fof) -> Set.Set (Set.Set fof) incorporate gcl cl unused = if trivial cl || setAny (\ c -> subsumes_clause c cl) (Set.insert gcl unused) then unused else replace cl unused resloop2 :: forall fof term f v atom. (Literal fof atom, FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => Set.Set (Set.Set fof) -> Set.Set (Set.Set fof) -> Failing Bool resloop2 used unused = case Set.minView unused of Nothing -> Failure ["No proof found"] Just (cl {- :: Set.Set fof-}, ros {- :: Set.Set (Set.Set fof) -}) -> -- print_string(string_of_int(length used) ^ " used; "^ string_of_int(length unused) ^ " unused."); -- print_newline(); let used' = Set.insert cl used in let news = {-Set.fold Set.union Set.empty-} (Set.map (resolve_clauses cl) used') in if Set.member Set.empty news then return True else resloop2 used' (Set.fold (incorporate cl) ros news) pure_resolution2 :: forall fof atom v term f. (Literal fof atom, FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => fof -> Failing Bool pure_resolution2 fm = resloop2 Set.empty (simpcnf (specialize (pnf fm))) resolution2 :: forall fof atom term v f m. (Literal fof atom, FirstOrderFormula fof atom v, PropositionalFormula fof atom, Term term v f, Atom atom term v, Ord fof, Monad m) => fof -> SkolemT v term m (Set.Set (Failing Bool)) resolution2 fm = askolemize ((.~.) (generalize fm)) >>= return . Set.map (pure_resolution2 . list_conj) . (simpdnf :: fof -> Set.Set (Set.Set fof)) -- ------------------------------------------------------------------------- -- Positive (P1) resolution. -- ------------------------------------------------------------------------- presolve_clauses :: (Literal fof atom, FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => Set.Set fof -> Set.Set fof -> Set.Set fof presolve_clauses cls1 cls2 = if setAll positive cls1 || setAll positive cls2 then resolve_clauses cls1 cls2 else Set.empty presloop :: (Literal fof atom, FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => Set.Set (Set.Set fof) -> Set.Set (Set.Set fof) -> Failing Bool presloop used unused = case Set.minView unused of Nothing -> Failure ["No proof found"] Just (cl, ros) -> -- print_string(string_of_int(length used) ^ " used; "^ string_of_int(length unused) ^ " unused."); -- print_newline(); let used' = Set.insert cl used in let news = Set.map (presolve_clauses cl) used' in if Set.member Set.empty news then Success True else presloop used' (Set.fold (incorporate cl) ros news) pure_presolution :: forall fof atom v term f. (Literal fof atom, FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => fof -> Failing Bool pure_presolution fm = presloop Set.empty (simpcnf (specialize (pnf fm))) presolution :: forall fof atom term v f m. (Literal fof atom, FirstOrderFormula fof atom v, PropositionalFormula fof atom, Term term v f, Atom atom term v, Ord fof, Monad m) => fof -> SkolemT v term m (Set.Set (Failing Bool)) presolution fm = askolemize ((.~.) (generalize fm)) >>= return . Set.map (pure_presolution . list_conj) . (simpdnf :: fof -> Set.Set (Set.Set fof)) -- ------------------------------------------------------------------------- -- Introduce a set-of-support restriction. -- ------------------------------------------------------------------------- pure_resolution3 :: (Literal fof atom, FirstOrderFormula fof atom v, Term term v f, Atom atom term v, Ord fof) => fof -> Failing Bool pure_resolution3 fm = uncurry resloop2 (Set.partition (setAny positive) (simpcnf (specialize (pnf fm)))) resolution3 :: forall fof atom term v f m. (Literal fof atom, FirstOrderFormula fof atom v, PropositionalFormula fof atom, Term term v f, Atom atom term v, Ord fof, Monad m) => fof -> SkolemT v term m (Set.Set (Failing Bool)) resolution3 fm = askolemize ((.~.)(generalize fm)) >>= return . Set.map (pure_resolution3 . list_conj) . (simpdnf :: fof -> Set.Set (Set.Set fof)) {- -- ------------------------------------------------------------------------- -- The Pelletier examples again. -- ------------------------------------------------------------------------- {- ********** let p1 = time presolution <

q <=> ~q ==> ~p>>;; let p2 = time presolution <<~ ~p <=> p>>;; let p3 = time presolution <<~(p ==> q) ==> q ==> p>>;; let p4 = time presolution <<~p ==> q <=> ~q ==> p>>;; let p5 = time presolution <<(p \/ q ==> p \/ r) ==> p \/ (q ==> r)>>;; let p6 = time presolution <

>;; let p7 = time presolution <

>;; let p8 = time presolution <<((p ==> q) ==> p) ==> p>>;; let p9 = time presolution <<(p \/ q) /\ (~p \/ q) /\ (p \/ ~q) ==> ~(~q \/ ~q)>>;; let p10 = time presolution <<(q ==> r) /\ (r ==> p /\ q) /\ (p ==> q /\ r) ==> (p <=> q)>>;; let p11 = time presolution <

p>>;; let p12 = time presolution <<((p <=> q) <=> r) <=> (p <=> (q <=> r))>>;; let p13 = time presolution <

(p \/ q) /\ (p \/ r)>>;; let p14 = time presolution <<(p <=> q) <=> (q \/ ~p) /\ (~q \/ p)>>;; let p15 = time presolution <

q <=> ~p \/ q>>;; let p16 = time presolution <<(p ==> q) \/ (q ==> p)>>;; let p17 = time presolution <

r) ==> s <=> (~p \/ q \/ s) /\ (~p \/ ~r \/ s)>>;; -- ------------------------------------------------------------------------- -- Monadic Predicate Logic. -- ------------------------------------------------------------------------- let p18 = time presolution < P(x)>>;; let p19 = time presolution < Q(z)) ==> P(x) ==> Q(x)>>;; let p20 = time presolution <<(forall x y. exists z. forall w. P(x) /\ Q(y) ==> R(z) /\ U(w)) ==> (exists x y. P(x) /\ Q(y)) ==> (exists z. R(z))>>;; let p21 = time presolution <<(exists x. P ==> Q(x)) /\ (exists x. Q(x) ==> P) ==> (exists x. P <=> Q(x))>>;; let p22 = time presolution <<(forall x. P <=> Q(x)) ==> (P <=> (forall x. Q(x)))>>;; let p23 = time presolution <<(forall x. P \/ Q(x)) <=> P \/ (forall x. Q(x))>>;; let p24 = time presolution <<~(exists x. U(x) /\ Q(x)) /\ (forall x. P(x) ==> Q(x) \/ R(x)) /\ ~(exists x. P(x) ==> (exists x. Q(x))) /\ (forall x. Q(x) /\ R(x) ==> U(x)) ==> (exists x. P(x) /\ R(x))>>;; let p25 = time presolution <<(exists x. P(x)) /\ (forall x. U(x) ==> ~G(x) /\ R(x)) /\ (forall x. P(x) ==> G(x) /\ U(x)) /\ ((forall x. P(x) ==> Q(x)) \/ (exists x. Q(x) /\ P(x))) ==> (exists x. Q(x) /\ P(x))>>;; let p26 = time presolution <<((exists x. P(x)) <=> (exists x. Q(x))) /\ (forall x y. P(x) /\ Q(y) ==> (R(x) <=> U(y))) ==> ((forall x. P(x) ==> R(x)) <=> (forall x. Q(x) ==> U(x)))>>;; let p27 = time presolution <<(exists x. P(x) /\ ~Q(x)) /\ (forall x. P(x) ==> R(x)) /\ (forall x. U(x) /\ V(x) ==> P(x)) /\ (exists x. R(x) /\ ~Q(x)) ==> (forall x. U(x) ==> ~R(x)) ==> (forall x. U(x) ==> ~V(x))>>;; let p28 = time presolution <<(forall x. P(x) ==> (forall x. Q(x))) /\ ((forall x. Q(x) \/ R(x)) ==> (exists x. Q(x) /\ R(x))) /\ ((exists x. R(x)) ==> (forall x. L(x) ==> M(x))) ==> (forall x. P(x) /\ L(x) ==> M(x))>>;; let p29 = time presolution <<(exists x. P(x)) /\ (exists x. G(x)) ==> ((forall x. P(x) ==> H(x)) /\ (forall x. G(x) ==> J(x)) <=> (forall x y. P(x) /\ G(y) ==> H(x) /\ J(y)))>>;; let p30 = time presolution <<(forall x. P(x) \/ G(x) ==> ~H(x)) /\ (forall x. (G(x) ==> ~U(x)) ==> P(x) /\ H(x)) ==> (forall x. U(x))>>;; let p31 = time presolution <<~(exists x. P(x) /\ (G(x) \/ H(x))) /\ (exists x. Q(x) /\ P(x)) /\ (forall x. ~H(x) ==> J(x)) ==> (exists x. Q(x) /\ J(x))>>;; let p32 = time presolution <<(forall x. P(x) /\ (G(x) \/ H(x)) ==> Q(x)) /\ (forall x. Q(x) /\ H(x) ==> J(x)) /\ (forall x. R(x) ==> H(x)) ==> (forall x. P(x) /\ R(x) ==> J(x))>>;; let p33 = time presolution <<(forall x. P(a) /\ (P(x) ==> P(b)) ==> P(c)) <=> (forall x. P(a) ==> P(x) \/ P(c)) /\ (P(a) ==> P(b) ==> P(c))>>;; let p34 = time presolution <<((exists x. forall y. P(x) <=> P(y)) <=> ((exists x. Q(x)) <=> (forall y. Q(y)))) <=> ((exists x. forall y. Q(x) <=> Q(y)) <=> ((exists x. P(x)) <=> (forall y. P(y))))>>;; let p35 = time presolution < (forall x y. P(x,y))>>;; -- ------------------------------------------------------------------------- -- Full predicate logic (without Identity and Functions) -- ------------------------------------------------------------------------- let p36 = time presolution <<(forall x. exists y. P(x,y)) /\ (forall x. exists y. G(x,y)) /\ (forall x y. P(x,y) \/ G(x,y) ==> (forall z. P(y,z) \/ G(y,z) ==> H(x,z))) ==> (forall x. exists y. H(x,y))>>;; let p37 = time presolution <<(forall z. exists w. forall x. exists y. (P(x,z) ==> P(y,w)) /\ P(y,z) /\ (P(y,w) ==> (exists u. Q(u,w)))) /\ (forall x z. ~P(x,z) ==> (exists y. Q(y,z))) /\ ((exists x y. Q(x,y)) ==> (forall x. R(x,x))) ==> (forall x. exists y. R(x,y))>>;; {- ** This one seems too slow let p38 = time presolution <<(forall x. P(a) /\ (P(x) ==> (exists y. P(y) /\ R(x,y))) ==> (exists z w. P(z) /\ R(x,w) /\ R(w,z))) <=> (forall x. (~P(a) \/ P(x) \/ (exists z w. P(z) /\ R(x,w) /\ R(w,z))) /\ (~P(a) \/ ~(exists y. P(y) /\ R(x,y)) \/ (exists z w. P(z) /\ R(x,w) /\ R(w,z))))>>;; ** -} let p39 = time presolution <<~(exists x. forall y. P(y,x) <=> ~P(y,y))>>;; let p40 = time presolution <<(exists y. forall x. P(x,y) <=> P(x,x)) ==> ~(forall x. exists y. forall z. P(z,y) <=> ~P(z,x))>>;; let p41 = time presolution <<(forall z. exists y. forall x. P(x,y) <=> P(x,z) /\ ~P(x,x)) ==> ~(exists z. forall x. P(x,z))>>;; {- ** Also very slow let p42 = time presolution <<~(exists y. forall x. P(x,y) <=> ~(exists z. P(x,z) /\ P(z,x)))>>;; ** -} {- ** and this one too.. let p43 = time presolution <<(forall x y. Q(x,y) <=> forall z. P(z,x) <=> P(z,y)) ==> forall x y. Q(x,y) <=> Q(y,x)>>;; ** -} let p44 = time presolution <<(forall x. P(x) ==> (exists y. G(y) /\ H(x,y)) /\ (exists y. G(y) /\ ~H(x,y))) /\ (exists x. J(x) /\ (forall y. G(y) ==> H(x,y))) ==> (exists x. J(x) /\ ~P(x))>>;; {- ** and this... let p45 = time presolution <<(forall x. P(x) /\ (forall y. G(y) /\ H(x,y) ==> J(x,y)) ==> (forall y. G(y) /\ H(x,y) ==> R(y))) /\ ~(exists y. L(y) /\ R(y)) /\ (exists x. P(x) /\ (forall y. H(x,y) ==> L(y)) /\ (forall y. G(y) /\ H(x,y) ==> J(x,y))) ==> (exists x. P(x) /\ ~(exists y. G(y) /\ H(x,y)))>>;; ** -} {- ** and this let p46 = time presolution <<(forall x. P(x) /\ (forall y. P(y) /\ H(y,x) ==> G(y)) ==> G(x)) /\ ((exists x. P(x) /\ ~G(x)) ==> (exists x. P(x) /\ ~G(x) /\ (forall y. P(y) /\ ~G(y) ==> J(x,y)))) /\ (forall x y. P(x) /\ P(y) /\ H(x,y) ==> ~J(y,x)) ==> (forall x. P(x) ==> G(x))>>;; ** -} -- ------------------------------------------------------------------------- -- Example from Manthey and Bry, CADE-9. -- ------------------------------------------------------------------------- let p55 = time presolution < hates(x,y) /\ ~richer(x,y)) /\ (forall x. hates(agatha,x) ==> ~hates(charles,x)) /\ (hates(agatha,agatha) /\ hates(agatha,charles)) /\ (forall x. lives(x) /\ ~richer(x,agatha) ==> hates(butler,x)) /\ (forall x. hates(agatha,x) ==> hates(butler,x)) /\ (forall x. ~hates(x,agatha) \/ ~hates(x,butler) \/ ~hates(x,charles)) ==> killed(agatha,agatha) /\ ~killed(butler,agatha) /\ ~killed(charles,agatha)>>;; let p57 = time presolution < P(x,z)) ==> P(f(a,b),f(a,c))>>;; -- ------------------------------------------------------------------------- -- See info-hol, circa 1500. -- ------------------------------------------------------------------------- let p58 = time presolution < ((P(v) \/ R(w)) /\ (R(z) ==> Q(v))))>>;; let p59 = time presolution <<(forall x. P(x) <=> ~P(f(x))) ==> (exists x. P(x) /\ ~P(f(x)))>>;; let p60 = time presolution < exists y. (forall z. P(z,y) ==> P(z,f(x))) /\ P(x,y)>>;; -- ------------------------------------------------------------------------- -- From Gilmore's classic paper. -- ------------------------------------------------------------------------- let gilmore_1 = time presolution < G(y)) <=> F(x)) /\ ((F(y) ==> H(y)) <=> G(x)) /\ (((F(y) ==> G(y)) ==> H(y)) <=> H(x)) ==> F(z) /\ G(z) /\ H(z)>>;; {- ** This is not valid, according to Gilmore let gilmore_2 = time presolution < F(z,y)) /\ (F(z,y) <=> F(z,z)) /\ (F(x,y) <=> F(y,x)) ==> (F(x,y) <=> F(x,z))>>;; ** -} let gilmore_3 = time presolution < (G(y) ==> H(x))) ==> F(x,x)) /\ ((F(z,x) ==> G(x)) ==> H(z)) /\ F(x,y) ==> F(z,z)>>;; let gilmore_4 = time presolution < F(y,z) /\ F(z,z)) /\ (F(x,y) /\ G(x,y) ==> G(x,z) /\ G(z,z))>>;; let gilmore_5 = time presolution <<(forall x. exists y. F(x,y) \/ F(y,x)) /\ (forall x y. F(y,x) ==> F(y,y)) ==> exists z. F(z,z)>>;; let gilmore_6 = time presolution < G(v,u) /\ G(u,x)) ==> (exists u. forall v. F(u,y) ==> G(v,u) /\ G(u,y)) \/ (forall u v. exists w. G(v,u) \/ H(w,y,u) ==> G(u,w))>>;; let gilmore_7 = time presolution <<(forall x. K(x) ==> exists y. L(y) /\ (F(x,y) ==> G(x,y))) /\ (exists z. K(z) /\ forall u. L(u) ==> F(z,u)) ==> exists v w. K(v) /\ L(w) /\ G(v,w)>>;; let gilmore_8 = time presolution < (G(y) ==> (forall u. exists v. H(u,v,x)))) ==> F(x,x)) /\ ((F(z,x) ==> G(x)) ==> (forall u. exists v. H(u,v,z))) /\ F(x,y) ==> F(z,z)>>;; {- ** This one still isn't easy! let gilmore_9 = time presolution < (forall u. exists v. F(x,u,v) /\ G(z,u) /\ ~H(x,z)) ==> (forall u. exists v. F(x,u,v) /\ G(y,u) /\ ~H(x,y))) /\ ((forall u. exists v. F(x,u,v) /\ G(y,u) /\ ~H(x,y)) ==> ~(forall u. exists v. F(x,u,v) /\ G(z,u) /\ ~H(x,z)) ==> (forall u. exists v. F(y,u,v) /\ G(y,u) /\ ~H(y,x)) /\ (forall u. exists v. F(z,u,v) /\ G(y,u) /\ ~H(z,y)))>>;; ** -} -- ------------------------------------------------------------------------- -- Example from Davis-Putnam papers where Gilmore procedure is poor. -- ------------------------------------------------------------------------- let davis_putnam_example = time presolution < (F(y,z) /\ F(z,z))) /\ ((F(x,y) /\ G(x,y)) ==> (G(x,z) /\ G(z,z)))>>;; *********** -} END_INTERACTIVE;; -- ------------------------------------------------------------------------- -- Example -- ------------------------------------------------------------------------- START_INTERACTIVE;; let gilmore_1 = resolution < G(y)) <=> F(x)) /\ ((F(y) ==> H(y)) <=> G(x)) /\ (((F(y) ==> G(y)) ==> H(y)) <=> H(x)) ==> F(z) /\ G(z) /\ H(z)>>;; -- ------------------------------------------------------------------------- -- Pelletiers yet again. -- ------------------------------------------------------------------------- {- ************ let p1 = time resolution <

q <=> ~q ==> ~p>>;; let p2 = time resolution <<~ ~p <=> p>>;; let p3 = time resolution <<~(p ==> q) ==> q ==> p>>;; let p4 = time resolution <<~p ==> q <=> ~q ==> p>>;; let p5 = time resolution <<(p \/ q ==> p \/ r) ==> p \/ (q ==> r)>>;; let p6 = time resolution <

>;; let p7 = time resolution <

>;; let p8 = time resolution <<((p ==> q) ==> p) ==> p>>;; let p9 = time resolution <<(p \/ q) /\ (~p \/ q) /\ (p \/ ~q) ==> ~(~q \/ ~q)>>;; let p10 = time resolution <<(q ==> r) /\ (r ==> p /\ q) /\ (p ==> q /\ r) ==> (p <=> q)>>;; let p11 = time resolution <

p>>;; let p12 = time resolution <<((p <=> q) <=> r) <=> (p <=> (q <=> r))>>;; let p13 = time resolution <

(p \/ q) /\ (p \/ r)>>;; let p14 = time resolution <<(p <=> q) <=> (q \/ ~p) /\ (~q \/ p)>>;; let p15 = time resolution <

q <=> ~p \/ q>>;; let p16 = time resolution <<(p ==> q) \/ (q ==> p)>>;; let p17 = time resolution <

r) ==> s <=> (~p \/ q \/ s) /\ (~p \/ ~r \/ s)>>;; (* ------------------------------------------------------------------------- *) (* Monadic Predicate Logic. *) (* ------------------------------------------------------------------------- *) let p18 = time resolution < P(x)>>;; let p19 = time resolution < Q(z)) ==> P(x) ==> Q(x)>>;; let p20 = time resolution <<(forall x y. exists z. forall w. P(x) /\ Q(y) ==> R(z) /\ U(w)) ==> (exists x y. P(x) /\ Q(y)) ==> (exists z. R(z))>>;; let p21 = time resolution <<(exists x. P ==> Q(x)) /\ (exists x. Q(x) ==> P) ==> (exists x. P <=> Q(x))>>;; let p22 = time resolution <<(forall x. P <=> Q(x)) ==> (P <=> (forall x. Q(x)))>>;; let p23 = time resolution <<(forall x. P \/ Q(x)) <=> P \/ (forall x. Q(x))>>;; let p24 = time resolution <<~(exists x. U(x) /\ Q(x)) /\ (forall x. P(x) ==> Q(x) \/ R(x)) /\ ~(exists x. P(x) ==> (exists x. Q(x))) /\ (forall x. Q(x) /\ R(x) ==> U(x)) ==> (exists x. P(x) /\ R(x))>>;; let p25 = time resolution <<(exists x. P(x)) /\ (forall x. U(x) ==> ~G(x) /\ R(x)) /\ (forall x. P(x) ==> G(x) /\ U(x)) /\ ((forall x. P(x) ==> Q(x)) \/ (exists x. Q(x) /\ P(x))) ==> (exists x. Q(x) /\ P(x))>>;; let p26 = time resolution <<((exists x. P(x)) <=> (exists x. Q(x))) /\ (forall x y. P(x) /\ Q(y) ==> (R(x) <=> U(y))) ==> ((forall x. P(x) ==> R(x)) <=> (forall x. Q(x) ==> U(x)))>>;; let p27 = time resolution <<(exists x. P(x) /\ ~Q(x)) /\ (forall x. P(x) ==> R(x)) /\ (forall x. U(x) /\ V(x) ==> P(x)) /\ (exists x. R(x) /\ ~Q(x)) ==> (forall x. U(x) ==> ~R(x)) ==> (forall x. U(x) ==> ~V(x))>>;; let p28 = time resolution <<(forall x. P(x) ==> (forall x. Q(x))) /\ ((forall x. Q(x) \/ R(x)) ==> (exists x. Q(x) /\ R(x))) /\ ((exists x. R(x)) ==> (forall x. L(x) ==> M(x))) ==> (forall x. P(x) /\ L(x) ==> M(x))>>;; let p29 = time resolution <<(exists x. P(x)) /\ (exists x. G(x)) ==> ((forall x. P(x) ==> H(x)) /\ (forall x. G(x) ==> J(x)) <=> (forall x y. P(x) /\ G(y) ==> H(x) /\ J(y)))>>;; let p30 = time resolution <<(forall x. P(x) \/ G(x) ==> ~H(x)) /\ (forall x. (G(x) ==> ~U(x)) ==> P(x) /\ H(x)) ==> (forall x. U(x))>>;; let p31 = time resolution <<~(exists x. P(x) /\ (G(x) \/ H(x))) /\ (exists x. Q(x) /\ P(x)) /\ (forall x. ~H(x) ==> J(x)) ==> (exists x. Q(x) /\ J(x))>>;; let p32 = time resolution <<(forall x. P(x) /\ (G(x) \/ H(x)) ==> Q(x)) /\ (forall x. Q(x) /\ H(x) ==> J(x)) /\ (forall x. R(x) ==> H(x)) ==> (forall x. P(x) /\ R(x) ==> J(x))>>;; let p33 = time resolution <<(forall x. P(a) /\ (P(x) ==> P(b)) ==> P(c)) <=> (forall x. P(a) ==> P(x) \/ P(c)) /\ (P(a) ==> P(b) ==> P(c))>>;; let p34 = time resolution <<((exists x. forall y. P(x) <=> P(y)) <=> ((exists x. Q(x)) <=> (forall y. Q(y)))) <=> ((exists x. forall y. Q(x) <=> Q(y)) <=> ((exists x. P(x)) <=> (forall y. P(y))))>>;; let p35 = time resolution < (forall x y. P(x,y))>>;; (* ------------------------------------------------------------------------- *) (* Full predicate logic (without Identity and Functions) *) (* ------------------------------------------------------------------------- *) let p36 = time resolution <<(forall x. exists y. P(x,y)) /\ (forall x. exists y. G(x,y)) /\ (forall x y. P(x,y) \/ G(x,y) ==> (forall z. P(y,z) \/ G(y,z) ==> H(x,z))) ==> (forall x. exists y. H(x,y))>>;; let p37 = time resolution <<(forall z. exists w. forall x. exists y. (P(x,z) ==> P(y,w)) /\ P(y,z) /\ (P(y,w) ==> (exists u. Q(u,w)))) /\ (forall x z. ~P(x,z) ==> (exists y. Q(y,z))) /\ ((exists x y. Q(x,y)) ==> (forall x. R(x,x))) ==> (forall x. exists y. R(x,y))>>;; (*** This one seems too slow let p38 = time resolution <<(forall x. P(a) /\ (P(x) ==> (exists y. P(y) /\ R(x,y))) ==> (exists z w. P(z) /\ R(x,w) /\ R(w,z))) <=> (forall x. (~P(a) \/ P(x) \/ (exists z w. P(z) /\ R(x,w) /\ R(w,z))) /\ (~P(a) \/ ~(exists y. P(y) /\ R(x,y)) \/ (exists z w. P(z) /\ R(x,w) /\ R(w,z))))>>;; ***) let p39 = time resolution <<~(exists x. forall y. P(y,x) <=> ~P(y,y))>>;; let p40 = time resolution <<(exists y. forall x. P(x,y) <=> P(x,x)) ==> ~(forall x. exists y. forall z. P(z,y) <=> ~P(z,x))>>;; let p41 = time resolution <<(forall z. exists y. forall x. P(x,y) <=> P(x,z) /\ ~P(x,x)) ==> ~(exists z. forall x. P(x,z))>>;; (*** Also very slow let p42 = time resolution <<~(exists y. forall x. P(x,y) <=> ~(exists z. P(x,z) /\ P(z,x)))>>;; ***) (*** and this one too.. let p43 = time resolution <<(forall x y. Q(x,y) <=> forall z. P(z,x) <=> P(z,y)) ==> forall x y. Q(x,y) <=> Q(y,x)>>;; ***) let p44 = time resolution <<(forall x. P(x) ==> (exists y. G(y) /\ H(x,y)) /\ (exists y. G(y) /\ ~H(x,y))) /\ (exists x. J(x) /\ (forall y. G(y) ==> H(x,y))) ==> (exists x. J(x) /\ ~P(x))>>;; (*** and this... let p45 = time resolution <<(forall x. P(x) /\ (forall y. G(y) /\ H(x,y) ==> J(x,y)) ==> (forall y. G(y) /\ H(x,y) ==> R(y))) /\ ~(exists y. L(y) /\ R(y)) /\ (exists x. P(x) /\ (forall y. H(x,y) ==> L(y)) /\ (forall y. G(y) /\ H(x,y) ==> J(x,y))) ==> (exists x. P(x) /\ ~(exists y. G(y) /\ H(x,y)))>>;; ***) (*** and this let p46 = time resolution <<(forall x. P(x) /\ (forall y. P(y) /\ H(y,x) ==> G(y)) ==> G(x)) /\ ((exists x. P(x) /\ ~G(x)) ==> (exists x. P(x) /\ ~G(x) /\ (forall y. P(y) /\ ~G(y) ==> J(x,y)))) /\ (forall x y. P(x) /\ P(y) /\ H(x,y) ==> ~J(y,x)) ==> (forall x. P(x) ==> G(x))>>;; ***) (* ------------------------------------------------------------------------- *) (* Example from Manthey and Bry, CADE-9. *) (* ------------------------------------------------------------------------- *) let p55 = time resolution < hates(x,y) /\ ~richer(x,y)) /\ (forall x. hates(agatha,x) ==> ~hates(charles,x)) /\ (hates(agatha,agatha) /\ hates(agatha,charles)) /\ (forall x. lives(x) /\ ~richer(x,agatha) ==> hates(butler,x)) /\ (forall x. hates(agatha,x) ==> hates(butler,x)) /\ (forall x. ~hates(x,agatha) \/ ~hates(x,butler) \/ ~hates(x,charles)) ==> killed(agatha,agatha) /\ ~killed(butler,agatha) /\ ~killed(charles,agatha)>>;; let p57 = time resolution < P(x,z)) ==> P(f(a,b),f(a,c))>>;; (* ------------------------------------------------------------------------- *) (* See info-hol, circa 1500. *) (* ------------------------------------------------------------------------- *) let p58 = time resolution < ((P(v) \/ R(w)) /\ (R(z) ==> Q(v))))>>;; let p59 = time resolution <<(forall x. P(x) <=> ~P(f(x))) ==> (exists x. P(x) /\ ~P(f(x)))>>;; let p60 = time resolution < exists y. (forall z. P(z,y) ==> P(z,f(x))) /\ P(x,y)>>;; (* ------------------------------------------------------------------------- *) (* From Gilmore's classic paper. *) (* ------------------------------------------------------------------------- *) let gilmore_1 = time resolution < G(y)) <=> F(x)) /\ ((F(y) ==> H(y)) <=> G(x)) /\ (((F(y) ==> G(y)) ==> H(y)) <=> H(x)) ==> F(z) /\ G(z) /\ H(z)>>;; (*** This is not valid, according to Gilmore let gilmore_2 = time resolution < F(z,y)) /\ (F(z,y) <=> F(z,z)) /\ (F(x,y) <=> F(y,x)) ==> (F(x,y) <=> F(x,z))>>;; ***) let gilmore_3 = time resolution < (G(y) ==> H(x))) ==> F(x,x)) /\ ((F(z,x) ==> G(x)) ==> H(z)) /\ F(x,y) ==> F(z,z)>>;; let gilmore_4 = time resolution < F(y,z) /\ F(z,z)) /\ (F(x,y) /\ G(x,y) ==> G(x,z) /\ G(z,z))>>;; let gilmore_5 = time resolution <<(forall x. exists y. F(x,y) \/ F(y,x)) /\ (forall x y. F(y,x) ==> F(y,y)) ==> exists z. F(z,z)>>;; let gilmore_6 = time resolution < G(v,u) /\ G(u,x)) ==> (exists u. forall v. F(u,y) ==> G(v,u) /\ G(u,y)) \/ (forall u v. exists w. G(v,u) \/ H(w,y,u) ==> G(u,w))>>;; let gilmore_7 = time resolution <<(forall x. K(x) ==> exists y. L(y) /\ (F(x,y) ==> G(x,y))) /\ (exists z. K(z) /\ forall u. L(u) ==> F(z,u)) ==> exists v w. K(v) /\ L(w) /\ G(v,w)>>;; let gilmore_8 = time resolution < (G(y) ==> (forall u. exists v. H(u,v,x)))) ==> F(x,x)) /\ ((F(z,x) ==> G(x)) ==> (forall u. exists v. H(u,v,z))) /\ F(x,y) ==> F(z,z)>>;; (*** This one still isn't easy! let gilmore_9 = time resolution < (forall u. exists v. F(x,u,v) /\ G(z,u) /\ ~H(x,z)) ==> (forall u. exists v. F(x,u,v) /\ G(y,u) /\ ~H(x,y))) /\ ((forall u. exists v. F(x,u,v) /\ G(y,u) /\ ~H(x,y)) ==> ~(forall u. exists v. F(x,u,v) /\ G(z,u) /\ ~H(x,z)) ==> (forall u. exists v. F(y,u,v) /\ G(y,u) /\ ~H(y,x)) /\ (forall u. exists v. F(z,u,v) /\ G(y,u) /\ ~H(z,y)))>>;; ***) (* ------------------------------------------------------------------------- *) (* Example from Davis-Putnam papers where Gilmore procedure is poor. *) (* ------------------------------------------------------------------------- *) let davis_putnam_example = time resolution < (F(y,z) /\ F(z,z))) /\ ((F(x,y) /\ G(x,y)) ==> (G(x,z) /\ G(z,z)))>>;; (* ------------------------------------------------------------------------- *) (* The (in)famous Los problem. *) (* ------------------------------------------------------------------------- *) let los = time resolution <<(forall x y z. P(x,y) ==> P(y,z) ==> P(x,z)) /\ (forall x y z. Q(x,y) ==> Q(y,z) ==> Q(x,z)) /\ (forall x y. Q(x,y) ==> Q(y,x)) /\ (forall x y. P(x,y) \/ Q(x,y)) ==> (forall x y. P(x,y)) \/ (forall x y. Q(x,y))>>;; ************* -} END_INTERACTIVE;; -}