Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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