Last active
June 3, 2024 12:58
-
-
Save KiJeong-Lim/fefc763831be9a52c85d987479af1149 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Main where | |
type Lit = Int | |
data Expr | |
= And Expr Expr | |
| Xor Expr Expr | |
| Add Expr Expr | |
| Zero | |
| Unit | |
| Lit Lit | |
deriving (Eq, Ord, Show) | |
cond :: Int -> Bool | |
cond l = go where | |
xor :: Bool -> Bool -> Bool | |
True `xor` True = False | |
True `xor` False = True | |
False `xor` True = True | |
False `xor` False = False | |
evalExpr :: (Lit -> Bool) -> Expr -> Bool | |
evalExpr env (And e1 e2) = evalExpr env e1 && evalExpr env e2 | |
evalExpr env (Xor e1 e2) = evalExpr env e1 `xor` evalExpr env e2 | |
evalExpr env (Add e1 e2) = evalExpr env e1 || evalExpr env e2 | |
evalExpr env (Zero) = False | |
evalExpr env (Unit) = True | |
evalExpr env (Lit i) = env i | |
mkEnv :: Int -> [Lit -> Bool] | |
mkEnv 0 = return $ \i -> False | |
mkEnv n = do | |
let n' = pred n | |
env <- mkEnv n' | |
b <- [True, False] | |
return $ \i -> if i == n' then b else env i | |
go :: Bool | |
go = xors [ evalExpr env (And (Lit 0) (Lit 1)) | env <- mkEnv 2, env 0 /= env 1 ] | |
xors :: [Bool] -> Bool | |
xors = foldr xor False | |
goal :: Int -> Bool | |
goal l = go where | |
xor :: Bool -> Bool -> Bool | |
True `xor` True = False | |
True `xor` False = True | |
False `xor` True = True | |
False `xor` False = False | |
evalExpr :: (Lit -> Bool) -> Expr -> Bool | |
evalExpr env (And e1 e2) = evalExpr env e1 && evalExpr env e2 | |
evalExpr env (Xor e1 e2) = evalExpr env e1 `xor` evalExpr env e2 | |
evalExpr env (Add e1 e2) = evalExpr env e1 || evalExpr env e2 | |
evalExpr env (Zero) = False | |
evalExpr env (Unit) = True | |
evalExpr env (Lit i) = env i | |
mkEnv :: Int -> [Lit -> Bool] | |
mkEnv 0 = return $ \i -> False | |
mkEnv n = do | |
let n' = pred n | |
env <- mkEnv n' | |
b <- [True, False] | |
return $ \i -> if i == n' then b else env i | |
go :: Bool | |
go = and [ evalExpr env (And (Lit 0) (Lit 1)) | env <- mkEnv 2, env 0 /= env 1 ] | |
main :: IO () | |
main = print [cond 5, cond 6, test 5, test 6] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment