module SatDef where data P a = Var a | Not (P a) | P a :&: P a | P a :|: P a deriving (Eq, Show) infixr 3 :&: infixr 2 :|: -- Structural recursion so you don't have to repeat it all the time! foldP :: (a -> r) -> (r -> r) -> (r -> r -> r) -> (r -> r -> r) -> P a -> r foldP var neg and or = go where go (Var a) = var a go (Not p) = neg (go p) go (p :&: q) = and (go p) (go q) go (p :|: q) = or (go p) (go q)