{-# LANGUAGE ImpredicativeTypes #-}
{-# LANGUAGE LiberalTypeSynonyms #-}
module Language.Hasmtlib.Internal.Parser where
import Prelude hiding (not, (&&), (||), and , or)
import Language.Hasmtlib.Internal.Bitvec
import Language.Hasmtlib.Internal.Render
import Language.Hasmtlib.Internal.Expr.Num ()
import Language.Hasmtlib.Internal.Expr
import Language.Hasmtlib.Equatable
import Language.Hasmtlib.Orderable
import Language.Hasmtlib.Boolean
import Language.Hasmtlib.Iteable
import Language.Hasmtlib.Codec
import Language.Hasmtlib.Type.SMTSort
import Language.Hasmtlib.Type.Solution
import Language.Hasmtlib.Type.ArrayMap
import Data.Bit
import Data.Coerce
import Data.Proxy
import Data.Ratio ((%))
import Data.ByteString
import Data.ByteString.Builder
import Data.Attoparsec.ByteString hiding (Result, skipWhile)
import Data.Attoparsec.ByteString.Char8 hiding (Result)
import Control.Applicative
import Control.Lens hiding (op)
import GHC.TypeNats
answerParser :: Parser (Result, Solution)
answerParser :: Parser (Result, Solution)
answerParser = do
Result
result <- Parser Result
resultParser
Solution
model <- Parser Solution
anyModelParser
(Result, Solution) -> Parser (Result, Solution)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Result
result, Solution
model)
resultParser :: Parser Result
resultParser :: Parser Result
resultParser = (ByteString -> Parser ByteString
string ByteString
"sat" Parser ByteString -> Parser Result -> Parser Result
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Result -> Parser Result
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Result
Sat)
Parser Result -> Parser Result -> Parser Result
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ByteString -> Parser ByteString
string ByteString
"unsat" Parser ByteString -> Parser Result -> Parser Result
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Result -> Parser Result
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Result
Unsat)
Parser Result -> Parser Result -> Parser Result
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ByteString -> Parser ByteString
string ByteString
"unknown" Parser ByteString -> Parser Result -> Parser Result
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Result -> Parser Result
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Result
Unknown)
anyModelParser :: Parser Solution
anyModelParser :: Parser Solution
anyModelParser = Parser Solution
smt2ModelParser Parser Solution -> Parser Solution -> Parser Solution
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Solution
defaultModelParser Parser Solution -> Parser Solution -> Parser Solution
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Solution -> Parser Solution
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return Solution
forall a. Monoid a => a
mempty
defaultModelParser :: Parser Solution
defaultModelParser :: Parser Solution
defaultModelParser = do
()
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
[SomeKnownOrdSMTSort SMTVarSol]
varSols <- Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
-> Parser ByteString [SomeKnownOrdSMTSort SMTVarSol]
forall a. Parser ByteString a -> Parser ByteString [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
-> Parser ByteString [SomeKnownOrdSMTSort SMTVarSol])
-> Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
-> Parser ByteString [SomeKnownOrdSMTSort SMTVarSol]
forall a b. (a -> b) -> a -> b
$ Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
parseSomeSol Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
-> Parser () -> Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
skipSpace
()
_ <- (Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace) Parser () -> Parser () -> Parser ()
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ()
skipSpace
Solution -> Parser Solution
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Solution -> Parser Solution) -> Solution -> Parser Solution
forall a b. (a -> b) -> a -> b
$ [SomeKnownOrdSMTSort SMTVarSol] -> Solution
fromSomeVarSols [SomeKnownOrdSMTSort SMTVarSol]
varSols
smt2ModelParser :: Parser Solution
smt2ModelParser :: Parser Solution
smt2ModelParser = do
()
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace Parser () -> Parser ByteString -> Parser ByteString
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ByteString -> Parser ByteString
string ByteString
"model" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
[SomeKnownOrdSMTSort SMTVarSol]
varSols <- Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
-> Parser ByteString [SomeKnownOrdSMTSort SMTVarSol]
forall a. Parser ByteString a -> Parser ByteString [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
-> Parser ByteString [SomeKnownOrdSMTSort SMTVarSol])
-> Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
-> Parser ByteString [SomeKnownOrdSMTSort SMTVarSol]
forall a b. (a -> b) -> a -> b
$ Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
parseSomeSol Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
-> Parser () -> Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
skipSpace
()
_ <- (Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace) Parser () -> Parser () -> Parser ()
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ()
skipSpace
Solution -> Parser Solution
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Solution -> Parser Solution) -> Solution -> Parser Solution
forall a b. (a -> b) -> a -> b
$ [SomeKnownOrdSMTSort SMTVarSol] -> Solution
fromSomeVarSols [SomeKnownOrdSMTSort SMTVarSol]
varSols
parseSomeSol :: Parser (SomeKnownOrdSMTSort SMTVarSol)
parseSomeSol :: Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
parseSomeSol = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
"define-fun" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
ByteString
_ <- ByteString -> Parser ByteString
string ByteString
"var_"
Int
vId <- forall a. Integral a => Parser a
decimal @Int
()
_ <- Parser ()
skipSpace Parser () -> Parser ByteString -> Parser ByteString
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ByteString -> Parser ByteString
string ByteString
"()" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
(SomeSMTSort SSMTSort t
someSort) <- Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
parseSomeSort
()
_ <- Parser ()
skipSpace
Expr t
expr <- SSMTSort t -> Parser (Expr t)
forall (prxy :: SMTSort -> *) (t :: SMTSort).
KnownSMTSort t =>
prxy t -> Parser (Expr t)
parseExpr' SSMTSort t
someSort
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
case Solution -> Expr t -> Maybe (Decoded (Expr t))
forall a. Codec a => Solution -> a -> Maybe (Decoded a)
decode Solution
forall a. Monoid a => a
mempty Expr t
expr of
Maybe (Decoded (Expr t))
Nothing -> [Char] -> Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString (SomeKnownOrdSMTSort SMTVarSol))
-> [Char] -> Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
forall a b. (a -> b) -> a -> b
$ [Char]
"Solver reponded with solution for var_" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
vId [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" but it contains "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"another var. This cannot be parsed and evaluated currently."
Just Decoded (Expr t)
value -> SomeKnownOrdSMTSort SMTVarSol
-> Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (SomeKnownOrdSMTSort SMTVarSol
-> Parser ByteString (SomeKnownOrdSMTSort SMTVarSol))
-> SomeKnownOrdSMTSort SMTVarSol
-> Parser ByteString (SomeKnownOrdSMTSort SMTVarSol)
forall a b. (a -> b) -> a -> b
$ SMTVarSol t -> SomeKnownOrdSMTSort SMTVarSol
forall (cs :: [SMTSort -> Constraint]) (f :: SMTSort -> *)
(t :: SMTSort).
AllC cs t =>
f t -> SomeSMTSort cs f
SomeSMTSort (SMTVarSol t -> SomeKnownOrdSMTSort SMTVarSol)
-> SMTVarSol t -> SomeKnownOrdSMTSort SMTVarSol
forall a b. (a -> b) -> a -> b
$ SMTVar t -> Value t -> SMTVarSol t
forall (t :: SMTSort). SMTVar t -> Value t -> SMTVarSol t
SMTVarSol (Int -> SMTVar t
forall a b. Coercible a b => a -> b
coerce Int
vId) (HaskellType t -> Value t
forall (t :: SMTSort). KnownSMTSort t => HaskellType t -> Value t
wrapValue HaskellType t
Decoded (Expr t)
value)
{-# INLINEABLE parseSomeSol #-}
parseSomeSort :: Parser (SomeKnownOrdSMTSort SSMTSort)
parseSomeSort :: Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
parseSomeSort = (ByteString -> Parser ByteString
string ByteString
"Bool" Parser ByteString
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (SSMTSort 'BoolSort
-> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
forall (cs :: [SMTSort -> Constraint]) (f :: SMTSort -> *)
(t :: SMTSort).
AllC cs t =>
f t -> SomeSMTSort cs f
SomeSMTSort SSMTSort 'BoolSort
SBoolSort))
Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ByteString -> Parser ByteString
string ByteString
"Int" Parser ByteString
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (SSMTSort 'IntSort
-> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
forall (cs :: [SMTSort -> Constraint]) (f :: SMTSort -> *)
(t :: SMTSort).
AllC cs t =>
f t -> SomeSMTSort cs f
SomeSMTSort SSMTSort 'IntSort
SIntSort))
Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ByteString -> Parser ByteString
string ByteString
"Real" Parser ByteString
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (SSMTSort 'RealSort
-> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
forall (cs :: [SMTSort -> Constraint]) (f :: SMTSort -> *)
(t :: SMTSort).
AllC cs t =>
f t -> SomeSMTSort cs f
SomeSMTSort SSMTSort 'RealSort
SRealSort))
Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
parseSomeBitVecSort
Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
parseSomeArraySort
{-# INLINEABLE parseSomeSort #-}
parseSomeBitVecSort :: Parser (SomeKnownOrdSMTSort SSMTSort)
parseSomeBitVecSort :: Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
parseSomeBitVecSort = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
'_' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
"BitVec" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Integer
n <- Parser Integer
forall a. Integral a => Parser a
decimal
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
case Natural -> SomeNat
someNatVal (Natural -> SomeNat) -> Natural -> SomeNat
forall a b. (a -> b) -> a -> b
$ Integer -> Natural
forall a. Num a => Integer -> a
fromInteger Integer
n of
SomeNat Proxy n
pn -> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort))
-> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a b. (a -> b) -> a -> b
$ SSMTSort ('BvSort n)
-> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
forall (cs :: [SMTSort -> Constraint]) (f :: SMTSort -> *)
(t :: SMTSort).
AllC cs t =>
f t -> SomeSMTSort cs f
SomeSMTSort (SSMTSort ('BvSort n)
-> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> SSMTSort ('BvSort n)
-> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
forall a b. (a -> b) -> a -> b
$ Proxy n -> SSMTSort ('BvSort n)
forall (n :: Natural).
KnownNat n =>
Proxy n -> SSMTSort ('BvSort n)
SBvSort Proxy n
pn
{-# INLINEABLE parseSomeBitVecSort #-}
parseSomeArraySort :: Parser (SomeKnownOrdSMTSort SSMTSort)
parseSomeArraySort :: Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
parseSomeArraySort = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
"Array" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
(SomeSMTSort SSMTSort t
keySort) <- Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
parseSomeSort
()
_ <- Parser ()
skipSpace
(SomeSMTSort SSMTSort t
valueSort) <- Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
parseSomeSort
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort))
-> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
-> Parser (SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
forall a b. (a -> b) -> a -> b
$ SSMTSort ('ArraySort t t)
-> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
forall (cs :: [SMTSort -> Constraint]) (f :: SMTSort -> *)
(t :: SMTSort).
AllC cs t =>
f t -> SomeSMTSort cs f
SomeSMTSort (SSMTSort ('ArraySort t t)
-> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort)
-> SSMTSort ('ArraySort t t)
-> SomeSMTSort '[KnownSMTSort, OrdHaskellType] SSMTSort
forall a b. (a -> b) -> a -> b
$ Proxy t -> Proxy t -> SSMTSort ('ArraySort t t)
forall (k :: SMTSort) (v :: SMTSort).
(KnownSMTSort k, KnownSMTSort v, Ord (HaskellType k)) =>
Proxy k -> Proxy v -> SSMTSort ('ArraySort k v)
SArraySort (SSMTSort t -> Proxy t
forall (t :: SMTSort). SSMTSort t -> Proxy t
goProxy SSMTSort t
keySort) (SSMTSort t -> Proxy t
forall (t :: SMTSort). SSMTSort t -> Proxy t
goProxy SSMTSort t
valueSort)
where
goProxy :: forall t. SSMTSort t -> Proxy t
goProxy :: forall (t :: SMTSort). SSMTSort t -> Proxy t
goProxy SSMTSort t
_ = forall {k} (t :: k). Proxy t
forall (t :: SMTSort). Proxy t
Proxy @t
{-# INLINEABLE parseSomeArraySort #-}
parseExpr' :: forall prxy t. KnownSMTSort t => prxy t -> Parser (Expr t)
parseExpr' :: forall (prxy :: SMTSort -> *) (t :: SMTSort).
KnownSMTSort t =>
prxy t -> Parser (Expr t)
parseExpr' prxy t
_ = forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr @t
{-# INLINE parseExpr' #-}
parseExpr :: forall t. KnownSMTSort t => Parser (Expr t)
parseExpr :: forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr = Parser (Expr t)
forall (t :: SMTSort). Parser (Expr t)
var Parser (Expr t) -> Parser (Expr t) -> Parser (Expr t)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser (Expr t)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
constantExpr Parser (Expr t) -> Parser (Expr t) -> Parser (Expr t)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser (Expr t)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
smtIte
Parser (Expr t) -> Parser (Expr t) -> Parser (Expr t)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> case forall (t :: SMTSort). KnownSMTSort t => SSMTSort t
sortSing @t of
SSMTSort t
SIntSort -> ByteString
-> (Expr 'IntSort -> Expr 'IntSort) -> Parser (Expr 'IntSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"abs" Expr 'IntSort -> Expr 'IntSort
forall a. Num a => a -> a
abs Parser (Expr 'IntSort)
-> Parser (Expr 'IntSort) -> Parser (Expr 'IntSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'IntSort -> Expr 'IntSort) -> Parser (Expr 'IntSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"-" Expr 'IntSort -> Expr 'IntSort
forall a. Num a => a -> a
negate
Parser (Expr 'IntSort)
-> Parser (Expr 'IntSort) -> Parser (Expr 'IntSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> ([Expr 'IntSort] -> Expr 'IntSort) -> Parser (Expr 'IntSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> ([Expr t] -> Expr r) -> Parser (Expr r)
nary ByteString
"+" [Expr 'IntSort] -> Expr 'IntSort
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum Parser (Expr 'IntSort)
-> Parser (Expr 'IntSort) -> Parser (Expr 'IntSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'IntSort -> Expr 'IntSort -> Expr 'IntSort)
-> Parser (Expr 'IntSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"-" (-) Parser (Expr 'IntSort)
-> Parser (Expr 'IntSort) -> Parser (Expr 'IntSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> ([Expr 'IntSort] -> Expr 'IntSort) -> Parser (Expr 'IntSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> ([Expr t] -> Expr r) -> Parser (Expr r)
nary ByteString
"*" [Expr 'IntSort] -> Expr 'IntSort
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product Parser (Expr 'IntSort)
-> Parser (Expr 'IntSort) -> Parser (Expr 'IntSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'IntSort -> Expr 'IntSort -> Expr 'IntSort)
-> Parser (Expr 'IntSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"mod" Expr 'IntSort -> Expr 'IntSort -> Expr 'IntSort
Mod
Parser (Expr 'IntSort)
-> Parser (Expr 'IntSort) -> Parser (Expr 'IntSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser (Expr 'IntSort)
toIntFun
SSMTSort t
SRealSort -> ByteString
-> (Expr 'RealSort -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"abs" Expr 'RealSort -> Expr 'RealSort
forall a. Num a => a -> a
abs Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'RealSort -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"-" Expr 'RealSort -> Expr 'RealSort
forall a. Num a => a -> a
negate
Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> ([Expr 'RealSort] -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> ([Expr t] -> Expr r) -> Parser (Expr r)
nary ByteString
"+" [Expr 'RealSort] -> Expr 'RealSort
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'RealSort -> Expr 'RealSort -> Expr 'RealSort)
-> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"-" (-) Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> ([Expr 'RealSort] -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> ([Expr t] -> Expr r) -> Parser (Expr r)
nary ByteString
"*" [Expr 'RealSort] -> Expr 'RealSort
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'RealSort -> Expr 'RealSort -> Expr 'RealSort)
-> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"/" Expr 'RealSort -> Expr 'RealSort -> Expr 'RealSort
forall a. Fractional a => a -> a -> a
(/)
Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser (Expr 'RealSort)
toRealFun
Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser (Expr 'RealSort)
smtPi Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'RealSort -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"sqrt" Expr 'RealSort -> Expr 'RealSort
forall a. Floating a => a -> a
sqrt Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'RealSort -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"exp" Expr 'RealSort -> Expr 'RealSort
forall a. Floating a => a -> a
exp
Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'RealSort -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"sin" Expr 'RealSort -> Expr 'RealSort
forall a. Floating a => a -> a
sin Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'RealSort -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"cos" Expr 'RealSort -> Expr 'RealSort
forall a. Floating a => a -> a
cos Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'RealSort -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"tan" Expr 'RealSort -> Expr 'RealSort
forall a. Floating a => a -> a
tan
Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'RealSort -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"arcsin" Expr 'RealSort -> Expr 'RealSort
forall a. Floating a => a -> a
asin Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'RealSort -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"arccos" Expr 'RealSort -> Expr 'RealSort
forall a. Floating a => a -> a
acos Parser (Expr 'RealSort)
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'RealSort -> Expr 'RealSort) -> Parser (Expr 'RealSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"arctan" Expr 'RealSort -> Expr 'RealSort
forall a. Floating a => a -> a
atan
SSMTSort t
SBoolSort -> Parser (Expr 'BoolSort)
isIntFun
Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'BoolSort -> Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"not" Expr 'BoolSort -> Expr 'BoolSort
forall b. Boolean b => b -> b
not
Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> ([Expr 'BoolSort] -> Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> ([Expr t] -> Expr r) -> Parser (Expr r)
nary ByteString
"and" [Expr 'BoolSort] -> Expr 'BoolSort
forall (t :: * -> *) b. (Foldable t, Boolean b) => t b -> b
and Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> ([Expr 'BoolSort] -> Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> ([Expr t] -> Expr r) -> Parser (Expr r)
nary ByteString
"or" [Expr 'BoolSort] -> Expr 'BoolSort
forall (t :: * -> *) b. (Foldable t, Boolean b) => t b -> b
or Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'BoolSort -> Expr 'BoolSort -> Expr 'BoolSort)
-> Parser (Expr 'BoolSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"=>" Expr 'BoolSort -> Expr 'BoolSort -> Expr 'BoolSort
forall b. Boolean b => b -> b -> b
(==>) Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr 'BoolSort -> Expr 'BoolSort -> Expr 'BoolSort)
-> Parser (Expr 'BoolSort)
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"xor" Expr 'BoolSort -> Expr 'BoolSort -> Expr 'BoolSort
forall b. Boolean b => b -> b -> b
xor
Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @IntSort ByteString
"=" Expr 'IntSort -> Expr 'IntSort -> Expr 'BoolSort
forall a. Equatable a => a -> a -> Expr 'BoolSort
(===) Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @IntSort ByteString
"distinct" Expr 'IntSort -> Expr 'IntSort -> Expr 'BoolSort
forall a. Equatable a => a -> a -> Expr 'BoolSort
(/==)
Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @RealSort ByteString
"=" Expr 'RealSort -> Expr 'RealSort -> Expr 'BoolSort
forall a. Equatable a => a -> a -> Expr 'BoolSort
(===) Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @RealSort ByteString
"distinct" Expr 'RealSort -> Expr 'RealSort -> Expr 'BoolSort
forall a. Equatable a => a -> a -> Expr 'BoolSort
(/==)
Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @BoolSort ByteString
"=" Expr 'BoolSort -> Expr 'BoolSort -> Expr 'BoolSort
forall a. Equatable a => a -> a -> Expr 'BoolSort
(===) Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @BoolSort ByteString
"distinct" Expr 'BoolSort -> Expr 'BoolSort -> Expr 'BoolSort
forall a. Equatable a => a -> a -> Expr 'BoolSort
(/==)
Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @IntSort ByteString
"<" Expr 'IntSort -> Expr 'IntSort -> Expr 'BoolSort
forall a. Orderable a => a -> a -> Expr 'BoolSort
(<?) Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @IntSort ByteString
"<=" Expr 'IntSort -> Expr 'IntSort -> Expr 'BoolSort
forall a. Orderable a => a -> a -> Expr 'BoolSort
(<=?)
Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @IntSort ByteString
">=" Expr 'IntSort -> Expr 'IntSort -> Expr 'BoolSort
forall a. Orderable a => a -> a -> Expr 'BoolSort
(>=?) Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @IntSort ByteString
">" Expr 'IntSort -> Expr 'IntSort -> Expr 'BoolSort
forall a. Orderable a => a -> a -> Expr 'BoolSort
(>?)
Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @RealSort ByteString
"<" Expr 'RealSort -> Expr 'RealSort -> Expr 'BoolSort
forall a. Orderable a => a -> a -> Expr 'BoolSort
(<?) Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @RealSort ByteString
"<=" Expr 'RealSort -> Expr 'RealSort -> Expr 'BoolSort
forall a. Orderable a => a -> a -> Expr 'BoolSort
(<=?)
Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @RealSort ByteString
">=" Expr 'RealSort -> Expr 'RealSort -> Expr 'BoolSort
forall a. Orderable a => a -> a -> Expr 'BoolSort
(>=?) Parser (Expr 'BoolSort)
-> Parser (Expr 'BoolSort) -> Parser (Expr 'BoolSort)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary @RealSort ByteString
">" Expr 'RealSort -> Expr 'RealSort -> Expr 'BoolSort
forall a. Orderable a => a -> a -> Expr 'BoolSort
(>?)
SBvSort Proxy n
_ -> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"bvnot" Expr ('BvSort n) -> Expr ('BvSort n)
forall b. Boolean b => b -> b
not
Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvand" Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
forall b. Boolean b => b -> b -> b
(&&) Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvor" Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
forall b. Boolean b => b -> b -> b
(||) Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvxor" Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
forall b. Boolean b => b -> b -> b
xor Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvnand" Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
forall (n :: Natural).
KnownNat n =>
Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
BvNand Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvnor" Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
forall (n :: Natural).
KnownNat n =>
Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
BvNor
Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
"bvneg" Expr ('BvSort n) -> Expr ('BvSort n)
forall a. Num a => a -> a
negate
Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvadd" Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
forall a. Num a => a -> a -> a
(+) Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvsub" (-) Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvmul" Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
forall a. Num a => a -> a -> a
(*)
Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvudiv" Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
forall (n :: Natural).
KnownNat n =>
Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
BvuDiv Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvurem" Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
forall (n :: Natural).
KnownNat n =>
Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
BvuRem
Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvshl" Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
forall (n :: Natural).
KnownNat n =>
Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
BvShL Parser (Expr ('BvSort n))
-> Parser (Expr ('BvSort n)) -> Parser (Expr ('BvSort n))
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString
-> (Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n))
-> Parser (Expr ('BvSort n))
forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
"bvlshr" Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
forall (n :: Natural).
KnownNat n =>
Expr ('BvSort n) -> Expr ('BvSort n) -> Expr ('BvSort n)
BvLShR
SArraySort Proxy k
_ Proxy v
_ -> Parser (Expr t)
Parser (Expr ('ArraySort k v))
forall (k :: SMTSort) (v :: SMTSort).
(KnownSMTSort k, KnownSMTSort v, Ord (HaskellType k)) =>
Parser (Expr ('ArraySort k v))
parseStore
var :: Parser (Expr t)
var :: forall (t :: SMTSort). Parser (Expr t)
var = do
ByteString
_ <- ByteString -> Parser ByteString
string ByteString
"var_"
Int
vId <- forall a. Integral a => Parser a
decimal @Int
Expr t -> Parser (Expr t)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr t -> Parser (Expr t)) -> Expr t -> Parser (Expr t)
forall a b. (a -> b) -> a -> b
$ SMTVar t -> Expr t
forall (t :: SMTSort). SMTVar t -> Expr t
Var (SMTVar t -> Expr t) -> SMTVar t -> Expr t
forall a b. (a -> b) -> a -> b
$ Int -> SMTVar t
forall a b. Coercible a b => a -> b
coerce Int
vId
{-# INLINE var #-}
constant :: forall t. KnownSMTSort t => Parser (HaskellType t)
constant :: forall (t :: SMTSort). KnownSMTSort t => Parser (HaskellType t)
constant = case forall (t :: SMTSort). KnownSMTSort t => SSMTSort t
sortSing @t of
SSMTSort t
SIntSort -> Parser (HaskellType t) -> Parser (HaskellType t)
forall a. Num a => Parser a -> Parser a
anyValue Parser (HaskellType t)
forall a. Integral a => Parser a
decimal
SSMTSort t
SRealSort -> Parser Double -> Parser Double
forall a. Num a => Parser a -> Parser a
anyValue Parser Double
parseRatioDouble Parser Double -> Parser Double -> Parser Double
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Double
parseToRealDouble Parser Double -> Parser Double -> Parser Double
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Double -> Parser Double
forall a. Num a => Parser a -> Parser a
anyValue Parser Double
forall a. Fractional a => Parser a
rational
SSMTSort t
SBoolSort -> Parser Bool
Parser (HaskellType t)
parseBool
SBvSort Proxy n
p -> Proxy n -> Parser (Bitvec n)
forall (n :: Natural). KnownNat n => Proxy n -> Parser (Bitvec n)
anyBitvector Proxy n
p
SArraySort Proxy k
k Proxy v
v -> Proxy k
-> Proxy v -> Parser (ConstArray (HaskellType k) (HaskellType v))
forall (k :: SMTSort) (v :: SMTSort).
(KnownSMTSort v, Ord (HaskellType k)) =>
Proxy k
-> Proxy v -> Parser (ConstArray (HaskellType k) (HaskellType v))
constArray Proxy k
k Proxy v
v
{-# INLINE constant #-}
constantExpr :: forall t. KnownSMTSort t => Parser (Expr t)
constantExpr :: forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
constantExpr = Value t -> Expr t
forall (t :: SMTSort). Value t -> Expr t
Constant (Value t -> Expr t)
-> (HaskellType t -> Value t) -> HaskellType t -> Expr t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HaskellType t -> Value t
forall (t :: SMTSort). KnownSMTSort t => HaskellType t -> Value t
wrapValue (HaskellType t -> Expr t)
-> Parser ByteString (HaskellType t) -> Parser ByteString (Expr t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: SMTSort). KnownSMTSort t => Parser (HaskellType t)
constant @t
{-# INLINE constantExpr #-}
anyBitvector :: KnownNat n => Proxy n -> Parser (Bitvec n)
anyBitvector :: forall (n :: Natural). KnownNat n => Proxy n -> Parser (Bitvec n)
anyBitvector Proxy n
p = Proxy n -> Parser (Bitvec n)
forall (n :: Natural). KnownNat n => Proxy n -> Parser (Bitvec n)
binBitvector Proxy n
p Parser (Bitvec n) -> Parser (Bitvec n) -> Parser (Bitvec n)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Proxy n -> Parser (Bitvec n)
forall (n :: Natural). KnownNat n => Proxy n -> Parser (Bitvec n)
hexBitvector Proxy n
p Parser (Bitvec n) -> Parser (Bitvec n) -> Parser (Bitvec n)
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Proxy n -> Parser (Bitvec n)
forall (n :: Natural). KnownNat n => Proxy n -> Parser (Bitvec n)
literalBitvector Proxy n
p
{-# INLINE anyBitvector #-}
binBitvector :: KnownNat n => Proxy n -> Parser (Bitvec n)
binBitvector :: forall (n :: Natural). KnownNat n => Proxy n -> Parser (Bitvec n)
binBitvector Proxy n
p = do
()
_ <- ByteString -> Parser ByteString
string ByteString
"#b" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
[Char]
bs <- Parser ByteString Char -> Parser ByteString [Char]
forall a. Parser ByteString a -> Parser ByteString [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parser ByteString Char -> Parser ByteString [Char])
-> Parser ByteString Char -> Parser ByteString [Char]
forall a b. (a -> b) -> a -> b
$ Char -> Parser ByteString Char
char Char
'0' Parser ByteString Char
-> Parser ByteString Char -> Parser ByteString Char
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char -> Parser ByteString Char
char Char
'1'
let [Bit]
bs' :: [Bit] = (Char -> Bit) -> [Char] -> [Bit]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Char
b -> Bool -> Bit -> Bit -> Bit
forall b a. Iteable b a => b -> a -> a -> a
ite (Char
b Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'1') Bit
forall b. Boolean b => b
true Bit
forall b. Boolean b => b
false) [Char]
bs
case Proxy n -> [Bit] -> Maybe (Bitvec n)
forall (n :: Natural).
KnownNat n =>
Proxy n -> [Bit] -> Maybe (Bitvec n)
bvFromListN' Proxy n
p [Bit]
bs' of
Maybe (Bitvec n)
Nothing -> [Char] -> Parser (Bitvec n)
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser (Bitvec n)) -> [Char] -> Parser (Bitvec n)
forall a b. (a -> b) -> a -> b
$ [Char]
"Expected BitVector of length" [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> Natural -> [Char]
forall a. Show a => a -> [Char]
show (Proxy n -> Natural
forall (n :: Natural) (proxy :: Natural -> *).
KnownNat n =>
proxy n -> Natural
natVal Proxy n
p) [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
", but got a different one"
Just Bitvec n
v -> Bitvec n -> Parser (Bitvec n)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return Bitvec n
v
{-# INLINEABLE binBitvector #-}
hexBitvector :: KnownNat n => Proxy n -> Parser (Bitvec n)
hexBitvector :: forall (n :: Natural). KnownNat n => Proxy n -> Parser (Bitvec n)
hexBitvector Proxy n
_ = do
()
_ <- ByteString -> Parser ByteString
string ByteString
"#x" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Integer -> Bitvec n
forall a. Num a => Integer -> a
fromInteger (Integer -> Bitvec n) -> Parser Integer -> Parser (Bitvec n)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Integer
forall a. (Integral a, Bits a) => Parser a
hexadecimal
{-# INLINE hexBitvector #-}
literalBitvector :: KnownNat n => Proxy n -> Parser (Bitvec n)
literalBitvector :: forall (n :: Natural). KnownNat n => Proxy n -> Parser (Bitvec n)
literalBitvector Proxy n
_ = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- Char -> Parser ByteString Char
char Char
'_' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
ByteString
_ <- ByteString -> Parser ByteString
string ByteString
"bv"
Integer
x <- Parser Integer
forall a. Integral a => Parser a
decimal
Char
_ <- (Char -> Bool) -> Parser ()
skipWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
')') Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Bitvec n -> Parser (Bitvec n)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bitvec n -> Parser (Bitvec n)) -> Bitvec n -> Parser (Bitvec n)
forall a b. (a -> b) -> a -> b
$ Integer -> Bitvec n
forall a. Num a => Integer -> a
fromInteger Integer
x
{-# INLINE literalBitvector #-}
constArray :: forall k v. (KnownSMTSort v, Ord (HaskellType k)) => Proxy k -> Proxy v -> Parser (ConstArray (HaskellType k) (HaskellType v))
constArray :: forall (k :: SMTSort) (v :: SMTSort).
(KnownSMTSort v, Ord (HaskellType k)) =>
Proxy k
-> Proxy v -> Parser (ConstArray (HaskellType k) (HaskellType v))
constArray Proxy k
_ Proxy v
_ = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
"as" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace Parser () -> Parser ByteString -> Parser ByteString
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ByteString -> Parser ByteString
string ByteString
"const" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (Char -> Bool) -> Parser ()
skipWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
')') Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- Char -> Parser ByteString Char
char Char
')' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
HaskellType v
constVal <- forall (t :: SMTSort). KnownSMTSort t => Parser (HaskellType t)
constant @v
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
ConstArray (HaskellType k) (HaskellType v)
-> Parser (ConstArray (HaskellType k) (HaskellType v))
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (ConstArray (HaskellType k) (HaskellType v)
-> Parser (ConstArray (HaskellType k) (HaskellType v)))
-> ConstArray (HaskellType k) (HaskellType v)
-> Parser (ConstArray (HaskellType k) (HaskellType v))
forall a b. (a -> b) -> a -> b
$ HaskellType v -> ConstArray (HaskellType k) (HaskellType v)
forall (f :: * -> * -> *) k v. ArrayMap f k v => v -> f k v
asConst HaskellType v
constVal
{-# INLINEABLE constArray #-}
parseSelect :: forall k v. (KnownSMTSort k, KnownSMTSort v, Ord (HaskellType k)) => Proxy k -> Parser (Expr v)
parseSelect :: forall (k :: SMTSort) (v :: SMTSort).
(KnownSMTSort k, KnownSMTSort v, Ord (HaskellType k)) =>
Proxy k -> Parser (Expr v)
parseSelect Proxy k
_ = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
"select" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Expr ('ArraySort k v)
arr <- forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr @(ArraySort k v)
()
_ <- Parser ()
skipSpace
Expr k
i <- forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr @k
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Expr v -> Parser (Expr v)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr v -> Parser (Expr v)) -> Expr v -> Parser (Expr v)
forall a b. (a -> b) -> a -> b
$ Expr ('ArraySort k v) -> Expr k -> Expr v
forall (k :: SMTSort) (t :: SMTSort).
(KnownSMTSort k, KnownSMTSort t, Ord (HaskellType k)) =>
Expr ('ArraySort k t) -> Expr k -> Expr t
ArrSelect Expr ('ArraySort k v)
arr Expr k
i
parseStore :: forall k v. (KnownSMTSort k, KnownSMTSort v, Ord (HaskellType k)) => Parser (Expr (ArraySort k v))
parseStore :: forall (k :: SMTSort) (v :: SMTSort).
(KnownSMTSort k, KnownSMTSort v, Ord (HaskellType k)) =>
Parser (Expr ('ArraySort k v))
parseStore = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
"store" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Expr ('ArraySort k v)
arr <- forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr @(ArraySort k v)
()
_ <- Parser ()
skipSpace
Expr k
i <- forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr @k
()
_ <- Parser ()
skipSpace
Expr v
x <- forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr @v
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Expr ('ArraySort k v) -> Parser (Expr ('ArraySort k v))
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr ('ArraySort k v) -> Parser (Expr ('ArraySort k v)))
-> Expr ('ArraySort k v) -> Parser (Expr ('ArraySort k v))
forall a b. (a -> b) -> a -> b
$ Expr ('ArraySort k v) -> Expr k -> Expr v -> Expr ('ArraySort k v)
forall (k :: SMTSort) (v :: SMTSort).
(KnownSMTSort k, KnownSMTSort v, Ord (HaskellType k)) =>
Expr ('ArraySort k v) -> Expr k -> Expr v -> Expr ('ArraySort k v)
ArrStore Expr ('ArraySort k v)
arr Expr k
i Expr v
x
unary :: forall t r. KnownSMTSort t => ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary :: forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr r) -> Parser (Expr r)
unary ByteString
opStr Expr t -> Expr r
op = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
opStr Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Expr t
val <- Parser (Expr t)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Expr r -> Parser (Expr r)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr r -> Parser (Expr r)) -> Expr r -> Parser (Expr r)
forall a b. (a -> b) -> a -> b
$ Expr t -> Expr r
op Expr t
val
{-# INLINE unary #-}
binary :: forall t r. KnownSMTSort t => ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary :: forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> (Expr t -> Expr t -> Expr r) -> Parser (Expr r)
binary ByteString
opStr Expr t -> Expr t -> Expr r
op = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
opStr Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Expr t
l <- Parser (Expr t)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr
()
_ <- Parser ()
skipSpace
Expr t
r <- Parser (Expr t)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Expr r -> Parser (Expr r)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr r -> Parser (Expr r)) -> Expr r -> Parser (Expr r)
forall a b. (a -> b) -> a -> b
$ Expr t
l Expr t -> Expr t -> Expr r
`op` Expr t
r
{-# INLINE binary #-}
nary :: forall t r. KnownSMTSort t => ByteString -> ([Expr t] -> Expr r) -> Parser (Expr r)
nary :: forall (t :: SMTSort) (r :: SMTSort).
KnownSMTSort t =>
ByteString -> ([Expr t] -> Expr r) -> Parser (Expr r)
nary ByteString
opStr [Expr t] -> Expr r
op = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
opStr Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
[Expr t]
args <- Parser (Expr t)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr Parser (Expr t) -> Parser () -> Parser ByteString [Expr t]
forall (f :: * -> *) a s. Alternative f => f a -> f s -> f [a]
`sepBy1` Parser ()
skipSpace
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Expr r -> Parser (Expr r)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr r -> Parser (Expr r)) -> Expr r -> Parser (Expr r)
forall a b. (a -> b) -> a -> b
$ [Expr t] -> Expr r
op [Expr t]
args
{-# INLINE nary #-}
smtPi :: Parser (Expr RealSort)
smtPi :: Parser (Expr 'RealSort)
smtPi = ByteString -> Parser ByteString
string ByteString
"real.pi" Parser ByteString
-> Parser (Expr 'RealSort) -> Parser (Expr 'RealSort)
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Expr 'RealSort -> Parser (Expr 'RealSort)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return Expr 'RealSort
forall a. Floating a => a
pi
{-# INLINE smtPi #-}
toRealFun :: Parser (Expr RealSort)
toRealFun :: Parser (Expr 'RealSort)
toRealFun = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
"to_real" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Expr 'IntSort
val <- Parser (Expr 'IntSort)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Expr 'RealSort -> Parser (Expr 'RealSort)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr 'RealSort -> Parser (Expr 'RealSort))
-> Expr 'RealSort -> Parser (Expr 'RealSort)
forall a b. (a -> b) -> a -> b
$ Expr 'IntSort -> Expr 'RealSort
ToReal Expr 'IntSort
val
{-# INLINEABLE toRealFun #-}
toIntFun :: Parser (Expr IntSort)
toIntFun :: Parser (Expr 'IntSort)
toIntFun = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
"to_int" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Expr 'RealSort
val <- Parser (Expr 'RealSort)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Expr 'IntSort -> Parser (Expr 'IntSort)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr 'IntSort -> Parser (Expr 'IntSort))
-> Expr 'IntSort -> Parser (Expr 'IntSort)
forall a b. (a -> b) -> a -> b
$ Expr 'RealSort -> Expr 'IntSort
ToInt Expr 'RealSort
val
{-# INLINEABLE toIntFun #-}
isIntFun :: Parser (Expr BoolSort)
isIntFun :: Parser (Expr 'BoolSort)
isIntFun = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
"is_int" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Expr 'RealSort
val <- Parser (Expr 'RealSort)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Expr 'BoolSort -> Parser (Expr 'BoolSort)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr 'BoolSort -> Parser (Expr 'BoolSort))
-> Expr 'BoolSort -> Parser (Expr 'BoolSort)
forall a b. (a -> b) -> a -> b
$ Expr 'RealSort -> Expr 'BoolSort
IsInt Expr 'RealSort
val
{-# INLINEABLE isIntFun #-}
smtIte :: forall t. KnownSMTSort t => Parser (Expr t)
smtIte :: forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
smtIte = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
()
_ <- ByteString -> Parser ByteString
string ByteString
"ite" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Expr 'BoolSort
p <- forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr @BoolSort
()
_ <- Parser ()
skipSpace
Expr t
t <- Parser (Expr t)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr
()
_ <- Parser ()
skipSpace
Expr t
f <- Parser (Expr t)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Expr t -> Parser (Expr t)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr t -> Parser (Expr t)) -> Expr t -> Parser (Expr t)
forall a b. (a -> b) -> a -> b
$ Expr 'BoolSort -> Expr t -> Expr t -> Expr t
forall b a. Iteable b a => b -> a -> a -> a
ite Expr 'BoolSort
p Expr t
t Expr t
f
{-# INLINEABLE smtIte #-}
anyValue :: Num a => Parser a -> Parser a
anyValue :: forall a. Num a => Parser a -> Parser a
anyValue Parser a
p = Parser a -> Parser a
forall a. Num a => Parser a -> Parser a
negativeValue Parser a
p Parser a -> Parser a -> Parser a
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser a
p
{-# INLINEABLE anyValue #-}
negativeValue :: Num a => Parser a -> Parser a
negativeValue :: forall a. Num a => Parser a -> Parser a
negativeValue Parser a
p = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
'-' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
a
val <- Parser a -> Parser a
forall a. Num a => Parser a -> Parser a
signed Parser a
p
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
a -> Parser a
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Parser a) -> a -> Parser a
forall a b. (a -> b) -> a -> b
$ a -> a
forall a. Num a => a -> a
negate a
val
{-# INLINE negativeValue #-}
parseRatioDouble :: Parser Double
parseRatioDouble :: Parser Double
parseRatioDouble = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
'/' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Integer
numerator <- Parser Integer
forall a. Integral a => Parser a
decimal
()
_ <- Parser ()
skipSpace
Integer
denominator <- Parser Integer
forall a. Integral a => Parser a
decimal
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Double -> Parser Double
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Double -> Parser Double) -> Double -> Parser Double
forall a b. (a -> b) -> a -> b
$ Rational -> Double
forall a. Fractional a => Rational -> a
fromRational (Rational -> Double) -> Rational -> Double
forall a b. (a -> b) -> a -> b
$ Integer
numerator Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
% Integer
denominator
{-# INLINEABLE parseRatioDouble #-}
parseToRealDouble :: Parser Double
parseToRealDouble :: Parser Double
parseToRealDouble = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace Parser () -> Parser ByteString -> Parser ByteString
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ByteString -> Parser ByteString
string ByteString
"to_real" Parser ByteString -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
Integer
dec <- Parser Integer -> Parser Integer
forall a. Num a => Parser a -> Parser a
anyValue Parser Integer
forall a. Integral a => Parser a
decimal
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
Double -> Parser Double
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Double -> Parser Double) -> Double -> Parser Double
forall a b. (a -> b) -> a -> b
$ Integer -> Double
forall a. Num a => Integer -> a
fromInteger Integer
dec
{-# INLINEABLE parseToRealDouble #-}
parseBool :: Parser Bool
parseBool :: Parser Bool
parseBool = (ByteString -> Parser ByteString
string ByteString
"true" Parser ByteString -> Parser Bool -> Parser Bool
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> Parser Bool
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True) Parser Bool -> Parser Bool -> Parser Bool
forall a.
Parser ByteString a -> Parser ByteString a -> Parser ByteString a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ByteString -> Parser ByteString
string ByteString
"false" Parser ByteString -> Parser Bool -> Parser Bool
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> Parser Bool
forall a. a -> Parser ByteString a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False)
{-# INLINEABLE parseBool #-}
getValueParser :: KnownSMTSort t => SMTVar t -> Parser (SMTVarSol t)
getValueParser :: forall (t :: SMTSort).
KnownSMTSort t =>
SMTVar t -> Parser (SMTVarSol t)
getValueParser SMTVar t
v = do
()
_ <- Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
'(' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace
ByteString
_ <- ByteString -> Parser ByteString
string (ByteString -> Parser ByteString)
-> ByteString -> Parser ByteString
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
toStrict (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> ByteString
toLazyByteString (Builder -> ByteString) -> Builder -> ByteString
forall a b. (a -> b) -> a -> b
$ SMTVar t -> Builder
forall a. Render a => a -> Builder
render SMTVar t
v
()
_ <- Parser ()
skipSpace
Expr t
expr <- Parser (Expr t)
forall (t :: SMTSort). KnownSMTSort t => Parser (Expr t)
parseExpr
Char
_ <- Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')' Parser ByteString Char -> Parser () -> Parser ()
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
skipSpace Parser () -> Parser ByteString Char -> Parser ByteString Char
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser ByteString Char
char Char
')'
case Solution -> Expr t -> Maybe (Decoded (Expr t))
forall a. Codec a => Solution -> a -> Maybe (Decoded a)
decode Solution
forall a. Monoid a => a
mempty Expr t
expr of
Maybe (Decoded (Expr t))
Nothing -> [Char] -> Parser (SMTVarSol t)
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser (SMTVarSol t)) -> [Char] -> Parser (SMTVarSol t)
forall a b. (a -> b) -> a -> b
$ [Char]
"Solver reponded with solution for var_" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show (SMTVar t
vSMTVar t -> Getting Int (SMTVar t) Int -> Int
forall s a. s -> Getting a s a -> a
^.Getting Int (SMTVar t) Int
forall (t1 :: SMTSort) (t2 :: SMTSort) (p :: * -> * -> *)
(f :: * -> *).
(Profunctor p, Functor f) =>
p Int (f Int) -> p (SMTVar t1) (f (SMTVar t2))
varId) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" but it contains "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"another var. This cannot be parsed and evaluated currently."
Just Decoded (Expr t)
value -> SMTVarSol t -> Parser (SMTVarSol t)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (SMTVarSol t -> Parser (SMTVarSol t))
-> SMTVarSol t -> Parser (SMTVarSol t)
forall a b. (a -> b) -> a -> b
$ SMTVar t -> Value t -> SMTVarSol t
forall (t :: SMTSort). SMTVar t -> Value t -> SMTVarSol t
SMTVarSol SMTVar t
v (HaskellType t -> Value t
forall (t :: SMTSort). KnownSMTSort t => HaskellType t -> Value t
wrapValue HaskellType t
Decoded (Expr t)
value)