sbv-13.1: SMT Based Verification: Symbolic Haskell theorem prover using SMT solving.
Copyright(c) Levent Erkok
LicenseBSD3
Maintainererkokl@gmail.com
Stabilityexperimental
Safe HaskellNone
LanguageHaskell2010

Documentation.SBV.Examples.Uninterpreted.UISortAllSat

Description

Demonstrates uninterpreted sorts and how all-sat behaves for them. Thanks to Eric Seidel for the idea.

Synopsis

Documentation

data L Source #

A "list-like" data type, but one we plan to uninterpret at the SMT level. The actual shape is really immaterial for us.

Instances

Instances details
Arbitrary L Source # 
Instance details

Defined in Documentation.SBV.Examples.Uninterpreted.UISortAllSat

Methods

arbitrary :: Gen L #

shrink :: L -> [L] #

SymVal L Source # 
Instance details

Defined in Documentation.SBV.Examples.Uninterpreted.UISortAllSat

HasKind L Source # 
Instance details

Defined in Documentation.SBV.Examples.Uninterpreted.UISortAllSat

cv2L :: String -> [CV] -> L Source #

Conversion from SMT values to L values.

_undefiner_L :: a Source #

Autogenerated definition to avoid unused-variable warnings from GHC.

type SL = SBV L Source #

Symbolic version of the type L.

classify :: SL -> SInteger Source #

An uninterpreted "classify" function. Really, we only care about the fact that such a function exists, not what it does.

genLs :: Predicate Source #

Formulate a query that essentially asserts a cardinality constraint on the uninterpreted sort L. The goal is to say there are precisely 3 such things, as it might be the case. We manage this by declaring four elements, and asserting that for a free variable of this sort, the shape of the data matches one of these three instances. That is, we assert that all the instances of the data L can be classified into 3 equivalence classes. Then, allSat returns all the possible instances, which of course are all uninterpreted.

As expected, we have:

>>> allSat genLs
Solution #1:
  l  = L_2 :: L
  l0 = L_0 :: L
  l1 = L_1 :: L
  l2 = L_2 :: L

  classify :: L -> Integer
  classify L_2 = 2
  classify L_1 = 1
  classify _   = 0
Solution #2:
  l  = L_1 :: L
  l0 = L_0 :: L
  l1 = L_1 :: L
  l2 = L_2 :: L

  classify :: L -> Integer
  classify L_2 = 2
  classify L_1 = 1
  classify _   = 0
Solution #3:
  l  = L_0 :: L
  l0 = L_0 :: L
  l1 = L_1 :: L
  l2 = L_2 :: L

  classify :: L -> Integer
  classify L_2 = 2
  classify L_1 = 1
  classify _   = 0
Found 3 different solutions.