@@ -17,7 +17,6 @@ module Kore.Internal.SideCondition
17
17
, top
18
18
, topTODO
19
19
, toPredicate
20
- , isNormalized
21
20
, toRepresentation
22
21
) where
23
22
@@ -37,10 +36,14 @@ import Kore.Internal.Condition
37
36
( Condition
38
37
)
39
38
import qualified Kore.Internal.Condition as Condition
40
- import qualified Kore.Internal.Conditional as Conditional
39
+ import Kore.Internal.MultiAnd
40
+ ( MultiAnd
41
+ )
42
+ import qualified Kore.Internal.MultiAnd as MultiAnd
41
43
import Kore.Internal.Predicate
42
44
( Predicate
43
45
)
46
+ import qualified Kore.Internal.Predicate as Predicate
44
47
import Kore.Internal.SideCondition.SideCondition as SideCondition
45
48
import Kore.Internal.Variable
46
49
( InternalVariable
@@ -65,10 +68,11 @@ other purposes, say, to remove redundant parts of the result predicate.
65
68
-}
66
69
newtype SideCondition variable =
67
70
SideCondition
68
- { assumedTrue :: Condition variable
71
+ { assumedTrue :: MultiAnd ( Predicate variable )
69
72
}
70
73
deriving (Eq , Ord , Show )
71
74
deriving (GHC.Generic )
75
+ deriving newtype (Semigroup , Monoid )
72
76
deriving anyclass (Hashable , NFData )
73
77
deriving anyclass (SOP.Generic , SOP.HasDatatypeInfo )
74
78
deriving anyclass (Debug )
@@ -91,97 +95,112 @@ instance TopBottom (SideCondition variable) where
91
95
where
92
96
SideCondition {assumedTrue} = sideCondition
93
97
94
- instance InternalVariable variable
95
- => HasFreeVariables (SideCondition variable ) variable
98
+ instance Ord variable => HasFreeVariables (SideCondition variable ) variable
96
99
where
97
- freeVariables sideCondition@ (SideCondition _) =
98
- freeVariables assumedTrue
99
- where
100
- SideCondition {assumedTrue} = sideCondition
100
+ freeVariables (SideCondition multiAnd) =
101
+ freeVariables multiAnd
101
102
102
103
instance InternalVariable variable => Unparse (SideCondition variable ) where
103
- unparse sideCondition@ (SideCondition _) =
104
- unparse assumedTrue
105
- where
106
- SideCondition {assumedTrue} = sideCondition
107
-
108
- unparse2 sideCondition@ (SideCondition _) =
109
- unparse2 assumedTrue
110
- where
111
- SideCondition {assumedTrue} = sideCondition
104
+ unparse = unparse . toPredicate
105
+ unparse2 = unparse2 . toPredicate
112
106
113
- instance From (Condition variable ) (SideCondition variable )
107
+ instance From (SideCondition variable ) (MultiAnd ( Predicate variable ) )
114
108
where
115
- from = SideCondition
109
+ from condition@ (SideCondition _) = assumedTrue condition
110
+ {-# INLINE from #-}
116
111
117
- instance From (SideCondition variable ) (Condition variable ) where
118
- from = assumedTrue
112
+ instance From (MultiAnd (Predicate variable )) (SideCondition variable )
113
+ where
114
+ from = SideCondition
119
115
{-# INLINE from #-}
120
116
121
117
instance
122
118
InternalVariable variable
123
119
=> From (SideCondition variable ) (Predicate variable )
124
120
where
125
- from = from @ ( Condition variable ) . from @ ( SideCondition variable )
121
+ from = toPredicate
126
122
{-# INLINE from #-}
127
123
128
124
instance
129
125
InternalVariable variable
130
126
=> From (Predicate variable ) (SideCondition variable )
131
127
where
132
- from = from @ (Condition variable ) . from @ (Predicate variable )
128
+ from = fromPredicate
129
+ {-# INLINE from #-}
130
+
131
+ instance InternalVariable variable =>
132
+ From (Condition variable ) (SideCondition variable )
133
+ where
134
+ from = fromCondition
135
+ {-# INLINE from #-}
136
+
137
+ instance InternalVariable variable =>
138
+ From (SideCondition variable ) (Condition variable )
139
+ where
140
+ from = Condition. fromPredicate . toPredicate
133
141
{-# INLINE from #-}
134
142
135
- top :: InternalVariable variable => SideCondition variable
136
- top = fromCondition Condition . top
143
+ top :: SideCondition variable
144
+ top = SideCondition MultiAnd . top
137
145
138
146
-- | A 'top' 'Condition' for refactoring which should eventually be removed.
139
- topTODO :: InternalVariable variable => SideCondition variable
147
+ topTODO :: SideCondition variable
140
148
topTODO = top
141
149
142
150
andCondition
143
151
:: InternalVariable variable
144
152
=> SideCondition variable
145
153
-> Condition variable
146
154
-> SideCondition variable
147
- andCondition SideCondition { assumedTrue } newCondition =
148
- SideCondition merged
149
- where
150
- merged = assumedTrue `Condition.andCondition` newCondition
155
+ andCondition
156
+ sideCondition
157
+ (from @ (Condition _ ) @ (SideCondition _ ) -> newSideCondition)
158
+ =
159
+ newSideCondition <> sideCondition
151
160
152
- assumeTrueCondition :: Condition variable -> SideCondition variable
161
+ assumeTrueCondition
162
+ :: InternalVariable variable
163
+ => Condition variable
164
+ -> SideCondition variable
153
165
assumeTrueCondition = fromCondition
154
166
155
167
assumeTruePredicate
156
- :: InternalVariable variable => Predicate variable -> SideCondition variable
157
- assumeTruePredicate predicate =
158
- assumeTrueCondition (Condition. fromPredicate predicate)
168
+ :: InternalVariable variable
169
+ => Predicate variable
170
+ -> SideCondition variable
171
+ assumeTruePredicate = fromPredicate
159
172
160
173
toPredicate
161
174
:: InternalVariable variable
162
175
=> SideCondition variable
163
176
-> Predicate variable
164
177
toPredicate condition@ (SideCondition _) =
165
- Condition . toPredicate assumedTrue
178
+ MultiAnd . toPredicate assumedTrue
166
179
where
167
180
SideCondition { assumedTrue } = condition
168
181
182
+ fromPredicate
183
+ :: InternalVariable variable
184
+ => Predicate variable
185
+ -> SideCondition variable
186
+ fromPredicate = SideCondition . MultiAnd. fromPredicate
187
+
169
188
mapVariables
170
189
:: (InternalVariable variable1 , InternalVariable variable2 )
171
190
=> AdjSomeVariableName (variable1 -> variable2 )
172
191
-> SideCondition variable1
173
192
-> SideCondition variable2
174
193
mapVariables adj condition@ (SideCondition _) =
175
- fromCondition (Condition. mapVariables adj assumedTrue)
194
+ MultiAnd. map (Predicate. mapVariables adj) assumedTrue
195
+ & SideCondition
176
196
where
177
197
SideCondition { assumedTrue } = condition
178
198
179
- fromCondition :: Condition variable -> SideCondition variable
180
- fromCondition = from
181
-
182
- fromPredicate
183
- :: InternalVariable variable => Predicate variable -> SideCondition variable
184
- fromPredicate = fromCondition . from
199
+ fromCondition
200
+ :: InternalVariable variable
201
+ => Condition variable
202
+ -> SideCondition variable
203
+ fromCondition = fromPredicate . Condition. toPredicate
185
204
186
205
toRepresentation
187
206
:: InternalVariable variable
@@ -190,6 +209,3 @@ toRepresentation
190
209
toRepresentation =
191
210
mkRepresentation
192
211
. mapVariables @ _ @ VariableName (pure toVariableName)
193
-
194
- isNormalized :: forall variable . Ord variable => SideCondition variable -> Bool
195
- isNormalized = Conditional. isNormalized . from @ _ @ (Condition variable )
0 commit comments