@@ -12,6 +12,7 @@ module Booster.SMT.Interface (
12
12
SMTOptions (.. ), -- re-export
13
13
defaultSMTOptions , -- re-export
14
14
SMTError (.. ),
15
+ UnknownReason (.. ),
15
16
initSolver ,
16
17
noSolver ,
17
18
finaliseSolver ,
@@ -33,6 +34,7 @@ import Control.Monad
33
34
import Control.Monad.IO.Class
34
35
import Control.Monad.Trans.State
35
36
import Data.Aeson (object , (.=) )
37
+ import Data.Aeson.Types (FromJSON (.. ), ToJSON (.. ))
36
38
import Data.ByteString.Char8 qualified as BS
37
39
import Data.Coerce
38
40
import Data.Data (Proxy )
@@ -44,6 +46,14 @@ import Data.Map qualified as Map
44
46
import Data.Set (Set )
45
47
import Data.Set qualified as Set
46
48
import Data.Text as Text (Text , pack , unlines , unwords )
49
+ import Deriving.Aeson (
50
+ CamelToKebab ,
51
+ CustomJSON (.. ),
52
+ FieldLabelModifier ,
53
+ OmitNothingFields ,
54
+ StripPrefix ,
55
+ )
56
+ import GHC.Generics (Generic )
47
57
import Prettyprinter (Pretty , backslash , hsep , punctuate , slash , (<+>) )
48
58
import SMTLIB.Backends.Process qualified as Backend
49
59
@@ -188,12 +198,28 @@ finaliseSolver ctxt = do
188
198
Log. logMessage (" Closing SMT solver" :: Text )
189
199
destroyContext ctxt
190
200
191
- pattern IsUnknown :: unknown -> Either unknown b
201
+ data UnknownReason
202
+ = -- | SMT prelude is UNSAT
203
+ InconsistentGroundTruth
204
+ | -- | (P, not P) is (SAT, SAT)
205
+ ImplicationIndeterminate
206
+ | -- | SMT solver returned unknown
207
+ SMTUnknownReason Text
208
+ deriving (Show , Eq , Generic )
209
+ deriving
210
+ (FromJSON , ToJSON )
211
+ via CustomJSON '[OmitNothingFields , FieldLabelModifier '[CamelToKebab , StripPrefix " _" ]] UnknownReason
212
+
213
+ instance Log. ToLogFormat UnknownReason where
214
+ toTextualLog = pack . show
215
+ toJSONLog = toJSON
216
+
217
+ pattern IsUnknown :: UnknownReason -> Either UnknownReason b
192
218
pattern IsUnknown u = Left u
193
219
194
220
newtype IsSat' a = IsSat' (Maybe a ) deriving (Functor )
195
221
196
- type IsSatResult a = Either Text (IsSat' a )
222
+ type IsSatResult a = Either UnknownReason (IsSat' a )
197
223
198
224
pattern IsSat :: a -> IsSatResult a
199
225
pattern IsSat a = Right (IsSat' (Just a))
@@ -243,7 +269,7 @@ isSatReturnTransState ctxt ps subst
243
269
SMT. runCmd CheckSat >>= \ case
244
270
Sat -> pure $ IsSat transState
245
271
Unsat -> pure IsUnsat
246
- Unknown reason -> retry (solve smtToCheck transState) (pure $ IsUnknown reason)
272
+ Unknown reason -> retry (solve smtToCheck transState) (pure $ IsUnknown ( SMTUnknownReason reason) )
247
273
other -> do
248
274
let msg = " Unexpected result while calling 'check-sat': " <> show other
249
275
Log. withContext Log. CtxAbort $ Log. logMessage $ Text. pack msg
@@ -347,7 +373,7 @@ mkComment = BS.pack . Pretty.renderDefault . pretty' @'[Decoded]
347
373
348
374
newtype IsValid' = IsValid' Bool
349
375
350
- type IsValidResult = Either ( Maybe Text ) IsValid'
376
+ type IsValidResult = Either UnknownReason IsValid'
351
377
352
378
pattern IsValid , IsInvalid :: IsValidResult
353
379
pattern IsValid = Right (IsValid' True )
@@ -418,14 +444,14 @@ checkPredicates ctxt givenPs givenSubst psToCheck
418
444
hsep (" Predicates to check:" : map (pretty' @ mods ) (Set. toList psToCheck))
419
445
result <- interactWithSolver smtGiven sexprsToCheck
420
446
case result of
421
- (Unsat , Unsat ) -> pure $ IsUnknown Nothing -- defensive choice for inconsistent ground truth
447
+ (Unsat , Unsat ) -> pure $ IsUnknown InconsistentGroundTruth
422
448
(Sat , Sat ) -> do
423
449
Log. logMessage (" Implication not determined" :: Text )
424
- pure $ IsUnknown Nothing
450
+ pure $ IsUnknown ImplicationIndeterminate
425
451
(Sat , Unsat ) -> pure IsValid
426
452
(Unsat , Sat ) -> pure IsInvalid
427
- (Unknown reason, _) -> retry (solve smtGiven sexprsToCheck transState) (pure $ IsUnknown $ Just reason)
428
- (_, Unknown reason) -> retry (solve smtGiven sexprsToCheck transState) (pure $ IsUnknown $ Just reason)
453
+ (Unknown reason, _) -> retry (solve smtGiven sexprsToCheck transState) (pure . IsUnknown . SMTUnknownReason $ reason)
454
+ (_, Unknown reason) -> retry (solve smtGiven sexprsToCheck transState) (pure . IsUnknown . SMTUnknownReason $ reason)
429
455
other ->
430
456
throwSMT $
431
457
" Unexpected result while checking a condition: " <> Text. pack (show other)
0 commit comments