Skip to content
Snippets Groups Projects
LogicalExpression.hs 1.49 KiB
Newer Older
  • Learn to ignore specific revisions
  • Bart Wijgers's avatar
    Bart Wijgers committed
    module WLP.LogicalExpression
      ( LogicalExpression(..)
      , replace
      )
    where
    
    import WLP.MathExpression (MathExpression, replaceInExpr)
    
    data LogicalExpression
      = Constant Bool
      | Variable String
      | Expression MathExpression
      | Not LogicalExpression
      | LogicalExpression :/\: LogicalExpression
      | LogicalExpression :\/: LogicalExpression
      | LogicalExpression :=>: LogicalExpression
      | LogicalExpression :<=>: LogicalExpression
    
    instance Show LogicalExpression where
      show (Constant x)   = show x
      show (Variable s)   = s
      show (Expression e) = "(" ++ show e ++ ")"
      show (Not le)       = "!" ++ show le
    
      show (e1 :/\: e2)   = "(" ++ show e1 ++ ") /\\ (" ++ show e2 ++ ")"
      show (e1 :\/: e2)   = "(" ++ show e1 ++ ") \\/ (" ++ show e2 ++ ")"
      show (e1 :=>: e2)   = "(" ++ show e1 ++  ") => (" ++ show e2 ++ ")"
      show (e1 :<=>: e2)  = "(" ++ show e1 ++ ") <=> (" ++ show e2 ++ ")"
    
    -- | Substitutes the variable given by the string with the value given in the expression.
    replace :: String -> MathExpression -> LogicalExpression -> LogicalExpression
    replace _   _ x@(Constant _) = x
    replace var e x@(Variable v) = if v == var then Expression e else x
    replace var e x@(Expression expr) = Expression $ replaceInExpr var e expr
    replace var e x@(e1 :/\: e2) = replace var e e1 :/\: replace var e e2
    replace var e x@(e1 :\/: e2) = replace var e e1 :/\: replace var e e2
    replace var e x@(e1 :=>: e2) = replace var e e1 :=>: replace var e e2
    replace var e x@(e1 :<=>: e2) = replace var e e1 :<=>: replace var e e2