@@ -94,6 +94,7 @@ import SMT (
94
94
)
95
95
import SMT qualified
96
96
import SMT.SimpleSMT qualified as SimpleSMT
97
+ import SMT.Utils qualified as SMT
97
98
98
99
{- | Attempt to evaluate the 'Predicate' argument with an optional side
99
100
condition using an external SMT solver.
@@ -109,11 +110,13 @@ evalPredicate onUnknown predicate sideConditionM = case predicate of
109
110
Predicate. PredicateFalse -> return $ Just False
110
111
_ -> case sideConditionM of
111
112
Nothing ->
112
- predicate :| []
113
- & decidePredicate onUnknown SideCondition. top
113
+ decidePredicate onUnknown SideCondition. top [] predicate
114
114
Just sideCondition ->
115
- predicate :| [from @ _ @ (Predicate _ ) sideCondition]
116
- & decidePredicate onUnknown sideCondition
115
+ decidePredicate
116
+ onUnknown
117
+ sideCondition
118
+ (Predicate. getMultiAndPredicate $ from @ _ @ (Predicate _ ) sideCondition)
119
+ predicate
117
120
118
121
{- | Attempt to evaluate the 'Conditional' argument with an optional side
119
122
condition using an external SMT solver.
@@ -164,9 +167,10 @@ decidePredicate ::
164
167
InternalVariable variable =>
165
168
OnDecidePredicateUnknown ->
166
169
SideCondition variable ->
167
- NonEmpty (Predicate variable ) ->
170
+ [Predicate variable ] ->
171
+ Predicate variable ->
168
172
Simplifier (Maybe Bool )
169
- decidePredicate onUnknown sideCondition predicates =
173
+ decidePredicate onUnknown sideCondition sideConditionPredicates predicate =
170
174
whileDebugEvaluateCondition predicates $
171
175
do
172
176
result <- query >>= whenUnknown retry
@@ -187,14 +191,23 @@ decidePredicate onUnknown sideCondition predicates =
187
191
empty
188
192
& runMaybeT
189
193
where
194
+ predicates = predicate :| sideConditionPredicates
195
+
190
196
query :: MaybeT Simplifier Result
191
197
query = onErrorUnknown $ SMT. withSolver . evalTranslator $ do
192
198
tools <- Simplifier. askMetadataTools
193
199
Morph. hoist SMT. liftSMT $ do
194
- predicates' <-
195
- traverse
196
- (translatePredicate sideCondition tools)
197
- predicates
200
+ sideConditionPredicates' <-
201
+ concatMap SMT. splitAnd
202
+ <$> traverse
203
+ (translatePredicate sideCondition tools)
204
+ sideConditionPredicates
205
+ predicate' <- SMT. splitAnd <$> translatePredicate sideCondition tools predicate
206
+ let predicates' = SMT. transitiveClosure (Set. fromList predicate') $ Set. fromList sideConditionPredicates'
207
+ -- when (Set.fromList predicate' /= predicates') $ liftIO $ do
208
+ -- putStrLn $ "predicate: " <> show (Set.fromList predicate')
209
+ -- putStrLn $ "sideConditionPredicates: " <> show sideConditionPredicates'
210
+ -- putStrLn $ "pruned to: " <> show predicates'
198
211
traverse_ SMT. assert predicates'
199
212
SMT. check >>= maybe empty return
200
213
0 commit comments