tern_solver/Ternary/Statement.hs

34 lines
1.6 KiB
Haskell

module Ternary.Statement (Statement(..), st) where
import Ternary.Term (Vee, Term(..), Item(..))
data StatementKind = A | I | E | O | A' | I' | E' | O' deriving (Eq, Show, Read)
data Statement a = Statement StatementKind a a deriving (Eq, Read)
instance Show a => Show (Statement a) where
show (Statement A x y) = "Every " ++ show x ++ " is " ++ show y
show (Statement I x y) = "Some of " ++ show x ++ " is " ++ show y
show (Statement E x y) = "None of " ++ show x ++ " is " ++ show y
show (Statement O x y) = "Some of " ++ show x ++ " isn't " ++ show y
show (Statement A' x y) = "Every non-" ++ show x ++ " is " ++ show y
show (Statement I' x y) = "Some of non-" ++ show x ++ " is " ++ show y
show (Statement E' x y) = "None of non-" ++ show x ++ " is " ++ show y
show (Statement O' x y) = "Some of non-" ++ show x ++ " isn't " ++ show y
inv :: (Eq a) => Term a -> Term a
inv (Term p x) = Term (not p) x
i :: (Eq a) => Bool -> Term a -> Term a -> Vee a
i v x y
| x == inv y = error "x and not x under the same Vee, refusing to calculate"
| x /= y = Term v . Item $ [x, y]
| x == y = Term v . Item $ [x]
st :: (Eq a) => Statement a -> Vee a
st (Statement A x y) = i False (Term True x) (Term False y)
st (Statement I x y) = i True (Term True x) (Term True y)
st (Statement E x y) = i False (Term True x) (Term True y)
st (Statement O x y) = i True (Term True x) (Term False y)
st (Statement A' x y) = i False (Term False x) (Term False y)
st (Statement I' x y) = i True (Term False x) (Term True y)
st (Statement E' x y) = i False (Term False x) (Term True y)
st (Statement O' x y) = i True (Term False x) (Term False y)