Skip to content

Instantly share code, notes, and snippets.

@the-sofi-uwu
Created March 31, 2021 21:54
Show Gist options
  • Save the-sofi-uwu/c3a1b1bc27b7bebc4f4baeaa59378790 to your computer and use it in GitHub Desktop.
Save the-sofi-uwu/c3a1b1bc27b7bebc4f4baeaa59378790 to your computer and use it in GitHub Desktop.
Boolean equation simplifier in Haskell
module Main where
data Cuit
= Cuit :+: Cuit
| Cuit :*: Cuit
| Neg Cuit
| Var String
(-|) = Neg
instance Show Cuit where
show (a :+: b) = "(" ++ show a ++ "+" ++ show b ++ ")"
show (a :*: b) = "(" ++ show a ++ "." ++ show b ++ ")"
show (Neg a) = show a ++ "'"
show (Var a) = a
instance Eq Cuit where
(a :+: b) == (a1 :+: b1) = (a == a1) && (b == b1)
(a :*: b) == (a1 :*: b1) = (a == a1) && (b == b1)
(Neg a) == (Neg b) = a == b
(Var a) == (Var b) = a == b
search :: Eq a => [(a,b)] -> a -> Maybe b
search list name =
let res = filter ((== name) . fst) list in
if null res then
Nothing
else
Just $ snd $ head res
solve :: Cuit -> [(String, Cuit)] -> Cuit
solve (a :+: b) list =
case (solve a list, solve b list) of
(la :*: ra, lb :*: rb) | la == lb -> la :*: (ra :+: rb)
(a,b) -> a :+: b
solve (a :*: b) list = solve a list :*: solve b list
solve (Neg a) list = Neg (solve a list)
solve (Var a) list =
case search list a of
Just a -> solve a list
Nothing -> Var a
-- Definitions
main :: IO ()
main = print $
solve (Var "X" :+: Var "Y")
[("X", Var "W" :*: Var "a")
,("Y", Var "W" :*: (-|) (Var "b"))
,("W", Var "U" :+: Var "V")
,("U", Var "T" :+: (-|) (Var "a"))
,("V", Var "T" :*: (-|) (Var "b"))
,("T", Var "b" :+: (-|) (Var "a"))]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment