module Problems.Logic (
BoolFunc,
printTable,
printTablen,
Functions (Functions, getTable, getAnd, getOr, getNand, getNor, getXor, getImpl, getEqu),
Formula (..),
evaluateFormula
) where
import Control.DeepSeq
import Data.List (sort)
import Data.Map (Map, (!))
import GHC.Generics (Generic)
type BoolFunc = Bool -> Bool -> Bool
printTable :: [(Bool, Bool, Bool)] -> IO ()
printTable :: [(Bool, Bool, Bool)] -> IO ()
printTable [(Bool, Bool, Bool)]
ts = forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> IO ()
putStrLn forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Bool, Bool, Bool) -> String
showRow) forall a b. (a -> b) -> a -> b
$ forall a. Ord a => [a] -> [a]
sort [(Bool, Bool, Bool)]
ts
where showRow :: (Bool, Bool, Bool) -> String
showRow (Bool
a, Bool
b, Bool
c) = Bool -> String
showBool Bool
a forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ Bool -> String
showBool Bool
b forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ Bool -> String
showBool Bool
c
showBool :: Bool -> String
showBool Bool
a = if Bool
a then String
"True " else String
"False"
printTablen :: [[Bool]] -> IO ()
printTablen :: [[Bool]] -> IO ()
printTablen [[Bool]]
t = forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> IO ()
putStrLn forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Bool] -> String
showRow) forall a b. (a -> b) -> a -> b
$ forall a. Ord a => [a] -> [a]
sort [[Bool]]
t
where showRow :: [Bool] -> String
showRow [Bool]
xs = [String] -> String
unwords forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map Bool -> String
showBool [Bool]
xs
showBool :: Bool -> String
showBool Bool
a = if Bool
a then String
"True " else String
"False"
data Functions = Functions { Functions -> (Bool -> Bool -> Bool) -> [(Bool, Bool, Bool)]
getTable :: (Bool -> Bool -> Bool) -> [(Bool, Bool, Bool)]
, Functions -> Bool -> Bool -> Bool
getAnd :: Bool -> Bool -> Bool
, Functions -> Bool -> Bool -> Bool
getOr :: Bool -> Bool -> Bool
, Functions -> Bool -> Bool -> Bool
getNand :: Bool -> Bool -> Bool
, Functions -> Bool -> Bool -> Bool
getNor :: Bool -> Bool -> Bool
, Functions -> Bool -> Bool -> Bool
getXor :: Bool -> Bool -> Bool
, Functions -> Bool -> Bool -> Bool
getImpl :: Bool -> Bool -> Bool
, Functions -> Bool -> Bool -> Bool
getEqu :: Bool -> Bool -> Bool
}
data Formula
= Value Bool
| Variable String
| Complement Formula
| Disjoin [Formula]
| Conjoin [Formula]
deriving (Formula -> Formula -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Formula -> Formula -> Bool
$c/= :: Formula -> Formula -> Bool
== :: Formula -> Formula -> Bool
$c== :: Formula -> Formula -> Bool
Eq, Eq Formula
Formula -> Formula -> Bool
Formula -> Formula -> Ordering
Formula -> Formula -> Formula
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Formula -> Formula -> Formula
$cmin :: Formula -> Formula -> Formula
max :: Formula -> Formula -> Formula
$cmax :: Formula -> Formula -> Formula
>= :: Formula -> Formula -> Bool
$c>= :: Formula -> Formula -> Bool
> :: Formula -> Formula -> Bool
$c> :: Formula -> Formula -> Bool
<= :: Formula -> Formula -> Bool
$c<= :: Formula -> Formula -> Bool
< :: Formula -> Formula -> Bool
$c< :: Formula -> Formula -> Bool
compare :: Formula -> Formula -> Ordering
$ccompare :: Formula -> Formula -> Ordering
Ord, Int -> Formula -> ShowS
[Formula] -> ShowS
Formula -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Formula] -> ShowS
$cshowList :: [Formula] -> ShowS
show :: Formula -> String
$cshow :: Formula -> String
showsPrec :: Int -> Formula -> ShowS
$cshowsPrec :: Int -> Formula -> ShowS
Show, forall x. Rep Formula x -> Formula
forall x. Formula -> Rep Formula x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Formula x -> Formula
$cfrom :: forall x. Formula -> Rep Formula x
Generic, Formula -> ()
forall a. (a -> ()) -> NFData a
rnf :: Formula -> ()
$crnf :: Formula -> ()
NFData)
evaluateFormula :: Map String Bool -> Formula -> Bool
evaluateFormula :: Map String Bool -> Formula -> Bool
evaluateFormula Map String Bool
_ (Value Bool
x) = Bool
x
evaluateFormula Map String Bool
m (Variable String
s) = Map String Bool
m forall k a. Ord k => Map k a -> k -> a
! String
s
evaluateFormula Map String Bool
m (Complement Formula
f) = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ Map String Bool -> Formula -> Bool
evaluateFormula Map String Bool
m Formula
f
evaluateFormula Map String Bool
m (Disjoin [Formula]
fs) = forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Map String Bool -> Formula -> Bool
evaluateFormula Map String Bool
m) [Formula]
fs
evaluateFormula Map String Bool
m (Conjoin [Formula]
fs) = forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Map String Bool -> Formula -> Bool
evaluateFormula Map String Bool
m) [Formula]
fs