Property.hs 3.96 KB
Newer Older
Philipp Meyer's avatar
Philipp Meyer committed
1
2
3
4
5
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}

module Property
    (Property(..),
     Formula(..),
6
7
8
     QuantFormula(..),
     quantifiedVariables,
     innerFormula,
Philipp Meyer's avatar
Philipp Meyer committed
9
     Op(..),
10
11
12
13
     Term(..),
     PropResult(..),
     resultAnd,
     resultOr,
14
     resultNot,
15
16
     resultsAnd,
     resultsOr)
Philipp Meyer's avatar
Philipp Meyer committed
17
18
where

19
20
21
22
23
24
25
26
27
28
29
data Term a =
          Var a
        | Const Integer
        | Minus (Term a)
        | Term a :+: Term a
        | Term a :-: Term a
        | Term a :*: Term a
        deriving (Eq)

instance (Show a) => Show (Term a) where
        show (Var x) = show x
30
        show (Const c) = show c
31
32
33
34
        show (Minus t) = "-" ++ show t
        show (t :+: u) = "(" ++ show t ++ " + " ++ show u ++ ")"
        show (t :-: u) = "(" ++ show t ++ " - " ++ show u ++ ")"
        show (t :*: u) = show t ++ " * " ++ show u
Philipp Meyer's avatar
Philipp Meyer committed
35

36
37
38
39
40
41
42
instance Functor Term where
        fmap f (Var x) = Var (f x)
        fmap _ (Const c) = Const c
        fmap f (Minus t) = Minus (fmap f t)
        fmap f (t :+: u) = fmap f t :+: fmap f u
        fmap f (t :-: u) = fmap f t :-: fmap f u
        fmap f (t :*: u) = fmap f t :*: fmap f u
43

44
data Op = Gt | Ge | Eq | Ne | Le | Lt deriving (Eq)
Philipp Meyer's avatar
Philipp Meyer committed
45
46
47

instance Show Op where
        show Gt = ">"
48
        show Ge = "≥"
Philipp Meyer's avatar
Philipp Meyer committed
49
        show Eq = "="
50
        show Ne = "≠"
51
        show Le = "≤"
Philipp Meyer's avatar
Philipp Meyer committed
52
53
        show Lt = "<"

54
55
56
data QuantFormula a = ExQuantFormula [a] (Formula a)
             deriving (Eq)

57
58
59
60
61
62
data Formula a =
          FTrue | FFalse
        | LinearInequation (Term a) Op (Term a)
        | Neg (Formula a)
        | Formula a :&: Formula a
        | Formula a :|: Formula a
63
             deriving (Eq)
Philipp Meyer's avatar
Philipp Meyer committed
64
65
66
67

infixr 3 :&:
infixr 2 :|:

68
69
70
71
72
73
74
75
76
77
quantifiedVariables :: QuantFormula a -> [a]
quantifiedVariables (ExQuantFormula xs _) = xs

innerFormula :: QuantFormula a -> Formula a
innerFormula (ExQuantFormula _ p) = p

instance (Show a) => Show (QuantFormula a) where
        show (ExQuantFormula [] p) = show p
        show (ExQuantFormula ps p) = "∃" ++ unwords (map show ps) ++ ": " ++ show p

78
instance (Show a) => Show (Formula a) where
79
80
        show FTrue = "true"
        show FFalse = "false"
81
82
        show (LinearInequation lhs op rhs) =
            show lhs ++ " " ++ show op ++ " " ++ show rhs
83
        show (Neg p) = "¬" ++ "(" ++ show p ++ ")"
Philipp Meyer's avatar
Philipp Meyer committed
84
85
86
        show (p :&: q) = "(" ++ show p ++ " ∧ " ++ show q ++ ")"
        show (p :|: q) = "(" ++ show p ++ " ∨ " ++ show q ++ ")"

87
88
89
instance Functor QuantFormula where
        fmap f (ExQuantFormula xs p) = ExQuantFormula (fmap f xs) (fmap f p)

90
91
92
93
94
95
96
97
instance Functor Formula where
        fmap _ FTrue = FTrue
        fmap _ FFalse = FFalse
        fmap f (LinearInequation lhs op rhs) =
                LinearInequation (fmap f lhs) op (fmap f rhs)
        fmap f (Neg p) = Neg (fmap f p)
        fmap f (p :&: q) = fmap f p :&: fmap f q
        fmap f (p :|: q) = fmap f p :|: fmap f q
98

99
data Property = LayeredTermination
Philipp Meyer's avatar
Philipp Meyer committed
100
              | StrongConsensus
101
              | StrongConsensusWithCorrectness
Philipp Meyer's avatar
Philipp Meyer committed
102

Philipp Meyer's avatar
Philipp Meyer committed
103
104
105
instance Show Property where
        show LayeredTermination = "layered termination"
        show StrongConsensus = "strong consensus"
106
        show StrongConsensusWithCorrectness = "strong consensus with correctness"
Philipp Meyer's avatar
Philipp Meyer committed
107

Philipp Meyer's avatar
Philipp Meyer committed
108
data PropResult = Satisfied | Unsatisfied | Unknown deriving (Eq)
Philipp Meyer's avatar
Philipp Meyer committed
109

Philipp Meyer's avatar
Philipp Meyer committed
110
111
112
113
instance Show PropResult where
        show Satisfied = "satisfied"
        show Unsatisfied = "not satisfied"
        show Unknown = "may not be satisfied"
114
115
116
117
118
119
120
121
122
123
124
125
126

resultAnd :: PropResult -> PropResult -> PropResult
resultAnd Satisfied x = x
resultAnd Unsatisfied _ = Unsatisfied
resultAnd _ Unsatisfied = Unsatisfied
resultAnd Unknown _ = Unknown

resultOr :: PropResult -> PropResult -> PropResult
resultOr Satisfied _ = Satisfied
resultOr _ Satisfied = Satisfied
resultOr Unsatisfied x = x
resultOr Unknown _ = Unknown

127
128
129
130
131
resultNot :: PropResult -> PropResult
resultNot Satisfied = Unsatisfied
resultNot Unsatisfied = Unsatisfied
resultNot Unknown = Unknown

132
133
134
135
136
resultsAnd :: [PropResult] -> PropResult
resultsAnd = foldr resultAnd Satisfied

resultsOr :: [PropResult] -> PropResult
resultsOr = foldr resultOr Unsatisfied