module Folly.Resolution(isValid,
isValid',
standardSkolem,
maxClause) where
import Data.List as L
import Data.Maybe
import Data.Set as S
import Folly.Clause as C
import Folly.Formula
import Folly.Theorem
isValid :: Theorem -> Bool
isValid t =
case isValid' maxClause standardSkolem t of
Just _ -> True
Nothing -> False
maxClause cs = S.findMax cs
standardSkolem t = deleteTautologies $ clauseSet
where
formulas = (neg (conclusion t)) : (hypothesis t)
clauses = L.map (givenClause . S.fromList) $ toClausalForm $ L.foldr (\l r -> con l r) (head formulas) (tail formulas)
clauseSet = S.fromList clauses
isValid' :: (Set Clause -> Clause) ->
(Theorem -> Set Clause) ->
Theorem -> Maybe Clause
isValid' s p t =
case S.size clauses == 0 of
True -> Nothing
False ->
case S.member C.empty clauses of
True -> S.lookupGE C.empty clauses
False -> resolve s (S.singleton (s clauses)) (S.delete (s clauses) clauses)
where
clauses = p t
resolve :: (Set Clause -> Clause) -> Set Clause -> Set Clause -> Maybe Clause
resolve s axioms cls =
case S.member C.empty cls of
True -> S.lookupGE C.empty cls
False -> case S.size cls == 0 of
True -> Nothing
False ->
let c = s cls
newClauses = genNewClauses c axioms
nextAxioms = S.insert c axioms
nextCls = S.delete c $ S.union newClauses cls in
resolve s nextAxioms nextCls
genNewClauses c cls =
S.fold S.union S.empty $ S.map (\x -> S.union (resolvedClauses c x) (resolvedClauses x c)) (S.delete c cls)