packages feed

grisette 0.1.0.0 → 0.2.0.0

raw patch · 71 files changed

+8893/−4247 lines, 71 filesdep +parallelPVP ok

version bump matches the API change (PVP)

Dependencies added: parallel

API changes (from Hackage documentation)

- Grisette.Backend.SBV: [BoundedReasoning] :: (KnownNat integerBitWidth, IsZero integerBitWidth ~ 'False, BVIsNonZero integerBitWidth) => SMTConfig -> GrisetteSMTConfig integerBitWidth
- Grisette.Backend.SBV: [UnboundedReasoning] :: SMTConfig -> GrisetteSMTConfig 0
- Grisette.Backend.SBV: sbvConfig :: forall integerBitWidth. GrisetteSMTConfig integerBitWidth -> SMTConfig
- Grisette.Backend.SBV.Data.SMT.Lowering: lowerSinglePrim' :: forall integerBitWidth a. GrisetteSMTConfig integerBitWidth -> Term a -> SymBiMap -> (TermTy integerBitWidth a, SymBiMap)
- Grisette.Backend.SBV.Data.SMT.Solving: [BoundedReasoning] :: (KnownNat integerBitWidth, IsZero integerBitWidth ~ 'False, BVIsNonZero integerBitWidth) => SMTConfig -> GrisetteSMTConfig integerBitWidth
- Grisette.Backend.SBV.Data.SMT.Solving: [UnboundedReasoning] :: SMTConfig -> GrisetteSMTConfig 0
- Grisette.Backend.SBV.Data.SMT.Solving: instance Grisette.Core.Data.Class.CEGISSolver.CEGISSolver (Grisette.Backend.SBV.Data.SMT.Solving.GrisetteSMTConfig n) Data.SBV.Control.Types.CheckSatResult
- Grisette.Backend.SBV.Data.SMT.Solving: instance Grisette.Core.Data.Class.Solver.Solver (Grisette.Backend.SBV.Data.SMT.Solving.GrisetteSMTConfig n) Data.SBV.Control.Types.CheckSatResult
- Grisette.Backend.SBV.Data.SMT.Solving: sbvConfig :: forall integerBitWidth. GrisetteSMTConfig integerBitWidth -> SMTConfig
- Grisette.Core: bvconcat :: BVConcat bv1 bv2 bv3 => bv1 -> bv2 -> bv3
- Grisette.Core: bvextend :: BVExtend bv1 n bv2 => proxy n -> bv1 -> bv2
- Grisette.Core: bvextract :: forall proxy i j bv1 bv2. BVSelect bv1 j ((i - j) + 1) bv2 => proxy i -> proxy j -> bv1 -> bv2
- Grisette.Core: bvselect :: BVSelect bv1 ix w bv2 => proxy ix -> proxy w -> bv1 -> bv2
- Grisette.Core: bvsignExtend :: BVExtend bv1 n bv2 => proxy n -> bv1 -> bv2
- Grisette.Core: bvzeroExtend :: BVExtend bv1 n bv2 => proxy n -> bv1 -> bv2
- Grisette.Core: class BVConcat bv1 bv2 bv3 | bv1 bv2 -> bv3
- Grisette.Core: class BVExtend bv1 (n :: Nat) bv2 | bv1 n -> bv2
- Grisette.Core: class BVSelect bv1 (ix :: Nat) (w :: Nat) bv2 | bv1 w -> bv2
- Grisette.Core: class SignedDivMod a
- Grisette.Core: class SignedQuotRem a
- Grisette.Core: class UnsignedDivMod a
- Grisette.Core: divs :: (SignedDivMod a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core: mods :: (SignedDivMod a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core: quots :: (SignedQuotRem a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core: rems :: (SignedQuotRem a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core: udivs :: (UnsignedDivMod a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core: umods :: (UnsignedDivMod a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core.Control.Monad.UnionM: instance (Grisette.Core.Data.Class.Mergeable.Mergeable a, Grisette.Core.Data.Class.Substitute.SubstituteSym a) => Grisette.Core.Data.Class.Substitute.SubstituteSym (Grisette.Core.Control.Monad.UnionM.UnionM a)
- Grisette.Core.Data.Class.BitVector: bvconcat :: BVConcat bv1 bv2 bv3 => bv1 -> bv2 -> bv3
- Grisette.Core.Data.Class.BitVector: bvextend :: BVExtend bv1 n bv2 => proxy n -> bv1 -> bv2
- Grisette.Core.Data.Class.BitVector: bvextract :: forall proxy i j bv1 bv2. BVSelect bv1 j ((i - j) + 1) bv2 => proxy i -> proxy j -> bv1 -> bv2
- Grisette.Core.Data.Class.BitVector: bvselect :: BVSelect bv1 ix w bv2 => proxy ix -> proxy w -> bv1 -> bv2
- Grisette.Core.Data.Class.BitVector: bvsignExtend :: BVExtend bv1 n bv2 => proxy n -> bv1 -> bv2
- Grisette.Core.Data.Class.BitVector: bvzeroExtend :: BVExtend bv1 n bv2 => proxy n -> bv1 -> bv2
- Grisette.Core.Data.Class.BitVector: class BVConcat bv1 bv2 bv3 | bv1 bv2 -> bv3
- Grisette.Core.Data.Class.BitVector: class BVExtend bv1 (n :: Nat) bv2 | bv1 n -> bv2
- Grisette.Core.Data.Class.BitVector: class BVSelect bv1 (ix :: Nat) (w :: Nat) bv2 | bv1 w -> bv2
- Grisette.Core.Data.Class.Bool: instance Grisette.Core.Data.Class.Bool.LogicalOp (Grisette.IR.SymPrim.Data.SymPrim.Sym GHC.Types.Bool)
- Grisette.Core.Data.Class.Bool: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.Bool.ITEOp (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.Core.Data.Class.GenSym: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.GenSym.GenSym () (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.Core.Data.Class.GenSym: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.GenSym.GenSym (Grisette.IR.SymPrim.Data.SymPrim.Sym a) (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.Core.Data.Class.GenSym: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.GenSym.GenSymSimple () (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.Core.Data.Class.GenSym: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.GenSym.GenSymSimple (Grisette.IR.SymPrim.Data.SymPrim.Sym a) (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.Core.Data.Class.Integer: Denormal :: ArithException
- Grisette.Core.Data.Class.Integer: DivideByZero :: ArithException
- Grisette.Core.Data.Class.Integer: LossOfPrecision :: ArithException
- Grisette.Core.Data.Class.Integer: Overflow :: ArithException
- Grisette.Core.Data.Class.Integer: RatioZeroDenominator :: ArithException
- Grisette.Core.Data.Class.Integer: Underflow :: ArithException
- Grisette.Core.Data.Class.Integer: class SignedDivMod a
- Grisette.Core.Data.Class.Integer: class SignedQuotRem a
- Grisette.Core.Data.Class.Integer: class (Num a, SEq a, SOrd a, Solvable Integer a) => SymIntegerOp a
- Grisette.Core.Data.Class.Integer: class UnsignedDivMod a
- Grisette.Core.Data.Class.Integer: data ArithException
- Grisette.Core.Data.Class.Integer: divs :: (SignedDivMod a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core.Data.Class.Integer: mods :: (SignedDivMod a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core.Data.Class.Integer: quots :: (SignedQuotRem a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core.Data.Class.Integer: rems :: (SignedQuotRem a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core.Data.Class.Integer: udivs :: (UnsignedDivMod a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core.Data.Class.Integer: umods :: (UnsignedDivMod a, MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a
- Grisette.Core.Data.Class.Mergeable: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.Mergeable.Mergeable (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.Core.Data.Class.SimpleMergeable: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.SimpleMergeable.SimpleMergeable (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.Core.Data.Class.Substitute: instance Grisette.Core.Data.Class.Substitute.SubstituteSym (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim: data Sym a
- Grisette.IR.SymPrim: type SymBool = Sym Bool
- Grisette.IR.SymPrim: type SymIntN n = Sym (IntN n)
- Grisette.IR.SymPrim: type SymInteger = Sym Integer
- Grisette.IR.SymPrim: type SymWordN n = Sym (WordN n)
- Grisette.IR.SymPrim: type a -~> b = Sym (a --> b)
- Grisette.IR.SymPrim.Data.BV: IntN :: Integer -> IntN (n :: Nat)
- Grisette.IR.SymPrim.Data.BV: WordN :: Integer -> WordN (n :: Nat)
- Grisette.IR.SymPrim.Data.BV: [unIntN] :: IntN (n :: Nat) -> Integer
- Grisette.IR.SymPrim.Data.BV: [unWordN] :: WordN (n :: Nat) -> Integer
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.Bits (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.Bits (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.FiniteBits (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.FiniteBits (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Classes.Ord (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Enum.Bounded (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Enum.Bounded (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Enum.Enum (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Enum.Enum (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Real.Integral (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Real.Integral (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Real.Real (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Real.Real (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Show.Show (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Show.Show (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, GHC.TypeNats.KnownNat ix, GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w, (ix GHC.TypeNats.+ w) Data.Type.Ord.<= n) => Grisette.Core.Data.Class.BitVector.BVSelect (Grisette.IR.SymPrim.Data.BV.IntN n) ix w (Grisette.IR.SymPrim.Data.BV.IntN w)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, GHC.TypeNats.KnownNat ix, GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w, (ix GHC.TypeNats.+ w) Data.Type.Ord.<= n) => Grisette.Core.Data.Class.BitVector.BVSelect (Grisette.IR.SymPrim.Data.BV.WordN n) ix w (Grisette.IR.SymPrim.Data.BV.WordN w)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, GHC.TypeNats.KnownNat m, 1 Data.Type.Ord.<= m, GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w, w GHC.Types.~ (n GHC.TypeNats.+ m)) => Grisette.Core.Data.Class.BitVector.BVConcat (Grisette.IR.SymPrim.Data.BV.IntN n) (Grisette.IR.SymPrim.Data.BV.IntN m) (Grisette.IR.SymPrim.Data.BV.IntN w)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, GHC.TypeNats.KnownNat m, 1 Data.Type.Ord.<= m, GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w, w GHC.Types.~ (n GHC.TypeNats.+ m)) => Grisette.Core.Data.Class.BitVector.BVConcat (Grisette.IR.SymPrim.Data.BV.WordN n) (Grisette.IR.SymPrim.Data.BV.WordN m) (Grisette.IR.SymPrim.Data.BV.WordN w)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, GHC.TypeNats.KnownNat r, n Data.Type.Ord.<= r) => Grisette.Core.Data.Class.BitVector.BVExtend (Grisette.IR.SymPrim.Data.BV.IntN n) r (Grisette.IR.SymPrim.Data.BV.IntN r)
- Grisette.IR.SymPrim.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, GHC.TypeNats.KnownNat r, n Data.Type.Ord.<= r) => Grisette.Core.Data.Class.BitVector.BVExtend (Grisette.IR.SymPrim.Data.BV.WordN n) r (Grisette.IR.SymPrim.Data.BV.WordN r)
- Grisette.IR.SymPrim.Data.BV: instance Control.DeepSeq.NFData (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance Control.DeepSeq.NFData (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance Data.Hashable.Class.Hashable (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance Data.Hashable.Class.Hashable (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance GHC.Classes.Eq (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance GHC.Classes.Eq (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance GHC.Classes.Ord (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance GHC.Generics.Generic (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance GHC.Generics.Generic (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: instance Language.Haskell.TH.Syntax.Lift (Grisette.IR.SymPrim.Data.BV.IntN n)
- Grisette.IR.SymPrim.Data.BV: instance Language.Haskell.TH.Syntax.Lift (Grisette.IR.SymPrim.Data.BV.WordN n)
- Grisette.IR.SymPrim.Data.BV: newtype IntN (n :: Nat)
- Grisette.IR.SymPrim.Data.BV: newtype WordN (n :: Nat)
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: divIntegerTerm :: Term Integer -> Term Integer -> Term Integer
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: modIntegerTerm :: Term Integer -> Term Integer -> Term Integer
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: FunArg :: FunArg
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [DivIntegerTerm] :: !Id -> Term Integer -> Term Integer -> Term Integer
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [ModIntegerTerm] :: !Id -> Term Integer -> Term Integer -> Term Integer
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UDivIntegerTerm] :: Term Integer -> Term Integer -> UTerm Integer
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UModIntegerTerm] :: Term Integer -> Term Integer -> UTerm Integer
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: data FunArg
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.IR.SymPrim.Data.BV.IntN w)
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.IR.SymPrim.Data.BV.WordN w)
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance Control.DeepSeq.NFData Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.FunArg
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance Data.Hashable.Class.Hashable Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.FunArg
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance GHC.Classes.Eq Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.FunArg
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance GHC.Classes.Ord Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.FunArg
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance GHC.Generics.Generic Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.FunArg
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance GHC.Show.Show Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.FunArg
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance Language.Haskell.TH.Syntax.Lift Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.FunArg
- Grisette.IR.SymPrim.Data.Prim.Model: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair a, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair b) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.Prim.Model: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair a, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair b, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair c) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.Prim.Model: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair a, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair b, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair c, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair d) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.Prim.Model: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair a, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair b, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair c, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair d, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair e) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.Prim.Model: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair a, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair b, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair c, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair d, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair e, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair f) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.Prim.Model: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair a, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair b, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair c, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair d, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair e, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair f, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair g) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.Prim.Model: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair a, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair b, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair c, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair d, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair e, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair f, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair g, Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair h) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.Prim.Model: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair t) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer: pevalDivIntegerTerm :: Term Integer -> Term Integer -> Term Integer
- Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer: pevalModIntegerTerm :: Term Integer -> Term Integer -> Term Integer
- Grisette.IR.SymPrim.Data.SymPrim: (:=) :: Sym t -> t -> ModelSymPair t
- Grisette.IR.SymPrim.Data.SymPrim: Sym :: Term a -> Sym a
- Grisette.IR.SymPrim.Data.SymPrim: [underlyingTerm] :: Sym a -> Term a
- Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat ix, GHC.TypeNats.KnownNat w, GHC.TypeNats.KnownNat ow, (ix GHC.TypeNats.+ w) Data.Type.Ord.<= ow, 1 Data.Type.Ord.<= ow, 1 Data.Type.Ord.<= w) => Grisette.Core.Data.Class.BitVector.BVSelect (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN ow)) ix w (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN w))
- Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat ix, GHC.TypeNats.KnownNat w, GHC.TypeNats.KnownNat ow, (ix GHC.TypeNats.+ w) Data.Type.Ord.<= ow, 1 Data.Type.Ord.<= ow, 1 Data.Type.Ord.<= w) => Grisette.Core.Data.Class.BitVector.BVSelect (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN ow)) ix w (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN w))
- Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat w', GHC.TypeNats.KnownNat n, GHC.TypeNats.KnownNat w, w' GHC.Types.~ (n GHC.TypeNats.+ w), 1 Data.Type.Ord.<= n, 1 Data.Type.Ord.<= w, 1 Data.Type.Ord.<= w') => Grisette.Core.Data.Class.BitVector.BVConcat (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN n)) (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN w)) (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN w'))
- Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat w', GHC.TypeNats.KnownNat n, GHC.TypeNats.KnownNat w, w' GHC.Types.~ (n GHC.TypeNats.+ w), 1 Data.Type.Ord.<= n, 1 Data.Type.Ord.<= w, 1 Data.Type.Ord.<= w') => Grisette.Core.Data.Class.BitVector.BVConcat (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN n)) (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN w)) (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN w'))
- Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat w, GHC.TypeNats.KnownNat w', 1 Data.Type.Ord.<= w, 1 Data.Type.Ord.<= w', (w GHC.TypeNats.+ 1) Data.Type.Ord.<= w', w Data.Type.Ord.<= w', 1 Data.Type.Ord.<= (w' GHC.TypeNats.- w), GHC.TypeNats.KnownNat (w' GHC.TypeNats.- w)) => Grisette.Core.Data.Class.BitVector.BVExtend (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN w)) w' (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN w'))
- Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat w, GHC.TypeNats.KnownNat w', 1 Data.Type.Ord.<= w, 1 Data.Type.Ord.<= w', w Data.Type.Ord.<= w', (w GHC.TypeNats.+ 1) Data.Type.Ord.<= w', 1 Data.Type.Ord.<= (w' GHC.TypeNats.- w), GHC.TypeNats.KnownNat (w' GHC.TypeNats.- w)) => Grisette.Core.Data.Class.BitVector.BVExtend (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN w)) w' (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN w'))
- Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim b) => Grisette.Core.Data.Class.Function.Function (a Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.--> b)
- Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim b) => Grisette.Core.Data.Class.Function.Function (a Grisette.IR.SymPrim.Data.SymPrim.-~> b)
- Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim b) => Grisette.Core.Data.Class.Function.Function (a Grisette.IR.SymPrim.Data.SymPrim.=~> b)
- Grisette.IR.SymPrim.Data.SymPrim: instance Control.DeepSeq.NFData (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Generics.Generic (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Num.Num (Grisette.IR.SymPrim.Data.SymPrim.Sym GHC.Num.Integer.Integer)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Bool.SymBoolOp (Grisette.IR.SymPrim.Data.SymPrim.Sym GHC.Types.Bool)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Integer.SignedDivMod (Grisette.IR.SymPrim.Data.SymPrim.Sym GHC.Num.Integer.Integer)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Integer.SymIntegerOp (Grisette.IR.SymPrim.Data.SymPrim.Sym GHC.Num.Integer.Integer)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair a, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair b) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair a, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair b, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair c) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair a, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair b, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair c, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair d) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair a, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair b, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair c, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair d, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair e) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair a, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair b, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair c, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair d, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair e, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair f) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair a, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair b, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair c, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair d, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair e, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair f, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair g) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair a, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair b, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair c, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair d, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair e, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair f, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair g, Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair h) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair t) Grisette.IR.SymPrim.Data.Prim.Model.Model Grisette.IR.SymPrim.Data.Prim.Model.SymbolSet Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.TypedSymbol
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.SOrd.SOrd (Grisette.IR.SymPrim.Data.SymPrim.Sym GHC.Types.Bool)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN 16)) GHC.Int.Int16
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN 32)) GHC.Int.Int32
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN 64)) GHC.Int.Int64
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN 64)) GHC.Types.Int
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN 8)) GHC.Int.Int8
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN 16)) GHC.Word.Word16
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN 32)) GHC.Word.Word32
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN 64)) GHC.Types.Word
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN 64)) GHC.Word.Word64
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN 8)) GHC.Word.Word8
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int16 (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN 16))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int32 (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN 32))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int64 (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN 64))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int8 (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN 8))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Types.Int (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN 64))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Types.Word (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN 64))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word16 (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN 16))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word32 (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN 32))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word64 (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN 64))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word8 (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN 8))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.IR.SymPrim.Data.BV.IntN n) => GHC.Bits.Bits (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN n))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.IR.SymPrim.Data.BV.IntN n) => GHC.Num.Num (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN n))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.IR.SymPrim.Data.BV.IntN n) => Grisette.Core.Data.Class.Bool.SEq (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN n))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.IR.SymPrim.Data.BV.IntN n) => Grisette.Core.Data.Class.SOrd.SOrd (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.IntN n))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.IR.SymPrim.Data.BV.WordN n) => GHC.Bits.Bits (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN n))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.IR.SymPrim.Data.BV.WordN n) => GHC.Num.Num (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN n))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.IR.SymPrim.Data.BV.WordN n) => Grisette.Core.Data.Class.Bool.SEq (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN n))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.IR.SymPrim.Data.BV.WordN n) => Grisette.Core.Data.Class.SOrd.SOrd (Grisette.IR.SymPrim.Data.SymPrim.Sym (Grisette.IR.SymPrim.Data.BV.WordN n))
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim GHC.Num.Integer.Integer => Grisette.Core.Data.Class.Bool.SEq (Grisette.IR.SymPrim.Data.SymPrim.Sym GHC.Num.Integer.Integer)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim GHC.Num.Integer.Integer => Grisette.Core.Data.Class.SOrd.SOrd (Grisette.IR.SymPrim.Data.SymPrim.Sym GHC.Num.Integer.Integer)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim GHC.Types.Bool => Grisette.Core.Data.Class.Bool.SEq (Grisette.IR.SymPrim.Data.SymPrim.Sym GHC.Types.Bool)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Data.Hashable.Class.Hashable (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => GHC.Classes.Eq (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => GHC.Show.Show (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.Evaluate.EvaluateSym (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.Solvable.Solvable a (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym a) (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.Sym a) a
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.IR.SymPrim.Data.SymPrim.Sym a) (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a => Grisette.Core.Data.Class.ToSym.ToSym a (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim t => Data.String.IsString (Grisette.IR.SymPrim.Data.SymPrim.Sym t)
- Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim t => GHC.Show.Show (Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair t)
- Grisette.IR.SymPrim.Data.SymPrim: instance Language.Haskell.TH.Syntax.Lift (Grisette.IR.SymPrim.Data.SymPrim.Sym a)
- Grisette.IR.SymPrim.Data.SymPrim: newtype Sym a
- Grisette.IR.SymPrim.Data.SymPrim: type SymBool = Sym Bool
- Grisette.IR.SymPrim.Data.SymPrim: type SymIntN n = Sym (IntN n)
- Grisette.IR.SymPrim.Data.SymPrim: type SymInteger = Sym Integer
- Grisette.IR.SymPrim.Data.SymPrim: type SymWordN n = Sym (WordN n)
- Grisette.IR.SymPrim.Data.SymPrim: type a -~> b = Sym (a --> b)
- Grisette.Internal.IR.SymPrim: FunArg :: FunArg
- Grisette.Internal.IR.SymPrim: Sym :: Term a -> Sym a
- Grisette.Internal.IR.SymPrim: [DivIntegerTerm] :: !Id -> Term Integer -> Term Integer -> Term Integer
- Grisette.Internal.IR.SymPrim: [ModIntegerTerm] :: !Id -> Term Integer -> Term Integer -> Term Integer
- Grisette.Internal.IR.SymPrim: [underlyingTerm] :: Sym a -> Term a
- Grisette.Internal.IR.SymPrim: data FunArg
- Grisette.Internal.IR.SymPrim: newtype Sym a
- Grisette.Internal.IR.SymPrim: pevalDivIntegerTerm :: Term Integer -> Term Integer -> Term Integer
- Grisette.Internal.IR.SymPrim: pevalModIntegerTerm :: Term Integer -> Term Integer -> Term Integer
+ Grisette.Backend.SBV: DSat :: Maybe String -> SolvingFailure
+ Grisette.Backend.SBV: ExtraConfig :: Maybe Int -> ApproximationConfig i -> ExtraConfig (i :: Nat)
+ Grisette.Backend.SBV: GrisetteSMTConfig :: SMTConfig -> ExtraConfig i -> GrisetteSMTConfig (i :: Nat)
+ Grisette.Backend.SBV: ResultNumLimitReached :: SolvingFailure
+ Grisette.Backend.SBV: SolvingError :: SBVException -> SolvingFailure
+ Grisette.Backend.SBV: Unk :: SolvingFailure
+ Grisette.Backend.SBV: Unsat :: SolvingFailure
+ Grisette.Backend.SBV: [Approx] :: (KnownNat n, IsZero n ~ 'False, BVIsNonZero n) => p n -> ApproximationConfig n
+ Grisette.Backend.SBV: [NoApprox] :: ApproximationConfig 0
+ Grisette.Backend.SBV: [extraConfig] :: GrisetteSMTConfig (i :: Nat) -> ExtraConfig i
+ Grisette.Backend.SBV: [integerApprox] :: ExtraConfig (i :: Nat) -> ApproximationConfig i
+ Grisette.Backend.SBV: [sbvConfig] :: GrisetteSMTConfig (i :: Nat) -> SMTConfig
+ Grisette.Backend.SBV: [timeout] :: ExtraConfig (i :: Nat) -> Maybe Int
+ Grisette.Backend.SBV: approx :: forall p n. (KnownNat n, IsZero n ~ 'False, BVIsNonZero n) => p n -> SMTConfig -> GrisetteSMTConfig n
+ Grisette.Backend.SBV: clearApprox :: GrisetteSMTConfig i -> GrisetteSMTConfig 0
+ Grisette.Backend.SBV: clearTimeout :: GrisetteSMTConfig i -> GrisetteSMTConfig i
+ Grisette.Backend.SBV: data ApproximationConfig (n :: Nat)
+ Grisette.Backend.SBV: data ExtraConfig (i :: Nat)
+ Grisette.Backend.SBV: data SolvingFailure
+ Grisette.Backend.SBV: precise :: SMTConfig -> GrisetteSMTConfig 0
+ Grisette.Backend.SBV: withApprox :: (KnownNat n, IsZero n ~ 'False, BVIsNonZero n) => p n -> GrisetteSMTConfig i -> GrisetteSMTConfig n
+ Grisette.Backend.SBV: withTimeout :: Int -> GrisetteSMTConfig i -> GrisetteSMTConfig i
+ Grisette.Backend.SBV.Data.SMT.Lowering: instance Grisette.Backend.SBV.Data.SMT.Lowering.SBVFreshMonad Data.SBV.Core.Symbolic.Query
+ Grisette.Backend.SBV.Data.SMT.Lowering: instance Grisette.Backend.SBV.Data.SMT.Lowering.SBVFreshMonad Data.SBV.Core.Symbolic.Symbolic
+ Grisette.Backend.SBV.Data.SMT.Lowering: lowerSinglePrimCached :: forall integerBitWidth a m. (HasCallStack, SBVFreshMonad m) => GrisetteSMTConfig integerBitWidth -> Term a -> SymBiMap -> m (SymBiMap, TermTy integerBitWidth a)
+ Grisette.Backend.SBV.Data.SMT.Solving: DSat :: Maybe String -> SolvingFailure
+ Grisette.Backend.SBV.Data.SMT.Solving: ExtraConfig :: Maybe Int -> ApproximationConfig i -> ExtraConfig (i :: Nat)
+ Grisette.Backend.SBV.Data.SMT.Solving: GrisetteSMTConfig :: SMTConfig -> ExtraConfig i -> GrisetteSMTConfig (i :: Nat)
+ Grisette.Backend.SBV.Data.SMT.Solving: ResultNumLimitReached :: SolvingFailure
+ Grisette.Backend.SBV.Data.SMT.Solving: SolvingError :: SBVException -> SolvingFailure
+ Grisette.Backend.SBV.Data.SMT.Solving: Unk :: SolvingFailure
+ Grisette.Backend.SBV.Data.SMT.Solving: Unsat :: SolvingFailure
+ Grisette.Backend.SBV.Data.SMT.Solving: [Approx] :: (KnownNat n, IsZero n ~ 'False, BVIsNonZero n) => p n -> ApproximationConfig n
+ Grisette.Backend.SBV.Data.SMT.Solving: [NoApprox] :: ApproximationConfig 0
+ Grisette.Backend.SBV.Data.SMT.Solving: [extraConfig] :: GrisetteSMTConfig (i :: Nat) -> ExtraConfig i
+ Grisette.Backend.SBV.Data.SMT.Solving: [integerApprox] :: ExtraConfig (i :: Nat) -> ApproximationConfig i
+ Grisette.Backend.SBV.Data.SMT.Solving: [sbvConfig] :: GrisetteSMTConfig (i :: Nat) -> SMTConfig
+ Grisette.Backend.SBV.Data.SMT.Solving: [timeout] :: ExtraConfig (i :: Nat) -> Maybe Int
+ Grisette.Backend.SBV.Data.SMT.Solving: approx :: forall p n. (KnownNat n, IsZero n ~ 'False, BVIsNonZero n) => p n -> SMTConfig -> GrisetteSMTConfig n
+ Grisette.Backend.SBV.Data.SMT.Solving: clearApprox :: GrisetteSMTConfig i -> GrisetteSMTConfig 0
+ Grisette.Backend.SBV.Data.SMT.Solving: clearTimeout :: GrisetteSMTConfig i -> GrisetteSMTConfig i
+ Grisette.Backend.SBV.Data.SMT.Solving: data ApproximationConfig (n :: Nat)
+ Grisette.Backend.SBV.Data.SMT.Solving: data ExtraConfig (i :: Nat)
+ Grisette.Backend.SBV.Data.SMT.Solving: data SolvingFailure
+ Grisette.Backend.SBV.Data.SMT.Solving: instance GHC.Show.Show Grisette.Backend.SBV.Data.SMT.Solving.SolvingFailure
+ Grisette.Backend.SBV.Data.SMT.Solving: instance Grisette.Core.Data.Class.CEGISSolver.CEGISSolver (Grisette.Backend.SBV.Data.SMT.Solving.GrisetteSMTConfig n) Grisette.Backend.SBV.Data.SMT.Solving.SolvingFailure
+ Grisette.Backend.SBV.Data.SMT.Solving: instance Grisette.Core.Data.Class.Solver.Solver (Grisette.Backend.SBV.Data.SMT.Solving.GrisetteSMTConfig n) Grisette.Backend.SBV.Data.SMT.Solving.SolvingFailure
+ Grisette.Backend.SBV.Data.SMT.Solving: precise :: SMTConfig -> GrisetteSMTConfig 0
+ Grisette.Backend.SBV.Data.SMT.Solving: withApprox :: (KnownNat n, IsZero n ~ 'False, BVIsNonZero n) => p n -> GrisetteSMTConfig i -> GrisetteSMTConfig n
+ Grisette.Backend.SBV.Data.SMT.Solving: withTimeout :: Int -> GrisetteSMTConfig i -> GrisetteSMTConfig i
+ Grisette.Core: class (UnionLike m, Monad m) => MonadParallelUnion m
+ Grisette.Core: class (SOrd a, Num a, Mergeable a, Mergeable e) => SafeDivision e a | a -> e
+ Grisette.Core: class (SOrd a, Num a, Mergeable a, Mergeable e) => SafeLinearArith e a | a -> e
+ Grisette.Core: class SizedBV bv
+ Grisette.Core: class SomeBV bv
+ Grisette.Core: exceptFor' :: ModelOps model symbolSet typedSymbol => typedSymbol t -> model -> model
+ Grisette.Core: modelContains :: ModelOps model symbolSet typedSymbol => typedSymbol a -> model -> Bool
+ Grisette.Core: parBindUnion :: (MonadParallelUnion m, Mergeable b, NFData b) => m a -> (a -> m b) -> m b
+ Grisette.Core: safeAdd :: (SafeLinearArith e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core: safeAdd' :: (SafeLinearArith e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core: safeDiv :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core: safeDiv' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core: safeDivMod :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf (a, a)
+ Grisette.Core: safeDivMod' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf (a, a)
+ Grisette.Core: safeMinus :: (SafeLinearArith e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core: safeMinus' :: (SafeLinearArith e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core: safeMod :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core: safeMod' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core: safeNeg :: (SafeLinearArith e a, MonadError e uf, MonadUnion uf) => a -> uf a
+ Grisette.Core: safeNeg' :: (SafeLinearArith e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> uf a
+ Grisette.Core: safeQuot :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core: safeQuot' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core: safeQuotRem :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf (a, a)
+ Grisette.Core: safeQuotRem' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf (a, a)
+ Grisette.Core: safeRem :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core: safeRem' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core: sizedBVConcat :: (SizedBV bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r) => bv l -> bv r -> bv (l + r)
+ Grisette.Core: sizedBVExt :: (SizedBV bv, KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) => proxy r -> bv l -> bv r
+ Grisette.Core: sizedBVExtract :: forall proxy i j n bv. (SizedBV bv, KnownNat n, KnownNat i, KnownNat j, 1 <= n, (i + 1) <= n, j <= i) => proxy i -> proxy j -> bv n -> bv ((i - j) + 1)
+ Grisette.Core: sizedBVSelect :: (SizedBV bv, KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, (ix + w) <= n) => proxy ix -> proxy w -> bv n -> bv w
+ Grisette.Core: sizedBVSext :: (SizedBV bv, KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) => proxy r -> bv l -> bv r
+ Grisette.Core: sizedBVZext :: (SizedBV bv, KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) => proxy r -> bv l -> bv r
+ Grisette.Core: someBVConcat :: SomeBV bv => bv -> bv -> bv
+ Grisette.Core: someBVExt :: forall p l. (SomeBV bv, KnownNat l) => p l -> bv -> bv
+ Grisette.Core: someBVExt' :: forall l bv. SomeBV bv => NatRepr l -> bv -> bv
+ Grisette.Core: someBVExtract :: forall p (i :: Nat) q (j :: Nat) bv. (SomeBV bv, KnownNat i, KnownNat j) => p i -> q j -> bv -> bv
+ Grisette.Core: someBVExtract' :: forall (i :: Nat) (j :: Nat) bv. SomeBV bv => NatRepr i -> NatRepr j -> bv -> bv
+ Grisette.Core: someBVSelect :: forall p ix q w. (SomeBV bv, KnownNat ix, KnownNat w) => p ix -> q w -> bv -> bv
+ Grisette.Core: someBVSelect' :: forall ix w bv. SomeBV bv => NatRepr ix -> NatRepr w -> bv -> bv
+ Grisette.Core: someBVSext :: forall p l. (SomeBV bv, KnownNat l) => p l -> bv -> bv
+ Grisette.Core: someBVSext' :: forall l bv. SomeBV bv => NatRepr l -> bv -> bv
+ Grisette.Core: someBVZext :: forall p l. (SomeBV bv, KnownNat l) => p l -> bv -> bv
+ Grisette.Core: someBVZext' :: forall l bv. SomeBV bv => NatRepr l -> bv -> bv
+ Grisette.Core: symAssertWith :: (Mergeable e, MonadError e erm, MonadUnion erm) => e -> SymBool -> erm ()
+ Grisette.Core: unionSize :: UnionM a -> Int
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: class (UnionLike m, Monad m) => MonadParallelUnion m
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: instance (Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion m, Grisette.Core.Data.Class.Mergeable.Mergeable a, Control.DeepSeq.NFData a) => Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion (Control.Monad.Trans.Reader.ReaderT a m)
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: instance (Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion m, Grisette.Core.Data.Class.Mergeable.Mergeable e, Control.DeepSeq.NFData e) => Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion (Control.Monad.Trans.Except.ExceptT e m)
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: instance (Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion m, Grisette.Core.Data.Class.Mergeable.Mergeable s, Control.DeepSeq.NFData s) => Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion (Control.Monad.Trans.State.Lazy.StateT s m)
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: instance (Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion m, Grisette.Core.Data.Class.Mergeable.Mergeable s, Control.DeepSeq.NFData s) => Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion (Control.Monad.Trans.State.Strict.StateT s m)
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: instance (Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion m, Grisette.Core.Data.Class.Mergeable.Mergeable s, GHC.Base.Monoid s, Control.DeepSeq.NFData s) => Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion (Control.Monad.Trans.Writer.Lazy.WriterT s m)
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: instance (Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion m, Grisette.Core.Data.Class.Mergeable.Mergeable s, GHC.Base.Monoid s, Control.DeepSeq.NFData s) => Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion (Control.Monad.Trans.Writer.Strict.WriterT s m)
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: instance (Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion m, Grisette.Core.Data.Class.Mergeable.Mergeable s, Grisette.Core.Data.Class.Mergeable.Mergeable r, Grisette.Core.Data.Class.Mergeable.Mergeable w, GHC.Base.Monoid w, Control.DeepSeq.NFData r, Control.DeepSeq.NFData w, Control.DeepSeq.NFData s) => Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: instance (Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion m, Grisette.Core.Data.Class.Mergeable.Mergeable s, Grisette.Core.Data.Class.Mergeable.Mergeable r, Grisette.Core.Data.Class.Mergeable.Mergeable w, GHC.Base.Monoid w, Control.DeepSeq.NFData r, Control.DeepSeq.NFData w, Control.DeepSeq.NFData s) => Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion (Control.Monad.Trans.RWS.Strict.RWST r w s m)
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: instance Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion m => Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion (Control.Monad.Trans.Identity.IdentityT m)
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: instance Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion m => Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion (Control.Monad.Trans.Maybe.MaybeT m)
+ Grisette.Core.Control.Monad.Class.MonadParallelUnion: parBindUnion :: (MonadParallelUnion m, Mergeable b, NFData b) => m a -> (a -> m b) -> m b
+ Grisette.Core.Control.Monad.UnionM: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Control.Monad.UnionM.UnionM (Grisette.Core.Data.BV.IntN n)) (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.Core.Control.Monad.UnionM: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Control.Monad.UnionM.UnionM (Grisette.Core.Data.BV.WordN n)) (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.Core.Control.Monad.UnionM: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Control.Monad.UnionM.UnionM (ca Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.--> cb)) (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.Core.Control.Monad.UnionM: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Control.Monad.UnionM.UnionM (ca Grisette.IR.SymPrim.Data.TabularFun.=-> cb)) (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.Core.Control.Monad.UnionM: instance Grisette.Core.Control.Monad.Class.MonadParallelUnion.MonadParallelUnion Grisette.Core.Control.Monad.UnionM.UnionM
+ Grisette.Core.Control.Monad.UnionM: instance Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Control.Monad.UnionM.UnionM GHC.Num.Integer.Integer) Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.Core.Control.Monad.UnionM: instance Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Control.Monad.UnionM.UnionM GHC.Types.Bool) Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.Core.Control.Monad.UnionM: instance Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Control.Monad.UnionM.UnionM Grisette.Core.Data.BV.SomeIntN) Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.Core.Control.Monad.UnionM: instance Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Control.Monad.UnionM.UnionM Grisette.Core.Data.BV.SomeWordN) Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.Core.Control.Monad.UnionM: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms a => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Grisette.Core.Control.Monad.UnionM.UnionM a)
+ Grisette.Core.Control.Monad.UnionM: unionSize :: UnionM a -> Int
+ Grisette.Core.Data.BV: BitwidthMismatch :: BitwidthMismatch
+ Grisette.Core.Data.BV: IntN :: Integer -> IntN (n :: Nat)
+ Grisette.Core.Data.BV: WordN :: Integer -> WordN (n :: Nat)
+ Grisette.Core.Data.BV: [SomeIntN] :: (KnownNat n, 1 <= n) => IntN n -> SomeIntN
+ Grisette.Core.Data.BV: [SomeWordN] :: (KnownNat n, 1 <= n) => WordN n -> SomeWordN
+ Grisette.Core.Data.BV: [unIntN] :: IntN (n :: Nat) -> Integer
+ Grisette.Core.Data.BV: [unWordN] :: WordN (n :: Nat) -> Integer
+ Grisette.Core.Data.BV: binSomeIntN :: (forall n. (KnownNat n, 1 <= n) => IntN n -> IntN n -> r) -> SomeIntN -> SomeIntN -> r
+ Grisette.Core.Data.BV: binSomeIntNR1 :: (forall n. (KnownNat n, 1 <= n) => IntN n -> IntN n -> IntN n) -> SomeIntN -> SomeIntN -> SomeIntN
+ Grisette.Core.Data.BV: binSomeIntNR2 :: (forall n. (KnownNat n, 1 <= n) => IntN n -> IntN n -> (IntN n, IntN n)) -> SomeIntN -> SomeIntN -> (SomeIntN, SomeIntN)
+ Grisette.Core.Data.BV: binSomeWordN :: HasCallStack => (forall n. (KnownNat n, 1 <= n) => WordN n -> WordN n -> r) -> SomeWordN -> SomeWordN -> r
+ Grisette.Core.Data.BV: binSomeWordNR1 :: HasCallStack => (forall n. (KnownNat n, 1 <= n) => WordN n -> WordN n -> WordN n) -> SomeWordN -> SomeWordN -> SomeWordN
+ Grisette.Core.Data.BV: binSomeWordNR2 :: HasCallStack => (forall n. (KnownNat n, 1 <= n) => WordN n -> WordN n -> (WordN n, WordN n)) -> SomeWordN -> SomeWordN -> (SomeWordN, SomeWordN)
+ Grisette.Core.Data.BV: data BitwidthMismatch
+ Grisette.Core.Data.BV: data SomeIntN
+ Grisette.Core.Data.BV: data SomeWordN
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.Bits (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.Bits (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.FiniteBits (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.FiniteBits (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Classes.Ord (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Enum.Bounded (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Enum.Bounded (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Enum.Enum (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Enum.Enum (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Read.Read (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Read.Read (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Real.Integral (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Real.Integral (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Real.Real (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Real.Real (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Show.Show (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Show.Show (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance Control.DeepSeq.NFData (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance Control.DeepSeq.NFData (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance Control.DeepSeq.NFData Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance Control.DeepSeq.NFData Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance Data.Hashable.Class.Hashable (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance Data.Hashable.Class.Hashable (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance Data.Hashable.Class.Hashable Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance Data.Hashable.Class.Hashable Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance GHC.Bits.Bits Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance GHC.Bits.Bits Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance GHC.Bits.FiniteBits Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance GHC.Bits.FiniteBits Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance GHC.Classes.Eq (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance GHC.Classes.Eq (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance GHC.Classes.Eq Grisette.Core.Data.BV.BitwidthMismatch
+ Grisette.Core.Data.BV: instance GHC.Classes.Eq Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance GHC.Classes.Eq Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance GHC.Classes.Ord (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance GHC.Classes.Ord Grisette.Core.Data.BV.BitwidthMismatch
+ Grisette.Core.Data.BV: instance GHC.Classes.Ord Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance GHC.Classes.Ord Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance GHC.Enum.Enum Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance GHC.Enum.Enum Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance GHC.Exception.Type.Exception Grisette.Core.Data.BV.BitwidthMismatch
+ Grisette.Core.Data.BV: instance GHC.Generics.Generic (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance GHC.Generics.Generic (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance GHC.Generics.Generic Grisette.Core.Data.BV.BitwidthMismatch
+ Grisette.Core.Data.BV: instance GHC.Num.Num Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance GHC.Num.Num Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance GHC.Real.Integral Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance GHC.Real.Integral Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance GHC.Real.Real Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance GHC.Real.Real Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance GHC.Show.Show Grisette.Core.Data.BV.BitwidthMismatch
+ Grisette.Core.Data.BV: instance GHC.Show.Show Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance GHC.Show.Show Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance Grisette.Core.Data.Class.BitVector.SizedBV Grisette.Core.Data.BV.IntN
+ Grisette.Core.Data.BV: instance Grisette.Core.Data.Class.BitVector.SizedBV Grisette.Core.Data.BV.WordN
+ Grisette.Core.Data.BV: instance Grisette.Core.Data.Class.BitVector.SomeBV Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance Grisette.Core.Data.Class.BitVector.SomeBV Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: instance Language.Haskell.TH.Syntax.Lift (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.BV: instance Language.Haskell.TH.Syntax.Lift (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.BV: instance Language.Haskell.TH.Syntax.Lift Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.BV: instance Language.Haskell.TH.Syntax.Lift Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.BV: newtype IntN (n :: Nat)
+ Grisette.Core.Data.BV: newtype WordN (n :: Nat)
+ Grisette.Core.Data.BV: unarySomeIntN :: (forall n. (KnownNat n, 1 <= n) => IntN n -> r) -> SomeIntN -> r
+ Grisette.Core.Data.BV: unarySomeIntNR1 :: (forall n. (KnownNat n, 1 <= n) => IntN n -> IntN n) -> SomeIntN -> SomeIntN
+ Grisette.Core.Data.BV: unarySomeWordN :: HasCallStack => (forall n. (KnownNat n, 1 <= n) => WordN n -> r) -> SomeWordN -> r
+ Grisette.Core.Data.BV: unarySomeWordNR1 :: HasCallStack => (forall n. (KnownNat n, 1 <= n) => WordN n -> WordN n) -> SomeWordN -> SomeWordN
+ Grisette.Core.Data.Class.BitVector: class SizedBV bv
+ Grisette.Core.Data.Class.BitVector: class SomeBV bv
+ Grisette.Core.Data.Class.BitVector: sizedBVConcat :: (SizedBV bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r) => bv l -> bv r -> bv (l + r)
+ Grisette.Core.Data.Class.BitVector: sizedBVExt :: (SizedBV bv, KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) => proxy r -> bv l -> bv r
+ Grisette.Core.Data.Class.BitVector: sizedBVExtract :: forall proxy i j n bv. (SizedBV bv, KnownNat n, KnownNat i, KnownNat j, 1 <= n, (i + 1) <= n, j <= i) => proxy i -> proxy j -> bv n -> bv ((i - j) + 1)
+ Grisette.Core.Data.Class.BitVector: sizedBVSelect :: (SizedBV bv, KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, (ix + w) <= n) => proxy ix -> proxy w -> bv n -> bv w
+ Grisette.Core.Data.Class.BitVector: sizedBVSext :: (SizedBV bv, KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) => proxy r -> bv l -> bv r
+ Grisette.Core.Data.Class.BitVector: sizedBVZext :: (SizedBV bv, KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) => proxy r -> bv l -> bv r
+ Grisette.Core.Data.Class.BitVector: someBVConcat :: SomeBV bv => bv -> bv -> bv
+ Grisette.Core.Data.Class.BitVector: someBVExt :: forall p l. (SomeBV bv, KnownNat l) => p l -> bv -> bv
+ Grisette.Core.Data.Class.BitVector: someBVExt' :: forall l bv. SomeBV bv => NatRepr l -> bv -> bv
+ Grisette.Core.Data.Class.BitVector: someBVExtract :: forall p (i :: Nat) q (j :: Nat) bv. (SomeBV bv, KnownNat i, KnownNat j) => p i -> q j -> bv -> bv
+ Grisette.Core.Data.Class.BitVector: someBVExtract' :: forall (i :: Nat) (j :: Nat) bv. SomeBV bv => NatRepr i -> NatRepr j -> bv -> bv
+ Grisette.Core.Data.Class.BitVector: someBVSelect :: forall p ix q w. (SomeBV bv, KnownNat ix, KnownNat w) => p ix -> q w -> bv -> bv
+ Grisette.Core.Data.Class.BitVector: someBVSelect' :: forall ix w bv. SomeBV bv => NatRepr ix -> NatRepr w -> bv -> bv
+ Grisette.Core.Data.Class.BitVector: someBVSext :: forall p l. (SomeBV bv, KnownNat l) => p l -> bv -> bv
+ Grisette.Core.Data.Class.BitVector: someBVSext' :: forall l bv. SomeBV bv => NatRepr l -> bv -> bv
+ Grisette.Core.Data.Class.BitVector: someBVZext :: forall p l. (SomeBV bv, KnownNat l) => p l -> bv -> bv
+ Grisette.Core.Data.Class.BitVector: someBVZext' :: forall l bv. SomeBV bv => NatRepr l -> bv -> bv
+ Grisette.Core.Data.Class.Bool: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Bool.ITEOp (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.Core.Data.Class.Bool: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Bool.ITEOp (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.Core.Data.Class.Bool: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Bool.SEq (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.Bool: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Bool.SEq (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.Bool: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Bool.ITEOp (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.Core.Data.Class.Bool: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Bool.ITEOp (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.Core.Data.Class.Bool: instance Grisette.Core.Data.Class.Bool.ITEOp Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.Core.Data.Class.Bool: instance Grisette.Core.Data.Class.Bool.ITEOp Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.Core.Data.Class.Bool: instance Grisette.Core.Data.Class.Bool.ITEOp Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.Core.Data.Class.Bool: instance Grisette.Core.Data.Class.Bool.ITEOp Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.Core.Data.Class.Bool: instance Grisette.Core.Data.Class.Bool.LogicalOp Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.Core.Data.Class.Bool: instance Grisette.Core.Data.Class.Bool.SEq Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.Bool: instance Grisette.Core.Data.Class.Bool.SEq Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Class.Error: symAssertWith :: (Mergeable e, MonadError e erm, MonadUnion erm) => e -> SymBool -> erm ()
+ Grisette.Core.Data.Class.Evaluate: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Evaluate.EvaluateSym (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.Evaluate: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Evaluate.EvaluateSym (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.Evaluate: instance Grisette.Core.Data.Class.Evaluate.EvaluateSym Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.Evaluate: instance Grisette.Core.Data.Class.Evaluate.EvaluateSym Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Class.ExtractSymbolics: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.ExtractSymbolics: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.ExtractSymbolics: instance Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.ExtractSymbolics: instance Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSym () (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSym () (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSym (Grisette.Core.Data.BV.IntN n) (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSym (Grisette.Core.Data.BV.WordN n) (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSym (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n) (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSym (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n) (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSym (p n) Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSym (p n) Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSymSimple () (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSymSimple () (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSymSimple (Grisette.Core.Data.BV.IntN n) (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSymSimple (Grisette.Core.Data.BV.WordN n) (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSymSimple (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n) (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSymSimple (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n) (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSymSimple (p n) Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.Core.Data.Class.GenSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.GenSym.GenSymSimple (p n) Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.Core.Data.Class.GenSym.MonadFresh m, GHC.Base.Monoid w) => Grisette.Core.Data.Class.GenSym.MonadFresh (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.Core.Data.Class.GenSym.MonadFresh m, GHC.Base.Monoid w) => Grisette.Core.Data.Class.GenSym.MonadFresh (Control.Monad.Trans.RWS.Strict.RWST r w s m)
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.Core.Data.Class.GenSym.MonadFresh m, GHC.Base.Monoid w) => Grisette.Core.Data.Class.GenSym.MonadFresh (Control.Monad.Trans.Writer.Lazy.WriterT w m)
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.Core.Data.Class.GenSym.MonadFresh m, GHC.Base.Monoid w) => Grisette.Core.Data.Class.GenSym.MonadFresh (Control.Monad.Trans.Writer.Strict.WriterT w m)
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.GenSym.GenSym () (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.GenSym.GenSym () (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.GenSym.GenSym (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb) (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.GenSym.GenSym (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb) (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.GenSym.GenSymSimple () (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.GenSym.GenSymSimple () (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.GenSym.GenSymSimple (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb) (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.Core.Data.Class.GenSym: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.GenSym.GenSymSimple (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb) (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.Core.Data.Class.GenSym: instance Control.Monad.RWS.Class.MonadRWS r w s m => Control.Monad.RWS.Class.MonadRWS r w s (Grisette.Core.Data.Class.GenSym.FreshT m)
+ Grisette.Core.Data.Class.GenSym: instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (Grisette.Core.Data.Class.GenSym.FreshT m)
+ Grisette.Core.Data.Class.GenSym: instance Control.Monad.State.Class.MonadState s m => Control.Monad.State.Class.MonadState s (Grisette.Core.Data.Class.GenSym.FreshT m)
+ Grisette.Core.Data.Class.GenSym: instance Control.Monad.Writer.Class.MonadWriter w m => Control.Monad.Writer.Class.MonadWriter w (Grisette.Core.Data.Class.GenSym.FreshT m)
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSym () Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSym () Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSym Grisette.Core.Data.BV.SomeIntN Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSym Grisette.Core.Data.BV.SomeWordN Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSym Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSym Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSym Grisette.IR.SymPrim.Data.SymPrim.SymBool Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSym Grisette.IR.SymPrim.Data.SymPrim.SymInteger Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSymSimple () Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSymSimple () Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSymSimple Grisette.Core.Data.BV.SomeIntN Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSymSimple Grisette.Core.Data.BV.SomeWordN Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSymSimple Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSymSimple Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSymSimple Grisette.IR.SymPrim.Data.SymPrim.SymBool Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.GenSymSimple Grisette.IR.SymPrim.Data.SymPrim.SymInteger Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.MonadFresh m => Grisette.Core.Data.Class.GenSym.MonadFresh (Control.Monad.Trans.Except.ExceptT e m)
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.MonadFresh m => Grisette.Core.Data.Class.GenSym.MonadFresh (Control.Monad.Trans.Reader.ReaderT r m)
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.MonadFresh m => Grisette.Core.Data.Class.GenSym.MonadFresh (Control.Monad.Trans.State.Lazy.StateT s m)
+ Grisette.Core.Data.Class.GenSym: instance Grisette.Core.Data.Class.GenSym.MonadFresh m => Grisette.Core.Data.Class.GenSym.MonadFresh (Control.Monad.Trans.State.Strict.StateT s m)
+ Grisette.Core.Data.Class.Mergeable: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Mergeable.Mergeable (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.Mergeable: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Mergeable.Mergeable (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.Mergeable: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Mergeable.Mergeable (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.Core.Data.Class.Mergeable: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Mergeable.Mergeable (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.Core.Data.Class.Mergeable: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Mergeable.Mergeable (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.Core.Data.Class.Mergeable: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Mergeable.Mergeable (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.Core.Data.Class.Mergeable: instance Grisette.Core.Data.Class.Mergeable.Mergeable GHC.Exception.Type.ArithException
+ Grisette.Core.Data.Class.Mergeable: instance Grisette.Core.Data.Class.Mergeable.Mergeable Grisette.Core.Data.BV.BitwidthMismatch
+ Grisette.Core.Data.Class.Mergeable: instance Grisette.Core.Data.Class.Mergeable.Mergeable Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.Mergeable: instance Grisette.Core.Data.Class.Mergeable.Mergeable Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Class.Mergeable: instance Grisette.Core.Data.Class.Mergeable.Mergeable Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.Core.Data.Class.Mergeable: instance Grisette.Core.Data.Class.Mergeable.Mergeable Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.Core.Data.Class.Mergeable: instance Grisette.Core.Data.Class.Mergeable.Mergeable Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.Core.Data.Class.Mergeable: instance Grisette.Core.Data.Class.Mergeable.Mergeable Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.Core.Data.Class.ModelOps: exceptFor' :: ModelOps model symbolSet typedSymbol => typedSymbol t -> model -> model
+ Grisette.Core.Data.Class.ModelOps: modelContains :: ModelOps model symbolSet typedSymbol => typedSymbol a -> model -> Bool
+ Grisette.Core.Data.Class.SOrd: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SOrd.SOrd (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.SOrd: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SOrd.SOrd (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.SOrd: instance Grisette.Core.Data.Class.SOrd.SOrd Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.SOrd: instance Grisette.Core.Data.Class.SOrd.SOrd Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Class.SafeArith: Denormal :: ArithException
+ Grisette.Core.Data.Class.SafeArith: DivideByZero :: ArithException
+ Grisette.Core.Data.Class.SafeArith: LossOfPrecision :: ArithException
+ Grisette.Core.Data.Class.SafeArith: Overflow :: ArithException
+ Grisette.Core.Data.Class.SafeArith: RatioZeroDenominator :: ArithException
+ Grisette.Core.Data.Class.SafeArith: Underflow :: ArithException
+ Grisette.Core.Data.Class.SafeArith: class (SOrd a, Num a, Mergeable a, Mergeable e) => SafeDivision e a | a -> e
+ Grisette.Core.Data.Class.SafeArith: class (SOrd a, Num a, Mergeable a, Mergeable e) => SafeLinearArith e a | a -> e
+ Grisette.Core.Data.Class.SafeArith: class (Num a, SEq a, SOrd a, Solvable Integer a) => SymIntegerOp a
+ Grisette.Core.Data.Class.SafeArith: data ArithException
+ Grisette.Core.Data.Class.SafeArith: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.SafeArith: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.SafeArith: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.SafeArith: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision (Data.Either.Either Grisette.Core.Data.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision (Data.Either.Either Grisette.Core.Data.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException GHC.Int.Int16
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException GHC.Int.Int32
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException GHC.Int.Int64
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException GHC.Int.Int8
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException GHC.Num.Integer.Integer
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException GHC.Types.Int
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException GHC.Types.Word
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException GHC.Word.Word16
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException GHC.Word.Word32
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException GHC.Word.Word64
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException GHC.Word.Word8
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith (Data.Either.Either Grisette.Core.Data.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith (Data.Either.Either Grisette.Core.Data.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException GHC.Int.Int16
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException GHC.Int.Int32
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException GHC.Int.Int64
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException GHC.Int.Int8
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException GHC.Num.Integer.Integer
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException GHC.Types.Int
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException GHC.Types.Word
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException GHC.Word.Word16
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException GHC.Word.Word32
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException GHC.Word.Word64
+ Grisette.Core.Data.Class.SafeArith: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException GHC.Word.Word8
+ Grisette.Core.Data.Class.SafeArith: safeAdd :: (SafeLinearArith e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeAdd' :: (SafeLinearArith e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeDiv :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeDiv' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeDivMod :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf (a, a)
+ Grisette.Core.Data.Class.SafeArith: safeDivMod' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf (a, a)
+ Grisette.Core.Data.Class.SafeArith: safeMinus :: (SafeLinearArith e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeMinus' :: (SafeLinearArith e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeMod :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeMod' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeNeg :: (SafeLinearArith e a, MonadError e uf, MonadUnion uf) => a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeNeg' :: (SafeLinearArith e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeQuot :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeQuot' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeQuotRem :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf (a, a)
+ Grisette.Core.Data.Class.SafeArith: safeQuotRem' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf (a, a)
+ Grisette.Core.Data.Class.SafeArith: safeRem :: (SafeDivision e a, MonadError e uf, MonadUnion uf) => a -> a -> uf a
+ Grisette.Core.Data.Class.SafeArith: safeRem' :: (SafeDivision e a, MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a
+ Grisette.Core.Data.Class.SimpleMergeable: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SimpleMergeable.SimpleMergeable (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.Core.Data.Class.SimpleMergeable: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SimpleMergeable.SimpleMergeable (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.Core.Data.Class.SimpleMergeable: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.SimpleMergeable.SimpleMergeable (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.Core.Data.Class.SimpleMergeable: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.SimpleMergeable.SimpleMergeable (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.Core.Data.Class.SimpleMergeable: instance Grisette.Core.Data.Class.SimpleMergeable.SimpleMergeable Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.Core.Data.Class.SimpleMergeable: instance Grisette.Core.Data.Class.SimpleMergeable.SimpleMergeable Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.Core.Data.Class.SimpleMergeable: instance Grisette.Core.Data.Class.SimpleMergeable.SimpleMergeable Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.Core.Data.Class.SimpleMergeable: instance Grisette.Core.Data.Class.SimpleMergeable.SimpleMergeable Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.Core.Data.Class.Substitute: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Substitute.SubstituteSym (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.Substitute: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Substitute.SubstituteSym (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.Substitute: instance Grisette.Core.Data.Class.Substitute.SubstituteSym Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.Substitute: instance Grisette.Core.Data.Class.Substitute.SubstituteSym Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Class.ToCon: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToCon.ToCon (Grisette.Core.Data.BV.IntN n) (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.ToCon: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToCon.ToCon (Grisette.Core.Data.BV.WordN n) (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.ToCon: instance Grisette.Core.Data.Class.ToCon.ToCon Grisette.Core.Data.BV.SomeIntN Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.ToCon: instance Grisette.Core.Data.Class.ToCon.ToCon Grisette.Core.Data.BV.SomeWordN Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Class.ToSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Data.BV.IntN n) (Grisette.Core.Data.BV.IntN n)
+ Grisette.Core.Data.Class.ToSym: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Data.BV.WordN n) (Grisette.Core.Data.BV.WordN n)
+ Grisette.Core.Data.Class.ToSym: instance Grisette.Core.Data.Class.ToSym.ToSym Grisette.Core.Data.BV.SomeIntN Grisette.Core.Data.BV.SomeIntN
+ Grisette.Core.Data.Class.ToSym: instance Grisette.Core.Data.Class.ToSym.ToSym Grisette.Core.Data.BV.SomeWordN Grisette.Core.Data.BV.SomeWordN
+ Grisette.Core.Data.Union: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms a => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Grisette.Core.Data.Union.Union a)
+ Grisette.IR.SymPrim: SymBool :: Term Bool -> SymBool
+ Grisette.IR.SymPrim: SymIntN :: Term (IntN n) -> SymIntN (n :: Nat)
+ Grisette.IR.SymPrim: SymInteger :: Term Integer -> SymInteger
+ Grisette.IR.SymPrim: SymWordN :: Term (WordN n) -> SymWordN (n :: Nat)
+ Grisette.IR.SymPrim: [:=] :: LinkedRep ct st => st -> ct -> ModelSymPair ct st
+ Grisette.IR.SymPrim: [SomeIntN] :: (KnownNat n, 1 <= n) => IntN n -> SomeIntN
+ Grisette.IR.SymPrim: [SomeSymIntN] :: (KnownNat n, 1 <= n) => SymIntN n -> SomeSymIntN
+ Grisette.IR.SymPrim: [SomeSymWordN] :: (KnownNat n, 1 <= n) => SymWordN n -> SomeSymWordN
+ Grisette.IR.SymPrim: [SomeWordN] :: (KnownNat n, 1 <= n) => WordN n -> SomeWordN
+ Grisette.IR.SymPrim: [SymGeneralFun] :: (LinkedRep ca sa, LinkedRep cb sb) => Term (ca --> cb) -> sa -~> sb
+ Grisette.IR.SymPrim: [SymTabularFun] :: (LinkedRep ca sa, LinkedRep cb sb) => Term (ca =-> cb) -> sa =~> sb
+ Grisette.IR.SymPrim: [underlyingBoolTerm] :: SymBool -> Term Bool
+ Grisette.IR.SymPrim: [underlyingIntNTerm] :: SymIntN (n :: Nat) -> Term (IntN n)
+ Grisette.IR.SymPrim: [underlyingIntegerTerm] :: SymInteger -> Term Integer
+ Grisette.IR.SymPrim: [underlyingWordNTerm] :: SymWordN (n :: Nat) -> Term (WordN n)
+ Grisette.IR.SymPrim: allSyms :: AllSyms a => a -> [SomeSym]
+ Grisette.IR.SymPrim: allSymsS :: AllSyms a => a -> [SomeSym] -> [SomeSym]
+ Grisette.IR.SymPrim: allSymsSize :: AllSyms a => a -> Int
+ Grisette.IR.SymPrim: class AllSyms a
+ Grisette.IR.SymPrim: class ConRep sym where {
+ Grisette.IR.SymPrim: class (ConRep sym, SymRep con, sym ~ SymType con, con ~ ConType sym) => LinkedRep con sym | con -> sym, sym -> con
+ Grisette.IR.SymPrim: class SupportedPrim con => SymRep con where {
+ Grisette.IR.SymPrim: data ModelSymPair ct st
+ Grisette.IR.SymPrim: data SomeIntN
+ Grisette.IR.SymPrim: data SomeSymIntN
+ Grisette.IR.SymPrim: data SomeSymWordN
+ Grisette.IR.SymPrim: data SomeWordN
+ Grisette.IR.SymPrim: data sa -~> sb
+ Grisette.IR.SymPrim: newtype SymBool
+ Grisette.IR.SymPrim: newtype SymIntN (n :: Nat)
+ Grisette.IR.SymPrim: newtype SymInteger
+ Grisette.IR.SymPrim: newtype SymWordN (n :: Nat)
+ Grisette.IR.SymPrim: type ConType sym;
+ Grisette.IR.SymPrim: type SymType con;
+ Grisette.IR.SymPrim: }
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: divBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: divIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: modBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: modIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: quotBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: quotIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: remBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: remIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [DivBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [DivIntegralTerm] :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [ModBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [ModIntegralTerm] :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [QuotBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [QuotIntegralTerm] :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [RemBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [RemIntegralTerm] :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UDivBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => !Term t -> !Term t -> UTerm t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UDivIntegralTerm] :: (SupportedPrim t, Integral t) => !Term t -> !Term t -> UTerm t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UModBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => !Term t -> !Term t -> UTerm t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UModIntegralTerm] :: (SupportedPrim t, Integral t) => !Term t -> !Term t -> UTerm t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UQuotBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => !Term t -> !Term t -> UTerm t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UQuotIntegralTerm] :: (SupportedPrim t, Integral t) => !Term t -> !Term t -> UTerm t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [URemBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => !Term t -> !Term t -> UTerm t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [URemIntegralTerm] :: (SupportedPrim t, Integral t) => !Term t -> !Term t -> UTerm t
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: buildGeneralFun :: () => (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Term b -> a --> b
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: class ConRep sym where {
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: class (ConRep sym, SymRep con, sym ~ SymType con, con ~ ConType sym) => LinkedRep con sym | con -> sym, sym -> con
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: class SupportedPrim con => SymRep con where {
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.Core.Data.BV.IntN w)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance (GHC.TypeNats.KnownNat w, 1 Data.Type.Ord.<= w) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim (Grisette.Core.Data.BV.WordN w)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep a sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep b sb) => Grisette.Core.Data.Class.Function.Function (a Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.--> b)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance Control.DeepSeq.NFData Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ARG
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance Data.Hashable.Class.Hashable Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ARG
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance GHC.Classes.Eq Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ARG
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance GHC.Classes.Ord Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ARG
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance GHC.Generics.Generic Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ARG
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance GHC.Show.Show Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ARG
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: instance Language.Haskell.TH.Syntax.Lift Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ARG
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: type ConType sym;
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: type SymType con;
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: underlyingTerm :: LinkedRep con sym => sym -> Term con
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: wrapTerm :: LinkedRep con sym => Term con -> sym
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermUtils: someTermSize :: SomeTerm -> Int
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermUtils: someTermsSize :: [SomeTerm] -> Int
+ Grisette.IR.SymPrim.Data.Prim.Model: instance (Grisette.Core.Data.Class.ModelOps.ModelRep a Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep b Grisette.IR.SymPrim.Data.Prim.Model.Model) => Grisette.Core.Data.Class.ModelOps.ModelRep (a, b) Grisette.IR.SymPrim.Data.Prim.Model.Model
+ Grisette.IR.SymPrim.Data.Prim.Model: instance (Grisette.Core.Data.Class.ModelOps.ModelRep a Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep b Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep c Grisette.IR.SymPrim.Data.Prim.Model.Model) => Grisette.Core.Data.Class.ModelOps.ModelRep (a, b, c) Grisette.IR.SymPrim.Data.Prim.Model.Model
+ Grisette.IR.SymPrim.Data.Prim.Model: instance (Grisette.Core.Data.Class.ModelOps.ModelRep a Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep b Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep c Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep d Grisette.IR.SymPrim.Data.Prim.Model.Model) => Grisette.Core.Data.Class.ModelOps.ModelRep (a, b, c, d) Grisette.IR.SymPrim.Data.Prim.Model.Model
+ Grisette.IR.SymPrim.Data.Prim.Model: instance (Grisette.Core.Data.Class.ModelOps.ModelRep a Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep b Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep c Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep d Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep e Grisette.IR.SymPrim.Data.Prim.Model.Model) => Grisette.Core.Data.Class.ModelOps.ModelRep (a, b, c, d, e) Grisette.IR.SymPrim.Data.Prim.Model.Model
+ Grisette.IR.SymPrim.Data.Prim.Model: instance (Grisette.Core.Data.Class.ModelOps.ModelRep a Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep b Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep c Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep d Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep e Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep f Grisette.IR.SymPrim.Data.Prim.Model.Model) => Grisette.Core.Data.Class.ModelOps.ModelRep (a, b, c, d, e, f) Grisette.IR.SymPrim.Data.Prim.Model.Model
+ Grisette.IR.SymPrim.Data.Prim.Model: instance (Grisette.Core.Data.Class.ModelOps.ModelRep a Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep b Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep c Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep d Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep e Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep f Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep g Grisette.IR.SymPrim.Data.Prim.Model.Model) => Grisette.Core.Data.Class.ModelOps.ModelRep (a, b, c, d, e, f, g) Grisette.IR.SymPrim.Data.Prim.Model.Model
+ Grisette.IR.SymPrim.Data.Prim.Model: instance (Grisette.Core.Data.Class.ModelOps.ModelRep a Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep b Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep c Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep d Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep e Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep f Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep g Grisette.IR.SymPrim.Data.Prim.Model.Model, Grisette.Core.Data.Class.ModelOps.ModelRep h Grisette.IR.SymPrim.Data.Prim.Model.Model) => Grisette.Core.Data.Class.ModelOps.ModelRep (a, b, c, d, e, f, g, h) Grisette.IR.SymPrim.Data.Prim.Model.Model
+ Grisette.IR.SymPrim.Data.Prim.Model: instance GHC.Base.Monoid Grisette.IR.SymPrim.Data.Prim.Model.Model
+ Grisette.IR.SymPrim.Data.Prim.Model: instance GHC.Base.Semigroup Grisette.IR.SymPrim.Data.Prim.Model.Model
+ Grisette.IR.SymPrim.Data.Prim.Model: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.Prim.Model.ModelValuePair t) Grisette.IR.SymPrim.Data.Prim.Model.Model
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral: pevalDivBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral: pevalDivIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral: pevalModBoundedIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral: pevalModIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral: pevalQuotBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral: pevalQuotIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral: pevalRemBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral: pevalRemIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.IR.SymPrim.Data.SymPrim: SymBool :: Term Bool -> SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: SymIntN :: Term (IntN n) -> SymIntN (n :: Nat)
+ Grisette.IR.SymPrim.Data.SymPrim: SymInteger :: Term Integer -> SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: SymWordN :: Term (WordN n) -> SymWordN (n :: Nat)
+ Grisette.IR.SymPrim.Data.SymPrim: [:=] :: LinkedRep ct st => st -> ct -> ModelSymPair ct st
+ Grisette.IR.SymPrim.Data.SymPrim: [SomeSymIntN] :: (KnownNat n, 1 <= n) => SymIntN n -> SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: [SomeSymWordN] :: (KnownNat n, 1 <= n) => SymWordN n -> SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: [SomeSym] :: LinkedRep con sym => sym -> SomeSym
+ Grisette.IR.SymPrim.Data.SymPrim: [SymGeneralFun] :: (LinkedRep ca sa, LinkedRep cb sb) => Term (ca --> cb) -> sa -~> sb
+ Grisette.IR.SymPrim.Data.SymPrim: [SymTabularFun] :: (LinkedRep ca sa, LinkedRep cb sb) => Term (ca =-> cb) -> sa =~> sb
+ Grisette.IR.SymPrim.Data.SymPrim: [underlyingBoolTerm] :: SymBool -> Term Bool
+ Grisette.IR.SymPrim.Data.SymPrim: [underlyingIntNTerm] :: SymIntN (n :: Nat) -> Term (IntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: [underlyingIntegerTerm] :: SymInteger -> Term Integer
+ Grisette.IR.SymPrim.Data.SymPrim: [underlyingWordNTerm] :: SymWordN (n :: Nat) -> Term (WordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: allSyms :: AllSyms a => a -> [SomeSym]
+ Grisette.IR.SymPrim.Data.SymPrim: allSymsS :: AllSyms a => a -> [SomeSym] -> [SomeSym]
+ Grisette.IR.SymPrim.Data.SymPrim: allSymsSize :: AllSyms a => a -> Int
+ Grisette.IR.SymPrim.Data.SymPrim: binSomeSymIntN :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n -> r) -> String -> SomeSymIntN -> SomeSymIntN -> r
+ Grisette.IR.SymPrim.Data.SymPrim: binSomeSymIntNR1 :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n -> SymIntN n) -> String -> SomeSymIntN -> SomeSymIntN -> SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: binSomeSymIntNR2 :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n -> (SymIntN n, SymIntN n)) -> String -> SomeSymIntN -> SomeSymIntN -> (SomeSymIntN, SomeSymIntN)
+ Grisette.IR.SymPrim.Data.SymPrim: binSomeSymWordN :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n -> r) -> String -> SomeSymWordN -> SomeSymWordN -> r
+ Grisette.IR.SymPrim.Data.SymPrim: binSomeSymWordNR1 :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n -> SymWordN n) -> String -> SomeSymWordN -> SomeSymWordN -> SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: binSomeSymWordNR2 :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n -> (SymWordN n, SymWordN n)) -> String -> SomeSymWordN -> SomeSymWordN -> (SomeSymWordN, SomeSymWordN)
+ Grisette.IR.SymPrim.Data.SymPrim: class AllSyms a
+ Grisette.IR.SymPrim.Data.SymPrim: data SomeSym
+ Grisette.IR.SymPrim.Data.SymPrim: data SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: data SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: data sa -~> sb
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.Generics.Generic a, Grisette.IR.SymPrim.Data.SymPrim.AllSyms' (GHC.Generics.Rep a)) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Generics.Deriving.Default.Default a)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Data.Hashable.Class.Hashable (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Data.Hashable.Class.Hashable (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Data.String.IsString (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Data.String.IsString (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.Bits (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.Bits (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Classes.Eq (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Classes.Eq (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Show.Show (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Show.Show (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Bool.SEq (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Bool.SEq (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Evaluate.EvaluateSym (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Evaluate.EvaluateSym (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SOrd.SOrd (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SOrd.SOrd (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Solvable.Solvable (Grisette.Core.Data.BV.IntN n) (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Solvable.Solvable (Grisette.Core.Data.BV.WordN n) (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Substitute.SubstituteSym (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.Substitute.SubstituteSym (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n) (Grisette.Core.Data.BV.IntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n) (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n) (Grisette.Core.Data.BV.WordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n) (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Data.BV.IntN n) (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Data.BV.IntN n) Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Data.BV.WordN n) (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.Core.Data.BV.WordN n) Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n) (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Core.Data.Class.ToSym.ToSym (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n) (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ConRep (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ConRep (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep (Grisette.Core.Data.BV.IntN n) (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep (Grisette.Core.Data.BV.WordN n) (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SymRep (Grisette.Core.Data.BV.IntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SymRep (Grisette.Core.Data.BV.WordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ConRep a, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ConRep b) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ConRep (a Grisette.IR.SymPrim.Data.SymPrim.-~> b)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ConRep a, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ConRep b) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ConRep (a Grisette.IR.SymPrim.Data.SymPrim.=~> b)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep (ca Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.--> cb) (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep (ca Grisette.IR.SymPrim.Data.TabularFun.=-> cb) (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim b) => Grisette.Core.Data.Class.ToCon.ToCon (a Grisette.IR.SymPrim.Data.SymPrim.-~> b) (a Grisette.IR.SymPrim.Data.SymPrim.-~> b)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim b) => Grisette.Core.Data.Class.ToCon.ToCon (a Grisette.IR.SymPrim.Data.SymPrim.=~> b) (a Grisette.IR.SymPrim.Data.SymPrim.=~> b)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim b) => Grisette.Core.Data.Class.ToSym.ToSym (a Grisette.IR.SymPrim.Data.SymPrim.-~> b) (a Grisette.IR.SymPrim.Data.SymPrim.-~> b)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim a, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim b) => Grisette.Core.Data.Class.ToSym.ToSym (a Grisette.IR.SymPrim.Data.SymPrim.=~> b) (a Grisette.IR.SymPrim.Data.SymPrim.=~> b)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Data.Hashable.Class.Hashable (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Data.Hashable.Class.Hashable (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Data.String.IsString (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Data.String.IsString (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => GHC.Classes.Eq (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => GHC.Classes.Eq (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => GHC.Show.Show (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => GHC.Show.Show (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Evaluate.EvaluateSym (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Evaluate.EvaluateSym (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Function.Function (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Function.Function (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Solvable.Solvable (ca Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.--> cb) (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Solvable.Solvable (ca Grisette.IR.SymPrim.Data.TabularFun.=-> cb) (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Substitute.SubstituteSym (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.Substitute.SubstituteSym (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.ToCon.ToCon (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb) (ca Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.--> cb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.ToCon.ToCon (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb) (ca Grisette.IR.SymPrim.Data.TabularFun.=-> cb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.ToSym.ToSym (ca Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.--> cb) (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.Core.Data.Class.ToSym.ToSym (ca Grisette.IR.SymPrim.Data.TabularFun.=-> cb) (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (sa Grisette.IR.SymPrim.Data.SymPrim.-~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SupportedPrim cb, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep ca sa, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep cb sb) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (sa Grisette.IR.SymPrim.Data.SymPrim.=~> sb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SymRep a, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SymRep b) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SymRep (a Grisette.IR.SymPrim.Data.TabularFun.=-> b)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SymRep ca, Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SymRep cb) => Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SymRep (ca Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.--> cb)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.SymPrim.AllSyms (f a), Grisette.IR.SymPrim.Data.SymPrim.AllSyms (g a)) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Data.Functor.Sum.Sum f g a)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.SymPrim.AllSyms a, Grisette.IR.SymPrim.Data.SymPrim.AllSyms b) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Data.Either.Either a b)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.SymPrim.AllSyms a, Grisette.IR.SymPrim.Data.SymPrim.AllSyms b) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (a, b)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.SymPrim.AllSyms a, Grisette.IR.SymPrim.Data.SymPrim.AllSyms b, Grisette.IR.SymPrim.Data.SymPrim.AllSyms c) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (a, b, c)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.SymPrim.AllSyms a, Grisette.IR.SymPrim.Data.SymPrim.AllSyms b, Grisette.IR.SymPrim.Data.SymPrim.AllSyms c, Grisette.IR.SymPrim.Data.SymPrim.AllSyms d) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (a, b, c, d)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.SymPrim.AllSyms a, Grisette.IR.SymPrim.Data.SymPrim.AllSyms b, Grisette.IR.SymPrim.Data.SymPrim.AllSyms c, Grisette.IR.SymPrim.Data.SymPrim.AllSyms d, Grisette.IR.SymPrim.Data.SymPrim.AllSyms e) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (a, b, c, d, e)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.SymPrim.AllSyms a, Grisette.IR.SymPrim.Data.SymPrim.AllSyms b, Grisette.IR.SymPrim.Data.SymPrim.AllSyms c, Grisette.IR.SymPrim.Data.SymPrim.AllSyms d, Grisette.IR.SymPrim.Data.SymPrim.AllSyms e, Grisette.IR.SymPrim.Data.SymPrim.AllSyms f) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (a, b, c, d, e, f)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.SymPrim.AllSyms a, Grisette.IR.SymPrim.Data.SymPrim.AllSyms b, Grisette.IR.SymPrim.Data.SymPrim.AllSyms c, Grisette.IR.SymPrim.Data.SymPrim.AllSyms d, Grisette.IR.SymPrim.Data.SymPrim.AllSyms e, Grisette.IR.SymPrim.Data.SymPrim.AllSyms f, Grisette.IR.SymPrim.Data.SymPrim.AllSyms g) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (a, b, c, d, e, f, g)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.SymPrim.AllSyms a, Grisette.IR.SymPrim.Data.SymPrim.AllSyms b, Grisette.IR.SymPrim.Data.SymPrim.AllSyms c, Grisette.IR.SymPrim.Data.SymPrim.AllSyms d, Grisette.IR.SymPrim.Data.SymPrim.AllSyms e, Grisette.IR.SymPrim.Data.SymPrim.AllSyms f, Grisette.IR.SymPrim.Data.SymPrim.AllSyms g, Grisette.IR.SymPrim.Data.SymPrim.AllSyms h) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (a, b, c, d, e, f, g, h)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.SymPrim.AllSyms' a, Grisette.IR.SymPrim.Data.SymPrim.AllSyms' b) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms' (a GHC.Generics.:*: b)
+ Grisette.IR.SymPrim.Data.SymPrim: instance (Grisette.IR.SymPrim.Data.SymPrim.AllSyms' a, Grisette.IR.SymPrim.Data.SymPrim.AllSyms' b) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms' (a GHC.Generics.:+: b)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Control.DeepSeq.NFData (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Control.DeepSeq.NFData (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Control.DeepSeq.NFData Grisette.IR.SymPrim.Data.SymPrim.ARG
+ Grisette.IR.SymPrim.Data.SymPrim: instance Control.DeepSeq.NFData Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Control.DeepSeq.NFData Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Data.Hashable.Class.Hashable Grisette.IR.SymPrim.Data.SymPrim.ARG
+ Grisette.IR.SymPrim.Data.SymPrim: instance Data.Hashable.Class.Hashable Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Data.Hashable.Class.Hashable Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Data.Hashable.Class.Hashable Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Data.Hashable.Class.Hashable Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Data.String.IsString Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Data.String.IsString Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Bits.Bits Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Bits.Bits Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Classes.Eq Grisette.IR.SymPrim.Data.SymPrim.ARG
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Classes.Eq Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Classes.Eq Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Classes.Eq Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Classes.Eq Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Classes.Ord Grisette.IR.SymPrim.Data.SymPrim.ARG
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Generics.Generic (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Generics.Generic (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Generics.Generic Grisette.IR.SymPrim.Data.SymPrim.ARG
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Generics.Generic Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Generics.Generic Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Num.Num Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Num.Num Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Num.Num Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Show.Show Grisette.IR.SymPrim.Data.SymPrim.ARG
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Show.Show Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Show.Show Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Show.Show Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance GHC.Show.Show Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.BitVector.SizedBV Grisette.IR.SymPrim.Data.SymPrim.SymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.BitVector.SizedBV Grisette.IR.SymPrim.Data.SymPrim.SymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.BitVector.SomeBV Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.BitVector.SomeBV Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Bool.SEq Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Bool.SEq Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Bool.SEq Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Bool.SEq Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Evaluate.EvaluateSym Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Evaluate.EvaluateSym Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Evaluate.EvaluateSym Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Evaluate.EvaluateSym Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ExtractSymbolics.ExtractSymbolics Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ModelOps.ModelRep (Grisette.IR.SymPrim.Data.SymPrim.ModelSymPair ct st) Grisette.IR.SymPrim.Data.Prim.Model.Model
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.SOrd.SOrd Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.SOrd.SOrd Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.SOrd.SOrd Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.SOrd.SOrd Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.SafeArith.SafeDivision GHC.Exception.Type.ArithException Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.SafeArith.SafeLinearArith GHC.Exception.Type.ArithException Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.SafeArith.SymIntegerOp Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Solvable.Solvable GHC.Num.Integer.Integer Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Solvable.Solvable GHC.Types.Bool Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Substitute.SubstituteSym Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Substitute.SubstituteSym Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Substitute.SubstituteSym Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.Substitute.SubstituteSym Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymIntN 16) GHC.Int.Int16
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymIntN 32) GHC.Int.Int32
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymIntN 64) GHC.Int.Int64
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymIntN 64) GHC.Types.Int
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymIntN 8) GHC.Int.Int8
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymWordN 16) GHC.Word.Word16
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymWordN 32) GHC.Word.Word32
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymWordN 64) GHC.Types.Word
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymWordN 64) GHC.Word.Word64
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon (Grisette.IR.SymPrim.Data.SymPrim.SymWordN 8) GHC.Word.Word8
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN Grisette.Core.Data.BV.SomeIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN Grisette.Core.Data.BV.SomeWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon Grisette.IR.SymPrim.Data.SymPrim.SymBool GHC.Types.Bool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon Grisette.IR.SymPrim.Data.SymPrim.SymBool Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon Grisette.IR.SymPrim.Data.SymPrim.SymInteger GHC.Num.Integer.Integer
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToCon.ToCon Grisette.IR.SymPrim.Data.SymPrim.SymInteger Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int16 (Grisette.IR.SymPrim.Data.SymPrim.SymIntN 16)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int16 Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int32 (Grisette.IR.SymPrim.Data.SymPrim.SymIntN 32)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int32 Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int64 (Grisette.IR.SymPrim.Data.SymPrim.SymIntN 64)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int64 Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int8 (Grisette.IR.SymPrim.Data.SymPrim.SymIntN 8)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Int.Int8 Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Num.Integer.Integer Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Types.Bool Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Types.Int (Grisette.IR.SymPrim.Data.SymPrim.SymIntN 64)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Types.Int Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Types.Word (Grisette.IR.SymPrim.Data.SymPrim.SymWordN 64)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Types.Word Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word16 (Grisette.IR.SymPrim.Data.SymPrim.SymWordN 16)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word16 Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word32 (Grisette.IR.SymPrim.Data.SymPrim.SymWordN 32)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word32 Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word64 (Grisette.IR.SymPrim.Data.SymPrim.SymWordN 64)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word64 Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word8 (Grisette.IR.SymPrim.Data.SymPrim.SymWordN 8)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym GHC.Word.Word8 Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym Grisette.Core.Data.BV.SomeIntN Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym Grisette.Core.Data.BV.SomeWordN Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym Grisette.IR.SymPrim.Data.SymPrim.SymBool Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.Core.Data.Class.ToSym.ToSym Grisette.IR.SymPrim.Data.SymPrim.SymInteger Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ConRep Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.ConRep Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep GHC.Num.Integer.Integer Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.LinkedRep GHC.Types.Bool Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SymRep GHC.Num.Integer.Integer
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term.SymRep GHC.Types.Bool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms ()
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms (m (Data.Either.Either e a)) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Control.Monad.Trans.Except.ExceptT e m a)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms (m (GHC.Maybe.Maybe a)) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Control.Monad.Trans.Maybe.MaybeT m a)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms (m (a, s)) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Control.Monad.Trans.Writer.Lazy.WriterT s m a)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms (m (a, s)) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Control.Monad.Trans.Writer.Strict.WriterT s m a)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms (m a) => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Control.Monad.Trans.Identity.IdentityT m a)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms Data.ByteString.Internal.ByteString
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Int.Int16
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Int.Int32
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Int.Int64
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Int.Int8
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Num.Integer.Integer
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Types.Bool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Types.Char
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Types.Int
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Types.Word
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Word.Word16
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Word.Word32
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Word.Word64
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms GHC.Word.Word8
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms Grisette.Core.Control.Exception.AssertionError
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms Grisette.Core.Control.Exception.VerificationConditions
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms Grisette.IR.SymPrim.Data.SymPrim.SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms Grisette.IR.SymPrim.Data.SymPrim.SomeSymWordN
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms a => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (Data.Functor.Identity.Identity a)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms a => Grisette.IR.SymPrim.Data.SymPrim.AllSyms (GHC.Maybe.Maybe a)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms a => Grisette.IR.SymPrim.Data.SymPrim.AllSyms [a]
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms c => Grisette.IR.SymPrim.Data.SymPrim.AllSyms' (GHC.Generics.K1 i c)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms' GHC.Generics.U1
+ Grisette.IR.SymPrim.Data.SymPrim: instance Grisette.IR.SymPrim.Data.SymPrim.AllSyms' a => Grisette.IR.SymPrim.Data.SymPrim.AllSyms' (GHC.Generics.M1 i c a)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Language.Haskell.TH.Syntax.Lift (Grisette.IR.SymPrim.Data.SymPrim.SymIntN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Language.Haskell.TH.Syntax.Lift (Grisette.IR.SymPrim.Data.SymPrim.SymWordN n)
+ Grisette.IR.SymPrim.Data.SymPrim: instance Language.Haskell.TH.Syntax.Lift Grisette.IR.SymPrim.Data.SymPrim.ARG
+ Grisette.IR.SymPrim.Data.SymPrim: instance Language.Haskell.TH.Syntax.Lift Grisette.IR.SymPrim.Data.SymPrim.SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: instance Language.Haskell.TH.Syntax.Lift Grisette.IR.SymPrim.Data.SymPrim.SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: newtype SymBool
+ Grisette.IR.SymPrim.Data.SymPrim: newtype SymIntN (n :: Nat)
+ Grisette.IR.SymPrim.Data.SymPrim: newtype SymInteger
+ Grisette.IR.SymPrim.Data.SymPrim: newtype SymWordN (n :: Nat)
+ Grisette.IR.SymPrim.Data.SymPrim: unarySomeSymIntN :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> r) -> String -> SomeSymIntN -> r
+ Grisette.IR.SymPrim.Data.SymPrim: unarySomeSymIntNR1 :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n) -> String -> SomeSymIntN -> SomeSymIntN
+ Grisette.IR.SymPrim.Data.SymPrim: unarySomeSymWordN :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> r) -> String -> SomeSymWordN -> r
+ Grisette.IR.SymPrim.Data.SymPrim: unarySomeSymWordNR1 :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n) -> String -> SomeSymWordN -> SomeSymWordN
+ Grisette.Internal.IR.SymPrim: [DivBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.Internal.IR.SymPrim: [DivIntegralTerm] :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.Internal.IR.SymPrim: [ModBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.Internal.IR.SymPrim: [ModIntegralTerm] :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.Internal.IR.SymPrim: [QuotBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.Internal.IR.SymPrim: [QuotIntegralTerm] :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.Internal.IR.SymPrim: [RemBoundedIntegralTerm] :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.Internal.IR.SymPrim: [RemIntegralTerm] :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.Internal.IR.SymPrim: pevalDivIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.Internal.IR.SymPrim: pevalModIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.Internal.IR.SymPrim: pevalQuotIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.Internal.IR.SymPrim: pevalRemIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a
+ Grisette.Qualified.ParallelUnionDo: (>>) :: (MonadParallelUnion m, Mergeable b, NFData b) => m a -> m b -> m b
+ Grisette.Qualified.ParallelUnionDo: (>>=) :: (MonadParallelUnion m, Mergeable b, NFData b) => m a -> (a -> m b) -> m b
+ Grisette.Utils: [KnownProof] :: KnownNat n => KnownProof n
+ Grisette.Utils: [LeqProof] :: m <= n => LeqProof m n
+ Grisette.Utils: addNat :: NatRepr m -> NatRepr n -> NatRepr (m + n)
+ Grisette.Utils: data KnownProof (n :: Nat)
+ Grisette.Utils: data LeqProof (m :: Nat) (n :: Nat)
+ Grisette.Utils: data NatRepr (n :: Nat)
+ Grisette.Utils: decNat :: 1 <= n => NatRepr n -> NatRepr (n - 1)
+ Grisette.Utils: divNat :: 1 <= n => NatRepr m -> NatRepr n -> NatRepr (Div m n)
+ Grisette.Utils: halfNat :: NatRepr (n + n) -> NatRepr n
+ Grisette.Utils: hasRepr :: forall n. NatRepr n -> KnownProof n
+ Grisette.Utils: incNat :: NatRepr n -> NatRepr (n + 1)
+ Grisette.Utils: knownAdd :: forall m n r. KnownProof m -> KnownProof n -> KnownProof (m + n)
+ Grisette.Utils: leqAdd :: LeqProof m n -> f o -> LeqProof m (n + o)
+ Grisette.Utils: leqAdd2 :: LeqProof xl xh -> LeqProof yl yh -> LeqProof (xl + yl) (xh + yh)
+ Grisette.Utils: leqAddPos :: (1 <= m, 1 <= n) => p m -> q n -> LeqProof 1 (m + n)
+ Grisette.Utils: leqRefl :: f n -> LeqProof n n
+ Grisette.Utils: leqSucc :: f n -> LeqProof n (n + 1)
+ Grisette.Utils: leqTrans :: LeqProof a b -> LeqProof b c -> LeqProof a c
+ Grisette.Utils: leqZero :: LeqProof 0 n
+ Grisette.Utils: natRepr :: forall n. KnownNat n => NatRepr n
+ Grisette.Utils: natValue :: NatRepr n -> Natural
+ Grisette.Utils: predNat :: NatRepr (n + 1) -> NatRepr n
+ Grisette.Utils: subNat :: n <= m => NatRepr m -> NatRepr n -> NatRepr (m - n)
+ Grisette.Utils: testLeq :: NatRepr m -> NatRepr n -> Maybe (LeqProof m n)
+ Grisette.Utils: unsafeAxiom :: forall a b. a :~: b
+ Grisette.Utils: unsafeKnownProof :: Natural -> KnownProof n
+ Grisette.Utils: unsafeLeqProof :: forall m n. LeqProof m n
+ Grisette.Utils: unsafeMkNatRepr :: Natural -> NatRepr n
+ Grisette.Utils: withKnownProof :: KnownProof n -> (KnownNat n => r) -> r
+ Grisette.Utils: withLeqProof :: LeqProof m n -> (m <= n => r) -> r
+ Grisette.Utils.Parameterized: [KnownProof] :: KnownNat n => KnownProof n
+ Grisette.Utils.Parameterized: [LeqProof] :: m <= n => LeqProof m n
+ Grisette.Utils.Parameterized: addNat :: NatRepr m -> NatRepr n -> NatRepr (m + n)
+ Grisette.Utils.Parameterized: data KnownProof (n :: Nat)
+ Grisette.Utils.Parameterized: data LeqProof (m :: Nat) (n :: Nat)
+ Grisette.Utils.Parameterized: data NatRepr (n :: Nat)
+ Grisette.Utils.Parameterized: decNat :: 1 <= n => NatRepr n -> NatRepr (n - 1)
+ Grisette.Utils.Parameterized: divNat :: 1 <= n => NatRepr m -> NatRepr n -> NatRepr (Div m n)
+ Grisette.Utils.Parameterized: halfNat :: NatRepr (n + n) -> NatRepr n
+ Grisette.Utils.Parameterized: hasRepr :: forall n. NatRepr n -> KnownProof n
+ Grisette.Utils.Parameterized: incNat :: NatRepr n -> NatRepr (n + 1)
+ Grisette.Utils.Parameterized: knownAdd :: forall m n r. KnownProof m -> KnownProof n -> KnownProof (m + n)
+ Grisette.Utils.Parameterized: leqAdd :: LeqProof m n -> f o -> LeqProof m (n + o)
+ Grisette.Utils.Parameterized: leqAdd2 :: LeqProof xl xh -> LeqProof yl yh -> LeqProof (xl + yl) (xh + yh)
+ Grisette.Utils.Parameterized: leqAddPos :: (1 <= m, 1 <= n) => p m -> q n -> LeqProof 1 (m + n)
+ Grisette.Utils.Parameterized: leqRefl :: f n -> LeqProof n n
+ Grisette.Utils.Parameterized: leqSucc :: f n -> LeqProof n (n + 1)
+ Grisette.Utils.Parameterized: leqTrans :: LeqProof a b -> LeqProof b c -> LeqProof a c
+ Grisette.Utils.Parameterized: leqZero :: LeqProof 0 n
+ Grisette.Utils.Parameterized: natRepr :: forall n. KnownNat n => NatRepr n
+ Grisette.Utils.Parameterized: natValue :: NatRepr n -> Natural
+ Grisette.Utils.Parameterized: predNat :: NatRepr (n + 1) -> NatRepr n
+ Grisette.Utils.Parameterized: subNat :: n <= m => NatRepr m -> NatRepr n -> NatRepr (m - n)
+ Grisette.Utils.Parameterized: testLeq :: NatRepr m -> NatRepr n -> Maybe (LeqProof m n)
+ Grisette.Utils.Parameterized: unsafeAxiom :: forall a b. a :~: b
+ Grisette.Utils.Parameterized: unsafeKnownProof :: Natural -> KnownProof n
+ Grisette.Utils.Parameterized: unsafeLeqProof :: forall m n. LeqProof m n
+ Grisette.Utils.Parameterized: unsafeMkNatRepr :: Natural -> NatRepr n
+ Grisette.Utils.Parameterized: withKnownProof :: KnownProof n -> (KnownNat n => r) -> r
+ Grisette.Utils.Parameterized: withLeqProof :: LeqProof m n -> (m <= n => r) -> r
- Grisette.Backend.SBV: data GrisetteSMTConfig (integerBitWidth :: Nat)
+ Grisette.Backend.SBV: data GrisetteSMTConfig (i :: Nat)
- Grisette.Backend.SBV.Data.SMT.Lowering: lowerSinglePrim :: forall integerBitWidth a. HasCallStack => GrisetteSMTConfig integerBitWidth -> Term a -> Symbolic (SymBiMap, TermTy integerBitWidth a)
+ Grisette.Backend.SBV.Data.SMT.Lowering: lowerSinglePrim :: forall integerBitWidth a m. (HasCallStack, SBVFreshMonad m) => GrisetteSMTConfig integerBitWidth -> Term a -> m (SymBiMap, TermTy integerBitWidth a)
- Grisette.Backend.SBV.Data.SMT.Solving: data GrisetteSMTConfig (integerBitWidth :: Nat)
+ Grisette.Backend.SBV.Data.SMT.Solving: data GrisetteSMTConfig (i :: Nat)
- Grisette.Core: buildModel :: ModelRep rep model symbolSet typedSymbol => rep -> model
+ Grisette.Core: buildModel :: ModelRep rep model => rep -> model
- Grisette.Core: cegis :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs) => config -> inputs -> CEGISCondition -> IO (Either failure ([inputs], Model))
+ Grisette.Core: cegis :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs) => config -> inputs -> CEGISCondition -> IO ([inputs], Either failure Model)
- Grisette.Core: cegisExcept :: (UnionWithExcept t u e v, UnionPrjOp u, Functor u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> (Either e v -> CEGISCondition) -> t -> IO (Either failure ([inputs], Model))
+ Grisette.Core: cegisExcept :: (UnionWithExcept t u e v, UnionPrjOp u, Functor u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> (Either e v -> CEGISCondition) -> t -> IO ([inputs], Either failure Model)
- Grisette.Core: cegisExceptMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u e v, UnionPrjOp u, Monad u) => config -> [inputs] -> (Either e v -> CEGISCondition) -> (inputs -> t) -> IO (Either failure ([inputs], Model))
+ Grisette.Core: cegisExceptMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u e v, UnionPrjOp u, Monad u) => config -> [inputs] -> (Either e v -> CEGISCondition) -> (inputs -> t) -> IO ([inputs], Either failure Model)
- Grisette.Core: cegisExceptStdVC :: (UnionWithExcept t u VerificationConditions (), UnionPrjOp u, Monad u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> t -> IO (Either failure ([inputs], Model))
+ Grisette.Core: cegisExceptStdVC :: (UnionWithExcept t u VerificationConditions (), UnionPrjOp u, Monad u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> t -> IO ([inputs], Either failure Model)
- Grisette.Core: cegisExceptStdVCMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u VerificationConditions (), UnionPrjOp u, Monad u) => config -> [inputs] -> (inputs -> t) -> IO (Either failure ([inputs], Model))
+ Grisette.Core: cegisExceptStdVCMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u VerificationConditions (), UnionPrjOp u, Monad u) => config -> [inputs] -> (inputs -> t) -> IO ([inputs], Either failure Model)
- Grisette.Core: cegisExceptVC :: (UnionWithExcept t u e v, UnionPrjOp u, Monad u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> (Either e v -> u (Either VerificationConditions ())) -> t -> IO (Either failure ([inputs], Model))
+ Grisette.Core: cegisExceptVC :: (UnionWithExcept t u e v, UnionPrjOp u, Monad u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> (Either e v -> u (Either VerificationConditions ())) -> t -> IO ([inputs], Either failure Model)
- Grisette.Core: cegisExceptVCMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u e v, UnionPrjOp u, Monad u) => config -> [inputs] -> (Either e v -> u (Either VerificationConditions ())) -> (inputs -> t) -> IO (Either failure ([inputs], Model))
+ Grisette.Core: cegisExceptVCMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u e v, UnionPrjOp u, Monad u) => config -> [inputs] -> (Either e v -> u (Either VerificationConditions ())) -> (inputs -> t) -> IO ([inputs], Either failure Model)
- Grisette.Core: cegisMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs) => config -> [inputs] -> (inputs -> CEGISCondition) -> IO (Either failure ([inputs], Model))
+ Grisette.Core: cegisMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs) => config -> [inputs] -> (inputs -> CEGISCondition) -> IO ([inputs], Either failure Model)
- Grisette.Core: class ModelOps model symbolSet typedSymbol => ModelRep rep model symbolSet (typedSymbol :: * -> *)
+ Grisette.Core: class ModelRep rep model | rep -> model
- Grisette.Core: mrgInL :: forall {k_a9OE :: Type} (f_a9OF :: k_a9OE -> Type) (g_a9OG :: k_a9OE -> Type) (a_a9OH :: k_a9OE). Mergeable (Sum f_a9OF g_a9OG a_a9OH) => f_a9OF a_a9OH -> UnionM (Sum f_a9OF g_a9OG a_a9OH)
+ Grisette.Core: mrgInL :: forall {k_a9Ck :: Type} (f_a9Cl :: k_a9Ck -> Type) (g_a9Cm :: k_a9Ck -> Type) (a_a9Cn :: k_a9Ck). Mergeable (Sum f_a9Cl g_a9Cm a_a9Cn) => f_a9Cl a_a9Cn -> UnionM (Sum f_a9Cl g_a9Cm a_a9Cn)
- Grisette.Core: mrgInR :: forall {k_a9OE :: Type} (f_a9OF :: k_a9OE -> Type) (g_a9OG :: k_a9OE -> Type) (a_a9OH :: k_a9OE). Mergeable (Sum f_a9OF g_a9OG a_a9OH) => g_a9OG a_a9OH -> UnionM (Sum f_a9OF g_a9OG a_a9OH)
+ Grisette.Core: mrgInR :: forall {k_a9Ck :: Type} (f_a9Cl :: k_a9Ck -> Type) (g_a9Cm :: k_a9Ck -> Type) (a_a9Cn :: k_a9Ck). Mergeable (Sum f_a9Cl g_a9Cm a_a9Cn) => g_a9Cm a_a9Cn -> UnionM (Sum f_a9Cl g_a9Cm a_a9Cn)
- Grisette.Core: mrgLeft :: forall (a_a9yK :: Type) (b_a9yL :: Type). Mergeable (Either a_a9yK b_a9yL) => a_a9yK -> UnionM (Either a_a9yK b_a9yL)
+ Grisette.Core: mrgLeft :: forall (a_a9mo :: Type) (b_a9mp :: Type). Mergeable (Either a_a9mo b_a9mp) => a_a9mo -> UnionM (Either a_a9mo b_a9mp)
- Grisette.Core: mrgRight :: forall (a_a9yK :: Type) (b_a9yL :: Type). Mergeable (Either a_a9yK b_a9yL) => b_a9yL -> UnionM (Either a_a9yK b_a9yL)
+ Grisette.Core: mrgRight :: forall (a_a9mo :: Type) (b_a9mp :: Type). Mergeable (Either a_a9mo b_a9mp) => b_a9mp -> UnionM (Either a_a9mo b_a9mp)
- Grisette.Core: solveMulti :: Solver config failure => config -> Int -> SymBool -> IO [Model]
+ Grisette.Core: solveMulti :: Solver config failure => config -> Int -> SymBool -> IO ([Model], failure)
- Grisette.Core: solveMultiExcept :: (UnionWithExcept t u e v, UnionPrjOp u, Functor u, Solver config failure) => config -> Int -> (Either e v -> SymBool) -> t -> IO [Model]
+ Grisette.Core: solveMultiExcept :: (UnionWithExcept t u e v, UnionPrjOp u, Functor u, Solver config failure) => config -> Int -> (Either e v -> SymBool) -> t -> IO ([Model], failure)
- Grisette.Core: substituteSym :: SubstituteSym a => TypedSymbol b -> Sym b -> a -> a
+ Grisette.Core: substituteSym :: (SubstituteSym a, LinkedRep cb sb) => TypedSymbol cb -> sb -> a -> a
- Grisette.Core: substituteSym' :: SubstituteSym' a => TypedSymbol b -> Sym b -> a c -> a c
+ Grisette.Core: substituteSym' :: (SubstituteSym' a, LinkedRep cb sb) => TypedSymbol cb -> sb -> a c -> a c
- Grisette.Core.BuiltinUnionWrappers: mrgInL :: forall {k_a9OE :: Type} (f_a9OF :: k_a9OE -> Type) (g_a9OG :: k_a9OE -> Type) (a_a9OH :: k_a9OE). Mergeable (Sum f_a9OF g_a9OG a_a9OH) => f_a9OF a_a9OH -> UnionM (Sum f_a9OF g_a9OG a_a9OH)
+ Grisette.Core.BuiltinUnionWrappers: mrgInL :: forall {k_a9Ck :: Type} (f_a9Cl :: k_a9Ck -> Type) (g_a9Cm :: k_a9Ck -> Type) (a_a9Cn :: k_a9Ck). Mergeable (Sum f_a9Cl g_a9Cm a_a9Cn) => f_a9Cl a_a9Cn -> UnionM (Sum f_a9Cl g_a9Cm a_a9Cn)
- Grisette.Core.BuiltinUnionWrappers: mrgInR :: forall {k_a9OE :: Type} (f_a9OF :: k_a9OE -> Type) (g_a9OG :: k_a9OE -> Type) (a_a9OH :: k_a9OE). Mergeable (Sum f_a9OF g_a9OG a_a9OH) => g_a9OG a_a9OH -> UnionM (Sum f_a9OF g_a9OG a_a9OH)
+ Grisette.Core.BuiltinUnionWrappers: mrgInR :: forall {k_a9Ck :: Type} (f_a9Cl :: k_a9Ck -> Type) (g_a9Cm :: k_a9Ck -> Type) (a_a9Cn :: k_a9Ck). Mergeable (Sum f_a9Cl g_a9Cm a_a9Cn) => g_a9Cm a_a9Cn -> UnionM (Sum f_a9Cl g_a9Cm a_a9Cn)
- Grisette.Core.BuiltinUnionWrappers: mrgLeft :: forall (a_a9yK :: Type) (b_a9yL :: Type). Mergeable (Either a_a9yK b_a9yL) => a_a9yK -> UnionM (Either a_a9yK b_a9yL)
+ Grisette.Core.BuiltinUnionWrappers: mrgLeft :: forall (a_a9mo :: Type) (b_a9mp :: Type). Mergeable (Either a_a9mo b_a9mp) => a_a9mo -> UnionM (Either a_a9mo b_a9mp)
- Grisette.Core.BuiltinUnionWrappers: mrgRight :: forall (a_a9yK :: Type) (b_a9yL :: Type). Mergeable (Either a_a9yK b_a9yL) => b_a9yL -> UnionM (Either a_a9yK b_a9yL)
+ Grisette.Core.BuiltinUnionWrappers: mrgRight :: forall (a_a9mo :: Type) (b_a9mp :: Type). Mergeable (Either a_a9mo b_a9mp) => b_a9mp -> UnionM (Either a_a9mo b_a9mp)
- Grisette.Core.Control.Monad.UnionM: [UAny] :: IORef (Either (Union a) (UnionM a)) -> Union a -> UnionM a
+ Grisette.Core.Control.Monad.UnionM: [UAny] :: Union a -> UnionM a
- Grisette.Core.Data.Class.CEGISSolver: cegis :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs) => config -> inputs -> CEGISCondition -> IO (Either failure ([inputs], Model))
+ Grisette.Core.Data.Class.CEGISSolver: cegis :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs) => config -> inputs -> CEGISCondition -> IO ([inputs], Either failure Model)
- Grisette.Core.Data.Class.CEGISSolver: cegisExcept :: (UnionWithExcept t u e v, UnionPrjOp u, Functor u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> (Either e v -> CEGISCondition) -> t -> IO (Either failure ([inputs], Model))
+ Grisette.Core.Data.Class.CEGISSolver: cegisExcept :: (UnionWithExcept t u e v, UnionPrjOp u, Functor u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> (Either e v -> CEGISCondition) -> t -> IO ([inputs], Either failure Model)
- Grisette.Core.Data.Class.CEGISSolver: cegisExceptMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u e v, UnionPrjOp u, Monad u) => config -> [inputs] -> (Either e v -> CEGISCondition) -> (inputs -> t) -> IO (Either failure ([inputs], Model))
+ Grisette.Core.Data.Class.CEGISSolver: cegisExceptMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u e v, UnionPrjOp u, Monad u) => config -> [inputs] -> (Either e v -> CEGISCondition) -> (inputs -> t) -> IO ([inputs], Either failure Model)
- Grisette.Core.Data.Class.CEGISSolver: cegisExceptStdVC :: (UnionWithExcept t u VerificationConditions (), UnionPrjOp u, Monad u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> t -> IO (Either failure ([inputs], Model))
+ Grisette.Core.Data.Class.CEGISSolver: cegisExceptStdVC :: (UnionWithExcept t u VerificationConditions (), UnionPrjOp u, Monad u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> t -> IO ([inputs], Either failure Model)
- Grisette.Core.Data.Class.CEGISSolver: cegisExceptStdVCMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u VerificationConditions (), UnionPrjOp u, Monad u) => config -> [inputs] -> (inputs -> t) -> IO (Either failure ([inputs], Model))
+ Grisette.Core.Data.Class.CEGISSolver: cegisExceptStdVCMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u VerificationConditions (), UnionPrjOp u, Monad u) => config -> [inputs] -> (inputs -> t) -> IO ([inputs], Either failure Model)
- Grisette.Core.Data.Class.CEGISSolver: cegisExceptVC :: (UnionWithExcept t u e v, UnionPrjOp u, Monad u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> (Either e v -> u (Either VerificationConditions ())) -> t -> IO (Either failure ([inputs], Model))
+ Grisette.Core.Data.Class.CEGISSolver: cegisExceptVC :: (UnionWithExcept t u e v, UnionPrjOp u, Monad u, EvaluateSym inputs, ExtractSymbolics inputs, CEGISSolver config failure) => config -> inputs -> (Either e v -> u (Either VerificationConditions ())) -> t -> IO ([inputs], Either failure Model)
- Grisette.Core.Data.Class.CEGISSolver: cegisExceptVCMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u e v, UnionPrjOp u, Monad u) => config -> [inputs] -> (Either e v -> u (Either VerificationConditions ())) -> (inputs -> t) -> IO (Either failure ([inputs], Model))
+ Grisette.Core.Data.Class.CEGISSolver: cegisExceptVCMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs, UnionWithExcept t u e v, UnionPrjOp u, Monad u) => config -> [inputs] -> (Either e v -> u (Either VerificationConditions ())) -> (inputs -> t) -> IO ([inputs], Either failure Model)
- Grisette.Core.Data.Class.CEGISSolver: cegisMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs) => config -> [inputs] -> (inputs -> CEGISCondition) -> IO (Either failure ([inputs], Model))
+ Grisette.Core.Data.Class.CEGISSolver: cegisMultiInputs :: (CEGISSolver config failure, EvaluateSym inputs, ExtractSymbolics inputs) => config -> [inputs] -> (inputs -> CEGISCondition) -> IO ([inputs], Either failure Model)
- Grisette.Core.Data.Class.ModelOps: buildModel :: ModelRep rep model symbolSet typedSymbol => rep -> model
+ Grisette.Core.Data.Class.ModelOps: buildModel :: ModelRep rep model => rep -> model
- Grisette.Core.Data.Class.ModelOps: class ModelOps model symbolSet typedSymbol => ModelRep rep model symbolSet (typedSymbol :: * -> *)
+ Grisette.Core.Data.Class.ModelOps: class ModelRep rep model | rep -> model
- Grisette.Core.Data.Class.Solver: solveMulti :: Solver config failure => config -> Int -> SymBool -> IO [Model]
+ Grisette.Core.Data.Class.Solver: solveMulti :: Solver config failure => config -> Int -> SymBool -> IO ([Model], failure)
- Grisette.Core.Data.Class.Solver: solveMultiExcept :: (UnionWithExcept t u e v, UnionPrjOp u, Functor u, Solver config failure) => config -> Int -> (Either e v -> SymBool) -> t -> IO [Model]
+ Grisette.Core.Data.Class.Solver: solveMultiExcept :: (UnionWithExcept t u e v, UnionPrjOp u, Functor u, Solver config failure) => config -> Int -> (Either e v -> SymBool) -> t -> IO ([Model], failure)
- Grisette.Core.Data.Class.Substitute: substituteSym :: SubstituteSym a => TypedSymbol b -> Sym b -> a -> a
+ Grisette.Core.Data.Class.Substitute: substituteSym :: (SubstituteSym a, LinkedRep cb sb) => TypedSymbol cb -> sb -> a -> a
- Grisette.Core.Data.Class.Substitute: substituteSym' :: SubstituteSym' a => TypedSymbol b -> Sym b -> a c -> a c
+ Grisette.Core.Data.Class.Substitute: substituteSym' :: (SubstituteSym' a, LinkedRep cb sb) => TypedSymbol cb -> sb -> a c -> a c
- Grisette.IR.SymPrim: (-->) :: (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Sym b -> a --> b
+ Grisette.IR.SymPrim: (-->) :: (SupportedPrim ca, SupportedPrim cb, LinkedRep cb sb) => TypedSymbol ca -> sb -> ca --> cb
- Grisette.IR.SymPrim: symSize :: Sym a -> Int
+ Grisette.IR.SymPrim: symSize :: forall con sym. LinkedRep con sym => sym -> Int
- Grisette.IR.SymPrim: symsSize :: [Sym a] -> Int
+ Grisette.IR.SymPrim: symsSize :: forall con sym. LinkedRep con sym => [sym] -> Int
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: bvconcatTerm :: (SupportedPrim (bv a), SupportedPrim (bv b), SupportedPrim (bv c), KnownNat a, KnownNat b, KnownNat c, BVConcat (bv a) (bv b) (bv c)) => Term (bv a) -> Term (bv b) -> Term (bv c)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: bvconcatTerm :: (SupportedPrim (bv a), SupportedPrim (bv b), SupportedPrim (bv (a + b)), KnownNat a, KnownNat b, 1 <= a, 1 <= b, SizedBV bv) => Term (bv a) -> Term (bv b) -> Term (bv (a + b))
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: bvextendTerm :: forall bv a n w proxy. (SupportedPrim (bv a), SupportedPrim (bv w), KnownNat a, KnownNat n, KnownNat w, BVExtend (bv a) n (bv w)) => Bool -> proxy n -> Term (bv a) -> Term (bv w)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: bvextendTerm :: forall bv l r proxy. (SupportedPrim (bv l), SupportedPrim (bv r), KnownNat l, KnownNat r, 1 <= l, l <= r, SizedBV bv) => Bool -> proxy r -> Term (bv l) -> Term (bv r)
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: bvselectTerm :: forall bv a ix w proxy. (SupportedPrim (bv a), SupportedPrim (bv w), KnownNat a, KnownNat w, KnownNat ix, BVSelect (bv a) ix w (bv w)) => proxy ix -> proxy w -> Term (bv a) -> Term (bv w)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: bvselectTerm :: forall bv n ix w proxy. (SupportedPrim (bv n), SupportedPrim (bv w), KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, (ix + w) <= n, SizedBV bv) => proxy ix -> proxy w -> Term (bv n) -> Term (bv w)
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: bvsignExtendTerm :: forall bv a n w proxy. (SupportedPrim (bv a), SupportedPrim (bv w), KnownNat a, KnownNat n, KnownNat w, BVExtend (bv a) n (bv w)) => proxy n -> Term (bv a) -> Term (bv w)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: bvsignExtendTerm :: forall bv l r proxy. (SupportedPrim (bv l), SupportedPrim (bv r), KnownNat l, KnownNat r, 1 <= l, l <= r, SizedBV bv) => proxy r -> Term (bv l) -> Term (bv r)
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: bvzeroExtendTerm :: forall bv a n w proxy. (SupportedPrim (bv a), SupportedPrim (bv w), KnownNat a, KnownNat n, KnownNat w, BVExtend (bv a) n (bv w)) => proxy n -> Term (bv a) -> Term (bv w)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors: bvzeroExtendTerm :: forall bv l r proxy. (SupportedPrim (bv l), SupportedPrim (bv r), KnownNat l, KnownNat r, 1 <= l, l <= r, SizedBV bv) => proxy r -> Term (bv l) -> Term (bv r)
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [BVConcatTerm] :: (SupportedPrim (bv a), SupportedPrim (bv b), SupportedPrim (bv c), KnownNat a, KnownNat b, KnownNat c, BVConcat (bv a) (bv b) (bv c)) => {-# UNPACK #-} !Id -> !Term (bv a) -> !Term (bv b) -> Term (bv c)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [BVConcatTerm] :: (SupportedPrim (bv a), SupportedPrim (bv b), SupportedPrim (bv (a + b)), KnownNat a, KnownNat b, 1 <= a, 1 <= b, SizedBV bv) => {-# UNPACK #-} !Id -> !Term (bv a) -> !Term (bv b) -> Term (bv (a + b))
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [BVExtendTerm] :: (SupportedPrim (bv a), SupportedPrim (bv b), KnownNat a, KnownNat b, KnownNat n, BVExtend (bv a) n (bv b)) => {-# UNPACK #-} !Id -> !Bool -> !TypeRep n -> !Term (bv a) -> Term (bv b)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [BVExtendTerm] :: (SupportedPrim (bv l), SupportedPrim (bv r), KnownNat l, KnownNat r, 1 <= l, l <= r, SizedBV bv) => {-# UNPACK #-} !Id -> !Bool -> !TypeRep r -> !Term (bv l) -> Term (bv r)
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [BVSelectTerm] :: (SupportedPrim (bv a), SupportedPrim (bv w), KnownNat a, KnownNat w, KnownNat ix, BVSelect (bv a) ix w (bv w)) => {-# UNPACK #-} !Id -> !TypeRep ix -> !TypeRep w -> !Term (bv a) -> Term (bv w)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [BVSelectTerm] :: (SupportedPrim (bv n), SupportedPrim (bv w), KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, (ix + w) <= n, SizedBV bv) => {-# UNPACK #-} !Id -> !TypeRep ix -> !TypeRep w -> !Term (bv n) -> Term (bv w)
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UBVConcatTerm] :: (SupportedPrim (bv a), SupportedPrim (bv b), SupportedPrim (bv c), KnownNat a, KnownNat b, KnownNat c, BVConcat (bv a) (bv b) (bv c)) => !Term (bv a) -> !Term (bv b) -> UTerm (bv c)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UBVConcatTerm] :: (SupportedPrim (bv a), SupportedPrim (bv b), SupportedPrim (bv (a + b)), KnownNat a, KnownNat b, 1 <= a, 1 <= b, SizedBV bv) => !Term (bv a) -> !Term (bv b) -> UTerm (bv (a + b))
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UBVExtendTerm] :: (SupportedPrim (bv a), SupportedPrim (bv b), KnownNat a, KnownNat b, KnownNat n, BVExtend (bv a) n (bv b)) => !Bool -> !TypeRep n -> !Term (bv a) -> UTerm (bv b)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UBVExtendTerm] :: (SupportedPrim (bv l), SupportedPrim (bv r), KnownNat l, KnownNat r, 1 <= l, l <= r, SizedBV bv) => !Bool -> !TypeRep r -> !Term (bv l) -> UTerm (bv r)
- Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UBVSelectTerm] :: (SupportedPrim (bv a), SupportedPrim (bv w), KnownNat a, KnownNat ix, KnownNat w, BVSelect (bv a) ix w (bv w)) => !TypeRep ix -> !TypeRep w -> !Term (bv a) -> UTerm (bv w)
+ Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term: [UBVSelectTerm] :: (SupportedPrim (bv n), SupportedPrim (bv w), KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, (ix + w) <= n, SizedBV bv) => !TypeRep ix -> !TypeRep w -> !Term (bv n) -> UTerm (bv w)
- Grisette.IR.SymPrim.Data.Prim.PartialEval.BV: pevalBVConcatTerm :: (SupportedPrim (s w), SupportedPrim (s w'), SupportedPrim (s w''), KnownNat w, KnownNat w', KnownNat w'', BVConcat (s w) (s w') (s w'')) => Term (s w) -> Term (s w') -> Term (s w'')
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.BV: pevalBVConcatTerm :: (SupportedPrim (bv a), SupportedPrim (bv b), SupportedPrim (bv (a + b)), KnownNat a, KnownNat b, 1 <= a, 1 <= b, SizedBV bv) => Term (bv a) -> Term (bv b) -> Term (bv (a + b))
- Grisette.IR.SymPrim.Data.Prim.PartialEval.BV: pevalBVExtendTerm :: forall proxy a n b bv. (KnownNat a, KnownNat b, KnownNat n, BVExtend (bv a) n (bv b), SupportedPrim (bv a), SupportedPrim (bv b)) => Bool -> proxy n -> Term (bv a) -> Term (bv b)
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.BV: pevalBVExtendTerm :: forall proxy l r bv. (KnownNat l, KnownNat r, 1 <= l, l <= r, SupportedPrim (bv l), SupportedPrim (bv r), SizedBV bv) => Bool -> proxy r -> Term (bv l) -> Term (bv r)
- Grisette.IR.SymPrim.Data.Prim.PartialEval.BV: pevalBVSelectTerm :: forall bv a ix w proxy. (SupportedPrim (bv a), SupportedPrim (bv w), KnownNat a, KnownNat w, KnownNat ix, BVSelect (bv a) ix w (bv w)) => proxy ix -> proxy w -> Term (bv a) -> Term (bv w)
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.BV: pevalBVSelectTerm :: forall bv n ix w proxy. (SupportedPrim (bv n), SupportedPrim (bv w), KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, (ix + w) <= n, SizedBV bv) => proxy ix -> proxy w -> Term (bv n) -> Term (bv w)
- Grisette.IR.SymPrim.Data.Prim.PartialEval.BV: pevalBVSignExtendTerm :: forall proxy a n b bv. (KnownNat a, KnownNat b, KnownNat n, BVExtend (bv a) n (bv b), SupportedPrim (bv a), SupportedPrim (bv b)) => proxy n -> Term (bv a) -> Term (bv b)
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.BV: pevalBVSignExtendTerm :: forall proxy l r bv. (KnownNat l, KnownNat r, 1 <= l, l <= r, SupportedPrim (bv l), SupportedPrim (bv r), SizedBV bv) => proxy r -> Term (bv l) -> Term (bv r)
- Grisette.IR.SymPrim.Data.Prim.PartialEval.BV: pevalBVZeroExtendTerm :: forall proxy a n b bv. (KnownNat a, KnownNat b, KnownNat n, BVExtend (bv a) n (bv b), SupportedPrim (bv a), SupportedPrim (bv b)) => proxy n -> Term (bv a) -> Term (bv b)
+ Grisette.IR.SymPrim.Data.Prim.PartialEval.BV: pevalBVZeroExtendTerm :: forall proxy l r bv. (KnownNat l, KnownNat r, 1 <= l, l <= r, SupportedPrim (bv l), SupportedPrim (bv r), SizedBV bv) => proxy r -> Term (bv l) -> Term (bv r)
- Grisette.IR.SymPrim.Data.SymPrim: (-->) :: (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Sym b -> a --> b
+ Grisette.IR.SymPrim.Data.SymPrim: (-->) :: (SupportedPrim ca, SupportedPrim cb, LinkedRep cb sb) => TypedSymbol ca -> sb -> ca --> cb
- Grisette.IR.SymPrim.Data.SymPrim: data ModelSymPair t
+ Grisette.IR.SymPrim.Data.SymPrim: data ModelSymPair ct st
- Grisette.IR.SymPrim.Data.SymPrim: infixr 0 -~>
+ Grisette.IR.SymPrim.Data.SymPrim: infixr 0 -->
- Grisette.IR.SymPrim.Data.SymPrim: symSize :: Sym a -> Int
+ Grisette.IR.SymPrim.Data.SymPrim: symSize :: forall con sym. LinkedRep con sym => sym -> Int
- Grisette.IR.SymPrim.Data.SymPrim: symsSize :: [Sym a] -> Int
+ Grisette.IR.SymPrim.Data.SymPrim: symsSize :: forall con sym. LinkedRep con sym => [sym] -> Int
- Grisette.Internal.Backend.SBV: lowerSinglePrim :: forall integerBitWidth a. HasCallStack => GrisetteSMTConfig integerBitWidth -> Term a -> Symbolic (SymBiMap, TermTy integerBitWidth a)
+ Grisette.Internal.Backend.SBV: lowerSinglePrim :: forall integerBitWidth a m. (HasCallStack, SBVFreshMonad m) => GrisetteSMTConfig integerBitWidth -> Term a -> m (SymBiMap, TermTy integerBitWidth a)
- Grisette.Internal.Core: [UAny] :: IORef (Either (Union a) (UnionM a)) -> Union a -> UnionM a
+ Grisette.Internal.Core: [UAny] :: Union a -> UnionM a
- Grisette.Internal.IR.SymPrim: [BVConcatTerm] :: (SupportedPrim (bv a), SupportedPrim (bv b), SupportedPrim (bv c), KnownNat a, KnownNat b, KnownNat c, BVConcat (bv a) (bv b) (bv c)) => {-# UNPACK #-} !Id -> !Term (bv a) -> !Term (bv b) -> Term (bv c)
+ Grisette.Internal.IR.SymPrim: [BVConcatTerm] :: (SupportedPrim (bv a), SupportedPrim (bv b), SupportedPrim (bv (a + b)), KnownNat a, KnownNat b, 1 <= a, 1 <= b, SizedBV bv) => {-# UNPACK #-} !Id -> !Term (bv a) -> !Term (bv b) -> Term (bv (a + b))
- Grisette.Internal.IR.SymPrim: [BVExtendTerm] :: (SupportedPrim (bv a), SupportedPrim (bv b), KnownNat a, KnownNat b, KnownNat n, BVExtend (bv a) n (bv b)) => {-# UNPACK #-} !Id -> !Bool -> !TypeRep n -> !Term (bv a) -> Term (bv b)
+ Grisette.Internal.IR.SymPrim: [BVExtendTerm] :: (SupportedPrim (bv l), SupportedPrim (bv r), KnownNat l, KnownNat r, 1 <= l, l <= r, SizedBV bv) => {-# UNPACK #-} !Id -> !Bool -> !TypeRep r -> !Term (bv l) -> Term (bv r)
- Grisette.Internal.IR.SymPrim: [BVSelectTerm] :: (SupportedPrim (bv a), SupportedPrim (bv w), KnownNat a, KnownNat w, KnownNat ix, BVSelect (bv a) ix w (bv w)) => {-# UNPACK #-} !Id -> !TypeRep ix -> !TypeRep w -> !Term (bv a) -> Term (bv w)
+ Grisette.Internal.IR.SymPrim: [BVSelectTerm] :: (SupportedPrim (bv n), SupportedPrim (bv w), KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, (ix + w) <= n, SizedBV bv) => {-# UNPACK #-} !Id -> !TypeRep ix -> !TypeRep w -> !Term (bv n) -> Term (bv w)

Files

CHANGELOG.md view
@@ -1,4 +1,27 @@ # Changes +## Version 0.2.0.0++### Feature+- Redesigned symbolic value interface.+  - `Sym Bool`/`Sym Integer`, etc., are no longer available and are replaced with `SymBool` and `SymInteger`. ([#41](https://github.com/lsrcz/grisette/pull/41))+  - New symbolic bit vector interface. Added unsized bit vector. ([#41](https://github.com/lsrcz/grisette/pull/41))+- Add term size count API. ([#48](https://github.com/lsrcz/grisette/pull/48), [#53](https://github.com/lsrcz/grisette/pull/53))+- Add timeout to solver interface. ([#49](https://github.com/lsrcz/grisette/pull/49), [#50](https://github.com/lsrcz/grisette/pull/50))+- Add parallel do-notation for parallel symbolic compilation. ([#51](https://github.com/lsrcz/grisette/pull/51))+- New safe operator interfaces. ([#56](https://github.com/lsrcz/grisette/pull/56))+++### Bugfix+- Dropped merging cache for `UnionM`. This fixed some segmentation fault errors. ([#43](https://github.com/lsrcz/grisette/pull/43))+- Added some missing instances for symbolic values and bit vectors. ([#46](https://github.com/lsrcz/grisette/pull/46), [#61](https://github.com/lsrcz/grisette/pull/61))+- Fix CEGIS when no symbolic input is present. ([#52](https://github.com/lsrcz/grisette/pull/52))+- Fix overlapping `ToSym` and `ToCon` instances. ([#54](https://github.com/lsrcz/grisette/pull/54))+- Fix uninterpreted function lowering. ([#57](https://github.com/lsrcz/grisette/pull/57), [#58](https://github.com/lsrcz/grisette/pull/58))+- Add missing instances for `MonadFresh` and `FreshT`. ([#59](https://github.com/lsrcz/grisette/pull/59))+- Fix CEGIS crash when subsequent solver calls introduces new symbolic constant. ([#60](https://github.com/lsrcz/grisette/pull/60))+++ ## Version 0.1.0.0 Initial release.
LICENSE view
@@ -28,3 +28,38 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.++-------------------------------------------------------------------------------++This repository contains code from the parameterized-utils package:++Copyright (c) 2013-2022 Galois Inc.+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:++  * Redistributions of source code must retain the above copyright+    notice, this list of conditions and the following disclaimer.++  * Redistributions in binary form must reproduce the above copyright+    notice, this list of conditions and the following disclaimer in+    the documentation and/or other materials provided with the+    distribution.++  * Neither the name of Galois, Inc. nor the names of its contributors+    may be used to endorse or promote products derived from this+    software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
README.md view
@@ -6,6 +6,9 @@ programs into constraints, Grisette can help the development of program reasoning tools, including verification and synthesis. +For a detailed description of the system, please refer to our POPL'23 paper+[Grisette: Symbolic Compilation as a Functional Programming Library](https://lsrcz.github.io/files/POPL23.pdf).+ ## Features  - **Multi-path** symbolic evaluation with efficient (customizable) state merging.
grisette.cabal view
@@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.35.0.+-- This file has been generated from package.yaml by hpack version 0.35.1. -- -- see: https://github.com/sol/hpack  name:           grisette-version:        0.1.0.0+version:        0.2.0.0 synopsis:       Symbolic evaluation as a library description:    Grisette is a reusable symbolic evaluation library for Haskell. By                 translating programs into constraints, Grisette can help the development of@@ -48,8 +48,10 @@       Grisette.Core.BuiltinUnionWrappers       Grisette.Core.Control.Exception       Grisette.Core.Control.Monad.CBMCExcept+      Grisette.Core.Control.Monad.Class.MonadParallelUnion       Grisette.Core.Control.Monad.Union       Grisette.Core.Control.Monad.UnionM+      Grisette.Core.Data.BV       Grisette.Core.Data.Class.BitVector       Grisette.Core.Data.Class.Bool       Grisette.Core.Data.Class.CEGISSolver@@ -58,9 +60,9 @@       Grisette.Core.Data.Class.ExtractSymbolics       Grisette.Core.Data.Class.Function       Grisette.Core.Data.Class.GenSym-      Grisette.Core.Data.Class.Integer       Grisette.Core.Data.Class.Mergeable       Grisette.Core.Data.Class.ModelOps+      Grisette.Core.Data.Class.SafeArith       Grisette.Core.Data.Class.SimpleMergeable       Grisette.Core.Data.Class.Solvable       Grisette.Core.Data.Class.Solver@@ -77,7 +79,6 @@       Grisette.Internal.Core       Grisette.Internal.IR.SymPrim       Grisette.IR.SymPrim-      Grisette.IR.SymPrim.Data.BV       Grisette.IR.SymPrim.Data.IntBitwidth       Grisette.IR.SymPrim.Data.Prim.Helpers       Grisette.IR.SymPrim.Data.Prim.InternedTerm.Caches@@ -92,7 +93,7 @@       Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool       Grisette.IR.SymPrim.Data.Prim.PartialEval.BV       Grisette.IR.SymPrim.Data.Prim.PartialEval.GeneralFun-      Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer+      Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral       Grisette.IR.SymPrim.Data.Prim.PartialEval.Num       Grisette.IR.SymPrim.Data.Prim.PartialEval.PartialEval       Grisette.IR.SymPrim.Data.Prim.PartialEval.TabularFun@@ -109,6 +110,9 @@       Grisette.Lib.Data.List       Grisette.Lib.Data.Traversable       Grisette.Lib.Mtl+      Grisette.Qualified.ParallelUnionDo+      Grisette.Utils+      Grisette.Utils.Parameterized   other-modules:       Paths_grisette   hs-source-dirs:@@ -126,6 +130,7 @@     , loch-th >=0.2.2 && <0.3     , mtl >=2.2.2 && <2.3     , once >=0.2 && <0.5+    , parallel     , sbv >=8.11 && <9.1     , template-haskell >=2.16 && <2.20     , th-compat >=0.1.2 && <0.2@@ -161,6 +166,7 @@     , loch-th >=0.2.2 && <0.3     , mtl >=2.2.2 && <2.3     , once >=0.2 && <0.5+    , parallel     , sbv >=8.11 && <9.1     , template-haskell >=2.16 && <2.20     , th-compat >=0.1.2 && <0.2@@ -181,11 +187,12 @@       Grisette.Backend.SBV.Data.SMT.LoweringTests       Grisette.Backend.SBV.Data.SMT.TermRewritingGen       Grisette.Backend.SBV.Data.SMT.TermRewritingTests-      Grisette.IR.SymPrim.Data.BVTests+      Grisette.Core.Control.Monad.UnionMTests+      Grisette.Core.Data.BVTests       Grisette.IR.SymPrim.Data.Prim.BitsTests       Grisette.IR.SymPrim.Data.Prim.BoolTests       Grisette.IR.SymPrim.Data.Prim.BVTests-      Grisette.IR.SymPrim.Data.Prim.IntegerTests+      Grisette.IR.SymPrim.Data.Prim.IntegralTests       Grisette.IR.SymPrim.Data.Prim.ModelTests       Grisette.IR.SymPrim.Data.Prim.NumTests       Grisette.IR.SymPrim.Data.Prim.TabularFunTests@@ -208,6 +215,7 @@     , loch-th >=0.2.2 && <0.3     , mtl >=2.2.2 && <2.3     , once >=0.2 && <0.5+    , parallel     , sbv >=8.11 && <9.1     , tasty >=1.1.0.3 && <1.5     , tasty-hunit ==0.10.*
src/Grisette.hs view
@@ -19,6 +19,9 @@      -- * Solver backend     module Grisette.Backend.SBV,++    -- * Utils+    module Grisette.Utils,   ) where @@ -27,3 +30,4 @@ import Grisette.IR.SymPrim import Grisette.Lib.Base import Grisette.Lib.Mtl+import Grisette.Utils
src/Grisette/Backend/SBV.hs view
@@ -8,8 +8,16 @@ -- Portability :   GHC only module Grisette.Backend.SBV   ( -- * Grisette SBV backend configuration+    ApproximationConfig (..),+    ExtraConfig (..),+    precise,+    approx,+    withTimeout,+    clearTimeout,+    withApprox,+    clearApprox,     GrisetteSMTConfig (..),-    sbvConfig,+    SolvingFailure (..),      -- * SBV backend solver configuration     SBV.SMTConfig (..),
src/Grisette/Backend/SBV/Data/SMT/Lowering.hs view
@@ -2,1162 +2,1658 @@ {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE PolyKinds #-}-{-# LANGUAGE QuantifiedConstraints #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE RoleAnnotations #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE ViewPatterns #-}---- |--- Module      :   Grisette.Backend.SBV.Data.SMT.Lowering--- Copyright   :   (c) Sirui Lu 2021-2023--- License     :   BSD-3-Clause (see the LICENSE file)------ Maintainer  :   siruilu@cs.washington.edu--- Stability   :   Experimental--- Portability :   GHC only-module Grisette.Backend.SBV.Data.SMT.Lowering-  ( lowerSinglePrim,-    lowerSinglePrim',-    parseModel,-    SymBiMap,-  )-where--import Control.Monad.State.Strict-import Data.Bifunctor-import Data.Bits-import Data.Dynamic-import Data.Foldable-import Data.Kind-import Data.Maybe-import qualified Data.SBV as SBV-import qualified Data.SBV.Internals as SBVI-import Data.Type.Equality (type (~~))-import Data.Typeable-import GHC.Exts (sortWith)-import GHC.Natural-import GHC.Stack-import GHC.TypeNats-import {-# SOURCE #-} Grisette.Backend.SBV.Data.SMT.Solving-import Grisette.Backend.SBV.Data.SMT.SymBiMap-import Grisette.Core.Data.Class.ModelOps-import Grisette.IR.SymPrim.Data.BV-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.SomeTerm-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermUtils-import Grisette.IR.SymPrim.Data.Prim.Model as PM-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool-import Grisette.IR.SymPrim.Data.TabularFun-import qualified Type.Reflection as R-import Unsafe.Coerce--newtype NatRepr (n :: Nat) = NatRepr Natural--withKnownNat :: forall n r. NatRepr n -> (KnownNat n => r) -> r-withKnownNat (NatRepr nVal) v =-  case someNatVal nVal of-    SomeNat (Proxy :: Proxy n') ->-      case unsafeAxiom :: n :~: n' of-        Refl -> v--data LeqProof (m :: Nat) (n :: Nat) where-  LeqProof :: m <= n => LeqProof m n---- | Assert a proof of equality between two types.--- This is unsafe if used improperly, so use this with caution!-unsafeAxiom :: forall a b. a :~: b-unsafeAxiom = unsafeCoerce (Refl @a)-{-# NOINLINE unsafeAxiom #-} -- Note [Mark unsafe axioms as NOINLINE]--unsafeLeqProof :: forall m n. LeqProof m n-unsafeLeqProof = unsafeCoerce (LeqProof @0 @0)-{-# NOINLINE unsafeLeqProof #-} -- Note [Mark unsafe axioms as NOINLINE]--cachedResult ::-  forall integerBitWidth a.-  (SupportedPrim a, Typeable (TermTy integerBitWidth a)) =>-  Term a ->-  State SymBiMap (Maybe (TermTy integerBitWidth a))-cachedResult t = gets $ \m -> do-  d <- lookupTerm (SomeTerm t) m-  Just $ fromDyn d undefined--addResult ::-  forall integerBitWidth a.-  (SupportedPrim a, Typeable (TermTy integerBitWidth a)) =>-  Term a ->-  TermTy integerBitWidth a ->-  State SymBiMap ()-addResult tm sbvtm = modify $ addBiMapIntermediate (SomeTerm tm) (toDyn sbvtm)--lowerSinglePrim' ::-  forall integerBitWidth a.-  GrisetteSMTConfig integerBitWidth ->-  Term a ->-  SymBiMap ->-  (TermTy integerBitWidth a, SymBiMap)-lowerSinglePrim' config t = runState (lowerSinglePrimCached' config t)--lowerSinglePrimCached' ::-  forall integerBitWidth a.-  GrisetteSMTConfig integerBitWidth ->-  Term a ->-  State SymBiMap (TermTy integerBitWidth a)-lowerSinglePrimCached' config t = introSupportedPrimConstraint t $-  case (config, R.typeRep @a) of-    ResolvedDeepType -> do-      r <- cachedResult @integerBitWidth t-      case r of-        Just v -> return v-        _ -> lowerSinglePrimImpl' config t-    _ -> translateTypeError (R.typeRep @a)--lowerUnaryTerm' ::-  forall integerBitWidth a a1 x x1.-  (Typeable x1, a1 ~ TermTy integerBitWidth a, SupportedPrim x, x1 ~ TermTy integerBitWidth x) =>-  GrisetteSMTConfig integerBitWidth ->-  Term x ->-  Term a ->-  (a1 -> x1) ->-  State SymBiMap (TermTy integerBitWidth x)-lowerUnaryTerm' config orig t1 f = do-  l1 <- lowerSinglePrimCached' config t1-  let g = f l1-  addResult @integerBitWidth orig g-  return g--lowerBinaryTerm' ::-  forall integerBitWidth a b a1 b1 x.-  ( Typeable (TermTy integerBitWidth x),-    a1 ~ TermTy integerBitWidth a,-    b1 ~ TermTy integerBitWidth b,-    SupportedPrim x-  ) =>-  GrisetteSMTConfig integerBitWidth ->-  Term x ->-  Term a ->-  Term b ->-  (a1 -> b1 -> TermTy integerBitWidth x) ->-  State SymBiMap (TermTy integerBitWidth x)-lowerBinaryTerm' config orig t1 t2 f = do-  l1 <- lowerSinglePrimCached' config t1-  l2 <- lowerSinglePrimCached' config t2-  let g = f l1 l2-  addResult @integerBitWidth orig g-  return g--lowerSinglePrimImpl' ::-  forall integerBitWidth a.-  GrisetteSMTConfig integerBitWidth ->-  Term a ->-  State SymBiMap (TermTy integerBitWidth a)-lowerSinglePrimImpl' ResolvedConfig {} (ConTerm _ v) =-  case R.typeRep @a of-    BoolType -> return $ if v then SBV.sTrue else SBV.sFalse-    IntegerType -> return $ fromInteger v-    SignedBVType _ -> case v of-      IntN x -> return $ fromInteger x-    UnsignedBVType _ -> case v of-      WordN x -> return $ fromInteger x-    _ -> translateTypeError (R.typeRep @a)-lowerSinglePrimImpl' _ t@SymTerm {} =-  error $-    "The symbolic term should have already been lowered "-      ++ show t-      ++ " to SMT with collectedPrims.\n"-      ++ "We don't support adding new symbolics after collectedPrims with SBV backend"-lowerSinglePrimImpl' _ (UnaryTerm _ op (_ :: Term x)) = errorMsg-  where-    errorMsg :: forall t1. t1-    errorMsg = translateUnaryError (show op) (R.typeRep @x) (R.typeRep @a)-lowerSinglePrimImpl' _ (BinaryTerm _ op (_ :: Term x) (_ :: Term y)) = errorMsg-  where-    errorMsg :: forall t1. t1-    errorMsg = translateBinaryError (show op) (R.typeRep @x) (R.typeRep @y) (R.typeRep @a)-lowerSinglePrimImpl' ResolvedConfig {} (TernaryTerm _ op (_ :: Term x) (_ :: Term y) (_ :: Term z)) = errorMsg-  where-    errorMsg :: forall t1. t1-    errorMsg = translateTernaryError (show op) (R.typeRep @x) (R.typeRep @y) (R.typeRep @z) (R.typeRep @a)-lowerSinglePrimImpl' config t@(NotTerm _ arg) = lowerUnaryTerm' config t arg SBV.sNot-lowerSinglePrimImpl' config t@(OrTerm _ arg1 arg2) = lowerBinaryTerm' config t arg1 arg2 (SBV..||)-lowerSinglePrimImpl' config t@(AndTerm _ arg1 arg2) = lowerBinaryTerm' config t arg1 arg2 (SBV..&&)-lowerSinglePrimImpl' config t@(EqvTerm _ (arg1 :: Term x) arg2) =-  case (config, R.typeRep @x) of-    ResolvedSimpleType -> lowerBinaryTerm' config t arg1 arg2 (SBV..==)-    _ -> translateBinaryError "(==)" (R.typeRep @x) (R.typeRep @x) (R.typeRep @a)-lowerSinglePrimImpl' config t@(ITETerm _ cond arg1 arg2) =-  case (config, R.typeRep @a) of-    ResolvedSimpleType -> do-      l1 <- lowerSinglePrimCached' config cond-      l2 <- lowerSinglePrimCached' config arg1-      l3 <- lowerSinglePrimCached' config arg2-      let g = SBV.ite l1 l2 l3-      addResult @integerBitWidth t g-      return g-    _ -> translateTernaryError "ite" (R.typeRep @Bool) (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' config t@(AddNumTerm _ arg1 arg2) =-  case (config, R.typeRep @a) of-    ResolvedNumType -> lowerBinaryTerm' config t arg1 arg2 (+)-    _ -> translateBinaryError "(+)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' config t@(UMinusNumTerm _ arg) =-  case (config, R.typeRep @a) of-    ResolvedNumType -> lowerUnaryTerm' config t arg negate-    _ -> translateUnaryError "negate" (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' config t@(TimesNumTerm _ arg1 arg2) =-  case (config, R.typeRep @a) of-    ResolvedNumType -> lowerBinaryTerm' config t arg1 arg2 (*)-    _ -> translateBinaryError "(*)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' config t@(AbsNumTerm _ arg) =-  case (config, R.typeRep @a) of-    ResolvedNumType -> lowerUnaryTerm' config t arg abs-    _ -> translateUnaryError "abs" (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' config t@(SignumNumTerm _ arg) =-  case (config, R.typeRep @a) of-    ResolvedNumType -> lowerUnaryTerm' config t arg signum-    _ -> translateUnaryError "signum" (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' config t@(LTNumTerm _ (arg1 :: Term arg) arg2) =-  case (config, R.typeRep @arg) of-    ResolvedNumOrdType -> lowerBinaryTerm' config t arg1 arg2 (SBV..<)-    _ -> translateBinaryError "(<)" (R.typeRep @arg) (R.typeRep @arg) (R.typeRep @Bool)-lowerSinglePrimImpl' config t@(LENumTerm _ (arg1 :: Term arg) arg2) =-  case (config, R.typeRep @arg) of-    ResolvedNumOrdType -> lowerBinaryTerm' config t arg1 arg2 (SBV..<=)-    _ -> translateBinaryError "(<=)" (R.typeRep @arg) (R.typeRep @arg) (R.typeRep @Bool)-lowerSinglePrimImpl' config t@(AndBitsTerm _ arg1 arg2) =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerBinaryTerm' config t arg1 arg2 (.&.)-    _ -> translateBinaryError "(.&.)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' config t@(OrBitsTerm _ arg1 arg2) =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerBinaryTerm' config t arg1 arg2 (.|.)-    _ -> translateBinaryError "(.|.)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' config t@(XorBitsTerm _ arg1 arg2) =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerBinaryTerm' config t arg1 arg2 xor-    _ -> translateBinaryError "xor" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' config t@(ComplementBitsTerm _ arg) =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerUnaryTerm' config t arg complement-    _ -> translateUnaryError "complement" (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' config t@(ShiftBitsTerm _ arg n) =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerUnaryTerm' config t arg (`shift` n)-    _ -> translateBinaryError "shift" (R.typeRep @a) (R.typeRep @Int) (R.typeRep @a)-lowerSinglePrimImpl' config t@(RotateBitsTerm _ arg n) =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerUnaryTerm' config t arg (`rotate` n)-    _ -> translateBinaryError "rotate" (R.typeRep @a) (R.typeRep @Int) (R.typeRep @a)-lowerSinglePrimImpl' config t@(BVConcatTerm _ (bv1 :: Term x) (bv2 :: Term y)) =-  case (R.typeRep @a, R.typeRep @x, R.typeRep @y) of-    (UnsignedBVType (_ :: Proxy na), UnsignedBVType (_ :: Proxy nx), UnsignedBVType (_ :: Proxy ny)) ->-      case (unsafeAxiom @(nx + ny) @na) of-        Refl -> lowerBinaryTerm' config t bv1 bv2 (SBV.#)-    (SignedBVType (_ :: Proxy na), SignedBVType (_ :: Proxy nx), SignedBVType (_ :: Proxy ny)) ->-      case (unsafeAxiom @(nx + ny) @na) of-        Refl ->-          lowerBinaryTerm'-            config-            t-            bv1-            bv2-            ( \(x :: SBV.SInt xn) (y :: SBV.SInt yn) ->-                SBV.sFromIntegral $-                  (SBV.sFromIntegral x :: SBV.SWord xn) SBV.# (SBV.sFromIntegral y :: SBV.SWord yn)-            )-    _ -> translateBinaryError "bvconcat" (R.typeRep @x) (R.typeRep @y) (R.typeRep @a)-lowerSinglePrimImpl' config t@(BVSelectTerm _ (ix :: R.TypeRep ix) w (bv :: Term x)) =-  case (R.typeRep @a, R.typeRep @x) of-    (UnsignedBVType (_ :: Proxy na), UnsignedBVType (_ :: Proxy xn)) ->-      withKnownNat n1 $-        case ( unsafeAxiom @(na + ix - 1 - ix + 1) @na,-               unsafeLeqProof @(na + ix - 1 + 1) @xn,-               unsafeLeqProof @ix @(na + ix - 1)-             ) of-          (Refl, LeqProof, LeqProof) ->-            lowerUnaryTerm' config t bv (SBV.bvExtract (Proxy @(na + ix - 1)) (Proxy @ix))-      where-        n1 :: NatRepr (na + ix - 1)-        n1 = NatRepr (natVal (Proxy @na) + natVal (Proxy @ix) - 1)-    (SignedBVType (_ :: Proxy na), SignedBVType (_ :: Proxy xn)) ->-      withKnownNat n1 $-        case ( unsafeAxiom @(na + ix - 1 - ix + 1) @na,-               unsafeLeqProof @(na + ix - 1 + 1) @xn,-               unsafeLeqProof @ix @(na + ix - 1)-             ) of-          (Refl, LeqProof, LeqProof) ->-            lowerUnaryTerm' config t bv (SBV.bvExtract (Proxy @(na + ix - 1)) (Proxy @ix))-      where-        n1 :: NatRepr (na + ix - 1)-        n1 = NatRepr (natVal (Proxy @na) + natVal (Proxy @ix) - 1)-    _ -> translateTernaryError "bvselect" ix w (R.typeRep @x) (R.typeRep @a)-lowerSinglePrimImpl' config t@(BVExtendTerm _ signed (n :: R.TypeRep n) (bv :: Term x)) =-  case (R.typeRep @a, R.typeRep @x) of-    (UnsignedBVType (_ :: Proxy na), UnsignedBVType (_ :: Proxy nx)) ->-      withKnownNat (NatRepr (natVal (Proxy @na) - natVal (Proxy @nx)) :: NatRepr (na - nx)) $-        case (unsafeLeqProof @(nx + 1) @na, unsafeLeqProof @1 @(na - nx)) of-          (LeqProof, LeqProof) ->-            bvIsNonZeroFromGEq1 @(na - nx) $-              lowerUnaryTerm' config t bv (if signed then SBV.signExtend else SBV.zeroExtend)-    (SignedBVType (_ :: Proxy na), SignedBVType (_ :: Proxy nx)) ->-      withKnownNat (NatRepr (natVal (Proxy @na) - natVal (Proxy @nx)) :: NatRepr (na - nx)) $-        case (unsafeLeqProof @(nx + 1) @na, unsafeLeqProof @1 @(na - nx)) of-          (LeqProof, LeqProof) ->-            bvIsNonZeroFromGEq1 @(na - nx) $-              lowerUnaryTerm'-                config-                t-                bv-                ( if signed-                    then SBV.signExtend-                    else \x ->-                      SBV.sFromIntegral-                        (SBV.zeroExtend (SBV.sFromIntegral x :: SBV.SBV (SBV.WordN nx)) :: SBV.SBV (SBV.WordN na))-                )-    _ -> translateTernaryError "bvextend" (R.typeRep @Bool) n (R.typeRep @x) (R.typeRep @a)-lowerSinglePrimImpl' config t@(TabularFunApplyTerm _ (f :: Term (b =-> a)) (arg :: Term b)) =-  case (config, R.typeRep @a) of-    ResolvedDeepType -> do-      l1 <- lowerSinglePrimCached' config f-      l2 <- lowerSinglePrimCached' config arg-      let g = l1 l2-      addResult @integerBitWidth t g-      return g-    _ -> translateBinaryError "tabularApply" (R.typeRep @(b =-> a)) (R.typeRep @b) (R.typeRep @a)-lowerSinglePrimImpl' config t@(GeneralFunApplyTerm _ (f :: Term (b --> a)) (arg :: Term b)) =-  case (config, R.typeRep @a) of-    ResolvedDeepType -> do-      l1 <- lowerSinglePrimCached' config f-      l2 <- lowerSinglePrimCached' config arg-      let g = l1 l2-      addResult @integerBitWidth t g-      return g-    _ -> translateBinaryError "generalApply" (R.typeRep @(b --> a)) (R.typeRep @b) (R.typeRep @a)-lowerSinglePrimImpl' config t@(DivIntegerTerm _ arg1 arg2) =-  case (config, R.typeRep @a) of-    (ResolvedConfig {}, IntegerType) -> lowerBinaryTerm' config t arg1 arg2 SBV.sDiv-    _ -> translateBinaryError "div" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' config t@(ModIntegerTerm _ arg1 arg2) =-  case (config, R.typeRep @a) of-    (ResolvedConfig {}, IntegerType) -> lowerBinaryTerm' config t arg1 arg2 SBV.sMod-    _ -> translateBinaryError "mod" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl' _ _ = undefined--buildUTFun11 ::-  forall integerBitWidth s1 s2 a.-  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2) =>-  GrisetteSMTConfig integerBitWidth ->-  R.TypeRep s1 ->-  R.TypeRep s2 ->-  Term a ->-  SymBiMap ->-  Maybe (SBV.Symbolic (SymBiMap, TermTy integerBitWidth (s1 =-> s2)))-buildUTFun11 config ta tb term@(SymTerm _ ts) m = case ((config, ta), (config, tb)) of-  (ResolvedSimpleType, ResolvedSimpleType) ->-    let name = "ufunc_" ++ show (sizeBiMap m)-        f = SBV.uninterpret @(TermTy integerBitWidth s1 -> TermTy integerBitWidth s2) name-     in Just $ return (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)-  _ -> Nothing-buildUTFun11 _ _ _ _ _ = error "Should only be called on SymTerm"--buildUTFun111 ::-  forall integerBitWidth s1 s2 s3 a.-  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2, SupportedPrim s3) =>-  GrisetteSMTConfig integerBitWidth ->-  R.TypeRep s1 ->-  R.TypeRep s2 ->-  R.TypeRep s3 ->-  Term a ->-  SymBiMap ->-  Maybe (SBV.Symbolic (SymBiMap, TermTy integerBitWidth (s1 =-> s2 =-> s3)))-buildUTFun111 config ta tb tc term@(SymTerm _ ts) m = case ((config, ta), (config, tb), (config, tc)) of-  (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->-    let name = "ufunc_" ++ show (sizeBiMap m)-        f =-          SBV.uninterpret @(TermTy integerBitWidth s1 -> TermTy integerBitWidth s2 -> TermTy integerBitWidth s3)-            name-     in Just $ return (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)-  _ -> Nothing-buildUTFun111 _ _ _ _ _ _ = error "Should only be called on SymTerm"--buildUGFun11 ::-  forall integerBitWidth s1 s2 a.-  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2) =>-  GrisetteSMTConfig integerBitWidth ->-  R.TypeRep s1 ->-  R.TypeRep s2 ->-  Term a ->-  SymBiMap ->-  Maybe (SBV.Symbolic (SymBiMap, TermTy integerBitWidth (s1 --> s2)))-buildUGFun11 config ta tb term@(SymTerm _ ts) m = case ((config, ta), (config, tb)) of-  (ResolvedSimpleType, ResolvedSimpleType) ->-    let name = "ufunc_" ++ show (sizeBiMap m)-        f = SBV.uninterpret @(TermTy integerBitWidth s1 -> TermTy integerBitWidth s2) name-     in Just $ return (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)-  _ -> Nothing-buildUGFun11 _ _ _ _ _ = error "Should only be called on SymTerm"--buildUGFun111 ::-  forall integerBitWidth s1 s2 s3 a.-  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2, SupportedPrim s3) =>-  GrisetteSMTConfig integerBitWidth ->-  R.TypeRep s1 ->-  R.TypeRep s2 ->-  R.TypeRep s3 ->-  Term a ->-  SymBiMap ->-  Maybe (SBV.Symbolic (SymBiMap, TermTy integerBitWidth (s1 --> s2 --> s3)))-buildUGFun111 config ta tb tc term@(SymTerm _ ts) m = case ((config, ta), (config, tb), (config, tc)) of-  (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->-    let name = "ufunc_" ++ show (sizeBiMap m)-        f =-          SBV.uninterpret @(TermTy integerBitWidth s1 -> TermTy integerBitWidth s2 -> TermTy integerBitWidth s3)-            name-     in Just $ return (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)-  _ -> Nothing-buildUGFun111 _ _ _ _ _ _ = error "Should only be called on SymTerm"--lowerSinglePrimUFun ::-  forall integerBitWidth a.-  GrisetteSMTConfig integerBitWidth ->-  Term a ->-  SymBiMap ->-  Maybe (SBV.Symbolic (SymBiMap, TermTy integerBitWidth a))-lowerSinglePrimUFun config t@(SymTerm _ _) m =-  case R.typeRep @a of-    TFun3Type (t1 :: R.TypeRep a1) (t2 :: R.TypeRep a2) (t3 :: R.TypeRep a3) -> buildUTFun111 config t1 t2 t3 t m-    TFunType (ta :: R.TypeRep b) (tb :: R.TypeRep b1) -> buildUTFun11 config ta tb t m-    GFun3Type (t1 :: R.TypeRep a1) (t2 :: R.TypeRep a2) (t3 :: R.TypeRep a3) -> buildUGFun111 config t1 t2 t3 t m-    GFunType (ta :: R.TypeRep b) (tb :: R.TypeRep b1) -> buildUGFun11 config ta tb t m-    _ -> Nothing-lowerSinglePrimUFun _ _ _ = error "Should not call this function"--lowerUnaryTerm ::-  forall integerBitWidth a a1 x x1.-  (Typeable x1, a1 ~ TermTy integerBitWidth a, SupportedPrim x, HasCallStack) =>-  GrisetteSMTConfig integerBitWidth ->-  Term x ->-  Term a ->-  (a1 -> x1) ->-  SymBiMap ->-  SBV.Symbolic (SymBiMap, x1)-lowerUnaryTerm config orig t1 f m = do-  (m1, l1) <- lowerSinglePrimCached config t1 m-  let g = f l1-  return (addBiMapIntermediate (SomeTerm orig) (toDyn g) m1, g)--lowerBinaryTerm ::-  forall integerBitWidth a b a1 b1 x x1.-  (Typeable x1, a1 ~ TermTy integerBitWidth a, b1 ~ TermTy integerBitWidth b, SupportedPrim x, HasCallStack) =>-  GrisetteSMTConfig integerBitWidth ->-  Term x ->-  Term a ->-  Term b ->-  (a1 -> b1 -> x1) ->-  SymBiMap ->-  SBV.Symbolic (SymBiMap, x1)-lowerBinaryTerm config orig t1 t2 f m = do-  (m1, l1) <- lowerSinglePrimCached config t1 m-  (m2, l2) <- lowerSinglePrimCached config t2 m1-  let g = f l1 l2-  return (addBiMapIntermediate (SomeTerm orig) (toDyn g) m2, g)--lowerSinglePrimCached ::-  forall integerBitWidth a.-  HasCallStack =>-  GrisetteSMTConfig integerBitWidth ->-  Term a ->-  SymBiMap ->-  SBV.Symbolic (SymBiMap, TermTy integerBitWidth a)-lowerSinglePrimCached config t m =-  introSupportedPrimConstraint t $-    case (config, R.typeRep @a) of-      ResolvedDeepType ->-        case lookupTerm (SomeTerm t) m of-          Just x -> return (m, fromDyn x undefined)-          Nothing -> lowerSinglePrimImpl config t m-      _ -> translateTypeError (R.typeRep @a)--lowerSinglePrim ::-  forall integerBitWidth a.-  HasCallStack =>-  GrisetteSMTConfig integerBitWidth ->-  Term a ->-  SBV.Symbolic (SymBiMap, TermTy integerBitWidth a)-lowerSinglePrim config t = lowerSinglePrimCached config t emptySymBiMap--translateTypeError :: HasCallStack => R.TypeRep a -> b-translateTypeError ta =-  error $-    "Don't know how to translate the type " ++ show ta ++ " to SMT"--translateUnaryError :: HasCallStack => String -> R.TypeRep a -> R.TypeRep b -> c-translateUnaryError op ta tb =-  error $-    "Don't know how to translate the op "-      ++ show op-      ++ " :: "-      ++ show ta-      ++ " -> "-      ++ show tb-      ++ " to SMT"--translateBinaryError :: HasCallStack => String -> R.TypeRep a -> R.TypeRep b -> R.TypeRep c -> d-translateBinaryError op ta tb tc =-  error $-    "Don't know how to translate the op "-      ++ show op-      ++ " :: "-      ++ show ta-      ++ " -> "-      ++ show tb-      ++ " -> "-      ++ show tc-      ++ " to SMT"--translateTernaryError :: HasCallStack => String -> R.TypeRep a -> R.TypeRep b -> R.TypeRep c -> R.TypeRep d -> e-translateTernaryError op ta tb tc td =-  error $-    "Don't know how to translate the op "-      ++ show op-      ++ " :: "-      ++ show ta-      ++ " -> "-      ++ show tb-      ++ " -> "-      ++ show tc-      ++ " -> "-      ++ show td-      ++ " to SMT"--lowerSinglePrimImpl ::-  forall integerBitWidth a.-  HasCallStack =>-  GrisetteSMTConfig integerBitWidth ->-  Term a ->-  SymBiMap ->-  SBV.Symbolic (SymBiMap, TermTy integerBitWidth a)-lowerSinglePrimImpl ResolvedConfig {} (ConTerm _ v) m =-  case R.typeRep @a of-    BoolType -> return (m, if v then SBV.sTrue else SBV.sFalse)-    IntegerType -> return (m, fromInteger v)-    SignedBVType _ -> case v of-      IntN x -> return (m, fromInteger x)-    UnsignedBVType _ -> case v of-      WordN x -> return (m, fromInteger x)-    _ -> translateTypeError (R.typeRep @a)-lowerSinglePrimImpl config t@(SymTerm _ ts) m =-  fromMaybe errorMsg $ asum [simple, ufunc]-  where-    errorMsg :: forall x. x-    errorMsg = translateTypeError (R.typeRep @a)-    simple :: Maybe (SBV.Symbolic (SymBiMap, TermTy integerBitWidth a))-    simple = case (config, R.typeRep @a) of-      ResolvedSimpleType -> Just $ do-        let name = show ts-        (g :: TermTy integerBitWidth a) <- SBV.free name-        return (addBiMap (SomeTerm t) (toDyn g) name (someTypedSymbol ts) m, g)-      _ -> Nothing-    ufunc :: (Maybe (SBV.Symbolic (SymBiMap, TermTy integerBitWidth a)))-    ufunc = lowerSinglePrimUFun config t m-lowerSinglePrimImpl _ (UnaryTerm _ op (_ :: Term x)) _ = errorMsg-  where-    errorMsg :: forall t1. t1-    errorMsg = translateUnaryError (show op) (R.typeRep @x) (R.typeRep @a)-lowerSinglePrimImpl _ (BinaryTerm _ op (_ :: Term x) (_ :: Term y)) _ = errorMsg-  where-    errorMsg :: forall t1. t1-    errorMsg = translateBinaryError (show op) (R.typeRep @x) (R.typeRep @y) (R.typeRep @a)-lowerSinglePrimImpl ResolvedConfig {} (TernaryTerm _ op (_ :: Term x) (_ :: Term y) (_ :: Term z)) _ = errorMsg-  where-    errorMsg :: forall t1. t1-    errorMsg = translateTernaryError (show op) (R.typeRep @x) (R.typeRep @y) (R.typeRep @z) (R.typeRep @a)-lowerSinglePrimImpl config t@(NotTerm _ arg) m = lowerUnaryTerm config t arg SBV.sNot m-lowerSinglePrimImpl config t@(OrTerm _ arg1 arg2) m = lowerBinaryTerm config t arg1 arg2 (SBV..||) m-lowerSinglePrimImpl config t@(AndTerm _ arg1 arg2) m = lowerBinaryTerm config t arg1 arg2 (SBV..&&) m-lowerSinglePrimImpl config t@(EqvTerm _ (arg1 :: Term x) arg2) m =-  case (config, R.typeRep @x) of-    ResolvedSimpleType -> lowerBinaryTerm config t arg1 arg2 (SBV..==) m-    _ -> translateBinaryError "(==)" (R.typeRep @x) (R.typeRep @x) (R.typeRep @a)-lowerSinglePrimImpl config t@(ITETerm _ cond arg1 arg2) m =-  case (config, R.typeRep @a) of-    ResolvedSimpleType -> do-      (m1, l1) <- lowerSinglePrimCached config cond m-      (m2, l2) <- lowerSinglePrimCached config arg1 m1-      (m3, l3) <- lowerSinglePrimCached config arg2 m2-      let g = SBV.ite l1 l2 l3-      return (addBiMapIntermediate (SomeTerm t) (toDyn g) m3, g)-    _ -> translateBinaryError "ite" (R.typeRep @Bool) (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl config t@(AddNumTerm _ arg1 arg2) m =-  case (config, R.typeRep @a) of-    ResolvedNumType -> lowerBinaryTerm config t arg1 arg2 (+) m-    _ -> translateBinaryError "(+)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl config t@(UMinusNumTerm _ arg) m =-  case (config, R.typeRep @a) of-    ResolvedNumType -> lowerUnaryTerm config t arg negate m-    _ -> translateUnaryError "negate" (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl config t@(TimesNumTerm _ arg1 arg2) m =-  case (config, R.typeRep @a) of-    ResolvedNumType -> lowerBinaryTerm config t arg1 arg2 (*) m-    _ -> translateBinaryError "(*)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl config t@(AbsNumTerm _ arg) m =-  case (config, R.typeRep @a) of-    ResolvedNumType -> lowerUnaryTerm config t arg abs m-    _ -> translateUnaryError "abs" (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl config t@(SignumNumTerm _ arg) m =-  case (config, R.typeRep @a) of-    ResolvedNumType -> lowerUnaryTerm config t arg signum m-    _ -> translateUnaryError "signum" (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl config t@(LTNumTerm _ (arg1 :: Term arg) arg2) m =-  case (config, R.typeRep @arg) of-    ResolvedNumOrdType -> lowerBinaryTerm config t arg1 arg2 (SBV..<) m-    _ -> translateBinaryError "(<)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @Bool)-lowerSinglePrimImpl config t@(LENumTerm _ (arg1 :: Term arg) arg2) m =-  case (config, R.typeRep @arg) of-    ResolvedNumOrdType -> lowerBinaryTerm config t arg1 arg2 (SBV..<=) m-    _ -> translateBinaryError "(<=)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @Bool)-lowerSinglePrimImpl config t@(AndBitsTerm _ arg1 arg2) m =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerBinaryTerm config t arg1 arg2 (.&.) m-    _ -> translateBinaryError "(.&.)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl config t@(OrBitsTerm _ arg1 arg2) m =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerBinaryTerm config t arg1 arg2 (.|.) m-    _ -> translateBinaryError "(.|.)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl config t@(XorBitsTerm _ arg1 arg2) m =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerBinaryTerm config t arg1 arg2 xor m-    _ -> translateBinaryError "xor" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl config t@(ComplementBitsTerm _ arg) m =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerUnaryTerm config t arg complement m-    _ -> translateUnaryError "complement" (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl config t@(ShiftBitsTerm _ arg n) m =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerUnaryTerm config t arg (`shift` n) m-    _ -> translateBinaryError "shift" (R.typeRep @a) (R.typeRep @Int) (R.typeRep @a)-lowerSinglePrimImpl config t@(RotateBitsTerm _ arg n) m =-  case (config, R.typeRep @a) of-    ResolvedBitsType -> lowerUnaryTerm config t arg (`rotate` n) m-    _ -> translateBinaryError "rotate" (R.typeRep @a) (R.typeRep @Int) (R.typeRep @a)-lowerSinglePrimImpl config t@(BVConcatTerm _ (bv1 :: Term x) (bv2 :: Term y)) m =-  case (R.typeRep @a, R.typeRep @x, R.typeRep @y) of-    (UnsignedBVType (_ :: Proxy na), UnsignedBVType (_ :: Proxy nx), UnsignedBVType (_ :: Proxy ny)) ->-      case (unsafeAxiom @(nx + ny) @na) of-        Refl -> lowerBinaryTerm config t bv1 bv2 (SBV.#) m-    (SignedBVType (_ :: Proxy na), SignedBVType (_ :: Proxy nx), SignedBVType (_ :: Proxy ny)) ->-      case (unsafeAxiom @(nx + ny) @na) of-        Refl ->-          lowerBinaryTerm-            config-            t-            bv1-            bv2-            ( \(x :: SBV.SInt xn) (y :: SBV.SInt yn) ->-                SBV.sFromIntegral $-                  (SBV.sFromIntegral x :: SBV.SWord xn) SBV.# (SBV.sFromIntegral y :: SBV.SWord yn)-            )-            m-    _ -> translateBinaryError "bvconcat" (R.typeRep @x) (R.typeRep @y) (R.typeRep @a)-lowerSinglePrimImpl config t@(BVSelectTerm _ (ix :: R.TypeRep ix) w (bv :: Term x)) m =-  case (R.typeRep @a, R.typeRep @x) of-    (UnsignedBVType (_ :: Proxy na), UnsignedBVType (_ :: Proxy xn)) ->-      withKnownNat n1 $-        case ( unsafeAxiom @(na + ix - 1 - ix + 1) @na,-               unsafeLeqProof @(na + ix - 1 + 1) @xn,-               unsafeLeqProof @ix @(na + ix - 1)-             ) of-          (Refl, LeqProof, LeqProof) ->-            lowerUnaryTerm config t bv (SBV.bvExtract (Proxy @(na + ix - 1)) (Proxy @ix)) m-      where-        n1 :: NatRepr (na + ix - 1)-        n1 = NatRepr (natVal (Proxy @na) + natVal (Proxy @ix) - 1)-    (SignedBVType (_ :: Proxy na), SignedBVType (_ :: Proxy xn)) ->-      withKnownNat n1 $-        case ( unsafeAxiom @(na + ix - 1 - ix + 1) @na,-               unsafeLeqProof @(na + ix - 1 + 1) @xn,-               unsafeLeqProof @ix @(na + ix - 1)-             ) of-          (Refl, LeqProof, LeqProof) ->-            lowerUnaryTerm config t bv (SBV.bvExtract (Proxy @(na + ix - 1)) (Proxy @ix)) m-      where-        n1 :: NatRepr (na + ix - 1)-        n1 = NatRepr (natVal (Proxy @na) + natVal (Proxy @ix) - 1)-    _ -> translateTernaryError "bvselect" ix w (R.typeRep @x) (R.typeRep @a)-lowerSinglePrimImpl config t@(BVExtendTerm _ signed (n :: R.TypeRep n) (bv :: Term x)) m =-  case (R.typeRep @a, R.typeRep @x) of-    (UnsignedBVType (_ :: Proxy na), UnsignedBVType (_ :: Proxy nx)) ->-      withKnownNat (NatRepr (natVal (Proxy @na) - natVal (Proxy @nx)) :: NatRepr (na - nx)) $-        case (unsafeLeqProof @(nx + 1) @na, unsafeLeqProof @1 @(na - nx)) of-          (LeqProof, LeqProof) ->-            bvIsNonZeroFromGEq1 @(na - nx) $-              lowerUnaryTerm config t bv (if signed then SBV.signExtend else SBV.zeroExtend) m-    (SignedBVType (_ :: Proxy na), SignedBVType (_ :: Proxy nx)) ->-      withKnownNat (NatRepr (natVal (Proxy @na) - natVal (Proxy @nx)) :: NatRepr (na - nx)) $-        case (unsafeLeqProof @(nx + 1) @na, unsafeLeqProof @1 @(na - nx)) of-          (LeqProof, LeqProof) ->-            bvIsNonZeroFromGEq1 @(na - nx) $-              lowerUnaryTerm-                config-                t-                bv-                ( if signed-                    then SBV.signExtend-                    else \x ->-                      SBV.sFromIntegral-                        (SBV.zeroExtend (SBV.sFromIntegral x :: SBV.SBV (SBV.WordN nx)) :: SBV.SBV (SBV.WordN na))-                )-                m-    _ -> translateTernaryError "bvextend" (R.typeRep @Bool) n (R.typeRep @x) (R.typeRep @a)-lowerSinglePrimImpl config t@(TabularFunApplyTerm _ (f :: Term (b =-> a)) (arg :: Term b)) m =-  case (config, R.typeRep @a) of-    ResolvedDeepType -> do-      (m1, l1) <- lowerSinglePrimCached config f m-      (m2, l2) <- lowerSinglePrimCached config arg m1-      let g = l1 l2-      return (addBiMapIntermediate (SomeTerm t) (toDyn g) m2, g)-    _ -> translateBinaryError "tabularApply" (R.typeRep @(b =-> a)) (R.typeRep @b) (R.typeRep @a)-lowerSinglePrimImpl config t@(GeneralFunApplyTerm _ (f :: Term (b --> a)) (arg :: Term b)) m =-  case (config, R.typeRep @a) of-    ResolvedDeepType -> do-      (m1, l1) <- lowerSinglePrimCached config f m-      (m2, l2) <- lowerSinglePrimCached config arg m1-      let g = l1 l2-      return (addBiMapIntermediate (SomeTerm t) (toDyn g) m2, g)-    _ -> translateBinaryError "generalApply" (R.typeRep @(b --> a)) (R.typeRep @b) (R.typeRep @a)-lowerSinglePrimImpl config t@(DivIntegerTerm _ arg1 arg2) m =-  case (config, R.typeRep @a) of-    (ResolvedConfig {}, IntegerType) -> lowerBinaryTerm config t arg1 arg2 SBV.sDiv m-    _ -> translateBinaryError "div" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl config t@(ModIntegerTerm _ arg1 arg2) m =-  case (config, R.typeRep @a) of-    (ResolvedConfig {}, IntegerType) -> lowerBinaryTerm config t arg1 arg2 SBV.sMod m-    _ -> translateBinaryError "mod" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)-lowerSinglePrimImpl _ _ _ = error "Should never happen"--unsafeMkNatRepr :: Int -> NatRepr w-unsafeMkNatRepr x = NatRepr (fromInteger $ toInteger x)--unsafeWithNonZeroKnownNat :: forall w r. Int -> ((KnownNat w, 1 <= w) => r) -> r-unsafeWithNonZeroKnownNat i r-  | i <= 0 = error "Not an nonzero natural number"-  | otherwise = withKnownNat @w (unsafeMkNatRepr i) $ unsafeBVIsNonZero r-  where-    unsafeBVIsNonZero :: ((1 <= w) => r) -> r-    unsafeBVIsNonZero r1 = case unsafeAxiom :: w :~: 1 of-      Refl -> r1--bvIsNonZeroFromGEq1 :: forall w r. (1 <= w) => ((SBV.BVIsNonZero w) => r) -> r-bvIsNonZeroFromGEq1 r1 = case unsafeAxiom :: w :~: 1 of-  Refl -> r1--parseModel :: forall integerBitWidth. GrisetteSMTConfig integerBitWidth -> SBVI.SMTModel -> SymBiMap -> PM.Model-parseModel _ (SBVI.SMTModel _ _ assoc uifuncs) mp = foldr gouifuncs (foldr goassoc emptyModel assoc) uifuncs-  where-    goassoc :: (String, SBVI.CV) -> PM.Model -> PM.Model-    goassoc (name, cv) m = case findStringToSymbol name mp of-      Just (SomeTypedSymbol tr s) ->-        insertValue s (resolveSingle tr cv) m-      Nothing -> error "Bad"-    resolveSingle :: R.TypeRep a -> SBVI.CV -> a-    resolveSingle t (SBVI.CV SBVI.KBool (SBVI.CInteger n)) =-      case R.eqTypeRep t (R.typeRep @Bool) of-        Just R.HRefl -> n /= 0-        Nothing -> error "Bad type"-    resolveSingle t (SBVI.CV SBVI.KUnbounded (SBVI.CInteger i)) =-      case R.eqTypeRep t (R.typeRep @Integer) of-        Just R.HRefl -> i-        Nothing -> error "Bad type"-    resolveSingle t (SBVI.CV (SBVI.KBounded _ bitWidth) (SBVI.CInteger i)) =-      case R.eqTypeRep t (R.typeRep @Integer) of-        Just R.HRefl -> i-        _ -> case t of-          R.App a (n :: R.TypeRep w) ->-            case R.eqTypeRep (R.typeRepKind n) (R.typeRep @Nat) of-              Just R.HRefl ->-                unsafeWithNonZeroKnownNat @w bitWidth $-                  case (R.eqTypeRep a (R.typeRep @IntN), R.eqTypeRep a (R.typeRep @WordN)) of-                    (Just R.HRefl, _) ->-                      fromInteger i-                    (_, Just R.HRefl) -> fromInteger i-                    _ -> error "Bad type"-              _ -> error "Bad type"-          _ -> error "Bad type"-    resolveSingle _ _ = error "Unknown cv"--    buildConstFun :: (SupportedPrim a, SupportedPrim r) => R.TypeRep a -> R.TypeRep r -> SBVI.CV -> a =-> r-    buildConstFun _ tr v = case tr of-      TFunType (ta2' :: R.TypeRep a2) (tr2' :: R.TypeRep r2) -> TabularFun [] $ buildConstFun ta2' tr2' v-      _ -> TabularFun [] $ resolveSingle tr v--    goutfuncResolve ::-      forall a r.-      (SupportedPrim a, SupportedPrim r) =>-      R.TypeRep a ->-      R.TypeRep r ->-      ([([SBVI.CV], SBVI.CV)], SBVI.CV) ->-      (a =-> r)-    goutfuncResolve ta1 ta2 (l, s) =-      case ta2 of-        TFunType (ta2' :: R.TypeRep a2) (tr2' :: R.TypeRep r2) ->-          TabularFun-            (second (\r -> goutfuncResolve ta2' tr2' (r, s)) <$> partition ta1 l)-            (buildConstFun ta2' tr2' s)-        _ ->-          TabularFun-            (bimap (resolveSingle ta1 . head) (resolveSingle ta2) <$> l)-            (resolveSingle ta2 s)--    gougfuncResolve ::-      forall a r.-      (SupportedPrim a, SupportedPrim r) =>-      Int ->-      R.TypeRep a ->-      R.TypeRep r ->-      ([([SBVI.CV], SBVI.CV)], SBVI.CV) ->-      (a --> r)-    gougfuncResolve idx ta1 ta2 (l, s) =-      case ta2 of-        GFunType (ta2' :: R.TypeRep a2) (tr2' :: R.TypeRep r2) ->-          let sym = WithInfo (IndexedSymbol "arg" idx) FunArg-              funs = second (\r -> gougfuncResolve (idx + 1) ta2' tr2' (r, s)) <$> partition ta1 l-              def = gougfuncResolve (idx + 1) ta2' tr2' ([], s)-              body =-                foldl'-                  ( \acc (v, f) ->-                      pevalITETerm-                        (pevalEqvTerm (iinfosymTerm "arg" idx FunArg) (conTerm v))-                        (conTerm f)-                        acc-                  )-                  (conTerm def)-                  funs-           in GeneralFun sym body-        _ ->-          let sym = WithInfo (IndexedSymbol "arg" idx) FunArg-              vs = bimap (resolveSingle ta1 . head) (resolveSingle ta2) <$> l-              def = resolveSingle ta2 s-              body =-                foldl'-                  ( \acc (v, a) ->-                      pevalITETerm-                        (pevalEqvTerm (iinfosymTerm "arg" idx FunArg) (conTerm v))-                        (conTerm a)-                        acc-                  )-                  (conTerm def)-                  vs-           in GeneralFun sym body-    partition :: R.TypeRep a -> [([SBVI.CV], SBVI.CV)] -> [(a, [([SBVI.CV], SBVI.CV)])]-    partition t = case (R.eqTypeRep t (R.typeRep @Bool), R.eqTypeRep t (R.typeRep @Integer)) of-      (Just R.HRefl, _) -> partitionWithOrd . resolveFirst t-      (_, Just R.HRefl) -> partitionWithOrd . resolveFirst t-      _ -> case t of-        R.App bv _ -> case (R.eqTypeRep bv (R.typeRep @IntN), R.eqTypeRep bv (R.typeRep @WordN)) of-          (Just R.HRefl, _) -> fmap (first IntN) . partitionWithOrd . fmap (first unIntN) . resolveFirst t-          (_, Just R.HRefl) -> partitionWithOrd . resolveFirst t-          _ -> error "Unknown type"-        _ -> error "Unknown type"--    resolveFirst :: R.TypeRep a -> [([SBVI.CV], SBVI.CV)] -> [(a, [([SBVI.CV], SBVI.CV)])]-    resolveFirst tf = fmap (\case (x : xs, v) -> (resolveSingle tf x, [(xs, v)]); _ -> error "impossible")--    partitionWithOrd :: forall a. Ord a => [(a, [([SBVI.CV], SBVI.CV)])] -> [(a, [([SBVI.CV], SBVI.CV)])]-    partitionWithOrd v = go sorted-      where-        sorted = sortWith fst v-        go (x : x1 : xs) =-          if fst x == fst x1-            then go $ (fst x, snd x ++ snd x1) : xs-            else x : go (x1 : xs)-        go x = x--    gouifuncs :: (String, (SBVI.SBVType, ([([SBVI.CV], SBVI.CV)], SBVI.CV))) -> PM.Model -> PM.Model-    gouifuncs (name, (SBVI.SBVType _, l)) m = case findStringToSymbol name mp of-      Just (SomeTypedSymbol tr s) -> withSymbolSupported s $ case tr of-        t@(TFunType a r) -> R.withTypeable t $ insertValue s (goutfuncResolve a r l) m-        t@(GFunType a r) -> R.withTypeable t $ insertValue s (gougfuncResolve 0 a r l) m-        _ -> error "Bad"-      Nothing -> error "Bad"---- helpers--data BVTypeContainer bv k where-  BVTypeContainer :: (SBV.BVIsNonZero n, KnownNat n, 1 <= n, k ~ bv n) => Proxy n -> BVTypeContainer bv k--signedBVTypeView :: forall t. (SupportedPrim t) => R.TypeRep t -> Maybe (BVTypeContainer IntN t)-signedBVTypeView t = case t of-  R.App s (n :: R.TypeRep w) ->-    case (R.eqTypeRep s (R.typeRep @IntN), R.eqTypeRep (R.typeRepKind n) (R.typeRep @Nat)) of-      (Just R.HRefl, Just R.HRefl) ->-        Just $ unsafeBVIsNonZero @w $ withPrim (Proxy @t) (BVTypeContainer Proxy)-      _ -> Nothing-  _ -> Nothing-  where-    unsafeBVIsNonZero :: forall w r. ((SBV.BVIsNonZero w) => r) -> r-    unsafeBVIsNonZero r1 = case unsafeAxiom :: w :~: 1 of-      Refl -> r1--pattern SignedBVType ::-  forall t.-  (SupportedPrim t) =>-  forall (n :: Nat).-  (t ~~ IntN n, KnownNat n, 1 <= n, SBV.BVIsNonZero n) =>-  Proxy n ->-  R.TypeRep t-pattern SignedBVType p <- (signedBVTypeView @t -> Just (BVTypeContainer p))--unsignedBVTypeView :: forall t. (SupportedPrim t) => R.TypeRep t -> Maybe (BVTypeContainer WordN t)-unsignedBVTypeView t = case t of-  R.App s (n :: R.TypeRep w) ->-    case (R.eqTypeRep s (R.typeRep @WordN), R.eqTypeRep (R.typeRepKind n) (R.typeRep @Nat)) of-      (Just R.HRefl, Just R.HRefl) ->-        Just $ unsafeBVIsNonZero @w $ withPrim (Proxy @t) (BVTypeContainer Proxy)-      _ -> Nothing-  _ -> Nothing-  where-    unsafeBVIsNonZero :: forall w r. ((SBV.BVIsNonZero w) => r) -> r-    unsafeBVIsNonZero r1 = case unsafeAxiom :: w :~: 1 of-      Refl -> r1--pattern UnsignedBVType ::-  forall t.-  (SupportedPrim t) =>-  forall (n :: Nat).-  (t ~~ WordN n, KnownNat n, 1 <= n, SBV.BVIsNonZero n) =>-  Proxy n ->-  R.TypeRep t-pattern UnsignedBVType p <- (unsignedBVTypeView @t -> Just (BVTypeContainer p))--data TFunTypeContainer :: forall k. k -> Type where-  TFunTypeContainer :: (SupportedPrim a, SupportedPrim b) => R.TypeRep a -> R.TypeRep b -> TFunTypeContainer (a =-> b)--tFunTypeView :: forall t. (SupportedPrim t) => R.TypeRep t -> Maybe (TFunTypeContainer t)-tFunTypeView t = case t of-  R.App (R.App arr (ta2' :: R.TypeRep a2)) (tr2' :: R.TypeRep r2) ->-    case R.eqTypeRep arr (R.typeRep @(=->)) of-      Just R.HRefl -> Just $ withPrim (Proxy @t) $ TFunTypeContainer ta2' tr2'-      Nothing -> Nothing-  _ -> Nothing--pattern TFunType ::-  forall t.-  (SupportedPrim t) =>-  forall (a :: Type) (b :: Type).-  (t ~~ (a =-> b), SupportedPrim a, SupportedPrim b) =>-  R.TypeRep a ->-  R.TypeRep b ->-  R.TypeRep t-pattern TFunType a b <--  (tFunTypeView -> Just (TFunTypeContainer a b))-  where-    TFunType a b = R.App (R.App (R.typeRep @(=->)) a) b--pattern TFun3Type ::-  forall t.-  (SupportedPrim t) =>-  forall (a :: Type) (b :: Type) (c :: Type).-  (t ~~ (a =-> b =-> c), SupportedPrim a, SupportedPrim b, SupportedPrim c) =>-  R.TypeRep a ->-  R.TypeRep b ->-  R.TypeRep c ->-  R.TypeRep t-pattern TFun3Type a b c = TFunType a (TFunType b c)--data GFunTypeContainer :: forall k. k -> Type where-  GFunTypeContainer :: (SupportedPrim a, SupportedPrim b) => R.TypeRep a -> R.TypeRep b -> GFunTypeContainer (a --> b)--gFunTypeView :: forall t. (SupportedPrim t) => R.TypeRep t -> Maybe (GFunTypeContainer t)-gFunTypeView t = case t of-  R.App (R.App arr (ta2' :: R.TypeRep a2)) (tr2' :: R.TypeRep r2) ->-    case R.eqTypeRep arr (R.typeRep @(-->)) of-      Just R.HRefl -> Just $ withPrim (Proxy @t) $ GFunTypeContainer ta2' tr2'-      Nothing -> Nothing-  _ -> Nothing--pattern GFunType ::-  forall t.-  (SupportedPrim t) =>-  forall (a :: Type) (b :: Type).-  (t ~~ (a --> b), SupportedPrim a, SupportedPrim b) =>-  R.TypeRep a ->-  R.TypeRep b ->-  R.TypeRep t-pattern GFunType a b <--  (gFunTypeView -> Just (GFunTypeContainer a b))-  where-    GFunType a b = R.App (R.App (R.typeRep @(-->)) a) b--pattern GFun3Type ::-  forall t.-  (SupportedPrim t) =>-  forall (a :: Type) (b :: Type) (c :: Type).-  (t ~~ (a --> b --> c), SupportedPrim a, SupportedPrim b, SupportedPrim c) =>-  R.TypeRep a ->-  R.TypeRep b ->-  R.TypeRep c ->-  R.TypeRep t-pattern GFun3Type a b c = GFunType a (GFunType b c)--pattern BoolType ::-  forall t.-  () =>-  (t ~~ Bool) =>-  R.TypeRep t-pattern BoolType <- (R.eqTypeRep (R.typeRep @Bool) -> Just R.HRefl)--pattern IntegerType ::-  forall t.-  () =>-  (t ~~ Integer) =>-  R.TypeRep t-pattern IntegerType <- (R.eqTypeRep (R.typeRep @Integer) -> Just R.HRefl)--type ConfigConstraint integerBitWidth s =-  ( SBV.SBV s ~ TermTy integerBitWidth Integer,-    SBV.SymVal s,-    SBV.HasKind s,-    Typeable s,-    Num (SBV.SBV s),-    Num s,-    SBV.OrdSymbolic (SBV.SBV s),-    Ord s,-    SBV.SDivisible (SBV.SBV s),-    SBV.OrdSymbolic (SBV.SBV s),-    SBV.Mergeable (SBV.SBV s)-  )--data DictConfig integerBitWidth where-  DictConfig ::-    forall s integerBitWidth.-    (ConfigConstraint integerBitWidth s) =>-    SBV.SMTConfig ->-    DictConfig integerBitWidth--resolveConfigView ::-  forall integerBitWidth.-  GrisetteSMTConfig integerBitWidth ->-  DictConfig integerBitWidth-resolveConfigView config = case config of-  UnboundedReasoning c -> DictConfig c-  BoundedReasoning c -> DictConfig c--pattern ResolvedConfig ::-  forall integerBitWidth.-  () =>-  forall s.-  ConfigConstraint integerBitWidth s =>-  SBV.SMTConfig ->-  GrisetteSMTConfig integerBitWidth-pattern ResolvedConfig c <- (resolveConfigView -> DictConfig c)--type SimpleTypeConstraint integerBitWidth s s' =-  ( SBV.SBV s' ~ TermTy integerBitWidth s,-    SBV.SymVal s',-    SBV.HasKind s',-    Typeable s',-    SBV.OrdSymbolic (SBV.SBV s'),-    SBV.Mergeable (SBV.SBV s')-  )--type TypeResolver dictType =-  forall integerBitWidth s.-  (SupportedPrim s) =>-  (GrisetteSMTConfig integerBitWidth, R.TypeRep s) ->-  Maybe (dictType integerBitWidth s)---- has to declare this because GHC does not support impredicative polymorphism-data DictSimpleType integerBitWidth s where-  DictSimpleType ::-    forall integerBitWidth s s'.-    (SimpleTypeConstraint integerBitWidth s s') =>-    DictSimpleType integerBitWidth s--resolveSimpleTypeView :: TypeResolver DictSimpleType-resolveSimpleTypeView (ResolvedConfig {}, s) = case s of-  BoolType -> Just DictSimpleType-  IntegerType -> Just DictSimpleType-  SignedBVType _ -> Just DictSimpleType-  UnsignedBVType _ -> Just DictSimpleType-  _ -> Nothing-resolveSimpleTypeView _ = error "Should never happen, make compiler happy"--pattern ResolvedSimpleType ::-  forall integerBitWidth s.-  (SupportedPrim s) =>-  forall s'.-  SimpleTypeConstraint integerBitWidth s s' =>-  (GrisetteSMTConfig integerBitWidth, R.TypeRep s)-pattern ResolvedSimpleType <- (resolveSimpleTypeView -> Just DictSimpleType)--type DeepTypeConstraint integerBitWidth s s' =-  ( s' ~ TermTy integerBitWidth s,-    Typeable s',-    SBV.Mergeable s'-  )--data DictDeepType integerBitWidth s where-  DictDeepType ::-    forall integerBitWidth s s'.-    (DeepTypeConstraint integerBitWidth s s') =>-    DictDeepType integerBitWidth s--resolveDeepTypeView :: TypeResolver DictDeepType-resolveDeepTypeView r = case r of-  ResolvedSimpleType -> Just DictDeepType-  (config, TFunType (ta :: R.TypeRep a) (tb :: R.TypeRep b)) ->-    case (resolveDeepTypeView (config, ta), resolveDeepTypeView (config, tb)) of-      (Just DictDeepType, Just DictDeepType) -> Just DictDeepType-      _ -> Nothing-  (config, GFunType (ta :: R.TypeRep a) (tb :: R.TypeRep b)) ->-    case (resolveDeepTypeView (config, ta), resolveDeepTypeView (config, tb)) of-      (Just DictDeepType, Just DictDeepType) -> Just DictDeepType-      _ -> Nothing-  _ -> Nothing--pattern ResolvedDeepType ::-  forall integerBitWidth s.-  (SupportedPrim s) =>-  forall s'.-  DeepTypeConstraint integerBitWidth s s' =>-  (GrisetteSMTConfig integerBitWidth, R.TypeRep s)-pattern ResolvedDeepType <- (resolveDeepTypeView -> Just DictDeepType)--type NumTypeConstraint integerBitWidth s s' =-  ( SimpleTypeConstraint integerBitWidth s s',-    Num (SBV.SBV s'),-    Num s',-    Num s-  )--data DictNumType integerBitWidth s where-  DictNumType ::-    forall integerBitWidth s s'.-    (NumTypeConstraint integerBitWidth s s') =>-    DictNumType integerBitWidth s--resolveNumTypeView :: TypeResolver DictNumType-resolveNumTypeView (ResolvedConfig {}, s) = case s of-  IntegerType -> Just DictNumType-  SignedBVType _ -> Just DictNumType-  UnsignedBVType _ -> Just DictNumType-  _ -> Nothing-resolveNumTypeView _ = error "Should never happen, make compiler happy"--pattern ResolvedNumType ::-  forall integerBitWidth s.-  (SupportedPrim s) =>-  forall s'.-  NumTypeConstraint integerBitWidth s s' =>-  (GrisetteSMTConfig integerBitWidth, R.TypeRep s)-pattern ResolvedNumType <- (resolveNumTypeView -> Just DictNumType)+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE RoleAnnotations #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE ViewPatterns #-}++-- |+-- Module      :   Grisette.Backend.SBV.Data.SMT.Lowering+-- Copyright   :   (c) Sirui Lu 2021-2023+-- License     :   BSD-3-Clause (see the LICENSE file)+--+-- Maintainer  :   siruilu@cs.washington.edu+-- Stability   :   Experimental+-- Portability :   GHC only+module Grisette.Backend.SBV.Data.SMT.Lowering+  ( lowerSinglePrim,+    lowerSinglePrimCached,+    parseModel,+    SymBiMap,+  )+where++import Control.Monad.State.Strict+import Data.Bifunctor+import Data.Bits+import Data.Dynamic+import Data.Foldable+import Data.Kind+import Data.Maybe+import qualified Data.SBV as SBV+import qualified Data.SBV.Control as SBVC+import qualified Data.SBV.Internals as SBVI+import Data.Type.Equality (type (~~))+import Data.Typeable+import GHC.Exts (sortWith)+import GHC.Natural+import GHC.Stack+import GHC.TypeNats+import {-# SOURCE #-} Grisette.Backend.SBV.Data.SMT.Solving+import Grisette.Backend.SBV.Data.SMT.SymBiMap+import Grisette.Core.Data.BV+import Grisette.Core.Data.Class.ModelOps+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.SomeTerm+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermUtils+import Grisette.IR.SymPrim.Data.Prim.Model as PM+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool+import Grisette.IR.SymPrim.Data.TabularFun+import Grisette.Utils.Parameterized+import qualified Type.Reflection as R+import Unsafe.Coerce++cachedResult ::+  forall integerBitWidth a.+  (SupportedPrim a, Typeable (TermTy integerBitWidth a)) =>+  Term a ->+  State SymBiMap (Maybe (TermTy integerBitWidth a))+cachedResult t = gets $ \m -> do+  d <- lookupTerm (SomeTerm t) m+  Just $ fromDyn d undefined++addResult ::+  forall integerBitWidth a.+  (SupportedPrim a, Typeable (TermTy integerBitWidth a)) =>+  Term a ->+  TermTy integerBitWidth a ->+  State SymBiMap ()+addResult tm sbvtm = modify $ addBiMapIntermediate (SomeTerm tm) (toDyn sbvtm)++translateTypeError :: HasCallStack => R.TypeRep a -> b+translateTypeError ta =+  error $+    "Don't know how to translate the type " ++ show ta ++ " to SMT"++translateUnaryError :: HasCallStack => String -> R.TypeRep a -> R.TypeRep b -> c+translateUnaryError op ta tb =+  error $+    "Don't know how to translate the op "+      ++ show op+      ++ " :: "+      ++ show ta+      ++ " -> "+      ++ show tb+      ++ " to SMT"++translateBinaryError :: HasCallStack => String -> R.TypeRep a -> R.TypeRep b -> R.TypeRep c -> d+translateBinaryError op ta tb tc =+  error $+    "Don't know how to translate the op "+      ++ show op+      ++ " :: "+      ++ show ta+      ++ " -> "+      ++ show tb+      ++ " -> "+      ++ show tc+      ++ " to SMT"++translateTernaryError :: HasCallStack => String -> R.TypeRep a -> R.TypeRep b -> R.TypeRep c -> R.TypeRep d -> e+translateTernaryError op ta tb tc td =+  error $+    "Don't know how to translate the op "+      ++ show op+      ++ " :: "+      ++ show ta+      ++ " -> "+      ++ show tb+      ++ " -> "+      ++ show tc+      ++ " -> "+      ++ show td+      ++ " to SMT"++lowerValue ::+  forall integerBitWidth a.+  (SupportedPrim a, Typeable a) =>+  GrisetteSMTConfig integerBitWidth ->+  a ->+  TermTy integerBitWidth a+lowerValue config@ResolvedConfig {} v =+  case R.typeRep @a of+    BoolType -> if v then SBV.sTrue else SBV.sFalse+    IntegerType -> fromInteger v+    SignedBVType _ -> case v of+      IntN x -> fromInteger x+    UnsignedBVType _ -> case v of+      WordN x -> fromInteger x+    TFunType (l :: a1) (r :: a2) ->+      case ((config, l), (config, r)) of+        (ResolvedSimpleType, ResolvedMergeableType) ->+          lowerTFunCon config v+        _ -> translateTypeError (R.typeRep @a)+    _ -> translateTypeError (R.typeRep @a)+lowerValue config v = translateTypeError (R.typeRep @a)++lowerTFunCon ::+  forall integerBitWidth a b.+  (SupportedPrim a, SupportedPrim b, SBV.EqSymbolic (TermTy integerBitWidth a), SBV.Mergeable (TermTy integerBitWidth b)) =>+  GrisetteSMTConfig integerBitWidth ->+  (a =-> b) ->+  (TermTy integerBitWidth a -> TermTy integerBitWidth b)+lowerTFunCon config@ResolvedConfig {} (TabularFun l d) = go l d+  where+    go [] d v = lowerValue config d+    go ((x, r) : xs) d v = SBV.ite (lowerValue config x SBV..== v) (lowerValue config r) (go xs d v)+lowerTFunCon _ (TabularFun l d) = translateTypeError (R.typeRep @a)++buildUTFun11 ::+  forall integerBitWidth s1 s2 a.+  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 =-> s2))+buildUTFun11 config ta tb term@(SymTerm _ ts) m = case ((config, ta), (config, tb)) of+  (ResolvedSimpleType, ResolvedSimpleType) ->+    let name = "ufunc_" ++ show (sizeBiMap m)+        f = SBV.uninterpret @(TermTy integerBitWidth s1 -> TermTy integerBitWidth s2) name+     in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+  _ -> Nothing+buildUTFun11 _ _ _ _ _ = error "Should only be called on SymTerm"++buildUTFun111 ::+  forall integerBitWidth s1 s2 s3 a.+  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2, SupportedPrim s3) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 =-> s2 =-> s3))+buildUTFun111 config ta tb tc term@(SymTerm _ ts) m =+  case ((config, ta), (config, tb), (config, tc)) of+    (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+      let name = "ufunc_" ++ show (sizeBiMap m)+          f =+            SBV.uninterpret @(TermTy integerBitWidth s1 -> TermTy integerBitWidth s2 -> TermTy integerBitWidth s3)+              name+       in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+    _ -> Nothing+buildUTFun111 _ _ _ _ _ _ = error "Should only be called on SymTerm"++buildUTFun1111 ::+  forall integerBitWidth s1 s2 s3 s4 a.+  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2, SupportedPrim s3, SupportedPrim s4) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  R.TypeRep s4 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 =-> s2 =-> s3 =-> s4))+buildUTFun1111 config ta tb tc td term@(SymTerm _ ts) m =+  case ((config, ta), (config, tb), (config, tc), (config, td)) of+    (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+      let name = "ufunc_" ++ show (sizeBiMap m)+          f =+            SBV.uninterpret @(TermTy integerBitWidth s1 -> TermTy integerBitWidth s2 -> TermTy integerBitWidth s3 -> TermTy integerBitWidth s4)+              name+       in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+    _ -> Nothing+buildUTFun1111 _ _ _ _ _ _ _ = error "Should only be called on SymTerm"++buildUTFun11111 ::+  forall integerBitWidth s1 s2 s3 s4 s5 a.+  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2, SupportedPrim s3, SupportedPrim s4, SupportedPrim s5) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  R.TypeRep s4 ->+  R.TypeRep s5 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 =-> s2 =-> s3 =-> s4 =-> s5))+buildUTFun11111 config ta tb tc td te term@(SymTerm _ ts) m =+  case ((config, ta), (config, tb), (config, tc), (config, td), (config, te)) of+    (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+      let name = "ufunc_" ++ show (sizeBiMap m)+          f =+            SBV.uninterpret @(TermTy integerBitWidth (s1 =-> s2 =-> s3 =-> s4 =-> s5))+              name+       in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+    _ -> Nothing+buildUTFun11111 _ _ _ _ _ _ _ _ = error "Should only be called on SymTerm"++buildUTFun111111 ::+  forall integerBitWidth s1 s2 s3 s4 s5 s6 a.+  ( SupportedPrim a,+    SupportedPrim s1,+    SupportedPrim s2,+    SupportedPrim s3,+    SupportedPrim s4,+    SupportedPrim s5,+    SupportedPrim s6+  ) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  R.TypeRep s4 ->+  R.TypeRep s5 ->+  R.TypeRep s6 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 =-> s2 =-> s3 =-> s4 =-> s5 =-> s6))+buildUTFun111111 config ta tb tc td te tf term@(SymTerm _ ts) m =+  case ((config, ta), (config, tb), (config, tc), (config, td), (config, te), (config, tf)) of+    (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+      let name = "ufunc_" ++ show (sizeBiMap m)+          f =+            SBV.uninterpret @(TermTy integerBitWidth (s1 =-> s2 =-> s3 =-> s4 =-> s5 =-> s6))+              name+       in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+    _ -> Nothing+buildUTFun111111 _ _ _ _ _ _ _ _ _ = error "Should only be called on SymTerm"++buildUTFun1111111 ::+  forall integerBitWidth s1 s2 s3 s4 s5 s6 s7 a.+  ( SupportedPrim a,+    SupportedPrim s1,+    SupportedPrim s2,+    SupportedPrim s3,+    SupportedPrim s4,+    SupportedPrim s5,+    SupportedPrim s6,+    SupportedPrim s7+  ) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  R.TypeRep s4 ->+  R.TypeRep s5 ->+  R.TypeRep s6 ->+  R.TypeRep s7 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 =-> s2 =-> s3 =-> s4 =-> s5 =-> s6 =-> s7))+buildUTFun1111111 config ta tb tc td te tf tg term@(SymTerm _ ts) m =+  case ((config, ta), (config, tb), (config, tc), (config, td), (config, te), (config, tf), (config, tg)) of+    (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+      let name = "ufunc_" ++ show (sizeBiMap m)+          f =+            SBV.uninterpret @(TermTy integerBitWidth (s1 =-> s2 =-> s3 =-> s4 =-> s5 =-> s6 =-> s7))+              name+       in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+    _ -> Nothing+buildUTFun1111111 _ _ _ _ _ _ _ _ _ _ = error "Should only be called on SymTerm"++buildUTFun11111111 ::+  forall integerBitWidth s1 s2 s3 s4 s5 s6 s7 s8 a.+  ( SupportedPrim a,+    SupportedPrim s1,+    SupportedPrim s2,+    SupportedPrim s3,+    SupportedPrim s4,+    SupportedPrim s5,+    SupportedPrim s6,+    SupportedPrim s7,+    SupportedPrim s8+  ) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  R.TypeRep s4 ->+  R.TypeRep s5 ->+  R.TypeRep s6 ->+  R.TypeRep s7 ->+  R.TypeRep s8 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 =-> s2 =-> s3 =-> s4 =-> s5 =-> s6 =-> s7 =-> s8))+buildUTFun11111111 config ta tb tc td te tf tg th term@(SymTerm _ ts) m =+  case ((config, ta), (config, tb), (config, tc), (config, td), (config, te), (config, tf), (config, tg), (config, th)) of+    (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+      let name = "ufunc_" ++ show (sizeBiMap m)+          f =+            SBV.uninterpret @(TermTy integerBitWidth (s1 =-> s2 =-> s3 =-> s4 =-> s5 =-> s6 =-> s7 =-> s8))+              name+       in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+    _ -> Nothing+buildUTFun11111111 _ _ _ _ _ _ _ _ _ _ _ = error "Should only be called on SymTerm"++buildUGFun11 ::+  forall integerBitWidth s1 s2 a.+  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 --> s2))+buildUGFun11 config ta tb term@(SymTerm _ ts) m = case ((config, ta), (config, tb)) of+  (ResolvedSimpleType, ResolvedSimpleType) ->+    let name = "ufunc_" ++ show (sizeBiMap m)+        f = SBV.uninterpret @(TermTy integerBitWidth s1 -> TermTy integerBitWidth s2) name+     in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+  _ -> Nothing+buildUGFun11 _ _ _ _ _ = error "Should only be called on SymTerm"++buildUGFun111 ::+  forall integerBitWidth s1 s2 s3 a.+  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2, SupportedPrim s3) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 --> s2 --> s3))+buildUGFun111 config ta tb tc term@(SymTerm _ ts) m = case ((config, ta), (config, tb), (config, tc)) of+  (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+    let name = "ufunc_" ++ show (sizeBiMap m)+        f =+          SBV.uninterpret @(TermTy integerBitWidth s1 -> TermTy integerBitWidth s2 -> TermTy integerBitWidth s3)+            name+     in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+  _ -> Nothing+buildUGFun111 _ _ _ _ _ _ = error "Should only be called on SymTerm"++buildUGFun1111 ::+  forall integerBitWidth s1 s2 s3 s4 a.+  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2, SupportedPrim s3, SupportedPrim s4) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  R.TypeRep s4 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 --> s2 --> s3 --> s4))+buildUGFun1111 config ta tb tc td term@(SymTerm _ ts) m =+  case ((config, ta), (config, tb), (config, tc), (config, td)) of+    (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+      let name = "ufunc_" ++ show (sizeBiMap m)+          f =+            SBV.uninterpret @(TermTy integerBitWidth s1 -> TermTy integerBitWidth s2 -> TermTy integerBitWidth s3 -> TermTy integerBitWidth s4)+              name+       in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+    _ -> Nothing+buildUGFun1111 _ _ _ _ _ _ _ = error "Should only be called on SymTerm"++buildUGFun11111 ::+  forall integerBitWidth s1 s2 s3 s4 s5 a.+  (SupportedPrim a, SupportedPrim s1, SupportedPrim s2, SupportedPrim s3, SupportedPrim s4, SupportedPrim s5) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  R.TypeRep s4 ->+  R.TypeRep s5 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 --> s2 --> s3 --> s4 --> s5))+buildUGFun11111 config ta tb tc td te term@(SymTerm _ ts) m =+  case ((config, ta), (config, tb), (config, tc), (config, td), (config, te)) of+    (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+      let name = "ufunc_" ++ show (sizeBiMap m)+          f =+            SBV.uninterpret @(TermTy integerBitWidth (s1 --> s2 --> s3 --> s4 --> s5))+              name+       in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+    _ -> Nothing+buildUGFun11111 _ _ _ _ _ _ _ _ = error "Should only be called on SymTerm"++buildUGFun111111 ::+  forall integerBitWidth s1 s2 s3 s4 s5 s6 a.+  ( SupportedPrim a,+    SupportedPrim s1,+    SupportedPrim s2,+    SupportedPrim s3,+    SupportedPrim s4,+    SupportedPrim s5,+    SupportedPrim s6+  ) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  R.TypeRep s4 ->+  R.TypeRep s5 ->+  R.TypeRep s6 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 --> s2 --> s3 --> s4 --> s5 --> s6))+buildUGFun111111 config ta tb tc td te tf term@(SymTerm _ ts) m =+  case ((config, ta), (config, tb), (config, tc), (config, td), (config, te), (config, tf)) of+    (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+      let name = "ufunc_" ++ show (sizeBiMap m)+          f =+            SBV.uninterpret @(TermTy integerBitWidth (s1 --> s2 --> s3 --> s4 --> s5 --> s6))+              name+       in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+    _ -> Nothing+buildUGFun111111 _ _ _ _ _ _ _ _ _ = error "Should only be called on SymTerm"++buildUGFun1111111 ::+  forall integerBitWidth s1 s2 s3 s4 s5 s6 s7 a.+  ( SupportedPrim a,+    SupportedPrim s1,+    SupportedPrim s2,+    SupportedPrim s3,+    SupportedPrim s4,+    SupportedPrim s5,+    SupportedPrim s6,+    SupportedPrim s7+  ) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  R.TypeRep s4 ->+  R.TypeRep s5 ->+  R.TypeRep s6 ->+  R.TypeRep s7 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 --> s2 --> s3 --> s4 --> s5 --> s6 --> s7))+buildUGFun1111111 config ta tb tc td te tf tg term@(SymTerm _ ts) m =+  case ((config, ta), (config, tb), (config, tc), (config, td), (config, te), (config, tf), (config, tg)) of+    (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+      let name = "ufunc_" ++ show (sizeBiMap m)+          f =+            SBV.uninterpret @(TermTy integerBitWidth (s1 --> s2 --> s3 --> s4 --> s5 --> s6 --> s7))+              name+       in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+    _ -> Nothing+buildUGFun1111111 _ _ _ _ _ _ _ _ _ _ = error "Should only be called on SymTerm"++buildUGFun11111111 ::+  forall integerBitWidth s1 s2 s3 s4 s5 s6 s7 s8 a.+  ( SupportedPrim a,+    SupportedPrim s1,+    SupportedPrim s2,+    SupportedPrim s3,+    SupportedPrim s4,+    SupportedPrim s5,+    SupportedPrim s6,+    SupportedPrim s7,+    SupportedPrim s8+  ) =>+  GrisetteSMTConfig integerBitWidth ->+  R.TypeRep s1 ->+  R.TypeRep s2 ->+  R.TypeRep s3 ->+  R.TypeRep s4 ->+  R.TypeRep s5 ->+  R.TypeRep s6 ->+  R.TypeRep s7 ->+  R.TypeRep s8 ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth (s1 --> s2 --> s3 --> s4 --> s5 --> s6 --> s7 --> s8))+buildUGFun11111111 config ta tb tc td te tf tg th term@(SymTerm _ ts) m =+  case ((config, ta), (config, tb), (config, tc), (config, td), (config, te), (config, tf), (config, tg), (config, th)) of+    (ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType, ResolvedSimpleType) ->+      let name = "ufunc_" ++ show (sizeBiMap m)+          f =+            SBV.uninterpret @(TermTy integerBitWidth (s1 --> s2 --> s3 --> s4 --> s5 --> s6 --> s7 --> s8))+              name+       in Just (addBiMap (SomeTerm term) (toDyn f) name (someTypedSymbol ts) m, f)+    _ -> Nothing+buildUGFun11111111 _ _ _ _ _ _ _ _ _ _ _ = error "Should only be called on SymTerm"++lowerSinglePrimUFun ::+  forall integerBitWidth a.+  GrisetteSMTConfig integerBitWidth ->+  Term a ->+  SymBiMap ->+  Maybe (SymBiMap, TermTy integerBitWidth a)+lowerSinglePrimUFun config t@(SymTerm _ _) m =+  case R.typeRep @a of+    TFun8Type t1 t2 t3 t4 t5 t6 t7 t8 -> buildUTFun11111111 config t1 t2 t3 t4 t5 t6 t7 t8 t m+    TFun7Type t1 t2 t3 t4 t5 t6 t7 -> buildUTFun1111111 config t1 t2 t3 t4 t5 t6 t7 t m+    TFun6Type t1 t2 t3 t4 t5 t6 -> buildUTFun111111 config t1 t2 t3 t4 t5 t6 t m+    TFun5Type t1 t2 t3 t4 t5 -> buildUTFun11111 config t1 t2 t3 t4 t5 t m+    TFun4Type t1 t2 t3 t4 -> buildUTFun1111 config t1 t2 t3 t4 t m+    TFun3Type t1 t2 t3 -> buildUTFun111 config t1 t2 t3 t m+    TFunType t1 t2 -> buildUTFun11 config t1 t2 t m+    GFun8Type t1 t2 t3 t4 t5 t6 t7 t8 -> buildUGFun11111111 config t1 t2 t3 t4 t5 t6 t7 t8 t m+    GFun7Type t1 t2 t3 t4 t5 t6 t7 -> buildUGFun1111111 config t1 t2 t3 t4 t5 t6 t7 t m+    GFun6Type t1 t2 t3 t4 t5 t6 -> buildUGFun111111 config t1 t2 t3 t4 t5 t6 t m+    GFun5Type t1 t2 t3 t4 t5 -> buildUGFun11111 config t1 t2 t3 t4 t5 t m+    GFun4Type t1 t2 t3 t4 -> buildUGFun1111 config t1 t2 t3 t4 t m+    GFun3Type t1 t2 t3 -> buildUGFun111 config t1 t2 t3 t m+    GFunType t1 t2 -> buildUGFun11 config t1 t2 t m+    _ -> Nothing+lowerSinglePrimUFun _ _ _ = error "Should not call this function"++class Monad m => SBVFreshMonad m where+  sbvFresh :: SBV.SymVal a => String -> m (SBV.SBV a)++instance SBVFreshMonad SBV.Symbolic where+  sbvFresh = SBV.free++instance SBVFreshMonad SBVC.Query where+  sbvFresh = SBVC.freshVar++lowerUnaryTerm ::+  forall integerBitWidth a a1 x x1 m.+  (Typeable x1, a1 ~ TermTy integerBitWidth a, SupportedPrim x, HasCallStack, SBVFreshMonad m) =>+  GrisetteSMTConfig integerBitWidth ->+  Term x ->+  Term a ->+  (a1 -> x1) ->+  SymBiMap ->+  m (SymBiMap, x1)+lowerUnaryTerm config orig t1 f m = do+  (m1, l1) <- lowerSinglePrimCached config t1 m+  let g = f l1+  return (addBiMapIntermediate (SomeTerm orig) (toDyn g) m1, g)++lowerBinaryTerm ::+  forall integerBitWidth a b a1 b1 x x1 m.+  (Typeable x1, a1 ~ TermTy integerBitWidth a, b1 ~ TermTy integerBitWidth b, SupportedPrim x, HasCallStack, SBVFreshMonad m) =>+  GrisetteSMTConfig integerBitWidth ->+  Term x ->+  Term a ->+  Term b ->+  (a1 -> b1 -> x1) ->+  SymBiMap ->+  m (SymBiMap, x1)+lowerBinaryTerm config orig t1 t2 f m = do+  (m1, l1) <- lowerSinglePrimCached config t1 m+  (m2, l2) <- lowerSinglePrimCached config t2 m1+  let g = f l1 l2+  return (addBiMapIntermediate (SomeTerm orig) (toDyn g) m2, g)++lowerSinglePrimCached ::+  forall integerBitWidth a m.+  (HasCallStack, SBVFreshMonad m) =>+  GrisetteSMTConfig integerBitWidth ->+  Term a ->+  SymBiMap ->+  m (SymBiMap, TermTy integerBitWidth a)+lowerSinglePrimCached config t m =+  introSupportedPrimConstraint t $+    case (config, R.typeRep @a) of+      ResolvedDeepType ->+        case lookupTerm (SomeTerm t) m of+          Just x -> return (m, fromDyn x undefined)+          Nothing -> lowerSinglePrimImpl config t m+      _ -> translateTypeError (R.typeRep @a)++lowerSinglePrim ::+  forall integerBitWidth a m.+  (HasCallStack, SBVFreshMonad m) =>+  GrisetteSMTConfig integerBitWidth ->+  Term a ->+  m (SymBiMap, TermTy integerBitWidth a)+lowerSinglePrim config t = lowerSinglePrimCached config t emptySymBiMap++lowerSinglePrimImpl ::+  forall integerBitWidth a m.+  (HasCallStack, SBVFreshMonad m) =>+  GrisetteSMTConfig integerBitWidth ->+  Term a ->+  SymBiMap ->+  m (SymBiMap, TermTy integerBitWidth a)+lowerSinglePrimImpl config@ResolvedConfig {} (ConTerm _ v) m = return (m, lowerValue config v)+lowerSinglePrimImpl config t@(SymTerm _ ts) m =+  fromMaybe errorMsg $ asum [simple, ufunc]+  where+    errorMsg :: forall x. x+    errorMsg = translateTypeError (R.typeRep @a)+    simple :: Maybe (m (SymBiMap, TermTy integerBitWidth a))+    simple = case (config, R.typeRep @a) of+      ResolvedSimpleType -> Just $ do+        let name = show ts+        (g :: TermTy integerBitWidth a) <- sbvFresh name+        return (addBiMap (SomeTerm t) (toDyn g) name (someTypedSymbol ts) m, g)+      _ -> Nothing+    ufunc :: (Maybe (m (SymBiMap, TermTy integerBitWidth a)))+    ufunc = return <$> lowerSinglePrimUFun config t m+lowerSinglePrimImpl _ (UnaryTerm _ op (_ :: Term x)) _ = errorMsg+  where+    errorMsg :: forall t1. t1+    errorMsg = translateUnaryError (show op) (R.typeRep @x) (R.typeRep @a)+lowerSinglePrimImpl _ (BinaryTerm _ op (_ :: Term x) (_ :: Term y)) _ = errorMsg+  where+    errorMsg :: forall t1. t1+    errorMsg = translateBinaryError (show op) (R.typeRep @x) (R.typeRep @y) (R.typeRep @a)+lowerSinglePrimImpl ResolvedConfig {} (TernaryTerm _ op (_ :: Term x) (_ :: Term y) (_ :: Term z)) _ = errorMsg+  where+    errorMsg :: forall t1. t1+    errorMsg = translateTernaryError (show op) (R.typeRep @x) (R.typeRep @y) (R.typeRep @z) (R.typeRep @a)+lowerSinglePrimImpl config t@(NotTerm _ arg) m = lowerUnaryTerm config t arg SBV.sNot m+lowerSinglePrimImpl config t@(OrTerm _ arg1 arg2) m = lowerBinaryTerm config t arg1 arg2 (SBV..||) m+lowerSinglePrimImpl config t@(AndTerm _ arg1 arg2) m = lowerBinaryTerm config t arg1 arg2 (SBV..&&) m+lowerSinglePrimImpl config t@(EqvTerm _ (arg1 :: Term x) arg2) m =+  case (config, R.typeRep @x) of+    ResolvedSimpleType -> lowerBinaryTerm config t arg1 arg2 (SBV..==) m+    _ -> translateBinaryError "(==)" (R.typeRep @x) (R.typeRep @x) (R.typeRep @a)+lowerSinglePrimImpl config t@(ITETerm _ cond arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedMergeableType -> do+      (m1, l1) <- lowerSinglePrimCached config cond m+      (m2, l2) <- lowerSinglePrimCached config arg1 m1+      (m3, l3) <- lowerSinglePrimCached config arg2 m2+      let g = SBV.ite l1 l2 l3+      return (addBiMapIntermediate (SomeTerm t) (toDyn g) m3, g)+    _ -> translateBinaryError "ite" (R.typeRep @Bool) (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(AddNumTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedNumType -> lowerBinaryTerm config t arg1 arg2 (+) m+    _ -> translateBinaryError "(+)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(UMinusNumTerm _ arg) m =+  case (config, R.typeRep @a) of+    ResolvedNumType -> lowerUnaryTerm config t arg negate m+    _ -> translateUnaryError "negate" (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(TimesNumTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedNumType -> lowerBinaryTerm config t arg1 arg2 (*) m+    _ -> translateBinaryError "(*)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(AbsNumTerm _ arg) m =+  case (config, R.typeRep @a) of+    ResolvedNumType -> lowerUnaryTerm config t arg abs m+    _ -> translateUnaryError "abs" (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(SignumNumTerm _ arg) m =+  case (config, R.typeRep @a) of+    ResolvedNumType -> lowerUnaryTerm config t arg signum m+    _ -> translateUnaryError "signum" (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(LTNumTerm _ (arg1 :: Term arg) arg2) m =+  case (config, R.typeRep @arg) of+    ResolvedNumOrdType -> lowerBinaryTerm config t arg1 arg2 (SBV..<) m+    _ -> translateBinaryError "(<)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @Bool)+lowerSinglePrimImpl config t@(LENumTerm _ (arg1 :: Term arg) arg2) m =+  case (config, R.typeRep @arg) of+    ResolvedNumOrdType -> lowerBinaryTerm config t arg1 arg2 (SBV..<=) m+    _ -> translateBinaryError "(<=)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @Bool)+lowerSinglePrimImpl config t@(AndBitsTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedBitsType -> lowerBinaryTerm config t arg1 arg2 (.&.) m+    _ -> translateBinaryError "(.&.)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(OrBitsTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedBitsType -> lowerBinaryTerm config t arg1 arg2 (.|.) m+    _ -> translateBinaryError "(.|.)" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(XorBitsTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedBitsType -> lowerBinaryTerm config t arg1 arg2 xor m+    _ -> translateBinaryError "xor" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(ComplementBitsTerm _ arg) m =+  case (config, R.typeRep @a) of+    ResolvedBitsType -> lowerUnaryTerm config t arg complement m+    _ -> translateUnaryError "complement" (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(ShiftBitsTerm _ arg n) m =+  case (config, R.typeRep @a) of+    ResolvedBitsType -> lowerUnaryTerm config t arg (`shift` n) m+    _ -> translateBinaryError "shift" (R.typeRep @a) (R.typeRep @Int) (R.typeRep @a)+lowerSinglePrimImpl config t@(RotateBitsTerm _ arg n) m =+  case (config, R.typeRep @a) of+    ResolvedBitsType -> lowerUnaryTerm config t arg (`rotate` n) m+    _ -> translateBinaryError "rotate" (R.typeRep @a) (R.typeRep @Int) (R.typeRep @a)+lowerSinglePrimImpl config t@(BVConcatTerm _ (bv1 :: Term x) (bv2 :: Term y)) m =+  case (R.typeRep @a, R.typeRep @x, R.typeRep @y) of+    (UnsignedBVType (_ :: Proxy na), UnsignedBVType (_ :: Proxy nx), UnsignedBVType (_ :: Proxy ny)) ->+      case (unsafeAxiom @(nx + ny) @na) of+        Refl -> lowerBinaryTerm config t bv1 bv2 (SBV.#) m+    (SignedBVType (_ :: Proxy na), SignedBVType (_ :: Proxy nx), SignedBVType (_ :: Proxy ny)) ->+      case (unsafeAxiom @(nx + ny) @na) of+        Refl ->+          lowerBinaryTerm+            config+            t+            bv1+            bv2+            ( \(x :: SBV.SInt xn) (y :: SBV.SInt yn) ->+                SBV.sFromIntegral $+                  (SBV.sFromIntegral x :: SBV.SWord xn) SBV.# (SBV.sFromIntegral y :: SBV.SWord yn)+            )+            m+    _ -> translateBinaryError "bvconcat" (R.typeRep @x) (R.typeRep @y) (R.typeRep @a)+lowerSinglePrimImpl config t@(BVSelectTerm _ (ix :: R.TypeRep ix) w (bv :: Term x)) m =+  case (R.typeRep @a, R.typeRep @x) of+    (UnsignedBVType (_ :: Proxy na), UnsignedBVType (_ :: Proxy xn)) ->+      withKnownProof (unsafeKnownProof @(na + ix - 1) (natVal (Proxy @na) + natVal (Proxy @ix) - 1)) $+        case ( unsafeAxiom @(na + ix - 1 - ix + 1) @na,+               unsafeLeqProof @(na + ix - 1 + 1) @xn,+               unsafeLeqProof @ix @(na + ix - 1)+             ) of+          (Refl, LeqProof, LeqProof) ->+            lowerUnaryTerm config t bv (SBV.bvExtract (Proxy @(na + ix - 1)) (Proxy @ix)) m+    (SignedBVType (_ :: Proxy na), SignedBVType (_ :: Proxy xn)) ->+      withKnownProof (unsafeKnownProof @(na + ix - 1) (natVal (Proxy @na) + natVal (Proxy @ix) - 1)) $+        case ( unsafeAxiom @(na + ix - 1 - ix + 1) @na,+               unsafeLeqProof @(na + ix - 1 + 1) @xn,+               unsafeLeqProof @ix @(na + ix - 1)+             ) of+          (Refl, LeqProof, LeqProof) ->+            lowerUnaryTerm config t bv (SBV.bvExtract (Proxy @(na + ix - 1)) (Proxy @ix)) m+    _ -> translateTernaryError "bvselect" ix w (R.typeRep @x) (R.typeRep @a)+lowerSinglePrimImpl config t@(BVExtendTerm _ signed (n :: R.TypeRep n) (bv :: Term x)) m =+  case (R.typeRep @a, R.typeRep @x) of+    (UnsignedBVType (_ :: Proxy na), UnsignedBVType (_ :: Proxy nx)) ->+      withKnownProof (unsafeKnownProof @(na - nx) (natVal (Proxy @na) - natVal (Proxy @nx))) $+        case (unsafeLeqProof @(nx + 1) @na, unsafeLeqProof @1 @(na - nx)) of+          (LeqProof, LeqProof) ->+            bvIsNonZeroFromGEq1 @(na - nx) $+              lowerUnaryTerm config t bv (if signed then SBV.signExtend else SBV.zeroExtend) m+    (SignedBVType (_ :: Proxy na), SignedBVType (_ :: Proxy nx)) ->+      withKnownProof (unsafeKnownProof @(na - nx) (natVal (Proxy @na) - natVal (Proxy @nx))) $+        case (unsafeLeqProof @(nx + 1) @na, unsafeLeqProof @1 @(na - nx)) of+          (LeqProof, LeqProof) ->+            bvIsNonZeroFromGEq1 @(na - nx) $+              lowerUnaryTerm+                config+                t+                bv+                ( if signed+                    then SBV.signExtend+                    else \x ->+                      SBV.sFromIntegral+                        (SBV.zeroExtend (SBV.sFromIntegral x :: SBV.SBV (SBV.WordN nx)) :: SBV.SBV (SBV.WordN na))+                )+                m+    _ -> translateTernaryError "bvextend" (R.typeRep @Bool) n (R.typeRep @x) (R.typeRep @a)+lowerSinglePrimImpl config t@(TabularFunApplyTerm _ (f :: Term (b =-> a)) (arg :: Term b)) m =+  case (config, R.typeRep @a) of+    ResolvedDeepType -> do+      (m1, l1) <- lowerSinglePrimCached config f m+      (m2, l2) <- lowerSinglePrimCached config arg m1+      let g = l1 l2+      return (addBiMapIntermediate (SomeTerm t) (toDyn g) m2, g)+    _ -> translateBinaryError "tabularApply" (R.typeRep @(b =-> a)) (R.typeRep @b) (R.typeRep @a)+lowerSinglePrimImpl config t@(GeneralFunApplyTerm _ (f :: Term (b --> a)) (arg :: Term b)) m =+  case (config, R.typeRep @a) of+    ResolvedDeepType -> do+      (m1, l1) <- lowerSinglePrimCached config f m+      (m2, l2) <- lowerSinglePrimCached config arg m1+      let g = l1 l2+      return (addBiMapIntermediate (SomeTerm t) (toDyn g) m2, g)+    _ -> translateBinaryError "generalApply" (R.typeRep @(b --> a)) (R.typeRep @b) (R.typeRep @a)+lowerSinglePrimImpl config t@(DivIntegralTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedSDivisibleType -> lowerBinaryTerm config t arg1 arg2 SBV.sDiv m+    _ -> translateBinaryError "div" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(ModIntegralTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedSDivisibleType -> lowerBinaryTerm config t arg1 arg2 SBV.sMod m+    _ -> translateBinaryError "mod" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(QuotIntegralTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedSDivisibleType -> lowerBinaryTerm config t arg1 arg2 SBV.sQuot m+    _ -> translateBinaryError "quot" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(RemIntegralTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedSDivisibleType -> lowerBinaryTerm config t arg1 arg2 SBV.sRem m+    _ -> translateBinaryError "rem" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(DivBoundedIntegralTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedSDivisibleType -> lowerBinaryTerm config t arg1 arg2 SBV.sDiv m+    _ -> translateBinaryError "div" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(ModBoundedIntegralTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedSDivisibleType -> lowerBinaryTerm config t arg1 arg2 SBV.sMod m+    _ -> translateBinaryError "mod" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(QuotBoundedIntegralTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedSDivisibleType -> lowerBinaryTerm config t arg1 arg2 SBV.sQuot m+    _ -> translateBinaryError "quot" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl config t@(RemBoundedIntegralTerm _ arg1 arg2) m =+  case (config, R.typeRep @a) of+    ResolvedSDivisibleType -> lowerBinaryTerm config t arg1 arg2 SBV.sRem m+    _ -> translateBinaryError "rem" (R.typeRep @a) (R.typeRep @a) (R.typeRep @a)+lowerSinglePrimImpl _ _ _ = error "Should never happen"++bvIsNonZeroFromGEq1 :: forall w r. (1 <= w) => ((SBV.BVIsNonZero w) => r) -> r+bvIsNonZeroFromGEq1 r1 = case unsafeAxiom :: w :~: 1 of+  Refl -> r1++parseModel :: forall integerBitWidth. GrisetteSMTConfig integerBitWidth -> SBVI.SMTModel -> SymBiMap -> PM.Model+parseModel _ (SBVI.SMTModel _ _ assoc uifuncs) mp = foldr gouifuncs (foldr goassoc emptyModel assoc) uifuncs+  where+    goassoc :: (String, SBVI.CV) -> PM.Model -> PM.Model+    goassoc (name, cv) m = case findStringToSymbol name mp of+      Just (SomeTypedSymbol tr s) ->+        insertValue s (resolveSingle tr cv) m+      Nothing -> error "Bad"+    resolveSingle :: R.TypeRep a -> SBVI.CV -> a+    resolveSingle t (SBVI.CV SBVI.KBool (SBVI.CInteger n)) =+      case R.eqTypeRep t (R.typeRep @Bool) of+        Just R.HRefl -> n /= 0+        Nothing -> error "Bad type"+    resolveSingle t (SBVI.CV SBVI.KUnbounded (SBVI.CInteger i)) =+      case R.eqTypeRep t (R.typeRep @Integer) of+        Just R.HRefl -> i+        Nothing -> error "Bad type"+    resolveSingle t (SBVI.CV (SBVI.KBounded _ bitWidth) (SBVI.CInteger i)) =+      case R.eqTypeRep t (R.typeRep @Integer) of+        Just R.HRefl -> i+        _ -> case t of+          R.App a (n :: R.TypeRep w) ->+            case R.eqTypeRep (R.typeRepKind n) (R.typeRep @Nat) of+              Just R.HRefl ->+                case (unsafeKnownProof @w (fromIntegral bitWidth), unsafeLeqProof @1 @w) of+                  (KnownProof, LeqProof) ->+                    case (R.eqTypeRep a (R.typeRep @IntN), R.eqTypeRep a (R.typeRep @WordN)) of+                      (Just R.HRefl, _) ->+                        fromInteger i+                      (_, Just R.HRefl) -> fromInteger i+                      _ -> error "Bad type"+              _ -> error "Bad type"+          _ -> error "Bad type"+    resolveSingle _ _ = error "Unknown cv"++    buildConstFun :: (SupportedPrim a, SupportedPrim r) => R.TypeRep a -> R.TypeRep r -> SBVI.CV -> a =-> r+    buildConstFun _ tr v = case tr of+      TFunType (ta2' :: R.TypeRep a2) (tr2' :: R.TypeRep r2) -> TabularFun [] $ buildConstFun ta2' tr2' v+      _ -> TabularFun [] $ resolveSingle tr v++    goutfuncResolve ::+      forall a r.+      (SupportedPrim a, SupportedPrim r) =>+      R.TypeRep a ->+      R.TypeRep r ->+      ([([SBVI.CV], SBVI.CV)], SBVI.CV) ->+      (a =-> r)+    goutfuncResolve ta1 ta2 (l, s) =+      case ta2 of+        TFunType (ta2' :: R.TypeRep a2) (tr2' :: R.TypeRep r2) ->+          TabularFun+            (second (\r -> goutfuncResolve ta2' tr2' (r, s)) <$> partition ta1 l)+            (buildConstFun ta2' tr2' s)+        _ ->+          TabularFun+            (bimap (resolveSingle ta1 . head) (resolveSingle ta2) <$> l)+            (resolveSingle ta2 s)++    gougfuncResolve ::+      forall a r.+      (SupportedPrim a, SupportedPrim r) =>+      Int ->+      R.TypeRep a ->+      R.TypeRep r ->+      ([([SBVI.CV], SBVI.CV)], SBVI.CV) ->+      (a --> r)+    gougfuncResolve idx ta1 ta2 (l, s) =+      case ta2 of+        GFunType (ta2' :: R.TypeRep a2) (tr2' :: R.TypeRep r2) ->+          let sym = IndexedSymbol "arg" idx+              funs = second (\r -> gougfuncResolve (idx + 1) ta2' tr2' (r, s)) <$> partition ta1 l+              def = gougfuncResolve (idx + 1) ta2' tr2' ([], s)+              body =+                foldl'+                  ( \acc (v, f) ->+                      pevalITETerm+                        (pevalEqvTerm (symTerm sym) (conTerm v))+                        (conTerm f)+                        acc+                  )+                  (conTerm def)+                  funs+           in buildGeneralFun sym body+        _ ->+          let sym = IndexedSymbol "arg" idx+              vs = bimap (resolveSingle ta1 . head) (resolveSingle ta2) <$> l+              def = resolveSingle ta2 s+              body =+                foldl'+                  ( \acc (v, a) ->+                      pevalITETerm+                        (pevalEqvTerm (symTerm sym) (conTerm v))+                        (conTerm a)+                        acc+                  )+                  (conTerm def)+                  vs+           in buildGeneralFun sym body+    partition :: R.TypeRep a -> [([SBVI.CV], SBVI.CV)] -> [(a, [([SBVI.CV], SBVI.CV)])]+    partition t = case (R.eqTypeRep t (R.typeRep @Bool), R.eqTypeRep t (R.typeRep @Integer)) of+      (Just R.HRefl, _) -> partitionWithOrd . resolveFirst t+      (_, Just R.HRefl) -> partitionWithOrd . resolveFirst t+      _ -> case t of+        R.App bv _ -> case (R.eqTypeRep bv (R.typeRep @IntN), R.eqTypeRep bv (R.typeRep @WordN)) of+          (Just R.HRefl, _) -> fmap (first IntN) . partitionWithOrd . fmap (first unIntN) . resolveFirst t+          (_, Just R.HRefl) -> partitionWithOrd . resolveFirst t+          _ -> error "Unknown type"+        _ -> error "Unknown type"++    resolveFirst :: R.TypeRep a -> [([SBVI.CV], SBVI.CV)] -> [(a, [([SBVI.CV], SBVI.CV)])]+    resolveFirst tf = fmap (\case (x : xs, v) -> (resolveSingle tf x, [(xs, v)]); _ -> error "impossible")++    partitionWithOrd :: forall a. Ord a => [(a, [([SBVI.CV], SBVI.CV)])] -> [(a, [([SBVI.CV], SBVI.CV)])]+    partitionWithOrd v = go sorted+      where+        sorted = sortWith fst v+        go (x : x1 : xs) =+          if fst x == fst x1+            then go $ (fst x, snd x ++ snd x1) : xs+            else x : go (x1 : xs)+        go x = x++    gouifuncs :: (String, (SBVI.SBVType, ([([SBVI.CV], SBVI.CV)], SBVI.CV))) -> PM.Model -> PM.Model+    gouifuncs (name, (SBVI.SBVType _, l)) m = case findStringToSymbol name mp of+      Just (SomeTypedSymbol tr s) -> withSymbolSupported s $ case tr of+        t@(TFunType a r) -> R.withTypeable t $ insertValue s (goutfuncResolve a r l) m+        t@(GFunType a r) -> R.withTypeable t $ insertValue s (gougfuncResolve 0 a r l) m+        _ -> error "Bad"+      Nothing -> error "Bad"++-- helpers++data BVTypeContainer bv k where+  BVTypeContainer :: (SBV.BVIsNonZero n, KnownNat n, 1 <= n, k ~ bv n) => Proxy n -> BVTypeContainer bv k++signedBVTypeView :: forall t. (SupportedPrim t) => R.TypeRep t -> Maybe (BVTypeContainer IntN t)+signedBVTypeView t = case t of+  R.App s (n :: R.TypeRep w) ->+    case (R.eqTypeRep s (R.typeRep @IntN), R.eqTypeRep (R.typeRepKind n) (R.typeRep @Nat)) of+      (Just R.HRefl, Just R.HRefl) ->+        Just $ unsafeBVIsNonZero @w $ withPrim (Proxy @t) (BVTypeContainer Proxy)+      _ -> Nothing+  _ -> Nothing+  where+    unsafeBVIsNonZero :: forall w r. ((SBV.BVIsNonZero w) => r) -> r+    unsafeBVIsNonZero r1 = case unsafeAxiom :: w :~: 1 of+      Refl -> r1++pattern SignedBVType ::+  forall t.+  (SupportedPrim t) =>+  forall (n :: Nat).+  (t ~~ IntN n, KnownNat n, 1 <= n, SBV.BVIsNonZero n) =>+  Proxy n ->+  R.TypeRep t+pattern SignedBVType p <- (signedBVTypeView @t -> Just (BVTypeContainer p))++unsignedBVTypeView :: forall t. (SupportedPrim t) => R.TypeRep t -> Maybe (BVTypeContainer WordN t)+unsignedBVTypeView t = case t of+  R.App s (n :: R.TypeRep w) ->+    case (R.eqTypeRep s (R.typeRep @WordN), R.eqTypeRep (R.typeRepKind n) (R.typeRep @Nat)) of+      (Just R.HRefl, Just R.HRefl) ->+        Just $ unsafeBVIsNonZero @w $ withPrim (Proxy @t) (BVTypeContainer Proxy)+      _ -> Nothing+  _ -> Nothing+  where+    unsafeBVIsNonZero :: forall w r. ((SBV.BVIsNonZero w) => r) -> r+    unsafeBVIsNonZero r1 = case unsafeAxiom :: w :~: 1 of+      Refl -> r1++pattern UnsignedBVType ::+  forall t.+  (SupportedPrim t) =>+  forall (n :: Nat).+  (t ~~ WordN n, KnownNat n, 1 <= n, SBV.BVIsNonZero n) =>+  Proxy n ->+  R.TypeRep t+pattern UnsignedBVType p <- (unsignedBVTypeView @t -> Just (BVTypeContainer p))++data TFunTypeContainer :: forall k. k -> Type where+  TFunTypeContainer :: (SupportedPrim a, SupportedPrim b) => R.TypeRep a -> R.TypeRep b -> TFunTypeContainer (a =-> b)++tFunTypeView :: forall t. (SupportedPrim t) => R.TypeRep t -> Maybe (TFunTypeContainer t)+tFunTypeView t = case t of+  R.App (R.App arr (ta2' :: R.TypeRep a2)) (tr2' :: R.TypeRep r2) ->+    case R.eqTypeRep arr (R.typeRep @(=->)) of+      Just R.HRefl -> Just $ withPrim (Proxy @t) $ TFunTypeContainer ta2' tr2'+      Nothing -> Nothing+  _ -> Nothing++pattern TFunType ::+  forall t.+  (SupportedPrim t) =>+  forall (a :: Type) (b :: Type).+  (t ~~ (a =-> b), SupportedPrim a, SupportedPrim b) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep t+pattern TFunType a b <-+  (tFunTypeView -> Just (TFunTypeContainer a b))+  where+    TFunType a b = R.App (R.App (R.typeRep @(=->)) a) b++pattern TFun3Type ::+  forall t.+  (SupportedPrim t) =>+  forall (a :: Type) (b :: Type) (c :: Type).+  (t ~~ (a =-> b =-> c), SupportedPrim a, SupportedPrim b, SupportedPrim c) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep t+pattern TFun3Type a b c = TFunType a (TFunType b c)++pattern TFun4Type ::+  forall t.+  (SupportedPrim t) =>+  forall (a :: Type) (b :: Type) (c :: Type) (d :: Type).+  ( t ~~ (a =-> b =-> c =-> d),+    SupportedPrim a,+    SupportedPrim b,+    SupportedPrim c,+    SupportedPrim d+  ) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep d ->+  R.TypeRep t+pattern TFun4Type a b c d = TFunType a (TFunType b (TFunType c d))++pattern TFun5Type ::+  forall t.+  (SupportedPrim t) =>+  forall (a :: Type) (b :: Type) (c :: Type) (d :: Type) (e :: Type).+  ( t ~~ (a =-> b =-> c =-> d =-> e),+    SupportedPrim a,+    SupportedPrim b,+    SupportedPrim c,+    SupportedPrim d,+    SupportedPrim e+  ) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep d ->+  R.TypeRep e ->+  R.TypeRep t+pattern TFun5Type a b c d e =+  TFunType+    a+    ( TFunType+        b+        ( TFunType+            c+            (TFunType d e)+          )+      )++pattern TFun6Type ::+  forall t.+  (SupportedPrim t) =>+  forall+    (a :: Type)+    (b :: Type)+    (c :: Type)+    (d :: Type)+    (e :: Type)+    (f :: Type).+  ( t ~~ (a =-> b =-> c =-> d =-> e =-> f),+    SupportedPrim a,+    SupportedPrim b,+    SupportedPrim c,+    SupportedPrim d,+    SupportedPrim e,+    SupportedPrim f+  ) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep d ->+  R.TypeRep e ->+  R.TypeRep f ->+  R.TypeRep t+pattern TFun6Type a b c d e f =+  TFunType+    a+    ( TFunType+        b+        ( TFunType+            c+            ( TFunType+                d+                (TFunType e f)+              )+          )+      )++pattern TFun7Type ::+  forall t.+  (SupportedPrim t) =>+  forall+    (a :: Type)+    (b :: Type)+    (c :: Type)+    (d :: Type)+    (e :: Type)+    (f :: Type)+    (g :: Type).+  ( t ~~ (a =-> b =-> c =-> d =-> e =-> f =-> g),+    SupportedPrim a,+    SupportedPrim b,+    SupportedPrim c,+    SupportedPrim d,+    SupportedPrim e,+    SupportedPrim f,+    SupportedPrim g+  ) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep d ->+  R.TypeRep e ->+  R.TypeRep f ->+  R.TypeRep g ->+  R.TypeRep t+pattern TFun7Type a b c d e f g =+  TFunType+    a+    ( TFunType+        b+        ( TFunType+            c+            ( TFunType+                d+                ( TFunType+                    e+                    (TFunType f g)+                  )+              )+          )+      )++pattern TFun8Type ::+  forall t.+  (SupportedPrim t) =>+  forall+    (a :: Type)+    (b :: Type)+    (c :: Type)+    (d :: Type)+    (e :: Type)+    (f :: Type)+    (g :: Type)+    (h :: Type).+  ( t ~~ (a =-> b =-> c =-> d =-> e =-> f =-> g =-> h),+    SupportedPrim a,+    SupportedPrim b,+    SupportedPrim c,+    SupportedPrim d,+    SupportedPrim e,+    SupportedPrim f,+    SupportedPrim g,+    SupportedPrim h+  ) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep d ->+  R.TypeRep e ->+  R.TypeRep f ->+  R.TypeRep g ->+  R.TypeRep h ->+  R.TypeRep t+pattern TFun8Type a b c d e f g h =+  TFunType+    a+    ( TFunType+        b+        ( TFunType+            c+            ( TFunType+                d+                ( TFunType+                    e+                    ( TFunType+                        f+                        (TFunType g h)+                      )+                  )+              )+          )+      )++data GFunTypeContainer :: forall k. k -> Type where+  GFunTypeContainer :: (SupportedPrim a, SupportedPrim b) => R.TypeRep a -> R.TypeRep b -> GFunTypeContainer (a --> b)++gFunTypeView :: forall t. (SupportedPrim t) => R.TypeRep t -> Maybe (GFunTypeContainer t)+gFunTypeView t = case t of+  R.App (R.App arr (ta2' :: R.TypeRep a2)) (tr2' :: R.TypeRep r2) ->+    case R.eqTypeRep arr (R.typeRep @(-->)) of+      Just R.HRefl -> Just $ withPrim (Proxy @t) $ GFunTypeContainer ta2' tr2'+      Nothing -> Nothing+  _ -> Nothing++pattern GFunType ::+  forall t.+  (SupportedPrim t) =>+  forall (a :: Type) (b :: Type).+  (t ~~ (a --> b), SupportedPrim a, SupportedPrim b) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep t+pattern GFunType a b <-+  (gFunTypeView -> Just (GFunTypeContainer a b))+  where+    GFunType a b = R.App (R.App (R.typeRep @(-->)) a) b++pattern GFun3Type ::+  forall t.+  (SupportedPrim t) =>+  forall (a :: Type) (b :: Type) (c :: Type).+  (t ~~ (a --> b --> c), SupportedPrim a, SupportedPrim b, SupportedPrim c) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep t+pattern GFun3Type a b c = GFunType a (GFunType b c)++pattern GFun4Type ::+  forall t.+  (SupportedPrim t) =>+  forall (a :: Type) (b :: Type) (c :: Type) (d :: Type).+  ( t ~~ (a --> b --> c --> d),+    SupportedPrim a,+    SupportedPrim b,+    SupportedPrim c,+    SupportedPrim d+  ) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep d ->+  R.TypeRep t+pattern GFun4Type a b c d = GFunType a (GFunType b (GFunType c d))++pattern GFun5Type ::+  forall t.+  (SupportedPrim t) =>+  forall (a :: Type) (b :: Type) (c :: Type) (d :: Type) (e :: Type).+  ( t ~~ (a --> b --> c --> d --> e),+    SupportedPrim a,+    SupportedPrim b,+    SupportedPrim c,+    SupportedPrim d,+    SupportedPrim e+  ) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep d ->+  R.TypeRep e ->+  R.TypeRep t+pattern GFun5Type a b c d e =+  GFunType+    a+    ( GFunType+        b+        ( GFunType+            c+            (GFunType d e)+          )+      )++pattern GFun6Type ::+  forall t.+  (SupportedPrim t) =>+  forall+    (a :: Type)+    (b :: Type)+    (c :: Type)+    (d :: Type)+    (e :: Type)+    (f :: Type).+  ( t ~~ (a --> b --> c --> d --> e --> f),+    SupportedPrim a,+    SupportedPrim b,+    SupportedPrim c,+    SupportedPrim d,+    SupportedPrim e,+    SupportedPrim f+  ) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep d ->+  R.TypeRep e ->+  R.TypeRep f ->+  R.TypeRep t+pattern GFun6Type a b c d e f =+  GFunType+    a+    ( GFunType+        b+        ( GFunType+            c+            ( GFunType+                d+                (GFunType e f)+              )+          )+      )++pattern GFun7Type ::+  forall t.+  (SupportedPrim t) =>+  forall+    (a :: Type)+    (b :: Type)+    (c :: Type)+    (d :: Type)+    (e :: Type)+    (f :: Type)+    (g :: Type).+  ( t ~~ (a --> b --> c --> d --> e --> f --> g),+    SupportedPrim a,+    SupportedPrim b,+    SupportedPrim c,+    SupportedPrim d,+    SupportedPrim e,+    SupportedPrim f,+    SupportedPrim g+  ) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep d ->+  R.TypeRep e ->+  R.TypeRep f ->+  R.TypeRep g ->+  R.TypeRep t+pattern GFun7Type a b c d e f g =+  GFunType+    a+    ( GFunType+        b+        ( GFunType+            c+            ( GFunType+                d+                ( GFunType+                    e+                    (GFunType f g)+                  )+              )+          )+      )++pattern GFun8Type ::+  forall t.+  (SupportedPrim t) =>+  forall+    (a :: Type)+    (b :: Type)+    (c :: Type)+    (d :: Type)+    (e :: Type)+    (f :: Type)+    (g :: Type)+    (h :: Type).+  ( t ~~ (a --> b --> c --> d --> e --> f --> g --> h),+    SupportedPrim a,+    SupportedPrim b,+    SupportedPrim c,+    SupportedPrim d,+    SupportedPrim e,+    SupportedPrim f,+    SupportedPrim g,+    SupportedPrim h+  ) =>+  R.TypeRep a ->+  R.TypeRep b ->+  R.TypeRep c ->+  R.TypeRep d ->+  R.TypeRep e ->+  R.TypeRep f ->+  R.TypeRep g ->+  R.TypeRep h ->+  R.TypeRep t+pattern GFun8Type a b c d e f g h =+  GFunType+    a+    ( GFunType+        b+        ( GFunType+            c+            ( GFunType+                d+                ( GFunType+                    e+                    ( GFunType+                        f+                        (GFunType g h)+                      )+                  )+              )+          )+      )++pattern BoolType ::+  forall t.+  () =>+  (t ~~ Bool) =>+  R.TypeRep t+pattern BoolType <- (R.eqTypeRep (R.typeRep @Bool) -> Just R.HRefl)++pattern IntegerType ::+  forall t.+  () =>+  (t ~~ Integer) =>+  R.TypeRep t+pattern IntegerType <- (R.eqTypeRep (R.typeRep @Integer) -> Just R.HRefl)++type ConfigConstraint integerBitWidth s =+  ( SBV.SBV s ~ TermTy integerBitWidth Integer,+    SBV.SymVal s,+    SBV.HasKind s,+    Typeable s,+    Num (SBV.SBV s),+    Num s,+    SBV.OrdSymbolic (SBV.SBV s),+    Ord s,+    SBV.SDivisible (SBV.SBV s),+    SBV.OrdSymbolic (SBV.SBV s),+    SBV.Mergeable (SBV.SBV s)+  )++data DictConfig integerBitWidth where+  DictConfig ::+    forall s integerBitWidth.+    (ConfigConstraint integerBitWidth s) =>+    SBV.SMTConfig ->+    DictConfig integerBitWidth++resolveConfigView ::+  forall integerBitWidth.+  GrisetteSMTConfig integerBitWidth ->+  DictConfig integerBitWidth+resolveConfigView config = case config of+  GrisetteSMTConfig c extra ->+    case integerApprox extra of+      NoApprox -> DictConfig c+      Approx _ -> DictConfig c++pattern ResolvedConfig ::+  forall integerBitWidth.+  () =>+  forall s.+  ConfigConstraint integerBitWidth s =>+  SBV.SMTConfig ->+  GrisetteSMTConfig integerBitWidth+pattern ResolvedConfig c <- (resolveConfigView -> DictConfig c)++type MergeableTypeConstraint integerBitWidth s =+  ( Typeable (TermTy integerBitWidth s),+    SBV.Mergeable (TermTy integerBitWidth s)+  )++-- has to declare this because GHC does not support impredicative polymorphism+data DictMergeableType integerBitWidth s where+  DictMergeableType ::+    forall integerBitWidth s.+    (MergeableTypeConstraint integerBitWidth s) =>+    DictMergeableType integerBitWidth s++resolveMergeableTypeView :: TypeResolver DictMergeableType+resolveMergeableTypeView (config@ResolvedConfig {}, s) = case s of+  BoolType -> Just DictMergeableType+  IntegerType -> Just DictMergeableType+  SignedBVType _ -> Just DictMergeableType+  UnsignedBVType _ -> Just DictMergeableType+  TFunType l r ->+    case (resolveSimpleTypeView (config, l), resolveMergeableTypeView (config, r)) of+      (Just DictSimpleType, Just DictMergeableType) -> Just DictMergeableType+      _ -> Nothing+  GFunType l r ->+    case (resolveSimpleTypeView (config, l), resolveMergeableTypeView (config, r)) of+      (Just DictSimpleType, Just DictMergeableType) -> Just DictMergeableType+      _ -> Nothing+  _ -> Nothing+resolveMergeableTypeView _ = error "Should never happen, make compiler happy"++pattern ResolvedMergeableType ::+  forall integerBitWidth s.+  (SupportedPrim s) =>+  MergeableTypeConstraint integerBitWidth s =>+  (GrisetteSMTConfig integerBitWidth, R.TypeRep s)+pattern ResolvedMergeableType <- (resolveMergeableTypeView -> Just DictMergeableType)++type SimpleTypeConstraint integerBitWidth s s' =+  ( SBV.SBV s' ~ TermTy integerBitWidth s,+    SBV.SymVal s',+    SBV.HasKind s',+    Typeable s',+    SBV.OrdSymbolic (SBV.SBV s'),+    SBV.Mergeable (SBV.SBV s')+  )++type TypeResolver dictType =+  forall integerBitWidth s.+  (SupportedPrim s) =>+  (GrisetteSMTConfig integerBitWidth, R.TypeRep s) ->+  Maybe (dictType integerBitWidth s)++-- has to declare this because GHC does not support impredicative polymorphism+data DictSimpleType integerBitWidth s where+  DictSimpleType ::+    forall integerBitWidth s s'.+    (SimpleTypeConstraint integerBitWidth s s') =>+    DictSimpleType integerBitWidth s++resolveSimpleTypeView :: TypeResolver DictSimpleType+resolveSimpleTypeView (ResolvedConfig {}, s) = case s of+  BoolType -> Just DictSimpleType+  IntegerType -> Just DictSimpleType+  SignedBVType _ -> Just DictSimpleType+  UnsignedBVType _ -> Just DictSimpleType+  _ -> Nothing+resolveSimpleTypeView _ = error "Should never happen, make compiler happy"++pattern ResolvedSimpleType ::+  forall integerBitWidth s.+  (SupportedPrim s) =>+  forall s'.+  SimpleTypeConstraint integerBitWidth s s' =>+  (GrisetteSMTConfig integerBitWidth, R.TypeRep s)+pattern ResolvedSimpleType <- (resolveSimpleTypeView -> Just DictSimpleType)++type DeepTypeConstraint integerBitWidth s s' =+  ( s' ~ TermTy integerBitWidth s,+    Typeable s',+    SBV.Mergeable s'+  )++data DictDeepType integerBitWidth s where+  DictDeepType ::+    forall integerBitWidth s s'.+    (DeepTypeConstraint integerBitWidth s s') =>+    DictDeepType integerBitWidth s++resolveDeepTypeView :: TypeResolver DictDeepType+resolveDeepTypeView r = case r of+  ResolvedSimpleType -> Just DictDeepType+  (config, TFunType (ta :: R.TypeRep a) (tb :: R.TypeRep b)) ->+    case (resolveDeepTypeView (config, ta), resolveDeepTypeView (config, tb)) of+      (Just DictDeepType, Just DictDeepType) -> Just DictDeepType+      _ -> Nothing+  (config, GFunType (ta :: R.TypeRep a) (tb :: R.TypeRep b)) ->+    case (resolveDeepTypeView (config, ta), resolveDeepTypeView (config, tb)) of+      (Just DictDeepType, Just DictDeepType) -> Just DictDeepType+      _ -> Nothing+  _ -> Nothing++pattern ResolvedDeepType ::+  forall integerBitWidth s.+  (SupportedPrim s) =>+  forall s'.+  DeepTypeConstraint integerBitWidth s s' =>+  (GrisetteSMTConfig integerBitWidth, R.TypeRep s)+pattern ResolvedDeepType <- (resolveDeepTypeView -> Just DictDeepType)++type NumTypeConstraint integerBitWidth s s' =+  ( SimpleTypeConstraint integerBitWidth s s',+    Num (SBV.SBV s'),+    Num s',+    Num s+  )++data DictNumType integerBitWidth s where+  DictNumType ::+    forall integerBitWidth s s'.+    (NumTypeConstraint integerBitWidth s s') =>+    DictNumType integerBitWidth s++resolveNumTypeView :: TypeResolver DictNumType+resolveNumTypeView (ResolvedConfig {}, s) = case s of+  IntegerType -> Just DictNumType+  SignedBVType _ -> Just DictNumType+  UnsignedBVType _ -> Just DictNumType+  _ -> Nothing+resolveNumTypeView _ = error "Should never happen, make compiler happy"++pattern ResolvedNumType ::+  forall integerBitWidth s.+  (SupportedPrim s) =>+  forall s'.+  NumTypeConstraint integerBitWidth s s' =>+  (GrisetteSMTConfig integerBitWidth, R.TypeRep s)+pattern ResolvedNumType <- (resolveNumTypeView -> Just DictNumType)++type SDivisibleTypeConstraint integerBitWidth s s' =+  ( SimpleTypeConstraint integerBitWidth s s',+    SBV.SDivisible (SBV.SBV s'),+    Integral s+  )++data DictSDivisibleType integerBitWidth s where+  DictSDivisibleType ::+    forall integerBitWidth s s'.+    (SDivisibleTypeConstraint integerBitWidth s s') =>+    DictSDivisibleType integerBitWidth s++resolveSDivisibleTypeView :: TypeResolver DictSDivisibleType+resolveSDivisibleTypeView (ResolvedConfig {}, s) = case s of+  IntegerType -> Just DictSDivisibleType+  SignedBVType _ -> Just DictSDivisibleType+  UnsignedBVType _ -> Just DictSDivisibleType+  _ -> Nothing+resolveSDivisibleTypeView _ = error "Should never happen, make compiler happy"++pattern ResolvedSDivisibleType ::+  forall integerBitWidth s.+  (SupportedPrim s) =>+  forall s'.+  SDivisibleTypeConstraint integerBitWidth s s' =>+  (GrisetteSMTConfig integerBitWidth, R.TypeRep s)+pattern ResolvedSDivisibleType <- (resolveSDivisibleTypeView -> Just DictSDivisibleType)  type NumOrdTypeConstraint integerBitWidth s s' =   ( NumTypeConstraint integerBitWidth s s',
src/Grisette/Backend/SBV/Data/SMT/Solving.hs view
@@ -23,13 +23,22 @@ -- Stability   :   Experimental -- Portability :   GHC only module Grisette.Backend.SBV.Data.SMT.Solving-  ( GrisetteSMTConfig (..),-    sbvConfig,+  ( ApproximationConfig (..),+    ExtraConfig (..),+    precise,+    approx,+    withTimeout,+    clearTimeout,+    withApprox,+    clearApprox,+    GrisetteSMTConfig (..),+    SolvingFailure (..),     TermTy,   ) where  import Control.DeepSeq+import Control.Exception import Control.Monad.Except import qualified Data.HashSet as S import Data.Hashable@@ -41,6 +50,7 @@ import qualified Data.SBV.Control as SBVC import GHC.TypeNats import Grisette.Backend.SBV.Data.SMT.Lowering+import Grisette.Core.Data.BV import Grisette.Core.Data.Class.Bool import Grisette.Core.Data.Class.CEGISSolver import Grisette.Core.Data.Class.Evaluate@@ -49,7 +59,6 @@ import Grisette.Core.Data.Class.ModelOps import Grisette.Core.Data.Class.Solvable import Grisette.Core.Data.Class.Solver-import Grisette.IR.SymPrim.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import Grisette.IR.SymPrim.Data.Prim.Model as PM@@ -62,6 +71,7 @@ -- >>> import Grisette.Core -- >>> import Grisette.IR.SymPrim -- >>> import Grisette.Backend.SBV+-- >>> import Data.Proxy  type Aux :: Bool -> Nat -> Type type family Aux o n where@@ -83,6 +93,51 @@   TermTy n (a --> b) = TermTy n a -> TermTy n b   TermTy _ v = v +-- | Configures how to approximate unbounded values.+--+-- For example, if we use @'Approx' ('Data.Proxy' :: 'Data.Proxy' 4)@ to approximate the+-- following unbounded integer:+--+-- > (+ a 9)+--+-- We will get+--+-- > (bvadd a #x9)+--+-- Here the value 9 will be approximated to a 4-bit bit vector, and the+-- operation `bvadd` will be used instead of `+`.+--+-- Note that this approximation may not be sound. See 'GrisetteSMTConfig' for+-- more details.+data ApproximationConfig (n :: Nat) where+  NoApprox :: ApproximationConfig 0+  Approx :: (KnownNat n, IsZero n ~ 'False, SBV.BVIsNonZero n) => p n -> ApproximationConfig n++data ExtraConfig (i :: Nat) = ExtraConfig+  { -- | Timeout in milliseconds for each solver call. CEGIS may call the+    -- solver multiple times and each call has its own timeout.+    timeout :: Maybe Int,+    -- | Configures how to approximate unbounded integer values.+    integerApprox :: ApproximationConfig i+  }++preciseExtraConfig :: ExtraConfig 0+preciseExtraConfig =+  ExtraConfig+    { timeout = Nothing,+      integerApprox = NoApprox+    }++approximateExtraConfig ::+  (KnownNat n, IsZero n ~ 'False, SBV.BVIsNonZero n) =>+  p n ->+  ExtraConfig n+approximateExtraConfig p =+  ExtraConfig+    { timeout = Nothing,+      integerApprox = Approx p+    }+ -- | Solver configuration for the Grisette SBV backend. -- A Grisette solver configuration consists of a SBV solver configuration and -- the reasoning precision.@@ -101,7 +156,7 @@ -- infinite precision during the symbolic evaluation, but when solving the -- queries, they are translated to bit vectors for better performance. ----- For example, the Grisette term @5 * "a" :: SymInteger@ should be translated+-- For example, the Grisette term @5 * "a" :: 'SymInteger'@ should be translated -- to the following SMT with the unbounded reasoning configuration (the term -- is @t1@): --@@ -134,56 +189,109 @@ -- -- >>> :set -XTypeApplications -XOverloadedStrings -XDataKinds -- >>> let a = "a" :: SymInteger--- >>> solve (UnboundedReasoning z3) $ a >~ 7 &&~ a <~ 9+-- >>> solve (precise z3) $ a >~ 7 &&~ a <~ 9 -- Right (Model {a -> 8 :: Integer})--- >>> solve (BoundedReasoning @4 z3) $ a >~ 7 &&~ a <~ 9+-- >>> solve (approx (Proxy @4) z3) $ a >~ 7 &&~ a <~ 9 -- Left Unsat ----- This should be avoided by setting an large enough reasoning precision to prevent+-- This may be avoided by setting an large enough reasoning precision to prevent -- overflows.-data GrisetteSMTConfig (integerBitWidth :: Nat) where-  UnboundedReasoning :: SBV.SMTConfig -> GrisetteSMTConfig 0-  BoundedReasoning ::-    (KnownNat integerBitWidth, IsZero integerBitWidth ~ 'False, SBV.BVIsNonZero integerBitWidth) =>-    SBV.SMTConfig ->-    GrisetteSMTConfig integerBitWidth+data GrisetteSMTConfig (i :: Nat) = GrisetteSMTConfig {sbvConfig :: SBV.SMTConfig, extraConfig :: ExtraConfig i} --- | Extract the SBV solver configuration from the Grisette solver configuration.-sbvConfig :: forall integerBitWidth. GrisetteSMTConfig integerBitWidth -> SBV.SMTConfig-sbvConfig (UnboundedReasoning config) = config-sbvConfig (BoundedReasoning config) = config+-- | A precise reasoning configuration with the given SBV solver configuration.+precise :: SBV.SMTConfig -> GrisetteSMTConfig 0+precise config = GrisetteSMTConfig config preciseExtraConfig +-- | An approximate reasoning configuration with the given SBV solver configuration.+approx ::+  forall p n.+  (KnownNat n, IsZero n ~ 'False, SBV.BVIsNonZero n) =>+  p n ->+  SBV.SMTConfig ->+  GrisetteSMTConfig n+approx p config = GrisetteSMTConfig config (approximateExtraConfig p)++-- | Set the timeout for the solver configuration.+withTimeout :: Int -> GrisetteSMTConfig i -> GrisetteSMTConfig i+withTimeout t config = config {extraConfig = (extraConfig config) {timeout = Just t}}++-- | Clear the timeout for the solver configuration.+clearTimeout :: GrisetteSMTConfig i -> GrisetteSMTConfig i+clearTimeout config = config {extraConfig = (extraConfig config) {timeout = Nothing}}++-- | Set the reasoning precision for the solver configuration.+withApprox :: (KnownNat n, IsZero n ~ 'False, SBV.BVIsNonZero n) => p n -> GrisetteSMTConfig i -> GrisetteSMTConfig n+withApprox p config = config {extraConfig = (extraConfig config) {integerApprox = Approx p}}++-- | Clear the reasoning precision and perform precise reasoning with the+-- solver configuration.+clearApprox :: GrisetteSMTConfig i -> GrisetteSMTConfig 0+clearApprox config = config {extraConfig = (extraConfig config) {integerApprox = NoApprox}}++data SolvingFailure+  = DSat (Maybe String)+  | Unsat+  | Unk+  | ResultNumLimitReached+  | SolvingError SBV.SBVException+  deriving (Show)++sbvCheckSatResult :: SBVC.CheckSatResult -> SolvingFailure+sbvCheckSatResult SBVC.Sat = error "Should not happen"+sbvCheckSatResult (SBVC.DSat msg) = DSat msg+sbvCheckSatResult SBVC.Unsat = Unsat+sbvCheckSatResult SBVC.Unk = Unk++applyTimeout :: GrisetteSMTConfig i -> Query a -> Query a+applyTimeout config q = case timeout (extraConfig config) of+  Nothing -> q+  Just t -> SBVC.timeout t q+ solveTermWith ::   forall integerBitWidth.   GrisetteSMTConfig integerBitWidth ->   Term Bool ->-  IO (SymBiMap, Either SBVC.CheckSatResult PM.Model)-solveTermWith config term = SBV.runSMTWith (sbvConfig config) $ do-  (m, a) <- lowerSinglePrim config term-  SBVC.query $ do-    SBV.constrain a-    r <- SBVC.checkSat-    case r of-      SBVC.Sat -> do-        md <- SBVC.getModel-        return (m, Right $ parseModel config md m)-      _ -> return (m, Left r)+  IO (Either SolvingFailure PM.Model)+solveTermWith config term =+  handle (return . Left . SolvingError) $+    SBV.runSMTWith (sbvConfig config) $ do+      (m, a) <- lowerSinglePrim config term+      SBVC.query $ applyTimeout config $ do+        SBV.constrain a+        r <- SBVC.checkSat+        case r of+          SBVC.Sat -> do+            md <- SBVC.getModel+            return (Right $ parseModel config md m)+          _ -> return (Left $ sbvCheckSatResult r) -instance Solver (GrisetteSMTConfig n) SBVC.CheckSatResult where-  solve config (Sym t) = snd <$> solveTermWith config t-  solveMulti config n s@(Sym t)-    | n > 0 = SBV.runSMTWith (sbvConfig config) $ do-        (newm, a) <- lowerSinglePrim config t-        SBVC.query $ do-          SBV.constrain a-          r <- SBVC.checkSat-          case r of-            SBVC.Sat -> do-              md <- SBVC.getModel-              let model = parseModel config md newm-              remainingModels n model newm-            _ -> return []-    | otherwise = return []+instance Solver (GrisetteSMTConfig n) SolvingFailure where+  solve config (SymBool t) = solveTermWith config t+  solveMulti config n s@(SymBool t)+    | n > 0 =+        handle+          ( \(x :: SBV.SBVException) -> do+              print "An SBV Exception occurred:"+              print x+              print $+                "Warning: Note that solveMulti do not fully support "+                  ++ "timeouts, and will return an empty list if the solver"+                  ++ "timeouts in any iteration."+              return ([], SolvingError x)+          )+          $ SBV.runSMTWith (sbvConfig config)+          $ do+            (newm, a) <- lowerSinglePrim config t+            SBVC.query $ applyTimeout config $ do+              SBV.constrain a+              r <- SBVC.checkSat+              case r of+                SBVC.Sat -> do+                  md <- SBVC.getModel+                  let model = parseModel config md newm+                  remainingModels n model newm+                _ -> return ([], sbvCheckSatResult r)+    | otherwise = return ([], ResultNumLimitReached)     where       allSymbols = extractSymbolics s :: SymbolSet       next :: PM.Model -> SymBiMap -> Query (SymBiMap, Either SBVC.CheckSatResult PM.Model)@@ -193,7 +301,7 @@                 (\acc (SomeTypedSymbol _ v) -> pevalOrTerm acc (pevalNotTerm (fromJust $ equation v md)))                 (conTerm False)                 (unSymbolSet allSymbols)-        let (lowered, newm) = lowerSinglePrim' config newtm origm+        (newm, lowered) <- lowerSinglePrimCached config newtm origm         SBV.constrain lowered         r <- SBVC.checkSat         case r of@@ -202,41 +310,57 @@             let model = parseModel config md1 newm             return (newm, Right model)           _ -> return (newm, Left r)-      remainingModels :: Int -> PM.Model -> SymBiMap -> Query [PM.Model]+      remainingModels :: Int -> PM.Model -> SymBiMap -> Query ([PM.Model], SolvingFailure)       remainingModels n1 md origm         | n1 > 1 = do             (newm, r) <- next md origm             case r of-              Left _ -> return [md]+              Left r -> return ([md], sbvCheckSatResult r)               Right mo -> do-                rmmd <- remainingModels (n1 - 1) mo newm-                return $ md : rmmd-        | otherwise = return [md]+                (rmmd, e) <- remainingModels (n1 - 1) mo newm+                return (md : rmmd, e)+        | otherwise = return ([md], ResultNumLimitReached)   solveAll = undefined -instance CEGISSolver (GrisetteSMTConfig n) SBVC.CheckSatResult where+instance CEGISSolver (GrisetteSMTConfig n) SolvingFailure where   cegisMultiInputs ::     forall inputs spec.     (ExtractSymbolics inputs, EvaluateSym inputs) =>     GrisetteSMTConfig n ->     [inputs] ->     (inputs -> CEGISCondition) ->-    IO (Either SBVC.CheckSatResult ([inputs], PM.Model))+    IO ([inputs], Either SolvingFailure PM.Model)   cegisMultiInputs config inputs func =-    go1 (cexesAssertFun conInputs) conInputs (error "Should have at least one gen") [] (con True) (con True) symInputs+    case symInputs of+      [] -> do+        m <- solve config (cexesAssertFun conInputs)+        return (conInputs, m)+      _ ->+        handle+          ( \(x :: SBV.SBVException) -> do+              print "An SBV Exception occurred:"+              print x+              print $+                "Warning: Note that CEGIS procedures do not fully support "+                  ++ "timeouts, and will return an empty counter example list if "+                  ++ "the solver timeouts during guessing phase."+              return ([], Left $ SolvingError x)+          )+          $ go1 (cexesAssertFun conInputs) conInputs (error "Should have at least one gen") [] (con True) (con True) symInputs     where       (conInputs, symInputs) = partition (isEmptySet . extractSymbolics) inputs+      go1 :: SymBool -> [inputs] -> PM.Model -> [inputs] -> SymBool -> SymBool -> [inputs] -> IO ([inputs], Either SolvingFailure PM.Model)       go1 cexFormula cexes previousModel inputs pre post remainingSymInputs = do         case remainingSymInputs of-          [] -> return $ Right (cexes, previousModel)+          [] -> return (cexes, Right previousModel)           newInput : vs -> do             let CEGISCondition nextPre nextPost = func newInput             let finalPre = pre &&~ nextPre             let finalPost = post &&~ nextPost             r <- go cexFormula newInput (newInput : inputs) finalPre finalPost             case r of-              Left failure -> return $ Left failure-              Right (newCexes, mo) -> do+              (newCexes, Left failure) -> return (cexes ++ newCexes, Left failure)+              (newCexes, Right mo) -> do                 go1                   (cexFormula &&~ cexesAssertFun newCexes)                   (cexes ++ newCexes)@@ -255,27 +379,28 @@         [inputs] ->         SymBool ->         SymBool ->-        IO (Either SBVC.CheckSatResult ([inputs], PM.Model))+        IO ([inputs], Either SolvingFailure PM.Model)       go cexFormula inputs allInputs pre post =         SBV.runSMTWith (sbvConfig config) $ do-          let Sym t = phi &&~ cexFormula+          let SymBool t = phi &&~ cexFormula           (newm, a) <- lowerSinglePrim config t           SBVC.query $-            snd <$> do-              SBV.constrain a-              r <- SBVC.checkSat-              mr <- case r of-                SBVC.Sat -> do-                  md <- SBVC.getModel-                  return $ Right $ parseModel config md newm-                _ -> return $ Left r-              loop ((forallSymbols `exceptFor`) <$> mr) [] newm+            applyTimeout config $+              snd <$> do+                SBV.constrain a+                r <- SBVC.checkSat+                mr <- case r of+                  SBVC.Sat -> do+                    md <- SBVC.getModel+                    return $ Right $ parseModel config md newm+                  _ -> return $ Left $ sbvCheckSatResult r+                loop ((forallSymbols `exceptFor`) <$> mr) [] newm         where           forallSymbols :: SymbolSet           forallSymbols = extractSymbolics allInputs           phi = pre &&~ post           negphi = pre &&~ nots post-          check :: Model -> IO (Either SBVC.CheckSatResult (inputs, PM.Model))+          check :: Model -> IO (Either SolvingFailure (inputs, PM.Model))           check candidate = do             let evaluated = evaluateSym False candidate negphi             r <- solve config evaluated@@ -283,10 +408,10 @@               m <- r               let newm = exact forallSymbols m               return (evaluateSym False newm inputs, newm)-          guess :: Model -> SymBiMap -> Query (SymBiMap, Either SBVC.CheckSatResult PM.Model)+          guess :: Model -> SymBiMap -> Query (SymBiMap, Either SolvingFailure PM.Model)           guess candidate origm = do-            let Sym evaluated = evaluateSym False candidate phi-            let (lowered, newm) = lowerSinglePrim' config evaluated origm+            let SymBool evaluated = evaluateSym False candidate phi+            (newm, lowered) <- lowerSinglePrimCached config evaluated origm             SBV.constrain lowered             r <- SBVC.checkSat             case r of@@ -294,21 +419,21 @@                 md <- SBVC.getModel                 let model = parseModel config md newm                 return (newm, Right $ exceptFor forallSymbols model)-              _ -> return (newm, Left r)+              _ -> return (newm, Left $ sbvCheckSatResult r)           loop ::-            Either SBVC.CheckSatResult PM.Model ->+            Either SolvingFailure PM.Model ->             [inputs] ->             SymBiMap ->-            Query (SymBiMap, Either SBVC.CheckSatResult ([inputs], PM.Model))-          loop (Right mo) cexs origm = do+            Query (SymBiMap, ([inputs], Either SolvingFailure PM.Model))+          loop (Right mo) cexes origm = do             r <- liftIO $ check mo             case r of-              Left SBVC.Unsat -> return (origm, Right (cexs, mo))-              Left v -> return (origm, Left v)+              Left Unsat -> return (origm, (cexes, Right mo))+              Left v -> return (origm, (cexes, Left v))               Right (cex, cexm) -> do                 (newm, res) <- guess cexm origm-                loop res (cex : cexs) newm-          loop (Left v) _ origm = return (origm, Left v)+                loop res (cex : cexes) newm+          loop (Left v) cexes origm = return (origm, (cexes, Left v))  newtype CegisInternal = CegisInternal Int   deriving (Eq, Show, Ord, Lift)
src/Grisette/Backend/SBV/Data/SMT/Solving.hs-boot view
@@ -6,7 +6,9 @@ {-# LANGUAGE UndecidableInstances #-}  module Grisette.Backend.SBV.Data.SMT.Solving-  ( GrisetteSMTConfig (..),+  ( ApproximationConfig (..),+    ExtraConfig (..),+    GrisetteSMTConfig (..),     TermTy,   ) where@@ -14,7 +16,7 @@ import Data.Kind import qualified Data.SBV as SBV import GHC.TypeNats-import Grisette.IR.SymPrim.Data.BV+import Grisette.Core.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import Grisette.IR.SymPrim.Data.TabularFun @@ -38,9 +40,13 @@   TermTy n (a --> b) = TermTy n a -> TermTy n b   TermTy _ v = v -data GrisetteSMTConfig (integerBitWidth :: Nat) where-  UnboundedReasoning :: SBV.SMTConfig -> GrisetteSMTConfig 0-  BoundedReasoning ::-    (KnownNat integerBitWidth, IsZero integerBitWidth ~ 'False, SBV.BVIsNonZero integerBitWidth) =>-    SBV.SMTConfig ->-    GrisetteSMTConfig integerBitWidth+data ApproximationConfig (n :: Nat) where+  NoApprox :: ApproximationConfig 0+  Approx :: (KnownNat n, IsZero n ~ 'False, SBV.BVIsNonZero n) => p n -> ApproximationConfig n++data ExtraConfig (i :: Nat) = ExtraConfig+  { timeout :: Maybe Int,+    integerApprox :: ApproximationConfig i+  }++data GrisetteSMTConfig (i :: Nat) = GrisetteSMTConfig {sbvConfig :: SBV.SMTConfig, extraConfig :: ExtraConfig i}
src/Grisette/Core.hs view
@@ -74,7 +74,8 @@     -- The values of unsolvable types are __/partially/__ merged in a symbolic     -- union, which is essentially an if-then-else tree.     ---    -- For example, assume that the lists have the type @[SymBool]@.+    -- For example, assume that the lists have the type+    -- @['Grisette.IR.SymPrim.SymBool']@.     -- In the following example, the result shows that @[b]@ and @[c]@ can be     -- merged together in the same symbolic union because they have the same     -- length:@@ -125,11 +126,15 @@     -- Grisette     -- currently provides an implementation for the following solvable types:     ---    -- * @SymBool@ or @Sym Bool@ (symbolic Booleans)-    -- * @SymInteger@ or @Sym Integer@ (symbolic unbounded integers)-    -- * @SymIntN n@ or @Sym (IntN n)@ (symbolic signed bit vectors of length @n@)-    -- * @SymWordN n@ or @Sym (WordN n)@ (symbolic unsigned bit vectors of length @n@)+    -- * 'Grisette.IR.SymPrim.SymBool' (symbolic Booleans)+    -- * 'Grisette.IR.SymPrim.SymInteger' (symbolic unbounded integers)+    -- * @'Grisette.IR.SymPrim.SymIntN' n@ (symbolic signed bit vectors of length @n@)+    -- * @'Grisette.IR.SymPrim.SymWordN' n@ (symbolic unsigned bit vectors of length @n@)     --+    -- The two bit vector types has their lengths checked at compile time.+    -- Grisette also provides runtime-checked versions of these types:+    -- 'Grisette.IR.SymPrim.SomeSymIntN' and 'Grisette.IR.SymPrim.SomeSymWordN'.+    --     -- Values of a solvable type can consist of concrete values, symbolic     -- constants (placeholders for concrete values that can be assigned by a     -- solver to satisfy a formula), and complex symbolic formulas with@@ -176,13 +181,17 @@     SEq (..),     SymBoolOp,     SOrd (..),-    BVConcat (..),-    BVExtend (..),-    BVSelect (..),-    bvextract,-    SignedDivMod (..),-    UnsignedDivMod (..),-    SignedQuotRem (..),+    SomeBV (..),+    someBVZext',+    someBVSext',+    someBVExt',+    someBVSelect',+    someBVExtract,+    someBVExtract',+    SizedBV (..),+    sizedBVExtract,+    SafeDivision (..),+    SafeLinearArith (..),     SymIntegerOp,     Function (..), @@ -555,6 +564,7 @@     makeUnionWrapper,     makeUnionWrapper',     liftToMonadUnion,+    unionSize,      -- *** Merging @@ -596,6 +606,7 @@     pattern SingleU,     pattern IfU,     MonadUnion,+    MonadParallelUnion (..),     simpleMerge,     onUnion,     onUnion2,@@ -758,7 +769,7 @@     -- >>> res = mrgIf a (throwError Error1) (mrgIf b (return c) (throwError Error2)) :: ExceptT Error UnionM SymBool     -- >>> res     -- ExceptT {If (|| a (! b)) (If a (Left Error1) (Left Error2)) (Right c)}-    -- >>> solveExcept (UnboundedReasoning z3) (\case Left _ -> con False; Right x -> x) res+    -- >>> solveExcept (precise z3) (\case Left _ -> con False; Right x -> x) res     -- Right (Model {a -> False :: Bool, b -> True :: Bool, c -> True :: Bool})     --     -- The solver call in the above example means that we want the solver to@@ -782,6 +793,7 @@     TransformError (..),     symAssert,     symAssume,+    symAssertWith,     symAssertTransformableError,     symThrowTransformableError, @@ -827,9 +839,9 @@     -- >>> import Grisette.Backend.SBV     -- >>> let x = "x" :: SymInteger     -- >>> let y = "y" :: SymInteger-    -- >>> solve (UnboundedReasoning z3) (x + y ==~ 6 &&~ x - y ==~ 20)+    -- >>> solve (precise z3) (x + y ==~ 6 &&~ x - y ==~ 20)     -- Right (Model {x -> 13 :: Integer, y -> -7 :: Integer})-    -- >>> solve (UnboundedReasoning z3) (x + y ==~ 6 &&~ x - y ==~ 19)+    -- >>> solve (precise z3) (x + y ==~ 6 &&~ x - y ==~ 19)     -- Left Unsat     --     -- The first parameter of 'solve' is the solver configuration.@@ -848,7 +860,7 @@     -- evaluate symbolic values. The following code evaluates the product of     -- x and y under the solution of the equation system.     ---    -- >>> Right m <- solve (UnboundedReasoning z3) (x + y ==~ 6 &&~ x - y ==~ 20)+    -- >>> Right m <- solve (precise z3) (x + y ==~ 6 &&~ x - y ==~ 20)     -- >>> evaluateSym False m (x * y)     -- -91     --@@ -890,15 +902,6 @@     --   deriving (Mergeable, SEq) via (Default Error)     -- :}     ---    -- Then we define how to transform the generic errors to the error type.-    ---    -- >>> :{-    --   instance TransformError ArithException Error where-    --     transformError _ = Arith-    --   instance TransformError AssertionError Error where-    --     transformError _ = Assert-    -- :}-    --     -- Then we can perform the symbolic evaluation. The `divs` function throws     -- 'ArithException' when the divisor is 0, which would be transformed to     -- @Arith@, and the `symAssert` function would throw 'AssertionError' when@@ -906,14 +909,16 @@     --     -- >>> let x = "x" :: SymInteger     -- >>> let y = "y" :: SymInteger+    -- >>> assert = symAssertWith Assert+    -- >>> sdiv = safeDiv' (const Arith)     -- >>> :{     --   -- equivalent concrete program:     --   -- let x = x `div` y     --   -- if z > 0 then assert (x >= y) else return ()     --   res :: ExceptT Error UnionM ()     --   res = do-    --     z <- x `divs` y-    --     mrgIf (z >~ 0) (symAssert (x >=~ y)) (return ())+    --     z <- x `sdiv` y+    --     mrgIf (z >~ 0) (assert (x >=~ y)) (return ())     -- :}     --     -- Then we can ask the solver to find a counter-example that would lead to@@ -1010,6 +1015,7 @@ import Grisette.Core.BuiltinUnionWrappers import Grisette.Core.Control.Exception import Grisette.Core.Control.Monad.CBMCExcept+import Grisette.Core.Control.Monad.Class.MonadParallelUnion import Grisette.Core.Control.Monad.Union import Grisette.Core.Control.Monad.UnionM import Grisette.Core.Data.Class.BitVector@@ -1020,10 +1026,10 @@ import Grisette.Core.Data.Class.ExtractSymbolics import Grisette.Core.Data.Class.Function import Grisette.Core.Data.Class.GenSym-import Grisette.Core.Data.Class.Integer import Grisette.Core.Data.Class.Mergeable import Grisette.Core.Data.Class.ModelOps import Grisette.Core.Data.Class.SOrd+import Grisette.Core.Data.Class.SafeArith import Grisette.Core.Data.Class.SimpleMergeable import Grisette.Core.Data.Class.Solvable import Grisette.Core.Data.Class.Solver
+ src/Grisette/Core/Control/Monad/Class/MonadParallelUnion.hs view
@@ -0,0 +1,123 @@+{-# LANGUAGE LambdaCase #-}++-- |+-- Module      :   Grisette.Core.Control.Monad.Class.MonadParallelUnion+-- Copyright   :   (c) Sirui Lu 2023+-- License     :   BSD-3-Clause (see the LICENSE file)+--+-- Maintainer  :   siruilu@cs.washington.edu+-- Stability   :   Experimental+-- Portability :   GHC only+module Grisette.Core.Control.Monad.Class.MonadParallelUnion+  ( MonadParallelUnion (..),+  )+where++import Control.DeepSeq+import Control.Monad.Cont+import Control.Monad.Except+import Control.Monad.Identity+import qualified Control.Monad.RWS.Lazy as RWSLazy+import qualified Control.Monad.RWS.Strict as RWSStrict+import Control.Monad.Reader+import qualified Control.Monad.State.Lazy as StateLazy+import qualified Control.Monad.State.Strict as StateStrict+import Control.Monad.Trans.Maybe+import qualified Control.Monad.Writer.Lazy as WriterLazy+import qualified Control.Monad.Writer.Strict as WriterStrict+import Grisette.Core.Data.Class.Mergeable+import Grisette.Core.Data.Class.SimpleMergeable+import Grisette.Lib.Control.Monad++-- | Parallel union monad.+--+-- With the @QualifiedDo@ extension and the "Grisette.Qualified.ParallelUnionDo"+-- module, one can execute the paths in parallel and merge the results with:+--+-- > :set -XQualifiedDo -XOverloadedStrings+-- > import Grisette+-- > import qualified Grisette.Qualified.ParallelUnionDo as P+-- > P.do+-- >   x <- mrgIf "a" (return 1) (return 2) :: UnionM Int+-- >   return $ x + 1+-- >+-- > -- {If a 2 3}+class (UnionLike m, Monad m) => MonadParallelUnion m where+  parBindUnion :: (Mergeable b, NFData b) => m a -> (a -> m b) -> m b++instance (MonadParallelUnion m) => MonadParallelUnion (MaybeT m) where+  parBindUnion (MaybeT x) f =+    MaybeT $+      x `parBindUnion` \case+        Nothing -> return Nothing+        Just x'' -> runMaybeT $ f x''+  {-# INLINE parBindUnion #-}++instance (MonadParallelUnion m, Mergeable e, NFData e) => MonadParallelUnion (ExceptT e m) where+  parBindUnion (ExceptT x) f =+    ExceptT $+      x `parBindUnion` \case+        Left e -> return $ Left e+        Right x'' -> runExceptT $ f x''+  {-# INLINE parBindUnion #-}++instance (MonadParallelUnion m, Mergeable s, NFData s) => MonadParallelUnion (StateLazy.StateT s m) where+  parBindUnion (StateLazy.StateT x) f = StateLazy.StateT $ \s ->+    x s `parBindUnion` \case+      ~(a, s') -> StateLazy.runStateT (f a) s'+  {-# INLINE parBindUnion #-}++instance (MonadParallelUnion m, Mergeable s, NFData s) => MonadParallelUnion (StateStrict.StateT s m) where+  parBindUnion (StateStrict.StateT x) f = StateStrict.StateT $ \s ->+    x s `parBindUnion` \case+      (a, s') -> StateStrict.runStateT (f a) s'+  {-# INLINE parBindUnion #-}++instance (MonadParallelUnion m, Mergeable s, Monoid s, NFData s) => MonadParallelUnion (WriterLazy.WriterT s m) where+  parBindUnion (WriterLazy.WriterT x) f =+    WriterLazy.WriterT $+      x `parBindUnion` \case+        ~(a, w) ->+          WriterLazy.runWriterT (f a) `parBindUnion` \case+            ~(b, w') -> return (b, w <> w')+  {-# INLINE parBindUnion #-}++instance (MonadParallelUnion m, Mergeable s, Monoid s, NFData s) => MonadParallelUnion (WriterStrict.WriterT s m) where+  parBindUnion (WriterStrict.WriterT x) f =+    WriterStrict.WriterT $+      x `parBindUnion` \case+        (a, w) ->+          WriterStrict.runWriterT (f a) `parBindUnion` \case+            (b, w') -> return (b, w <> w')+  {-# INLINE parBindUnion #-}++instance (MonadParallelUnion m, Mergeable a, NFData a) => MonadParallelUnion (ReaderT a m) where+  parBindUnion (ReaderT x) f = ReaderT $ \a ->+    x a `parBindUnion` \a' -> runReaderT (f a') a+  {-# INLINE parBindUnion #-}++instance (MonadParallelUnion m) => MonadParallelUnion (IdentityT m) where+  parBindUnion (IdentityT x) f = IdentityT $ x `parBindUnion` (merge . runIdentityT . f)+  {-# INLINE parBindUnion #-}++instance+  (MonadParallelUnion m, Mergeable s, Mergeable r, Mergeable w, Monoid w, NFData r, NFData w, NFData s) =>+  MonadParallelUnion (RWSStrict.RWST r w s m)+  where+  parBindUnion m k = RWSStrict.RWST $ \r s ->+    RWSStrict.runRWST m r s `parBindUnion` \case+      (a, s', w) ->+        RWSStrict.runRWST (k a) r s' `parBindUnion` \case+          (b, s'', w') -> return (b, s'', w <> w')+  {-# INLINE parBindUnion #-}++instance+  (MonadParallelUnion m, Mergeable s, Mergeable r, Mergeable w, Monoid w, NFData r, NFData w, NFData s) =>+  MonadParallelUnion (RWSLazy.RWST r w s m)+  where+  parBindUnion m k = RWSLazy.RWST $ \r s ->+    RWSLazy.runRWST m r s `parBindUnion` \case+      ~(a, s', w) ->+        RWSLazy.runRWST (k a) r s' `parBindUnion` \case+          ~(b, s'', w') -> return (b, s'', w <> w')+  {-# INLINE parBindUnion #-}
src/Grisette/Core/Control/Monad/Union.hs view
@@ -25,5 +25,5 @@ -- >>> import Grisette.Core -- >>> import Grisette.IR.SymPrim --- | Class for monads that support union-like operations and 'Mergeable' knowledge propagation.+-- | Class for monads that support union-like operations and 'Grisette.Core.Data.Class.Mergeable' knowledge propagation. type MonadUnion u = (UnionLike u, Monad u)
src/Grisette/Core/Control/Monad/UnionM.hs view
@@ -1,4 +1,7 @@ {-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# HLINT ignore "Use <&>" #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-}@@ -11,10 +14,7 @@ {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}-{-# OPTIONS_GHC -fno-cse #-} -{-# HLINT ignore "Use <&>" #-}- -- {-# OPTIONS_GHC -fno-full-laziness #-}  -- |@@ -33,19 +33,24 @@     isMerged,     (#~),     IsConcrete,+    unionSize,   ) where  import Control.DeepSeq import Control.Monad.Identity (Identity (..))+import Control.Parallel.Strategies import Data.Functor.Classes import qualified Data.HashMap.Lazy as HML import Data.Hashable import Data.IORef import Data.String import GHC.IO hiding (evaluate)+import GHC.TypeNats import Grisette.Core.Control.Monad.CBMCExcept+import Grisette.Core.Control.Monad.Class.MonadParallelUnion import Grisette.Core.Control.Monad.Union+import Grisette.Core.Data.BV import Grisette.Core.Data.Class.Bool import Grisette.Core.Data.Class.Evaluate import Grisette.Core.Data.Class.ExtractSymbolics@@ -60,6 +65,9 @@ import Grisette.Core.Data.Class.ToCon import Grisette.Core.Data.Class.ToSym import Grisette.Core.Data.Union+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term+import Grisette.IR.SymPrim.Data.SymPrim+import Grisette.IR.SymPrim.Data.TabularFun import Language.Haskell.TH.Syntax import Language.Haskell.TH.Syntax.Compat (unTypeSplice) @@ -172,8 +180,6 @@ data UnionM a where   -- | 'UnionM' with no 'Mergeable' knowledge.   UAny ::-    -- | (Possibly) cached merging result.-    IORef (Either (Union a) (UnionM a)) ->     -- | Original 'Union'.     Union a ->     UnionM a@@ -189,18 +195,14 @@   rnf = rnf1  instance NFData1 UnionM where-  liftRnf _a (UAny i m) = rnf i `seq` liftRnf _a m+  liftRnf _a (UAny m) = liftRnf _a m   liftRnf _a (UMrg _ m) = liftRnf _a m  instance (Lift a) => Lift (UnionM a) where-  liftTyped (UAny _ v) = [||freshUAny v||]-  liftTyped (UMrg _ v) = [||freshUAny v||]+  liftTyped (UAny v) = [||UAny v||]+  liftTyped (UMrg _ v) = [||UAny v||]   lift = unTypeSplice . liftTyped -freshUAny :: Union a -> UnionM a-freshUAny v = UAny (unsafeDupablePerformIO $ newIORef $ Left v) v-{-# NOINLINE freshUAny #-}- instance (Show a) => (Show (UnionM a)) where   showsPrec = showsPrec1 @@ -228,7 +230,7 @@ wrapBracket l r p = showChar l . p . showChar r  instance Show1 UnionM where-  liftShowsPrec sp sl i (UAny _ a) =+  liftShowsPrec sp sl i (UAny a) =     wrapBracket '<' '>'       . liftShowsPrecUnion sp sl 0       $ a@@ -239,7 +241,7 @@  -- | Extract the underlying Union. May be unmerged. underlyingUnion :: UnionM a -> Union a-underlyingUnion (UAny _ a) = a+underlyingUnion (UAny a) = a underlyingUnion (UMrg _ a) = a {-# INLINE underlyingUnion #-} @@ -252,8 +254,8 @@ instance UnionPrjOp UnionM where   singleView = singleView . underlyingUnion   {-# INLINE singleView #-}-  ifView (UAny _ u) = case ifView u of-    Just (c, t, f) -> Just (c, freshUAny t, freshUAny f)+  ifView (UAny u) = case ifView u of+    Just (c, t, f) -> Just (c, UAny t, UAny f)     Nothing -> Nothing   ifView (UMrg m u) = case ifView u of     Just (c, t, f) -> Just (c, UMrg m t, UMrg m f)@@ -282,6 +284,24 @@   a >>= f = bindUnion (underlyingUnion a) f   {-# INLINE (>>=) #-} +parBindUnion'' :: (Mergeable b, NFData b) => Union a -> (a -> UnionM b) -> UnionM b+parBindUnion'' (Single a) f = merge $ f a+parBindUnion'' u f = parBindUnion' u f++parBindUnion' :: (Mergeable b, NFData b) => Union a -> (a -> UnionM b) -> UnionM b+parBindUnion' (Single a') f' = f' a'+parBindUnion' (If _ _ cond ifTrue ifFalse) f' = runEval $ do+  l <- rpar $ force $ parBindUnion' ifTrue f'+  r <- rpar $ force $ parBindUnion' ifFalse f'+  l' <- rseq l+  r' <- rseq r+  rseq $ mrgIf cond l' r'+{-# INLINE parBindUnion' #-}++instance MonadParallelUnion UnionM where+  parBindUnion = parBindUnion'' . underlyingUnion+  {-# INLINE parBindUnion #-}+ instance (Mergeable a) => Mergeable (UnionM a) where   rootStrategy = SimpleStrategy $ \cond t f -> unionIf cond t f >>= mrgSingle   {-# INLINE rootStrategy #-}@@ -300,21 +320,16 @@  instance UnionLike UnionM where   mergeWithStrategy _ m@(UMrg _ _) = m-  mergeWithStrategy s (UAny ref u) = unsafeDupablePerformIO $-    atomicModifyIORef' ref $ \case-      x@(Right r) -> (x, r)-      Left _ -> (Right r, r)-        where-          !r = UMrg s $ fullReconstruct s u -- m >>= mrgSingle-  {-# NOINLINE mergeWithStrategy #-}+  mergeWithStrategy s (UAny u) = UMrg s $ fullReconstruct s u+  {-# INLINE mergeWithStrategy #-}   mrgIfWithStrategy s (Con c) l r = if c then mergeWithStrategy s l else mergeWithStrategy s r   mrgIfWithStrategy s cond l r =     mergeWithStrategy s $ unionIf cond l r   {-# INLINE mrgIfWithStrategy #-}-  single = freshUAny . single+  single = UAny . single   {-# INLINE single #-}-  unionIf cond (UAny _ a) (UAny _ b) = freshUAny $ unionIf cond a b-  unionIf cond (UMrg m a) (UAny _ b) = UMrg m $ ifWithStrategy m cond a b+  unionIf cond (UAny a) (UAny b) = UAny $ unionIf cond a b+  unionIf cond (UMrg m a) (UAny b) = UMrg m $ ifWithStrategy m cond a b   unionIf cond a (UMrg m b) = UMrg m $ ifWithStrategy m cond (underlyingUnion a) b   {-# INLINE unionIf #-} @@ -353,19 +368,46 @@     y1 <- y     x1 `symCompare` y1 -instance {-# OVERLAPPABLE #-} (ToSym a b, Mergeable b) => ToSym a (UnionM b) where+instance {-# INCOHERENT #-} (ToSym a b, Mergeable b) => ToSym a (UnionM b) where   toSym = mrgSingle . toSym -instance {-# OVERLAPPING #-} (ToSym a b, Mergeable b) => ToSym (UnionM a) (UnionM b) where+instance (ToSym a b, Mergeable b) => ToSym (UnionM a) (UnionM b) where   toSym = merge . fmap toSym -instance {-# OVERLAPPABLE #-} (ToCon a b) => ToCon (UnionM a) b where+#define TO_SYM_FROM_UNION_CON_SIMPLE(contype, symtype) \+instance ToSym (UnionM contype) symtype where \+  toSym = simpleMerge . fmap con++#define TO_SYM_FROM_UNION_CON_BV(contype, symtype) \+instance (KnownNat n, 1 <= n) => ToSym (UnionM (contype n)) (symtype n) where \+  toSym = simpleMerge . fmap con++#define TO_SYM_FROM_UNION_CON_FUN(conop, symop) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => ToSym (UnionM (conop ca cb)) (symop sa sb) where \+  toSym = simpleMerge . fmap con++#define TO_SYM_FROM_UNION_CON_BV_SOME(contype, symtype) \+instance ToSym (UnionM contype) symtype where \+  toSym = simpleMerge . fmap (toSym :: contype -> symtype)++#if 1+TO_SYM_FROM_UNION_CON_SIMPLE(Bool, SymBool)+TO_SYM_FROM_UNION_CON_SIMPLE(Integer, SymInteger)+TO_SYM_FROM_UNION_CON_BV(IntN, SymIntN)+TO_SYM_FROM_UNION_CON_BV(WordN, SymWordN)+TO_SYM_FROM_UNION_CON_FUN((=->), (=~>))+TO_SYM_FROM_UNION_CON_FUN((-->), (-~>))+TO_SYM_FROM_UNION_CON_BV_SOME(SomeIntN, SomeSymIntN)+TO_SYM_FROM_UNION_CON_BV_SOME(SomeWordN, SomeSymWordN)+#endif++instance {-# INCOHERENT #-} (ToCon a b) => ToCon (UnionM a) b where   toCon v = go $ underlyingUnion v     where       go (Single x) = toCon x       go _ = Nothing -instance {-# OVERLAPPING #-} (ToCon a b, Mergeable b) => ToCon (UnionM a) (UnionM b) where+instance (ToCon a b, Mergeable b) => ToCon (UnionM a) (UnionM b) where   toCon v = go $ underlyingUnion v     where       go (Single x) = case toCon x of@@ -387,6 +429,7 @@           (go t)           (go f) +{- instance (Mergeable a, SubstituteSym a) => SubstituteSym (UnionM a) where   substituteSym sym val x = go $ underlyingUnion x     where@@ -397,6 +440,7 @@           (substituteSym sym val cond)           (go t)           (go f)+          -}  instance   (ExtractSymbolics a) =>@@ -408,11 +452,11 @@       go (If _ _ cond t f) = extractSymbolics cond <> go t <> go f  instance (Hashable a) => Hashable (UnionM a) where-  s `hashWithSalt` (UAny _ u) = s `hashWithSalt` (0 :: Int) `hashWithSalt` u+  s `hashWithSalt` (UAny u) = s `hashWithSalt` (0 :: Int) `hashWithSalt` u   s `hashWithSalt` (UMrg _ u) = s `hashWithSalt` (1 :: Int) `hashWithSalt` u  instance (Eq a) => Eq (UnionM a) where-  UAny _ l == UAny _ r = l == r+  UAny l == UAny r = l == r   UMrg _ l == UMrg _ r = l == r   _ == _ = False @@ -481,22 +525,6 @@ instance (IsString a, Mergeable a) => IsString (UnionM a) where   fromString = mrgSingle . fromString -{--foldMapUnion :: (Monoid m) => (a -> m) -> Union a -> m-foldMapUnion f (Single v) = f v-foldMapUnion f (If _ _ _ l r) = foldMapUnion f l <> foldMapUnion f r--instance Foldable UnionM where-  foldMap f u = foldMapUnion f (underlyingUnion u)--sequenceAUnion :: (Applicative m, SymBoolOp bool) => Union (m a) -> m (Union a)-sequenceAUnion (Single v) = single <$> v-sequenceAUnion (If _ _ cond l r) = unionIf cond <$> sequenceAUnion l <*> sequenceAUnion r--instance  Traversable UnionM where-  sequenceA u = freshUAny <$> sequenceAUnion (underlyingUnion u)-  -}- -- GenSym instance (GenSym spec a, Mergeable a) => GenSym spec (UnionM a) @@ -514,6 +542,10 @@       go (Single x) = fresh x       go (If _ _ _ t f) = mrgIf <$> simpleFresh () <*> go t <*> go f +-- AllSyms+instance AllSyms a => AllSyms (UnionM a) where+  allSymsS = allSymsS . underlyingUnion+ -- Concrete Key HashMaps  -- | Tag for concrete types.@@ -554,3 +586,18 @@  instance UnionWithExcept (UnionM (CBMCEither e v)) UnionM e v where   extractUnionExcept = fmap runCBMCEither++-- | The size of a union is defined as the number of branches.+-- For example,+--+-- >>> unionSize (single True)+-- 1+-- >>> unionSize (mrgIf "a" (single 1) (single 2) :: UnionM Integer)+-- 2+-- >>> unionSize (choose [1..7] "a" :: UnionM Integer)+-- 7+unionSize :: UnionM a -> Int+unionSize = unionSize' . underlyingUnion+  where+    unionSize' (Single _) = 1+    unionSize' (If _ _ _ l r) = unionSize' l + unionSize' r
src/Grisette/Core/Control/Monad/UnionM.hs-boot view
@@ -13,8 +13,6 @@ data UnionM a where   -- | 'UnionM' with no 'Mergeable' knowledge.   UAny ::-    -- | (Possibly) cached merging result.-    IORef (Either (Union a) (UnionM a)) ->     -- | Original 'Union'.     Union a ->     UnionM a
+ src/Grisette/Core/Data/BV.hs view
@@ -0,0 +1,691 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}+{-# LANGUAGE DerivingVia #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskellQuotes #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -funbox-strict-fields #-}++-- |+-- Module      :   Grisette.Core.Data.BV+-- Copyright   :   (c) Sirui Lu 2021-2023+-- License     :   BSD-3-Clause (see the LICENSE file)+--+-- Maintainer  :   siruilu@cs.washington.edu+-- Stability   :   Experimental+-- Portability :   GHC only+module Grisette.Core.Data.BV+  ( BitwidthMismatch (..),+    IntN (..),+    WordN (..),+    SomeIntN (..),+    SomeWordN (..),+    unarySomeIntN,+    unarySomeIntNR1,+    binSomeIntN,+    binSomeIntNR1,+    binSomeIntNR2,+    unarySomeWordN,+    unarySomeWordNR1,+    binSomeWordN,+    binSomeWordNR1,+    binSomeWordNR2,+  )+where++import Control.DeepSeq+import Control.Exception+import Data.Bits+import Data.CallStack+import Data.Hashable+import Data.Proxy+import Data.Typeable+import GHC.Enum+import GHC.Generics+import GHC.Read+import GHC.Real+import GHC.TypeNats+import Grisette.Core.Data.Class.BitVector+import Grisette.Utils.Parameterized+import Language.Haskell.TH.Syntax+import Numeric+import Text.Read+import qualified Text.Read.Lex as L++data BitwidthMismatch = BitwidthMismatch+  deriving (Show, Eq, Ord, Generic)++instance Exception BitwidthMismatch where+  displayException BitwidthMismatch = "Bit width does not match"++-- |+-- Symbolic unsigned bit vectors.+newtype WordN (n :: Nat) = WordN {unWordN :: Integer}+  deriving (Eq, Ord, Generic, Lift, Hashable, NFData)++-- |+-- A non-indexed version of 'WordN'.+data SomeWordN where+  SomeWordN :: (KnownNat n, 1 <= n) => WordN n -> SomeWordN++unarySomeWordN :: HasCallStack => (forall n. (KnownNat n, 1 <= n) => WordN n -> r) -> SomeWordN -> r+unarySomeWordN op (SomeWordN (w :: WordN w)) = op w+{-# INLINE unarySomeWordN #-}++unarySomeWordNR1 :: HasCallStack => (forall n. (KnownNat n, 1 <= n) => WordN n -> WordN n) -> SomeWordN -> SomeWordN+unarySomeWordNR1 op (SomeWordN (w :: WordN w)) = SomeWordN $ op w+{-# INLINE unarySomeWordNR1 #-}++binSomeWordN :: HasCallStack => (forall n. (KnownNat n, 1 <= n) => WordN n -> WordN n -> r) -> SomeWordN -> SomeWordN -> r+binSomeWordN op (SomeWordN (l :: WordN l)) (SomeWordN (r :: WordN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl -> op l r+    Nothing -> throw BitwidthMismatch+{-# INLINE binSomeWordN #-}++binSomeWordNR1 :: HasCallStack => (forall n. (KnownNat n, 1 <= n) => WordN n -> WordN n -> WordN n) -> SomeWordN -> SomeWordN -> SomeWordN+binSomeWordNR1 op (SomeWordN (l :: WordN l)) (SomeWordN (r :: WordN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl -> SomeWordN $ op l r+    Nothing -> throw BitwidthMismatch+{-# INLINE binSomeWordNR1 #-}++binSomeWordNR2 :: HasCallStack => (forall n. (KnownNat n, 1 <= n) => WordN n -> WordN n -> (WordN n, WordN n)) -> SomeWordN -> SomeWordN -> (SomeWordN, SomeWordN)+binSomeWordNR2 op (SomeWordN (l :: WordN l)) (SomeWordN (r :: WordN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl ->+      case op l r of+        (a, b) -> (SomeWordN a, SomeWordN b)+    Nothing -> throw BitwidthMismatch+{-# INLINE binSomeWordNR2 #-}++instance Eq SomeWordN where+  (==) = binSomeWordN (==)+  {-# INLINE (==) #-}+  (/=) = binSomeWordN (/=)+  {-# INLINE (/=) #-}++instance Ord SomeWordN where+  (<=) = binSomeWordN (<=)+  {-# INLINE (<=) #-}+  (<) = binSomeWordN (<)+  {-# INLINE (<) #-}+  (>=) = binSomeWordN (>=)+  {-# INLINE (>=) #-}+  (>) = binSomeWordN (>)+  {-# INLINE (>) #-}+  max = binSomeWordNR1 max+  {-# INLINE max #-}+  min = binSomeWordNR1 min+  {-# INLINE min #-}+  compare = binSomeWordN compare+  {-# INLINE compare #-}++instance Lift SomeWordN where+  liftTyped (SomeWordN w) = [||SomeWordN w||]++instance Hashable SomeWordN where+  s `hashWithSalt` (SomeWordN (w :: WordN n)) = s `hashWithSalt` natVal (Proxy @n) `hashWithSalt` w++instance NFData SomeWordN where+  rnf (SomeWordN w) = rnf w++instance (KnownNat n, 1 <= n) => Show (WordN n) where+  show (WordN w) = if (bitwidth `mod` 4) == 0 then hexRepPre ++ hexRep else binRepPre ++ binRep+    where+      bitwidth = natVal (Proxy :: Proxy n)+      hexRepPre = "0x" ++ replicate (fromIntegral (bitwidth `div` 4) - length hexRep) '0'+      hexRep = showHex w ""+      binRepPre = "0b" ++ replicate (fromIntegral bitwidth - length binRep) '0'+      binRep = showIntAtBase 2 (\x -> if x == 0 then '0' else '1') w ""++convertInt :: Num a => L.Lexeme -> ReadPrec a+convertInt (L.Number n)+  | Just i <- L.numberToInteger n = return (fromInteger i)+convertInt _ = pfail++instance (KnownNat n, 1 <= n) => Read (WordN n) where+  readPrec = readNumber convertInt+  readListPrec = readListPrecDefault+  readList = readListDefault++instance Show SomeWordN where+  show (SomeWordN w) = show w++-- |+-- Symbolic signed bit vectors.+newtype IntN (n :: Nat) = IntN {unIntN :: Integer}+  deriving (Eq, Generic, Lift, Hashable, NFData)++-- |+-- A non-indexed version of 'IntN'.+data SomeIntN where+  SomeIntN :: (KnownNat n, 1 <= n) => IntN n -> SomeIntN++unarySomeIntN :: (forall n. (KnownNat n, 1 <= n) => IntN n -> r) -> SomeIntN -> r+unarySomeIntN op (SomeIntN (w :: IntN w)) = op w+{-# INLINE unarySomeIntN #-}++unarySomeIntNR1 :: (forall n. (KnownNat n, 1 <= n) => IntN n -> IntN n) -> SomeIntN -> SomeIntN+unarySomeIntNR1 op (SomeIntN (w :: IntN w)) = SomeIntN $ op w+{-# INLINE unarySomeIntNR1 #-}++binSomeIntN :: (forall n. (KnownNat n, 1 <= n) => IntN n -> IntN n -> r) -> SomeIntN -> SomeIntN -> r+binSomeIntN op (SomeIntN (l :: IntN l)) (SomeIntN (r :: IntN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl -> op l r+    Nothing -> throw BitwidthMismatch+{-# INLINE binSomeIntN #-}++binSomeIntNR1 :: (forall n. (KnownNat n, 1 <= n) => IntN n -> IntN n -> IntN n) -> SomeIntN -> SomeIntN -> SomeIntN+binSomeIntNR1 op (SomeIntN (l :: IntN l)) (SomeIntN (r :: IntN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl -> SomeIntN $ op l r+    Nothing -> throw BitwidthMismatch+{-# INLINE binSomeIntNR1 #-}++binSomeIntNR2 :: (forall n. (KnownNat n, 1 <= n) => IntN n -> IntN n -> (IntN n, IntN n)) -> SomeIntN -> SomeIntN -> (SomeIntN, SomeIntN)+binSomeIntNR2 op (SomeIntN (l :: IntN l)) (SomeIntN (r :: IntN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl ->+      case op l r of+        (a, b) -> (SomeIntN a, SomeIntN b)+    Nothing -> throw BitwidthMismatch+{-# INLINE binSomeIntNR2 #-}++instance Eq SomeIntN where+  (==) = binSomeIntN (==)+  {-# INLINE (==) #-}+  (/=) = binSomeIntN (/=)+  {-# INLINE (/=) #-}++instance Ord SomeIntN where+  (<=) = binSomeIntN (<=)+  {-# INLINE (<=) #-}+  (<) = binSomeIntN (<)+  {-# INLINE (<) #-}+  (>=) = binSomeIntN (>=)+  {-# INLINE (>=) #-}+  (>) = binSomeIntN (>)+  {-# INLINE (>) #-}+  max = binSomeIntNR1 max+  {-# INLINE max #-}+  min = binSomeIntNR1 min+  {-# INLINE min #-}+  compare = binSomeIntN compare+  {-# INLINE compare #-}++instance Lift SomeIntN where+  liftTyped (SomeIntN w) = [||SomeIntN w||]++instance Hashable SomeIntN where+  s `hashWithSalt` (SomeIntN (w :: IntN n)) = s `hashWithSalt` natVal (Proxy @n) `hashWithSalt` w++instance NFData SomeIntN where+  rnf (SomeIntN w) = rnf w++instance (KnownNat n, 1 <= n) => Show (IntN n) where+  show (IntN w) = if (bitwidth `mod` 4) == 0 then hexRepPre ++ hexRep else binRepPre ++ binRep+    where+      bitwidth = natVal (Proxy :: Proxy n)+      hexRepPre = "0x" ++ replicate (fromIntegral (bitwidth `div` 4) - length hexRep) '0'+      hexRep = showHex w ""+      binRepPre = "0b" ++ replicate (fromIntegral bitwidth - length binRep) '0'+      binRep = showIntAtBase 2 (\x -> if x == 0 then '0' else '1') w ""++instance (KnownNat n, 1 <= n) => Read (IntN n) where+  readPrec = readNumber convertInt+  readListPrec = readListPrecDefault+  readList = readListDefault++instance Show SomeIntN where+  show (SomeIntN w) = show w++instance (KnownNat n, 1 <= n) => Bits (WordN n) where+  WordN a .&. WordN b = WordN (a .&. b)+  WordN a .|. WordN b = WordN (a .|. b)+  WordN a `xor` WordN b = WordN (a `xor` b)+  complement a = maxBound `xor` a++  -- shift use default implementation+  -- rotate use default implementation+  zeroBits = WordN 0+  bit i+    | i < 0 || i >= fromIntegral (natVal (Proxy :: Proxy n)) = zeroBits+    | otherwise = WordN (bit i)++  -- setBit use default implementation+  clearBit (WordN a) i = WordN (clearBit a i)++  -- complementBit use default implementation+  testBit (WordN a) = testBit a+  bitSizeMaybe _ = Just $ fromIntegral (natVal (Proxy :: Proxy n))+  bitSize _ = fromIntegral (natVal (Proxy :: Proxy n))+  isSigned _ = False+  shiftL (WordN a) i = WordN (a `shiftL` i) .&. maxBound++  -- unsafeShiftL use default implementation+  shiftR (WordN a) i = WordN (a `shiftR` i)++  -- unsafeShiftR use default implementation+  rotateL a 0 = a+  rotateL (WordN a) k+    | k >= n = rotateL (WordN a) (k `mod` n)+    | otherwise = WordN $ l + h+    where+      n = fromIntegral $ natVal (Proxy :: Proxy n)+      s = n - k+      l = a `shiftR` s+      h = (a - (l `shiftL` s)) `shiftL` k+  rotateR a 0 = a+  rotateR (WordN a) k+    | k >= n = rotateR (WordN a) (k `mod` n)+    | otherwise = WordN $ l + h+    where+      n = fromIntegral $ natVal (Proxy :: Proxy n)+      s = n - k+      l = a `shiftR` k+      h = (a - (l `shiftL` k)) `shiftL` s+  popCount (WordN n) = popCount n++instance Bits SomeWordN where+  (.&.) = binSomeWordNR1 (.&.)+  (.|.) = binSomeWordNR1 (.|.)+  xor = binSomeWordNR1 xor+  complement = unarySomeWordNR1 complement+  shift s i = unarySomeWordNR1 (`shift` i) s+  rotate s i = unarySomeWordNR1 (`rotate` i) s+  zeroBits = error "zeroBits is not defined for SomeWordN as no bitwidth is known"+  bit = error "bit is not defined for SomeWordN as no bitwidth is known"+  setBit s i = unarySomeWordNR1 (`setBit` i) s+  clearBit s i = unarySomeWordNR1 (`clearBit` i) s+  complementBit s i = unarySomeWordNR1 (`complementBit` i) s+  testBit s i = unarySomeWordN (`testBit` i) s+  bitSizeMaybe (SomeWordN (n :: WordN n)) = Just $ fromIntegral $ natVal n+  bitSize (SomeWordN (n :: WordN n)) = fromIntegral $ natVal n+  isSigned _ = False+  shiftL s i = unarySomeWordNR1 (`shiftL` i) s+  unsafeShiftL s i = unarySomeWordNR1 (`unsafeShiftL` i) s+  shiftR s i = unarySomeWordNR1 (`shiftR` i) s+  unsafeShiftR s i = unarySomeWordNR1 (`unsafeShiftR` i) s+  rotateL s i = unarySomeWordNR1 (`rotateL` i) s+  rotateR s i = unarySomeWordNR1 (`rotateR` i) s+  popCount = unarySomeWordN popCount++instance (KnownNat n, 1 <= n) => FiniteBits (WordN n) where+  finiteBitSize _ = fromIntegral (natVal (Proxy :: Proxy n))++instance FiniteBits SomeWordN where+  finiteBitSize (SomeWordN (n :: WordN n)) = fromIntegral $ natVal n+  countLeadingZeros = unarySomeWordN countLeadingZeros+  countTrailingZeros = unarySomeWordN countTrailingZeros++instance (KnownNat n, 1 <= n) => Bounded (WordN n) where+  maxBound = WordN ((1 `shiftL` fromIntegral (natVal (Proxy :: Proxy n))) - 1)+  minBound = WordN 0++instance (KnownNat n, 1 <= n) => Enum (WordN n) where+  succ x+    | x /= maxBound = x + 1+    | otherwise = succError $ "WordN " ++ show (natVal (Proxy :: Proxy n))+  pred x+    | x /= minBound = x - 1+    | otherwise = predError $ "WordN " ++ show (natVal (Proxy :: Proxy n))+  toEnum i+    | i >= 0 && toInteger i <= toInteger (maxBound :: WordN n) = WordN (toInteger i)+    | otherwise = toEnumError ("WordN " ++ show (natVal (Proxy :: Proxy n))) i (minBound :: WordN n, maxBound :: WordN n)+  fromEnum (WordN n) = fromEnum n+  enumFrom = boundedEnumFrom+  {-# INLINE enumFrom #-}+  enumFromThen = boundedEnumFromThen+  {-# INLINE enumFromThen #-}++instance Enum SomeWordN where+  toEnum = error "SomeWordN is not really a Enum type as the bit width is unknown, please consider using WordN instead"+  fromEnum = error "SomeWordN is not really a Enum type as the bit width is unknown, please consider using WordN instead"++instance (KnownNat n, 1 <= n) => Real (WordN n) where+  toRational (WordN n) = n % 1++instance Real SomeWordN where+  toRational = unarySomeWordN toRational++instance (KnownNat n, 1 <= n) => Integral (WordN n) where+  quot (WordN x) (WordN y) = WordN (x `quot` y)+  rem (WordN x) (WordN y) = WordN (x `rem` y)+  quotRem (WordN x) (WordN y) = case quotRem x y of+    (q, r) -> (WordN q, WordN r)+  div = quot+  mod = rem+  divMod = quotRem+  toInteger (WordN n) = n++instance Integral SomeWordN where+  quot = binSomeWordNR1 quot+  rem = binSomeWordNR1 rem+  quotRem = binSomeWordNR2 quotRem+  div = binSomeWordNR1 div+  mod = binSomeWordNR1 mod+  divMod = binSomeWordNR2 divMod+  toInteger = unarySomeWordN toInteger++instance (KnownNat n, 1 <= n) => Num (WordN n) where+  WordN x + WordN y = WordN (x + y) .&. maxBound+  WordN x * WordN y = WordN (x * y) .&. maxBound+  WordN x - WordN y+    | x >= y = WordN (x - y)+    | otherwise = WordN ((1 `shiftL` fromIntegral (natVal (Proxy :: Proxy n))) + x - y)+  negate (WordN 0) = WordN 0+  negate a = complement a + WordN 1+  abs x = x+  signum (WordN 0) = 0+  signum _ = 1+  fromInteger !x+    | x == 0 = WordN 0+    | x > 0 = WordN (x .&. unWordN (maxBound :: WordN n))+    | otherwise = -fromInteger (-x)++instance Num SomeWordN where+  (+) = binSomeWordNR1 (+)+  (-) = binSomeWordNR1 (-)+  (*) = binSomeWordNR1 (*)+  negate = unarySomeWordNR1 negate+  abs = unarySomeWordNR1 abs+  signum = unarySomeWordNR1 signum+  fromInteger = error "fromInteger is not defined for SomeWordN as no bitwidth is known"++minusOneIntN :: forall proxy n. KnownNat n => proxy n -> IntN n+minusOneIntN _ = IntN (1 `shiftL` fromIntegral (natVal (Proxy :: Proxy n)) - 1)++instance (KnownNat n, 1 <= n) => Bits (IntN n) where+  IntN a .&. IntN b = IntN (a .&. b)+  IntN a .|. IntN b = IntN (a .|. b)+  IntN a `xor` IntN b = IntN (a `xor` b)+  complement a = minusOneIntN (Proxy :: Proxy n) `xor` a++  -- shift use default implementation+  -- rotate use default implementation+  zeroBits = IntN 0+  bit i = IntN (unWordN (bit i :: WordN n))++  -- setBit use default implementation+  clearBit (IntN a) i = IntN (clearBit a i)++  -- complementBit use default implementation+  testBit (IntN a) = testBit a+  bitSizeMaybe _ = Just $ fromIntegral (natVal (Proxy :: Proxy n))+  bitSize _ = fromIntegral (natVal (Proxy :: Proxy n))+  isSigned _ = True++  shiftL (IntN a) i = IntN (unWordN $ (WordN a :: WordN n) `shiftL` i)++  -- unsafeShiftL use default implementation+  shiftR i 0 = i+  shiftR (IntN i) k+    | k >= n = if b then IntN (maxi - 1) else IntN 0+    | otherwise = if b then IntN (maxi - noi + (i `shiftR` k)) else IntN (i `shiftR` k)+    where+      b = testBit i (n - 1)+      n = fromIntegral $ natVal (Proxy :: Proxy n)+      maxi = (1 :: Integer) `shiftL` n+      noi = (1 :: Integer) `shiftL` (n - k)++  -- unsafeShiftR use default implementation+  rotateL (IntN i) k = IntN $ unWordN $ rotateL (WordN i :: WordN n) k+  rotateR (IntN i) k = IntN $ unWordN $ rotateR (WordN i :: WordN n) k+  popCount (IntN i) = popCount i++instance Bits SomeIntN where+  (.&.) = binSomeIntNR1 (.&.)+  (.|.) = binSomeIntNR1 (.|.)+  xor = binSomeIntNR1 xor+  complement = unarySomeIntNR1 complement+  shift s i = unarySomeIntNR1 (`shift` i) s+  rotate s i = unarySomeIntNR1 (`rotate` i) s+  zeroBits = error "zeroBits is not defined for SomeIntN as no bitwidth is known"+  bit = error "bit is not defined for SomeIntN as no bitwidth is known"+  setBit s i = unarySomeIntNR1 (`setBit` i) s+  clearBit s i = unarySomeIntNR1 (`clearBit` i) s+  complementBit s i = unarySomeIntNR1 (`complementBit` i) s+  testBit s i = unarySomeIntN (`testBit` i) s+  bitSizeMaybe (SomeIntN (n :: IntN n)) = Just $ fromIntegral $ natVal n+  bitSize (SomeIntN (n :: IntN n)) = fromIntegral $ natVal n+  isSigned _ = False+  shiftL s i = unarySomeIntNR1 (`shiftL` i) s+  unsafeShiftL s i = unarySomeIntNR1 (`unsafeShiftL` i) s+  shiftR s i = unarySomeIntNR1 (`shiftR` i) s+  unsafeShiftR s i = unarySomeIntNR1 (`unsafeShiftR` i) s+  rotateL s i = unarySomeIntNR1 (`rotateL` i) s+  rotateR s i = unarySomeIntNR1 (`rotateR` i) s+  popCount = unarySomeIntN popCount++instance (KnownNat n, 1 <= n) => FiniteBits (IntN n) where+  finiteBitSize _ = fromIntegral (natVal (Proxy :: Proxy n))++instance FiniteBits SomeIntN where+  finiteBitSize (SomeIntN (n :: IntN n)) = fromIntegral $ natVal n+  countLeadingZeros = unarySomeIntN countLeadingZeros+  countTrailingZeros = unarySomeIntN countTrailingZeros++instance (KnownNat n, 1 <= n) => Bounded (IntN n) where+  maxBound = IntN (1 `shiftL` (fromIntegral (natVal (Proxy :: Proxy n)) - 1) - 1)+  minBound = maxBound + 1++instance (KnownNat n, 1 <= n) => Enum (IntN n) where+  succ x+    | x /= maxBound = x + 1+    | otherwise = succError $ "IntN " ++ show (natVal (Proxy :: Proxy n))+  pred x+    | x /= minBound = x - 1+    | otherwise = predError $ "IntN " ++ show (natVal (Proxy :: Proxy n))+  toEnum i+    | i >= fromIntegral (minBound :: IntN n) && i <= fromIntegral (maxBound :: IntN n) = fromIntegral i+    | otherwise = toEnumError ("IntN " ++ show (natVal (Proxy :: Proxy n))) i (minBound :: WordN n, maxBound :: WordN n)+  fromEnum = fromEnum . toInteger+  enumFrom = boundedEnumFrom+  {-# INLINE enumFrom #-}+  enumFromThen = boundedEnumFromThen+  {-# INLINE enumFromThen #-}++instance Enum SomeIntN where+  toEnum = error "SomeIntN is not really a Enum type as the bit width is unknown, please consider using IntN instead"+  fromEnum = error "SomeIntN is not really a Enum type as the bit width is unknown, please consider using IntN instead"++instance (KnownNat n, 1 <= n) => Real (IntN n) where+  toRational i = toInteger i % 1++instance Real SomeIntN where+  toRational = unarySomeIntN toRational++instance (KnownNat n, 1 <= n) => Integral (IntN n) where+  quot x y =+    if x == minBound && y == -1+      then throw Overflow+      else fromInteger (toInteger x `quot` toInteger y)+  rem x y = fromInteger (toInteger x `rem` toInteger y)+  quotRem x y =+    if x == minBound && y == -1+      then throw Overflow+      else case quotRem (toInteger x) (toInteger y) of+        (q, r) -> (fromInteger q, fromInteger r)+  div x y =+    if x == minBound && y == -1+      then throw Overflow+      else fromInteger (toInteger x `div` toInteger y)+  mod x y = fromInteger (toInteger x `mod` toInteger y)+  divMod x y =+    if x == minBound && y == -1+      then throw Overflow+      else case divMod (toInteger x) (toInteger y) of+        (q, r) -> (fromInteger q, fromInteger r)+  toInteger i@(IntN n) = case signum i of+    0 -> 0+    1 -> n+    -1 ->+      let x = negate i+       in if signum x == -1 then -n else negate (toInteger x)+    _ -> undefined++instance Integral SomeIntN where+  quot = binSomeIntNR1 quot+  rem = binSomeIntNR1 rem+  quotRem = binSomeIntNR2 quotRem+  div = binSomeIntNR1 div+  mod = binSomeIntNR1 mod+  divMod = binSomeIntNR2 divMod+  toInteger = unarySomeIntN toInteger++instance (KnownNat n, 1 <= n) => Num (IntN n) where+  IntN x + IntN y = IntN (x + y) .&. minusOneIntN (Proxy :: Proxy n)+  IntN x * IntN y = IntN (x * y) .&. minusOneIntN (Proxy :: Proxy n)+  IntN x - IntN y+    | x >= y = IntN (x - y)+    | otherwise = IntN ((1 `shiftL` fromIntegral (natVal (Proxy :: Proxy n))) + x - y)+  negate (IntN 0) = IntN 0+  negate a = complement a + IntN 1+  abs x = if testBit x (fromIntegral $ natVal (Proxy :: Proxy n) - 1) then negate x else x+  signum (IntN 0) = IntN 0+  signum i = if testBit i (fromIntegral $ natVal (Proxy :: Proxy n) - 1) then -1 else 1+  fromInteger !x = IntN $ if v >= 0 then v else (1 `shiftL` n) + v+    where+      v = unWordN (fromInteger (x + maxn) :: WordN n) - maxn+      n = fromIntegral (natVal (Proxy :: Proxy n))+      maxn = 1 `shiftL` (n - 1) - 1++instance Num SomeIntN where+  (+) = binSomeIntNR1 (+)+  (-) = binSomeIntNR1 (-)+  (*) = binSomeIntNR1 (*)+  negate = unarySomeIntNR1 negate+  abs = unarySomeIntNR1 abs+  signum = unarySomeIntNR1 signum+  fromInteger = error "fromInteger is not defined for SomeIntN as no bitwidth is known"++instance (KnownNat n, 1 <= n) => Ord (IntN n) where+  IntN a <= IntN b+    | as && not bs = True+    | not as && bs = False+    | otherwise = a <= b+    where+      n = fromIntegral (natVal (Proxy :: Proxy n))+      as = testBit a (n - 1)+      bs = testBit b (n - 1)++instance SizedBV WordN where+  sizedBVConcat :: forall l r. (KnownNat l, KnownNat r, 1 <= l, 1 <= r) => WordN l -> WordN r -> WordN (l + r)+  sizedBVConcat (WordN a) (WordN b) = WordN ((a `shiftL` fromIntegral (natVal (Proxy :: Proxy r))) .|. b)+  sizedBVZext _ (WordN v) = WordN v+  sizedBVSext :: forall l r proxy. (KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) => proxy r -> WordN l -> WordN r+  sizedBVSext pr (WordN v) = if s then WordN (maxi - noi + v) else WordN v+    where+      r = fromIntegral $ natVal pr+      l = fromIntegral $ natVal (Proxy :: Proxy l)+      s = testBit v (l - 1)+      maxi = (1 :: Integer) `shiftL` r+      noi = (1 :: Integer) `shiftL` l+  sizedBVExt = sizedBVZext+  sizedBVSelect ::+    forall n ix w proxy.+    (KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, ix + w <= n) =>+    proxy ix ->+    proxy w ->+    WordN n ->+    WordN w+  sizedBVSelect pix pw (WordN v) = WordN ((v `shiftR` ix) .&. mask)+    where+      ix = fromIntegral $ natVal pix+      w = fromIntegral $ natVal pw+      mask = (1 `shiftL` w) - 1++instance SizedBV IntN where+  sizedBVConcat :: forall l r. (KnownNat l, KnownNat r, 1 <= l, 1 <= r) => IntN l -> IntN r -> IntN (l + r)+  sizedBVConcat (IntN a) (IntN b) = IntN $ unWordN $ sizedBVConcat (WordN a :: WordN l) (WordN b :: WordN r)+  sizedBVZext _ (IntN v) = IntN v+  sizedBVSext :: forall l r proxy. (KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) => proxy r -> IntN l -> IntN r+  sizedBVSext pr (IntN v) = IntN $ unWordN $ sizedBVSext pr (WordN v :: WordN l)+  sizedBVExt = sizedBVSext+  sizedBVSelect ::+    forall n ix w proxy.+    (KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, ix + w <= n) =>+    proxy ix ->+    proxy w ->+    IntN n ->+    IntN w+  sizedBVSelect pix pw (IntN v) = IntN $ unWordN $ sizedBVSelect pix pw (WordN v :: WordN n)++instance SomeBV SomeWordN where+  someBVConcat (SomeWordN (a :: WordN l)) (SomeWordN (b :: WordN r)) =+    case (leqAddPos (Proxy @l) (Proxy @r), knownAdd @l @r KnownProof KnownProof) of+      (LeqProof, KnownProof) ->+        SomeWordN $ sizedBVConcat a b+  someBVZext (p :: p l) (SomeWordN (a :: WordN n))+    | l < n = error "someBVZext: trying to zero extend a value to a smaller size"+    | otherwise =+        case (unsafeLeqProof @1 @l, unsafeLeqProof @n @l) of+          (LeqProof, LeqProof) -> SomeWordN $ sizedBVZext p a+    where+      l = natVal p+      n = natVal (Proxy @n)+  someBVSext (p :: p l) (SomeWordN (a :: WordN n))+    | l < n = error "someBVSext: trying to zero extend a value to a smaller size"+    | otherwise =+        case (unsafeLeqProof @1 @l, unsafeLeqProof @n @l) of+          (LeqProof, LeqProof) -> SomeWordN $ sizedBVSext p a+    where+      l = natVal p+      n = natVal (Proxy @n)+  someBVExt = someBVZext+  someBVSelect (p :: p ix) (q :: q w) (SomeWordN (a :: WordN n))+    | ix + w > n = error "someBVSelect: trying to select a bitvector outside the bounds of the input"+    | w == 0 = error "someBVSelect: trying to select a bitvector of size 0"+    | otherwise =+        case (unsafeLeqProof @1 @w, unsafeLeqProof @(ix + w) @n) of+          (LeqProof, LeqProof) -> SomeWordN $ sizedBVSelect (Proxy @ix) (Proxy @w) a+    where+      ix = natVal p+      w = natVal q+      n = natVal (Proxy @n)++instance SomeBV SomeIntN where+  someBVConcat (SomeIntN (a :: IntN l)) (SomeIntN (b :: IntN r)) =+    case (leqAddPos (Proxy @l) (Proxy @r), knownAdd (KnownProof @l) (KnownProof @r)) of+      (LeqProof, KnownProof) ->+        SomeIntN $ sizedBVConcat a b+  someBVZext (p :: p l) (SomeIntN (a :: IntN n))+    | l < n = error "someBVZext: trying to zero extend a value to a smaller size"+    | otherwise =+        case (unsafeLeqProof @1 @l, unsafeLeqProof @n @l) of+          (LeqProof, LeqProof) -> SomeIntN $ sizedBVZext p a+    where+      l = natVal p+      n = natVal (Proxy @n)+  someBVSext (p :: p l) (SomeIntN (a :: IntN n))+    | l < n = error "someBVSext: trying to zero extend a value to a smaller size"+    | otherwise =+        case (unsafeLeqProof @1 @l, unsafeLeqProof @n @l) of+          (LeqProof, LeqProof) -> SomeIntN $ sizedBVSext p a+    where+      l = natVal p+      n = natVal (Proxy @n)+  someBVExt = someBVZext+  someBVSelect (p :: p ix) (q :: q w) (SomeIntN (a :: IntN n))+    | ix + w > n = error "someBVSelect: trying to select a bitvector outside the bounds of the input"+    | w == 0 = error "someBVSelect: trying to select a bitvector of size 0"+    | otherwise =+        case (unsafeLeqProof @1 @w, unsafeLeqProof @(ix + w) @n) of+          (LeqProof, LeqProof) -> SomeIntN $ sizedBVSelect (Proxy @ix) (Proxy @w) a+    where+      ix = natVal p+      w = natVal q+      n = natVal (Proxy @n)
src/Grisette/Core/Data/Class/BitVector.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -19,110 +19,318 @@ -- Portability :   GHC only module Grisette.Core.Data.Class.BitVector   ( -- * Bit vector operations-    BVConcat (..),-    BVExtend (..),-    BVSelect (..),-    bvextract,+    SomeBV (..),+    someBVZext',+    someBVSext',+    someBVExt',+    someBVSelect',+    someBVExtract,+    someBVExtract',+    SizedBV (..),+    sizedBVExtract,   ) where  import Data.Proxy import GHC.TypeNats+import Grisette.Utils.Parameterized  -- $setup -- >>> import Grisette.Core -- >>> import Grisette.IR.SymPrim+-- >>> import Grisette.Utils.Parameterized -- >>> :set -XDataKinds -- >>> :set -XBinaryLiterals -- >>> :set -XFlexibleContexts -- >>> :set -XFlexibleInstances -- >>> :set -XFunctionalDependencies --- | Bitwise concatenation ('bvconcat') of the given bit vector values.-class BVConcat bv1 bv2 bv3 | bv1 bv2 -> bv3 where-  -- | Bitwise concatenation of the given bit vector values.+-- | Bit vector operations. Including concatenation ('someBVConcat'),+-- extension ('someBVZext', 'someBVSext', 'someBVExt'), and selection+-- ('someBVSelect').+class SomeBV bv where+  -- | Concatenation of two bit vectors.   ---  -- >>> bvconcat (0b101 :: SymIntN 3) (0b010 :: SymIntN 3)+  -- >>> someBVConcat (SomeSymWordN (0b101 :: SymWordN 3)) (SomeSymWordN (0b010 :: SymWordN 3))   -- 0b101010-  bvconcat :: bv1 -> bv2 -> bv3+  someBVConcat :: bv -> bv -> bv --- | Bitwise extension of the given bit vector values.-class BVExtend bv1 (n :: Nat) bv2 | bv1 n -> bv2 where-  -- | Bitwise zero extension of the given bit vector values.+  -- | Zero extension of a bit vector.   ---  -- >>> bvzeroExtend (Proxy @6) (0b101 :: SymIntN 3)+  -- >>> someBVZext (Proxy @6) (SomeSymWordN (0b101 :: SymWordN 3))   -- 0b000101-  bvzeroExtend ::+  someBVZext ::+    forall p l.+    KnownNat l =>+    -- | Desired output length+    p l ->+    -- | Bit vector to extend+    bv ->+    bv++  -- | Sign extension of a bit vector.+  --+  -- >>> someBVSext (Proxy @6) (SomeSymWordN (0b101 :: SymWordN 3))+  -- 0b111101+  someBVSext ::+    forall p l.+    KnownNat l =>+    -- | Desired output length+    p l ->+    -- | Bit vector to extend+    bv ->+    bv++  -- | Extension of a bit vector.+  -- Signedness is determined by the input bit vector type.+  --+  -- >>> someBVExt (Proxy @6) (SomeSymIntN (0b101 :: SymIntN 3))+  -- 0b111101+  -- >>> someBVExt (Proxy @6) (SomeSymIntN (0b001 :: SymIntN 3))+  -- 0b000001+  -- >>> someBVExt (Proxy @6) (SomeSymWordN (0b101 :: SymWordN 3))+  -- 0b000101+  -- >>> someBVExt (Proxy @6) (SomeSymWordN (0b001 :: SymWordN 3))+  -- 0b000001+  someBVExt ::+    forall p l.+    KnownNat l =>+    -- | Desired output length+    p l ->+    -- | Bit vector to extend+    bv ->+    bv++  -- | Slicing out a smaller bit vector from a larger one,+  -- selecting a slice with width @w@ starting from index @ix@.+  --+  -- The least significant bit is indexed as 0.+  --+  -- >>> someBVSelect (Proxy @1) (Proxy @3) (SomeSymIntN (0b001010 :: SymIntN 6))+  -- 0b101+  someBVSelect ::+    forall p ix q w.+    (KnownNat ix, KnownNat w) =>+    -- | Index of the least significant bit of the slice+    p ix ->+    -- | Desired output width, @ix + w <= n@ must hold where @n@ is+    -- the size of the input bit vector+    q w ->+    -- | Bit vector to select from+    bv ->+    bv++-- | Zero extension of a bit vector.+--+-- >>> someBVZext' (natRepr @6) (SomeSymWordN (0b101 :: SymWordN 3))+-- 0b000101+someBVZext' ::+  forall l bv.+  SomeBV bv =>+  -- | Desired output length+  NatRepr l ->+  -- | Bit vector to extend+  bv ->+  bv+someBVZext' p@(_ :: NatRepr l) = withKnownProof (hasRepr p) $ someBVZext (Proxy @l)+{-# INLINE someBVZext' #-}++-- | Sign extension of a bit vector.+--+-- >>> someBVSext' (natRepr @6) (SomeSymWordN (0b101 :: SymWordN 3))+-- 0b111101+someBVSext' ::+  forall l bv.+  SomeBV bv =>+  NatRepr l ->+  -- | Desired output length+  bv ->+  -- | Bit vector to extend+  bv+someBVSext' p@(_ :: NatRepr l) = withKnownProof (hasRepr p) $ someBVSext (Proxy @l)+{-# INLINE someBVSext' #-}++-- | Extension of a bit vector.+-- Signedness is determined by the input bit vector type.+--+-- >>> someBVExt' (natRepr @6) (SomeSymIntN (0b101 :: SymIntN 3))+-- 0b111101+-- >>> someBVExt' (natRepr @6) (SomeSymIntN (0b001 :: SymIntN 3))+-- 0b000001+-- >>> someBVExt' (natRepr @6) (SomeSymWordN (0b101 :: SymWordN 3))+-- 0b000101+-- >>> someBVExt' (natRepr @6) (SomeSymWordN (0b001 :: SymWordN 3))+-- 0b000001+someBVExt' ::+  forall l bv.+  SomeBV bv =>+  -- | Desired output length+  NatRepr l ->+  -- | Bit vector to extend+  bv ->+  bv+someBVExt' p@(_ :: NatRepr l) = withKnownProof (hasRepr p) $ someBVExt (Proxy @l)+{-# INLINE someBVExt' #-}++-- | Slicing out a smaller bit vector from a larger one,+-- selecting a slice with width @w@ starting from index @ix@.+--+-- The least significant bit is indexed as 0.+--+-- >>> someBVSelect' (natRepr @1) (natRepr @3) (SomeSymIntN (0b001010 :: SymIntN 6))+-- 0b101+someBVSelect' ::+  forall ix w bv.+  SomeBV bv =>+  -- | Index of the least significant bit of the slice+  NatRepr ix ->+  -- | Desired output width, @ix + w <= n@ must hold where @n@ is+  -- the size of the input bit vector+  NatRepr w ->+  -- | Bit vector to select from+  bv ->+  bv+someBVSelect' p@(_ :: NatRepr l) q@(_ :: NatRepr r) = withKnownProof (hasRepr p) $ withKnownProof (hasRepr q) $ someBVSelect p q+{-# INLINE someBVSelect' #-}++-- | Slicing out a smaller bit vector from a larger one, extract a slice from+-- bit @i@ down to @j@.+--+-- The least significant bit is indexed as 0.+--+-- >>> someBVExtract (Proxy @4) (Proxy @2) (SomeSymIntN (0b010100 :: SymIntN 6))+-- 0b101+someBVExtract ::+  forall p (i :: Nat) q (j :: Nat) bv.+  (SomeBV bv, KnownNat i, KnownNat j) =>+  -- | The start position to extract from, @i < n@ must hold where @n@ is+  -- the size of the output bit vector+  p i ->+  -- | The end position to extract from, @j <= i@ must hold+  q j ->+  -- | Bit vector to extract from+  bv ->+  bv+someBVExtract _ _ =+  withKnownProof (unsafeKnownProof @(i - j + 1) (fromIntegral (natVal (Proxy @i)) - fromIntegral (natVal (Proxy @j)) + 1)) $+    someBVSelect (Proxy @j) (Proxy @(i - j + 1))+{-# INLINE someBVExtract #-}++-- | Slicing out a smaller bit vector from a larger one, extract a slice from+-- bit @i@ down to @j@.+--+-- The least significant bit is indexed as 0.+--+-- >>> someBVExtract' (natRepr @4) (natRepr @2) (SomeSymIntN (0b010100 :: SymIntN 6))+-- 0b101+someBVExtract' ::+  forall (i :: Nat) (j :: Nat) bv.+  SomeBV bv =>+  -- | The start position to extract from, @i < n@ must hold where @n@ is+  -- the size of the output bit vector+  NatRepr i ->+  -- | The end position to extract from, @j <= i@ must hold+  NatRepr j ->+  -- | Bit vector to extract from+  bv ->+  bv+someBVExtract' p@(_ :: NatRepr l) q@(_ :: NatRepr r) = withKnownProof (hasRepr p) $ withKnownProof (hasRepr q) $ someBVExtract p q+{-# INLINE someBVExtract' #-}++-- | Sized bit vector operations. Including concatenation ('sizedBVConcat'),+-- extension ('sizedBVZext', 'sizedBVSext', 'sizedBVExt'), and selection+-- ('sizedBVSelect').+class SizedBV bv where+  -- | Concatenation of two bit vectors.+  --+  -- >>> sizedBVConcat (0b101 :: SymIntN 3) (0b010 :: SymIntN 3)+  -- 0b101010+  sizedBVConcat :: (KnownNat l, KnownNat r, 1 <= l, 1 <= r) => bv l -> bv r -> bv (l + r)++  -- | Zero extension of a bit vector.+  --+  -- >>> sizedBVZext (Proxy @6) (0b101 :: SymIntN 3)+  -- 0b000101+  sizedBVZext ::+    (KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) =>     -- | Desired output width-    proxy n ->+    proxy r ->     -- | Bit vector to extend-    bv1 ->-    bv2+    bv l ->+    bv r -  -- | Bitwise signed extension of the given bit vector values.+  -- | Signed extension of a bit vector.   ---  -- >>> bvsignExtend (Proxy @6) (0b101 :: SymIntN 3)+  -- >>> sizedBVSext (Proxy @6) (0b101 :: SymIntN 3)   -- 0b111101-  bvsignExtend ::+  sizedBVSext ::+    (KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) =>     -- | Desired output width-    proxy n ->+    proxy r ->     -- | Bit vector to extend-    bv1 ->-    bv2+    bv l ->+    bv r -  -- | Bitwise extension of the given bit vector values.+  -- | Extension of a bit vector.   -- Signedness is determined by the input bit vector type.   ---  -- >>> bvextend (Proxy @6) (0b101 :: SymIntN 3)+  -- >>> sizedBVExt (Proxy @6) (0b101 :: SymIntN 3)   -- 0b111101-  -- >>> bvextend (Proxy @6) (0b001 :: SymIntN 3)+  -- >>> sizedBVExt (Proxy @6) (0b001 :: SymIntN 3)   -- 0b000001-  -- >>> bvextend (Proxy @6) (0b101 :: SymWordN 3)+  -- >>> sizedBVExt (Proxy @6) (0b101 :: SymWordN 3)   -- 0b000101-  -- >>> bvextend (Proxy @6) (0b001 :: SymWordN 3)+  -- >>> sizedBVExt (Proxy @6) (0b001 :: SymWordN 3)   -- 0b000001-  bvextend ::+  sizedBVExt ::+    (KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) =>     -- | Desired output width-    proxy n ->+    proxy r ->     -- | Bit vector to extend-    bv1 ->-    bv2+    bv l ->+    bv r --- | Slicing out a smaller bit vector from a larger one, selecting a slice with--- width @w@ starting from index @ix@.-class BVSelect bv1 (ix :: Nat) (w :: Nat) bv2 | bv1 w -> bv2 where   -- | Slicing out a smaller bit vector from a larger one, selecting a slice with   -- width @w@ starting from index @ix@.   ---  -- The indices are counting from zero from the least significant bit.+  -- The least significant bit is indexed as 0.   ---  -- >>> bvselect (Proxy @1) (Proxy @3) (con 0b001010 :: SymIntN 6)+  -- >>> sizedBVSelect (Proxy @2) (Proxy @3) (con 0b010100 :: SymIntN 6)   -- 0b101-  bvselect ::-    -- | Index to start selecting from+  sizedBVSelect ::+    (KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, ix + w <= n) =>+    -- | Index of the least significant bit of the slice     proxy ix ->-    -- | Desired output width, @0 <= ix@ and @ix + w < n@ must hold where @n@ is+    -- | Desired output width, @ix + w <= n@ must hold where @n@ is     -- the size of the input bit vector     proxy w ->     -- | Bit vector to select from-    bv1 ->-    bv2+    bv n ->+    bv w --- | Extract a smaller bit vector from a larger one from bits @i@ down to @j@.+-- | Slicing out a smaller bit vector from a larger one, extract a slice from+-- bit @i@ down to @j@. ----- The indices are counting from zero from the least significant bit.--- >>> bvextract (Proxy @3) (Proxy @1) (con 0b001010 :: SymIntN 6)+-- The least significant bit is indexed as 0.+--+-- >>> sizedBVExtract (Proxy @4) (Proxy @2) (con 0b010100 :: SymIntN 6) -- 0b101-bvextract ::-  forall proxy i j bv1 bv2.-  (BVSelect bv1 j (i - j + 1) bv2) =>-  -- | The start position to extract from, @0 <= i < n@ must hold where @n@ is+sizedBVExtract ::+  forall proxy i j n bv.+  (SizedBV bv, KnownNat n, KnownNat i, KnownNat j, 1 <= n, i + 1 <= n, j <= i) =>+  -- | The start position to extract from, @i < n@ must hold where @n@ is   -- the size of the output bit vector   proxy i ->-  -- | The end position to extract from, @0 <= j <= i@ must hold+  -- | The end position to extract from, @j <= i@ must hold   proxy j ->   -- | Bit vector to extract from-  bv1 ->-  bv2-bvextract _ _ = bvselect (Proxy @j) (Proxy @(i - j + 1))-{-# INLINE bvextract #-}+  bv n ->+  bv (i - j + 1)+sizedBVExtract _ _ =+  case ( hasRepr (addNat (subNat (natRepr @i) (natRepr @j)) (natRepr @1)),+         unsafeLeqProof @(j + (i - j + 1)) @n,+         unsafeLeqProof @1 @(i - j + 1)+       ) of+    (KnownProof, LeqProof, LeqProof) ->+      sizedBVSelect (Proxy @j) (Proxy @(i - j + 1))+{-# INLINE sizedBVExtract #-}
src/Grisette/Core/Data/Class/Bool.hs view
@@ -1,7 +1,9 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE Trustworthy #-}@@ -40,7 +42,9 @@ import Data.Functor.Sum import Data.Int import Data.Word+import GHC.TypeNats import Generics.Deriving+import Grisette.Core.Data.BV import {-# SOURCE #-} Grisette.Core.Data.Class.SimpleMergeable import Grisette.Core.Data.Class.Solvable import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term@@ -220,6 +224,11 @@   l ==~ r = con $ l == r; \   {-# INLINE (==~) #-} +#define CONCRETE_SEQ_BV(type) \+instance (KnownNat n, 1 <= n) => SEq (type n) where \+  l ==~ r = con $ l == r; \+  {-# INLINE (==~) #-}+ #if 1 CONCRETE_SEQ(Bool) CONCRETE_SEQ(Integer)@@ -235,6 +244,10 @@ CONCRETE_SEQ(Word32) CONCRETE_SEQ(Word64) CONCRETE_SEQ(B.ByteString)+CONCRETE_SEQ_BV(WordN)+CONCRETE_SEQ_BV(IntN)+CONCRETE_SEQ(SomeWordN)+CONCRETE_SEQ(SomeIntN) #endif  -- List@@ -327,12 +340,40 @@   (IdentityT l) ==~ (IdentityT r) = l ==~ r   {-# INLINE (==~) #-} -instance (SupportedPrim a) => ITEOp (Sym a) where-  ites (Sym c) (Sym t) (Sym f) = Sym $ pevalITETerm c t f+#define ITEOP_SIMPLE(type) \+instance ITEOp type where \+  ites (SymBool c) (type t) (type f) = type $ pevalITETerm c t f; \+  {-# INLINE ites #-} -instance LogicalOp (Sym Bool) where-  (Sym l) ||~ (Sym r) = Sym $ pevalOrTerm l r-  (Sym l) &&~ (Sym r) = Sym $ pevalAndTerm l r-  nots (Sym v) = Sym $ pevalNotTerm v-  (Sym l) `xors` (Sym r) = Sym $ pevalXorTerm l r-  (Sym l) `implies` (Sym r) = Sym $ pevalImplyTerm l r+#define ITEOP_BV(type) \+instance (KnownNat n, 1 <= n) => ITEOp (type n) where \+  ites (SymBool c) (type t) (type f) = type $ pevalITETerm c t f; \+  {-# INLINE ites #-}++#define ITEOP_BV_SOME(symtype, bf) \+instance ITEOp symtype where \+  ites c = bf (ites c) "ites"; \+  {-# INLINE ites #-}++#define ITEOP_FUN(op, cons) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => ITEOp (sa op sb) where \+  ites (SymBool c) (cons t) (cons f) = cons $ pevalITETerm c t f; \+  {-# INLINE ites #-}++#if 1+ITEOP_SIMPLE(SymBool)+ITEOP_SIMPLE(SymInteger)+ITEOP_BV(SymIntN)+ITEOP_BV(SymWordN)+ITEOP_BV_SOME(SomeSymIntN, binSomeSymIntNR1)+ITEOP_BV_SOME(SomeSymWordN, binSomeSymWordNR1)+ITEOP_FUN(=~>, SymTabularFun)+ITEOP_FUN(-~>, SymGeneralFun)+#endif++instance LogicalOp SymBool where+  (SymBool l) ||~ (SymBool r) = SymBool $ pevalOrTerm l r+  (SymBool l) &&~ (SymBool r) = SymBool $ pevalAndTerm l r+  nots (SymBool v) = SymBool $ pevalNotTerm v+  (SymBool l) `xors` (SymBool r) = SymBool $ pevalXorTerm l r+  (SymBool l) `implies` (SymBool r) = SymBool $ pevalImplyTerm l r
src/Grisette/Core/Data/Class/Bool.hs-boot view
@@ -1,5 +1,7 @@ module Grisette.Core.Data.Class.Bool (LogicalOp (..)) where +import {-# SOURCE #-} Grisette.IR.SymPrim.Data.SymPrim+ class LogicalOp b where   -- | Symbolic disjunction   (||~) :: b -> b -> b@@ -29,3 +31,6 @@   {-# INLINE implies #-}    {-# MINIMAL (||~), nots | (&&~), nots #-}++class ITEOp v where+  ites :: SymBool -> v -> v -> v
src/Grisette/Core/Data/Class/CEGISSolver.hs view
@@ -124,7 +124,7 @@     -- | The counter-examples generated     -- during the CEGIS loop, and the     -- model found by the solver.-    IO (Either failure ([inputs], Model))+    IO ([inputs], Either failure Model)  -- | -- CEGIS with a single symbolic input to represent a set of inputs.@@ -135,8 +135,8 @@ -- -- >>> :set -XOverloadedStrings -- >>> let [x,c] = ["x","c"] :: [SymInteger]--- >>> cegis (UnboundedReasoning z3) x (cegisPrePost (x >~ 0) (x * c <~ 0 &&~ c >~ -2))--- Right ([],Model {c -> -1 :: Integer})+-- >>> cegis (precise z3) x (cegisPrePost (x >~ 0) (x * c <~ 0 &&~ c >~ -2))+-- ([],Right (Model {c -> -1 :: Integer})) cegis ::   ( CEGISSolver config failure,     EvaluateSym inputs,@@ -155,7 +155,7 @@   -- | The counter-examples generated   -- during the CEGIS loop, and the   -- model found by the solver.-  IO (Either failure ([inputs], Model))+  IO ([inputs], Either failure Model) cegis config inputs cond = cegisMultiInputs config [inputs] (const cond)  -- |@@ -173,7 +173,7 @@   [inputs] ->   (Either e v -> CEGISCondition) ->   (inputs -> t) ->-  IO (Either failure ([inputs], Model))+  IO ([inputs], Either failure Model) cegisExceptMultiInputs config cexes interpretFun f =   cegisMultiInputs config cexes (simpleMerge . (interpretFun <$>) . extractUnionExcept . f) @@ -194,7 +194,7 @@   [inputs] ->   (Either e v -> u (Either VerificationConditions ())) ->   (inputs -> t) ->-  IO (Either failure ([inputs], Model))+  IO ([inputs], Either failure Model) cegisExceptVCMultiInputs config cexes interpretFun f =   cegisMultiInputs     config@@ -230,7 +230,7 @@   config ->   [inputs] ->   (inputs -> t) ->-  IO (Either failure ([inputs], Model))+  IO ([inputs], Either failure Model) cegisExceptStdVCMultiInputs config cexes =   cegisExceptVCMultiInputs config cexes return @@ -264,8 +264,8 @@ --   translation _ = cegisPostCond (con True) -- :} ----- >>> cegisExcept (UnboundedReasoning z3) x translation res--- Right ([],Model {c -> -1 :: Integer})+-- >>> cegisExcept (precise z3) x translation res+-- ([],Right (Model {c -> -1 :: Integer})) cegisExcept ::   ( UnionWithExcept t u e v,     UnionPrjOp u,@@ -278,7 +278,7 @@   inputs ->   (Either e v -> CEGISCondition) ->   t ->-  IO (Either failure ([inputs], Model))+  IO ([inputs], Either failure Model) cegisExcept config inputs f v = cegis config inputs $ simpleMerge $ f <$> extractUnionExcept v  -- |@@ -298,7 +298,7 @@   inputs ->   (Either e v -> u (Either VerificationConditions ())) ->   t ->-  IO (Either failure ([inputs], Model))+  IO ([inputs], Either failure Model) cegisExceptVC config inputs f v =   cegis config inputs $     simpleMerge $@@ -334,8 +334,8 @@ --     symAssert $ c >~ -2 -- :} ----- >>> cegisExceptStdVC (UnboundedReasoning z3) x res--- Right ([],Model {c -> -1 :: Integer})+-- >>> cegisExceptStdVC (precise z3) x res+-- ([],Right (Model {c -> -1 :: Integer})) cegisExceptStdVC ::   ( UnionWithExcept t u VerificationConditions (),     UnionPrjOp u,@@ -347,5 +347,5 @@   config ->   inputs ->   t ->-  IO (Either failure ([inputs], Model))+  IO ([inputs], Either failure Model) cegisExceptStdVC config inputs = cegisExceptVC config inputs return
src/Grisette/Core/Data/Class/Error.hs view
@@ -15,6 +15,7 @@     TransformError (..),      -- * Throwing error+    symAssertWith,     symAssertTransformableError,     symThrowTransformableError,   )@@ -104,3 +105,14 @@   erm () symAssertTransformableError err cond = mrgIf cond (return ()) (symThrowTransformableError err) {-# INLINE symAssertTransformableError #-}++symAssertWith ::+  ( Mergeable e,+    MonadError e erm,+    MonadUnion erm+  ) =>+  e ->+  SymBool ->+  erm ()+symAssertWith err cond = mrgIf cond (return ()) (throwError err)+{-# INLINE symAssertWith #-}
src/Grisette/Core/Data/Class/Evaluate.hs view
@@ -1,7 +1,9 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE Trustworthy #-}@@ -33,8 +35,10 @@ import Data.Int import Data.Maybe import Data.Word+import GHC.TypeNats import Generics.Deriving import Generics.Deriving.Instances ()+import Grisette.Core.Data.BV import Grisette.Core.Data.Class.ModelOps import Grisette.Core.Data.Class.ToCon import Grisette.IR.SymPrim.Data.Prim.Model@@ -102,6 +106,10 @@ instance EvaluateSym type where \   evaluateSym _ _ = id +#define CONCRETE_EVALUATESYM_BV(type) \+instance (KnownNat n, 1 <= n) => EvaluateSym (type n) where \+  evaluateSym _ _ = id+ #if 1 CONCRETE_EVALUATESYM(Bool) CONCRETE_EVALUATESYM(Integer)@@ -116,7 +124,11 @@ CONCRETE_EVALUATESYM(Word16) CONCRETE_EVALUATESYM(Word32) CONCRETE_EVALUATESYM(Word64)+CONCRETE_EVALUATESYM(SomeIntN)+CONCRETE_EVALUATESYM(SomeWordN) CONCRETE_EVALUATESYM(B.ByteString)+CONCRETE_EVALUATESYM_BV(IntN)+CONCRETE_EVALUATESYM_BV(WordN) #endif  -- ()
src/Grisette/Core/Data/Class/ExtractSymbolics.hs view
@@ -1,7 +1,9 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE Trustworthy #-}@@ -31,7 +33,9 @@ import Data.Functor.Sum import Data.Int import Data.Word+import GHC.TypeNats import Generics.Deriving+import Grisette.Core.Data.BV import {-# SOURCE #-} Grisette.IR.SymPrim.Data.Prim.Model  -- $setup@@ -87,9 +91,13 @@ -- instances  #define CONCRETE_EXTRACT_SYMBOLICS(type) \-instance  ExtractSymbolics type where \+instance ExtractSymbolics type where \   extractSymbolics _ = mempty +#define CONCRETE_EXTRACT_SYMBOLICS_BV(type) \+instance (KnownNat n, 1 <= n) => ExtractSymbolics (type n) where \+  extractSymbolics _ = mempty+ #if 1 CONCRETE_EXTRACT_SYMBOLICS(Bool) CONCRETE_EXTRACT_SYMBOLICS(Integer)@@ -104,7 +112,11 @@ CONCRETE_EXTRACT_SYMBOLICS(Word16) CONCRETE_EXTRACT_SYMBOLICS(Word32) CONCRETE_EXTRACT_SYMBOLICS(Word64)+CONCRETE_EXTRACT_SYMBOLICS(SomeWordN)+CONCRETE_EXTRACT_SYMBOLICS(SomeIntN) CONCRETE_EXTRACT_SYMBOLICS(B.ByteString)+CONCRETE_EXTRACT_SYMBOLICS_BV(WordN)+CONCRETE_EXTRACT_SYMBOLICS_BV(IntN) #endif  -- ()
src/Grisette/Core/Data/Class/GenSym.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-}@@ -65,10 +66,21 @@ where  import Control.DeepSeq+import Control.Monad.Cont import Control.Monad.Except import Control.Monad.Identity+import Control.Monad.RWS.Class+import qualified Control.Monad.RWS.Lazy as RWSLazy+import qualified Control.Monad.RWS.Strict as RWSStrict+import Control.Monad.Reader import Control.Monad.Signatures+import Control.Monad.State+import qualified Control.Monad.State.Lazy as StateLazy+import qualified Control.Monad.State.Strict as StateStrict import Control.Monad.Trans.Maybe+import Control.Monad.Writer+import qualified Control.Monad.Writer.Lazy as WriterLazy+import qualified Control.Monad.Writer.Strict as WriterStrict import Data.Bifunctor import qualified Data.ByteString as B import Data.Hashable@@ -76,9 +88,11 @@ import Data.String import Data.Typeable import Data.Word+import GHC.TypeNats import Generics.Deriving hiding (index) import Grisette.Core.Control.Monad.Union import {-# SOURCE #-} Grisette.Core.Control.Monad.UnionM+import Grisette.Core.Data.BV import Grisette.Core.Data.Class.Bool import Grisette.Core.Data.Class.Mergeable import Grisette.Core.Data.Class.SimpleMergeable@@ -287,6 +301,53 @@   throwError = lift . throwError   catchError = liftFreshTCache catchError +instance (MonadWriter w m) => MonadWriter w (FreshT m) where+  writer p = FreshT $ \ident index -> (,index) <$> writer p+  listen (FreshT r) = FreshT $ \ident index -> (\((a, b), c) -> ((a, c), b)) <$> listen (r ident index)+  pass (FreshT r) = FreshT $ \ident index -> pass $ (\((a, b), c) -> ((a, c), b)) <$> r ident index++instance (MonadState s m) => MonadState s (FreshT m) where+  get = FreshT $ \ident index -> gets (,index)+  put s = FreshT $ \ident index -> (,index) <$> put s++instance (MonadReader r m) => MonadReader r (FreshT m) where+  local t (FreshT r) = FreshT $ \ident index -> local t (r ident index)+  ask = FreshT $ \ident index -> asks (,index)++instance (MonadRWS r w s m) => MonadRWS r w s (FreshT m)++instance (MonadFresh m) => MonadFresh (ExceptT e m) where+  nextFreshIndex = ExceptT $ Right <$> nextFreshIndex+  getFreshIdent = ExceptT $ Right <$> getFreshIdent++instance (MonadFresh m, Monoid w) => MonadFresh (WriterLazy.WriterT w m) where+  nextFreshIndex = WriterLazy.WriterT $ (,mempty) <$> nextFreshIndex+  getFreshIdent = WriterLazy.WriterT $ (,mempty) <$> getFreshIdent++instance (MonadFresh m, Monoid w) => MonadFresh (WriterStrict.WriterT w m) where+  nextFreshIndex = WriterStrict.WriterT $ (,mempty) <$> nextFreshIndex+  getFreshIdent = WriterStrict.WriterT $ (,mempty) <$> getFreshIdent++instance (MonadFresh m) => MonadFresh (StateLazy.StateT s m) where+  nextFreshIndex = StateLazy.StateT $ \s -> (,s) <$> nextFreshIndex+  getFreshIdent = StateLazy.StateT $ \s -> (,s) <$> getFreshIdent++instance (MonadFresh m) => MonadFresh (StateStrict.StateT s m) where+  nextFreshIndex = StateStrict.StateT $ \s -> (,s) <$> nextFreshIndex+  getFreshIdent = StateStrict.StateT $ \s -> (,s) <$> getFreshIdent++instance (MonadFresh m) => MonadFresh (ReaderT r m) where+  nextFreshIndex = ReaderT $ const nextFreshIndex+  getFreshIdent = ReaderT $ const getFreshIdent++instance (MonadFresh m, Monoid w) => MonadFresh (RWSLazy.RWST r w s m) where+  nextFreshIndex = RWSLazy.RWST $ \r s -> (,s,mempty) <$> nextFreshIndex+  getFreshIdent = RWSLazy.RWST $ \r s -> (,s,mempty) <$> getFreshIdent++instance (MonadFresh m, Monoid w) => MonadFresh (RWSStrict.RWST r w s m) where+  nextFreshIndex = RWSStrict.RWST $ \r s -> (,s,mempty) <$> nextFreshIndex+  getFreshIdent = RWSStrict.RWST $ \r s -> (,s,mempty) <$> getFreshIdent+ -- | 'FreshT' specialized with Identity. type Fresh = FreshT Identity @@ -449,7 +510,7 @@ -- use this 'fresh' implementation to implement 'GenSym' for your own types. -- -- This 'fresh' implementation is for the types that does not need any specification.--- It will generate product types by generating each fields with '()' as specification,+-- It will generate product types by generating each fields with @()@ as specification, -- and generate all possible values for a sum type. -- -- __Note:__ __Never__ use on recursive types.@@ -674,6 +735,12 @@ #define CONCRETE_GENSYMSIMPLE_SAME_SHAPE(type) \ instance GenSymSimple type type where simpleFresh = return +#define CONCRETE_GENSYM_SAME_SHAPE_BV(type) \+instance (KnownNat n, 1 <= n) => GenSym (type n) (type n) where fresh = return . mrgSingle++#define CONCRETE_GENSYMSIMPLE_SAME_SHAPE_BV(type) \+instance (KnownNat n, 1 <= n) => GenSymSimple (type n) (type n) where simpleFresh = return+ #if 1 CONCRETE_GENSYM_SAME_SHAPE(Bool) CONCRETE_GENSYM_SAME_SHAPE(Integer)@@ -688,7 +755,11 @@ CONCRETE_GENSYM_SAME_SHAPE(Word16) CONCRETE_GENSYM_SAME_SHAPE(Word32) CONCRETE_GENSYM_SAME_SHAPE(Word64)+CONCRETE_GENSYM_SAME_SHAPE(SomeWordN)+CONCRETE_GENSYM_SAME_SHAPE(SomeIntN) CONCRETE_GENSYM_SAME_SHAPE(B.ByteString)+CONCRETE_GENSYM_SAME_SHAPE_BV(WordN)+CONCRETE_GENSYM_SAME_SHAPE_BV(IntN)  CONCRETE_GENSYMSIMPLE_SAME_SHAPE(Bool) CONCRETE_GENSYMSIMPLE_SAME_SHAPE(Integer)@@ -703,7 +774,11 @@ CONCRETE_GENSYMSIMPLE_SAME_SHAPE(Word16) CONCRETE_GENSYMSIMPLE_SAME_SHAPE(Word32) CONCRETE_GENSYMSIMPLE_SAME_SHAPE(Word64)+CONCRETE_GENSYMSIMPLE_SAME_SHAPE(SomeWordN)+CONCRETE_GENSYMSIMPLE_SAME_SHAPE(SomeIntN) CONCRETE_GENSYMSIMPLE_SAME_SHAPE(B.ByteString)+CONCRETE_GENSYMSIMPLE_SAME_SHAPE_BV(WordN)+CONCRETE_GENSYMSIMPLE_SAME_SHAPE_BV(IntN) #endif  -- Bool@@ -1457,18 +1532,105 @@   ) =>   GenSym (ExceptT e m a) (ExceptT e m a) -instance (SupportedPrim a) => GenSym (Sym a) (Sym a)--instance (SupportedPrim a) => GenSymSimple (Sym a) (Sym a) where+#define GENSYM_SIMPLE(symtype) \+instance GenSym symtype symtype+#define GENSYM_SIMPLE_SIMPLE(symtype) \+instance GenSymSimple symtype symtype where \   simpleFresh _ = simpleFresh ()+#define GENSYM_UNIT_SIMPLE(symtype) \+instance GenSym () symtype where \+  fresh _ = mrgSingle <$> simpleFresh ()+#define GENSYM_UNIT_SIMPLE_SIMPLE(symtype) \+instance GenSymSimple () symtype where \+  simpleFresh _ = do; \+    ident <- getFreshIdent; \+    FreshIndex i <- nextFreshIndex; \+    case ident of; \+      FreshIdent s -> return $ isym s i; \+      FreshIdentWithInfo s info -> return $ iinfosym s i info -instance (SupportedPrim a) => GenSym () (Sym a) where+#define GENSYM_BV(symtype) \+instance (KnownNat n, 1 <= n) => GenSym (symtype n) (symtype n)+#define GENSYM_SIMPLE_BV(symtype) \+instance (KnownNat n, 1 <= n) => GenSymSimple (symtype n) (symtype n) where \+  simpleFresh _ = simpleFresh ()+#define GENSYM_UNIT_BV(symtype) \+instance (KnownNat n, 1 <= n) => GenSym () (symtype n) where \   fresh _ = mrgSingle <$> simpleFresh ()+#define GENSYM_UNIT_SIMPLE_BV(symtype) \+instance (KnownNat n, 1 <= n) => GenSymSimple () (symtype n) where \+  simpleFresh _ = do; \+    ident <- getFreshIdent; \+    FreshIndex i <- nextFreshIndex; \+    case ident of; \+      FreshIdent s -> return $ isym s i; \+      FreshIdentWithInfo s info -> return $ iinfosym s i info -instance (SupportedPrim a) => GenSymSimple () (Sym a) where-  simpleFresh _ = do-    ident <- getFreshIdent-    FreshIndex i <- nextFreshIndex-    case ident of-      FreshIdent s -> return $ isym s i+#define GENSYM_BV_SOME(symtype) \+instance GenSym symtype symtype+#define GENSYM_SIMPLE_BV_SOME(symtype) \+instance GenSymSimple symtype symtype where \+  simpleFresh (symtype v) = simpleFresh v+#define GENSYM_N_BV_SOME(symtype) \+instance (KnownNat n, 1 <= n) => GenSym (p n) symtype where \+  fresh p = mrgSingle <$> simpleFresh p+#define GENSYM_N_SIMPLE_BV_SOME(symtype, origtype) \+instance (KnownNat n, 1 <= n) => GenSymSimple (p n) symtype where \+  simpleFresh _ = do; \+    i :: origtype n <- simpleFresh (); \+    return $ symtype i++#define GENSYM_FUN(op) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => GenSym (sa op sb) (sa op sb)+#define GENSYM_SIMPLE_FUN(op) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => GenSymSimple (sa op sb) (sa op sb) where \+  simpleFresh _ = simpleFresh ()+#define GENSYM_UNIT_FUN(op) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => GenSym () (sa op sb) where \+  fresh _ = mrgSingle <$> simpleFresh ()+#define GENSYM_UNIT_SIMPLE_FUN(op) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => GenSymSimple () (sa op sb) where \+  simpleFresh _ = do; \+    ident <- getFreshIdent; \+    FreshIndex i <- nextFreshIndex; \+    case ident of; \+      FreshIdent s -> return $ isym s i; \       FreshIdentWithInfo s info -> return $ iinfosym s i info++#if 1+GENSYM_SIMPLE(SymBool)+GENSYM_SIMPLE_SIMPLE(SymBool)+GENSYM_UNIT_SIMPLE(SymBool)+GENSYM_UNIT_SIMPLE_SIMPLE(SymBool)+GENSYM_SIMPLE(SymInteger)+GENSYM_SIMPLE_SIMPLE(SymInteger)+GENSYM_UNIT_SIMPLE(SymInteger)+GENSYM_UNIT_SIMPLE_SIMPLE(SymInteger)++GENSYM_BV(SymIntN)+GENSYM_SIMPLE_BV(SymIntN)+GENSYM_UNIT_BV(SymIntN)+GENSYM_UNIT_SIMPLE_BV(SymIntN)+GENSYM_BV(SymWordN)+GENSYM_SIMPLE_BV(SymWordN)+GENSYM_UNIT_BV(SymWordN)+GENSYM_UNIT_SIMPLE_BV(SymWordN)++GENSYM_BV_SOME(SomeSymIntN)+GENSYM_SIMPLE_BV_SOME(SomeSymIntN)+GENSYM_N_BV_SOME(SomeSymIntN)+GENSYM_N_SIMPLE_BV_SOME(SomeSymIntN, SymIntN)+GENSYM_BV_SOME(SomeSymWordN)+GENSYM_SIMPLE_BV_SOME(SomeSymWordN)+GENSYM_N_BV_SOME(SomeSymWordN)+GENSYM_N_SIMPLE_BV_SOME(SomeSymWordN, SymWordN)++GENSYM_FUN(=~>)+GENSYM_SIMPLE_FUN(=~>)+GENSYM_UNIT_FUN(=~>)+GENSYM_UNIT_SIMPLE_FUN(=~>)+GENSYM_FUN(-~>)+GENSYM_SIMPLE_FUN(-~>)+GENSYM_UNIT_FUN(-~>)+GENSYM_UNIT_SIMPLE_FUN(-~>)+#endif
− src/Grisette/Core/Data/Class/Integer.hs
@@ -1,72 +0,0 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE Trustworthy #-}---- |--- Module      :   Grisette.Core.Data.Class.Integer--- Copyright   :   (c) Sirui Lu 2021-2023--- License     :   BSD-3-Clause (see the LICENSE file)------ Maintainer  :   siruilu@cs.washington.edu--- Stability   :   Experimental--- Portability :   GHC only-module Grisette.Core.Data.Class.Integer-  ( -- * Symbolic integer operations-    ArithException (..),-    SignedDivMod (..),-    UnsignedDivMod (..),-    SignedQuotRem (..),-    SymIntegerOp,-  )-where--import Control.Exception-import Control.Monad.Except-import Grisette.Core.Control.Monad.Union-import Grisette.Core.Data.Class.Bool-import Grisette.Core.Data.Class.Error-import Grisette.Core.Data.Class.SOrd-import Grisette.Core.Data.Class.Solvable---- $setup--- >>> import Grisette.Core--- >>> import Grisette.IR.SymPrim---- | Safe signed 'div' and 'mod' with monadic error handling in multi-path--- execution. These procedures show throw 'DivideByZero' exception when the--- divisor is zero. The result should be able to handle errors with--- `MonadError`, and the error type should be compatible with 'ArithException'--- (see 'TransformError' for more details).-class SignedDivMod a where-  -- | Safe signed 'div' with monadic error handling in multi-path execution.-  ---  -- >>> divs (ssym "a") (ssym "b") :: ExceptT AssertionError UnionM SymInteger-  -- ExceptT {If (= b 0) (Left AssertionError) (Right (div a b))}-  divs :: (MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a--  -- | Safe signed 'mod' with monadic error handling in multi-path execution.-  ---  -- >>> mods (ssym "a") (ssym "b") :: ExceptT AssertionError UnionM SymInteger-  -- ExceptT {If (= b 0) (Left AssertionError) (Right (mod a b))}-  mods :: (MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a---- | Safe unsigned 'div' and 'mod' with monadic error handling in multi-path--- execution. These procedures show throw 'DivideByZero' exception when the--- divisor is zero. The result should be able to handle errors with--- `MonadError`, and the error type should be compatible with 'ArithException'--- (see 'TransformError' for more details).-class UnsignedDivMod a where-  udivs :: (MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a-  umods :: (MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a---- | Safe signed 'quot' and 'rem' with monadic error handling in multi-path--- execution. These procedures show throw 'DivideByZero' exception when the--- divisor is zero. The result should be able to handle errors with--- `MonadError`, and the error type should be compatible with 'ArithException'--- (see 'TransformError' for more details).-class SignedQuotRem a where-  quots :: (MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a-  rems :: (MonadError e uf, MonadUnion uf, TransformError ArithException e) => a -> a -> uf a---- | Aggregation for the operations on symbolic integer types-class (Num a, SEq a, SOrd a, Solvable Integer a) => SymIntegerOp a
src/Grisette/Core/Data/Class/Mergeable.hs view
@@ -50,6 +50,7 @@   ) where +import Control.Exception import Control.Monad.Cont import Control.Monad.Except import Control.Monad.Identity@@ -69,7 +70,11 @@ import qualified Data.Monoid as Monoid import Data.Typeable import Data.Word+import GHC.Natural+import qualified GHC.TypeLits+import GHC.TypeNats import Generics.Deriving+import Grisette.Core.Data.BV import Grisette.Core.Data.Class.Bool import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import {-# SOURCE #-} Grisette.IR.SymPrim.Data.SymPrim@@ -429,9 +434,14 @@ instance Mergeable type where \   rootStrategy = \     let sub = SimpleStrategy $ \_ t _ -> t \-     in SortedStrategy id $ const sub; \-  {-# INLINE rootStrategy #-}+     in SortedStrategy id $ const sub +#define CONCRETE_ORD_MERGEABLE_BV(type) \+instance (KnownNat n, 1 <= n) => Mergeable (type n) where \+  rootStrategy = \+    let sub = SimpleStrategy $ \_ t _ -> t \+     in SortedStrategy id $ const sub+ #if 1 CONCRETE_ORD_MERGEABLE(Bool) CONCRETE_ORD_MERGEABLE(Integer)@@ -447,8 +457,30 @@ CONCRETE_ORD_MERGEABLE(Word32) CONCRETE_ORD_MERGEABLE(Word64) CONCRETE_ORD_MERGEABLE(B.ByteString)+CONCRETE_ORD_MERGEABLE_BV(WordN)+CONCRETE_ORD_MERGEABLE_BV(IntN) #endif +instance Mergeable SomeIntN where+  rootStrategy =+    SortedStrategy @Natural+      (\(SomeIntN (v :: IntN n)) -> natVal (Proxy @n))+      ( \n ->+          SortedStrategy @Integer+            (\(SomeIntN (IntN i)) -> toInteger i)+            (const $ SimpleStrategy $ \_ l _ -> l)+      )++instance Mergeable SomeWordN where+  rootStrategy =+    SortedStrategy @Natural+      (\(SomeWordN (v :: WordN n)) -> natVal (Proxy @n))+      ( \n ->+          SortedStrategy @Integer+            (\(SomeWordN (WordN i)) -> toInteger i)+            (const $ SimpleStrategy $ \_ l _ -> l)+      )+ -- () deriving via (Default ()) instance Mergeable () @@ -935,5 +967,45 @@  deriving via (Default1 Monoid.Sum) instance Mergeable1 Monoid.Sum -instance (SupportedPrim a) => Mergeable (Sym a) where+#define MERGEABLE_SIMPLE(symtype) \+instance Mergeable symtype where \   rootStrategy = SimpleStrategy ites++#define MERGEABLE_BV(symtype) \+instance (KnownNat n, 1 <= n) => Mergeable (symtype n) where \+  rootStrategy = SimpleStrategy ites++#define MERGEABLE_BV_SOME(symtype) \+instance Mergeable symtype where \+  rootStrategy = SimpleStrategy ites++#define MERGEABLE_FUN(op) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => Mergeable (sa op sb) where \+  rootStrategy = SimpleStrategy ites++#if 1+MERGEABLE_SIMPLE(SymBool)+MERGEABLE_SIMPLE(SymInteger)+MERGEABLE_BV(SymIntN)+MERGEABLE_BV(SymWordN)+MERGEABLE_BV_SOME(SomeSymIntN)+MERGEABLE_BV_SOME(SomeSymWordN)+MERGEABLE_FUN(=~>)+MERGEABLE_FUN(-~>)+#endif++-- Exceptions+instance Mergeable ArithException where+  rootStrategy =+    SortedStrategy+      ( \case+          Overflow -> 0 :: Int+          Underflow -> 1 :: Int+          LossOfPrecision -> 2 :: Int+          DivideByZero -> 3 :: Int+          Denormal -> 4 :: Int+          RatioZeroDenominator -> 5 :: Int+      )+      (const $ SimpleStrategy $ \_ l r -> l)++deriving via (Default BitwidthMismatch) instance (Mergeable BitwidthMismatch)
src/Grisette/Core/Data/Class/ModelOps.hs view
@@ -130,6 +130,9 @@   -- | Check if the model is empty   isEmptyModel :: model -> Bool +  -- | Check if the model contains the given symbol+  modelContains :: typedSymbol a -> model -> Bool+   -- | Extract the assigned value for a given symbolic constant   valueOf :: typedSymbol t -> model -> Maybe t @@ -140,6 +143,9 @@   -- constants in the set   exceptFor :: symbolSet -> model -> model +  -- | Returns a model that removed the assignments for the symbolic constants+  exceptFor' :: typedSymbol t -> model -> model+   -- | Returns a model that only keeps the assignments for the symbolic   -- constants in the set   restrictTo :: symbolSet -> model -> model@@ -156,7 +162,7 @@   exact s = restrictTo s . extendTo s  -- | A type class for building a model manually from a model representation-class ModelOps model symbolSet typedSymbol => ModelRep rep model symbolSet (typedSymbol :: * -> *) where+class ModelRep rep model | rep -> model where   -- | Build a model   --   -- >>> let aBool = "a" :: TypedSymbol Bool
src/Grisette/Core/Data/Class/SOrd.hs view
@@ -1,7 +1,9 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-}@@ -33,8 +35,10 @@ import Data.Functor.Sum import Data.Int import Data.Word+import GHC.TypeLits import Generics.Deriving import {-# SOURCE #-} Grisette.Core.Control.Monad.UnionM+import Grisette.Core.Data.BV import Grisette.Core.Data.Class.Bool import Grisette.Core.Data.Class.SimpleMergeable import Grisette.Core.Data.Class.Solvable@@ -220,6 +224,14 @@   l >~ r = con $ l > r; \   symCompare l r = mrgSingle $ compare l r +#define CONCRETE_SORD_BV(type) \+instance (KnownNat n, 1 <= n) => SOrd (type n) where \+  l <=~ r = con $ l <= r; \+  l <~ r = con $ l < r; \+  l >=~ r = con $ l >= r; \+  l >~ r = con $ l > r; \+  symCompare l r = mrgSingle $ compare l r+ #if 1 CONCRETE_SORD(Bool) CONCRETE_SORD(Integer)@@ -234,7 +246,11 @@ CONCRETE_SORD(Word16) CONCRETE_SORD(Word32) CONCRETE_SORD(Word64)+CONCRETE_SORD(SomeWordN)+CONCRETE_SORD(SomeIntN) CONCRETE_SORD(B.ByteString)+CONCRETE_SORD_BV(WordN)+CONCRETE_SORD_BV(IntN) #endif  symCompareSingleList :: (SOrd a) => Bool -> Bool -> [a] -> [a] -> SymBool
+ src/Grisette/Core/Data/Class/SafeArith.hs view
@@ -0,0 +1,428 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++{- HLINT ignore "Redundant bracket" -}++-- |+-- Module      :   Grisette.Core.Data.Class.SafeArith+-- Copyright   :   (c) Sirui Lu 2021-2023+-- License     :   BSD-3-Clause (see the LICENSE file)+--+-- Maintainer  :   siruilu@cs.washington.edu+-- Stability   :   Experimental+-- Portability :   GHC only+module Grisette.Core.Data.Class.SafeArith+  ( -- * Symbolic integer operations+    ArithException (..),+    SafeDivision (..),+    SafeLinearArith (..),+    SymIntegerOp,+  )+where++import Control.Exception+import Control.Monad.Except+import Data.Int+import Data.Typeable+import Data.Word+import GHC.TypeNats+import Grisette.Core.Control.Monad.Union+import Grisette.Core.Data.BV+import Grisette.Core.Data.Class.Bool+import Grisette.Core.Data.Class.Error+import Grisette.Core.Data.Class.Mergeable+import Grisette.Core.Data.Class.SOrd+import Grisette.Core.Data.Class.SimpleMergeable+import Grisette.Core.Data.Class.Solvable++-- $setup+-- >>> import Grisette.Core+-- >>> import Grisette.IR.SymPrim++-- | Safe division with monadic error handling in multi-path+-- execution. These procedures throw an exception when the+-- divisor is zero. The result should be able to handle errors with+-- `MonadError`.+class (SOrd a, Num a, Mergeable a, Mergeable e) => SafeDivision e a | a -> e where+  -- | Safe signed 'div' with monadic error handling in multi-path execution.+  --+  -- >>> safeDiv (ssym "a") (ssym "b") :: ExceptT ArithException UnionM SymInteger+  -- ExceptT {If (= b 0) (Left divide by zero) (Right (div a b))}+  safeDiv :: (MonadError e uf, MonadUnion uf) => a -> a -> uf a+  safeDiv l r = do+    (d, _) <- safeDivMod l r+    mrgSingle d++  -- | Safe signed 'mod' with monadic error handling in multi-path execution.+  --+  -- >>> safeMod (ssym "a") (ssym "b") :: ExceptT ArithException UnionM SymInteger+  -- ExceptT {If (= b 0) (Left divide by zero) (Right (mod a b))}+  safeMod :: (MonadError e uf, MonadUnion uf) => a -> a -> uf a+  safeMod l r = do+    (_, m) <- safeDivMod l r+    mrgSingle m++  -- | Safe signed 'divMod' with monadic error handling in multi-path execution.+  --+  -- >>> safeDivMod (ssym "a") (ssym "b") :: ExceptT ArithException UnionM (SymInteger, SymInteger)+  -- ExceptT {If (= b 0) (Left divide by zero) (Right ((div a b),(mod a b)))}+  safeDivMod :: (MonadError e uf, MonadUnion uf) => a -> a -> uf (a, a)+  safeDivMod l r = do+    d <- safeDiv l r+    m <- safeMod l r+    mrgSingle (d, m)++  -- | Safe signed 'quot' with monadic error handling in multi-path execution.+  safeQuot :: (MonadError e uf, MonadUnion uf) => a -> a -> uf a+  safeQuot l r = do+    (d, m) <- safeDivMod l r+    mrgIf+      ((l >=~ 0 &&~ r >~ 0) ||~ (l <=~ 0 &&~ r <~ 0) ||~ m ==~ 0)+      (mrgSingle d)+      (mrgSingle $ d + 1)++  -- | Safe signed 'rem' with monadic error handling in multi-path execution.+  safeRem :: (MonadError e uf, MonadUnion uf) => a -> a -> uf a+  safeRem l r = do+    (d, m) <- safeDivMod l r+    mrgIf+      ((l >=~ 0 &&~ r >~ 0) ||~ (l <=~ 0 &&~ r <~ 0) ||~ m ==~ 0)+      (mrgSingle m)+      (mrgSingle $ m - r)++  -- | Safe signed 'quotRem' with monadic error handling in multi-path execution.+  safeQuotRem :: (MonadError e uf, MonadUnion uf) => a -> a -> uf (a, a)+  safeQuotRem l r = do+    (d, m) <- safeDivMod l r+    mrgIf+      ((l >=~ 0 &&~ r >~ 0) ||~ (l <=~ 0 &&~ r <~ 0) ||~ m ==~ 0)+      (mrgSingle (d, m))+      (mrgSingle (d + 1, m - r))++  -- | Safe signed 'div' with monadic error handling in multi-path execution.+  -- The error is transformed.+  --+  -- >>> safeDiv' (const ()) (ssym "a") (ssym "b") :: ExceptT () UnionM SymInteger+  -- ExceptT {If (= b 0) (Left ()) (Right (div a b))}+  safeDiv' :: (MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a+  safeDiv' t l r = do+    (d, _) <- safeDivMod' t l r+    mrgSingle d++  -- | Safe signed 'mod' with monadic error handling in multi-path execution.+  -- The error is transformed.+  --+  -- >>> safeMod' (const ()) (ssym "a") (ssym "b") :: ExceptT () UnionM SymInteger+  -- ExceptT {If (= b 0) (Left ()) (Right (mod a b))}+  safeMod' :: (MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a+  safeMod' t l r = do+    (_, m) <- safeDivMod' t l r+    mrgSingle m++  -- | Safe signed 'divMod' with monadic error handling in multi-path execution.+  -- The error is transformed.+  --+  -- >>> safeDivMod' (const ()) (ssym "a") (ssym "b") :: ExceptT () UnionM (SymInteger, SymInteger)+  -- ExceptT {If (= b 0) (Left ()) (Right ((div a b),(mod a b)))}+  safeDivMod' :: (MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf (a, a)+  safeDivMod' t l r = do+    d <- safeDiv' t l r+    m <- safeMod' t l r+    mrgSingle (d, m)++  -- | Safe signed 'quot' with monadic error handling in multi-path execution.+  -- The error is transformed.+  safeQuot' :: (MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a+  safeQuot' t l r = do+    (d, m) <- safeDivMod' t l r+    mrgIf+      ((l >=~ 0 &&~ r >~ 0) ||~ (l <=~ 0 &&~ r <~ 0) ||~ m ==~ 0)+      (mrgSingle d)+      (mrgSingle $ d + 1)++  -- | Safe signed 'rem' with monadic error handling in multi-path execution.+  -- The error is transformed.+  safeRem' :: (MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a+  safeRem' t l r = do+    (d, m) <- safeDivMod' t l r+    mrgIf+      ((l >=~ 0 &&~ r >~ 0) ||~ (l <=~ 0 &&~ r <~ 0) ||~ m ==~ 0)+      (mrgSingle m)+      (mrgSingle $ m - r)++  -- | Safe signed 'quotRem' with monadic error handling in multi-path execution.+  -- The error is transformed.+  safeQuotRem' :: (MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf (a, a)+  safeQuotRem' t l r = do+    (d, m) <- safeDivMod' t l r+    mrgIf+      ((l >=~ 0 &&~ r >~ 0) ||~ (l <=~ 0 &&~ r <~ 0) ||~ m ==~ 0)+      (mrgSingle (d, m))+      (mrgSingle (d + 1, m - r))++  {-# MINIMAL (safeDivMod | (safeDiv, safeMod)), (safeDivMod' | (safeDiv', safeMod')) #-}++#define QUOTE() '+#define QID(a) a+#define QRIGHT(a) QID(a)'++#define QRIGHTT(a) QID(a)' t'++#define SAFE_DIVISION_FUNC(name, op) \+name _ r | r == 0 = merge $ throwError DivideByZero; \+name l r = mrgSingle $ l `op` r; \+QRIGHTT(name) _ r | r == 0 = let t1 = t' in merge $ throwError (t' DivideByZero); \+QRIGHTT(name) l r = mrgSingle $ l `op` r++#define SAFE_DIVISION_CONCRETE(type) \+instance SafeDivision ArithException type where \+  SAFE_DIVISION_FUNC(safeDiv, div); \+  SAFE_DIVISION_FUNC(safeMod, mod); \+  SAFE_DIVISION_FUNC(safeDivMod, divMod); \+  SAFE_DIVISION_FUNC(safeQuot, quot); \+  SAFE_DIVISION_FUNC(safeRem, rem); \+  SAFE_DIVISION_FUNC(safeQuotRem, quotRem)++#define SAFE_DIVISION_CONCRETE_BV(type) \+instance (KnownNat n, 1 <= n) => SafeDivision ArithException (type n) where \+  SAFE_DIVISION_FUNC(safeDiv, div); \+  SAFE_DIVISION_FUNC(safeMod, mod); \+  SAFE_DIVISION_FUNC(safeDivMod, divMod); \+  SAFE_DIVISION_FUNC(safeQuot, quot); \+  SAFE_DIVISION_FUNC(safeRem, rem); \+  SAFE_DIVISION_FUNC(safeQuotRem, quotRem)++#if 1+SAFE_DIVISION_CONCRETE(Integer)+SAFE_DIVISION_CONCRETE(Int8)+SAFE_DIVISION_CONCRETE(Int16)+SAFE_DIVISION_CONCRETE(Int32)+SAFE_DIVISION_CONCRETE(Int64)+SAFE_DIVISION_CONCRETE(Int)+SAFE_DIVISION_CONCRETE(Word8)+SAFE_DIVISION_CONCRETE(Word16)+SAFE_DIVISION_CONCRETE(Word32)+SAFE_DIVISION_CONCRETE(Word64)+SAFE_DIVISION_CONCRETE(Word)+#endif++#define SAFE_DIVISION_FUNC_SOME(stype, type, name, op) \+  name (stype (l :: type l)) (stype (r :: type r)) = \+    (case sameNat (Proxy @l) (Proxy @r) of \+      Just Refl -> \+        if r == 0 \+          then merge $ throwError $ Right DivideByZero \+          else mrgSingle $ stype $ l `op` r; \+      Nothing -> merge $ throwError $ Left BitwidthMismatch); \+  QRIGHT(name) t (stype (l :: type l)) (stype (r :: type r)) = \+    (case sameNat (Proxy @l) (Proxy @r) of \+      Just Refl -> \+        if r == 0 \+          then merge $ throwError $ t (Right DivideByZero) \+          else mrgSingle $ stype $ l `op` r; \+      Nothing -> merge $ throwError $ t (Left BitwidthMismatch))++#define SAFE_DIVISION_FUNC_SOME_DIVMOD(stype, type, name, op) \+  name (stype (l :: type l)) (stype (r :: type r)) = \+    (case sameNat (Proxy @l) (Proxy @r) of \+      Just Refl -> \+        if r == 0 \+          then merge $ throwError $ Right DivideByZero \+          else (case l `op` r of (d, m) -> mrgSingle (stype d, stype m)); \+      Nothing -> merge $ throwError $ Left BitwidthMismatch); \+  QRIGHT(name) t (stype (l :: type l)) (stype (r :: type r)) = \+    (case sameNat (Proxy @l) (Proxy @r) of \+      Just Refl -> \+        if r == 0 \+          then merge $ throwError $ t (Right DivideByZero) \+          else (case l `op` r of (d, m) -> mrgSingle (stype d, stype m)); \+      Nothing -> merge $ throwError $ t (Left BitwidthMismatch))++#if 1+SAFE_DIVISION_CONCRETE_BV(IntN)+SAFE_DIVISION_CONCRETE_BV(WordN)+instance SafeDivision (Either BitwidthMismatch ArithException) SomeIntN where+  SAFE_DIVISION_FUNC_SOME(SomeIntN, IntN, safeDiv, div)+  SAFE_DIVISION_FUNC_SOME(SomeIntN, IntN, safeMod, mod)+  SAFE_DIVISION_FUNC_SOME_DIVMOD(SomeIntN, IntN, safeDivMod, divMod)+  SAFE_DIVISION_FUNC_SOME(SomeIntN, IntN, safeQuot, quot)+  SAFE_DIVISION_FUNC_SOME(SomeIntN, IntN, safeRem, rem)+  SAFE_DIVISION_FUNC_SOME_DIVMOD(SomeIntN, IntN, safeQuotRem, quotRem)++instance SafeDivision (Either BitwidthMismatch ArithException) SomeWordN where+  SAFE_DIVISION_FUNC_SOME(SomeWordN, WordN, safeDiv, div)+  SAFE_DIVISION_FUNC_SOME(SomeWordN, WordN, safeMod, mod)+  SAFE_DIVISION_FUNC_SOME_DIVMOD(SomeWordN, WordN, safeDivMod, divMod)+  SAFE_DIVISION_FUNC_SOME(SomeWordN, WordN, safeQuot, quot)+  SAFE_DIVISION_FUNC_SOME(SomeWordN, WordN, safeRem, rem)+  SAFE_DIVISION_FUNC_SOME_DIVMOD(SomeWordN, WordN, safeQuotRem, quotRem)+#endif++-- | Safe division with monadic error handling in multi-path+-- execution. These procedures throw an exception when overflow or underflow happens.+-- The result should be able to handle errors with `MonadError`.+class (SOrd a, Num a, Mergeable a, Mergeable e) => SafeLinearArith e a | a -> e where+  -- | Safe '+' with monadic error handling in multi-path execution.+  -- Overflows or underflows are treated as errors.+  --+  -- >>> safeAdd (ssym "a") (ssym "b") :: ExceptT ArithException UnionM SymInteger+  -- ExceptT {Right (+ a b)}+  -- >>> safeAdd (ssym "a") (ssym "b") :: ExceptT ArithException UnionM (SymIntN 4)+  -- ExceptT {If (ite (< 0x0 a) (&& (< 0x0 b) (< (+ a b) 0x0)) (&& (< a 0x0) (&& (< b 0x0) (<= 0x0 (+ a b))))) (If (< 0x0 a) (Left arithmetic overflow) (Left arithmetic underflow)) (Right (+ a b))}+  safeAdd :: (MonadError e uf, MonadUnion uf) => a -> a -> uf a++  -- | Safe 'negate' with monadic error handling in multi-path execution.+  -- Overflows or underflows are treated as errors.+  --+  -- >>> safeNeg (ssym "a") :: ExceptT ArithException UnionM SymInteger+  -- ExceptT {Right (- a)}+  -- >>> safeNeg (ssym "a") :: ExceptT ArithException UnionM (SymIntN 4)+  -- ExceptT {If (= a 0x8) (Left arithmetic overflow) (Right (- a))}+  safeNeg :: (MonadError e uf, MonadUnion uf) => a -> uf a++  -- | Safe '-' with monadic error handling in multi-path execution.+  -- Overflows or underflows are treated as errors.+  --+  -- >>> safeMinus (ssym "a") (ssym "b") :: ExceptT ArithException UnionM SymInteger+  -- ExceptT {Right (+ a (- b))}+  -- >>> safeMinus (ssym "a") (ssym "b") :: ExceptT ArithException UnionM (SymIntN 4)+  -- ExceptT {If (ite (<= 0x0 a) (&& (< b 0x0) (< (+ a (- b)) 0x0)) (&& (< a 0x0) (&& (< 0x0 b) (< 0x0 (+ a (- b)))))) (If (<= 0x0 a) (Left arithmetic overflow) (Left arithmetic underflow)) (Right (+ a (- b)))}+  safeMinus :: (MonadError e uf, MonadUnion uf) => a -> a -> uf a++  -- | Safe '+' with monadic error handling in multi-path execution.+  -- Overflows or underflows are treated as errors.+  -- The error is transformed.+  safeAdd' :: (MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a++  -- | Safe 'negate' with monadic error handling in multi-path execution.+  -- Overflows or underflows are treated as errors.+  -- The error is transformed.+  safeNeg' :: (MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> uf a++  -- | Safe '-' with monadic error handling in multi-path execution.+  -- Overflows or underflows are treated as errors.+  -- The error is transformed.+  safeMinus' :: (MonadError e' uf, MonadUnion uf, Mergeable e') => (e -> e') -> a -> a -> uf a++instance SafeLinearArith ArithException Integer where+  safeAdd l r = mrgSingle (l + r)+  safeNeg l = mrgSingle (-l)+  safeMinus l r = mrgSingle (l - r)+  safeAdd' _ l r = mrgSingle (l + r)+  safeNeg' _ l = mrgSingle (-l)+  safeMinus' _ l r = mrgSingle (l - r)++#define SAFE_LINARITH_SIGNED_CONCRETE_BODY \+  safeAdd l r = let res = l + r in \+    mrgIf (con $ l > 0 && r > 0 && res < 0) \+          (throwError Overflow) \+          (mrgIf (con $ l < 0 && r < 0 && res >= 0) \+                 (throwError Underflow) \+                 (return res));\+  safeAdd' t' l r = let res = l + r in \+    mrgIf (con $ l > 0 && r > 0 && res < 0) \+          (throwError (t' Overflow)) \+          (mrgIf (con $ l < 0 && r < 0 && res >= 0) \+                 (throwError (t' Underflow)) \+                 (return res)); \+  safeMinus l r = let res = l - r in \+    mrgIf (con $ l >= 0 && r < 0 && res < 0) \+          (throwError Overflow) \+          (mrgIf (con $ l < 0 && r > 0 && res > 0) \+                 (throwError Underflow) \+                 (return res));\+  safeMinus' t' l r = let res = l - r in \+    mrgIf (con $ l >= 0 && r < 0 && res < 0) \+          (throwError (t' Overflow)) \+          (mrgIf (con $ l < 0 && r > 0 && res > 0) \+                 (throwError (t' Underflow)) \+                 (return res)); \+  safeNeg v = mrgIf (con $ v == minBound) (throwError Overflow) (return $ -v);\+  safeNeg' t' v = mrgIf (con $ v == minBound) (throwError (t' Overflow)) (return $ -v)++#define SAFE_LINARITH_SIGNED_CONCRETE(type) \+instance SafeLinearArith ArithException type where \+  SAFE_LINARITH_SIGNED_CONCRETE_BODY++#define SAFE_LINARITH_SIGNED_BV_CONCRETE(type) \+instance (KnownNat n, 1 <= n) => SafeLinearArith ArithException (type n) where \+  SAFE_LINARITH_SIGNED_CONCRETE_BODY++#define SAFE_LINARITH_UNSIGNED_CONCRETE_BODY \+  safeAdd l r = let res = l + r in \+    mrgIf (con $ l > res || r > res) \+          (throwError Overflow) \+          (return res);\+  safeAdd' t' l r = let res = l + r in \+    mrgIf (con $ l > res || r > res) \+          (throwError (t' Overflow)) \+          (return res); \+  safeMinus l r = \+    mrgIf (con $ r > l) \+          (throwError Underflow) \+          (return $ l - r);\+  safeMinus' t' l r = \+    mrgIf (con $ r > l) \+          (throwError $ t' Underflow) \+          (return $ l - r);\+  safeNeg v = mrgIf (con $ v /= 0) (throwError Underflow) (return $ -v);\+  safeNeg' t' v = mrgIf (con $ v /= 0) (throwError (t' Underflow)) (return $ -v)++#define SAFE_LINARITH_UNSIGNED_CONCRETE(type) \+instance SafeLinearArith ArithException type where \+  SAFE_LINARITH_UNSIGNED_CONCRETE_BODY++#define SAFE_LINARITH_UNSIGNED_BV_CONCRETE(type) \+instance (KnownNat n, 1 <= n) => SafeLinearArith ArithException (type n) where \+  SAFE_LINARITH_UNSIGNED_CONCRETE_BODY++#define SAFE_LINARITH_SOME_CONCRETE(type, ctype) \+instance SafeLinearArith (Either BitwidthMismatch ArithException) type where \+  safeAdd (type (l :: ctype l)) (type (r :: ctype r)) = merge (\+    case sameNat (Proxy @l) (Proxy @r) of \+      Just Refl -> type <$> safeAdd' Right l r; \+      _ -> throwError $ Left BitwidthMismatch); \+  safeAdd' t (type (l :: ctype l)) (type (r :: ctype r)) = merge (\+    case sameNat (Proxy @l) (Proxy @r) of \+      Just Refl -> type <$> safeAdd' (t . Right) l r; \+      _ -> let t' = t; t''' = t in throwError $ t' $ Left BitwidthMismatch); \+  safeMinus (type (l :: ctype l)) (type (r :: ctype r)) = merge (\+    case sameNat (Proxy @l) (Proxy @r) of \+      Just Refl -> type <$> safeMinus' Right l r; \+      _ -> throwError $ Left BitwidthMismatch); \+  safeMinus' t (type (l :: ctype l)) (type (r :: ctype r)) = merge (\+    case sameNat (Proxy @l) (Proxy @r) of \+      Just Refl -> type <$> safeMinus' (t . Right) l r; \+      _ -> let t' = t; t''' = t in throwError $ t' $ Left BitwidthMismatch); \+  safeNeg (type l) = merge $ type <$> safeNeg' Right l; \+  safeNeg' t (type l) = merge $ type <$> safeNeg' (t . Right) l++#if 1+SAFE_LINARITH_SIGNED_CONCRETE(Int8)+SAFE_LINARITH_SIGNED_CONCRETE(Int16)+SAFE_LINARITH_SIGNED_CONCRETE(Int32)+SAFE_LINARITH_SIGNED_CONCRETE(Int64)+SAFE_LINARITH_SIGNED_CONCRETE(Int)+SAFE_LINARITH_SIGNED_BV_CONCRETE(IntN)+SAFE_LINARITH_SOME_CONCRETE(SomeIntN, IntN)+SAFE_LINARITH_UNSIGNED_CONCRETE(Word8)+SAFE_LINARITH_UNSIGNED_CONCRETE(Word16)+SAFE_LINARITH_UNSIGNED_CONCRETE(Word32)+SAFE_LINARITH_UNSIGNED_CONCRETE(Word64)+SAFE_LINARITH_UNSIGNED_CONCRETE(Word)+SAFE_LINARITH_UNSIGNED_BV_CONCRETE(WordN)+SAFE_LINARITH_SOME_CONCRETE(SomeWordN, WordN)+#endif++-- | Aggregation for the operations on symbolic integer types+class (Num a, SEq a, SOrd a, Solvable Integer a) => SymIntegerOp a
src/Grisette/Core/Data/Class/SimpleMergeable.hs view
@@ -1,5 +1,8 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE QuantifiedConstraints #-}@@ -56,6 +59,7 @@ import qualified Control.Monad.Writer.Strict as WriterStrict import Data.Kind import GHC.Generics+import GHC.TypeNats import Generics.Deriving import Grisette.Core.Data.Class.Bool import Grisette.Core.Data.Class.Function@@ -771,5 +775,33 @@  infixl 9 #~ -instance (SupportedPrim a) => SimpleMergeable (Sym a) where-  mrgIte = ites+#define SIMPLE_MERGEABLE_SIMPLE(symtype) \+instance SimpleMergeable symtype where \+  mrgIte = ites; \+  {-# INLINE mrgIte #-}++#define SIMPLE_MERGEABLE_BV(symtype) \+instance (KnownNat n, 1 <= n) => SimpleMergeable (symtype n) where \+  mrgIte = ites; \+  {-# INLINE mrgIte #-}++#define SIMPLE_MERGEABLE_SOME_BV(symtype, bf) \+instance SimpleMergeable symtype where \+  mrgIte c = bf (ites c) "mrgIte"; \+  {-# INLINE mrgIte #-}++#define SIMPLE_MERGEABLE_FUN(op) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => SimpleMergeable (sa op sb) where \+  mrgIte = ites; \+  {-# INLINE mrgIte #-}++#if 1+SIMPLE_MERGEABLE_SIMPLE(SymBool)+SIMPLE_MERGEABLE_SIMPLE(SymInteger)+SIMPLE_MERGEABLE_BV(SymIntN)+SIMPLE_MERGEABLE_BV(SymWordN)+SIMPLE_MERGEABLE_SOME_BV(SomeSymIntN, binSomeSymIntNR1)+SIMPLE_MERGEABLE_SOME_BV(SomeSymWordN, binSomeSymWordNR1)+SIMPLE_MERGEABLE_FUN(=~>)+SIMPLE_MERGEABLE_FUN(-~>)+#endif
src/Grisette/Core/Data/Class/Solver.hs view
@@ -68,9 +68,9 @@   where   -- | Solve a single formula. Find an assignment to it to make it true.   ---  -- >>> solve (UnboundedReasoning z3) ("a" &&~ ("b" :: SymInteger) ==~ 1)+  -- >>> solve (precise z3) ("a" &&~ ("b" :: SymInteger) ==~ 1)   -- Right (Model {a -> True :: Bool, b -> 1 :: Integer})-  -- >>> solve (UnboundedReasoning z3) ("a" &&~ nots "a")+  -- >>> solve (precise z3) ("a" &&~ nots "a")   -- Left Unsat   solve ::     -- | solver configuration@@ -82,7 +82,7 @@   -- | Solve a single formula while returning multiple models to make it true.   -- The maximum number of desired models are given.   ---  -- > >>> solveMulti (UnboundedReasoning z3) 4 ("a" ||~ "b")+  -- > >>> solveMulti (precise z3) 4 ("a" ||~ "b")   -- > [Model {a -> True :: Bool, b -> False :: Bool},Model {a -> False :: Bool, b -> True :: Bool},Model {a -> True :: Bool, b -> True :: Bool}]   solveMulti ::     -- | solver configuration@@ -91,12 +91,12 @@     Int ->     -- | formula to solve, the solver will try to make it true     SymBool ->-    IO [Model]+    IO ([Model], failure)    -- | Solve a single formula while returning multiple models to make it true.   -- All models are returned.   ---  -- > >>> solveAll (UnboundedReasoning z3) ("a" ||~ "b")+  -- > >>> solveAll (precise z3) ("a" ||~ "b")   -- > [Model {a -> True :: Bool, b -> False :: Bool},Model {a -> False :: Bool, b -> True :: Bool},Model {a -> True :: Bool, b -> True :: Bool}]   solveAll ::     -- | solver configuration@@ -131,7 +131,7 @@ --   translate _ = con True         -- non-errors are desirable -- :} ----- >>> solveExcept (UnboundedReasoning z3) translate res+-- >>> solveExcept (precise z3) translate res -- Right (Model {x -> 1 :: Integer}) solveExcept ::   ( UnionWithExcept t u e v,@@ -165,5 +165,5 @@   (Either e v -> SymBool) ->   -- | the program to be solved, should be a union of exception and values   t ->-  IO [Model]+  IO ([Model], failure) solveMultiExcept config n f v = solveMulti config n (simpleMerge $ f <$> extractUnionExcept v)
src/Grisette/Core/Data/Class/Substitute.hs view
@@ -1,7 +1,9 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE Trustworthy #-}@@ -32,8 +34,10 @@ import Data.Functor.Sum import Data.Int import Data.Word+import GHC.TypeNats import Generics.Deriving import Generics.Deriving.Instances ()+import Grisette.Core.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermSubstitution import Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermUtils@@ -59,12 +63,12 @@   --   -- >>> substituteSym "a" ("c" &&~ "d" :: Sym Bool) ["a" &&~ "b" :: Sym Bool, "a"]   -- [(&& (&& c d) b),(&& c d)]-  substituteSym :: TypedSymbol b -> Sym b -> a -> a+  substituteSym :: LinkedRep cb sb => TypedSymbol cb -> sb -> a -> a  -- | Auxiliary class for 'SubstituteSym' instance derivation class SubstituteSym' a where   -- | Auxiliary function for 'substituteSym' derivation-  substituteSym' :: TypedSymbol b -> Sym b -> a c -> a c+  substituteSym' :: LinkedRep cb sb => TypedSymbol cb -> sb -> a c -> a c  instance   ( Generic a,@@ -91,9 +95,13 @@   substituteSym' sym val (a :*: b) = substituteSym' sym val a :*: substituteSym' sym val b  #define CONCRETE_SUBSTITUTESYM(type) \-instance  SubstituteSym type where \+instance SubstituteSym type where \   substituteSym _ _ = id +#define CONCRETE_SUBSTITUTESYM_BV(type) \+instance (KnownNat n, 1 <= n) => SubstituteSym (type n) where \+  substituteSym _ _ = id+ #if 1 CONCRETE_SUBSTITUTESYM(Bool) CONCRETE_SUBSTITUTESYM(Integer)@@ -108,7 +116,11 @@ CONCRETE_SUBSTITUTESYM(Word16) CONCRETE_SUBSTITUTESYM(Word32) CONCRETE_SUBSTITUTESYM(Word64)+CONCRETE_SUBSTITUTESYM(SomeWordN)+CONCRETE_SUBSTITUTESYM(SomeIntN) CONCRETE_SUBSTITUTESYM(B.ByteString)+CONCRETE_SUBSTITUTESYM_BV(WordN)+CONCRETE_SUBSTITUTESYM_BV(IntN) #endif  instance SubstituteSym () where@@ -253,9 +265,12 @@ instance SubstituteSym (m a) => SubstituteSym (IdentityT m a) where   substituteSym sym val (IdentityT a) = IdentityT $ substituteSym sym val a +{-+ instance SubstituteSym (Sym a) where   substituteSym sym (Sym val) (Sym x) =     introSupportedPrimConstraint val $       introSupportedPrimConstraint x $         Sym $           substTerm sym val x+-}
src/Grisette/Core/Data/Class/ToCon.hs view
@@ -1,7 +1,9 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE Trustworthy #-}@@ -32,8 +34,10 @@ import Data.Int import Data.Word import GHC.Generics+import GHC.TypeNats import Generics.Deriving import Generics.Deriving.Instances ()+import Grisette.Core.Data.BV  -- $setup -- >>> import Grisette.Core@@ -88,6 +92,10 @@ instance ToCon type type where \   toCon = Just +#define CONCRETE_TOCON_BV(type) \+instance (KnownNat n, 1 <= n) => ToCon (type n) (type n) where \+  toCon = Just+ #if 1 CONCRETE_TOCON(Bool) CONCRETE_TOCON(Integer)@@ -102,7 +110,11 @@ CONCRETE_TOCON(Word16) CONCRETE_TOCON(Word32) CONCRETE_TOCON(Word64)+CONCRETE_TOCON(SomeWordN)+CONCRETE_TOCON(SomeIntN) CONCRETE_TOCON(B.ByteString)+CONCRETE_TOCON_BV(WordN)+CONCRETE_TOCON_BV(IntN) #endif  -- Unit
src/Grisette/Core/Data/Class/ToSym.hs view
@@ -1,7 +1,9 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE Trustworthy #-}@@ -34,7 +36,9 @@ import Data.Functor.Sum import Data.Int import Data.Word+import GHC.TypeNats import Generics.Deriving+import Grisette.Core.Data.BV  -- $setup -- >>> import Grisette.IR.SymPrim@@ -76,6 +80,10 @@ instance ToSym type type where \   toSym = id +#define CONCRETE_TOSYM_BV(type) \+instance (KnownNat n, 1 <= n) => ToSym (type n) (type n) where \+  toSym = id+ #if 1 CONCRETE_TOSYM(Bool) CONCRETE_TOSYM(Integer)@@ -90,7 +98,11 @@ CONCRETE_TOSYM(Word16) CONCRETE_TOSYM(Word32) CONCRETE_TOSYM(Word64)+CONCRETE_TOSYM(SomeIntN)+CONCRETE_TOSYM(SomeWordN) CONCRETE_TOSYM(B.ByteString)+CONCRETE_TOSYM_BV(IntN)+CONCRETE_TOSYM_BV(WordN) #endif  -- Unit
src/Grisette/Core/Data/Union.hs view
@@ -16,7 +16,7 @@ module Grisette.Core.Data.Union   ( -- * The union data structure. -    -- | Please consider using 'UnionM' instead.+    -- | Please consider using 'Grisette.Core.Control.Monad.UnionM' instead.     Union (..),     ifWithLeftMost,     ifWithStrategy,@@ -127,6 +127,10 @@ instance (Hashable a) => Hashable (Union a) where   s `hashWithSalt` (Single a) = s `hashWithSalt` (0 :: Int) `hashWithSalt` a   s `hashWithSalt` (If _ _ c l r) = s `hashWithSalt` (1 :: Int) `hashWithSalt` c `hashWithSalt` l `hashWithSalt` r++instance AllSyms a => AllSyms (Union a) where+  allSymsS (Single v) = allSymsS v+  allSymsS (If _ _ c t f) = \l -> SomeSym c : (allSymsS t . allSymsS f $ l)  -- | Fully reconstruct a 'Union' to maintain the merged invariant. fullReconstruct :: MergingStrategy a -> Union a -> Union a
src/Grisette/IR/SymPrim.hs view
@@ -14,33 +14,40 @@     -- ** Extended types     IntN,     WordN,+    SomeWordN (..),+    SomeIntN (..),     type (=->) (..),     type (-->),     (-->),      -- ** Symbolic types     SupportedPrim,-    Sym,+    SymRep (..),+    ConRep (..),+    LinkedRep,+    SymBool (..),+    SymInteger (..),+    SymWordN (..),+    SymIntN (..),+    SomeSymWordN (..),+    SomeSymIntN (..),+    type (=~>) (..),+    type (-~>) (..),     TypedSymbol (..),     symSize,     symsSize,--    -- ** Symbolic type synonyms-    SymBool,-    SymInteger,-    SymIntN,-    SymWordN,-    type (=~>),-    type (-~>),+    AllSyms (..),+    allSymsSize,      -- ** Symbolic constant sets and models     SymbolSet (..),     Model (..),     ModelValuePair (..),+    ModelSymPair (..),   ) where -import Grisette.IR.SymPrim.Data.BV+import Grisette.Core.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import Grisette.IR.SymPrim.Data.Prim.Model import Grisette.IR.SymPrim.Data.SymPrim
− src/Grisette/IR/SymPrim/Data/BV.hs
@@ -1,330 +0,0 @@-{-# LANGUAGE BangPatterns #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE KindSignatures #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -funbox-strict-fields #-}---- |--- Module      :   Grisette.IR.SymPrim.Data.BV--- Copyright   :   (c) Sirui Lu 2021-2023--- License     :   BSD-3-Clause (see the LICENSE file)------ Maintainer  :   siruilu@cs.washington.edu--- Stability   :   Experimental--- Portability :   GHC only-module Grisette.IR.SymPrim.Data.BV (IntN (..), WordN (..)) where--import Control.DeepSeq-import Control.Exception-import Data.Bits-import Data.Hashable-import Data.Proxy-import GHC.Enum-import GHC.Generics-import GHC.Real-import GHC.TypeNats-import Grisette.Core.Data.Class.BitVector-import Language.Haskell.TH.Syntax-import Numeric---- |--- Symbolic unsigned bit vectors.-newtype WordN (n :: Nat) = WordN {unWordN :: Integer}-  deriving (Eq, Ord, Generic, Lift, Hashable, NFData)--instance (KnownNat n, 1 <= n) => Show (WordN n) where-  show (WordN w) = if (bitwidth `mod` 4) == 0 then hexRepPre ++ hexRep else binRepPre ++ binRep-    where-      bitwidth = natVal (Proxy :: Proxy n)-      hexRepPre = "0x" ++ replicate (fromIntegral (bitwidth `div` 4) - length hexRep) '0'-      hexRep = showHex w ""-      binRepPre = "0b" ++ replicate (fromIntegral bitwidth - length binRep) '0'-      binRep = showIntAtBase 2 (\x -> if x == 0 then '0' else '1') w ""---- |--- Symbolic signed bit vectors.-newtype IntN (n :: Nat) = IntN {unIntN :: Integer}-  deriving (Eq, Generic, Lift, Hashable, NFData)--instance (KnownNat n, 1 <= n) => Show (IntN n) where-  show (IntN w) = if (bitwidth `mod` 4) == 0 then hexRepPre ++ hexRep else binRepPre ++ binRep-    where-      bitwidth = natVal (Proxy :: Proxy n)-      hexRepPre = "0x" ++ replicate (fromIntegral (bitwidth `div` 4) - length hexRep) '0'-      hexRep = showHex w ""-      binRepPre = "0b" ++ replicate (fromIntegral bitwidth - length binRep) '0'-      binRep = showIntAtBase 2 (\x -> if x == 0 then '0' else '1') w ""--instance (KnownNat n, 1 <= n) => Bits (WordN n) where-  WordN a .&. WordN b = WordN (a .&. b)-  WordN a .|. WordN b = WordN (a .|. b)-  WordN a `xor` WordN b = WordN (a `xor` b)-  complement a = maxBound `xor` a--  -- shift use default implementation-  -- rotate use default implementation-  zeroBits = WordN 0-  bit i-    | i < 0 || i >= fromIntegral (natVal (Proxy :: Proxy n)) = zeroBits-    | otherwise = WordN (bit i)--  -- setBit use default implementation-  clearBit (WordN a) i = WordN (clearBit a i)--  -- complementBit use default implementation-  testBit (WordN a) = testBit a-  bitSizeMaybe _ = Just $ fromIntegral (natVal (Proxy :: Proxy n))-  bitSize _ = fromIntegral (natVal (Proxy :: Proxy n))-  isSigned _ = False-  shiftL (WordN a) i = WordN (a `shiftL` i) .&. maxBound--  -- unsafeShiftL use default implementation-  shiftR (WordN a) i = WordN (a `shiftR` i)--  -- unsafeShiftR use default implementation-  rotateL a 0 = a-  rotateL (WordN a) k-    | k >= n = rotateL (WordN a) (k `mod` n)-    | otherwise = WordN $ l + h-    where-      n = fromIntegral $ natVal (Proxy :: Proxy n)-      s = n - k-      l = a `shiftR` s-      h = (a - (l `shiftL` s)) `shiftL` k-  rotateR a 0 = a-  rotateR (WordN a) k-    | k >= n = rotateR (WordN a) (k `mod` n)-    | otherwise = WordN $ l + h-    where-      n = fromIntegral $ natVal (Proxy :: Proxy n)-      s = n - k-      l = a `shiftR` k-      h = (a - (l `shiftL` k)) `shiftL` s-  popCount (WordN n) = popCount n--instance (KnownNat n, 1 <= n) => FiniteBits (WordN n) where-  finiteBitSize _ = fromIntegral (natVal (Proxy :: Proxy n))--instance (KnownNat n, 1 <= n) => Bounded (WordN n) where-  maxBound = WordN ((1 `shiftL` fromIntegral (natVal (Proxy :: Proxy n))) - 1)-  minBound = WordN 0--instance (KnownNat n, 1 <= n) => Enum (WordN n) where-  succ x-    | x /= maxBound = x + 1-    | otherwise = succError $ "WordN " ++ show (natVal (Proxy :: Proxy n))-  pred x-    | x /= minBound = x - 1-    | otherwise = predError $ "WordN " ++ show (natVal (Proxy :: Proxy n))-  toEnum i-    | i >= 0 && toInteger i <= toInteger (maxBound :: WordN n) = WordN (toInteger i)-    | otherwise = toEnumError ("WordN " ++ show (natVal (Proxy :: Proxy n))) i (minBound :: WordN n, maxBound :: WordN n)-  fromEnum (WordN n) = fromEnum n-  enumFrom = boundedEnumFrom-  {-# INLINE enumFrom #-}-  enumFromThen = boundedEnumFromThen-  {-# INLINE enumFromThen #-}--instance (KnownNat n, 1 <= n) => Real (WordN n) where-  toRational (WordN n) = n % 1--instance (KnownNat n, 1 <= n) => Integral (WordN n) where-  quot (WordN x) (WordN y) = WordN (x `quot` y)-  rem (WordN x) (WordN y) = WordN (x `rem` y)-  quotRem (WordN x) (WordN y) = case quotRem x y of-    (q, r) -> (WordN q, WordN r)-  div = quot-  mod = rem-  divMod = quotRem-  toInteger (WordN n) = n--instance (KnownNat n, 1 <= n) => Num (WordN n) where-  WordN x + WordN y = WordN (x + y) .&. maxBound-  WordN x * WordN y = WordN (x * y) .&. maxBound-  WordN x - WordN y-    | x >= y = WordN (x - y)-    | otherwise = WordN ((1 `shiftL` fromIntegral (natVal (Proxy :: Proxy n))) + x - y)-  negate (WordN 0) = WordN 0-  negate a = complement a + WordN 1-  abs x = x-  signum (WordN 0) = 0-  signum _ = 1-  fromInteger !x-    | x == 0 = WordN 0-    | x > 0 = WordN (x .&. unWordN (maxBound :: WordN n))-    | otherwise = -fromInteger (-x)--minusOneIntN :: forall proxy n. KnownNat n => proxy n -> IntN n-minusOneIntN _ = IntN (1 `shiftL` fromIntegral (natVal (Proxy :: Proxy n)) - 1)--instance (KnownNat n, 1 <= n) => Bits (IntN n) where-  IntN a .&. IntN b = IntN (a .&. b)-  IntN a .|. IntN b = IntN (a .|. b)-  IntN a `xor` IntN b = IntN (a `xor` b)-  complement a = minusOneIntN (Proxy :: Proxy n) `xor` a--  -- shift use default implementation-  -- rotate use default implementation-  zeroBits = IntN 0-  bit i = IntN (unWordN (bit i :: WordN n))--  -- setBit use default implementation-  clearBit (IntN a) i = IntN (clearBit a i)--  -- complementBit use default implementation-  testBit (IntN a) = testBit a-  bitSizeMaybe _ = Just $ fromIntegral (natVal (Proxy :: Proxy n))-  bitSize _ = fromIntegral (natVal (Proxy :: Proxy n))-  isSigned _ = True--  shiftL (IntN a) i = IntN (unWordN $ (WordN a :: WordN n) `shiftL` i)--  -- unsafeShiftL use default implementation-  shiftR i 0 = i-  shiftR (IntN i) k-    | k >= n = if b then IntN (maxi - 1) else IntN 0-    | otherwise = if b then IntN (maxi - noi + (i `shiftR` k)) else IntN (i `shiftR` k)-    where-      b = testBit i (n - 1)-      n = fromIntegral $ natVal (Proxy :: Proxy n)-      maxi = (1 :: Integer) `shiftL` n-      noi = (1 :: Integer) `shiftL` (n - k)--  -- unsafeShiftR use default implementation-  rotateL (IntN i) k = IntN $ unWordN $ rotateL (WordN i :: WordN n) k-  rotateR (IntN i) k = IntN $ unWordN $ rotateR (WordN i :: WordN n) k-  popCount (IntN i) = popCount i--instance (KnownNat n, 1 <= n) => FiniteBits (IntN n) where-  finiteBitSize _ = fromIntegral (natVal (Proxy :: Proxy n))--instance (KnownNat n, 1 <= n) => Bounded (IntN n) where-  maxBound = IntN (1 `shiftL` (fromIntegral (natVal (Proxy :: Proxy n)) - 1) - 1)-  minBound = maxBound + 1--instance (KnownNat n, 1 <= n) => Enum (IntN n) where-  succ x-    | x /= maxBound = x + 1-    | otherwise = succError $ "IntN " ++ show (natVal (Proxy :: Proxy n))-  pred x-    | x /= minBound = x - 1-    | otherwise = predError $ "IntN " ++ show (natVal (Proxy :: Proxy n))-  toEnum i-    | i >= fromIntegral (minBound :: IntN n) && i <= fromIntegral (maxBound :: IntN n) = fromIntegral i-    | otherwise = toEnumError ("IntN " ++ show (natVal (Proxy :: Proxy n))) i (minBound :: WordN n, maxBound :: WordN n)-  fromEnum = fromEnum . toInteger-  enumFrom = boundedEnumFrom-  {-# INLINE enumFrom #-}-  enumFromThen = boundedEnumFromThen-  {-# INLINE enumFromThen #-}--instance (KnownNat n, 1 <= n) => Real (IntN n) where-  toRational i = toInteger i % 1--instance (KnownNat n, 1 <= n) => Integral (IntN n) where-  quot x y =-    if x == minBound && y == -1-      then throw Overflow-      else fromInteger (toInteger x `quot` toInteger y)-  rem x y =-    if x == minBound && y == -1-      then throw Overflow-      else fromInteger (toInteger x `rem` toInteger y)-  quotRem x y =-    if x == minBound && y == -1-      then throw Overflow-      else case quotRem (toInteger x) (toInteger y) of-        (q, r) -> (fromInteger q, fromInteger r)-  div x y =-    if x == minBound && y == -1-      then throw Overflow-      else fromInteger (toInteger x `div` toInteger y)-  mod x y =-    if x == minBound && y == -1-      then throw Overflow-      else fromInteger (toInteger x `mod` toInteger y)-  divMod x y =-    if x == minBound && y == -1-      then throw Overflow-      else case divMod (toInteger x) (toInteger y) of-        (q, r) -> (fromInteger q, fromInteger r)-  toInteger i@(IntN n) = case signum i of-    0 -> 0-    1 -> n-    -1 ->-      let x = negate i-       in if signum x == -1 then -n else negate (toInteger x)-    _ -> undefined--instance (KnownNat n, 1 <= n) => Num (IntN n) where-  IntN x + IntN y = IntN (x + y) .&. minusOneIntN (Proxy :: Proxy n)-  IntN x * IntN y = IntN (x * y) .&. minusOneIntN (Proxy :: Proxy n)-  IntN x - IntN y-    | x >= y = IntN (x - y)-    | otherwise = IntN ((1 `shiftL` fromIntegral (natVal (Proxy :: Proxy n))) + x - y)-  negate (IntN 0) = IntN 0-  negate a = complement a + IntN 1-  abs x = if testBit x (fromIntegral $ natVal (Proxy :: Proxy n) - 1) then negate x else x-  signum (IntN 0) = IntN 0-  signum i = if testBit i (fromIntegral $ natVal (Proxy :: Proxy n) - 1) then -1 else 1-  fromInteger !x = IntN $ if v >= 0 then v else (1 `shiftL` n) + v-    where-      v = unWordN (fromInteger (x + maxn) :: WordN n) - maxn-      n = fromIntegral (natVal (Proxy :: Proxy n))-      maxn = 1 `shiftL` (n - 1) - 1--instance (KnownNat n, 1 <= n) => Ord (IntN n) where-  IntN a <= IntN b-    | as && not bs = True-    | not as && bs = False-    | otherwise = a <= b-    where-      n = fromIntegral (natVal (Proxy :: Proxy n))-      as = testBit a (n - 1)-      bs = testBit b (n - 1)--instance-  (KnownNat n, 1 <= n, KnownNat m, 1 <= m, KnownNat w, 1 <= w, w ~ (n + m)) =>-  BVConcat (WordN n) (WordN m) (WordN w)-  where-  bvconcat (WordN a) (WordN b) = WordN ((a `shiftL` fromIntegral (natVal (Proxy :: Proxy m))) .|. b)--instance-  (KnownNat n, 1 <= n, KnownNat m, 1 <= m, KnownNat w, 1 <= w, w ~ (n + m)) =>-  BVConcat (IntN n) (IntN m) (IntN w)-  where-  bvconcat (IntN a) (IntN b) = IntN $ unWordN $ bvconcat (WordN a :: WordN n) (WordN b :: WordN m)--instance (KnownNat n, 1 <= n, KnownNat r, n <= r) => BVExtend (WordN n) r (WordN r) where-  bvzeroExtend _ (WordN v) = WordN v-  bvsignExtend pr (WordN v) = if s then WordN (maxi - noi + v) else WordN v-    where-      r = fromIntegral $ natVal pr-      n = fromIntegral $ natVal (Proxy :: Proxy n)-      s = testBit v (n - 1)-      maxi = (1 :: Integer) `shiftL` r-      noi = (1 :: Integer) `shiftL` n-  bvextend = bvzeroExtend--instance (KnownNat n, 1 <= n, KnownNat r, n <= r) => BVExtend (IntN n) r (IntN r) where-  bvzeroExtend _ (IntN v) = IntN v-  bvsignExtend pr (IntN v) = IntN $ unWordN $ bvsignExtend pr (WordN v :: WordN n)-  bvextend = bvsignExtend--instance (KnownNat n, 1 <= n, KnownNat ix, KnownNat w, 1 <= w, ix + w <= n) => BVSelect (WordN n) ix w (WordN w) where-  bvselect pix pw (WordN v) = WordN ((v `shiftR` ix) .&. mask)-    where-      ix = fromIntegral $ natVal pix-      w = fromIntegral $ natVal pw-      mask = (1 `shiftL` w) - 1--instance (KnownNat n, 1 <= n, KnownNat ix, KnownNat w, 1 <= w, ix + w <= n) => BVSelect (IntN n) ix w (IntN w) where-  bvselect pix pw (IntN v) = IntN $ unWordN $ bvselect pix pw (WordN v :: WordN n)
src/Grisette/IR/SymPrim/Data/Prim/InternedTerm/InternedCtors.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE DataKinds #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}@@ -48,8 +49,14 @@     bvzeroExtendTerm,     tabularFunApplyTerm,     generalFunApplyTerm,-    divIntegerTerm,-    modIntegerTerm,+    divIntegralTerm,+    modIntegralTerm,+    quotIntegralTerm,+    remIntegralTerm,+    divBoundedIntegralTerm,+    modBoundedIntegralTerm,+    quotBoundedIntegralTerm,+    remBoundedIntegralTerm,   ) where @@ -219,78 +226,85 @@ bvconcatTerm ::   ( SupportedPrim (bv a),     SupportedPrim (bv b),-    SupportedPrim (bv c),+    SupportedPrim (bv (a + b)),     KnownNat a,     KnownNat b,-    KnownNat c,-    BVConcat (bv a) (bv b) (bv c)+    1 <= a,+    1 <= b,+    SizedBV bv   ) =>   Term (bv a) ->   Term (bv b) ->-  Term (bv c)+  Term (bv (a + b)) bvconcatTerm l r = internTerm $ UBVConcatTerm l r {-# INLINE bvconcatTerm #-}  bvselectTerm ::-  forall bv a ix w proxy.-  ( SupportedPrim (bv a),+  forall bv n ix w proxy.+  ( SupportedPrim (bv n),     SupportedPrim (bv w),-    KnownNat a,-    KnownNat w,+    KnownNat n,     KnownNat ix,-    BVSelect (bv a) ix w (bv w)+    KnownNat w,+    1 <= n,+    1 <= w,+    ix + w <= n,+    SizedBV bv   ) =>   proxy ix ->   proxy w ->-  Term (bv a) ->+  Term (bv n) ->   Term (bv w) bvselectTerm _ _ v = internTerm $ UBVSelectTerm (typeRep @ix) (typeRep @w) v {-# INLINE bvselectTerm #-}  bvextendTerm ::-  forall bv a n w proxy.-  ( SupportedPrim (bv a),-    SupportedPrim (bv w),-    KnownNat a,-    KnownNat n,-    KnownNat w,-    BVExtend (bv a) n (bv w)+  forall bv l r proxy.+  ( SupportedPrim (bv l),+    SupportedPrim (bv r),+    KnownNat l,+    KnownNat r,+    1 <= l,+    l <= r,+    SizedBV bv   ) =>   Bool ->-  proxy n ->-  Term (bv a) ->-  Term (bv w)-bvextendTerm signed _ v = internTerm $ UBVExtendTerm signed (typeRep @n) v+  proxy r ->+  Term (bv l) ->+  Term (bv r)+bvextendTerm signed _ v = internTerm $ UBVExtendTerm signed (typeRep @r) v {-# INLINE bvextendTerm #-}  bvsignExtendTerm ::-  forall bv a n w proxy.-  ( SupportedPrim (bv a),-    SupportedPrim (bv w),-    KnownNat a,-    KnownNat n,-    KnownNat w,-    BVExtend (bv a) n (bv w)+  forall bv l r proxy.+  ( SupportedPrim (bv l),+    SupportedPrim (bv r),+    KnownNat l,+    KnownNat r,+    1 <= l,+    l <= r,+    SizedBV bv   ) =>-  proxy n ->-  Term (bv a) ->-  Term (bv w)-bvsignExtendTerm _ v = internTerm $ UBVExtendTerm True (typeRep @n) v+  proxy r ->+  Term (bv l) ->+  Term (bv r)+bvsignExtendTerm _ v = internTerm $ UBVExtendTerm True (typeRep @r) v {-# INLINE bvsignExtendTerm #-}  bvzeroExtendTerm ::-  forall bv a n w proxy.-  ( SupportedPrim (bv a),-    SupportedPrim (bv w),-    KnownNat a,-    KnownNat n,-    KnownNat w,-    BVExtend (bv a) n (bv w)+  forall bv l r proxy.+  ( SupportedPrim (bv l),+    SupportedPrim (bv r),+    KnownNat l,+    KnownNat r,+    1 <= l,+    l <= r,+    SizedBV bv   ) =>-  proxy n ->-  Term (bv a) ->-  Term (bv w)-bvzeroExtendTerm _ v = internTerm $ UBVExtendTerm False (typeRep @n) v+  proxy r ->+  Term (bv l) ->+  Term (bv r)+bvzeroExtendTerm _ v = internTerm $ UBVExtendTerm False (typeRep @r) v {-# INLINE bvzeroExtendTerm #-}  tabularFunApplyTerm :: (SupportedPrim a, SupportedPrim b) => Term (a =-> b) -> Term a -> Term b@@ -301,10 +315,34 @@ generalFunApplyTerm f a = internTerm $ UGeneralFunApplyTerm f a {-# INLINE generalFunApplyTerm #-} -divIntegerTerm :: Term Integer -> Term Integer -> Term Integer-divIntegerTerm l r = internTerm $ UDivIntegerTerm l r-{-# INLINE divIntegerTerm #-}+divIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+divIntegralTerm l r = internTerm $ UDivIntegralTerm l r+{-# INLINE divIntegralTerm #-} -modIntegerTerm :: Term Integer -> Term Integer -> Term Integer-modIntegerTerm l r = internTerm $ UModIntegerTerm l r-{-# INLINE modIntegerTerm #-}+modIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+modIntegralTerm l r = internTerm $ UModIntegralTerm l r+{-# INLINE modIntegralTerm #-}++quotIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+quotIntegralTerm l r = internTerm $ UQuotIntegralTerm l r+{-# INLINE quotIntegralTerm #-}++remIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+remIntegralTerm l r = internTerm $ URemIntegralTerm l r+{-# INLINE remIntegralTerm #-}++divBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a+divBoundedIntegralTerm l r = internTerm $ UDivBoundedIntegralTerm l r+{-# INLINE divBoundedIntegralTerm #-}++modBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a+modBoundedIntegralTerm l r = internTerm $ UModBoundedIntegralTerm l r+{-# INLINE modBoundedIntegralTerm #-}++quotBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a+quotBoundedIntegralTerm l r = internTerm $ UQuotBoundedIntegralTerm l r+{-# INLINE quotBoundedIntegralTerm #-}++remBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a+remBoundedIntegralTerm l r = internTerm $ URemBoundedIntegralTerm l r+{-# INLINE remBoundedIntegralTerm #-}
src/Grisette/IR/SymPrim/Data/Prim/InternedTerm/InternedCtors.hs-boot view
@@ -1,3 +1,5 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeOperators #-} @@ -36,8 +38,14 @@     bvzeroExtendTerm,     tabularFunApplyTerm,     generalFunApplyTerm,-    divIntegerTerm,-    modIntegerTerm,+    divIntegralTerm,+    modIntegralTerm,+    quotIntegralTerm,+    remIntegralTerm,+    divBoundedIntegralTerm,+    modBoundedIntegralTerm,+    quotBoundedIntegralTerm,+    remBoundedIntegralTerm,   ) where @@ -108,66 +116,79 @@ bvconcatTerm ::   ( SupportedPrim (bv a),     SupportedPrim (bv b),-    SupportedPrim (bv c),+    SupportedPrim (bv (a + b)),     KnownNat a,     KnownNat b,-    KnownNat c,-    BVConcat (bv a) (bv b) (bv c)+    1 <= a,+    1 <= b,+    SizedBV bv   ) =>   Term (bv a) ->   Term (bv b) ->-  Term (bv c)+  Term (bv (a + b)) bvselectTerm ::-  forall bv a ix w proxy.-  ( SupportedPrim (bv a),+  forall bv n ix w proxy.+  ( SupportedPrim (bv n),     SupportedPrim (bv w),-    KnownNat a,-    KnownNat w,+    KnownNat n,     KnownNat ix,-    BVSelect (bv a) ix w (bv w)+    KnownNat w,+    1 <= n,+    1 <= w,+    ix + w <= n,+    SizedBV bv   ) =>   proxy ix ->   proxy w ->-  Term (bv a) ->+  Term (bv n) ->   Term (bv w) bvextendTerm ::-  forall bv a n w proxy.-  ( SupportedPrim (bv a),-    SupportedPrim (bv w),-    KnownNat a,-    KnownNat n,-    KnownNat w,-    BVExtend (bv a) n (bv w)+  forall bv l r proxy.+  ( SupportedPrim (bv l),+    SupportedPrim (bv r),+    KnownNat l,+    KnownNat r,+    1 <= l,+    l <= r,+    SizedBV bv   ) =>   Bool ->-  proxy n ->-  Term (bv a) ->-  Term (bv w)+  proxy r ->+  Term (bv l) ->+  Term (bv r) bvsignExtendTerm ::-  forall bv a n w proxy.-  ( SupportedPrim (bv a),-    SupportedPrim (bv w),-    KnownNat a,-    KnownNat n,-    KnownNat w,-    BVExtend (bv a) n (bv w)+  forall bv l r proxy.+  ( SupportedPrim (bv l),+    SupportedPrim (bv r),+    KnownNat l,+    KnownNat r,+    1 <= l,+    l <= r,+    SizedBV bv   ) =>-  proxy n ->-  Term (bv a) ->-  Term (bv w)+  proxy r ->+  Term (bv l) ->+  Term (bv r) bvzeroExtendTerm ::-  forall bv a n w proxy.-  ( SupportedPrim (bv a),-    SupportedPrim (bv w),-    KnownNat a,-    KnownNat n,-    KnownNat w,-    BVExtend (bv a) n (bv w)+  forall bv l r proxy.+  ( SupportedPrim (bv l),+    SupportedPrim (bv r),+    KnownNat l,+    KnownNat r,+    1 <= l,+    l <= r,+    SizedBV bv   ) =>-  proxy n ->-  Term (bv a) ->-  Term (bv w)+  proxy r ->+  Term (bv l) ->+  Term (bv r) tabularFunApplyTerm :: (SupportedPrim a, SupportedPrim b) => Term (a =-> b) -> Term a -> Term b generalFunApplyTerm :: (SupportedPrim a, SupportedPrim b) => Term (a --> b) -> Term a -> Term b-divIntegerTerm :: Term Integer -> Term Integer -> Term Integer-modIntegerTerm :: Term Integer -> Term Integer -> Term Integer+divIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+modIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+quotIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+remIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+divBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a+modBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a+quotBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a+remBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a
src/Grisette/IR/SymPrim/Data/Prim/InternedTerm/Term.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveAnyClass #-}@@ -7,6 +8,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskellQuotes #-}@@ -25,6 +27,9 @@ -- Portability :   GHC only module Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term   ( SupportedPrim (..),+    SymRep (..),+    ConRep (..),+    LinkedRep (..),     UnaryOp (..),     BinaryOp (..),     TernaryOp (..),@@ -35,8 +40,8 @@     someTypedSymbol,     Term (..),     UTerm (..),-    FunArg (..),     type (-->) (..),+    buildGeneralFun,   ) where @@ -50,9 +55,9 @@ import Data.Typeable (Proxy (..), cast) import GHC.Generics import GHC.TypeNats+import Grisette.Core.Data.BV import Grisette.Core.Data.Class.BitVector import Grisette.Core.Data.Class.Function-import Grisette.IR.SymPrim.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Caches import {-# SOURCE #-} Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors import {-# SOURCE #-} Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermSubstitution@@ -87,7 +92,25 @@   defaultValueDynamic :: proxy t -> ModelValue   defaultValueDynamic _ = toModelValue (defaultValue @t) +-- | Type family to resolve the concrete type associated with a symbolic type.+class ConRep sym where+  type ConType sym++-- | Type family to resolve the symbolic type associated with a concrete type.+class SupportedPrim con => SymRep con where+  type SymType con++-- | One-to-one mapping between symbolic types and concrete types. class+  (ConRep sym, SymRep con, sym ~ SymType con, con ~ ConType sym) =>+  LinkedRep con sym+    | con -> sym,+      sym -> con+  where+  underlyingTerm :: sym -> Term con+  wrapTerm :: Term con -> sym++class   (SupportedPrim arg, SupportedPrim t, Lift tag, NFData tag, Show tag, Typeable tag, Eq tag, Hashable tag) =>   UnaryOp tag arg t     | tag arg -> t@@ -308,42 +331,47 @@   BVConcatTerm ::     ( SupportedPrim (bv a),       SupportedPrim (bv b),-      SupportedPrim (bv c),+      SupportedPrim (bv (a + b)),       KnownNat a,       KnownNat b,-      KnownNat c,-      BVConcat (bv a) (bv b) (bv c)+      1 <= a,+      1 <= b,+      SizedBV bv     ) =>     {-# UNPACK #-} !Id ->     !(Term (bv a)) ->     !(Term (bv b)) ->-    Term (bv c)+    Term (bv (a + b))   BVSelectTerm ::-    ( SupportedPrim (bv a),+    ( SupportedPrim (bv n),       SupportedPrim (bv w),-      KnownNat a,-      KnownNat w,+      KnownNat n,       KnownNat ix,-      BVSelect (bv a) ix w (bv w)+      KnownNat w,+      1 <= n,+      1 <= w,+      ix + w <= n,+      SizedBV bv     ) =>     {-# UNPACK #-} !Id ->     !(TypeRep ix) ->     !(TypeRep w) ->-    !(Term (bv a)) ->+    !(Term (bv n)) ->     Term (bv w)   BVExtendTerm ::-    ( SupportedPrim (bv a),-      SupportedPrim (bv b),-      KnownNat a,-      KnownNat b,-      KnownNat n,-      BVExtend (bv a) n (bv b)+    ( SupportedPrim (bv l),+      SupportedPrim (bv r),+      KnownNat l,+      KnownNat r,+      1 <= l,+      l <= r,+      SizedBV bv     ) =>     {-# UNPACK #-} !Id ->     !Bool ->-    !(TypeRep n) ->-    !(Term (bv a)) ->-    Term (bv b)+    !(TypeRep r) ->+    !(Term (bv l)) ->+    Term (bv r)   TabularFunApplyTerm ::     ( SupportedPrim a,       SupportedPrim b@@ -360,8 +388,14 @@     Term (a --> b) ->     Term a ->     Term b-  DivIntegerTerm :: !Id -> Term Integer -> Term Integer -> Term Integer-  ModIntegerTerm :: !Id -> Term Integer -> Term Integer -> Term Integer+  DivIntegralTerm :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  ModIntegralTerm :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  QuotIntegralTerm :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  RemIntegralTerm :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  DivBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  ModBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  QuotBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  RemBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t  instance NFData (Term a) where   rnf i = identity i `seq` ()@@ -396,8 +430,14 @@   liftTyped (BVExtendTerm _ signed (_ :: TypeRep n) arg) = [||bvextendTerm signed (Proxy @n) arg||]   liftTyped (TabularFunApplyTerm _ func arg) = [||tabularFunApplyTerm func arg||]   liftTyped (GeneralFunApplyTerm _ func arg) = [||generalFunApplyTerm func arg||]-  liftTyped (DivIntegerTerm _ arg1 arg2) = [||divIntegerTerm arg1 arg2||]-  liftTyped (ModIntegerTerm _ arg1 arg2) = [||modIntegerTerm arg1 arg2||]+  liftTyped (DivIntegralTerm _ arg1 arg2) = [||divIntegralTerm arg1 arg2||]+  liftTyped (ModIntegralTerm _ arg1 arg2) = [||modIntegralTerm arg1 arg2||]+  liftTyped (QuotIntegralTerm _ arg1 arg2) = [||quotIntegralTerm arg1 arg2||]+  liftTyped (RemIntegralTerm _ arg1 arg2) = [||remIntegralTerm arg1 arg2||]+  liftTyped (DivBoundedIntegralTerm _ arg1 arg2) = [||divBoundedIntegralTerm arg1 arg2||]+  liftTyped (ModBoundedIntegralTerm _ arg1 arg2) = [||modBoundedIntegralTerm arg1 arg2||]+  liftTyped (QuotBoundedIntegralTerm _ arg1 arg2) = [||quotBoundedIntegralTerm arg1 arg2||]+  liftTyped (RemBoundedIntegralTerm _ arg1 arg2) = [||remBoundedIntegralTerm arg1 arg2||]  instance Show (Term ty) where   show (ConTerm i v) = "ConTerm{id=" ++ show i ++ ", v=" ++ show v ++ "}"@@ -468,10 +508,22 @@     "TabularFunApply{id=" ++ show i ++ ", func=" ++ show func ++ ", arg=" ++ show arg ++ "}"   show (GeneralFunApplyTerm i func arg) =     "GeneralFunApply{id=" ++ show i ++ ", func=" ++ show func ++ ", arg=" ++ show arg ++ "}"-  show (DivIntegerTerm i arg1 arg2) =-    "DivInteger{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"-  show (ModIntegerTerm i arg1 arg2) =-    "ModInteger{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+  show (DivIntegralTerm i arg1 arg2) =+    "DivIntegral{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+  show (ModIntegralTerm i arg1 arg2) =+    "ModIntegral{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+  show (QuotIntegralTerm i arg1 arg2) =+    "QuotIntegral{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+  show (RemIntegralTerm i arg1 arg2) =+    "RemIntegral{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+  show (DivBoundedIntegralTerm i arg1 arg2) =+    "DivBoundedIntegral{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+  show (ModBoundedIntegralTerm i arg1 arg2) =+    "ModBoundedIntegral{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+  show (QuotBoundedIntegralTerm i arg1 arg2) =+    "QuotBoundedIntegral{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+  show (RemBoundedIntegralTerm i arg1 arg2) =+    "RemBoundedIntegral{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"  instance (SupportedPrim t) => Eq (Term t) where   (==) = (==) `on` identity@@ -517,39 +569,44 @@   UBVConcatTerm ::     ( SupportedPrim (bv a),       SupportedPrim (bv b),-      SupportedPrim (bv c),+      SupportedPrim (bv (a + b)),       KnownNat a,       KnownNat b,-      KnownNat c,-      BVConcat (bv a) (bv b) (bv c)+      1 <= a,+      1 <= b,+      SizedBV bv     ) =>     !(Term (bv a)) ->     !(Term (bv b)) ->-    UTerm (bv c)+    UTerm (bv (a + b))   UBVSelectTerm ::-    ( SupportedPrim (bv a),+    ( SupportedPrim (bv n),       SupportedPrim (bv w),-      KnownNat a,+      KnownNat n,       KnownNat ix,       KnownNat w,-      BVSelect (bv a) ix w (bv w)+      1 <= n,+      1 <= w,+      ix + w <= n,+      SizedBV bv     ) =>     !(TypeRep ix) ->     !(TypeRep w) ->-    !(Term (bv a)) ->+    !(Term (bv n)) ->     UTerm (bv w)   UBVExtendTerm ::-    ( SupportedPrim (bv a),-      SupportedPrim (bv b),-      KnownNat a,-      KnownNat b,-      KnownNat n,-      BVExtend (bv a) n (bv b)+    ( SupportedPrim (bv l),+      SupportedPrim (bv r),+      KnownNat l,+      KnownNat r,+      1 <= l,+      l <= r,+      SizedBV bv     ) =>     !Bool ->-    !(TypeRep n) ->-    !(Term (bv a)) ->-    UTerm (bv b)+    !(TypeRep r) ->+    !(Term (bv l)) ->+    UTerm (bv r)   UTabularFunApplyTerm ::     ( SupportedPrim a,       SupportedPrim b@@ -564,8 +621,14 @@     Term (a --> b) ->     Term a ->     UTerm b-  UDivIntegerTerm :: Term Integer -> Term Integer -> UTerm Integer-  UModIntegerTerm :: Term Integer -> Term Integer -> UTerm Integer+  UDivIntegralTerm :: (SupportedPrim t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  UModIntegralTerm :: (SupportedPrim t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  UQuotIntegralTerm :: (SupportedPrim t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  URemIntegralTerm :: (SupportedPrim t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  UDivBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  UModBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  UQuotBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  URemBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => !(Term t) -> !(Term t) -> UTerm t  eqTypedId :: (TypeRep a, Id) -> (TypeRep b, Id) -> Bool eqTypedId (a, i1) (b, i2) = i1 == i2 && eqTypeRepBool a b@@ -618,16 +681,16 @@     DRotateBitsTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Int -> Description (Term t)     DBVConcatTerm :: TypeRep bv1 -> TypeRep bv2 -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)     DBVSelectTerm ::-      forall bv (a :: Nat) (w :: Nat) (ix :: Nat).+      forall bv (n :: Nat) (w :: Nat) (ix :: Nat).       !(TypeRep ix) ->-      !(TypeRep (bv a), Id) ->+      !(TypeRep (bv n), Id) ->       Description (Term (bv w))     DBVExtendTerm ::-      forall bv (a :: Nat) (b :: Nat) (n :: Nat).+      forall bv (l :: Nat) (r :: Nat).       !Bool ->-      !(TypeRep n) ->-      {-# UNPACK #-} !(TypeRep (bv a), Id) ->-      Description (Term (bv b))+      !(TypeRep r) ->+      {-# UNPACK #-} !(TypeRep (bv l), Id) ->+      Description (Term (bv r))     DTabularFunApplyTerm ::       {-# UNPACK #-} !(TypeRep (a =-> b), Id) ->       {-# UNPACK #-} !(TypeRep a, Id) ->@@ -636,8 +699,14 @@       {-# UNPACK #-} !(TypeRep (a --> b), Id) ->       {-# UNPACK #-} !(TypeRep a, Id) ->       Description (Term b)-    DDivIntegerTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Integer)-    DModIntegerTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Integer)+    DDivIntegralTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term a)+    DModIntegralTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term a)+    DQuotIntegralTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term a)+    DRemIntegralTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term a)+    DDivBoundedIntegralTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term a)+    DModBoundedIntegralTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term a)+    DQuotBoundedIntegralTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term a)+    DRemBoundedIntegralTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term a)    describe (UConTerm v) = DConTerm v   describe ((USymTerm name) :: UTerm t) = DSymTerm @t name@@ -679,8 +748,15 @@     DTabularFunApplyTerm (typeRep :: TypeRep f, identity func) (typeRep :: TypeRep a, identity arg)   describe (UGeneralFunApplyTerm (func :: Term f) (arg :: Term a)) =     DGeneralFunApplyTerm (typeRep :: TypeRep f, identity func) (typeRep :: TypeRep a, identity arg)-  describe (UDivIntegerTerm arg1 arg2) = DDivIntegerTerm (identity arg1) (identity arg2)-  describe (UModIntegerTerm arg1 arg2) = DModIntegerTerm (identity arg1) (identity arg2)+  describe (UDivIntegralTerm arg1 arg2) = DDivIntegralTerm (identity arg1) (identity arg2)+  describe (UModIntegralTerm arg1 arg2) = DModIntegralTerm (identity arg1) (identity arg2)+  describe (UQuotIntegralTerm arg1 arg2) = DRemIntegralTerm (identity arg1) (identity arg2)+  describe (URemIntegralTerm arg1 arg2) = DQuotIntegralTerm (identity arg1) (identity arg2)+  describe (UDivBoundedIntegralTerm arg1 arg2) = DDivBoundedIntegralTerm (identity arg1) (identity arg2)+  describe (UModBoundedIntegralTerm arg1 arg2) = DModBoundedIntegralTerm (identity arg1) (identity arg2)+  describe (UQuotBoundedIntegralTerm arg1 arg2) = DRemBoundedIntegralTerm (identity arg1) (identity arg2)+  describe (URemBoundedIntegralTerm arg1 arg2) = DQuotBoundedIntegralTerm (identity arg1) (identity arg2)+   identify i = go     where       go (UConTerm v) = ConTerm i v@@ -711,8 +787,14 @@       go (UBVExtendTerm signed n arg) = BVExtendTerm i signed n arg       go (UTabularFunApplyTerm func arg) = TabularFunApplyTerm i func arg       go (UGeneralFunApplyTerm func arg) = GeneralFunApplyTerm i func arg-      go (UDivIntegerTerm arg1 arg2) = DivIntegerTerm i arg1 arg2-      go (UModIntegerTerm arg1 arg2) = ModIntegerTerm i arg1 arg2+      go (UDivIntegralTerm arg1 arg2) = DivIntegralTerm i arg1 arg2+      go (UModIntegralTerm arg1 arg2) = ModIntegralTerm i arg1 arg2+      go (UQuotIntegralTerm arg1 arg2) = QuotIntegralTerm i arg1 arg2+      go (URemIntegralTerm arg1 arg2) = RemIntegralTerm i arg1 arg2+      go (UDivBoundedIntegralTerm arg1 arg2) = DivBoundedIntegralTerm i arg1 arg2+      go (UModBoundedIntegralTerm arg1 arg2) = ModBoundedIntegralTerm i arg1 arg2+      go (UQuotBoundedIntegralTerm arg1 arg2) = QuotBoundedIntegralTerm i arg1 arg2+      go (URemBoundedIntegralTerm arg1 arg2) = RemBoundedIntegralTerm i arg1 arg2   cache = termCache  instance (SupportedPrim t) => Eq (Description (Term t)) where@@ -751,8 +833,14 @@       && eqTypedId li ri   DTabularFunApplyTerm lf li == DTabularFunApplyTerm rf ri = eqTypedId lf rf && eqTypedId li ri   DGeneralFunApplyTerm lf li == DGeneralFunApplyTerm rf ri = eqTypedId lf rf && eqTypedId li ri-  DDivIntegerTerm li1 li2 == DDivIntegerTerm ri1 ri2 = li1 == ri1 && li2 == ri2-  DModIntegerTerm li1 li2 == DModIntegerTerm ri1 ri2 = li1 == ri1 && li2 == ri2+  DDivIntegralTerm li1 li2 == DDivIntegralTerm ri1 ri2 = li1 == ri1 && li2 == ri2+  DModIntegralTerm li1 li2 == DModIntegralTerm ri1 ri2 = li1 == ri1 && li2 == ri2+  DQuotIntegralTerm li1 li2 == DQuotIntegralTerm ri1 ri2 = li1 == ri1 && li2 == ri2+  DRemIntegralTerm li1 li2 == DRemIntegralTerm ri1 ri2 = li1 == ri1 && li2 == ri2+  DDivBoundedIntegralTerm li1 li2 == DDivBoundedIntegralTerm ri1 ri2 = li1 == ri1 && li2 == ri2+  DModBoundedIntegralTerm li1 li2 == DModBoundedIntegralTerm ri1 ri2 = li1 == ri1 && li2 == ri2+  DQuotBoundedIntegralTerm li1 li2 == DQuotBoundedIntegralTerm ri1 ri2 = li1 == ri1 && li2 == ri2+  DRemBoundedIntegralTerm li1 li2 == DRemBoundedIntegralTerm ri1 ri2 = li1 == ri1 && li2 == ri2   _ == _ = False  instance (SupportedPrim t) => Hashable (Description (Term t)) where@@ -804,8 +892,14 @@       `hashWithSalt` id1   hashWithSalt s (DTabularFunApplyTerm id1 id2) = s `hashWithSalt` (26 :: Int) `hashWithSalt` id1 `hashWithSalt` id2   hashWithSalt s (DGeneralFunApplyTerm id1 id2) = s `hashWithSalt` (27 :: Int) `hashWithSalt` id1 `hashWithSalt` id2-  hashWithSalt s (DDivIntegerTerm id1 id2) = s `hashWithSalt` (28 :: Int) `hashWithSalt` id1 `hashWithSalt` id2-  hashWithSalt s (DModIntegerTerm id1 id2) = s `hashWithSalt` (29 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+  hashWithSalt s (DDivIntegralTerm id1 id2) = s `hashWithSalt` (28 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+  hashWithSalt s (DModIntegralTerm id1 id2) = s `hashWithSalt` (29 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+  hashWithSalt s (DQuotIntegralTerm id1 id2) = s `hashWithSalt` (30 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+  hashWithSalt s (DRemIntegralTerm id1 id2) = s `hashWithSalt` (31 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+  hashWithSalt s (DDivBoundedIntegralTerm id1 id2) = s `hashWithSalt` (32 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+  hashWithSalt s (DModBoundedIntegralTerm id1 id2) = s `hashWithSalt` (33 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+  hashWithSalt s (DQuotBoundedIntegralTerm id1 id2) = s `hashWithSalt` (34 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+  hashWithSalt s (DRemBoundedIntegralTerm id1 id2) = s `hashWithSalt` (35 :: Int) `hashWithSalt` id1 `hashWithSalt` id2  -- Basic Bool defaultValueForBool :: Bool@@ -844,8 +938,6 @@   pformatCon = show   defaultValue = 0 -data FunArg = FunArg deriving (Show, Eq, Generic, Ord, Lift, Hashable, NFData)- -- | General symbolic function type. Use the '#' operator to apply the function. -- Note that this function should be applied to symbolic values only. It is by -- itself already a symbolic value, but can be considered partially concrete@@ -864,8 +956,34 @@ data (-->) a b where   GeneralFun :: (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Term b -> a --> b +instance (LinkedRep a sa, LinkedRep b sb) => Function (a --> b) where+  type Arg (a --> b) = SymType a+  type Ret (a --> b) = SymType b+  (GeneralFun s t) # x = wrapTerm $ substTerm s (underlyingTerm x) t++{-+pattern GeneralFun :: () => (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Term b -> a --> b+pattern GeneralFun arg v <- GeneralFun arg v++{-# COMPLETE GeneralFun #-}+-}+ infixr 0 --> +buildGeneralFun :: () => (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Term b -> a --> b+buildGeneralFun arg v = GeneralFun newarg (substTerm arg (symTerm newarg) v)+  where+    newarg = WithInfo arg ARG++data ARG = ARG+  deriving (Eq, Ord, Lift, Show, Generic)++instance NFData ARG where+  rnf ARG = ()++instance Hashable ARG where+  hashWithSalt s ARG = s `hashWithSalt` (0 :: Int)+ instance Eq (a --> b) where   GeneralFun sym1 tm1 == GeneralFun sym2 tm2 = sym1 == sym2 && tm1 == tm2 @@ -883,4 +1001,4 @@  instance (SupportedPrim a, SupportedPrim b) => SupportedPrim (a --> b) where   type PrimConstraint (a --> b) = (SupportedPrim a, SupportedPrim b)-  defaultValue = GeneralFun (WithInfo (SimpleSymbol "a") FunArg) (conTerm defaultValue)+  defaultValue = buildGeneralFun (SimpleSymbol "a") (conTerm defaultValue)
src/Grisette/IR/SymPrim/Data/Prim/InternedTerm/Term.hs-boot view
@@ -10,6 +10,9 @@  module Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term   ( SupportedPrim (..),+    SymRep (..),+    ConRep (..),+    LinkedRep (..),     UnaryOp (..),     BinaryOp (..),     TernaryOp (..),@@ -18,6 +21,7 @@     Term (..),     UTerm (..),     type (-->) (..),+    buildGeneralFun,   ) where @@ -51,7 +55,22 @@   defaultValueDynamic :: proxy t -> ModelValue   defaultValueDynamic _ = toModelValue (defaultValue @t) +class ConRep sym where+  type ConType sym++class SupportedPrim con => SymRep con where+  type SymType con+ class+  (ConRep sym, SymRep con, sym ~ SymType con, con ~ ConType sym) =>+  LinkedRep con sym+    | con -> sym,+      sym -> con+  where+  underlyingTerm :: sym -> Term con+  wrapTerm :: Term con -> sym++class   (SupportedPrim arg, SupportedPrim t, Lift tag, NFData tag, Show tag, Typeable tag, Eq tag, Hashable tag) =>   UnaryOp tag arg t     | tag arg -> t@@ -159,42 +178,47 @@   BVConcatTerm ::     ( SupportedPrim (bv a),       SupportedPrim (bv b),-      SupportedPrim (bv c),+      SupportedPrim (bv (a + b)),       KnownNat a,       KnownNat b,-      KnownNat c,-      BVConcat (bv a) (bv b) (bv c)+      1 <= a,+      1 <= b,+      SizedBV bv     ) =>     {-# UNPACK #-} !Id ->     !(Term (bv a)) ->     !(Term (bv b)) ->-    Term (bv c)+    Term (bv (a + b))   BVSelectTerm ::-    ( SupportedPrim (bv a),+    ( SupportedPrim (bv n),       SupportedPrim (bv w),-      KnownNat a,-      KnownNat w,+      KnownNat n,       KnownNat ix,-      BVSelect (bv a) ix w (bv w)+      KnownNat w,+      1 <= n,+      1 <= w,+      ix + w <= n,+      SizedBV bv     ) =>     {-# UNPACK #-} !Id ->     !(TypeRep ix) ->     !(TypeRep w) ->-    !(Term (bv a)) ->+    !(Term (bv n)) ->     Term (bv w)   BVExtendTerm ::-    ( SupportedPrim (bv a),-      SupportedPrim (bv b),-      KnownNat a,-      KnownNat b,-      KnownNat n,-      BVExtend (bv a) n (bv b)+    ( SupportedPrim (bv l),+      SupportedPrim (bv r),+      KnownNat l,+      KnownNat r,+      1 <= l,+      l <= r,+      SizedBV bv     ) =>     {-# UNPACK #-} !Id ->     !Bool ->-    !(TypeRep n) ->-    !(Term (bv a)) ->-    Term (bv b)+    !(TypeRep r) ->+    !(Term (bv l)) ->+    Term (bv r)   TabularFunApplyTerm ::     ( SupportedPrim a,       SupportedPrim b@@ -211,8 +235,14 @@     Term (a --> b) ->     Term a ->     Term b-  DivIntegerTerm :: !Id -> Term Integer -> Term Integer -> Term Integer-  ModIntegerTerm :: !Id -> Term Integer -> Term Integer -> Term Integer+  DivIntegralTerm :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  ModIntegralTerm :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  QuotIntegralTerm :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  RemIntegralTerm :: (SupportedPrim t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  DivBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  ModBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  QuotBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+  RemBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t  data UTerm t where   UConTerm :: (SupportedPrim t) => !t -> UTerm t@@ -252,39 +282,44 @@   UBVConcatTerm ::     ( SupportedPrim (bv a),       SupportedPrim (bv b),-      SupportedPrim (bv c),+      SupportedPrim (bv (a + b)),       KnownNat a,       KnownNat b,-      KnownNat c,-      BVConcat (bv a) (bv b) (bv c)+      1 <= a,+      1 <= b,+      SizedBV bv     ) =>     !(Term (bv a)) ->     !(Term (bv b)) ->-    UTerm (bv c)+    UTerm (bv (a + b))   UBVSelectTerm ::-    ( SupportedPrim (bv a),+    ( SupportedPrim (bv n),       SupportedPrim (bv w),-      KnownNat a,+      KnownNat n,       KnownNat ix,       KnownNat w,-      BVSelect (bv a) ix w (bv w)+      1 <= n,+      1 <= w,+      ix + w <= n,+      SizedBV bv     ) =>     !(TypeRep ix) ->     !(TypeRep w) ->-    !(Term (bv a)) ->+    !(Term (bv n)) ->     UTerm (bv w)   UBVExtendTerm ::-    ( SupportedPrim (bv a),-      SupportedPrim (bv b),-      KnownNat a,-      KnownNat b,-      KnownNat n,-      BVExtend (bv a) n (bv b)+    ( SupportedPrim (bv l),+      SupportedPrim (bv r),+      KnownNat l,+      KnownNat r,+      1 <= l,+      l <= r,+      SizedBV bv     ) =>     !Bool ->-    !(TypeRep n) ->-    !(Term (bv a)) ->-    UTerm (bv b)+    !(TypeRep r) ->+    !(Term (bv l)) ->+    UTerm (bv r)   UTabularFunApplyTerm ::     ( SupportedPrim a,       SupportedPrim b@@ -299,10 +334,18 @@     Term (a --> b) ->     Term a ->     UTerm b-  UDivIntegerTerm :: Term Integer -> Term Integer -> UTerm Integer-  UModIntegerTerm :: Term Integer -> Term Integer -> UTerm Integer+  UDivIntegralTerm :: (SupportedPrim t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  UModIntegralTerm :: (SupportedPrim t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  UQuotIntegralTerm :: (SupportedPrim t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  URemIntegralTerm :: (SupportedPrim t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  UDivBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  UModBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  UQuotBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => !(Term t) -> !(Term t) -> UTerm t+  URemBoundedIntegralTerm :: (SupportedPrim t, Bounded t, Integral t) => !(Term t) -> !(Term t) -> UTerm t  data (-->) a b where   GeneralFun :: (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Term b -> a --> b  infixr 0 -->++buildGeneralFun :: (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Term b -> a --> b
src/Grisette/IR/SymPrim/Data/Prim/InternedTerm/TermSubstitution.hs view
@@ -22,7 +22,7 @@ import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bits import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool import Grisette.IR.SymPrim.Data.Prim.PartialEval.GeneralFun-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral import Grisette.IR.SymPrim.Data.Prim.PartialEval.Num import Grisette.IR.SymPrim.Data.Prim.PartialEval.TabularFun import Type.Reflection@@ -74,5 +74,11 @@         BVExtendTerm _ n signed op -> SomeTerm $ pevalBVExtendTerm n signed (gov op)         TabularFunApplyTerm _ f op -> SomeTerm $ pevalTabularFunApplyTerm (gov f) (gov op)         GeneralFunApplyTerm _ f op -> SomeTerm $ pevalGeneralFunApplyTerm (gov f) (gov op)-        DivIntegerTerm _ op1 op2 -> SomeTerm $ pevalDivIntegerTerm (gov op1) (gov op2)-        ModIntegerTerm _ op1 op2 -> SomeTerm $ pevalModIntegerTerm (gov op1) (gov op2)+        DivIntegralTerm _ op1 op2 -> SomeTerm $ pevalDivIntegralTerm (gov op1) (gov op2)+        ModIntegralTerm _ op1 op2 -> SomeTerm $ pevalModIntegralTerm (gov op1) (gov op2)+        QuotIntegralTerm _ op1 op2 -> SomeTerm $ pevalQuotIntegralTerm (gov op1) (gov op2)+        RemIntegralTerm _ op1 op2 -> SomeTerm $ pevalRemIntegralTerm (gov op1) (gov op2)+        DivBoundedIntegralTerm _ op1 op2 -> SomeTerm $ pevalDivBoundedIntegralTerm (gov op1) (gov op2)+        ModBoundedIntegralTerm _ op1 op2 -> SomeTerm $ pevalModBoundedIntegralTerm (gov op1) (gov op2)+        QuotBoundedIntegralTerm _ op1 op2 -> SomeTerm $ pevalQuotBoundedIntegralTerm (gov op1) (gov op2)+        RemBoundedIntegralTerm _ op1 op2 -> SomeTerm $ pevalRemBoundedIntegralTerm (gov op1) (gov op2)
src/Grisette/IR/SymPrim/Data/Prim/InternedTerm/TermUtils.hs view
@@ -19,6 +19,8 @@     extractSymbolicsTerm,     castTerm,     pformat,+    someTermsSize,+    someTermSize,     termSize,     termsSize,   )@@ -35,36 +37,7 @@ import qualified Type.Reflection as R  identity :: Term t -> Id-identity (ConTerm i _) = i-identity (SymTerm i _) = i-identity (UnaryTerm i _ _) = i-identity (BinaryTerm i _ _ _) = i-identity (TernaryTerm i _ _ _ _) = i-identity (NotTerm i _) = i-identity (OrTerm i _ _) = i-identity (AndTerm i _ _) = i-identity (EqvTerm i _ _) = i-identity (ITETerm i _ _ _) = i-identity (AddNumTerm i _ _) = i-identity (UMinusNumTerm i _) = i-identity (TimesNumTerm i _ _) = i-identity (AbsNumTerm i _) = i-identity (SignumNumTerm i _) = i-identity (LTNumTerm i _ _) = i-identity (LENumTerm i _ _) = i-identity (AndBitsTerm i _ _) = i-identity (OrBitsTerm i _ _) = i-identity (XorBitsTerm i _ _) = i-identity (ComplementBitsTerm i _) = i-identity (ShiftBitsTerm i _ _) = i-identity (RotateBitsTerm i _ _) = i-identity (BVConcatTerm i _ _) = i-identity (BVSelectTerm i _ _ _) = i-identity (BVExtendTerm i _ _ _) = i-identity (TabularFunApplyTerm i _ _) = i-identity (GeneralFunApplyTerm i _ _) = i-identity (DivIntegerTerm i _ _) = i-identity (ModIntegerTerm i _ _) = i+identity = snd . identityWithTypeRep {-# INLINE identity #-}  identityWithTypeRep :: forall t. Term t -> (TypeRep, Id)@@ -96,8 +69,14 @@ identityWithTypeRep (BVExtendTerm i _ _ _) = (typeRep (Proxy @t), i) identityWithTypeRep (TabularFunApplyTerm i _ _) = (typeRep (Proxy @t), i) identityWithTypeRep (GeneralFunApplyTerm i _ _) = (typeRep (Proxy @t), i)-identityWithTypeRep (DivIntegerTerm i _ _) = (typeRep (Proxy @t), i)-identityWithTypeRep (ModIntegerTerm i _ _) = (typeRep (Proxy @t), i)+identityWithTypeRep (DivIntegralTerm i _ _) = (typeRep (Proxy @t), i)+identityWithTypeRep (ModIntegralTerm i _ _) = (typeRep (Proxy @t), i)+identityWithTypeRep (QuotIntegralTerm i _ _) = (typeRep (Proxy @t), i)+identityWithTypeRep (RemIntegralTerm i _ _) = (typeRep (Proxy @t), i)+identityWithTypeRep (DivBoundedIntegralTerm i _ _) = (typeRep (Proxy @t), i)+identityWithTypeRep (ModBoundedIntegralTerm i _ _) = (typeRep (Proxy @t), i)+identityWithTypeRep (QuotBoundedIntegralTerm i _ _) = (typeRep (Proxy @t), i)+identityWithTypeRep (RemBoundedIntegralTerm i _ _) = (typeRep (Proxy @t), i) {-# INLINE identityWithTypeRep #-}  introSupportedPrimConstraint :: forall t a. Term t -> ((SupportedPrim t) => a) -> a@@ -129,8 +108,14 @@ introSupportedPrimConstraint BVExtendTerm {} x = x introSupportedPrimConstraint TabularFunApplyTerm {} x = x introSupportedPrimConstraint GeneralFunApplyTerm {} x = x-introSupportedPrimConstraint DivIntegerTerm {} x = x-introSupportedPrimConstraint ModIntegerTerm {} x = x+introSupportedPrimConstraint DivIntegralTerm {} x = x+introSupportedPrimConstraint ModIntegralTerm {} x = x+introSupportedPrimConstraint QuotIntegralTerm {} x = x+introSupportedPrimConstraint RemIntegralTerm {} x = x+introSupportedPrimConstraint DivBoundedIntegralTerm {} x = x+introSupportedPrimConstraint ModBoundedIntegralTerm {} x = x+introSupportedPrimConstraint QuotBoundedIntegralTerm {} x = x+introSupportedPrimConstraint RemBoundedIntegralTerm {} x = x {-# INLINE introSupportedPrimConstraint #-}  extractSymbolicsSomeTerm :: SomeTerm -> S.HashSet SomeTypedSymbol@@ -175,8 +160,14 @@     go (SomeTerm (BVExtendTerm _ _ _ arg)) = goUnary arg     go (SomeTerm (TabularFunApplyTerm _ func arg)) = goBinary func arg     go (SomeTerm (GeneralFunApplyTerm _ func arg)) = goBinary func arg-    go (SomeTerm (DivIntegerTerm _ arg1 arg2)) = goBinary arg1 arg2-    go (SomeTerm (ModIntegerTerm _ arg1 arg2)) = goBinary arg1 arg2+    go (SomeTerm (DivIntegralTerm _ arg1 arg2)) = goBinary arg1 arg2+    go (SomeTerm (ModIntegralTerm _ arg1 arg2)) = goBinary arg1 arg2+    go (SomeTerm (QuotIntegralTerm _ arg1 arg2)) = goBinary arg1 arg2+    go (SomeTerm (RemIntegralTerm _ arg1 arg2)) = goBinary arg1 arg2+    go (SomeTerm (DivBoundedIntegralTerm _ arg1 arg2)) = goBinary arg1 arg2+    go (SomeTerm (ModBoundedIntegralTerm _ arg1 arg2)) = goBinary arg1 arg2+    go (SomeTerm (QuotBoundedIntegralTerm _ arg1 arg2)) = goBinary arg1 arg2+    go (SomeTerm (RemBoundedIntegralTerm _ arg1 arg2)) = goBinary arg1 arg2     goUnary arg = gocached (SomeTerm arg)     goBinary arg1 arg2 = do       r1 <- gocached (SomeTerm arg1)@@ -222,8 +213,14 @@ castTerm t@BVExtendTerm {} = cast t castTerm t@TabularFunApplyTerm {} = cast t castTerm t@GeneralFunApplyTerm {} = cast t-castTerm t@DivIntegerTerm {} = cast t-castTerm t@ModIntegerTerm {} = cast t+castTerm t@DivIntegralTerm {} = cast t+castTerm t@ModIntegralTerm {} = cast t+castTerm t@QuotIntegralTerm {} = cast t+castTerm t@RemIntegralTerm {} = cast t+castTerm t@DivBoundedIntegralTerm {} = cast t+castTerm t@ModBoundedIntegralTerm {} = cast t+castTerm t@QuotBoundedIntegralTerm {} = cast t+castTerm t@RemBoundedIntegralTerm {} = cast t {-# INLINE castTerm #-}  pformat :: forall t. (SupportedPrim t) => Term t -> String@@ -253,18 +250,26 @@ pformat (BVConcatTerm _ arg1 arg2) = "(bvconcat " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")" pformat (BVSelectTerm _ ix w arg) = "(bvselect " ++ show ix ++ " " ++ show w ++ " " ++ pformat arg ++ ")" pformat (BVExtendTerm _ signed n arg) =-  (if signed then "(bvsext " else "(bvzext") ++ show n ++ " " ++ pformat arg ++ ")"+  (if signed then "(bvsext " else "(bvzext ") ++ show n ++ " " ++ pformat arg ++ ")" pformat (TabularFunApplyTerm _ func arg) = "(apply " ++ pformat func ++ " " ++ pformat arg ++ ")" pformat (GeneralFunApplyTerm _ func arg) = "(apply " ++ pformat func ++ " " ++ pformat arg ++ ")"-pformat (DivIntegerTerm _ arg1 arg2) = "(div " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (ModIntegerTerm _ arg1 arg2) = "(mod " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"+pformat (DivIntegralTerm _ arg1 arg2) = "(div " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"+pformat (ModIntegralTerm _ arg1 arg2) = "(mod " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"+pformat (QuotIntegralTerm _ arg1 arg2) = "(quot " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"+pformat (RemIntegralTerm _ arg1 arg2) = "(rem " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"+pformat (DivBoundedIntegralTerm _ arg1 arg2) = "(div " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"+pformat (ModBoundedIntegralTerm _ arg1 arg2) = "(mod " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"+pformat (QuotBoundedIntegralTerm _ arg1 arg2) = "(quot " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"+pformat (RemBoundedIntegralTerm _ arg1 arg2) = "(rem " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")" {-# INLINE pformat #-} -termsSize :: [Term a] -> Int-termsSize terms = S.size $ execState (traverse go terms) S.empty+someTermsSize :: [SomeTerm] -> Int+someTermsSize terms = S.size $ execState (traverse goSome terms) S.empty   where     exists t = gets (S.member (SomeTerm t))     add t = modify' (S.insert (SomeTerm t))+    goSome :: SomeTerm -> State (S.HashSet SomeTerm) ()+    goSome (SomeTerm b) = go b     go :: forall b. Term b -> State (S.HashSet SomeTerm) ()     go t@ConTerm {} = add t     go t@SymTerm {} = add t@@ -294,8 +299,14 @@     go t@(BVExtendTerm _ _ _ arg) = goUnary t arg     go t@(TabularFunApplyTerm _ func arg) = goBinary t func arg     go t@(GeneralFunApplyTerm _ func arg) = goBinary t func arg-    go t@(DivIntegerTerm _ arg1 arg2) = goBinary t arg1 arg2-    go t@(ModIntegerTerm _ arg1 arg2) = goBinary t arg1 arg2+    go t@(DivIntegralTerm _ arg1 arg2) = goBinary t arg1 arg2+    go t@(ModIntegralTerm _ arg1 arg2) = goBinary t arg1 arg2+    go t@(QuotIntegralTerm _ arg1 arg2) = goBinary t arg1 arg2+    go t@(RemIntegralTerm _ arg1 arg2) = goBinary t arg1 arg2+    go t@(DivBoundedIntegralTerm _ arg1 arg2) = goBinary t arg1 arg2+    go t@(ModBoundedIntegralTerm _ arg1 arg2) = goBinary t arg1 arg2+    go t@(QuotBoundedIntegralTerm _ arg1 arg2) = goBinary t arg1 arg2+    go t@(RemBoundedIntegralTerm _ arg1 arg2) = goBinary t arg1 arg2     goUnary :: forall a b. (SupportedPrim a) => Term a -> Term b -> State (S.HashSet SomeTerm) ()     goUnary t arg = do       b <- exists t@@ -336,6 +347,14 @@           go arg1           go arg2           go arg3+{-# INLINEABLE someTermsSize #-}++someTermSize :: SomeTerm -> Int+someTermSize term = someTermsSize [term]+{-# INLINE someTermSize #-}++termsSize :: [Term a] -> Int+termsSize terms = someTermsSize $ (\x -> introSupportedPrimConstraint x $ SomeTerm x) <$> terms {-# INLINEABLE termsSize #-}  termSize :: Term a -> Int
src/Grisette/IR/SymPrim/Data/Prim/Model.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}@@ -43,7 +44,7 @@ import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bits import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool import Grisette.IR.SymPrim.Data.Prim.PartialEval.GeneralFun-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral import Grisette.IR.SymPrim.Data.Prim.PartialEval.Num import Grisette.IR.SymPrim.Data.Prim.PartialEval.TabularFun import Type.Reflection@@ -70,7 +71,7 @@       go0 (x : xs) = x ++ ", " ++ go0 xs  -- | Model returned by the solver.-newtype Model = Model {unModel :: M.HashMap SomeTypedSymbol ModelValue} deriving (Eq, Generic, Hashable)+newtype Model = Model {unModel :: M.HashMap SomeTypedSymbol ModelValue} deriving (Eq, Generic, Hashable, Semigroup, Monoid)  instance Show Model where   showsPrec prec (Model m) = showParen (prec >= 10) $ \x ->@@ -246,7 +247,9 @@     withSymbolSupported sym $       (unsafeFromModelValue @t)         <$> M.lookup (someTypedSymbol sym) m+  modelContains sym (Model m) = M.member (someTypedSymbol sym) m   exceptFor (SymbolSet s) (Model m) = Model $ S.foldl' (flip M.delete) m s+  exceptFor' s (Model m) = Model $ M.delete (someTypedSymbol s) m   restrictTo (SymbolSet s) (Model m) =     Model $       S.foldl'@@ -271,13 +274,24 @@         M.insert (someTypedSymbol sym) (toModelValue v) m  evaluateSomeTerm :: Bool -> Model -> SomeTerm -> SomeTerm-evaluateSomeTerm fillDefault (Model ma) = gomemo+evaluateSomeTerm fillDefault m@(Model ma) = gomemo   where     gomemo = htmemo go     gotyped :: (SupportedPrim a) => Term a -> Term a     gotyped a = case gomemo (SomeTerm a) of       SomeTerm v -> unsafeCoerce v-    go c@(SomeTerm ConTerm {}) = c+    go c@(SomeTerm (ConTerm _ cv :: Term v)) =+      case (typeRep :: TypeRep v) of+        App (App gf _) _ ->+          case eqTypeRep gf (typeRep @(-->)) of+            Just HRefl -> case cv of+              GeneralFun sym tm ->+                if modelContains sym m -- someTypedSymbol sym1 == someTypedSymbol sym+                  then case evaluateSomeTerm fillDefault (exceptFor' sym m) (SomeTerm tm) of+                    SomeTerm tm' -> SomeTerm $ conTerm $ GeneralFun sym tm' -- stm+                  else SomeTerm $ conTerm $ GeneralFun sym (gotyped tm)+            Nothing -> c+        _ -> c     go c@(SomeTerm ((SymTerm _ sym) :: Term a)) =       case M.lookup (someTypedSymbol sym) ma of         Nothing -> if fillDefault then SomeTerm $ conTerm (defaultValue @a) else c@@ -328,10 +342,22 @@       goBinary pevalTabularFunApplyTerm f arg     go (SomeTerm (GeneralFunApplyTerm _ f arg)) =       goBinary pevalGeneralFunApplyTerm f arg-    go (SomeTerm (DivIntegerTerm _ arg1 arg2)) =-      goBinary pevalDivIntegerTerm arg1 arg2-    go (SomeTerm (ModIntegerTerm _ arg1 arg2)) =-      goBinary pevalModIntegerTerm arg1 arg2+    go (SomeTerm (DivIntegralTerm _ arg1 arg2)) =+      goBinary pevalDivIntegralTerm arg1 arg2+    go (SomeTerm (ModIntegralTerm _ arg1 arg2)) =+      goBinary pevalModIntegralTerm arg1 arg2+    go (SomeTerm (QuotIntegralTerm _ arg1 arg2)) =+      goBinary pevalQuotIntegralTerm arg1 arg2+    go (SomeTerm (RemIntegralTerm _ arg1 arg2)) =+      goBinary pevalRemIntegralTerm arg1 arg2+    go (SomeTerm (DivBoundedIntegralTerm _ arg1 arg2)) =+      goBinary pevalDivBoundedIntegralTerm arg1 arg2+    go (SomeTerm (ModBoundedIntegralTerm _ arg1 arg2)) =+      goBinary pevalModBoundedIntegralTerm arg1 arg2+    go (SomeTerm (QuotBoundedIntegralTerm _ arg1 arg2)) =+      goBinary pevalQuotBoundedIntegralTerm arg1 arg2+    go (SomeTerm (RemBoundedIntegralTerm _ arg1 arg2)) =+      goBinary pevalRemBoundedIntegralTerm arg1 arg2     goUnary :: (SupportedPrim a, SupportedPrim b) => (Term a -> Term b) -> Term a -> SomeTerm     goUnary f a = SomeTerm $ f (gotyped a)     goBinary ::@@ -361,10 +387,106 @@ -- Model {x -> 1 :: Integer, y -> True :: Bool} data ModelValuePair t = (TypedSymbol t) ::= t deriving (Show) -instance ModelRep (ModelValuePair t) Model SymbolSet TypedSymbol where+instance ModelRep (ModelValuePair t) Model where   buildModel (sym ::= val) = insertValue sym val emptyModel +instance (ModelRep a Model, ModelRep b Model) => ModelRep (a, b) Model where+  buildModel (a, b) = buildModel a <> buildModel b+ instance+  ( ModelRep a Model,+    ModelRep b Model,+    ModelRep c Model+  ) =>+  ModelRep (a, b, c) Model+  where+  buildModel (a, b, c) = buildModel a <> buildModel b <> buildModel c++instance+  ( ModelRep a Model,+    ModelRep b Model,+    ModelRep c Model,+    ModelRep d Model+  ) =>+  ModelRep (a, b, c, d) Model+  where+  buildModel (a, b, c, d) =+    buildModel a <> buildModel b <> buildModel c <> buildModel d++instance+  ( ModelRep a Model,+    ModelRep b Model,+    ModelRep c Model,+    ModelRep d Model,+    ModelRep e Model+  ) =>+  ModelRep (a, b, c, d, e) Model+  where+  buildModel (a, b, c, d, e) =+    buildModel a <> buildModel b <> buildModel c <> buildModel d <> buildModel e++instance+  ( ModelRep a Model,+    ModelRep b Model,+    ModelRep c Model,+    ModelRep d Model,+    ModelRep e Model,+    ModelRep f Model+  ) =>+  ModelRep (a, b, c, d, e, f) Model+  where+  buildModel (a, b, c, d, e, f) =+    buildModel a+      <> buildModel b+      <> buildModel c+      <> buildModel d+      <> buildModel e+      <> buildModel f++instance+  ( ModelRep a Model,+    ModelRep b Model,+    ModelRep c Model,+    ModelRep d Model,+    ModelRep e Model,+    ModelRep f Model,+    ModelRep g Model+  ) =>+  ModelRep (a, b, c, d, e, f, g) Model+  where+  buildModel (a, b, c, d, e, f, g) =+    buildModel a+      <> buildModel b+      <> buildModel c+      <> buildModel d+      <> buildModel e+      <> buildModel f+      <> buildModel g++instance+  ( ModelRep a Model,+    ModelRep b Model,+    ModelRep c Model,+    ModelRep d Model,+    ModelRep e Model,+    ModelRep f Model,+    ModelRep g Model,+    ModelRep h Model+  ) =>+  ModelRep (a, b, c, d, e, f, g, h) Model+  where+  buildModel (a, b, c, d, e, f, g, h) =+    buildModel a+      <> buildModel b+      <> buildModel c+      <> buildModel d+      <> buildModel e+      <> buildModel f+      <> buildModel g+      <> buildModel h++{-+instance   ModelRep     ( ModelValuePair a,       ModelValuePair b@@ -545,3 +667,5 @@         . insertValue sym2 val2         . insertValue sym1 val1         $ emptyModel++-}
src/Grisette/IR/SymPrim/Data/Prim/PartialEval/BV.hs view
@@ -6,6 +6,7 @@ {-# LANGUAGE PolyKinds #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-}  -- |@@ -33,121 +34,133 @@  -- select pevalBVSelectTerm ::-  forall bv a ix w proxy.-  ( SupportedPrim (bv a),+  forall bv n ix w proxy.+  ( SupportedPrim (bv n),     SupportedPrim (bv w),-    KnownNat a,-    KnownNat w,+    KnownNat n,     KnownNat ix,-    BVSelect (bv a) ix w (bv w)+    KnownNat w,+    1 <= n,+    1 <= w,+    ix + w <= n,+    SizedBV bv   ) =>   proxy ix ->   proxy w ->-  Term (bv a) ->+  Term (bv n) ->   Term (bv w) pevalBVSelectTerm ix w = unaryUnfoldOnce (doPevalBVSelectTerm ix w) (bvselectTerm ix w)  doPevalBVSelectTerm ::-  forall bv a ix w proxy.-  ( SupportedPrim (bv a),+  forall bv n ix w proxy.+  ( SupportedPrim (bv n),     SupportedPrim (bv w),-    KnownNat a,-    KnownNat w,+    KnownNat n,     KnownNat ix,-    BVSelect (bv a) ix w (bv w)+    KnownNat w,+    1 <= n,+    1 <= w,+    ix + w <= n,+    SizedBV bv   ) =>   proxy ix ->   proxy w ->-  Term (bv a) ->+  Term (bv n) ->   Maybe (Term (bv w))-doPevalBVSelectTerm ix w (ConTerm _ b) = Just $ conTerm $ bvselect ix w b+doPevalBVSelectTerm ix w (ConTerm _ b) = Just $ conTerm $ sizedBVSelect ix w b doPevalBVSelectTerm _ _ _ = Nothing  -- ext pevalBVZeroExtendTerm ::-  forall proxy a n b bv.-  ( KnownNat a,-    KnownNat b,-    KnownNat n,-    BVExtend (bv a) n (bv b),-    SupportedPrim (bv a),-    SupportedPrim (bv b)+  forall proxy l r bv.+  ( KnownNat l,+    KnownNat r,+    1 <= l,+    l <= r,+    SupportedPrim (bv l),+    SupportedPrim (bv r),+    SizedBV bv   ) =>-  proxy n ->-  Term (bv a) ->-  Term (bv b)+  proxy r ->+  Term (bv l) ->+  Term (bv r) pevalBVZeroExtendTerm = pevalBVExtendTerm False  pevalBVSignExtendTerm ::-  forall proxy a n b bv.-  ( KnownNat a,-    KnownNat b,-    KnownNat n,-    BVExtend (bv a) n (bv b),-    SupportedPrim (bv a),-    SupportedPrim (bv b)+  forall proxy l r bv.+  ( KnownNat l,+    KnownNat r,+    1 <= l,+    l <= r,+    SupportedPrim (bv l),+    SupportedPrim (bv r),+    SizedBV bv   ) =>-  proxy n ->-  Term (bv a) ->-  Term (bv b)+  proxy r ->+  Term (bv l) ->+  Term (bv r) pevalBVSignExtendTerm = pevalBVExtendTerm True  pevalBVExtendTerm ::-  forall proxy a n b bv.-  ( KnownNat a,-    KnownNat b,-    KnownNat n,-    BVExtend (bv a) n (bv b),-    SupportedPrim (bv a),-    SupportedPrim (bv b)+  forall proxy l r bv.+  ( KnownNat l,+    KnownNat r,+    1 <= l,+    l <= r,+    SupportedPrim (bv l),+    SupportedPrim (bv r),+    SizedBV bv   ) =>   Bool ->-  proxy n ->-  Term (bv a) ->-  Term (bv b)+  proxy r ->+  Term (bv l) ->+  Term (bv r) pevalBVExtendTerm signed p = unaryUnfoldOnce (doPevalBVExtendTerm signed p) (bvextendTerm signed p)  doPevalBVExtendTerm ::-  forall proxy a n b bv.-  ( KnownNat a,-    KnownNat b,-    KnownNat n,-    BVExtend (bv a) n (bv b),-    SupportedPrim (bv a),-    SupportedPrim (bv b)+  forall proxy l r bv.+  ( KnownNat l,+    KnownNat r,+    1 <= l,+    l <= r,+    SupportedPrim (bv l),+    SupportedPrim (bv r),+    SizedBV bv   ) =>   Bool ->-  proxy n ->-  Term (bv a) ->-  Maybe (Term (bv b))-doPevalBVExtendTerm signed p (ConTerm _ b) = Just $ conTerm $ if signed then bvsignExtend p b else bvzeroExtend p b+  proxy r ->+  Term (bv l) ->+  Maybe (Term (bv r))+doPevalBVExtendTerm signed p (ConTerm _ b) = Just $ conTerm $ if signed then sizedBVSext p b else sizedBVZext p b doPevalBVExtendTerm _ _ _ = Nothing  pevalBVConcatTerm ::-  ( SupportedPrim (s w),-    SupportedPrim (s w'),-    SupportedPrim (s w''),-    KnownNat w,-    KnownNat w',-    KnownNat w'',-    BVConcat (s w) (s w') (s w'')+  ( SupportedPrim (bv a),+    SupportedPrim (bv b),+    SupportedPrim (bv (a + b)),+    KnownNat a,+    KnownNat b,+    1 <= a,+    1 <= b,+    SizedBV bv   ) =>-  Term (s w) ->-  Term (s w') ->-  Term (s w'')+  Term (bv a) ->+  Term (bv b) ->+  Term (bv (a + b)) pevalBVConcatTerm = binaryUnfoldOnce doPevalBVConcatTerm bvconcatTerm  doPevalBVConcatTerm ::-  ( SupportedPrim (s w),-    SupportedPrim (s w'),-    SupportedPrim (s w''),-    KnownNat w,-    KnownNat w',-    KnownNat w'',-    BVConcat (s w) (s w') (s w'')+  ( SupportedPrim (bv a),+    SupportedPrim (bv b),+    SupportedPrim (bv (a + b)),+    KnownNat a,+    KnownNat b,+    1 <= a,+    1 <= b,+    SizedBV bv   ) =>-  Term (s w) ->-  Term (s w') ->-  Maybe (Term (s w''))-doPevalBVConcatTerm (ConTerm _ v) (ConTerm _ v') = Just $ conTerm $ bvconcat v v'+  Term (bv a) ->+  Term (bv b) ->+  Maybe (Term (bv (a + b)))+doPevalBVConcatTerm (ConTerm _ v) (ConTerm _ v') = Just $ conTerm $ sizedBVConcat v v' doPevalBVConcatTerm _ _ = Nothing
src/Grisette/IR/SymPrim/Data/Prim/PartialEval/GeneralFun.hs view
@@ -17,6 +17,7 @@ import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import {-# SOURCE #-} Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermSubstitution+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool (pevalITETerm) import Grisette.IR.SymPrim.Data.Prim.PartialEval.PartialEval  pevalGeneralFunApplyTerm :: (SupportedPrim a, SupportedPrim b) => Term (a --> b) -> Term a -> Term b@@ -24,4 +25,6 @@  doPevalGeneralFunApplyTerm :: (SupportedPrim a, SupportedPrim b) => Term (a --> b) -> Term a -> Maybe (Term b) doPevalGeneralFunApplyTerm (ConTerm _ (GeneralFun arg tm)) v = Just $ substTerm arg v tm+doPevalGeneralFunApplyTerm (ITETerm _ c l r) v =+  return $ pevalITETerm c (pevalGeneralFunApplyTerm l v) (pevalGeneralFunApplyTerm r v) doPevalGeneralFunApplyTerm _ _ = Nothing
− src/Grisette/IR/SymPrim/Data/Prim/PartialEval/Integer.hs
@@ -1,36 +0,0 @@--- |--- Module      :   Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer--- Copyright   :   (c) Sirui Lu 2021-2023--- License     :   BSD-3-Clause (see the LICENSE file)------ Maintainer  :   siruilu@cs.washington.edu--- Stability   :   Experimental--- Portability :   GHC only-module Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer-  ( pevalDivIntegerTerm,-    pevalModIntegerTerm,-  )-where--import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Unfold---- div-pevalDivIntegerTerm :: Term Integer -> Term Integer -> Term Integer-pevalDivIntegerTerm = binaryUnfoldOnce doPevalDivIntegerTerm divIntegerTerm--doPevalDivIntegerTerm :: Term Integer -> Term Integer -> Maybe (Term Integer)-doPevalDivIntegerTerm (ConTerm _ a) (ConTerm _ b) | b /= 0 = Just $ conTerm $ a `div` b-doPevalDivIntegerTerm a (ConTerm _ 1) = Just a-doPevalDivIntegerTerm _ _ = Nothing---- mod-pevalModIntegerTerm :: Term Integer -> Term Integer -> Term Integer-pevalModIntegerTerm = binaryUnfoldOnce doPevalModIntegerTerm modIntegerTerm--doPevalModIntegerTerm :: Term Integer -> Term Integer -> Maybe (Term Integer)-doPevalModIntegerTerm (ConTerm _ a) (ConTerm _ b) | b /= 0 = Just $ conTerm $ a `mod` b-doPevalModIntegerTerm _ (ConTerm _ 1) = Just $ conTerm 0-doPevalModIntegerTerm _ (ConTerm _ (-1)) = Just $ conTerm 0-doPevalModIntegerTerm _ _ = Nothing
+ src/Grisette/IR/SymPrim/Data/Prim/PartialEval/Integral.hs view
@@ -0,0 +1,88 @@+{-# LANGUAGE ScopedTypeVariables #-}++-- |+-- Module      :   Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral+-- Copyright   :   (c) Sirui Lu 2021-2023+-- License     :   BSD-3-Clause (see the LICENSE file)+--+-- Maintainer  :   siruilu@cs.washington.edu+-- Stability   :   Experimental+-- Portability :   GHC only+module Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral+  ( pevalDivIntegralTerm,+    pevalModIntegralTerm,+    pevalQuotIntegralTerm,+    pevalRemIntegralTerm,+    pevalDivBoundedIntegralTerm,+    pevalModBoundedIntegralTerm,+    pevalQuotBoundedIntegralTerm,+    pevalRemBoundedIntegralTerm,+  )+where++import Grisette.Core.Data.BV+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermUtils+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Unfold+import Grisette.IR.SymPrim.Data.Prim.Utils++-- div+pevalDivIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+pevalDivIntegralTerm = binaryUnfoldOnce doPevalDivIntegralTerm divIntegralTerm++doPevalDivIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Maybe (Term a)+doPevalDivIntegralTerm (ConTerm _ a) (ConTerm _ b) | b /= 0 = Just $ conTerm $ a `div` b+doPevalDivIntegralTerm a (ConTerm _ 1) = Just a+doPevalDivIntegralTerm _ _ = Nothing++pevalDivBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a+pevalDivBoundedIntegralTerm = binaryUnfoldOnce doPevalDivBoundedIntegralTerm divBoundedIntegralTerm++doPevalDivBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Maybe (Term a)+doPevalDivBoundedIntegralTerm (ConTerm _ a) (ConTerm _ b) | b /= 0 && (b /= -1 || a /= minBound) = Just $ conTerm $ a `div` b+doPevalDivBoundedIntegralTerm a (ConTerm _ 1) = Just a+doPevalDivBoundedIntegralTerm _ _ = Nothing++-- mod+pevalModIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+pevalModIntegralTerm = binaryUnfoldOnce doPevalModIntegralTerm modIntegralTerm++doPevalModIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Maybe (Term a)+doPevalModIntegralTerm (ConTerm _ a) (ConTerm _ b) | b /= 0 = Just $ conTerm $ a `mod` b+doPevalModIntegralTerm _ (ConTerm _ 1) = Just $ conTerm 0+doPevalModIntegralTerm _ (ConTerm _ (-1)) = Just $ conTerm 0+doPevalModIntegralTerm _ _ = Nothing++pevalModBoundedIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+pevalModBoundedIntegralTerm = pevalModIntegralTerm++-- quot+pevalQuotIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+pevalQuotIntegralTerm = binaryUnfoldOnce doPevalQuotIntegralTerm quotIntegralTerm++doPevalQuotIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Maybe (Term a)+doPevalQuotIntegralTerm (ConTerm _ a) (ConTerm _ b) | b /= 0 = Just $ conTerm $ a `quot` b+doPevalQuotIntegralTerm a (ConTerm _ 1) = Just a+doPevalQuotIntegralTerm _ _ = Nothing++pevalQuotBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a+pevalQuotBoundedIntegralTerm = binaryUnfoldOnce doPevalQuotBoundedIntegralTerm quotBoundedIntegralTerm++doPevalQuotBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Maybe (Term a)+doPevalQuotBoundedIntegralTerm (ConTerm _ a) (ConTerm _ b) | b /= 0 && (b /= -1 || a /= minBound) = Just $ conTerm $ a `quot` b+doPevalQuotBoundedIntegralTerm a (ConTerm _ 1) = Just a+doPevalQuotBoundedIntegralTerm _ _ = Nothing++-- rem+pevalRemIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Term a+pevalRemIntegralTerm = binaryUnfoldOnce doPevalRemIntegralTerm remIntegralTerm++doPevalRemIntegralTerm :: (SupportedPrim a, Integral a) => Term a -> Term a -> Maybe (Term a)+doPevalRemIntegralTerm (ConTerm _ a) (ConTerm _ b) | b /= 0 = Just $ conTerm $ a `rem` b+doPevalRemIntegralTerm _ (ConTerm _ 1) = Just $ conTerm 0+doPevalRemIntegralTerm _ (ConTerm _ (-1)) = Just $ conTerm 0+doPevalRemIntegralTerm _ _ = Nothing++pevalRemBoundedIntegralTerm :: (SupportedPrim a, Bounded a, Integral a) => Term a -> Term a -> Term a+pevalRemBoundedIntegralTerm = pevalRemIntegralTerm
src/Grisette/IR/SymPrim/Data/Prim/PartialEval/PartialEval.hs view
@@ -5,6 +5,7 @@ {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}  -- | -- Module      :   Grisette.IR.SymPrim.Data.Prim.PartialEval.PartialEval
src/Grisette/IR/SymPrim/Data/SymPrim.hs view
@@ -1,632 +1,1594 @@ {-# LANGUAGE CPP #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE UndecidableInstances #-}---- |--- Module      :   Grisette.IR.SymPrim.Data.SymPrim--- Copyright   :   (c) Sirui Lu 2021-2023--- License     :   BSD-3-Clause (see the LICENSE file)------ Maintainer  :   siruilu@cs.washington.edu--- Stability   :   Experimental--- Portability :   GHC only-module Grisette.IR.SymPrim.Data.SymPrim-  ( Sym (..),-    SymBool,-    SymInteger,-    (-->),-    type (=~>),-    type (-~>),-    SymWordN,-    SymIntN,-    symSize,-    symsSize,-    ModelSymPair (..),-  )-where--import Control.DeepSeq-import Control.Monad.Except-import Data.Bits-import Data.Hashable-import Data.Int-import Data.Proxy-import Data.String-import Data.Word-import GHC.Generics-import GHC.TypeLits-import Grisette.Core.Data.Class.BitVector-import Grisette.Core.Data.Class.Bool-import Grisette.Core.Data.Class.Error-import Grisette.Core.Data.Class.Evaluate-import Grisette.Core.Data.Class.ExtractSymbolics-import Grisette.Core.Data.Class.Function-import Grisette.Core.Data.Class.GenSym-import Grisette.Core.Data.Class.Integer-import Grisette.Core.Data.Class.Mergeable-import Grisette.Core.Data.Class.ModelOps-import Grisette.Core.Data.Class.SOrd-import Grisette.Core.Data.Class.SimpleMergeable-import Grisette.Core.Data.Class.Solvable-import Grisette.Core.Data.Class.Substitute-import Grisette.Core.Data.Class.ToCon-import Grisette.Core.Data.Class.ToSym-import Grisette.IR.SymPrim.Data.BV-import Grisette.IR.SymPrim.Data.IntBitwidth-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermSubstitution-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermUtils-import Grisette.IR.SymPrim.Data.Prim.Model-import Grisette.IR.SymPrim.Data.Prim.PartialEval.BV-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bits-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool-import Grisette.IR.SymPrim.Data.Prim.PartialEval.GeneralFun-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Num-import Grisette.IR.SymPrim.Data.Prim.PartialEval.TabularFun-import Grisette.IR.SymPrim.Data.TabularFun-import Grisette.Lib.Control.Monad-import Language.Haskell.TH.Syntax---- $setup--- >>> import Grisette.Core--- >>> import Grisette.IR.SymPrim--- >>> import Grisette.Backend.SBV---- | Symbolic primitive type.------ Symbolic Boolean, integer, and bit vector types are supported.------ >>> :set -XOverloadedStrings--- >>> "a" :: Sym Bool--- a--- >>> "a" &&~ "b" :: Sym Bool--- (&& a b)--- >>> "i" + 1 :: Sym Integer--- (+ 1 i)------ For more symbolic operations, please refer to the documentation of the--- [grisette-core](https://hackage.haskell.org/package/grisette-core) package.------ Grisette also supports uninterpreted functions. You can use the '-->'--- (general function) or '=->' (tabular function) types to define uninterpreted--- functions. The following code shows the examples------ >>> :set -XTypeOperators--- >>> let ftab = "ftab" :: Sym (Integer =-> Integer)--- >>> ftab # "x"--- (apply ftab x)------ > >>> solve (UnboundedReasoning z3) (ftab # 1 ==~ 2 &&~ ftab # 2 ==~ 3 &&~ ftab # 3 ==~ 4)--- > Right (Model {--- >   ftab ->--- >     TabularFun {funcTable = [(3,4),(2,3)], defaultFuncValue = 2}--- >       :: (=->) Integer Integer--- > }) -- possible result (reformatted)------ >>> let fgen = "fgen" :: Sym (Integer --> Integer)--- >>> fgen # "x"--- (apply fgen x)------ > >>> solve (UnboundedReasoning z3) (fgen # 1 ==~ 2 &&~ fgen # 2 ==~ 3 &&~ fgen # 3 ==~ 4)--- > Right (Model {--- >   fgen ->--- >     \(arg@0:FuncArg :: Integer) ->--- >       (ite (= arg@0:FuncArg 2) 3 (ite (= arg@0:FuncArg 3) 4 2))--- >         :: (-->) Integer Integer--- > }) -- possible result (reformatted)-newtype Sym a = Sym {underlyingTerm :: Term a} deriving (Lift, Generic)--instance NFData (Sym a) where-  rnf (Sym t) = rnf t--instance (SupportedPrim a) => Solvable a (Sym a) where-  con = Sym . conTerm-  ssym = Sym . ssymTerm-  isym str i = Sym $ isymTerm str i-  sinfosym str info = Sym $ sinfosymTerm str info-  iinfosym str i info = Sym $ iinfosymTerm str i info-  conView (Sym (ConTerm _ t)) = Just t-  conView _ = Nothing--instance (SupportedPrim t) => IsString (Sym t) where-  fromString = ssym--instance (SupportedPrim a) => ToSym (Sym a) (Sym a) where-  toSym = id--instance (SupportedPrim a) => ToSym a (Sym a) where-  toSym = con--instance (SupportedPrim a) => ToCon (Sym a) (Sym a) where-  toCon = Just--instance (SupportedPrim a) => ToCon (Sym a) a where-  toCon = conView--instance (SupportedPrim a) => EvaluateSym (Sym a) where-  evaluateSym fillDefault model (Sym t) = Sym $ evaluateTerm fillDefault model t--instance (SupportedPrim a) => ExtractSymbolics (Sym a) where-  extractSymbolics (Sym t) = SymbolSet $ extractSymbolicsTerm t--instance (SupportedPrim a) => Show (Sym a) where-  show (Sym t) = pformat t--instance (SupportedPrim a) => Hashable (Sym a) where-  hashWithSalt s (Sym v) = s `hashWithSalt` v--instance (SupportedPrim a) => Eq (Sym a) where-  (Sym l) == (Sym r) = l == r--#define SEQ_SYM(type) \-instance (SupportedPrim type) => SEq (Sym type) where \-  (Sym l) ==~ (Sym r) = Sym $ pevalEqvTerm l r--#define SORD_SYM(type) \-instance (SupportedPrim type) => SOrd (Sym type) where \-  (Sym a) <=~ (Sym b) = Sym $ withPrim (Proxy @type) $ pevalLeNumTerm a b; \-  (Sym a) <~ (Sym b) = Sym $ withPrim (Proxy @type) $ pevalLtNumTerm a b; \-  (Sym a) >=~ (Sym b) = Sym $ withPrim (Proxy @type) $ pevalGeNumTerm a b; \-  (Sym a) >~ (Sym b) = Sym $ withPrim (Proxy @type) $ pevalGtNumTerm a b; \-  a `symCompare` b = \-    withPrim (Proxy @type) $ mrgIf \-      (a <~ b) \-      (mrgReturn LT) \-      (mrgIf (a ==~ b) (mrgReturn EQ) (mrgReturn GT))--#if 1-SEQ_SYM(Bool)-SEQ_SYM(Integer)-SEQ_SYM((IntN n))-SEQ_SYM((WordN n))-SORD_SYM(Integer)-SORD_SYM((IntN n))-SORD_SYM((WordN n))-#endif---- | Symbolic Boolean type.-type SymBool = Sym Bool--instance SOrd (Sym Bool) where-  l <=~ r = nots l ||~ r-  l <~ r = nots l &&~ r-  l >=~ r = l ||~ nots r-  l >~ r = l &&~ nots r-  symCompare l r =-    mrgIf-      (nots l &&~ r)-      (mrgReturn LT)-      (mrgIf (l ==~ r) (mrgReturn EQ) (mrgReturn GT))--instance SymBoolOp (Sym Bool)---- | Symbolic integer type (unbounded, mathematical integer).-type SymInteger = Sym Integer--instance Num (Sym Integer) where-  (Sym l) + (Sym r) = Sym $ pevalAddNumTerm l r-  (Sym l) - (Sym r) = Sym $ pevalMinusNumTerm l r-  (Sym l) * (Sym r) = Sym $ pevalTimesNumTerm l r-  negate (Sym v) = Sym $ pevalUMinusNumTerm v-  abs (Sym v) = Sym $ pevalAbsNumTerm v-  signum (Sym v) = Sym $ pevalSignumNumTerm v-  fromInteger = con--instance SignedDivMod (Sym Integer) where-  divs (Sym l) rs@(Sym r) =-    mrgIf-      (rs ==~ con 0)-      (throwError $ transformError DivideByZero)-      (mrgReturn $ Sym $ pevalDivIntegerTerm l r)-  mods (Sym l) rs@(Sym r) =-    mrgIf-      (rs ==~ con 0)-      (throwError $ transformError DivideByZero)-      (mrgReturn $ Sym $ pevalModIntegerTerm l r)--instance SymIntegerOp (Sym Integer)---- | Symbolic signed bit vector type.-type SymIntN n = Sym (IntN n)--instance (SupportedPrim (IntN n)) => Num (Sym (IntN n)) where-  (Sym l) + (Sym r) = Sym $ withPrim (Proxy @(IntN n)) $ pevalAddNumTerm l r-  (Sym l) - (Sym r) = Sym $ withPrim (Proxy @(IntN n)) $ pevalMinusNumTerm l r-  (Sym l) * (Sym r) = Sym $ withPrim (Proxy @(IntN n)) $ pevalTimesNumTerm l r-  negate (Sym v) = Sym $ withPrim (Proxy @(IntN n)) $ pevalUMinusNumTerm v-  abs (Sym v) = Sym $ withPrim (Proxy @(IntN n)) $ pevalAbsNumTerm v-  signum (Sym v) = Sym $ withPrim (Proxy @(IntN n)) $ pevalSignumNumTerm v-  fromInteger i = withPrim (Proxy @(IntN n)) $ con $ fromInteger i--instance (SupportedPrim (IntN n)) => Bits (Sym (IntN n)) where-  Sym l .&. Sym r = Sym $ withPrim (Proxy @(IntN n)) $ pevalAndBitsTerm l r-  Sym l .|. Sym r = Sym $ withPrim (Proxy @(IntN n)) $ pevalOrBitsTerm l r-  Sym l `xor` Sym r = Sym $ withPrim (Proxy @(IntN n)) $ pevalXorBitsTerm l r-  complement (Sym n) = Sym $ withPrim (Proxy @(IntN n)) $ pevalComplementBitsTerm n-  shift (Sym n) i = Sym $ withPrim (Proxy @(IntN n)) $ pevalShiftBitsTerm n i-  rotate (Sym n) i = Sym $ withPrim (Proxy @(IntN n)) $ pevalRotateBitsTerm n i-  bitSize _ = fromInteger $ withPrim (Proxy @(IntN n)) $ natVal (Proxy @n)-  bitSizeMaybe _ = Just $ fromInteger $ withPrim (Proxy @(IntN n)) $ natVal (Proxy @n)-  isSigned _ = True-  testBit (Con n) = withPrim (Proxy @(IntN n)) $ testBit n-  testBit _ = error "You cannot call testBit on symbolic variables"-  bit = withPrim (Proxy @(IntN n)) $ con . bit-  popCount (Con n) = withPrim (Proxy @(IntN n)) $ popCount n-  popCount _ = error "You cannot call popCount on symbolic variables"--instance-  (KnownNat w', KnownNat n, KnownNat w, w' ~ (n + w), 1 <= n, 1 <= w, 1 <= w') =>-  BVConcat (Sym (IntN n)) (Sym (IntN w)) (Sym (IntN w'))-  where-  bvconcat (Sym l) (Sym r) = Sym (pevalBVConcatTerm l r)--instance-  ( KnownNat w,-    KnownNat w',-    1 <= w,-    1 <= w',-    w <= w',-    w + 1 <= w',-    1 <= w' - w,-    KnownNat (w' - w)-  ) =>-  BVExtend (Sym (IntN w)) w' (Sym (IntN w'))-  where-  bvzeroExtend _ (Sym v) = Sym $ pevalBVExtendTerm False (Proxy @w') v-  bvsignExtend _ (Sym v) = Sym $ pevalBVExtendTerm True (Proxy @w') v-  bvextend = bvsignExtend--instance-  ( KnownNat ix,-    KnownNat w,-    KnownNat ow,-    ix + w <= ow,-    1 <= ow,-    1 <= w-  ) =>-  BVSelect (Sym (IntN ow)) ix w (Sym (IntN w))-  where-  bvselect pix pw (Sym v) = Sym $ pevalBVSelectTerm pix pw v--#define TOSYM_MACHINE_INTEGER(int, bv) \-instance ToSym int (Sym (bv)) where \-  toSym = fromIntegral--#define TOCON_MACHINE_INTEGER(bvw, n, int) \-instance ToCon (Sym (bvw n)) int where \-  toCon (Con (bvw v :: bvw n)) = Just $ fromIntegral v; \-  toCon _ = Nothing--#if 1-TOSYM_MACHINE_INTEGER(Int8, IntN 8)-TOSYM_MACHINE_INTEGER(Int16, IntN 16)-TOSYM_MACHINE_INTEGER(Int32, IntN 32)-TOSYM_MACHINE_INTEGER(Int64, IntN 64)-TOSYM_MACHINE_INTEGER(Word8, WordN 8)-TOSYM_MACHINE_INTEGER(Word16, WordN 16)-TOSYM_MACHINE_INTEGER(Word32, WordN 32)-TOSYM_MACHINE_INTEGER(Word64, WordN 64)-TOSYM_MACHINE_INTEGER(Int, IntN $intBitwidthQ)-TOSYM_MACHINE_INTEGER(Word, WordN $intBitwidthQ)--TOCON_MACHINE_INTEGER(IntN, 8, Int8)-TOCON_MACHINE_INTEGER(IntN, 16, Int16)-TOCON_MACHINE_INTEGER(IntN, 32, Int32)-TOCON_MACHINE_INTEGER(IntN, 64, Int64)-TOCON_MACHINE_INTEGER(WordN, 8, Word8)-TOCON_MACHINE_INTEGER(WordN, 16, Word16)-TOCON_MACHINE_INTEGER(WordN, 32, Word32)-TOCON_MACHINE_INTEGER(WordN, 64, Word64)-TOCON_MACHINE_INTEGER(IntN, $intBitwidthQ, Int)-TOCON_MACHINE_INTEGER(WordN, $intBitwidthQ, Word)-#endif---- | Symbolic unsigned bit vector type.-type SymWordN n = Sym (WordN n)--instance (SupportedPrim (WordN n)) => Num (Sym (WordN n)) where-  (Sym l) + (Sym r) = Sym $ withPrim (Proxy @(WordN n)) $ pevalAddNumTerm l r-  (Sym l) - (Sym r) = Sym $ withPrim (Proxy @(WordN n)) $ pevalMinusNumTerm l r-  (Sym l) * (Sym r) = Sym $ withPrim (Proxy @(WordN n)) $ pevalTimesNumTerm l r-  negate (Sym v) = Sym $ withPrim (Proxy @(WordN n)) $ pevalUMinusNumTerm v-  abs (Sym v) = Sym $ withPrim (Proxy @(WordN n)) $ pevalAbsNumTerm v-  signum (Sym v) = Sym $ withPrim (Proxy @(WordN n)) $ pevalSignumNumTerm v-  fromInteger i = withPrim (Proxy @(WordN n)) $ con $ fromInteger i--instance-  (KnownNat w', KnownNat n, KnownNat w, w' ~ (n + w), 1 <= n, 1 <= w, 1 <= w') =>-  BVConcat (Sym (WordN n)) (Sym (WordN w)) (Sym (WordN w'))-  where-  bvconcat (Sym l) (Sym r) = Sym (pevalBVConcatTerm l r)--instance-  ( KnownNat w,-    KnownNat w',-    1 <= w,-    1 <= w',-    w + 1 <= w',-    w <= w',-    1 <= w' - w,-    KnownNat (w' - w)-  ) =>-  BVExtend (Sym (WordN w)) w' (Sym (WordN w'))-  where-  bvzeroExtend _ (Sym v) = Sym $ pevalBVExtendTerm False (Proxy @w') v-  bvsignExtend _ (Sym v) = Sym $ pevalBVExtendTerm True (Proxy @w') v-  bvextend = bvzeroExtend--instance-  ( KnownNat ix,-    KnownNat w,-    KnownNat ow,-    ix + w <= ow,-    1 <= ow,-    1 <= w-  ) =>-  BVSelect (Sym (WordN ow)) ix w (Sym (WordN w))-  where-  bvselect pix pw (Sym v) = Sym $ pevalBVSelectTerm pix pw v--instance (SupportedPrim (WordN n)) => Bits (Sym (WordN n)) where-  Sym l .&. Sym r = Sym $ withPrim (Proxy @(WordN n)) $ pevalAndBitsTerm l r-  Sym l .|. Sym r = Sym $ withPrim (Proxy @(WordN n)) $ pevalOrBitsTerm l r-  Sym l `xor` Sym r = Sym $ withPrim (Proxy @(WordN n)) $ pevalXorBitsTerm l r-  complement (Sym n) = Sym $ withPrim (Proxy @(WordN n)) $ pevalComplementBitsTerm n-  shift (Sym n) i = Sym $ withPrim (Proxy @(WordN n)) $ pevalShiftBitsTerm n i-  rotate (Sym n) i = Sym $ withPrim (Proxy @(WordN n)) $ pevalRotateBitsTerm n i-  bitSize _ = fromInteger $ withPrim (Proxy @(WordN n)) $ natVal (Proxy @n)-  bitSizeMaybe _ = Just $ fromInteger $ withPrim (Proxy @(WordN n)) $ natVal (Proxy @n)-  isSigned _ = False-  testBit (Con n) = withPrim (Proxy @(WordN n)) $ testBit n-  testBit _ = error "You cannot call testBit on symbolic variables"-  bit = withPrim (Proxy @(WordN n)) $ con . bit-  popCount (Con n) = withPrim (Proxy @(WordN n)) $ popCount n-  popCount _ = error "You cannot call popCount on symbolic variables"---- |--- Symbolic tabular function type.-type a =~> b = Sym (a =-> b)--infixr 0 =~>--instance (SupportedPrim a, SupportedPrim b) => Function (a =~> b) where-  type Arg (a =~> b) = Sym a-  type Ret (a =~> b) = Sym b-  (Sym f) # (Sym t) = Sym $ pevalTabularFunApplyTerm f t---- |--- Symbolic general function type.-type a -~> b = Sym (a --> b)--infixr 0 -~>--instance (SupportedPrim a, SupportedPrim b) => Function (a -~> b) where-  type Arg (a -~> b) = Sym a-  type Ret (a -~> b) = Sym b-  (Sym f) # (Sym t) = Sym $ pevalGeneralFunApplyTerm f t---- | Get the sum of the sizes of a list of symbolic terms.--- Duplicate sub-terms are counted for only once.-symsSize :: [Sym a] -> Int-symsSize = termsSize . fmap underlyingTerm---- | Get the size of a symbolic term.--- Duplicate sub-terms are counted for only once.-symSize :: Sym a -> Int-symSize = termSize . underlyingTerm--data ModelSymPair t = (Sym t) := t deriving (Show)--instance ModelRep (ModelSymPair t) Model SymbolSet TypedSymbol where-  buildModel (Sym (SymTerm _ sym) := val) = insertValue sym val emptyModel-  buildModel _ = error "buildModel: should only use symbolic constants"--instance-  ModelRep-    ( ModelSymPair a,-      ModelSymPair b-    )-    Model-    SymbolSet-    TypedSymbol-  where-  buildModel-    ( Sym (SymTerm _ sym1) := val1,-      Sym (SymTerm _ sym2) := val2-      ) =-      insertValue sym1 val1-        . insertValue sym2 val2-        $ emptyModel-  buildModel _ = error "buildModel: should only use symbolic constants"--instance-  ModelRep-    ( ModelSymPair a,-      ModelSymPair b,-      ModelSymPair c-    )-    Model-    SymbolSet-    TypedSymbol-  where-  buildModel-    ( Sym (SymTerm _ sym1) := val1,-      Sym (SymTerm _ sym2) := val2,-      Sym (SymTerm _ sym3) := val3-      ) =-      insertValue sym1 val1-        . insertValue sym2 val2-        . insertValue sym3 val3-        $ emptyModel-  buildModel _ = error "buildModel: should only use symbolic constants"--instance-  ModelRep-    ( ModelSymPair a,-      ModelSymPair b,-      ModelSymPair c,-      ModelSymPair d-    )-    Model-    SymbolSet-    TypedSymbol-  where-  buildModel-    ( Sym (SymTerm _ sym1) := val1,-      Sym (SymTerm _ sym2) := val2,-      Sym (SymTerm _ sym3) := val3,-      Sym (SymTerm _ sym4) := val4-      ) =-      insertValue sym1 val1-        . insertValue sym2 val2-        . insertValue sym3 val3-        . insertValue sym4 val4-        $ emptyModel-  buildModel _ = error "buildModel: should only use symbolic constants"--instance-  ModelRep-    ( ModelSymPair a,-      ModelSymPair b,-      ModelSymPair c,-      ModelSymPair d,-      ModelSymPair e-    )-    Model-    SymbolSet-    TypedSymbol-  where-  buildModel-    ( Sym (SymTerm _ sym1) := val1,-      Sym (SymTerm _ sym2) := val2,-      Sym (SymTerm _ sym3) := val3,-      Sym (SymTerm _ sym4) := val4,-      Sym (SymTerm _ sym5) := val5-      ) =-      insertValue sym1 val1-        . insertValue sym2 val2-        . insertValue sym3 val3-        . insertValue sym4 val4-        . insertValue sym5 val5-        $ emptyModel-  buildModel _ = error "buildModel: should only use symbolic constants"--instance-  ModelRep-    ( ModelSymPair a,-      ModelSymPair b,-      ModelSymPair c,-      ModelSymPair d,-      ModelSymPair e,-      ModelSymPair f-    )-    Model-    SymbolSet-    TypedSymbol-  where-  buildModel-    ( Sym (SymTerm _ sym1) := val1,-      Sym (SymTerm _ sym2) := val2,-      Sym (SymTerm _ sym3) := val3,-      Sym (SymTerm _ sym4) := val4,-      Sym (SymTerm _ sym5) := val5,-      Sym (SymTerm _ sym6) := val6-      ) =-      insertValue sym1 val1-        . insertValue sym2 val2-        . insertValue sym3 val3-        . insertValue sym4 val4-        . insertValue sym5 val5-        . insertValue sym6 val6-        $ emptyModel-  buildModel _ = error "buildModel: should only use symbolic constants"--instance-  ModelRep-    ( ModelSymPair a,-      ModelSymPair b,-      ModelSymPair c,-      ModelSymPair d,-      ModelSymPair e,-      ModelSymPair f,-      ModelSymPair g-    )-    Model-    SymbolSet-    TypedSymbol-  where-  buildModel-    ( Sym (SymTerm _ sym1) := val1,-      Sym (SymTerm _ sym2) := val2,-      Sym (SymTerm _ sym3) := val3,-      Sym (SymTerm _ sym4) := val4,-      Sym (SymTerm _ sym5) := val5,-      Sym (SymTerm _ sym6) := val6,-      Sym (SymTerm _ sym7) := val7-      ) =-      insertValue sym1 val1-        . insertValue sym2 val2-        . insertValue sym3 val3-        . insertValue sym4 val4-        . insertValue sym5 val5-        . insertValue sym6 val6-        . insertValue sym7 val7-        $ emptyModel-  buildModel _ = error "buildModel: should only use symbolic constants"--instance-  ModelRep-    ( ModelSymPair a,-      ModelSymPair b,-      ModelSymPair c,-      ModelSymPair d,-      ModelSymPair e,-      ModelSymPair f,-      ModelSymPair g,-      ModelSymPair h-    )-    Model-    SymbolSet-    TypedSymbol-  where-  buildModel-    ( Sym (SymTerm _ sym1) := val1,-      Sym (SymTerm _ sym2) := val2,-      Sym (SymTerm _ sym3) := val3,-      Sym (SymTerm _ sym4) := val4,-      Sym (SymTerm _ sym5) := val5,-      Sym (SymTerm _ sym6) := val6,-      Sym (SymTerm _ sym7) := val7,-      Sym (SymTerm _ sym8) := val8-      ) =-      insertValue sym1 val1-        . insertValue sym2 val2-        . insertValue sym3 val3-        . insertValue sym4 val4-        . insertValue sym5 val5-        . insertValue sym6 val6-        . insertValue sym7 val7-        . insertValue sym8 val8-        $ emptyModel-  buildModel _ = error "buildModel: should only use symbolic constants"--instance (SupportedPrim a, SupportedPrim b) => Function (a --> b) where-  type Arg (a --> b) = Sym a-  type Ret (a --> b) = Sym b-  (GeneralFun arg tm) # (Sym v) = Sym $ substTerm arg v tm---- | Construction of general symbolic functions.-(-->) :: (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Sym b -> a --> b-(-->) arg (Sym v) = GeneralFun arg v+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}+{-# LANGUAGE DerivingVia #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module      :   Grisette.IR.SymPrim.Data.SymPrim+-- Copyright   :   (c) Sirui Lu 2021-2023+-- License     :   BSD-3-Clause (see the LICENSE file)+--+-- Maintainer  :   siruilu@cs.washington.edu+-- Stability   :   Experimental+-- Portability :   GHC only+module Grisette.IR.SymPrim.Data.SymPrim+  ( SymBool (..),+    SymInteger (..),+    SymWordN (..),+    SymIntN (..),+    SomeSymWordN (..),+    SomeSymIntN (..),+    type (=~>) (..),+    type (-~>) (..),+    (-->),+    ModelSymPair (..),+    symSize,+    symsSize,+    SomeSym (..),+    AllSyms (..),+    allSymsSize,+    unarySomeSymIntN,+    unarySomeSymIntNR1,+    binSomeSymIntN,+    binSomeSymIntNR1,+    binSomeSymIntNR2,+    unarySomeSymWordN,+    unarySomeSymWordNR1,+    binSomeSymWordN,+    binSomeSymWordNR1,+    binSomeSymWordNR2,+  )+where++import Control.DeepSeq+import Control.Monad.Except+import Control.Monad.Identity+import Control.Monad.Trans.Maybe+import qualified Control.Monad.Writer.Lazy as WriterLazy+import qualified Control.Monad.Writer.Strict as WriterStrict+import Data.Bits+import qualified Data.ByteString as B+import Data.Functor.Sum+import Data.Hashable+import Data.Int+import Data.Proxy+import Data.String+import Data.Typeable+import Data.Word+import GHC.Generics+import GHC.TypeNats+import Generics.Deriving+import Grisette.Core.Control.Exception+import Grisette.Core.Data.BV+import Grisette.Core.Data.Class.BitVector+import Grisette.Core.Data.Class.Bool+import Grisette.Core.Data.Class.Error+import Grisette.Core.Data.Class.Evaluate+import Grisette.Core.Data.Class.ExtractSymbolics+import Grisette.Core.Data.Class.Function+import Grisette.Core.Data.Class.GenSym+import Grisette.Core.Data.Class.Mergeable+import Grisette.Core.Data.Class.ModelOps+import Grisette.Core.Data.Class.SOrd+import Grisette.Core.Data.Class.SafeArith+import Grisette.Core.Data.Class.SimpleMergeable+import Grisette.Core.Data.Class.Solvable+import Grisette.Core.Data.Class.Substitute+import Grisette.Core.Data.Class.ToCon+import Grisette.Core.Data.Class.ToSym+import Grisette.IR.SymPrim.Data.IntBitwidth+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.SomeTerm+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermSubstitution+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermUtils+import Grisette.IR.SymPrim.Data.Prim.Model+import Grisette.IR.SymPrim.Data.Prim.PartialEval.BV+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bits+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool+import Grisette.IR.SymPrim.Data.Prim.PartialEval.GeneralFun+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Num+import Grisette.IR.SymPrim.Data.Prim.PartialEval.TabularFun+import Grisette.IR.SymPrim.Data.TabularFun+import Grisette.Lib.Control.Monad+import Grisette.Utils.Parameterized+import Language.Haskell.TH.Syntax++-- $setup+-- >>> import Grisette.Core+-- >>> import Grisette.IR.SymPrim+-- >>> import Grisette.Backend.SBV+-- >>> import Data.Proxy++-- | Symbolic Boolean type.+--+-- >>> :set -XOverloadedStrings+-- >>> "a" :: SymBool+-- a+-- >>> "a" &&~ "b" :: SymBool+-- (&& a b)+--+-- More symbolic operations are available. Please refer to the documentation+-- for the type class instances.+newtype SymBool = SymBool {underlyingBoolTerm :: Term Bool}+  deriving (Lift, NFData, Generic)++-- | Symbolic (unbounded, mathematical) integer type.+--+-- >>> "a" + 1 :: SymInteger+-- (+ 1 a)+--+-- More symbolic operations are available. Please refer to the documentation+-- for the type class instances.+newtype SymInteger = SymInteger {underlyingIntegerTerm :: Term Integer}+  deriving (Lift, NFData, Generic)++#define QUOTE() '+#define QID(a) a+#define QRIGHT(a) QID(a)'++#define SAFE_DIVISION_FUNC(name, type, op) \+name (type l) rs@(type r) = \+  mrgIf \+    (rs ==~ con 0) \+    (throwError DivideByZero) \+    (mrgReturn $ type $ op l r); \+QRIGHT(name) t (type l) rs@(type r) = \+  mrgIf \+    (rs ==~ con 0) \+    (throwError (t DivideByZero)) \+    (mrgReturn $ type $ op l r)++#define SAFE_DIVISION_FUNC2(name, type, op1, op2) \+name (type l) rs@(type r) = \+  mrgIf \+    (rs ==~ con 0) \+    (throwError DivideByZero) \+    (mrgReturn (type $ op1 l r, type $ op2 l r)); \+QRIGHT(name) t (type l) rs@(type r) = \+  mrgIf \+    (rs ==~ con 0) \+    (throwError (t DivideByZero)) \+    (mrgReturn (type $ op1 l r, type $ op2 l r))++#if 1+instance SafeDivision ArithException SymInteger where+  SAFE_DIVISION_FUNC(safeDiv, SymInteger, pevalDivIntegralTerm)+  SAFE_DIVISION_FUNC(safeMod, SymInteger, pevalModIntegralTerm)+  SAFE_DIVISION_FUNC(safeQuot, SymInteger, pevalQuotIntegralTerm)+  SAFE_DIVISION_FUNC(safeRem, SymInteger, pevalRemIntegralTerm)+  SAFE_DIVISION_FUNC2(safeDivMod, SymInteger, pevalDivIntegralTerm, pevalModIntegralTerm)+  SAFE_DIVISION_FUNC2(safeQuotRem, SymInteger, pevalQuotIntegralTerm, pevalRemIntegralTerm)+#endif++instance SafeLinearArith ArithException SymInteger where+  safeAdd ls rs = mrgReturn $ ls + rs+  safeAdd' _ ls rs = mrgReturn $ ls + rs+  safeNeg v = mrgReturn $ -v+  safeNeg' _ v = mrgReturn $ -v+  safeMinus ls rs = mrgReturn $ ls - rs+  safeMinus' e ls rs = mrgReturn $ ls - rs++instance SymIntegerOp SymInteger++-- | Symbolic signed bit vector type. Indexed with the bit width.+-- Signedness affects the semantics of the operations, including+-- comparison/extension, etc.+--+-- >>> :set -XOverloadedStrings -XDataKinds -XBinaryLiterals+-- >>> "a" + 5 :: SymIntN 5+-- (+ 0b00101 a)+-- >>> sizedBVConcat (con 0b101 :: SymIntN 3) (con 0b110 :: SymIntN 3)+-- 0b101110+-- >>> sizedBVExt (Proxy @6) (con 0b101 :: SymIntN 3)+-- 0b111101+-- >>> (8 :: SymIntN 4) <~ (7 :: SymIntN 4)+-- true+--+-- More symbolic operations are available. Please refer to the documentation+-- for the type class instances.+newtype SymIntN (n :: Nat) = SymIntN {underlyingIntNTerm :: Term (IntN n)}+  deriving (Lift, NFData, Generic)++#define SAFE_DIVISION_FUNC_BOUNDED_SIGNED(name, type, op) \+name ls@(type l) rs@(type r) = \+  mrgIf \+    (rs ==~ con 0) \+    (throwError DivideByZero) \+    (mrgIf (rs ==~ con (-1) &&~ ls ==~ con minBound) \+      (throwError Overflow) \+      (mrgReturn $ type $ op l r)); \+QRIGHT(name) t ls@(type l) rs@(type r) = \+  mrgIf \+    (rs ==~ con 0) \+    (throwError (t DivideByZero)) \+    (mrgIf (rs ==~ con (-1) &&~ ls ==~ con minBound) \+      (throwError (t Overflow)) \+      (mrgReturn $ type $ op l r))++#define SAFE_DIVISION_FUNC2_BOUNDED_SIGNED(name, type, op1, op2) \+name ls@(type l) rs@(type r) = \+  mrgIf \+    (rs ==~ con 0) \+    (throwError DivideByZero) \+    (mrgIf (rs ==~ con (-1) &&~ ls ==~ con minBound) \+      (throwError Overflow) \+      (mrgReturn (type $ op1 l r, type $ op2 l r))); \+QRIGHT(name) t ls@(type l) rs@(type r) = \+  mrgIf \+    (rs ==~ con 0) \+    (throwError (t DivideByZero)) \+    (mrgIf (rs ==~ con (-1) &&~ ls ==~ con minBound) \+      (throwError (t Overflow)) \+      (mrgReturn (type $ op1 l r, type $ op2 l r)))++#if 1+instance (KnownNat n, 1 <= n) => SafeDivision ArithException (SymIntN n) where+  SAFE_DIVISION_FUNC_BOUNDED_SIGNED(safeDiv, SymIntN, pevalDivBoundedIntegralTerm)+  SAFE_DIVISION_FUNC(safeMod, SymIntN, pevalModBoundedIntegralTerm)+  SAFE_DIVISION_FUNC_BOUNDED_SIGNED(safeQuot, SymIntN, pevalQuotBoundedIntegralTerm)+  SAFE_DIVISION_FUNC(safeRem, SymIntN, pevalRemBoundedIntegralTerm)+  SAFE_DIVISION_FUNC2_BOUNDED_SIGNED(safeDivMod, SymIntN, pevalDivBoundedIntegralTerm, pevalModBoundedIntegralTerm)+  SAFE_DIVISION_FUNC2_BOUNDED_SIGNED(safeQuotRem, SymIntN, pevalQuotBoundedIntegralTerm, pevalRemBoundedIntegralTerm)+#endif++instance (KnownNat n, 1 <= n) => SafeLinearArith ArithException (SymIntN n) where+  safeAdd ls rs =+    mrgIf+      (ls >~ 0)+      (mrgIf (rs >~ 0 &&~ res <~ 0) (throwError Overflow) (return res))+      ( mrgIf+          (ls <~ 0 &&~ rs <~ 0 &&~ res >=~ 0)+          (throwError Underflow)+          (mrgReturn res)+      )+    where+      res = ls + rs+  safeAdd' f ls rs =+    mrgIf+      (ls >~ 0)+      (mrgIf (rs >~ 0 &&~ res <~ 0) (throwError $ f Overflow) (return res))+      ( mrgIf+          (ls <~ 0 &&~ rs <~ 0 &&~ res >=~ 0)+          (throwError $ f Underflow)+          (mrgReturn res)+      )+    where+      res = ls + rs+  safeNeg v = mrgIf (v ==~ con minBound) (throwError Overflow) (mrgReturn $ -v)+  safeNeg' f v = mrgIf (v ==~ con minBound) (throwError $ f Overflow) (mrgReturn $ -v)+  safeMinus ls rs =+    mrgIf+      (ls >=~ 0)+      (mrgIf (rs <~ 0 &&~ res <~ 0) (throwError Overflow) (return res))+      ( mrgIf+          (ls <~ 0 &&~ rs >~ 0 &&~ res >~ 0)+          (throwError Underflow)+          (mrgReturn res)+      )+    where+      res = ls - rs+  safeMinus' f ls rs =+    mrgIf+      (ls >=~ 0)+      (mrgIf (rs <~ 0 &&~ res <~ 0) (throwError $ f Overflow) (return res))+      ( mrgIf+          (ls <~ 0 &&~ rs >~ 0 &&~ res >~ 0)+          (throwError $ f Underflow)+          (mrgReturn res)+      )+    where+      res = ls - rs++-- | Symbolic signed bit vector type. Not indexed, but the bit width is+-- fixed at the creation time.+--+-- A 'SomeSymIntN' must be created by wrapping a 'SymIntN' with the+-- 'SomeSymIntN' constructor to fix the bit width:+--+-- >>> (SomeSymIntN ("a" :: SymIntN 5))+-- a+--+-- >>> :set -XOverloadedStrings -XDataKinds -XBinaryLiterals+-- >>> (SomeSymIntN ("a" :: SymIntN 5)) + (SomeSymIntN (5 :: SymIntN 5))+-- (+ 0b00101 a)+-- >>> someBVConcat (SomeSymIntN (con 0b101 :: SymIntN 3)) (SomeSymIntN (con 0b110 :: SymIntN 3))+-- 0b101110+--+-- More symbolic operations are available. Please refer to the documentation+-- for the type class instances.+data SomeSymIntN where+  SomeSymIntN :: (KnownNat n, 1 <= n) => SymIntN n -> SomeSymIntN++unarySomeSymIntN :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> r) -> String -> SomeSymIntN -> r+unarySomeSymIntN op str (SomeSymIntN (w :: SymIntN w)) = op w+{-# INLINE unarySomeSymIntN #-}++unarySomeSymIntNR1 :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n) -> String -> SomeSymIntN -> SomeSymIntN+unarySomeSymIntNR1 op str (SomeSymIntN (w :: SymIntN w)) = SomeSymIntN $ op w+{-# INLINE unarySomeSymIntNR1 #-}++binSomeSymIntN :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n -> r) -> String -> SomeSymIntN -> SomeSymIntN -> r+binSomeSymIntN op str (SomeSymIntN (l :: SymIntN l)) (SomeSymIntN (r :: SymIntN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl -> op l r+    Nothing -> error $ "Operation " ++ str ++ " on SymIntN with different bitwidth"+{-# INLINE binSomeSymIntN #-}++binSomeSymIntNR1 :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n -> SymIntN n) -> String -> SomeSymIntN -> SomeSymIntN -> SomeSymIntN+binSomeSymIntNR1 op str (SomeSymIntN (l :: SymIntN l)) (SomeSymIntN (r :: SymIntN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl -> SomeSymIntN $ op l r+    Nothing -> error $ "Operation " ++ str ++ " on SymIntN with different bitwidth"+{-# INLINE binSomeSymIntNR1 #-}++binSomeSymIntNR2 :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n -> (SymIntN n, SymIntN n)) -> String -> SomeSymIntN -> SomeSymIntN -> (SomeSymIntN, SomeSymIntN)+binSomeSymIntNR2 op str (SomeSymIntN (l :: SymIntN l)) (SomeSymIntN (r :: SymIntN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl ->+      case op l r of+        (a, b) -> (SomeSymIntN a, SomeSymIntN b)+    Nothing -> error $ "Operation " ++ str ++ " on SymIntN with different bitwidth"+{-# INLINE binSomeSymIntNR2 #-}++-- | Symbolic unsigned bit vector type. Indexed with the bit width.+-- Signedness affects the semantics of the operations, including+-- comparison/extension, etc.+--+-- >>> :set -XOverloadedStrings -XDataKinds -XBinaryLiterals+-- >>> "a" + 5 :: SymWordN 5+-- (+ 0b00101 a)+-- >>> sizedBVConcat (con 0b101 :: SymWordN 3) (con 0b110 :: SymWordN 3)+-- 0b101110+-- >>> sizedBVExt (Proxy @6) (con 0b101 :: SymWordN 3)+-- 0b000101+-- >>> (8 :: SymWordN 4) <~ (7 :: SymWordN 4)+-- false+--+-- More symbolic operations are available. Please refer to the documentation+-- for the type class instances.+newtype SymWordN (n :: Nat) = SymWordN {underlyingWordNTerm :: Term (WordN n)}+  deriving (Lift, NFData, Generic)++#if 1+instance (KnownNat n, 1 <= n) => SafeDivision ArithException (SymWordN n) where+  SAFE_DIVISION_FUNC(safeDiv, SymWordN, pevalDivIntegralTerm)+  SAFE_DIVISION_FUNC(safeMod, SymWordN, pevalModIntegralTerm)+  SAFE_DIVISION_FUNC(safeQuot, SymWordN, pevalQuotIntegralTerm)+  SAFE_DIVISION_FUNC(safeRem, SymWordN, pevalRemIntegralTerm)+  SAFE_DIVISION_FUNC2(safeDivMod, SymWordN, pevalDivIntegralTerm, pevalModIntegralTerm)+  SAFE_DIVISION_FUNC2(safeQuotRem, SymWordN, pevalQuotIntegralTerm, pevalRemIntegralTerm)+#endif++instance (KnownNat n, 1 <= n) => SafeLinearArith ArithException (SymWordN n) where+  safeAdd ls rs =+    mrgIf+      (ls >~ res ||~ rs >~ res)+      (throwError Overflow)+      (mrgReturn res)+    where+      res = ls + rs+  safeAdd' f ls rs =+    mrgIf+      (ls >~ res ||~ rs >~ res)+      (throwError $ f Overflow)+      (mrgReturn res)+    where+      res = ls + rs+  safeNeg v = mrgIf (v /=~ 0) (throwError Underflow) (mrgReturn v)+  safeNeg' f v = mrgIf (v /=~ 0) (throwError $ f Underflow) (mrgReturn v)+  safeMinus ls rs =+    mrgIf+      (rs >~ ls)+      (throwError Underflow)+      (mrgReturn res)+    where+      res = ls - rs+  safeMinus' f ls rs =+    mrgIf+      (rs >~ ls)+      (throwError $ f Underflow)+      (mrgReturn res)+    where+      res = ls - rs++-- | Symbolic unsigned bit vector type. Not indexed, but the bit width is+-- fixed at the creation time.+--+-- A 'SomeSymWordN' must be created by wrapping a 'SymWordN' with the+-- 'SomeSymWordN' constructor to fix the bit width:+--+-- >>> (SomeSymWordN ("a" :: SymWordN 5))+-- a+--+-- >>> :set -XOverloadedStrings -XDataKinds -XBinaryLiterals+-- >>> (SomeSymWordN ("a" :: SymWordN 5)) + (SomeSymWordN (5 :: SymWordN 5))+-- (+ 0b00101 a)+-- >>> someBVConcat (SomeSymWordN (con 0b101 :: SymWordN 3)) (SomeSymWordN (con 0b110 :: SymWordN 3))+-- 0b101110+--+-- More symbolic operations are available. Please refer to the documentation+-- for the type class instances.+data SomeSymWordN where+  SomeSymWordN :: (KnownNat n, 1 <= n) => SymWordN n -> SomeSymWordN++unarySomeSymWordN :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> r) -> String -> SomeSymWordN -> r+unarySomeSymWordN op str (SomeSymWordN (w :: SymWordN w)) = op w+{-# INLINE unarySomeSymWordN #-}++unarySomeSymWordNR1 :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n) -> String -> SomeSymWordN -> SomeSymWordN+unarySomeSymWordNR1 op str (SomeSymWordN (w :: SymWordN w)) = SomeSymWordN $ op w+{-# INLINE unarySomeSymWordNR1 #-}++binSomeSymWordN :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n -> r) -> String -> SomeSymWordN -> SomeSymWordN -> r+binSomeSymWordN op str (SomeSymWordN (l :: SymWordN l)) (SomeSymWordN (r :: SymWordN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl -> op l r+    Nothing -> error $ "Operation " ++ str ++ " on SymWordN with different bitwidth"+{-# INLINE binSomeSymWordN #-}++binSomeSymWordNR1 :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n -> SymWordN n) -> String -> SomeSymWordN -> SomeSymWordN -> SomeSymWordN+binSomeSymWordNR1 op str (SomeSymWordN (l :: SymWordN l)) (SomeSymWordN (r :: SymWordN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl -> SomeSymWordN $ op l r+    Nothing -> error $ "Operation " ++ str ++ " on SymWordN with different bitwidth"+{-# INLINE binSomeSymWordNR1 #-}++binSomeSymWordNR2 :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n -> (SymWordN n, SymWordN n)) -> String -> SomeSymWordN -> SomeSymWordN -> (SomeSymWordN, SomeSymWordN)+binSomeSymWordNR2 op str (SomeSymWordN (l :: SymWordN l)) (SomeSymWordN (r :: SymWordN r)) =+  case sameNat (Proxy @l) (Proxy @r) of+    Just Refl ->+      case op l r of+        (a, b) -> (SomeSymWordN a, SomeSymWordN b)+    Nothing -> error $ "Operation " ++ str ++ " on SymWordN with different bitwidth"+{-# INLINE binSomeSymWordNR2 #-}++instance ConRep SymBool where+  type ConType SymBool = Bool++instance SymRep Bool where+  type SymType Bool = SymBool++instance LinkedRep Bool SymBool where+  underlyingTerm (SymBool a) = a+  wrapTerm = SymBool++instance ConRep SymInteger where+  type ConType SymInteger = Integer++instance SymRep Integer where+  type SymType Integer = SymInteger++instance LinkedRep Integer SymInteger where+  underlyingTerm (SymInteger a) = a+  wrapTerm = SymInteger++instance (KnownNat n, 1 <= n) => ConRep (SymIntN n) where+  type ConType (SymIntN n) = IntN n++instance (KnownNat n, 1 <= n) => SymRep (IntN n) where+  type SymType (IntN n) = SymIntN n++instance (KnownNat n, 1 <= n) => LinkedRep (IntN n) (SymIntN n) where+  underlyingTerm (SymIntN a) = a+  wrapTerm = SymIntN++instance (KnownNat n, 1 <= n) => ConRep (SymWordN n) where+  type ConType (SymWordN n) = WordN n++instance (KnownNat n, 1 <= n) => SymRep (WordN n) where+  type SymType (WordN n) = SymWordN n++instance (KnownNat n, 1 <= n) => LinkedRep (WordN n) (SymWordN n) where+  underlyingTerm (SymWordN a) = a+  wrapTerm = SymWordN++-- | Symbolic tabular function type.+--+-- >>> :set -XTypeOperators -XOverloadedStrings+-- >>> f' = "f" :: SymInteger =~> SymInteger+-- >>> f = (f' #)+-- >>> f 1+-- (apply f 1)+--+-- >>> f' = con (TabularFun [(1, 2), (2, 3)] 4) :: SymInteger =~> SymInteger+-- >>> f = (f' #)+-- >>> f 1+-- 2+-- >>> f 2+-- 3+-- >>> f 3+-- 4+-- >>> f "b"+-- (ite (= b 1) 2 (ite (= b 2) 3 4))+data sa =~> sb where+  SymTabularFun :: (LinkedRep ca sa, LinkedRep cb sb) => Term (ca =-> cb) -> sa =~> sb++infixr 0 =~>++instance (ConRep a, ConRep b) => ConRep (a =~> b) where+  type ConType (a =~> b) = ConType a =-> ConType b++instance (SymRep a, SymRep b) => SymRep (a =-> b) where+  type SymType (a =-> b) = SymType a =~> SymType b++instance (LinkedRep ca sa, LinkedRep cb sb) => LinkedRep (ca =-> cb) (sa =~> sb) where+  underlyingTerm (SymTabularFun a) = a+  wrapTerm = SymTabularFun++instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => Function (sa =~> sb) where+  type Arg (sa =~> sb) = sa+  type Ret (sa =~> sb) = sb+  (SymTabularFun f) # t = wrapTerm $ pevalTabularFunApplyTerm f (underlyingTerm t)++-- |+-- Symbolic general function type.+--+-- >>> :set -XTypeOperators -XOverloadedStrings+-- >>> f' = "f" :: SymInteger -~> SymInteger+-- >>> f = (f' #)+-- >>> f 1+-- (apply f 1)+--+-- >>> f' = con ("a" --> "a" + 1) :: SymInteger -~> SymInteger+-- >>> f'+-- \(a:ARG :: Integer) -> (+ 1 a:ARG)+-- >>> f = (f' #)+-- >>> f 1+-- 2+-- >>> f 2+-- 3+-- >>> f 3+-- 4+-- >>> f "b"+-- (+ 1 b)+data sa -~> sb where+  SymGeneralFun :: (LinkedRep ca sa, LinkedRep cb sb) => Term (ca --> cb) -> sa -~> sb++infixr 0 -~>++instance (ConRep a, ConRep b) => ConRep (a -~> b) where+  type ConType (a -~> b) = ConType a --> ConType b++instance (SymRep ca, SymRep cb) => SymRep (ca --> cb) where+  type SymType (ca --> cb) = SymType ca -~> SymType cb++instance (LinkedRep ca sa, LinkedRep cb sb) => LinkedRep (ca --> cb) (sa -~> sb) where+  underlyingTerm (SymGeneralFun a) = a+  wrapTerm = SymGeneralFun++instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => Function (sa -~> sb) where+  type Arg (sa -~> sb) = sa+  type Ret (sa -~> sb) = sb+  (SymGeneralFun f) # t = wrapTerm $ pevalGeneralFunApplyTerm f (underlyingTerm t)++-- | Construction of general symbolic functions.+--+-- >>> f = "a" --> "a" + 1 :: Integer --> Integer+-- >>> f+-- \(a:ARG :: Integer) -> (+ 1 a:ARG)+--+-- This general symbolic function needs to be applied to symbolic values:+-- >>> f # ("a" :: SymInteger)+-- (+ 1 a)+(-->) :: (SupportedPrim ca, SupportedPrim cb, LinkedRep cb sb) => TypedSymbol ca -> sb -> ca --> cb+(-->) arg v = GeneralFun newarg (substTerm arg (symTerm newarg) (underlyingTerm v))+  where+    newarg = WithInfo arg ARG++infixr 0 -->++data ARG = ARG+  deriving (Eq, Ord, Lift, Show, Generic)++instance NFData ARG where+  rnf ARG = ()++instance Hashable ARG where+  hashWithSalt s ARG = s `hashWithSalt` (0 :: Int)++-- Aggregate instances++-- Num++#define NUM_BV(symtype) \+instance (KnownNat n, 1 <= n) => Num (symtype n) where \+  (symtype l) + (symtype r) = symtype $ pevalAddNumTerm l r; \+  (symtype l) - (symtype r) = symtype $ pevalMinusNumTerm l r; \+  (symtype l) * (symtype r) = symtype $ pevalTimesNumTerm l r; \+  negate (symtype v) = symtype $ pevalUMinusNumTerm v; \+  abs (symtype v) = symtype $ pevalAbsNumTerm v; \+  signum (symtype v) = symtype $ pevalSignumNumTerm v; \+  fromInteger i = con $ fromInteger i++#define NUM_SOME_BV(somety, br1, ur1) \+instance Num somety where \+  (+) = br1 (+) "+"; \+  {-# INLINE (+) #-}; \+  (-) = br1 (-) "-"; \+  {-# INLINE (-) #-}; \+  (*) = br1 (*) "*"; \+  {-# INLINE (*) #-}; \+  negate = ur1 negate "negate"; \+  {-# INLINE negate #-}; \+  abs = ur1 abs "abs"; \+  {-# INLINE abs #-}; \+  signum = ur1 signum "signum"; \+  {-# INLINE signum #-}; \+  fromInteger = error "fromInteger is not defined for SomeSymWordN as no bitwidth is known"; \+  {-# INLINE fromInteger #-}++#if 1+NUM_BV(SymIntN)+NUM_BV(SymWordN)+NUM_SOME_BV(SomeSymWordN, binSomeSymWordNR1, unarySomeSymWordNR1)+NUM_SOME_BV(SomeSymIntN, binSomeSymIntNR1, unarySomeSymIntNR1)+#endif++instance Num SymInteger where+  (SymInteger l) + (SymInteger r) = SymInteger $ pevalAddNumTerm l r+  (SymInteger l) - (SymInteger r) = SymInteger $ pevalMinusNumTerm l r+  (SymInteger l) * (SymInteger r) = SymInteger $ pevalTimesNumTerm l r+  negate (SymInteger v) = SymInteger $ pevalUMinusNumTerm v+  abs (SymInteger v) = SymInteger $ pevalAbsNumTerm v+  signum (SymInteger v) = SymInteger $ pevalSignumNumTerm v+  fromInteger = con++-- Bits++#define BITS_BV(symtype, signed) \+instance (KnownNat n, 1 <= n) => Bits (symtype n) where \+  symtype l .&. symtype r = symtype $ pevalAndBitsTerm l r; \+  symtype l .|. symtype r = symtype $ pevalOrBitsTerm l r; \+  symtype l `xor` symtype r = symtype $ pevalXorBitsTerm l r; \+  complement (symtype n) = symtype $ pevalComplementBitsTerm n; \+  shift (symtype n) i = symtype $ pevalShiftBitsTerm n i; \+  rotate (symtype n) i = symtype $ pevalRotateBitsTerm n i; \+  bitSize _ = fromIntegral $ natVal (Proxy @n); \+  bitSizeMaybe _ = Just $ fromIntegral $ natVal (Proxy @n); \+  isSigned _ = signed; \+  testBit (Con n) =  testBit n; \+  testBit _ = error "You cannot call testBit on symbolic variables"; \+  bit = con . bit; \+  popCount (Con n) = popCount n; \+  popCount _ = error "You cannot call popCount on symbolic variables"++#define BITS_BV_SOME(somety, origty, br1, uf, ur1) \+instance Bits somety where \+  (.&.) = br1 (.&.) ".&."; \+  {-# INLINE (.&.) #-}; \+  (.|.) = br1 (.|.) ".|."; \+  {-# INLINE (.|.) #-}; \+  xor = br1 xor "xor"; \+  {-# INLINE xor #-}; \+  complement = ur1 complement "complement"; \+  {-# INLINE complement #-}; \+  shift s i = ur1 (`shift` i) "shift" s; \+  {-# INLINE shift #-}; \+  rotate s i = ur1 (`rotate` i) "rotate" s; \+  {-# INLINE rotate #-}; \+  zeroBits = error ("zeroBits is not defined for " ++ show (typeRep (Proxy @somety)) ++ " as no bitwidth is known"); \+  {-# INLINE zeroBits #-}; \+  bit = error ("bit is not defined for " ++ show (typeRep (Proxy @somety)) ++ " as no bitwidth is known"); \+  {-# INLINE bit #-}; \+  setBit s i = ur1 (`setBit` i) "setBit" s; \+  {-# INLINE setBit #-}; \+  clearBit s i = ur1 (`clearBit` i) "clearBit" s; \+  {-# INLINE clearBit #-}; \+  complementBit s i = ur1 (`complementBit` i) "complementBit" s; \+  {-# INLINE complementBit #-}; \+  testBit s i = uf (`testBit` i) "testBit" s; \+  {-# INLINE testBit #-}; \+  bitSizeMaybe (somety (n :: origty n)) = Just $ fromIntegral $ natVal n; \+  {-# INLINE bitSizeMaybe #-}; \+  bitSize (somety (n :: origty n)) = fromIntegral $ natVal n; \+  {-# INLINE bitSize #-}; \+  isSigned _ = False; \+  {-# INLINE isSigned #-}; \+  shiftL s i = ur1 (`shiftL` i) "shiftL" s; \+  {-# INLINE shiftL #-}; \+  unsafeShiftL s i = ur1 (`unsafeShiftL` i) "unsafeShiftL" s; \+  {-# INLINE unsafeShiftL #-}; \+  shiftR s i = ur1 (`shiftR` i) "shiftR" s; \+  {-# INLINE shiftR #-}; \+  unsafeShiftR s i = ur1 (`unsafeShiftR` i) "unsafeShiftR" s; \+  {-# INLINE unsafeShiftR #-}; \+  rotateL s i = ur1 (`rotateL` i) "rotateL" s; \+  {-# INLINE rotateL #-}; \+  rotateR s i = ur1 (`rotateR` i) "rotateR" s; \+  {-# INLINE rotateR #-}; \+  popCount = uf popCount "popCount"; \+  {-# INLINE popCount #-}++#if 1+BITS_BV(SymIntN, True)+BITS_BV(SymWordN, False)+BITS_BV_SOME(SomeSymIntN, SymIntN, binSomeSymIntNR1, unarySomeSymIntN, unarySomeSymIntNR1)+BITS_BV_SOME(SomeSymWordN, SymWordN, binSomeSymWordNR1, unarySomeSymWordN, unarySomeSymWordNR1)+#endif++-- Show++#define SHOW_SIMPLE(symtype) \+instance Show symtype where \+  show (symtype t) = pformat t++#define SHOW_BV(symtype) \+instance (KnownNat n, 1 <= n) => Show (symtype n) where \+  show (symtype t) = pformat t++#define SHOW_FUN(op, cons) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => Show (sa op sb) where \+  show (cons t) = pformat t++#define SHOW_BV_SOME(somety) \+instance Show somety where \+  show (somety t) = show t++#if 1+SHOW_SIMPLE(SymBool)+SHOW_SIMPLE(SymInteger)+SHOW_BV(SymIntN)+SHOW_BV(SymWordN)+SHOW_FUN(=~>, SymTabularFun)+SHOW_FUN(-~>, SymGeneralFun)+SHOW_BV_SOME(SomeSymIntN)+SHOW_BV_SOME(SomeSymWordN)+#endif++-- Hashable++#define HASHABLE_SIMPLE(symtype) \+instance Hashable symtype where \+  hashWithSalt s (symtype v) = s `hashWithSalt` v++#define HASHABLE_BV(symtype) \+instance (KnownNat n, 1 <= n) => Hashable (symtype n) where \+  hashWithSalt s (symtype v) = s `hashWithSalt` v++#define HASHABLE_FUN(op, cons) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => Hashable (sa op sb) where \+  hashWithSalt s (cons v) = s `hashWithSalt` v++#define HASHABLE_BV_SOME(somety, origty) \+instance Hashable somety where \+  s `hashWithSalt` (somety (w :: origty n)) = s `hashWithSalt` natVal (Proxy @n) `hashWithSalt` w++#if 1+HASHABLE_SIMPLE(SymBool)+HASHABLE_SIMPLE(SymInteger)+HASHABLE_BV(SymIntN)+HASHABLE_BV(SymWordN)+HASHABLE_FUN(=~>, SymTabularFun)+HASHABLE_FUN(-~>, SymGeneralFun)+HASHABLE_BV_SOME(SomeSymIntN, SymIntN)+HASHABLE_BV_SOME(SomeSymWordN, SymWordN)+#endif++-- Eq++#define EQ_SIMPLE(symtype) \+instance Eq symtype where \+  (symtype l) == (symtype r) = l == r++#define EQ_BV(symtype) \+instance (KnownNat n, 1 <= n) => Eq (symtype n) where \+  (symtype l) == (symtype r) = l == r++#define EQ_BV_SOME(symtype, bf) \+instance Eq symtype where; \+  (==) = bf (==) "=="; \+  {-# INLINE (==) #-}; \+  (/=) = bf (/=) "/="; \+  {-# INLINE (/=) #-}++#define EQ_FUN(op, cons) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => Eq (sa op sb) where \+  (cons l) == (cons r) = l == r++#if 1+EQ_SIMPLE(SymBool)+EQ_SIMPLE(SymInteger)+EQ_BV(SymIntN)+EQ_BV(SymWordN)+EQ_FUN(=~>, SymTabularFun)+EQ_FUN(-~>, SymGeneralFun)+EQ_BV_SOME(SomeSymIntN, binSomeSymIntN)+EQ_BV_SOME(SomeSymWordN, binSomeSymWordN)+#endif++-- IsString++#define IS_STRING_SIMPLE(symtype) \+instance IsString symtype where \+  fromString = ssym++#define IS_STRING_BV(symtype) \+instance (KnownNat n, 1 <= n) => IsString (symtype n) where \+  fromString = ssym++#define IS_STRING_FUN(op, cons) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => IsString (sa op sb) where \+  fromString = ssym++#if 1+IS_STRING_SIMPLE(SymBool)+IS_STRING_SIMPLE(SymInteger)+IS_STRING_BV(SymIntN)+IS_STRING_BV(SymWordN)+IS_STRING_FUN(=~>, SymTabularFunc)+IS_STRING_FUN(-~>, SymGeneralFun)+#endif++-- Solvable++#define SOLVABLE_SIMPLE(contype, symtype) \+instance Solvable contype symtype where \+  con = symtype . conTerm; \+  ssym = symtype . ssymTerm; \+  isym str i = symtype $ isymTerm str i; \+  sinfosym str info = symtype $ sinfosymTerm str info; \+  iinfosym str i info = symtype $ iinfosymTerm str i info; \+  conView (symtype (ConTerm _ t)) = Just t; \+  conView _ = Nothing++#define SOLVABLE_BV(contype, symtype) \+instance (KnownNat n, 1 <= n) => Solvable (contype n) (symtype n) where \+  con = symtype . conTerm; \+  ssym = symtype . ssymTerm; \+  isym str i = symtype $ isymTerm str i; \+  sinfosym str info = symtype $ sinfosymTerm str info; \+  iinfosym str i info = symtype $ iinfosymTerm str i info; \+  conView (symtype (ConTerm _ t)) = Just t; \+  conView _ = Nothing++#define SOLVABLE_FUN(symop, conop, symcons) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => Solvable (conop ca cb) (symop sa sb) where \+  con = symcons . conTerm; \+  ssym = symcons . ssymTerm; \+  isym str i = symcons $ isymTerm str i; \+  sinfosym str info = symcons $ sinfosymTerm str info; \+  iinfosym str i info = symcons $ iinfosymTerm str i info; \+  conView (symcons (ConTerm _ t)) = Just t; \+  conView _ = Nothing++#if 1+SOLVABLE_SIMPLE(Bool, SymBool)+SOLVABLE_SIMPLE(Integer, SymInteger)+SOLVABLE_BV(IntN, SymIntN)+SOLVABLE_BV(WordN, SymWordN)+SOLVABLE_FUN((=~>), (=->), SymTabularFun)+SOLVABLE_FUN((-~>), (-->), SymGeneralFun)+#endif++-- ToSym and ToCon++#define TO_SYM_SYMID_SIMPLE(symtype) \+instance ToSym symtype symtype where \+  toSym = id++#define TO_SYM_SYMID_BV(symtype) \+instance (KnownNat n, 1 <= n) => ToSym (symtype n) (symtype n) where \+  toSym = id++#define TO_SYM_SYMID_FUN(op) \+instance (SupportedPrim a, SupportedPrim b) => ToSym (a op b) (a op b) where \+  toSym = id++#if 1+TO_SYM_SYMID_SIMPLE(SymBool)+TO_SYM_SYMID_SIMPLE(SymInteger)+TO_SYM_SYMID_BV(SymIntN)+TO_SYM_SYMID_BV(SymWordN)+TO_SYM_SYMID_FUN(=~>)+TO_SYM_SYMID_FUN(-~>)+TO_SYM_SYMID_SIMPLE(SomeSymIntN)+TO_SYM_SYMID_SIMPLE(SomeSymWordN)+#endif++#define TO_SYM_FROMCON_SIMPLE(contype, symtype) \+instance ToSym contype symtype where \+  toSym = con++#define TO_SYM_FROMCON_BV(contype, symtype) \+instance (KnownNat n, 1 <= n) => ToSym (contype n) (symtype n) where \+  toSym = con++#define TO_SYM_FROMCON_FUN(conop, symop) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => ToSym (conop ca cb) (symop sa sb) where \+  toSym = con++#define TO_SYM_FROMCON_BV_SOME(contype, symtype) \+instance ToSym contype symtype where \+  toSym (contype v) = symtype (con v)++#if 1+TO_SYM_FROMCON_SIMPLE(Bool, SymBool)+TO_SYM_FROMCON_SIMPLE(Integer, SymInteger)+TO_SYM_FROMCON_BV(IntN, SymIntN)+TO_SYM_FROMCON_BV(WordN, SymWordN)+TO_SYM_FROMCON_FUN((=->), (=~>))+TO_SYM_FROMCON_FUN((-->), (-~>))+TO_SYM_FROMCON_BV_SOME(SomeIntN, SomeSymIntN)+TO_SYM_FROMCON_BV_SOME(SomeWordN, SomeSymWordN)+#endif++#define TO_CON_SYMID_SIMPLE(symtype) \+instance ToCon symtype symtype where \+  toCon = Just++#define TO_CON_SYMID_BV(symtype) \+instance (KnownNat n, 1 <= n) => ToCon (symtype n) (symtype n) where \+  toCon = Just++#define TO_CON_SYMID_FUN(op) \+instance (SupportedPrim a, SupportedPrim b) => ToCon (a op b) (a op b) where \+  toCon = Just++#if 1+TO_CON_SYMID_SIMPLE(SymBool)+TO_CON_SYMID_SIMPLE(SymInteger)+TO_CON_SYMID_BV(SymIntN)+TO_CON_SYMID_BV(SymWordN)+TO_CON_SYMID_FUN(=~>)+TO_CON_SYMID_FUN(-~>)+TO_CON_SYMID_SIMPLE(SomeSymIntN)+TO_CON_SYMID_SIMPLE(SomeSymWordN)+#endif++#define TO_CON_FROMSYM_SIMPLE(contype, symtype) \+instance ToCon symtype contype where \+  toCon = conView++#define TO_CON_FROMSYM_BV(contype, symtype) \+instance (KnownNat n, 1 <= n) => ToCon (symtype n) (contype n) where \+  toCon = conView++#define TO_CON_FROMSYM_FUN(conop, symop) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => ToCon (symop sa sb) (conop ca cb) where \+  toCon = conView++#define TO_CON_FROMSYM_BV_SOME(contype, symtype) \+instance ToCon symtype contype where \+  toCon (symtype v) = contype <$> conView v++#if 1+TO_CON_FROMSYM_SIMPLE(Bool, SymBool)+TO_CON_FROMSYM_SIMPLE(Integer, SymInteger)+TO_CON_FROMSYM_BV(IntN, SymIntN)+TO_CON_FROMSYM_BV(WordN, SymWordN)+TO_CON_FROMSYM_FUN((=->), (=~>))+TO_CON_FROMSYM_FUN((-->), (-~>))+TO_CON_FROMSYM_BV_SOME(SomeIntN, SomeSymIntN)+TO_CON_FROMSYM_BV_SOME(SomeWordN, SomeSymWordN)+#endif++#define TO_SYM_FROMBV_SOME(somesymbv, bv) \+instance (KnownNat n, 1 <= n) => ToSym (bv n) somesymbv where \+  toSym = somesymbv . con++#if 1+TO_SYM_FROMBV_SOME(SomeSymIntN, IntN)+TO_SYM_FROMBV_SOME(SomeSymWordN, WordN)+#endif++#define TOSYM_MACHINE_INTEGER(int, bv) \+instance ToSym int (bv) where \+  toSym = fromIntegral++#define TOSYM_MACHINE_INTEGER_SOME(int, somesymbv, bv, bitwidth) \+instance ToSym int somesymbv where \+  toSym v = somesymbv (con (fromIntegral v :: bv bitwidth))++#define TOCON_MACHINE_INTEGER(sbvw, bvw, n, int) \+instance ToCon (sbvw n) int where \+  toCon (Con (bvw v :: bvw n)) = Just $ fromIntegral v; \+  toCon _ = Nothing++#if 1+TOSYM_MACHINE_INTEGER(Int8, SymIntN 8)+TOSYM_MACHINE_INTEGER(Int16, SymIntN 16)+TOSYM_MACHINE_INTEGER(Int32, SymIntN 32)+TOSYM_MACHINE_INTEGER(Int64, SymIntN 64)+TOSYM_MACHINE_INTEGER(Word8, SymWordN 8)+TOSYM_MACHINE_INTEGER(Word16, SymWordN 16)+TOSYM_MACHINE_INTEGER(Word32, SymWordN 32)+TOSYM_MACHINE_INTEGER(Word64, SymWordN 64)+TOSYM_MACHINE_INTEGER(Int, SymIntN $intBitwidthQ)+TOSYM_MACHINE_INTEGER(Word, SymWordN $intBitwidthQ)++TOSYM_MACHINE_INTEGER_SOME(Int8, SomeSymIntN, IntN, 8)+TOSYM_MACHINE_INTEGER_SOME(Int16, SomeSymIntN, IntN, 16)+TOSYM_MACHINE_INTEGER_SOME(Int32, SomeSymIntN, IntN, 32)+TOSYM_MACHINE_INTEGER_SOME(Int64, SomeSymIntN, IntN, 64)+TOSYM_MACHINE_INTEGER_SOME(Word8, SomeSymWordN, WordN, 8)+TOSYM_MACHINE_INTEGER_SOME(Word16, SomeSymWordN, WordN, 16)+TOSYM_MACHINE_INTEGER_SOME(Word32, SomeSymWordN, WordN, 32)+TOSYM_MACHINE_INTEGER_SOME(Word64, SomeSymWordN, WordN, 64)+TOSYM_MACHINE_INTEGER_SOME(Int, SomeSymIntN, IntN, $intBitwidthQ)+TOSYM_MACHINE_INTEGER_SOME(Word, SomeSymWordN, WordN, $intBitwidthQ)++TOCON_MACHINE_INTEGER(SymIntN, IntN, 8, Int8)+TOCON_MACHINE_INTEGER(SymIntN, IntN, 16, Int16)+TOCON_MACHINE_INTEGER(SymIntN, IntN, 32, Int32)+TOCON_MACHINE_INTEGER(SymIntN, IntN, 64, Int64)+TOCON_MACHINE_INTEGER(SymWordN, WordN, 8, Word8)+TOCON_MACHINE_INTEGER(SymWordN, WordN, 16, Word16)+TOCON_MACHINE_INTEGER(SymWordN, WordN, 32, Word32)+TOCON_MACHINE_INTEGER(SymWordN, WordN, 64, Word64)+TOCON_MACHINE_INTEGER(SymIntN, IntN, $intBitwidthQ, Int)+TOCON_MACHINE_INTEGER(SymWordN, WordN, $intBitwidthQ, Word)+#endif++-- Evaluate++#define EVALUATE_SYM_SIMPLE(symtype) \+instance EvaluateSym symtype where \+  evaluateSym fillDefault model (symtype t) = symtype $ evaluateTerm fillDefault model t++#define EVALUATE_SYM_BV(symtype) \+instance (KnownNat n, 1 <= n) => EvaluateSym (symtype n) where \+  evaluateSym fillDefault model (symtype t) = symtype $ evaluateTerm fillDefault model t++#define EVALUATE_SYM_FUN(op, cons) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => EvaluateSym (sa op sb) where \+  evaluateSym fillDefault model (cons t) = cons $ evaluateTerm fillDefault model t++#define EVALUATE_SYM_BV_SOME(somety, origty) \+instance EvaluateSym somety where \+  evaluateSym fillDefault model (somety (origty t)) = somety $ origty $ evaluateTerm fillDefault model t++#if 1+EVALUATE_SYM_SIMPLE(SymBool)+EVALUATE_SYM_SIMPLE(SymInteger)+EVALUATE_SYM_BV(SymIntN)+EVALUATE_SYM_BV(SymWordN)+EVALUATE_SYM_FUN(=~>, SymTabularFun)+EVALUATE_SYM_FUN(-~>, SymGeneralFun)+EVALUATE_SYM_BV_SOME(SomeSymIntN, SymIntN)+EVALUATE_SYM_BV_SOME(SomeSymWordN, SymWordN)+#endif++-- ExtractSymbolics++#define EXTRACT_SYMBOLICS_SIMPLE(symtype) \+instance ExtractSymbolics symtype where \+  extractSymbolics (symtype t) = SymbolSet $ extractSymbolicsTerm t++#define EXTRACT_SYMBOLICS_BV(symtype) \+instance (KnownNat n, 1 <= n) => ExtractSymbolics (symtype n) where \+  extractSymbolics (symtype t) = SymbolSet $ extractSymbolicsTerm t++#define EXTRACT_SYMBOLICS_FUN(op, cons) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => ExtractSymbolics (sa op sb) where \+  extractSymbolics (cons t) = SymbolSet $ extractSymbolicsTerm t++#define EXTRACT_SYMBOLICS_BV_SOME(somety, origty) \+instance ExtractSymbolics somety where \+  extractSymbolics (somety (origty t)) = SymbolSet $ extractSymbolicsTerm t++#if 1+EXTRACT_SYMBOLICS_SIMPLE(SymBool)+EXTRACT_SYMBOLICS_SIMPLE(SymInteger)+EXTRACT_SYMBOLICS_BV(SymIntN)+EXTRACT_SYMBOLICS_BV(SymWordN)+EXTRACT_SYMBOLICS_FUN(=~>, SymTabularFun)+EXTRACT_SYMBOLICS_FUN(-~>, SymGeneralFun)+EXTRACT_SYMBOLICS_BV_SOME(SomeSymIntN, SymIntN)+EXTRACT_SYMBOLICS_BV_SOME(SomeSymWordN, SymWordN)+#endif++-- SEq++#define SEQ_SIMPLE(symtype) \+instance SEq symtype where \+  (symtype l) ==~ (symtype r) = SymBool $ pevalEqvTerm l r++#define SEQ_BV(symtype) \+instance (KnownNat n, 1 <= n) => SEq (symtype n) where \+  (symtype l) ==~ (symtype r) = SymBool $ pevalEqvTerm l r++#define SEQ_BV_SOME(somety, bf) \+instance SEq somety where \+  (==~) = bf (==~) "==~"; \+  {-# INLINE (==~) #-}; \+  (/=~) = bf (/=~) "/=~"; \+  {-# INLINE (/=~) #-}++#if 1+SEQ_SIMPLE(SymBool)+SEQ_SIMPLE(SymInteger)+SEQ_BV(SymIntN)+SEQ_BV(SymWordN)+SEQ_BV_SOME(SomeSymIntN, binSomeSymIntN)+SEQ_BV_SOME(SomeSymWordN, binSomeSymWordN)+#endif++-- SOrd++#define SORD_SIMPLE(symtype) \+instance SOrd symtype where \+  (symtype a) <=~ (symtype b) = SymBool $ pevalLeNumTerm a b; \+  (symtype a) <~ (symtype b) = SymBool $ pevalLtNumTerm a b; \+  (symtype a) >=~ (symtype b) = SymBool $ pevalGeNumTerm a b; \+  (symtype a) >~ (symtype b) = SymBool $ pevalGtNumTerm a b; \+  a `symCompare` b = mrgIf \+    (a <~ b) \+    (mrgReturn LT) \+    (mrgIf (a ==~ b) (mrgReturn EQ) (mrgReturn GT))++#define SORD_BV(symtype) \+instance (KnownNat n, 1 <= n) => SOrd (symtype n) where \+  (symtype a) <=~ (symtype b) = SymBool $ pevalLeNumTerm a b; \+  (symtype a) <~ (symtype b) = SymBool $ pevalLtNumTerm a b; \+  (symtype a) >=~ (symtype b) = SymBool $ pevalGeNumTerm a b; \+  (symtype a) >~ (symtype b) = SymBool $ pevalGtNumTerm a b; \+  a `symCompare` b = mrgIf \+    (a <~ b) \+    (mrgReturn LT) \+    (mrgIf (a ==~ b) (mrgReturn EQ) (mrgReturn GT))++#define SORD_BV_SOME(somety, bf) \+instance SOrd somety where \+  (<=~) = bf (<=~) "<=~"; \+  {-# INLINE (<=~) #-}; \+  (<~) = bf (<~) "<~"; \+  {-# INLINE (<~) #-}; \+  (>=~) = bf (>=~) ">=~"; \+  {-# INLINE (>=~) #-}; \+  (>~) = bf (>~) ">~"; \+  {-# INLINE (>~) #-}; \+  symCompare = bf symCompare "symCompare"; \+  {-# INLINE symCompare #-}++instance SOrd SymBool where+  l <=~ r = nots l ||~ r+  l <~ r = nots l &&~ r+  l >=~ r = l ||~ nots r+  l >~ r = l &&~ nots r+  symCompare l r =+    mrgIf+      (nots l &&~ r)+      (mrgReturn LT)+      (mrgIf (l ==~ r) (mrgReturn EQ) (mrgReturn GT))++#if 1+SORD_SIMPLE(SymInteger)+SORD_BV(SymIntN)+SORD_BV(SymWordN)+SORD_BV_SOME(SomeSymIntN, binSomeSymIntN)+SORD_BV_SOME(SomeSymWordN, binSomeSymWordN)+#endif++-- SubstituteSym++#define SUBSTITUTE_SYM_SIMPLE(symtype) \+instance SubstituteSym symtype where \+  substituteSym sym v (symtype t) = symtype $ substTerm sym (underlyingTerm v) t++#define SUBSTITUTE_SYM_BV(symtype) \+instance (KnownNat n, 1 <= n) => SubstituteSym (symtype n) where \+  substituteSym sym v (symtype t) = symtype $ substTerm sym (underlyingTerm v) t++#define SUBSTITUTE_SYM_FUN(op, cons) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => SubstituteSym (sa op sb) where \+  substituteSym sym v (cons t) = cons $ substTerm sym (underlyingTerm v) t++#define SUBSTITUTE_SYM_BV_SOME(somety, origty) \+instance SubstituteSym somety where \+  substituteSym sym v (somety (origty t)) = somety $ origty $ substTerm sym (underlyingTerm v) t++#if 1+SUBSTITUTE_SYM_SIMPLE(SymBool)+SUBSTITUTE_SYM_SIMPLE(SymInteger)+SUBSTITUTE_SYM_BV(SymIntN)+SUBSTITUTE_SYM_BV(SymWordN)+SUBSTITUTE_SYM_FUN(=~>, SymTabularFun)+SUBSTITUTE_SYM_FUN(-~>, SymGeneralFun)+SUBSTITUTE_SYM_BV_SOME(SomeSymIntN, SymIntN)+SUBSTITUTE_SYM_BV_SOME(SomeSymWordN, SymWordN)+#endif++-- SizedBV++#define BVCONCAT_SIZED(symtype) \+sizedBVConcat :: forall l r. (KnownNat l, KnownNat r, 1 <= l, 1 <= r) => symtype l -> symtype r -> symtype (l + r); \+sizedBVConcat (symtype l) (symtype r) = \+  case (leqAddPos pl pr, knownAdd (KnownProof @l) (KnownProof @r)) of \+    (LeqProof, KnownProof) -> \+      symtype (pevalBVConcatTerm l r); \+  where; \+    pl = Proxy :: Proxy l; \+    pr = Proxy :: Proxy r++#define BVZEXT_SIZED(symtype) \+sizedBVZext :: forall l r proxy. (KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) => proxy r -> symtype l -> symtype r; \+sizedBVZext _ (symtype v) = \+  case leqTrans (LeqProof @1 @l) (LeqProof @l @r) of \+    LeqProof -> symtype $ pevalBVExtendTerm False (Proxy @r) v++#define BVSEXT_SIZED(symtype) \+sizedBVSext :: forall l r proxy. (KnownNat l, KnownNat r, 1 <= l, KnownNat r, l <= r) => proxy r -> symtype l -> symtype r; \+sizedBVSext _ (symtype v) = \+  case leqTrans (LeqProof @1 @l) (LeqProof @l @r) of \+    LeqProof -> symtype $ pevalBVExtendTerm True (Proxy @r) v++#define BVSELECT_SIZED(symtype) \+sizedBVSelect :: forall n ix w proxy. (KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, ix + w <= n) => \+  proxy ix -> proxy w -> symtype n -> symtype w; \+sizedBVSelect pix pw (symtype v) = symtype $ pevalBVSelectTerm pix pw v++#if 1+instance SizedBV SymIntN where+  BVCONCAT_SIZED(SymIntN)+  BVZEXT_SIZED(SymIntN)+  BVSEXT_SIZED(SymIntN)+  sizedBVExt = sizedBVSext+  BVSELECT_SIZED(SymIntN)++instance SizedBV SymWordN where+  BVCONCAT_SIZED(SymWordN)+  BVZEXT_SIZED(SymWordN)+  BVSEXT_SIZED(SymWordN)+  sizedBVExt = sizedBVZext+  BVSELECT_SIZED(SymWordN)+#endif++-- BV++#define BVCONCAT(somety, origty) \+someBVConcat (somety (a :: origty l)) (somety (b :: origty r)) = \+  case (leqAddPos (Proxy @l) (Proxy @r), knownAdd @l @r KnownProof KnownProof) of \+    (LeqProof, KnownProof) -> \+      somety $ sizedBVConcat a b++#define BVZEXT(somety, origty) \+someBVZext (p :: p l) (somety (a :: origty n)) \+  | natVal p < natVal (Proxy @n) = error "zextBV: trying to zero extend a value to a smaller size" \+  | otherwise = \+    case (unsafeLeqProof @1 @l, unsafeLeqProof @n @l) of \+      (LeqProof, LeqProof) -> somety $ sizedBVZext p a++#define BVSEXT(somety, origty) \+someBVSext (p :: p l) (somety (a :: origty n)) \+  | natVal p < natVal (Proxy @n) = error "zextBV: trying to zero extend a value to a smaller size" \+  | otherwise = \+    case (unsafeLeqProof @1 @l, unsafeLeqProof @n @l) of \+      (LeqProof, LeqProof) -> somety $ sizedBVSext p a++#define BVSELECT(somety, origty) \+someBVSelect (p :: p ix) (q :: q w) (somety (a :: origty n)) \+  | natVal p + natVal q > natVal (Proxy @n) = error "selectBV: trying to select a bitvector outside the bounds of the input" \+  | natVal q == 0 = error "selectBV: trying to select a bitvector of size 0" \+  | otherwise = \+    case (unsafeLeqProof @1 @w, unsafeLeqProof @(ix + w) @n) of \+      (LeqProof, LeqProof) -> somety $ sizedBVSelect (Proxy @ix) (Proxy @w) a++#if 1+instance SomeBV SomeSymIntN where+  BVCONCAT(SomeSymIntN, SymIntN)+  BVZEXT(SomeSymIntN, SymIntN)+  BVSEXT(SomeSymIntN, SymIntN)+  someBVExt = someBVSext+  BVSELECT(SomeSymIntN, SymIntN)++instance SomeBV SomeSymWordN where+  BVCONCAT(SomeSymWordN, SymWordN)+  BVZEXT(SomeSymWordN, SymWordN)+  BVSEXT(SomeSymWordN, SymWordN)+  someBVExt = someBVZext+  BVSELECT(SomeSymWordN, SymWordN)+#endif++-- ModelRep++-- | A pair of a symbolic constant and its value.+-- This is used to build a model from a list of symbolic constants and their values.+--+-- >>> buildModel ("a" := (1 :: Integer), "b" := True) :: Model+-- Model {a -> 1 :: Integer, b -> True :: Bool}+data ModelSymPair ct st where+  (:=) :: LinkedRep ct st => st -> ct -> ModelSymPair ct st++instance ModelRep (ModelSymPair ct st) Model where+  buildModel (sym := val) =+    case underlyingTerm sym of+      SymTerm _ symbol -> insertValue symbol val emptyModel+      _ -> error "buildModel: should only use symbolic constants"++-- | Get the sum of the sizes of a list of symbolic terms.+-- Duplicate sub-terms are counted for only once.+--+-- >>> symsSize [1, "a" :: SymInteger, "a" + 1 :: SymInteger]+-- 3+symsSize :: forall con sym. LinkedRep con sym => [sym] -> Int+symsSize = termsSize . fmap (underlyingTerm @con)+{-# INLINE symsSize #-}++-- | Get the size of a symbolic term.+-- Duplicate sub-terms are counted for only once.+--+-- >>> symSize (1 :: SymInteger)+-- 1+-- >>> symSize ("a" :: SymInteger)+-- 1+-- >>> symSize ("a" + 1 :: SymInteger)+-- 3+-- >>> symSize (("a" + 1) * ("a" + 1) :: SymInteger)+-- 4+symSize :: forall con sym. LinkedRep con sym => sym -> Int+symSize = termSize . underlyingTerm @con+{-# INLINE symSize #-}++-- | Some symbolic value with 'LinkedRep' constraint.+data SomeSym where+  SomeSym :: (LinkedRep con sym) => sym -> SomeSym++someUnderlyingTerm :: SomeSym -> SomeTerm+someUnderlyingTerm (SomeSym s) = SomeTerm $ underlyingTerm s++someSymSize :: [SomeSym] -> Int+someSymSize = someTermsSize . fmap someUnderlyingTerm+{-# INLINE someSymSize #-}++someSymsSize :: [SomeSym] -> Int+someSymsSize = someTermsSize . fmap someUnderlyingTerm+{-# INLINE someSymsSize #-}++-- | Extract all symbolic primitive values that are represented as SMT terms.+--+-- __Note:__ This type class can be derived for algebraic data types. You may+-- need the @DerivingVia@ and @DerivingStrategies@ extenstions.+--+-- > data X = ... deriving Generic deriving AllSyms via (Default X)+class AllSyms a where+  -- | Convert a value to a list of symbolic primitive values. It should+  -- prepend to an existing list of symbolic primitive values.+  allSymsS :: a -> [SomeSym] -> [SomeSym]+  allSymsS a l = allSyms a ++ l++  -- | Specialized 'allSymsS' that prepends to an empty list.+  allSyms :: a -> [SomeSym]+  allSyms a = allSymsS a []++  {-# MINIMAL allSymsS | allSyms #-}++-- | Get the total size of symbolic terms in a value.+-- Duplicate sub-terms are counted for only once.+--+-- >>> allSymsSize ("a" :: SymInteger, "a" + "b" :: SymInteger, ("a" + "b") * "c" :: SymInteger)+-- 5+allSymsSize :: AllSyms a => a -> Int+allSymsSize = someSymsSize . allSyms++class AllSyms' a where+  allSymsS' :: a c -> [SomeSym] -> [SomeSym]++instance (Generic a, AllSyms' (Rep a)) => AllSyms (Default a) where+  allSymsS = allSymsS' . from . unDefault++instance AllSyms' U1 where+  allSymsS' _ = id++instance AllSyms c => AllSyms' (K1 i c) where+  allSymsS' (K1 v) = allSymsS v++instance AllSyms' a => AllSyms' (M1 i c a) where+  allSymsS' (M1 v) = allSymsS' v++instance (AllSyms' a, AllSyms' b) => AllSyms' (a :+: b) where+  allSymsS' (L1 l) = allSymsS' l+  allSymsS' (R1 r) = allSymsS' r++instance (AllSyms' a, AllSyms' b) => AllSyms' (a :*: b) where+  allSymsS' (a :*: b) = allSymsS' a . allSymsS' b++#define CONCRETE_ALLSYMS(type) \+instance AllSyms type where \+  allSymsS _ = id++#define ALLSYMS_SIMPLE(t) \+instance AllSyms t where \+  allSymsS v = (SomeSym v :)++#define ALLSYMS_BV(t) \+instance (KnownNat n, 1 <= n) => AllSyms (t n) where \+  allSymsS v = (SomeSym v :)++#define ALLSYMS_SOME_BV(t) \+instance AllSyms t where \+  allSymsS (t v) = (SomeSym v :)++#define ALLSYMS_FUN(op) \+instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => AllSyms (sa op sb) where \+  allSymsS v = (SomeSym v :)++#if 1+CONCRETE_ALLSYMS(Bool)+CONCRETE_ALLSYMS(Integer)+CONCRETE_ALLSYMS(Char)+CONCRETE_ALLSYMS(Int)+CONCRETE_ALLSYMS(Int8)+CONCRETE_ALLSYMS(Int16)+CONCRETE_ALLSYMS(Int32)+CONCRETE_ALLSYMS(Int64)+CONCRETE_ALLSYMS(Word)+CONCRETE_ALLSYMS(Word8)+CONCRETE_ALLSYMS(Word16)+CONCRETE_ALLSYMS(Word32)+CONCRETE_ALLSYMS(Word64)+CONCRETE_ALLSYMS(B.ByteString)+ALLSYMS_SIMPLE(SymBool)+ALLSYMS_SIMPLE(SymInteger)+ALLSYMS_BV(SymIntN)+ALLSYMS_BV(SymWordN)+ALLSYMS_SOME_BV(SomeSymIntN)+ALLSYMS_SOME_BV(SomeSymWordN)+ALLSYMS_FUN(=~>)+ALLSYMS_FUN(-~>)+#endif++instance AllSyms () where+  allSymsS _ = id++-- Either+deriving via+  (Default (Either a b))+  instance+    ( AllSyms a,+      AllSyms b+    ) =>+    AllSyms (Either a b)++-- Maybe+deriving via (Default (Maybe a)) instance (AllSyms a) => AllSyms (Maybe a)++-- List+deriving via (Default [a]) instance (AllSyms a) => AllSyms [a]++-- (,)+deriving via+  (Default (a, b))+  instance+    (AllSyms a, AllSyms b) =>+    AllSyms (a, b)++-- (,,)+deriving via+  (Default (a, b, c))+  instance+    ( AllSyms a,+      AllSyms b,+      AllSyms c+    ) =>+    AllSyms (a, b, c)++-- (,,,)+deriving via+  (Default (a, b, c, d))+  instance+    ( AllSyms a,+      AllSyms b,+      AllSyms c,+      AllSyms d+    ) =>+    AllSyms (a, b, c, d)++-- (,,,,)+deriving via+  (Default (a, b, c, d, e))+  instance+    ( AllSyms a,+      AllSyms b,+      AllSyms c,+      AllSyms d,+      AllSyms e+    ) =>+    AllSyms (a, b, c, d, e)++-- (,,,,,)+deriving via+  (Default (a, b, c, d, e, f))+  instance+    ( AllSyms a,+      AllSyms b,+      AllSyms c,+      AllSyms d,+      AllSyms e,+      AllSyms f+    ) =>+    AllSyms (a, b, c, d, e, f)++-- (,,,,,,)+deriving via+  (Default (a, b, c, d, e, f, g))+  instance+    ( AllSyms a,+      AllSyms b,+      AllSyms c,+      AllSyms d,+      AllSyms e,+      AllSyms f,+      AllSyms g+    ) =>+    AllSyms (a, b, c, d, e, f, g)++-- (,,,,,,,)+deriving via+  (Default (a, b, c, d, e, f, g, h))+  instance+    ( AllSyms a,+      AllSyms b,+      AllSyms c,+      AllSyms d,+      AllSyms e,+      AllSyms f,+      AllSyms g,+      AllSyms h+    ) =>+    AllSyms ((,,,,,,,) a b c d e f g h)++-- MaybeT+instance+  (AllSyms (m (Maybe a))) =>+  AllSyms (MaybeT m a)+  where+  allSymsS (MaybeT v) = allSymsS v++-- ExceptT+instance+  (AllSyms (m (Either e a))) =>+  AllSyms (ExceptT e m a)+  where+  allSymsS (ExceptT v) = allSymsS v++-- Sum+deriving via+  (Default (Sum f g a))+  instance+    (AllSyms (f a), AllSyms (g a)) =>+    AllSyms (Sum f g a)++-- WriterT+instance+  (AllSyms (m (a, s))) =>+  AllSyms (WriterLazy.WriterT s m a)+  where+  allSymsS (WriterLazy.WriterT v) = allSymsS v++instance+  (AllSyms (m (a, s))) =>+  AllSyms (WriterStrict.WriterT s m a)+  where+  allSymsS (WriterStrict.WriterT v) = allSymsS v++-- Identity+instance AllSyms a => AllSyms (Identity a) where+  allSymsS (Identity a) = allSymsS a++-- IdentityT+instance AllSyms (m a) => AllSyms (IdentityT m a) where+  allSymsS (IdentityT a) = allSymsS a++-- VerificationConditions+deriving via (Default VerificationConditions) instance AllSyms VerificationConditions++-- AssertionError+deriving via (Default AssertionError) instance AllSyms AssertionError
src/Grisette/IR/SymPrim/Data/SymPrim.hs-boot view
@@ -1,34 +1,127 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-} -module Grisette.IR.SymPrim.Data.SymPrim (Sym (..), SymBool) where+module Grisette.IR.SymPrim.Data.SymPrim+  ( SymBool (..),+    SymInteger (..),+    SymIntN (..),+    SymWordN (..),+    SomeSymIntN (..),+    SomeSymWordN (..),+    type (=~>) (..),+    type (-~>) (..),+    SomeSym (..),+    AllSyms (..),+    unarySomeSymIntN,+    unarySomeSymIntNR1,+    binSomeSymIntN,+    binSomeSymIntNR1,+    binSomeSymIntNR2,+    unarySomeSymWordN,+    unarySomeSymWordNR1,+    binSomeSymWordN,+    binSomeSymWordNR1,+    binSomeSymWordNR2,+  )+where  import Control.DeepSeq import Data.Hashable import GHC.Generics-import {-# SOURCE #-} Grisette.Core.Data.Class.Bool+import GHC.TypeNats+import Grisette.Core.Data.BV import Grisette.Core.Data.Class.Evaluate import Grisette.Core.Data.Class.ExtractSymbolics import Grisette.Core.Data.Class.Solvable-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term+import {-# SOURCE #-} Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term+import Grisette.IR.SymPrim.Data.TabularFun import Language.Haskell.TH.Syntax -newtype Sym a = Sym {underlyingTerm :: Term a}+newtype SymBool = SymBool {underlyingBoolTerm :: Term Bool} -type SymBool = Sym Bool+newtype SymIntN (n :: Nat) = SymIntN {underlyingIntNTerm :: Term (IntN n)} -instance NFData (Sym a)+newtype SymWordN (n :: Nat) = SymWordN {underlyingWordNTerm :: Term (WordN n)} -instance Lift (Sym a)+data SomeSymIntN where+  SomeSymIntN :: (KnownNat n, 1 <= n) => SymIntN n -> SomeSymIntN -instance (SupportedPrim a) => Solvable a (Sym a)+data SomeSymWordN where+  SomeSymWordN :: (KnownNat n, 1 <= n) => SymWordN n -> SomeSymWordN -instance (SupportedPrim a) => Eq (Sym a)+data sa =~> sb where+  SymTabularFun :: (LinkedRep ca sa, LinkedRep cb sb) => Term (ca =-> cb) -> sa =~> sb -instance (SupportedPrim a) => Hashable (Sym a)+data sa -~> sb where+  SymGeneralFun :: (LinkedRep ca sa, LinkedRep cb sb) => Term (ca --> cb) -> sa -~> sb -instance (SupportedPrim a) => Show (Sym a)+unarySomeSymIntN :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> r) -> String -> SomeSymIntN -> r+unarySomeSymIntNR1 :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n) -> String -> SomeSymIntN -> SomeSymIntN+binSomeSymIntN :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n -> r) -> String -> SomeSymIntN -> SomeSymIntN -> r+binSomeSymIntNR1 :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n -> SymIntN n) -> String -> SomeSymIntN -> SomeSymIntN -> SomeSymIntN+binSomeSymIntNR2 :: (forall n. (KnownNat n, 1 <= n) => SymIntN n -> SymIntN n -> (SymIntN n, SymIntN n)) -> String -> SomeSymIntN -> SomeSymIntN -> (SomeSymIntN, SomeSymIntN)+unarySomeSymWordN :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> r) -> String -> SomeSymWordN -> r+unarySomeSymWordNR1 :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n) -> String -> SomeSymWordN -> SomeSymWordN+binSomeSymWordN :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n -> r) -> String -> SomeSymWordN -> SomeSymWordN -> r+binSomeSymWordNR1 :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n -> SymWordN n) -> String -> SomeSymWordN -> SomeSymWordN -> SomeSymWordN+binSomeSymWordNR2 :: (forall n. (KnownNat n, 1 <= n) => SymWordN n -> SymWordN n -> (SymWordN n, SymWordN n)) -> String -> SomeSymWordN -> SomeSymWordN -> (SomeSymWordN, SomeSymWordN) -instance (SupportedPrim a) => EvaluateSym (Sym a)+instance Solvable Bool SymBool -instance (SupportedPrim a) => ExtractSymbolics (Sym a)+instance LinkedRep Bool SymBool++instance Eq SymBool++instance Lift SymBool++instance NFData SymBool++instance Show SymBool++instance Hashable SymBool++instance EvaluateSym SymBool++instance ExtractSymbolics SymBool++newtype SymInteger = SymInteger {underlyingIntegerTerm :: Term Integer}++instance Solvable Integer SymInteger++instance Eq SymInteger++instance Lift SymInteger++instance NFData SymInteger++instance Show SymInteger++instance Hashable SymInteger++instance EvaluateSym SymInteger++instance ExtractSymbolics SymInteger++instance (KnownNat n, 1 <= n) => Solvable (WordN n) (SymWordN n)++instance (KnownNat n, 1 <= n) => Solvable (IntN n) (SymIntN n)++instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => Solvable (ca --> cb) (sa -~> sb)++instance (SupportedPrim ca, SupportedPrim cb, LinkedRep ca sa, LinkedRep cb sb) => Solvable (ca =-> cb) (sa =~> sb)++data SomeSym where+  SomeSym :: (LinkedRep con sym) => sym -> SomeSym++class AllSyms a where+  allSymsS :: a -> [SomeSym] -> [SomeSym]+  allSymsS a l = allSyms a ++ l+  allSyms :: a -> [SomeSym]+  allSyms a = allSymsS a []+  {-# MINIMAL allSymsS | allSyms #-}
src/Grisette/Internal/IR/SymPrim.hs view
@@ -9,8 +9,7 @@ -- Stability   :   Experimental -- Portability :   GHC only module Grisette.Internal.IR.SymPrim-  ( FunArg (..),-    Sym (..),+  ( -- Sym (..),     UnaryOp (..),     BinaryOp (..),     TernaryOp (..),@@ -84,8 +83,10 @@     pevalGeNumTerm,     pevalTabularFunApplyTerm,     pevalGeneralFunApplyTerm,-    pevalDivIntegerTerm,-    pevalModIntegerTerm,+    pevalDivIntegralTerm,+    pevalModIntegralTerm,+    pevalQuotIntegralTerm,+    pevalRemIntegralTerm,   ) where @@ -97,7 +98,7 @@ import Grisette.IR.SymPrim.Data.Prim.Model import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool import Grisette.IR.SymPrim.Data.Prim.PartialEval.GeneralFun-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral import Grisette.IR.SymPrim.Data.Prim.PartialEval.Num import Grisette.IR.SymPrim.Data.Prim.PartialEval.PartialEval import Grisette.IR.SymPrim.Data.Prim.PartialEval.TabularFun
src/Grisette/Lib/Data/List.hs view
@@ -22,9 +22,9 @@ import Grisette.Core.Control.Monad.Union import Grisette.Core.Data.Class.Bool import Grisette.Core.Data.Class.Error-import Grisette.Core.Data.Class.Integer import Grisette.Core.Data.Class.Mergeable import Grisette.Core.Data.Class.SOrd+import Grisette.Core.Data.Class.SafeArith import Grisette.Core.Data.Class.SimpleMergeable import Grisette.IR.SymPrim.Data.SymPrim import Grisette.Lib.Control.Monad
+ src/Grisette/Qualified/ParallelUnionDo.hs view
@@ -0,0 +1,19 @@+-- |+-- Module      :   Grisette.Qualified.ParallelUnionDo+-- Copyright   :   (c) Sirui Lu 2023+-- License     :   BSD-3-Clause (see the LICENSE file)+--+-- Maintainer  :   siruilu@cs.washington.edu+-- Stability   :   Experimental+-- Portability :   GHC only+module Grisette.Qualified.ParallelUnionDo where++import Control.Parallel.Strategies+import Grisette.Core.Control.Monad.Class.MonadParallelUnion+import Grisette.Core.Data.Class.Mergeable++(>>=) :: (MonadParallelUnion m, Mergeable b, NFData b) => m a -> (a -> m b) -> m b+(>>=) = parBindUnion++(>>) :: (MonadParallelUnion m, Mergeable b, NFData b) => m a -> m b -> m b+(>>) a b = parBindUnion a $ const b
+ src/Grisette/Utils.hs view
@@ -0,0 +1,50 @@+-- |+-- Module      :   Grisette.Utils+-- Copyright   :   (c) Sirui Lu 2021-2023+-- License     :   BSD-3-Clause (see the LICENSE file)+--+-- Maintainer  :   siruilu@cs.washington.edu+-- Stability   :   Experimental+-- Portability :   GHC only+module Grisette.Utils+  ( -- * Utilities for type-level natural numbers.++    -- ** Unsafe axiom+    unsafeAxiom,++    -- ** Runtime representation of type-level natural numbers+    NatRepr,+    natValue,+    unsafeMkNatRepr,+    natRepr,+    decNat,+    predNat,+    incNat,+    addNat,+    subNat,+    divNat,+    halfNat,++    -- ** Proof of KnownNat+    KnownProof (..),+    hasRepr,+    withKnownProof,+    unsafeKnownProof,+    knownAdd,++    -- ** Proof of (<=) for type-level natural numbers+    LeqProof (..),+    withLeqProof,+    unsafeLeqProof,+    testLeq,+    leqRefl,+    leqSucc,+    leqTrans,+    leqZero,+    leqAdd2,+    leqAdd,+    leqAddPos,+  )+where++import Grisette.Utils.Parameterized
+ src/Grisette/Utils/Parameterized.hs view
@@ -0,0 +1,234 @@+{-+Part of the code in this file comes from the parameterized-utils package:++Copyright (c) 2013-2022 Galois Inc.+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:++  * Redistributions of source code must retain the above copyright+    notice, this list of conditions and the following disclaimer.++  * Redistributions in binary form must reproduce the above copyright+    notice, this list of conditions and the following disclaimer in+    the documentation and/or other materials provided with the+    distribution.++  * Neither the name of Galois, Inc. nor the names of its contributors+    may be used to endorse or promote products derived from this+    software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}++-- |+-- Module      :   Grisette.Utils.Parameterized+-- Copyright   :   (c) Sirui Lu 2021-2023+-- License     :   BSD-3-Clause (see the LICENSE file)+--+-- Maintainer  :   siruilu@cs.washington.edu+-- Stability   :   Experimental+-- Portability :   GHC only+module Grisette.Utils.Parameterized+  ( -- * Unsafe axiom+    unsafeAxiom,++    -- * Runtime representation of type-level natural numbers+    NatRepr,+    natValue,+    unsafeMkNatRepr,+    natRepr,+    decNat,+    predNat,+    incNat,+    addNat,+    subNat,+    divNat,+    halfNat,++    -- * Proof of KnownNat+    KnownProof (..),+    hasRepr,+    withKnownProof,+    unsafeKnownProof,+    knownAdd,++    -- * Proof of (<=) for type-level natural numbers+    LeqProof (..),+    withLeqProof,+    unsafeLeqProof,+    testLeq,+    leqRefl,+    leqSucc,+    leqTrans,+    leqZero,+    leqAdd2,+    leqAdd,+    leqAddPos,+  )+where++import Data.Typeable+import GHC.Natural+import GHC.TypeNats+import Unsafe.Coerce++-- | Assert a proof of equality between two types.+-- This is unsafe if used improperly, so use this with caution!+unsafeAxiom :: forall a b. a :~: b+unsafeAxiom = unsafeCoerce (Refl @a)++-- | A runtime representation of type-level natural numbers.+-- This can be used for performing dynamic checks on type-level natural numbers.+newtype NatRepr (n :: Nat) = NatRepr Natural++-- | The underlying runtime natural number value of a type-level natural number.+natValue :: NatRepr n -> Natural+natValue (NatRepr n) = n++-- | Construct a runtime representation of a type-level natural number.+--+-- __Note:__ This function is unsafe, as it does not check that the runtime+-- representation is consistent with the type-level representation.+-- You should ensure the consistency yourself or the program can crash or+-- generate incorrect results.+unsafeMkNatRepr :: Natural -> NatRepr n+unsafeMkNatRepr = NatRepr++-- | Construct a runtime representation of a type-level natural number when its+-- runtime value is known.+natRepr :: forall n. KnownNat n => NatRepr n+natRepr = NatRepr (natVal (Proxy @n))++-- | Decrement a 'NatRepr' by 1.+decNat :: 1 <= n => NatRepr n -> NatRepr (n - 1)+decNat (NatRepr n) = NatRepr (n - 1)++-- | Predecessor of a 'NatRepr'+predNat :: NatRepr (n + 1) -> NatRepr n+predNat (NatRepr n) = NatRepr (n - 1)++-- | Increment a 'NatRepr' by 1.+incNat :: NatRepr n -> NatRepr (n + 1)+incNat (NatRepr n) = NatRepr (n + 1)++-- | Addition of two 'NatRepr's.+addNat :: NatRepr m -> NatRepr n -> NatRepr (m + n)+addNat (NatRepr m) (NatRepr n) = NatRepr (m + n)++-- | Subtraction of two 'NatRepr's.+subNat :: n <= m => NatRepr m -> NatRepr n -> NatRepr (m - n)+subNat (NatRepr m) (NatRepr n) = NatRepr (m - n)++-- | Division of two 'NatRepr's.+divNat :: 1 <= n => NatRepr m -> NatRepr n -> NatRepr (Div m n)+divNat (NatRepr m) (NatRepr n) = NatRepr (m `div` n)++-- | Half of a 'NatRepr'.+halfNat :: NatRepr (n + n) -> NatRepr n+halfNat (NatRepr n) = NatRepr (n `div` 2)++-- | @'KnownProof n'@ is a type whose values are only inhabited when @n@ has+-- a known runtime value.+data KnownProof (n :: Nat) where+  KnownProof :: KnownNat n => KnownProof n++-- | Introduces the 'KnownNat' constraint when it's proven.+withKnownProof :: KnownProof n -> (KnownNat n => r) -> r+withKnownProof p r = case p of KnownProof -> r++-- | Construct a 'KnownProof' given the runtime value.+--+-- __Note:__ This function is unsafe, as it does not check that the runtime+-- representation is consistent with the type-level representation.+-- You should ensure the consistency yourself or the program can crash or+-- generate incorrect results.+unsafeKnownProof :: Natural -> KnownProof n+unsafeKnownProof nVal = hasRepr (NatRepr nVal)++-- | Construct a 'KnownProof' given the runtime representation.+hasRepr :: forall n. NatRepr n -> KnownProof n+hasRepr (NatRepr nVal) =+  case someNatVal nVal of+    SomeNat (Proxy :: Proxy n') ->+      case unsafeAxiom :: n :~: n' of+        Refl -> KnownProof++-- | Adding two type-level natural numbers with known runtime values gives a+-- type-level natural number with a known runtime value.+knownAdd :: forall m n r. KnownProof m -> KnownProof n -> KnownProof (m + n)+knownAdd KnownProof KnownProof = hasRepr @(m + n) (NatRepr (natVal (Proxy @m) + natVal (Proxy @n)))++-- | @'LeqProof m n'@ is a type whose values are only inhabited when @m <= n@.+data LeqProof (m :: Nat) (n :: Nat) where+  LeqProof :: m <= n => LeqProof m n++-- | Introduces the @m <= n@ constraint when it's proven.+withLeqProof :: LeqProof m n -> (m <= n => r) -> r+withLeqProof p r = case p of LeqProof -> r++-- | Construct a 'LeqProof'.+--+-- __Note:__ This function is unsafe, as it does not check that the left-hand+-- side is less than or equal to the right-hand side.+-- You should ensure the consistency yourself or the program can crash or+-- generate incorrect results.+unsafeLeqProof :: forall m n. LeqProof m n+unsafeLeqProof = unsafeCoerce (LeqProof @0 @0)++-- | Checks if a 'NatRepr' is less than or equal to another 'NatRepr'.+testLeq :: NatRepr m -> NatRepr n -> Maybe (LeqProof m n)+testLeq (NatRepr m) (NatRepr n) =+  case compare m n of+    LT -> Nothing+    EQ -> Just unsafeLeqProof+    GT -> Just unsafeLeqProof++-- | Apply reflexivity to 'LeqProof'.+leqRefl :: f n -> LeqProof n n+leqRefl _ = LeqProof++-- | A natural number is less than or equal to its successor.+leqSucc :: f n -> LeqProof n (n + 1)+leqSucc _ = unsafeLeqProof++-- | Apply transitivity to 'LeqProof'.+leqTrans :: LeqProof a b -> LeqProof b c -> LeqProof a c+leqTrans _ _ = unsafeLeqProof++-- | Zero is less than or equal to any natural number.+leqZero :: LeqProof 0 n+leqZero = unsafeLeqProof++-- | Add both sides of two inequalities.+leqAdd2 :: LeqProof xl xh -> LeqProof yl yh -> LeqProof (xl + yl) (xh + yh)+leqAdd2 _ _ = unsafeLeqProof++-- | Produce proof that adding a value to the larger element in an 'LeqProof'+-- is larger.+leqAdd :: LeqProof m n -> f o -> LeqProof m (n + o)+leqAdd _ _ = unsafeLeqProof++-- | Adding two positive natural numbers is positive.+leqAddPos :: (1 <= m, 1 <= n) => p m -> q n -> LeqProof 1 (m + n)+leqAddPos _ _ = unsafeLeqProof
test/Grisette/Backend/SBV/Data/SMT/CEGISTests.hs view
@@ -1,7 +1,9 @@ {-# LANGUAGE BinaryLiterals #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}  module Grisette.Backend.SBV.Data.SMT.CEGISTests where @@ -9,6 +11,8 @@ import qualified Data.HashSet as S import Data.Proxy import qualified Data.SBV as SBV+import Data.String+import Grisette.Backend.SBV import Grisette.Backend.SBV.Data.SMT.Solving import Grisette.Core.Control.Exception import Grisette.Core.Control.Monad.UnionM@@ -18,6 +22,7 @@ import Grisette.Core.Data.Class.Error import Grisette.Core.Data.Class.Evaluate import Grisette.Core.Data.Class.ExtractSymbolics+import Grisette.Core.Data.Class.Function import Grisette.Core.Data.Class.SOrd import Grisette.Core.Data.Class.SimpleMergeable import Grisette.Core.Data.Class.Solvable@@ -32,8 +37,8 @@ testCegis config shouldSuccess a bs = do   x <- cegisExceptVC config (a, ssym "internal" :: SymInteger) return (runExceptT $ buildFormula bs)   case x of-    Left _ -> shouldSuccess @=? False-    Right (_, m) -> do+    (_, Left _) -> shouldSuccess @=? False+    (_, Right m) -> do       shouldSuccess @=? True       verify bs       where@@ -60,10 +65,43 @@  cegisTests :: TestTree cegisTests =-  let unboundedConfig = UnboundedReasoning SBV.z3 -- {SBV.verbose=True}+  let unboundedConfig = precise SBV.z3 -- {SBV.verbose=True}    in testGroup         "CEGISTests"         [ testGroup+            "Regression"+            [ testCase "Empty symbolic inputs makes cegis work like solve" $ do+                (_, Right m1) <- cegisMultiInputs (precise z3) [1 :: Integer, 2] (\x -> cegisPostCond $ fromString $ "a" ++ show x)+                Right m2 <- solve (precise z3) (ssym "a1" &&~ ssym "a2")+                m1 @=? m2,+              testCase "Lowering of TabularFun" $ do+                let s1 = "s1" :: SymInteger =~> SymInteger+                let s2 = "s2" :: SymInteger =~> SymInteger+                (_, Right m1) <-+                  cegis unboundedConfig (ssym "cond" :: SymBool) $+                    cegisPostCond $+                      ites "cond" s1 s2 # ites "cond" 1 2 ==~ 10 &&~ ites "cond" s1 s2 # ites "cond" 3 4 ==~ 100+                let s1e = evaluateSym False m1 s1+                let s2e = evaluateSym False m1 s2+                s1e # 1 @=? 10+                s1e # 3 @=? 100+                s2e # 2 @=? 10+                s2e # 4 @=? 100,+              testCase "Lowering of GeneralFun" $ do+                let s1 = "s1" :: SymInteger -~> SymInteger+                let s2 = "s2" :: SymInteger -~> SymInteger+                (_, Right m1) <-+                  cegis unboundedConfig (ssym "cond" :: SymBool) $+                    cegisPostCond $+                      ites "cond" s1 s2 # ites "cond" 1 2 ==~ 10 &&~ ites "cond" s1 s2 # ites "cond" 3 4 ==~ 100+                let s1e = evaluateSym False m1 s1+                let s2e = evaluateSym False m1 s2+                s1e # 1 @=? 10+                s1e # 3 @=? 100+                s2e # 2 @=? 10+                s2e # 4 @=? 100+            ],+          testGroup             "Boolean"             [ testCase "Basic" $ do                 testCegis@@ -239,124 +277,124 @@            in testGroup                 "Different sized BV"                 [ testGroup-                    "Extract"-                    [ testCase "Extract" $ do+                    "Select"+                    [ testCase "sizedBVSelect" $ do                         testCegis                           unboundedConfig                           True                           ()-                          [bvselect (Proxy @2) (Proxy @2) a ==~ (con 1 :: SymIntN 2), a ==~ con 0b10101]+                          [sizedBVSelect (Proxy @2) (Proxy @2) a ==~ (con 1 :: SymIntN 2), a ==~ con 0b10101]                         testCegis                           unboundedConfig                           False                           ()-                          [bvselect (Proxy @2) (Proxy @2) a ==~ (con 1 :: SymIntN 2), a ==~ con 0b10001],-                      testCase "Extract when lowered twice" $ do+                          [sizedBVSelect (Proxy @2) (Proxy @2) a ==~ (con 1 :: SymIntN 2), a ==~ con 0b10001],+                      testCase "sizedBVSelect when lowered twice" $ do                         testCegis                           unboundedConfig                           True                           a-                          [bvselect (Proxy @2) (Proxy @2) (bvconcat a b) ==~ (con 1 :: SymIntN 2)]+                          [sizedBVSelect (Proxy @2) (Proxy @2) (sizedBVConcat a b) ==~ (con 1 :: SymIntN 2)]                         testCegis                           unboundedConfig                           True                           b-                          [bvselect (Proxy @7) (Proxy @2) (bvconcat a b) ==~ (con 1 :: SymIntN 2)]+                          [sizedBVSelect (Proxy @7) (Proxy @2) (sizedBVConcat a b) ==~ (con 1 :: SymIntN 2)]                     ],                   testGroup                     "Concat"-                    [ testCase "Concat" $ do+                    [ testCase "sizedBVConcat" $ do                         testCegis                           unboundedConfig                           True                           ()-                          [bvconcat a b ==~ d, a ==~ con 1, b ==~ con 1, d ==~ con 0b100001]+                          [sizedBVConcat a b ==~ d, a ==~ con 1, b ==~ con 1, d ==~ con 0b100001]                         testCegis                           unboundedConfig                           False                           ()-                          [bvconcat a b ==~ d, a ==~ con 1, b ==~ con 1, d ==~ con 0b100010],-                      testCase "Concat when lowered twice" $ do+                          [sizedBVConcat a b ==~ d, a ==~ con 1, b ==~ con 1, d ==~ con 0b100010],+                      testCase "sizedBVConcat when lowered twice" $ do                         testCegis                           unboundedConfig                           True                           (a, c)-                          [bvconcat c (bvselect (Proxy @2) (Proxy @2) (bvconcat a b) :: SymIntN 2) ==~ bvconcat c (con 1 :: SymIntN 2)]+                          [sizedBVConcat c (sizedBVSelect (Proxy @2) (Proxy @2) (sizedBVConcat a b) :: SymIntN 2) ==~ sizedBVConcat c (con 1 :: SymIntN 2)]                         testCegis                           unboundedConfig                           True                           (b, c)-                          [bvconcat c (bvselect (Proxy @7) (Proxy @2) (bvconcat a b) :: SymIntN 2) ==~ bvconcat c (con 1 :: SymIntN 2)]+                          [sizedBVConcat c (sizedBVSelect (Proxy @7) (Proxy @2) (sizedBVConcat a b) :: SymIntN 2) ==~ sizedBVConcat c (con 1 :: SymIntN 2)]                     ],                   testGroup                     "Zext"-                    [ testCase "bvzeroExtend" $ do+                    [ testCase "sizedBVZext" $ do                         testCegis                           unboundedConfig                           True                           ()-                          [bvzeroExtend (Proxy @10) a ==~ d, a ==~ con 1, d ==~ (con 1 :: SymIntN 10)]+                          [sizedBVZext (Proxy @10) a ==~ d, a ==~ con 1, d ==~ (con 1 :: SymIntN 10)]                         testCegis                           unboundedConfig                           True                           ()-                          [bvzeroExtend (Proxy @10) a ==~ d, a ==~ con 0b11111, d ==~ (con 0b11111 :: SymIntN 10)]+                          [sizedBVZext (Proxy @10) a ==~ d, a ==~ con 0b11111, d ==~ (con 0b11111 :: SymIntN 10)]                         testCegis                           unboundedConfig                           False                           ()-                          [bvzeroExtend (Proxy @10) a ==~ d, d ==~ (con 0b111111 :: SymIntN 10)]+                          [sizedBVZext (Proxy @10) a ==~ d, d ==~ (con 0b111111 :: SymIntN 10)]                         testCegis                           unboundedConfig                           False                           ()-                          [bvzeroExtend (Proxy @10) a ==~ d, d ==~ (con 0b1111111111 :: SymIntN 10)],-                      testCase "bvzeroExtend when lowered twice" $ do+                          [sizedBVZext (Proxy @10) a ==~ d, d ==~ (con 0b1111111111 :: SymIntN 10)],+                      testCase "sizedBVZext when lowered twice" $ do                         testCegis                           unboundedConfig                           True                           a-                          [bvzeroExtend (Proxy @10) (bvselect (Proxy @2) (Proxy @2) (bvconcat a b) :: SymIntN 2) ==~ (con 1 :: SymIntN 10)]+                          [sizedBVZext (Proxy @10) (sizedBVSelect (Proxy @2) (Proxy @2) (sizedBVConcat a b) :: SymIntN 2) ==~ (con 1 :: SymIntN 10)]                         testCegis                           unboundedConfig                           True                           b-                          [bvzeroExtend (Proxy @10) (bvselect (Proxy @7) (Proxy @2) (bvconcat a b) :: SymIntN 2) ==~ (con 1 :: SymIntN 10)]+                          [sizedBVZext (Proxy @10) (sizedBVSelect (Proxy @7) (Proxy @2) (sizedBVConcat a b) :: SymIntN 2) ==~ (con 1 :: SymIntN 10)]                     ],                   testGroup                     "Sext"-                    [ testCase "bvsignExtend" $ do+                    [ testCase "sizedBVSext" $ do                         testCegis                           unboundedConfig                           True                           ()-                          [bvsignExtend (Proxy @10) a ==~ d, a ==~ con 1, d ==~ (con 1 :: SymIntN 10)]+                          [sizedBVSext (Proxy @10) a ==~ d, a ==~ con 1, d ==~ (con 1 :: SymIntN 10)]                         testCegis                           unboundedConfig                           True                           ()-                          [bvsignExtend (Proxy @10) a ==~ d, a ==~ con 0b11111, d ==~ (con 0b1111111111 :: SymIntN 10)]+                          [sizedBVSext (Proxy @10) a ==~ d, a ==~ con 0b11111, d ==~ (con 0b1111111111 :: SymIntN 10)]                         testCegis                           unboundedConfig                           False                           ()-                          [bvsignExtend (Proxy @10) a ==~ d, d ==~ (con 0b111111 :: SymIntN 10)]+                          [sizedBVSext (Proxy @10) a ==~ d, d ==~ (con 0b111111 :: SymIntN 10)]                         testCegis                           unboundedConfig                           False                           ()-                          [bvsignExtend (Proxy @10) a ==~ d, d ==~ (con 0b11111 :: SymIntN 10)],-                      testCase "bvsignExtend when lowered twice" $ do+                          [sizedBVSext (Proxy @10) a ==~ d, d ==~ (con 0b11111 :: SymIntN 10)],+                      testCase "sizedBVSext when lowered twice" $ do                         testCegis                           unboundedConfig                           True                           a-                          [bvsignExtend (Proxy @10) (bvselect (Proxy @2) (Proxy @2) (bvconcat a b) :: SymIntN 2) ==~ (con 1 :: SymIntN 10)]+                          [sizedBVSext (Proxy @10) (sizedBVSelect (Proxy @2) (Proxy @2) (sizedBVConcat a b) :: SymIntN 2) ==~ (con 1 :: SymIntN 10)]                         testCegis                           unboundedConfig                           True                           b-                          [bvsignExtend (Proxy @10) (bvselect (Proxy @7) (Proxy @2) (bvconcat a b) :: SymIntN 2) ==~ (con 1 :: SymIntN 10)]+                          [sizedBVSext (Proxy @10) (sizedBVSelect (Proxy @7) (Proxy @2) (sizedBVConcat a b) :: SymIntN 2) ==~ (con 1 :: SymIntN 10)]                     ]                 ]         ]
test/Grisette/Backend/SBV/Data/SMT/LoweringTests.hs view
@@ -5,6 +5,7 @@ {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}  module Grisette.Backend.SBV.Data.SMT.LoweringTests where @@ -18,7 +19,7 @@ import Grisette.Backend.SBV.Data.SMT.Lowering import Grisette.Backend.SBV.Data.SMT.Solving import Grisette.Backend.SBV.Data.SMT.SymBiMap-import Grisette.IR.SymPrim.Data.BV+import Grisette.Core.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors import Grisette.IR.SymPrim.Data.Prim.InternedTerm.SomeTerm import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term@@ -249,8 +250,8 @@  loweringTests :: TestTree loweringTests =-  let unboundedConfig = UnboundedReasoning SBV.z3-      boundedConfig = BoundedReasoning @5 SBV.z3+  let unboundedConfig = precise SBV.z3+      boundedConfig = approx (Proxy @5) SBV.z3    in testGroup         "LoweringTests"         [ testGroup@@ -359,12 +360,18 @@                   leNumTerm                   "(<=)"                   (\x y -> x * 2 - x SBV..<= y * 2 - y),-              testCase "DivI" $ do-                testBinaryOpLowering @Integer @Integer @Integer unboundedConfig divIntegerTerm "div" SBV.sDiv-                testBinaryOpLowering @Integer @Integer @Integer boundedConfig divIntegerTerm "div" SBV.sDiv,-              testCase "ModI" $ do-                testBinaryOpLowering @Integer @Integer @Integer unboundedConfig modIntegerTerm "mod" SBV.sMod-                testBinaryOpLowering @Integer @Integer @Integer boundedConfig modIntegerTerm "mod" SBV.sMod+              testCase "Div" $ do+                testBinaryOpLowering @Integer @Integer @Integer unboundedConfig divIntegralTerm "div" SBV.sDiv+                testBinaryOpLowering @Integer @Integer @Integer boundedConfig divIntegralTerm "div" SBV.sDiv,+              testCase "Mod" $ do+                testBinaryOpLowering @Integer @Integer @Integer unboundedConfig modIntegralTerm "mod" SBV.sMod+                testBinaryOpLowering @Integer @Integer @Integer boundedConfig modIntegralTerm "mod" SBV.sMod,+              testCase "Quot" $ do+                testBinaryOpLowering @Integer @Integer @Integer unboundedConfig quotIntegralTerm "quot" SBV.sQuot+                testBinaryOpLowering @Integer @Integer @Integer boundedConfig quotIntegralTerm "quot" SBV.sQuot,+              testCase "Rem" $ do+                testBinaryOpLowering @Integer @Integer @Integer unboundedConfig remIntegralTerm "rem" SBV.sRem+                testBinaryOpLowering @Integer @Integer @Integer boundedConfig remIntegralTerm "rem" SBV.sRem             ],           testGroup             "IntN Lowering"@@ -553,7 +560,19 @@                 testUnaryOpLowering @(IntN 5) unboundedConfig (`rotateBitsTerm` (-4)) "rotate" (`rotate` (-4))                 testUnaryOpLowering @(IntN 5) unboundedConfig (`rotateBitsTerm` (-4)) "rotate" (`rotate` 1)                 testUnaryOpLowering @(IntN 5) unboundedConfig (`rotateBitsTerm` (-5)) "rotate" (`rotate` (-5))-                testUnaryOpLowering @(IntN 5) unboundedConfig (`rotateBitsTerm` (-5)) "rotate" id+                testUnaryOpLowering @(IntN 5) unboundedConfig (`rotateBitsTerm` (-5)) "rotate" id,+              testCase "Div - bounded" $ do+                testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig divBoundedIntegralTerm "div" SBV.sDiv+                testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) boundedConfig divBoundedIntegralTerm "div" SBV.sDiv,+              testCase "Mod - bounded" $ do+                testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig modBoundedIntegralTerm "mod" SBV.sMod+                testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) boundedConfig modBoundedIntegralTerm "mod" SBV.sMod,+              testCase "Quot - bounded" $ do+                testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig quotBoundedIntegralTerm "quot" SBV.sQuot+                testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) boundedConfig quotBoundedIntegralTerm "quot" SBV.sQuot,+              testCase "Rem - bounded" $ do+                testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig remBoundedIntegralTerm "rem" SBV.sRem+                testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) boundedConfig remBoundedIntegralTerm "rem" SBV.sRem             ],           testGroup             "WordN"@@ -742,6 +761,18 @@                 testUnaryOpLowering @(WordN 5) unboundedConfig (`rotateBitsTerm` (-4)) "rotate" (`rotate` (-4))                 testUnaryOpLowering @(WordN 5) unboundedConfig (`rotateBitsTerm` (-4)) "rotate" (`rotate` 1)                 testUnaryOpLowering @(WordN 5) unboundedConfig (`rotateBitsTerm` (-5)) "rotate" (`rotate` (-5))-                testUnaryOpLowering @(WordN 5) unboundedConfig (`rotateBitsTerm` (-5)) "rotate" id+                testUnaryOpLowering @(WordN 5) unboundedConfig (`rotateBitsTerm` (-5)) "rotate" id,+              testCase "Div" $ do+                testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) unboundedConfig divIntegralTerm "div" SBV.sDiv+                testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) boundedConfig divIntegralTerm "div" SBV.sDiv,+              testCase "Mod" $ do+                testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) unboundedConfig modIntegralTerm "mod" SBV.sMod+                testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) boundedConfig modIntegralTerm "mod" SBV.sMod,+              testCase "Quot" $ do+                testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) unboundedConfig quotIntegralTerm "quot" SBV.sQuot+                testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) boundedConfig quotIntegralTerm "quot" SBV.sQuot,+              testCase "Rem" $ do+                testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) unboundedConfig remIntegralTerm "rem" SBV.sRem+                testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) boundedConfig remIntegralTerm "rem" SBV.sRem             ]         ]
test/Grisette/Backend/SBV/Data/SMT/TermRewritingGen.hs view
@@ -8,6 +8,7 @@ {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-}  module Grisette.Backend.SBV.Data.SMT.TermRewritingGen where@@ -23,7 +24,7 @@ import Grisette.IR.SymPrim.Data.Prim.PartialEval.BV import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bits import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral import Grisette.IR.SymPrim.Data.Prim.PartialEval.Num import Test.Tasty.QuickCheck @@ -184,11 +185,12 @@ bvconcatSpec ::   ( TermRewritingSpec a (bv an),     TermRewritingSpec b (bv bn),-    TermRewritingSpec c (bv cn),+    TermRewritingSpec c (bv (an + bn)),     KnownNat an,     KnownNat bn,-    KnownNat cn,-    BVConcat (bv an) (bv bn) (bv cn)+    1 <= an,+    1 <= bn,+    SizedBV bv   ) =>   a ->   b ->@@ -199,9 +201,13 @@   ( TermRewritingSpec a (bv an),     TermRewritingSpec b (bv bn),     KnownNat an,-    KnownNat bn,     KnownNat ix,-    BVSelect (bv an) ix bn (bv bn)+    KnownNat bn,+    1 <= an,+    1 <= bn,+    0 <= ix,+    ix + bn <= an,+    SizedBV bv   ) =>   proxy ix ->   proxy bn ->@@ -214,7 +220,9 @@     TermRewritingSpec b (bv bn),     KnownNat an,     KnownNat bn,-    BVExtend (bv an) bn (bv bn)+    1 <= an,+    an <= bn,+    SizedBV bv   ) =>   Bool ->   proxy bn ->@@ -222,12 +230,30 @@   b bvextendSpec signed p = constructUnarySpec (bvextendTerm signed p) (pevalBVExtendTerm signed p) -divIntegerSpec :: (TermRewritingSpec a Integer) => a -> a -> a-divIntegerSpec = constructBinarySpec divIntegerTerm pevalDivIntegerTerm+divIntegralSpec :: (TermRewritingSpec a b, Integral b) => a -> a -> a+divIntegralSpec = constructBinarySpec divIntegralTerm pevalDivIntegralTerm -modIntegerSpec :: (TermRewritingSpec a Integer) => a -> a -> a-modIntegerSpec = constructBinarySpec modIntegerTerm pevalModIntegerTerm+modIntegralSpec :: (TermRewritingSpec a b, Integral b) => a -> a -> a+modIntegralSpec = constructBinarySpec modIntegralTerm pevalModIntegralTerm +quotIntegralSpec :: (TermRewritingSpec a b, Integral b) => a -> a -> a+quotIntegralSpec = constructBinarySpec quotIntegralTerm pevalQuotIntegralTerm++remIntegralSpec :: (TermRewritingSpec a b, Integral b) => a -> a -> a+remIntegralSpec = constructBinarySpec remIntegralTerm pevalRemIntegralTerm++divBoundedIntegralSpec :: (TermRewritingSpec a b, Bounded b, Integral b) => a -> a -> a+divBoundedIntegralSpec = constructBinarySpec divBoundedIntegralTerm pevalDivBoundedIntegralTerm++modBoundedIntegralSpec :: (TermRewritingSpec a b, Bounded b, Integral b) => a -> a -> a+modBoundedIntegralSpec = constructBinarySpec modBoundedIntegralTerm pevalModBoundedIntegralTerm++quotBoundedIntegralSpec :: (TermRewritingSpec a b, Bounded b, Integral b) => a -> a -> a+quotBoundedIntegralSpec = constructBinarySpec quotBoundedIntegralTerm pevalQuotBoundedIntegralTerm++remBoundedIntegralSpec :: (TermRewritingSpec a b, Bounded b, Integral b) => a -> a -> a+remBoundedIntegralSpec = constructBinarySpec remBoundedIntegralTerm pevalRemBoundedIntegralTerm+ data BoolOnlySpec = BoolOnlySpec (Term Bool) (Term Bool)  instance Show BoolOnlySpec where@@ -449,38 +475,7 @@     SupportedBV bv 3,     SupportedBV bv 4,     Typeable bv,-    BVSelect (bv 4) 0 2 (bv 2),-    BVSelect (bv 4) 1 2 (bv 2),-    BVSelect (bv 4) 2 2 (bv 2),-    BVSelect (bv 3) 0 2 (bv 2),-    BVSelect (bv 3) 1 2 (bv 2),-    BVSelect (bv 2) 0 2 (bv 2),-    BVConcat (bv 1) (bv 1) (bv 2),-    BVExtend (bv 1) 2 (bv 2),-    BVSelect (bv 4) 0 1 (bv 1),-    BVSelect (bv 4) 1 1 (bv 1),-    BVSelect (bv 4) 2 1 (bv 1),-    BVSelect (bv 4) 3 1 (bv 1),-    BVSelect (bv 3) 0 1 (bv 1),-    BVSelect (bv 3) 1 1 (bv 1),-    BVSelect (bv 3) 2 1 (bv 1),-    BVSelect (bv 2) 0 1 (bv 1),-    BVSelect (bv 2) 1 1 (bv 1),-    BVSelect (bv 1) 0 1 (bv 1),-    BVSelect (bv 4) 0 3 (bv 3),-    BVSelect (bv 4) 1 3 (bv 3),-    BVSelect (bv 3) 0 3 (bv 3),-    BVConcat (bv 1) (bv 2) (bv 3),-    BVConcat (bv 2) (bv 1) (bv 3),-    BVExtend (bv 1) 3 (bv 3),-    BVExtend (bv 2) 3 (bv 3),-    BVSelect (bv 4) 0 4 (bv 4),-    BVConcat (bv 1) (bv 3) (bv 4),-    BVConcat (bv 2) (bv 2) (bv 4),-    BVConcat (bv 3) (bv 1) (bv 4),-    BVExtend (bv 1) 4 (bv 4),-    BVExtend (bv 2) 4 (bv 4),-    BVExtend (bv 3) 4 (bv 4)+    SizedBV bv   ) =>   proxy bv ->   Int ->@@ -531,38 +526,7 @@     SupportedBV bv 3,     SupportedBV bv 4,     Typeable bv,-    BVSelect (bv 4) 0 2 (bv 2),-    BVSelect (bv 4) 1 2 (bv 2),-    BVSelect (bv 4) 2 2 (bv 2),-    BVSelect (bv 3) 0 2 (bv 2),-    BVSelect (bv 3) 1 2 (bv 2),-    BVSelect (bv 2) 0 2 (bv 2),-    BVConcat (bv 1) (bv 1) (bv 2),-    BVExtend (bv 1) 2 (bv 2),-    BVSelect (bv 4) 0 1 (bv 1),-    BVSelect (bv 4) 1 1 (bv 1),-    BVSelect (bv 4) 2 1 (bv 1),-    BVSelect (bv 4) 3 1 (bv 1),-    BVSelect (bv 3) 0 1 (bv 1),-    BVSelect (bv 3) 1 1 (bv 1),-    BVSelect (bv 3) 2 1 (bv 1),-    BVSelect (bv 2) 0 1 (bv 1),-    BVSelect (bv 2) 1 1 (bv 1),-    BVSelect (bv 1) 0 1 (bv 1),-    BVSelect (bv 4) 0 3 (bv 3),-    BVSelect (bv 4) 1 3 (bv 3),-    BVSelect (bv 3) 0 3 (bv 3),-    BVConcat (bv 1) (bv 2) (bv 3),-    BVConcat (bv 2) (bv 1) (bv 3),-    BVExtend (bv 1) 3 (bv 3),-    BVExtend (bv 2) 3 (bv 3),-    BVSelect (bv 4) 0 4 (bv 4),-    BVConcat (bv 1) (bv 3) (bv 4),-    BVConcat (bv 2) (bv 2) (bv 4),-    BVConcat (bv 3) (bv 1) (bv 4),-    BVExtend (bv 1) 4 (bv 4),-    BVExtend (bv 2) 4 (bv 4),-    BVExtend (bv 3) 4 (bv 4)+    SizedBV bv   ) =>   proxy bv ->   Int ->@@ -613,38 +577,7 @@     SupportedBV bv 3,     SupportedBV bv 4,     Typeable bv,-    BVSelect (bv 4) 0 2 (bv 2),-    BVSelect (bv 4) 1 2 (bv 2),-    BVSelect (bv 4) 2 2 (bv 2),-    BVSelect (bv 3) 0 2 (bv 2),-    BVSelect (bv 3) 1 2 (bv 2),-    BVSelect (bv 2) 0 2 (bv 2),-    BVConcat (bv 1) (bv 1) (bv 2),-    BVExtend (bv 1) 2 (bv 2),-    BVSelect (bv 4) 0 1 (bv 1),-    BVSelect (bv 4) 1 1 (bv 1),-    BVSelect (bv 4) 2 1 (bv 1),-    BVSelect (bv 4) 3 1 (bv 1),-    BVSelect (bv 3) 0 1 (bv 1),-    BVSelect (bv 3) 1 1 (bv 1),-    BVSelect (bv 3) 2 1 (bv 1),-    BVSelect (bv 2) 0 1 (bv 1),-    BVSelect (bv 2) 1 1 (bv 1),-    BVSelect (bv 1) 0 1 (bv 1),-    BVSelect (bv 4) 0 3 (bv 3),-    BVSelect (bv 4) 1 3 (bv 3),-    BVSelect (bv 3) 0 3 (bv 3),-    BVConcat (bv 1) (bv 2) (bv 3),-    BVConcat (bv 2) (bv 1) (bv 3),-    BVExtend (bv 1) 3 (bv 3),-    BVExtend (bv 2) 3 (bv 3),-    BVSelect (bv 4) 0 4 (bv 4),-    BVConcat (bv 1) (bv 3) (bv 4),-    BVConcat (bv 2) (bv 2) (bv 4),-    BVConcat (bv 3) (bv 1) (bv 4),-    BVExtend (bv 1) 4 (bv 4),-    BVExtend (bv 2) 4 (bv 4),-    BVExtend (bv 3) 4 (bv 4)+    SizedBV bv   ) =>   proxy bv ->   Int ->@@ -694,38 +627,7 @@     SupportedBV bv 3,     SupportedBV bv 4,     Typeable bv,-    BVSelect (bv 4) 0 2 (bv 2),-    BVSelect (bv 4) 1 2 (bv 2),-    BVSelect (bv 4) 2 2 (bv 2),-    BVSelect (bv 3) 0 2 (bv 2),-    BVSelect (bv 3) 1 2 (bv 2),-    BVSelect (bv 2) 0 2 (bv 2),-    BVConcat (bv 1) (bv 1) (bv 2),-    BVExtend (bv 1) 2 (bv 2),-    BVSelect (bv 4) 0 1 (bv 1),-    BVSelect (bv 4) 1 1 (bv 1),-    BVSelect (bv 4) 2 1 (bv 1),-    BVSelect (bv 4) 3 1 (bv 1),-    BVSelect (bv 3) 0 1 (bv 1),-    BVSelect (bv 3) 1 1 (bv 1),-    BVSelect (bv 3) 2 1 (bv 1),-    BVSelect (bv 2) 0 1 (bv 1),-    BVSelect (bv 2) 1 1 (bv 1),-    BVSelect (bv 1) 0 1 (bv 1),-    BVSelect (bv 4) 0 3 (bv 3),-    BVSelect (bv 4) 1 3 (bv 3),-    BVSelect (bv 3) 0 3 (bv 3),-    BVConcat (bv 1) (bv 2) (bv 3),-    BVConcat (bv 2) (bv 1) (bv 3),-    BVExtend (bv 1) 3 (bv 3),-    BVExtend (bv 2) 3 (bv 3),-    BVSelect (bv 4) 0 4 (bv 4),-    BVConcat (bv 1) (bv 3) (bv 4),-    BVConcat (bv 2) (bv 2) (bv 4),-    BVConcat (bv 3) (bv 1) (bv 4),-    BVExtend (bv 1) 4 (bv 4),-    BVExtend (bv 2) 4 (bv 4),-    BVExtend (bv 3) 4 (bv 4)+    SizedBV bv   ) =>   proxy bv ->   Int ->@@ -776,38 +678,7 @@     SupportedBV bv 3,     SupportedBV bv 4,     Typeable bv,-    BVSelect (bv 4) 0 2 (bv 2),-    BVSelect (bv 4) 1 2 (bv 2),-    BVSelect (bv 4) 2 2 (bv 2),-    BVSelect (bv 3) 0 2 (bv 2),-    BVSelect (bv 3) 1 2 (bv 2),-    BVSelect (bv 2) 0 2 (bv 2),-    BVConcat (bv 1) (bv 1) (bv 2),-    BVExtend (bv 1) 2 (bv 2),-    BVSelect (bv 4) 0 1 (bv 1),-    BVSelect (bv 4) 1 1 (bv 1),-    BVSelect (bv 4) 2 1 (bv 1),-    BVSelect (bv 4) 3 1 (bv 1),-    BVSelect (bv 3) 0 1 (bv 1),-    BVSelect (bv 3) 1 1 (bv 1),-    BVSelect (bv 3) 2 1 (bv 1),-    BVSelect (bv 2) 0 1 (bv 1),-    BVSelect (bv 2) 1 1 (bv 1),-    BVSelect (bv 1) 0 1 (bv 1),-    BVSelect (bv 4) 0 3 (bv 3),-    BVSelect (bv 4) 1 3 (bv 3),-    BVSelect (bv 3) 0 3 (bv 3),-    BVConcat (bv 1) (bv 2) (bv 3),-    BVConcat (bv 2) (bv 1) (bv 3),-    BVExtend (bv 1) 3 (bv 3),-    BVExtend (bv 2) 3 (bv 3),-    BVSelect (bv 4) 0 4 (bv 4),-    BVConcat (bv 1) (bv 3) (bv 4),-    BVConcat (bv 2) (bv 2) (bv 4),-    BVConcat (bv 3) (bv 1) (bv 4),-    BVExtend (bv 1) 4 (bv 4),-    BVExtend (bv 2) 4 (bv 4),-    BVExtend (bv 3) 4 (bv 4)+    SizedBV bv   ) =>   Arbitrary (DifferentSizeBVSpec bv 4)   where
test/Grisette/Backend/SBV/Data/SMT/TermRewritingTests.hs view
@@ -10,8 +10,8 @@ import qualified Data.SBV as SBV import Grisette.Backend.SBV.Data.SMT.Solving import Grisette.Backend.SBV.Data.SMT.TermRewritingGen+import Grisette.Core.Data.BV import Grisette.Core.Data.Class.Solver-import Grisette.IR.SymPrim.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import Grisette.IR.SymPrim.Data.Prim.InternedTerm.TermUtils import Grisette.IR.SymPrim.Data.SymPrim@@ -21,8 +21,8 @@  validateSpec :: (TermRewritingSpec a av, Show a, SupportedPrim av) => GrisetteSMTConfig n -> a -> Assertion validateSpec config a = do-  r <- solve config (Sym $ counterExample a)-  rs <- solve config (Sym $ same a)+  r <- solve config (SymBool $ counterExample a)+  rs <- solve config (SymBool $ same a)   case (r, rs) of     (Left _, Right _) -> do       return ()@@ -31,160 +31,174 @@     (Right m, _) -> do       assertFailure $ "With model" ++ show m ++ "Bad rewriting: " ++ pformat (norewriteVer a) ++ " was rewritten to " ++ pformat (rewriteVer a) +unboundedConfig = precise SBV.z3++divisionTest ::+  forall a b.+  (TermRewritingSpec a b, Show a, Enum b, Num b, SupportedPrim b) =>+  TestName ->+  (a -> a -> a) ->+  TestTree+divisionTest name f =+  testGroup+    name+    [ testCase "on concrete" $ do+        traverse_+          ( \(x :: b, y :: b) -> do+              validateSpec @a unboundedConfig $ f (conSpec x) (conSpec y)+          )+          [(i, j) | i <- [-3 .. 3], j <- [-3 .. 3]],+      testCase "on single concrete" $ do+        traverse_+          ( \x -> do+              validateSpec @a unboundedConfig $ f (conSpec x) (symSpec "a")+              validateSpec @a unboundedConfig $ f (symSpec "a") (conSpec x)+          )+          [-3 .. 3]+    ]+ termRewritingTests :: TestTree termRewritingTests =-  let unboundedConfig = UnboundedReasoning SBV.z3 -- {SBV.verbose=True}-   in testGroup-        "TermRewritingTests"-        [ testGroup-            "Bool only"-            [ testProperty "Bool only random test" $-                mapSize (`min` 10) $-                  ioProperty . \(x :: BoolOnlySpec) -> do-                    validateSpec unboundedConfig x,-              testCase "Regression nested ite with (ite a (ite b c d) e) with b is true" $ do-                validateSpec @BoolOnlySpec-                  unboundedConfig-                  ( iteSpec-                      (symSpec "a" :: BoolOnlySpec)-                      ( iteSpec-                          (orSpec (notSpec (andSpec (symSpec "b1") (symSpec "b2"))) (symSpec "b2") :: BoolOnlySpec)-                          (symSpec "c")-                          (symSpec "d")-                      )-                      (symSpec "e")-                  ),-              testCase "Regression for pevalImpliesTerm _ false should be false" $ do-                validateSpec @BoolOnlySpec-                  unboundedConfig+  testGroup+    "TermRewritingTests"+    [ testGroup+        "Bool only"+        [ testProperty "Bool only random test" $+            mapSize (`min` 10) $+              ioProperty . \(x :: BoolOnlySpec) -> do+                validateSpec unboundedConfig x,+          testCase "Regression nested ite with (ite a (ite b c d) e) with b is true" $ do+            validateSpec @BoolOnlySpec+              unboundedConfig+              ( iteSpec+                  (symSpec "a" :: BoolOnlySpec)                   ( iteSpec-                      (symSpec "fbool" :: BoolOnlySpec)-                      ( notSpec-                          ( orSpec-                              (orSpec (notSpec (andSpec (symSpec "gbool" :: BoolOnlySpec) (symSpec "fbool" :: BoolOnlySpec))) (symSpec "gbool" :: BoolOnlySpec))-                              (orSpec (symSpec "abool" :: BoolOnlySpec) (notSpec (andSpec (symSpec "gbool" :: BoolOnlySpec) (symSpec "bbool" :: BoolOnlySpec))))-                          )-                      )-                      (symSpec "xxx" :: BoolOnlySpec)+                      (orSpec (notSpec (andSpec (symSpec "b1") (symSpec "b2"))) (symSpec "b2") :: BoolOnlySpec)+                      (symSpec "c")+                      (symSpec "d")                   )-            ],-          testGroup-            "LIA"-            [ testProperty "LIA random test" $-                mapSize (`min` 10) $-                  ioProperty . \(x :: LIAWithBoolSpec) -> do-                    validateSpec unboundedConfig x,-              testCase "Regression nested ite with (ite a b (ite c d e)) with c implies a" $ do-                validateSpec @LIAWithBoolSpec-                  unboundedConfig-                  ( iteSpec-                      (notSpec (eqvSpec (symSpec "v" :: LIAWithBoolSpec) (conSpec 1 :: LIAWithBoolSpec) :: BoolWithLIASpec))-                      (symSpec "b")-                      ( iteSpec-                          (eqvSpec (symSpec "v" :: LIAWithBoolSpec) (conSpec 2 :: LIAWithBoolSpec) :: BoolWithLIASpec)-                          (symSpec "d")-                          (symSpec "d")+                  (symSpec "e")+              ),+          testCase "Regression for pevalImpliesTerm _ false should be false" $ do+            validateSpec @BoolOnlySpec+              unboundedConfig+              ( iteSpec+                  (symSpec "fbool" :: BoolOnlySpec)+                  ( notSpec+                      ( orSpec+                          (orSpec (notSpec (andSpec (symSpec "gbool" :: BoolOnlySpec) (symSpec "fbool" :: BoolOnlySpec))) (symSpec "gbool" :: BoolOnlySpec))+                          (orSpec (symSpec "abool" :: BoolOnlySpec) (notSpec (andSpec (symSpec "gbool" :: BoolOnlySpec) (symSpec "bbool" :: BoolOnlySpec))))                       )                   )-            ],-          testGroup-            "Different sized SignedBV"-            [ testProperty "Fixed Sized SignedBV random test" $-                mapSize (`min` 10) $-                  ioProperty . \(x :: (DifferentSizeBVSpec IntN 4)) -> do-                    validateSpec unboundedConfig x-            ],-          testGroup-            "Fixed sized SignedBV"-            [ testProperty "Fixed Sized SignedBV random test" $-                mapSize (`min` 10) $-                  ioProperty . \(x :: (FixedSizedBVWithBoolSpec IntN)) -> do-                    validateSpec unboundedConfig x-            ],-          testGroup-            "timesNumSpec on integer"-            [ testCase "times on both concrete" $ do-                traverse_-                  (\(x, y) -> validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) (conSpec y))-                  [(i, j) | i <- [-3 .. 3], j <- [-3 .. 3]],-              testCase "times on single concrete" $ do-                traverse_-                  ( \x -> do-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) (symSpec "a")-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (symSpec "a") (conSpec x)-                  )-                  [-3 .. 3],-              testCase "Two times with two concrete combined" $ do-                traverse_-                  ( \(x, y) -> do-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) $ timesNumSpec (conSpec y) (symSpec "a")-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) $ timesNumSpec (symSpec "a") (conSpec y)-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (timesNumSpec (conSpec x) (symSpec "a")) (conSpec y)-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (timesNumSpec (symSpec "a") (conSpec x)) (conSpec y)-                  )-                  [(i, j) | i <- [-3 .. 3], j <- [-3 .. 3]],-              testCase "Two times with one concrete" $ do-                traverse_-                  ( \x -> do-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) $ timesNumSpec (symSpec "b") (symSpec "a")-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (symSpec "b") $ timesNumSpec (symSpec "a") (conSpec x)-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (symSpec "b") $ timesNumSpec (conSpec x) (symSpec "a")-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (timesNumSpec (conSpec x) (symSpec "a")) (symSpec "b")-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (timesNumSpec (symSpec "a") (conSpec x)) (symSpec "b")-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (timesNumSpec (symSpec "a") (symSpec "b")) (conSpec x)-                  )-                  [-3 .. 3],-              testCase "times and add with two concretes combined" $ do-                traverse_-                  ( \(x, y) -> do-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) $ addNumSpec (conSpec y) (symSpec "a")-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) $ addNumSpec (symSpec "a") (conSpec y)-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (addNumSpec (conSpec x) (symSpec "a")) (conSpec y)-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (addNumSpec (symSpec "a") (conSpec x)) (conSpec y)-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ addNumSpec (conSpec x) $ timesNumSpec (conSpec y) (symSpec "a")-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ addNumSpec (conSpec x) $ timesNumSpec (symSpec "a") (conSpec y)-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ addNumSpec (timesNumSpec (conSpec x) (symSpec "a")) (conSpec y)-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ addNumSpec (timesNumSpec (symSpec "a") (conSpec x)) (conSpec y)-                  )-                  [(i, j) | i <- [-3 .. 3], j <- [-3 .. 3]],-              testCase "times concrete with uminusNumSpec symbolic" $ do-                traverse_-                  ( \x -> do-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) (uminusNumSpec $ symSpec "a")-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (uminusNumSpec $ symSpec "a") (conSpec x)-                  )-                  [-3 .. 3]-            ],-          testGroup-            "DivI"-            [ testCase "DivI on concrete" $ do-                traverse_-                  ( \(x, y) -> do-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ divIntegerSpec (conSpec x) (conSpec y)-                  )-                  [(i, j) | i <- [-3 .. 3], j <- [-3 .. 3]],-              testCase "DivI on single concrete" $ do-                traverse_-                  ( \x -> do-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ divIntegerSpec (conSpec x) (symSpec "a")-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ divIntegerSpec (symSpec "a") (conSpec x)-                  )-                  [-3 .. 3]-            ],-          testGroup-            "ModI"-            [ testCase "ModI on concrete" $ do-                traverse_-                  ( \(x, y) -> do-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ modIntegerSpec (conSpec x) (conSpec y)-                  )-                  [(i, j) | i <- [-3 .. 3], j <- [-3 .. 3]],-              testCase "ModI on single concrete" $ do-                traverse_-                  ( \x -> do-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ modIntegerSpec (conSpec x) (symSpec "a")-                      validateSpec @(GeneralSpec Integer) unboundedConfig $ modIntegerSpec (symSpec "a") (conSpec x)+                  (symSpec "xxx" :: BoolOnlySpec)+              )+        ],+      testGroup+        "LIA"+        [ testProperty "LIA random test" $+            mapSize (`min` 10) $+              ioProperty . \(x :: LIAWithBoolSpec) -> do+                validateSpec unboundedConfig x,+          testCase "Regression nested ite with (ite a b (ite c d e)) with c implies a" $ do+            validateSpec @LIAWithBoolSpec+              unboundedConfig+              ( iteSpec+                  (notSpec (eqvSpec (symSpec "v" :: LIAWithBoolSpec) (conSpec 1 :: LIAWithBoolSpec) :: BoolWithLIASpec))+                  (symSpec "b")+                  ( iteSpec+                      (eqvSpec (symSpec "v" :: LIAWithBoolSpec) (conSpec 2 :: LIAWithBoolSpec) :: BoolWithLIASpec)+                      (symSpec "d")+                      (symSpec "d")                   )-                  [-3 .. 3]-            ]+              )+        ],+      testGroup+        "Different sized SignedBV"+        [ testProperty "Fixed Sized SignedBV random test" $+            mapSize (`min` 10) $+              ioProperty . \(x :: (DifferentSizeBVSpec IntN 4)) -> do+                validateSpec unboundedConfig x+        ],+      testGroup+        "Fixed sized SignedBV"+        [ testProperty "Fixed Sized SignedBV random test" $+            mapSize (`min` 10) $+              ioProperty . \(x :: (FixedSizedBVWithBoolSpec IntN)) -> do+                validateSpec unboundedConfig x+        ],+      testGroup+        "timesNumSpec on integer"+        [ testCase "times on both concrete" $ do+            traverse_+              (\(x, y) -> validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) (conSpec y))+              [(i, j) | i <- [-3 .. 3], j <- [-3 .. 3]],+          testCase "times on single concrete" $ do+            traverse_+              ( \x -> do+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) (symSpec "a")+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (symSpec "a") (conSpec x)+              )+              [-3 .. 3],+          testCase "Two times with two concrete combined" $ do+            traverse_+              ( \(x, y) -> do+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) $ timesNumSpec (conSpec y) (symSpec "a")+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) $ timesNumSpec (symSpec "a") (conSpec y)+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (timesNumSpec (conSpec x) (symSpec "a")) (conSpec y)+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (timesNumSpec (symSpec "a") (conSpec x)) (conSpec y)+              )+              [(i, j) | i <- [-3 .. 3], j <- [-3 .. 3]],+          testCase "Two times with one concrete" $ do+            traverse_+              ( \x -> do+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) $ timesNumSpec (symSpec "b") (symSpec "a")+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (symSpec "b") $ timesNumSpec (symSpec "a") (conSpec x)+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (symSpec "b") $ timesNumSpec (conSpec x) (symSpec "a")+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (timesNumSpec (conSpec x) (symSpec "a")) (symSpec "b")+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (timesNumSpec (symSpec "a") (conSpec x)) (symSpec "b")+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (timesNumSpec (symSpec "a") (symSpec "b")) (conSpec x)+              )+              [-3 .. 3],+          testCase "times and add with two concretes combined" $ do+            traverse_+              ( \(x, y) -> do+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) $ addNumSpec (conSpec y) (symSpec "a")+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) $ addNumSpec (symSpec "a") (conSpec y)+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (addNumSpec (conSpec x) (symSpec "a")) (conSpec y)+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (addNumSpec (symSpec "a") (conSpec x)) (conSpec y)+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ addNumSpec (conSpec x) $ timesNumSpec (conSpec y) (symSpec "a")+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ addNumSpec (conSpec x) $ timesNumSpec (symSpec "a") (conSpec y)+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ addNumSpec (timesNumSpec (conSpec x) (symSpec "a")) (conSpec y)+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ addNumSpec (timesNumSpec (symSpec "a") (conSpec x)) (conSpec y)+              )+              [(i, j) | i <- [-3 .. 3], j <- [-3 .. 3]],+          testCase "times concrete with uminusNumSpec symbolic" $ do+            traverse_+              ( \x -> do+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (conSpec x) (uminusNumSpec $ symSpec "a")+                  validateSpec @(GeneralSpec Integer) unboundedConfig $ timesNumSpec (uminusNumSpec $ symSpec "a") (conSpec x)+              )+              [-3 .. 3]+        ],+      testGroup+        "divisions on integer"+        [ divisionTest @(GeneralSpec Integer) "div" divIntegralSpec,+          divisionTest @(GeneralSpec Integer) "mod" modIntegralSpec,+          divisionTest @(GeneralSpec Integer) "quot" quotIntegralSpec,+          divisionTest @(GeneralSpec Integer) "rem" remIntegralSpec+        ],+      testGroup+        "divisions on signed bv"+        [ divisionTest @(GeneralSpec (IntN 4)) "div" divBoundedIntegralSpec,+          divisionTest @(GeneralSpec (IntN 4)) "mod" modBoundedIntegralSpec,+          divisionTest @(GeneralSpec (IntN 4)) "quot" quotBoundedIntegralSpec,+          divisionTest @(GeneralSpec (IntN 4)) "rem" remBoundedIntegralSpec+        ],+      testGroup+        "divisions on unsigned bv"+        [ divisionTest @(GeneralSpec (WordN 4)) "div" divIntegralSpec,+          divisionTest @(GeneralSpec (WordN 4)) "mod" modIntegralSpec,+          divisionTest @(GeneralSpec (WordN 4)) "quot" quotIntegralSpec,+          divisionTest @(GeneralSpec (WordN 4)) "rem" remIntegralSpec         ]+    ]
+ test/Grisette/Core/Control/Monad/UnionMTests.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE OverloadedStrings #-}++module Grisette.Core.Control.Monad.UnionMTests where++import Grisette.Core.Control.Monad.UnionM+import Grisette.Core.Data.Class.GenSym+import Grisette.Core.Data.Class.SimpleMergeable+import Grisette.Core.Data.Class.Solvable+import Test.Tasty+import Test.Tasty.HUnit++unionMTests :: TestTree+unionMTests =+  testGroup+    "UnionMTests"+    [ testCase "unionSize" $ do+        unionSize (single 1 :: UnionM Integer) @=? 1+        unionSize (mrgIf (ssym "a") (single 1) (single 2) :: UnionM Integer) @=? 2+        unionSize (choose [1, 2, 3, 4, 5, 6, 7] "a" :: UnionM Integer) @=? 7+    ]
+ test/Grisette/Core/Data/BVTests.hs view
@@ -0,0 +1,430 @@+{-# LANGUAGE BinaryLiterals #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE NegativeLiterals #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}++module Grisette.Core.Data.BVTests where++import Control.DeepSeq+import Control.Exception+import Control.Monad+import Data.Bifunctor+import Data.Bits+import Data.Int+import Data.Proxy+import Data.Typeable+import Data.Word+import Grisette.Core.Data.BV+import Grisette.Core.Data.Class.BitVector+import Test.Tasty+import Test.Tasty.HUnit+import Test.Tasty.QuickCheck hiding ((.&.))++unaryConform :: forall a b c d. (Show c, Eq c, HasCallStack) => (a -> b) -> (d -> c) -> (a -> c) -> (b -> d) -> a -> Property+unaryConform a2b d2c f g x = ioProperty $ f x @=? d2c (g (a2b x))++binaryConform ::+  forall a b c d e f.+  (Show e, Eq e, HasCallStack) =>+  (a -> b) ->+  (c -> d) ->+  (f -> e) ->+  (a -> c -> e) ->+  (b -> d -> f) ->+  a ->+  c ->+  Property+binaryConform a2b c2d f2e f g x y = ioProperty $ f x y @=? f2e (g (a2b x) (c2d y))++wordUnaryConform :: HasCallStack => (WordN 8 -> WordN 8) -> (Word8 -> Word8) -> Word8 -> Assertion+wordUnaryConform f g x = unWordN (f (fromIntegral x)) @=? toInteger (g x)++wordUnaryNonNegIntConform :: HasCallStack => (Int -> WordN 8) -> (Int -> Word8) -> Int -> Assertion+wordUnaryNonNegIntConform f g y = when (y >= 0) $ unWordN (f y) @=? toInteger (g y)++wordBinIntConform :: HasCallStack => (WordN 8 -> Int -> WordN 8) -> (Word8 -> Int -> Word8) -> Word8 -> Int -> Assertion+wordBinIntConform f g x y = unWordN (f (fromIntegral x) y) @=? toInteger (g x y)++wordBinNonNegIntConform :: HasCallStack => (WordN 8 -> Int -> WordN 8) -> (Word8 -> Int -> Word8) -> Word8 -> Int -> Assertion+wordBinNonNegIntConform f g x y = when (y >= 0) $ unWordN (f (fromIntegral x) y) @=? toInteger (g x y)++wordBinConform :: HasCallStack => (WordN 8 -> WordN 8 -> WordN 8) -> (Word8 -> Word8 -> Word8) -> Word8 -> Word8 -> Assertion+wordBinConform f g x y = unWordN (f (fromIntegral x) (fromIntegral y)) @=? toInteger (g x y)++intN8eqint8 :: IntN 8 -> Int8 -> Assertion+intN8eqint8 (IntN v) i+  | v < 0 = assertFailure "Bad IntN"+  | v <= 127 = v @=? fromIntegral i+  | v == 128 = i @=? -128+  | otherwise = 256 - v @=? fromIntegral (-i)++intUnaryConform :: (IntN 8 -> IntN 8) -> (Int8 -> Int8) -> Int8 -> Assertion+intUnaryConform f g x = intN8eqint8 (f (fromIntegral x)) (g x)++intUnaryNonNegIntConform :: (Int -> IntN 8) -> (Int -> Int8) -> Int -> Assertion+intUnaryNonNegIntConform f g y = when (y >= 0) $ intN8eqint8 (f y) (g y)++intBinIntConform :: (IntN 8 -> Int -> IntN 8) -> (Int8 -> Int -> Int8) -> Int8 -> Int -> Assertion+intBinIntConform f g x y = intN8eqint8 (f (fromIntegral x) y) (g x y)++intBinNonNegIntConform :: (IntN 8 -> Int -> IntN 8) -> (Int8 -> Int -> Int8) -> Int8 -> Int -> Assertion+intBinNonNegIntConform f g x y = when (y >= 0) $ intN8eqint8 (f (fromIntegral x) y) (g x y)++intBinConform :: (IntN 8 -> IntN 8 -> IntN 8) -> (Int8 -> Int8 -> Int8) -> Int8 -> Int8 -> Assertion+intBinConform f g x y = intN8eqint8 (f (fromIntegral x) (fromIntegral y)) (g x y)++finiteBitsConformTest ::+  forall ref typ.+  (Arbitrary ref, Typeable ref, Typeable typ, Show ref, Show typ, Eq ref, Eq typ, FiniteBits ref, FiniteBits typ, Integral ref, Integral typ) =>+  Proxy ref ->+  Proxy typ ->+  Int ->+  TestTree+finiteBitsConformTest pref ptyp numBits =+  testGroup+    (show (typeRep ptyp) ++ " conform to " ++ show (typeRep pref) ++ " for FiniteBits instances")+    [ testCase "finiteBitSize" $ finiteBitSize (0 :: typ) @=? numBits,+      testProperty "countLeadingZeros" $ unaryConform @ref @typ fromIntegral id countLeadingZeros countLeadingZeros,+      testProperty "countTrailingZeros" $ unaryConform @ref @typ fromIntegral id countTrailingZeros countTrailingZeros+    ]++boundedConformTest ::+  forall ref typ.+  (Typeable ref, Typeable typ, Bounded typ, Bounded ref, Integral ref, Num typ, Eq typ, Show typ) =>+  Proxy ref ->+  Proxy typ ->+  TestTree+boundedConformTest pref ptyp =+  testGroup+    (show (typeRep ptyp) ++ " conform to " ++ show (typeRep pref) ++ " for Bounded instances")+    [ testCase "minBound" $ (minBound :: typ) @=? fromIntegral (minBound :: ref),+      testCase "maxBound" $ (maxBound :: typ) @=? fromIntegral (maxBound :: ref)+    ]++shouldThrow :: NFData a => String -> a -> IO ()+shouldThrow name x = do+  errored <- catch (evaluate $ x `deepseq` True) (\(_ :: SomeException) -> return False)+  when errored $ assertFailure $ name ++ " should throw an exception"++succPredLikeTest ::+  forall a b.+  (Arbitrary a, Eq a, Eq b, Show a, Show b, NFData b) =>+  TestName ->+  String ->+  (a -> b) ->+  (a -> a) ->+  (b -> b) ->+  a ->+  b ->+  TestTree+succPredLikeTest name boundName a2b fa fb bounda boundb =+  testGroup+    name+    [ testProperty (name ++ " non " ++ boundName) $+        ioProperty . \(x :: a) ->+          if x == bounda then return () else a2b (fa x) @=? fb (a2b x),+      testCase (name ++ " " ++ boundName) $ shouldThrow (name ++ " " ++ boundName) $ fb boundb+    ]++enumConformTest ::+  forall ref typ.+  ( Arbitrary ref,+    Typeable ref,+    Typeable typ,+    Eq ref,+    Eq typ,+    Show ref,+    Show typ,+    NFData typ,+    Integral ref,+    Integral typ,+    Bounded ref,+    Bounded typ+  ) =>+  Proxy ref ->+  Proxy typ ->+  TestTree+enumConformTest pref ptyp =+  testGroup+    (show (typeRep ptyp) ++ " conform to " ++ show (typeRep pref) ++ " for Enum instances")+    [ succPredLikeTest @ref @typ "succ" "maxBound" fromIntegral succ succ maxBound maxBound,+      succPredLikeTest @ref @typ "pred" "minBound" fromIntegral pred pred minBound minBound,+      testGroup+        "toEnum"+        [ testProperty "toEnum in bounds" $+            ioProperty . \(x :: ref) ->+              toInteger (toEnum (fromIntegral x) :: ref) @=? toInteger (toEnum (fromIntegral x) :: typ),+          testCase "toEnum (fromIntegral minBound - 1)" $+            shouldThrow "toEnum (fromIntegral minBound - 1)" (toEnum (fromIntegral (minBound :: typ) - 1) :: typ),+          testCase "toEnum (fromIntegral maxBound + 1)" $+            shouldThrow "toEnum (fromIntegral maxBound + 1)" (toEnum (fromIntegral (maxBound :: typ) + 1) :: typ)+        ],+      testProperty "fromEnum" $ unaryConform @ref @typ fromIntegral id fromEnum fromEnum,+      testProperty "enumFrom" $ unaryConform @ref @typ fromIntegral (fromIntegral <$>) enumFrom enumFrom,+      testProperty "enumFromThen" $ \(x :: ref) y ->+        ioProperty $ do+          if x == y+            then return ()+            else do+              (fromIntegral <$> enumFromThen x y) @=? enumFromThen (fromIntegral x :: typ) (fromIntegral y),+      testProperty "enumFromTo" $ binaryConform @ref @typ fromIntegral fromIntegral (fromIntegral <$>) enumFromTo enumFromTo,+      testProperty "enumFromThenTo" $ \(x :: ref) y z ->+        ioProperty $+          if x == y+            then return ()+            else (fromIntegral <$> enumFromThenTo x y z) @=? enumFromThenTo (fromIntegral x :: typ) (fromIntegral y) (fromIntegral z)+    ]++newtype AEWrapper = AEWrapper ArithException deriving (Eq)++instance Show AEWrapper where+  show (AEWrapper x) = show x++instance NFData AEWrapper where+  rnf (AEWrapper x) = x `seq` ()++sameDiv :: (NFData a, NFData b, Eq b, Show b) => a -> a -> (a -> b) -> (a -> a -> a) -> (b -> b -> b) -> IO ()+sameDiv x y a2b fa fb = do+  xa <- evaluate (force $ Right $ fa x y) `catch` \(e :: ArithException) -> return $ Left $ AEWrapper e+  xb <- evaluate (force $ Right $ fb (a2b x) (a2b y)) `catch` \(e :: ArithException) -> return $ Left $ AEWrapper e+  xb @=? a2b <$> xa++sameDivMod :: (NFData a, NFData b, Eq b, Show b) => a -> a -> (a -> b) -> (a -> a -> (a, a)) -> (b -> b -> (b, b)) -> IO ()+sameDivMod x y a2b fa fb = do+  xa <- evaluate (force $ Right $ fa x y) `catch` \(e :: ArithException) -> return $ Left $ AEWrapper e+  xb <- evaluate (force $ Right $ fb (a2b x) (a2b y)) `catch` \(e :: ArithException) -> return $ Left $ AEWrapper e+  xb @=? bimap a2b a2b <$> xa++divLikeTest ::+  forall a b.+  (Arbitrary a, Eq a, Eq b, Num a, Show a, Bounded a, Bits a, Eq b, Show b, Num b, NFData b, Bounded b, Bits b, NFData a) =>+  TestName ->+  (a -> b) ->+  (a -> a -> a) ->+  (b -> b -> b) ->+  TestTree+divLikeTest name a2b fa fb =+  testGroup+    "name"+    [ testCase "divided by zero" $ do+        sameDiv 1 0 a2b fa fb+        sameDiv 0 0 a2b fa fb+        sameDiv (-1) 0 a2b fa fb+        sameDiv minBound 0 a2b fa fb+        sameDiv maxBound 0 a2b fa fb,+      testCase "min divided by -1" $ do+        sameDiv minBound (-1) a2b fa fb,+      testProperty "prop" $ \(x :: a) y -> ioProperty $ sameDiv x y a2b fa fb+    ]++divModLikeTest ::+  forall a b.+  (Arbitrary a, Eq a, Eq b, Num a, NFData a, Show a, Bounded a, Bits a, Eq b, Show b, Num b, NFData b, Bounded b, Bits b) =>+  TestName ->+  (a -> b) ->+  (a -> a -> (a, a)) ->+  (b -> b -> (b, b)) ->+  TestTree+divModLikeTest name a2b fa fb =+  testGroup+    "name"+    [ testCase "divided by zero" $ do+        sameDivMod 1 0 a2b fa fb+        sameDivMod 0 0 a2b fa fb+        sameDivMod (-1) 0 a2b fa fb+        sameDivMod minBound 0 a2b fa fb+        sameDivMod maxBound 0 a2b fa fb,+      testCase "min divided by -1" $ do+        sameDivMod minBound (-1) a2b fa fb,+      testProperty "prop" $ \(x :: a) y -> ioProperty $ sameDivMod x y a2b fa fb+    ]++realConformTest ::+  forall proxy ref typ.+  (Typeable ref, Typeable typ, Integral ref, Num typ, Arbitrary ref, Real typ, Show ref) =>+  proxy ref ->+  proxy typ ->+  TestTree+realConformTest pref ptyp =+  testGroup+    (show (typeRep ptyp) ++ " conform to " ++ show (typeRep pref) ++ " for Real instances")+    [ testProperty "toRational" $ unaryConform @ref @typ fromIntegral id toRational toRational+    ]++integralConformTest ::+  forall ref typ.+  ( Arbitrary ref,+    Typeable ref,+    Typeable typ,+    Eq ref,+    Eq typ,+    Show ref,+    Show typ,+    Num ref,+    Num typ,+    Integral ref,+    Integral typ,+    Bits ref,+    Bits typ,+    Bounded ref,+    Bounded typ,+    NFData typ,+    NFData ref+  ) =>+  Proxy ref ->+  Proxy typ ->+  TestTree+integralConformTest pref ptyp =+  testGroup+    (show (typeRep ptyp) ++ " conform to " ++ show (typeRep pref) ++ " for Integral instances")+    [ divLikeTest @ref @typ "quot" fromIntegral quot quot,+      divLikeTest @ref @typ "rem" fromIntegral rem rem,+      divModLikeTest @ref @typ "quotRem" fromIntegral quotRem quotRem,+      divLikeTest @ref @typ "div" fromIntegral div div,+      divLikeTest @ref @typ "mod" fromIntegral mod mod,+      divModLikeTest @ref @typ "divMod" fromIntegral divMod divMod,+      testProperty "toInteger" $ unaryConform @ref @typ fromIntegral id toInteger toInteger+    ]++bvTests :: TestTree+bvTests =+  testGroup+    "BVTests"+    [ testGroup+        "WordN 8 conform to Word8 for Bits instances"+        [ testProperty "(.&.)" $ \x y -> ioProperty $ wordBinConform (.&.) (.&.) x y,+          testProperty "(.|.)" $ \x y -> ioProperty $ wordBinConform (.|.) (.|.) x y,+          testProperty "xor" $ \x y -> ioProperty $ wordBinConform xor xor x y,+          testProperty "complement" $ ioProperty . wordUnaryConform complement complement,+          testProperty "shift" $ \x y -> ioProperty $ wordBinIntConform shift shift x y,+          testProperty "rotate" $ \x y -> ioProperty $ wordBinIntConform rotate rotate x y,+          testCase "zeroBits" $ (zeroBits :: WordN 8) @=? 0,+          testProperty "bit" $ ioProperty . wordUnaryNonNegIntConform bit bit,+          testProperty "setBit" $ \x y -> ioProperty $ wordBinNonNegIntConform setBit setBit x y,+          testProperty "clearBit" $ \x y -> ioProperty $ wordBinNonNegIntConform clearBit clearBit x y,+          testProperty "complementBit" $ \x y -> ioProperty $ wordBinNonNegIntConform complementBit complementBit x y,+          testProperty "testBit" $ \(x :: Word8) i -> i < 0 || testBit x i == testBit (fromIntegral x :: WordN 8) i,+          testCase "bitSizeMaybe" $ bitSizeMaybe (0 :: WordN 8) @=? Just 8,+          testCase "isSigned" $ isSigned (0 :: WordN 8) @=? False,+          testProperty "shiftL" $ \x y -> ioProperty $ wordBinNonNegIntConform shiftL shiftL x y,+          testProperty "shiftR" $ \x y -> ioProperty $ wordBinNonNegIntConform shiftR shiftR x y,+          testProperty "rotateL" $ \x y -> ioProperty $ wordBinNonNegIntConform rotateL rotateL x y,+          testProperty "rotateR" $ \x y -> ioProperty $ wordBinNonNegIntConform rotateR rotateR x y,+          testProperty "popCount" $ ioProperty . \(x :: Word8) -> popCount x @=? popCount (fromIntegral x :: WordN 8)+        ],+      finiteBitsConformTest (Proxy @Word8) (Proxy @(WordN 8)) 8,+      boundedConformTest (Proxy @Word8) (Proxy @(WordN 8)),+      enumConformTest (Proxy @Word8) (Proxy @(WordN 8)),+      realConformTest (Proxy @Word8) (Proxy @(WordN 8)),+      integralConformTest (Proxy @Word8) (Proxy @(WordN 8)),+      testGroup+        "WordN 8 conform to Word8 for Num instances"+        [ testProperty "(+)" $ \x y -> ioProperty $ wordBinConform (+) (+) x y,+          testProperty "(*)" $ \x y -> ioProperty $ wordBinConform (*) (*) x y,+          testProperty "(-)" $ \x y -> ioProperty $ wordBinConform (-) (-) x y,+          testProperty "negate" $ ioProperty . wordUnaryConform negate negate,+          testProperty "abs" $ ioProperty . wordUnaryConform abs abs,+          testProperty "signum" $ ioProperty . wordUnaryConform signum signum,+          testProperty "fromInteger" $+            ioProperty . \(x :: Integer) ->+              unWordN (fromInteger x :: WordN 8) @=? toInteger (fromInteger x :: Word8)+        ],+      testGroup+        "WordN 8 conform to Word8 for Ord instances"+        [ testProperty "(<=)" $ \(x :: Word8) y -> ioProperty $ x <= y @=? (fromIntegral x :: WordN 8) <= (fromIntegral y :: WordN 8)+        ],+      testGroup+        "IntN 8 conform to Int8 for Bits instances"+        [ testProperty "(.&.)" $ \x y -> ioProperty $ intBinConform (.&.) (.&.) x y,+          testProperty "(.|.)" $ \x y -> ioProperty $ intBinConform (.|.) (.|.) x y,+          testProperty "xor" $ \x y -> ioProperty $ intBinConform xor xor x y,+          testProperty "complement" $ ioProperty . intUnaryConform complement complement,+          testProperty "shift" $ \x y -> ioProperty $ intBinIntConform shift shift x y,+          testProperty "rotate" $ \x y -> ioProperty $ intBinIntConform rotate rotate x y,+          testCase "zeroBits" $ (zeroBits :: IntN 8) @=? 0,+          testProperty "bit" $ ioProperty . intUnaryNonNegIntConform bit bit,+          testProperty "setBit" $ \x y -> ioProperty $ intBinNonNegIntConform setBit setBit x y,+          testProperty "clearBit" $ \x y -> ioProperty $ intBinNonNegIntConform clearBit clearBit x y,+          testProperty "complementBit" $ \x y -> ioProperty $ intBinNonNegIntConform complementBit complementBit x y,+          testProperty "testBit" $ \(x :: Int8) i -> i < 0 || testBit x i == testBit (fromIntegral x :: IntN 8) i,+          testCase "bitSizeMaybe" $ bitSizeMaybe (0 :: IntN 8) @=? Just 8,+          testCase "isSigned" $ isSigned (0 :: IntN 8) @=? True,+          testProperty "shiftL" $ \x y -> ioProperty $ intBinNonNegIntConform shiftL shiftL x y,+          testProperty "shiftR" $ \x y -> ioProperty $ intBinNonNegIntConform shiftR shiftR x y,+          testProperty "rotateL" $ \x y -> ioProperty $ intBinNonNegIntConform rotateL rotateL x y,+          testProperty "rotateR" $ \x y -> ioProperty $ intBinNonNegIntConform rotateR rotateR x y,+          testProperty "popCount" $ ioProperty . \(x :: Int8) -> popCount x @=? popCount (fromIntegral x :: IntN 8)+        ],+      finiteBitsConformTest (Proxy @Int8) (Proxy @(IntN 8)) 8,+      boundedConformTest (Proxy @Int8) (Proxy @(IntN 8)),+      enumConformTest (Proxy @Int8) (Proxy @(IntN 8)),+      realConformTest (Proxy @Int8) (Proxy @(IntN 8)),+      integralConformTest (Proxy @Int8) (Proxy @(IntN 8)),+      testGroup+        "IntN 8 conform to Int8 for Num instances"+        [ testProperty "(+)" $ \x y -> ioProperty $ intBinConform (+) (+) x y,+          testProperty "(*)" $ \x y -> ioProperty $ intBinConform (*) (*) x y,+          testProperty "(-)" $ \x y -> ioProperty $ intBinConform (-) (-) x y,+          testProperty "negate" $ ioProperty . wordUnaryConform negate negate,+          testProperty "abs" $ ioProperty . wordUnaryConform abs abs,+          testProperty "signum" $ ioProperty . wordUnaryConform signum signum,+          testProperty "fromInteger" $+            ioProperty . \(x :: Integer) ->+              intN8eqint8 (fromInteger x :: IntN 8) (fromInteger x :: Int8)+        ],+      testGroup+        "IntN 8 conform to IntN for Ord instances"+        [ testProperty "(<=)" $ \(x :: Int8) y -> ioProperty $ (fromIntegral x :: IntN 8) <= (fromIntegral y :: IntN 8) @=? x <= y+        ],+      testGroup+        "WordN bvops"+        [ testProperty "sizedBVConcat" $ \(x :: Integer) (y :: Integer) ->+            ioProperty $+              sizedBVConcat (fromInteger x :: WordN 5) (fromInteger y :: WordN 7) @=? fromInteger (x * 128 + y `mod` 128),+          testProperty "sizedBVZext" $ ioProperty . \(x :: Integer) -> sizedBVZext (Proxy :: Proxy 12) (fromInteger x :: WordN 7) @=? fromInteger (x `mod` 128),+          testCase "sizedBVSext" $ do+            sizedBVSext (Proxy :: Proxy 12) (0 :: WordN 8) @=? 0+            sizedBVSext (Proxy :: Proxy 12) (1 :: WordN 8) @=? 1+            sizedBVSext (Proxy :: Proxy 12) (127 :: WordN 8) @=? 127+            sizedBVSext (Proxy :: Proxy 12) (128 :: WordN 8) @=? 3968+            sizedBVSext (Proxy :: Proxy 12) (255 :: WordN 8) @=? 4095,+          testProperty "sizedBVExt is sizedBVZext" $+            ioProperty . \(x :: Integer) ->+              sizedBVExt (Proxy :: Proxy 12) (fromInteger x :: WordN 8) @=? sizedBVZext (Proxy :: Proxy 12) (fromInteger x :: WordN 8),+          testCase "sizedBVSelect" $ do+            sizedBVSelect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b11100 :: WordN 8) @=? 0b11+            sizedBVSelect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b111000 :: WordN 8) @=? 0b111+            sizedBVSelect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b101000 :: WordN 8) @=? 0b101+            sizedBVSelect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b1010000 :: WordN 8) @=? 0b10+        ],+      testGroup+        "IntN bvops"+        [ testProperty "sizedBVConcat" $ \(x :: Integer) (y :: Integer) ->+            ioProperty $+              sizedBVConcat (fromInteger x :: IntN 5) (fromInteger y :: IntN 7) @=? fromInteger (x * 128 + y `mod` 128),+          testProperty "sizedBVZext" $ ioProperty . \(x :: Integer) -> sizedBVZext (Proxy :: Proxy 12) (fromInteger x :: IntN 7) @=? fromInteger (x `mod` 128),+          testCase "sizedBVSext" $ do+            sizedBVSext (Proxy :: Proxy 12) (0 :: WordN 8) @=? 0+            sizedBVSext (Proxy :: Proxy 12) (1 :: WordN 8) @=? 1+            sizedBVSext (Proxy :: Proxy 12) (127 :: WordN 8) @=? 127+            sizedBVSext (Proxy :: Proxy 12) (128 :: WordN 8) @=? 3968+            sizedBVSext (Proxy :: Proxy 12) (255 :: WordN 8) @=? 4095,+          testProperty "sizedBVExt is sizedBVSext" $+            ioProperty . \(x :: Integer) ->+              sizedBVExt (Proxy :: Proxy 12) (fromInteger x :: IntN 8) @=? sizedBVSext (Proxy :: Proxy 12) (fromInteger x :: IntN 8),+          testCase "sizedBVSelect" $ do+            sizedBVSelect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b11100 :: IntN 8) @=? 0b11+            sizedBVSelect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b111000 :: IntN 8) @=? 0b111+            sizedBVSelect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b101000 :: IntN 8) @=? 0b101+            sizedBVSelect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b1010000 :: IntN 8) @=? 0b10+        ],+      testGroup+        "Regression"+        [ testCase "division of min bound and minus one for signed bit vector should throw" $ do+            shouldThrow "divMod" $ divMod (minBound :: IntN 8) (-1 :: IntN 8)+            shouldThrow "div" $ div (minBound :: IntN 8) (-1 :: IntN 8)+            shouldThrow "quotRem" $ quotRem (minBound :: IntN 8) (-1 :: IntN 8)+            shouldThrow "quot" $ quot (minBound :: IntN 8) (-1 :: IntN 8)+        ]+    ]
− test/Grisette/IR/SymPrim/Data/BVTests.hs
@@ -1,419 +0,0 @@-{-# LANGUAGE BinaryLiterals #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE NegativeLiterals #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications #-}--module Grisette.IR.SymPrim.Data.BVTests where--import Control.DeepSeq-import Control.Exception-import Control.Monad-import Data.Bifunctor-import Data.Bits-import Data.Int-import Data.Proxy-import Data.Typeable-import Data.Word-import Grisette.Core.Data.Class.BitVector-import Grisette.IR.SymPrim.Data.BV-import Test.Tasty-import Test.Tasty.HUnit-import Test.Tasty.QuickCheck hiding ((.&.))--unaryConform :: forall a b c d. (Show c, Eq c, HasCallStack) => (a -> b) -> (d -> c) -> (a -> c) -> (b -> d) -> a -> Property-unaryConform a2b d2c f g x = ioProperty $ f x @=? d2c (g (a2b x))--binaryConform ::-  forall a b c d e f.-  (Show e, Eq e, HasCallStack) =>-  (a -> b) ->-  (c -> d) ->-  (f -> e) ->-  (a -> c -> e) ->-  (b -> d -> f) ->-  a ->-  c ->-  Property-binaryConform a2b c2d f2e f g x y = ioProperty $ f x y @=? f2e (g (a2b x) (c2d y))--wordUnaryConform :: HasCallStack => (WordN 8 -> WordN 8) -> (Word8 -> Word8) -> Word8 -> Assertion-wordUnaryConform f g x = unWordN (f (fromIntegral x)) @=? toInteger (g x)--wordUnaryNonNegIntConform :: HasCallStack => (Int -> WordN 8) -> (Int -> Word8) -> Int -> Assertion-wordUnaryNonNegIntConform f g y = when (y >= 0) $ unWordN (f y) @=? toInteger (g y)--wordBinIntConform :: HasCallStack => (WordN 8 -> Int -> WordN 8) -> (Word8 -> Int -> Word8) -> Word8 -> Int -> Assertion-wordBinIntConform f g x y = unWordN (f (fromIntegral x) y) @=? toInteger (g x y)--wordBinNonNegIntConform :: HasCallStack => (WordN 8 -> Int -> WordN 8) -> (Word8 -> Int -> Word8) -> Word8 -> Int -> Assertion-wordBinNonNegIntConform f g x y = when (y >= 0) $ unWordN (f (fromIntegral x) y) @=? toInteger (g x y)--wordBinConform :: HasCallStack => (WordN 8 -> WordN 8 -> WordN 8) -> (Word8 -> Word8 -> Word8) -> Word8 -> Word8 -> Assertion-wordBinConform f g x y = unWordN (f (fromIntegral x) (fromIntegral y)) @=? toInteger (g x y)--intN8eqint8 :: IntN 8 -> Int8 -> Assertion-intN8eqint8 (IntN v) i-  | v < 0 = assertFailure "Bad IntN"-  | v <= 127 = v @=? fromIntegral i-  | v == 128 = i @=? -128-  | otherwise = 256 - v @=? fromIntegral (-i)--intUnaryConform :: (IntN 8 -> IntN 8) -> (Int8 -> Int8) -> Int8 -> Assertion-intUnaryConform f g x = intN8eqint8 (f (fromIntegral x)) (g x)--intUnaryNonNegIntConform :: (Int -> IntN 8) -> (Int -> Int8) -> Int -> Assertion-intUnaryNonNegIntConform f g y = when (y >= 0) $ intN8eqint8 (f y) (g y)--intBinIntConform :: (IntN 8 -> Int -> IntN 8) -> (Int8 -> Int -> Int8) -> Int8 -> Int -> Assertion-intBinIntConform f g x y = intN8eqint8 (f (fromIntegral x) y) (g x y)--intBinNonNegIntConform :: (IntN 8 -> Int -> IntN 8) -> (Int8 -> Int -> Int8) -> Int8 -> Int -> Assertion-intBinNonNegIntConform f g x y = when (y >= 0) $ intN8eqint8 (f (fromIntegral x) y) (g x y)--intBinConform :: (IntN 8 -> IntN 8 -> IntN 8) -> (Int8 -> Int8 -> Int8) -> Int8 -> Int8 -> Assertion-intBinConform f g x y = intN8eqint8 (f (fromIntegral x) (fromIntegral y)) (g x y)--finiteBitsConformTest ::-  forall ref typ.-  (Arbitrary ref, Typeable ref, Typeable typ, Show ref, Show typ, Eq ref, Eq typ, FiniteBits ref, FiniteBits typ, Integral ref, Integral typ) =>-  Proxy ref ->-  Proxy typ ->-  Int ->-  TestTree-finiteBitsConformTest pref ptyp numBits =-  testGroup-    (show (typeRep ptyp) ++ " conform to " ++ show (typeRep pref) ++ " for FiniteBits instances")-    [ testCase "finiteBitSize" $ finiteBitSize (0 :: typ) @=? numBits,-      testProperty "countLeadingZeros" $ unaryConform @ref @typ fromIntegral id countLeadingZeros countLeadingZeros,-      testProperty "countTrailingZeros" $ unaryConform @ref @typ fromIntegral id countTrailingZeros countTrailingZeros-    ]--boundedConformTest ::-  forall ref typ.-  (Typeable ref, Typeable typ, Bounded typ, Bounded ref, Integral ref, Num typ, Eq typ, Show typ) =>-  Proxy ref ->-  Proxy typ ->-  TestTree-boundedConformTest pref ptyp =-  testGroup-    (show (typeRep ptyp) ++ " conform to " ++ show (typeRep pref) ++ " for Bounded instances")-    [ testCase "minBound" $ (minBound :: typ) @=? fromIntegral (minBound :: ref),-      testCase "maxBound" $ (maxBound :: typ) @=? fromIntegral (maxBound :: ref)-    ]--shouldThrow :: NFData a => String -> a -> IO ()-shouldThrow name x = do-  errored <- catch (evaluate $ x `deepseq` True) (\(_ :: SomeException) -> return False)-  when errored $ assertFailure $ name ++ " should throw an exception"--succPredLikeTest ::-  forall a b.-  (Arbitrary a, Eq a, Eq b, Show a, Show b, NFData b) =>-  TestName ->-  String ->-  (a -> b) ->-  (a -> a) ->-  (b -> b) ->-  a ->-  b ->-  TestTree-succPredLikeTest name boundName a2b fa fb bounda boundb =-  testGroup-    name-    [ testProperty (name ++ " non " ++ boundName) $-        ioProperty . \(x :: a) ->-          if x == bounda then return () else a2b (fa x) @=? fb (a2b x),-      testCase (name ++ " " ++ boundName) $ shouldThrow (name ++ " " ++ boundName) $ fb boundb-    ]--enumConformTest ::-  forall ref typ.-  ( Arbitrary ref,-    Typeable ref,-    Typeable typ,-    Eq ref,-    Eq typ,-    Show ref,-    Show typ,-    NFData typ,-    Integral ref,-    Integral typ,-    Bounded ref,-    Bounded typ-  ) =>-  Proxy ref ->-  Proxy typ ->-  TestTree-enumConformTest pref ptyp =-  testGroup-    (show (typeRep ptyp) ++ " conform to " ++ show (typeRep pref) ++ " for Enum instances")-    [ succPredLikeTest @ref @typ "succ" "maxBound" fromIntegral succ succ maxBound maxBound,-      succPredLikeTest @ref @typ "pred" "minBound" fromIntegral pred pred minBound minBound,-      testGroup-        "toEnum"-        [ testProperty "toEnum in bounds" $-            ioProperty . \(x :: ref) ->-              toInteger (toEnum (fromIntegral x) :: ref) @=? toInteger (toEnum (fromIntegral x) :: typ),-          testCase "toEnum (fromIntegral minBound - 1)" $-            shouldThrow "toEnum (fromIntegral minBound - 1)" (toEnum (fromIntegral (minBound :: typ) - 1) :: typ),-          testCase "toEnum (fromIntegral maxBound + 1)" $-            shouldThrow "toEnum (fromIntegral maxBound + 1)" (toEnum (fromIntegral (maxBound :: typ) + 1) :: typ)-        ],-      testProperty "fromEnum" $ unaryConform @ref @typ fromIntegral id fromEnum fromEnum,-      testProperty "enumFrom" $ unaryConform @ref @typ fromIntegral (fromIntegral <$>) enumFrom enumFrom,-      testProperty "enumFromThen" $ \(x :: ref) y ->-        ioProperty $ do-          if x == y-            then return ()-            else do-              (fromIntegral <$> enumFromThen x y) @=? enumFromThen (fromIntegral x :: typ) (fromIntegral y),-      testProperty "enumFromTo" $ binaryConform @ref @typ fromIntegral fromIntegral (fromIntegral <$>) enumFromTo enumFromTo,-      testProperty "enumFromThenTo" $ \(x :: ref) y z ->-        ioProperty $-          if x == y-            then return ()-            else (fromIntegral <$> enumFromThenTo x y z) @=? enumFromThenTo (fromIntegral x :: typ) (fromIntegral y) (fromIntegral z)-    ]--divLikeTest ::-  forall a b.-  (Arbitrary a, Eq a, Eq b, Num a, Show a, Bounded a, Bits a, Eq b, Show b, Num b, NFData b, Bounded b, Bits b) =>-  TestName ->-  (a -> b) ->-  (a -> a -> a) ->-  (b -> b -> b) ->-  TestTree-divLikeTest name a2b fa fb =-  if isSigned (0 :: a)-    then-      testGroup-        name-        [ testProperty (name ++ " non zero / minBound vs -1") $ \(x :: a) y -> ioProperty $ do-            if y == 0 || (x == minBound && y == -1) then return () else a2b (fa x y) @=? fb (a2b x) (a2b y),-          testCase (name ++ " zero") $ shouldThrow (name ++ " zero") $ fb 1 0,-          testCase (name ++ " minBound vs -1") $ shouldThrow (name ++ " minBound vs -1") $ fb minBound (-1)-        ]-    else-      testGroup-        name-        [ testProperty (name ++ " non zero") $ \(x :: a) y -> ioProperty $ do-            if y == 0 then return () else a2b (fa x y) @=? fb (a2b x) (a2b y),-          testCase (name ++ " zero") $ shouldThrow (name ++ " zero") $ fb 1 0-        ]--divModLikeTest ::-  forall a b.-  (Arbitrary a, Eq a, Eq b, Num a, Show a, Bounded a, Bits a, Eq b, Show b, Num b, NFData b, Bounded b, Bits b) =>-  TestName ->-  (a -> b) ->-  (a -> a -> (a, a)) ->-  (b -> b -> (b, b)) ->-  TestTree-divModLikeTest name a2b fa fb =-  if isSigned (0 :: a)-    then-      testGroup-        name-        [ testProperty (name ++ " non zero / minBound vs -1") $ \(x :: a) y -> ioProperty $ do-            if y == 0 || (x == minBound && y == -1) then return () else bimap a2b a2b (fa x y) @=? fb (a2b x) (a2b y),-          testCase (name ++ " zero") $ shouldThrow (name ++ " zero") $ fb 1 0,-          testCase (name ++ " minBound vs -1") $ shouldThrow (name ++ " minBound vs -1") $ fb minBound (-1)-        ]-    else-      testGroup-        name-        [ testProperty (name ++ " non zero") $ \(x :: a) y -> ioProperty $ do-            if y == 0 then return () else bimap a2b a2b (fa x y) @=? fb (a2b x) (a2b y),-          testCase (name ++ " zero") $ shouldThrow (name ++ " zero") $ fb 1 0-        ]--realConformTest ::-  forall proxy ref typ.-  (Typeable ref, Typeable typ, Integral ref, Num typ, Arbitrary ref, Real typ, Show ref) =>-  proxy ref ->-  proxy typ ->-  TestTree-realConformTest pref ptyp =-  testGroup-    (show (typeRep ptyp) ++ " conform to " ++ show (typeRep pref) ++ " for Real instances")-    [ testProperty "toRational" $ unaryConform @ref @typ fromIntegral id toRational toRational-    ]--integralConformTest ::-  forall ref typ.-  ( Arbitrary ref,-    Typeable ref,-    Typeable typ,-    Eq ref,-    Eq typ,-    Show ref,-    Show typ,-    Num ref,-    Num typ,-    Integral ref,-    Integral typ,-    Bits ref,-    Bits typ,-    Bounded ref,-    Bounded typ,-    NFData typ-  ) =>-  Proxy ref ->-  Proxy typ ->-  TestTree-integralConformTest pref ptyp =-  testGroup-    (show (typeRep ptyp) ++ " conform to " ++ show (typeRep pref) ++ " for Integral instances")-    [ divLikeTest @ref @typ "quot" fromIntegral quot quot,-      divLikeTest @ref @typ "rem" fromIntegral rem rem,-      divModLikeTest @ref @typ "quotRem" fromIntegral quotRem quotRem,-      divLikeTest @ref @typ "div" fromIntegral div div,-      divLikeTest @ref @typ "mod" fromIntegral mod mod,-      divModLikeTest @ref @typ "divMod" fromIntegral divMod divMod,-      testProperty "toInteger" $ unaryConform @ref @typ fromIntegral id toInteger toInteger-    ]--bvTests :: TestTree-bvTests =-  testGroup-    "BVTests"-    [ testGroup-        "WordN 8 conform to Word8 for Bits instances"-        [ testProperty "(.&.)" $ \x y -> ioProperty $ wordBinConform (.&.) (.&.) x y,-          testProperty "(.|.)" $ \x y -> ioProperty $ wordBinConform (.|.) (.|.) x y,-          testProperty "xor" $ \x y -> ioProperty $ wordBinConform xor xor x y,-          testProperty "complement" $ ioProperty . wordUnaryConform complement complement,-          testProperty "shift" $ \x y -> ioProperty $ wordBinIntConform shift shift x y,-          testProperty "rotate" $ \x y -> ioProperty $ wordBinIntConform rotate rotate x y,-          testCase "zeroBits" $ (zeroBits :: WordN 8) @=? 0,-          testProperty "bit" $ ioProperty . wordUnaryNonNegIntConform bit bit,-          testProperty "setBit" $ \x y -> ioProperty $ wordBinNonNegIntConform setBit setBit x y,-          testProperty "clearBit" $ \x y -> ioProperty $ wordBinNonNegIntConform clearBit clearBit x y,-          testProperty "complementBit" $ \x y -> ioProperty $ wordBinNonNegIntConform complementBit complementBit x y,-          testProperty "testBit" $ \(x :: Word8) i -> i < 0 || testBit x i == testBit (fromIntegral x :: WordN 8) i,-          testCase "bitSizeMaybe" $ bitSizeMaybe (0 :: WordN 8) @=? Just 8,-          testCase "isSigned" $ isSigned (0 :: WordN 8) @=? False,-          testProperty "shiftL" $ \x y -> ioProperty $ wordBinNonNegIntConform shiftL shiftL x y,-          testProperty "shiftR" $ \x y -> ioProperty $ wordBinNonNegIntConform shiftR shiftR x y,-          testProperty "rotateL" $ \x y -> ioProperty $ wordBinNonNegIntConform rotateL rotateL x y,-          testProperty "rotateR" $ \x y -> ioProperty $ wordBinNonNegIntConform rotateR rotateR x y,-          testProperty "popCount" $ ioProperty . \(x :: Word8) -> popCount x @=? popCount (fromIntegral x :: WordN 8)-        ],-      finiteBitsConformTest (Proxy @Word8) (Proxy @(WordN 8)) 8,-      boundedConformTest (Proxy @Word8) (Proxy @(WordN 8)),-      enumConformTest (Proxy @Word8) (Proxy @(WordN 8)),-      realConformTest (Proxy @Word8) (Proxy @(WordN 8)),-      integralConformTest (Proxy @Word8) (Proxy @(WordN 8)),-      testGroup-        "WordN 8 conform to Word8 for Num instances"-        [ testProperty "(+)" $ \x y -> ioProperty $ wordBinConform (+) (+) x y,-          testProperty "(*)" $ \x y -> ioProperty $ wordBinConform (*) (*) x y,-          testProperty "(-)" $ \x y -> ioProperty $ wordBinConform (-) (-) x y,-          testProperty "negate" $ ioProperty . wordUnaryConform negate negate,-          testProperty "abs" $ ioProperty . wordUnaryConform abs abs,-          testProperty "signum" $ ioProperty . wordUnaryConform signum signum,-          testProperty "fromInteger" $-            ioProperty . \(x :: Integer) ->-              unWordN (fromInteger x :: WordN 8) @=? toInteger (fromInteger x :: Word8)-        ],-      testGroup-        "WordN 8 conform to Word8 for Ord instances"-        [ testProperty "(<=)" $ \(x :: Word8) y -> ioProperty $ x <= y @=? (fromIntegral x :: WordN 8) <= (fromIntegral y :: WordN 8)-        ],-      testGroup-        "IntN 8 conform to Int8 for Bits instances"-        [ testProperty "(.&.)" $ \x y -> ioProperty $ intBinConform (.&.) (.&.) x y,-          testProperty "(.|.)" $ \x y -> ioProperty $ intBinConform (.|.) (.|.) x y,-          testProperty "xor" $ \x y -> ioProperty $ intBinConform xor xor x y,-          testProperty "complement" $ ioProperty . intUnaryConform complement complement,-          testProperty "shift" $ \x y -> ioProperty $ intBinIntConform shift shift x y,-          testProperty "rotate" $ \x y -> ioProperty $ intBinIntConform rotate rotate x y,-          testCase "zeroBits" $ (zeroBits :: IntN 8) @=? 0,-          testProperty "bit" $ ioProperty . intUnaryNonNegIntConform bit bit,-          testProperty "setBit" $ \x y -> ioProperty $ intBinNonNegIntConform setBit setBit x y,-          testProperty "clearBit" $ \x y -> ioProperty $ intBinNonNegIntConform clearBit clearBit x y,-          testProperty "complementBit" $ \x y -> ioProperty $ intBinNonNegIntConform complementBit complementBit x y,-          testProperty "testBit" $ \(x :: Int8) i -> i < 0 || testBit x i == testBit (fromIntegral x :: IntN 8) i,-          testCase "bitSizeMaybe" $ bitSizeMaybe (0 :: IntN 8) @=? Just 8,-          testCase "isSigned" $ isSigned (0 :: IntN 8) @=? True,-          testProperty "shiftL" $ \x y -> ioProperty $ intBinNonNegIntConform shiftL shiftL x y,-          testProperty "shiftR" $ \x y -> ioProperty $ intBinNonNegIntConform shiftR shiftR x y,-          testProperty "rotateL" $ \x y -> ioProperty $ intBinNonNegIntConform rotateL rotateL x y,-          testProperty "rotateR" $ \x y -> ioProperty $ intBinNonNegIntConform rotateR rotateR x y,-          testProperty "popCount" $ ioProperty . \(x :: Int8) -> popCount x @=? popCount (fromIntegral x :: IntN 8)-        ],-      finiteBitsConformTest (Proxy @Int8) (Proxy @(IntN 8)) 8,-      boundedConformTest (Proxy @Int8) (Proxy @(IntN 8)),-      enumConformTest (Proxy @Int8) (Proxy @(IntN 8)),-      realConformTest (Proxy @Int8) (Proxy @(IntN 8)),-      integralConformTest (Proxy @Int8) (Proxy @(IntN 8)),-      testGroup-        "IntN 8 conform to Int8 for Num instances"-        [ testProperty "(+)" $ \x y -> ioProperty $ intBinConform (+) (+) x y,-          testProperty "(*)" $ \x y -> ioProperty $ intBinConform (*) (*) x y,-          testProperty "(-)" $ \x y -> ioProperty $ intBinConform (-) (-) x y,-          testProperty "negate" $ ioProperty . wordUnaryConform negate negate,-          testProperty "abs" $ ioProperty . wordUnaryConform abs abs,-          testProperty "signum" $ ioProperty . wordUnaryConform signum signum,-          testProperty "fromInteger" $-            ioProperty . \(x :: Integer) ->-              intN8eqint8 (fromInteger x :: IntN 8) (fromInteger x :: Int8)-        ],-      testGroup-        "IntN 8 conform to IntN for Ord instances"-        [ testProperty "(<=)" $ \(x :: Int8) y -> ioProperty $ (fromIntegral x :: IntN 8) <= (fromIntegral y :: IntN 8) @=? x <= y-        ],-      testGroup-        "WordN bvops"-        [ testProperty "bvconcat" $ \(x :: Integer) (y :: Integer) ->-            ioProperty $-              bvconcat (fromInteger x :: WordN 5) (fromInteger y :: WordN 7) @=? fromInteger (x * 128 + y `mod` 128),-          testProperty "bvzeroExtend" $ ioProperty . \(x :: Integer) -> bvzeroExtend (Proxy :: Proxy 12) (fromInteger x :: WordN 7) @=? fromInteger (x `mod` 128),-          testCase "bvsignExtend" $ do-            bvsignExtend (Proxy :: Proxy 12) (0 :: WordN 8) @=? 0-            bvsignExtend (Proxy :: Proxy 12) (1 :: WordN 8) @=? 1-            bvsignExtend (Proxy :: Proxy 12) (127 :: WordN 8) @=? 127-            bvsignExtend (Proxy :: Proxy 12) (128 :: WordN 8) @=? 3968-            bvsignExtend (Proxy :: Proxy 12) (255 :: WordN 8) @=? 4095,-          testProperty "bvextend is bvzeroExtend" $-            ioProperty . \(x :: Integer) ->-              bvextend (Proxy :: Proxy 12) (fromInteger x :: WordN 8) @=? bvzeroExtend (Proxy :: Proxy 12) (fromInteger x :: WordN 8),-          testCase "bvselect" $ do-            bvselect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b11100 :: WordN 8) @=? 0b11-            bvselect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b111000 :: WordN 8) @=? 0b111-            bvselect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b101000 :: WordN 8) @=? 0b101-            bvselect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b1010000 :: WordN 8) @=? 0b10-        ],-      testGroup-        "IntN bvops"-        [ testProperty "bvconcat" $ \(x :: Integer) (y :: Integer) ->-            ioProperty $-              bvconcat (fromInteger x :: IntN 5) (fromInteger y :: IntN 7) @=? fromInteger (x * 128 + y `mod` 128),-          testProperty "bvzeroExtend" $ ioProperty . \(x :: Integer) -> bvzeroExtend (Proxy :: Proxy 12) (fromInteger x :: IntN 7) @=? fromInteger (x `mod` 128),-          testCase "bvsignExtend" $ do-            bvsignExtend (Proxy :: Proxy 12) (0 :: WordN 8) @=? 0-            bvsignExtend (Proxy :: Proxy 12) (1 :: WordN 8) @=? 1-            bvsignExtend (Proxy :: Proxy 12) (127 :: WordN 8) @=? 127-            bvsignExtend (Proxy :: Proxy 12) (128 :: WordN 8) @=? 3968-            bvsignExtend (Proxy :: Proxy 12) (255 :: WordN 8) @=? 4095,-          testProperty "bvextend is bvsignExtend" $-            ioProperty . \(x :: Integer) ->-              bvextend (Proxy :: Proxy 12) (fromInteger x :: IntN 8) @=? bvsignExtend (Proxy :: Proxy 12) (fromInteger x :: IntN 8),-          testCase "bvselect" $ do-            bvselect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b11100 :: IntN 8) @=? 0b11-            bvselect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b111000 :: IntN 8) @=? 0b111-            bvselect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b101000 :: IntN 8) @=? 0b101-            bvselect (Proxy :: Proxy 3) (Proxy :: Proxy 3) (0b1010000 :: IntN 8) @=? 0b10-        ],-      testGroup-        "Regression"-        [ testCase "division of min bound and minus one for signed bit vector should throw" $ do-            shouldThrow "divMod" $ divMod (minBound :: IntN 8) (-1 :: IntN 8)-            shouldThrow "div" $ div (minBound :: IntN 8) (-1 :: IntN 8)-            shouldThrow "mod" $ mod (minBound :: IntN 8) (-1 :: IntN 8)-            shouldThrow "quotRem" $ quotRem (minBound :: IntN 8) (-1 :: IntN 8)-            shouldThrow "quot" $ quot (minBound :: IntN 8) (-1 :: IntN 8)-            shouldThrow "rem" $ rem (minBound :: IntN 8) (-1 :: IntN 8)-        ]-    ]
test/Grisette/IR/SymPrim/Data/Prim/BVTests.hs view
@@ -6,7 +6,7 @@ module Grisette.IR.SymPrim.Data.Prim.BVTests where  import Data.Proxy-import Grisette.IR.SymPrim.Data.BV+import Grisette.Core.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import Grisette.IR.SymPrim.Data.Prim.PartialEval.BV
test/Grisette/IR/SymPrim/Data/Prim/BitsTests.hs view
@@ -3,7 +3,7 @@  module Grisette.IR.SymPrim.Data.Prim.BitsTests where -import Grisette.IR.SymPrim.Data.BV+import Grisette.Core.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bits
test/Grisette/IR/SymPrim/Data/Prim/BoolTests.hs view
@@ -4,7 +4,7 @@  module Grisette.IR.SymPrim.Data.Prim.BoolTests where -import Grisette.IR.SymPrim.Data.BV+import Grisette.Core.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool
− test/Grisette/IR/SymPrim/Data/Prim/IntegerTests.hs
@@ -1,48 +0,0 @@-{-# LANGUAGE ScopedTypeVariables #-}--module Grisette.IR.SymPrim.Data.Prim.IntegerTests where--import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer-import Test.Tasty-import Test.Tasty.HUnit-import Test.Tasty.QuickCheck--integerTests :: TestTree-integerTests =-  testGroup-    "IntegerTests"-    [ testGroup-        "DivI"-        [ testProperty "On concrete" $-            ioProperty . \(i :: Integer, j :: Integer) -> do-              if j /= 0-                then pevalDivIntegerTerm (conTerm i) (conTerm j) @=? conTerm (i `div` j)-                else-                  pevalDivIntegerTerm (conTerm i) (conTerm j)-                    @=? divIntegerTerm (conTerm i) (conTerm j),-          testCase "divide by 1" $ do-            pevalDivIntegerTerm (ssymTerm "a" :: Term Integer) (conTerm 1) @=? ssymTerm "a",-          testCase "On symbolic" $ do-            pevalDivIntegerTerm (ssymTerm "a" :: Term Integer) (ssymTerm "b")-              @=? divIntegerTerm (ssymTerm "a" :: Term Integer) (ssymTerm "b" :: Term Integer)-        ],-      testGroup-        "ModI"-        [ testProperty "On concrete" $-            ioProperty . \(i :: Integer, j :: Integer) -> do-              if j /= 0-                then pevalModIntegerTerm (conTerm i) (conTerm j) @=? conTerm (i `mod` j)-                else-                  pevalModIntegerTerm (conTerm i) (conTerm j)-                    @=? modIntegerTerm (conTerm i) (conTerm j),-          testCase "mod by 1" $ do-            pevalModIntegerTerm (ssymTerm "a" :: Term Integer) (conTerm 1) @=? conTerm 0,-          testCase "mod by -1" $ do-            pevalModIntegerTerm (ssymTerm "a" :: Term Integer) (conTerm $ -1) @=? conTerm 0,-          testCase "On symbolic" $ do-            pevalModIntegerTerm (ssymTerm "a" :: Term Integer) (ssymTerm "b")-              @=? modIntegerTerm (ssymTerm "a" :: Term Integer) (ssymTerm "b" :: Term Integer)-        ]-    ]
+ test/Grisette/IR/SymPrim/Data/Prim/IntegralTests.hs view
@@ -0,0 +1,170 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}++module Grisette.IR.SymPrim.Data.Prim.IntegralTests where++import Control.DeepSeq+import Control.Exception+import Data.Proxy+import Grisette.Core.Data.BV+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral+import Test.Tasty+import Test.Tasty.HUnit+import Test.Tasty.QuickCheck++newtype AEWrapper = AEWrapper ArithException deriving (Eq)++instance Show AEWrapper where+  show (AEWrapper x) = show x++instance NFData AEWrapper where+  rnf (AEWrapper x) = x `seq` ()++sameDivPeval ::+  forall t.+  (Num t, Eq t, SupportedPrim t, Integral t) =>+  t ->+  t ->+  (Term t -> Term t -> Term t) ->+  (t -> t -> t) ->+  (Term t -> Term t -> Term t) ->+  IO ()+sameDivPeval i j pf cf consf = do+  cx <- evaluate (force $ Right $ cf i j) `catch` \(e :: ArithException) -> return $ Left AEWrapper+  case cx of+    Left f -> pf (conTerm i) (conTerm j) @=? consf (conTerm i) (conTerm j)+    Right t -> pf (conTerm i) (conTerm j) @=? conTerm t++divisionPevalBoundedTests ::+  forall p t0 t.+  (Num t, Eq t, Arbitrary t0, Show t0, Bounded t, SupportedPrim t, Integral t) =>+  p t ->+  TestName ->+  (t0 -> t) ->+  (Term t -> Term t -> Term t) ->+  (t -> t -> t) ->+  (Term t -> Term t -> Term t) ->+  TestTree+divisionPevalBoundedTests _ name transform pf cf consf =+  testGroup+    name+    [ testCase "On concrete min divide by -1" $+        sameDivPeval minBound (-1) pf cf consf+    ]++divisionPevalTests ::+  forall p t0 t.+  (Num t, Eq t, Arbitrary t0, Show t0, SupportedPrim t, Integral t) =>+  p t ->+  TestName ->+  (t0 -> t) ->+  (Term t -> Term t -> Term t) ->+  (t -> t -> t) ->+  (Term t -> Term t -> Term t) ->+  TestTree+divisionPevalTests p name transform pf cf consf =+  testGroup+    name+    [ testProperty "On concrete prop" $+        ioProperty . \(i0 :: t0, j0 :: t0) -> do+          let i = transform i0+          let j = transform j0+          sameDivPeval i j pf cf consf,+      testProperty "On concrete divide by 0" $+        ioProperty . \(i0 :: t0) -> do+          let i = transform i0+          sameDivPeval i 0 pf cf consf,+      testCase "divide by 1" $ do+        pf (ssymTerm "a" :: Term t) (conTerm 1) @=? ssymTerm "a",+      testCase "On symbolic" $ do+        pf (ssymTerm "a" :: Term t) (ssymTerm "b")+          @=? consf (ssymTerm "a" :: Term t) (ssymTerm "b" :: Term t)+    ]++divisionPevalBoundedTestGroup ::+  TestName ->+  (forall t. (SupportedPrim t, Bounded t, Integral t) => Term t -> Term t -> Term t) ->+  (forall t. (Bounded t, Integral t) => t -> t -> t) ->+  (forall t. (SupportedPrim t, Bounded t, Integral t) => Term t -> Term t -> Term t) ->+  TestTree+divisionPevalBoundedTestGroup name pf cf consf =+  testGroup+    name+    [ divisionPevalTests (Proxy @(IntN 4)) "IntN" IntN pf cf consf,+      divisionPevalBoundedTests (Proxy @(IntN 4)) "IntN Bounded" IntN pf cf consf+    ]++divisionPevalUnboundedTestGroup ::+  TestName ->+  (forall t. (SupportedPrim t, Integral t) => Term t -> Term t -> Term t) ->+  (forall t. (Integral t) => t -> t -> t) ->+  (forall t. (SupportedPrim t, Integral t) => Term t -> Term t -> Term t) ->+  TestTree+divisionPevalUnboundedTestGroup name pf cf consf =+  testGroup+    name+    [ divisionPevalTests (Proxy @Integer) "Integer" id pf cf consf,+      divisionPevalTests (Proxy @(WordN 4)) "WordN" WordN pf cf consf,+      divisionPevalBoundedTests (Proxy @(WordN 4)) "WordN Bounded" WordN pf cf consf+    ]++moduloPevalTests ::+  forall p t0 t.+  (Num t, Eq t, Arbitrary t0, Show t0, SupportedPrim t, Integral t) =>+  p t ->+  TestName ->+  (t0 -> t) ->+  (Term t -> Term t -> Term t) ->+  (t -> t -> t) ->+  (Term t -> Term t -> Term t) ->+  TestTree+moduloPevalTests p name transform pf cf consf =+  testGroup+    name+    [ testProperty "On concrete" $+        ioProperty . \(i0 :: t0, j0 :: t0) -> do+          let i = transform i0+          let j = transform j0+          sameDivPeval i j pf cf consf,+      testProperty "On concrete divide by 0" $+        ioProperty . \(i0 :: t0) -> do+          let i = transform i0+          sameDivPeval i 0 pf cf consf,+      testCase "mod by 1" $ do+        pf (ssymTerm "a" :: Term t) (conTerm 1) @=? conTerm 0,+      testCase "mod by -1" $ do+        pf (ssymTerm "a" :: Term t) (conTerm $ -1) @=? conTerm 0,+      testCase "On symbolic" $ do+        pf (ssymTerm "a" :: Term t) (ssymTerm "b")+          @=? consf (ssymTerm "a" :: Term t) (ssymTerm "b" :: Term t)+    ]++moduloPevalTestGroup ::+  TestName ->+  (forall t. (SupportedPrim t, Integral t) => Term t -> Term t -> Term t) ->+  (forall t. (Integral t) => t -> t -> t) ->+  (forall t. (SupportedPrim t, Integral t) => Term t -> Term t -> Term t) ->+  TestTree+moduloPevalTestGroup name pf cf consf =+  testGroup+    name+    [ moduloPevalTests (Proxy @Integer) "Integer" id pf cf consf,+      moduloPevalTests (Proxy @(IntN 4)) "IntN" IntN pf cf consf,+      moduloPevalTests (Proxy @(WordN 4)) "WordN" WordN pf cf consf+    ]++integralTests :: TestTree+integralTests =+  testGroup+    "IntegralTests"+    [ divisionPevalUnboundedTestGroup "Div unbounded" pevalDivIntegralTerm div divIntegralTerm,+      divisionPevalUnboundedTestGroup "Quot unbounded" pevalQuotIntegralTerm quot quotIntegralTerm,+      divisionPevalBoundedTestGroup "Div bounded" pevalDivBoundedIntegralTerm div divBoundedIntegralTerm,+      divisionPevalBoundedTestGroup "Quot bounded" pevalQuotBoundedIntegralTerm quot quotBoundedIntegralTerm,+      moduloPevalTestGroup "Mod" pevalModIntegralTerm mod modIntegralTerm,+      moduloPevalTestGroup "Rem" pevalRemIntegralTerm rem remIntegralTerm+    ]
test/Grisette/IR/SymPrim/Data/Prim/ModelTests.hs view
@@ -5,8 +5,8 @@  import Data.HashMap.Strict as M import qualified Data.HashSet as S+import Grisette.Core.Data.BV import Grisette.Core.Data.Class.ModelOps-import Grisette.IR.SymPrim.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import Grisette.IR.SymPrim.Data.Prim.Model as Model
test/Grisette/IR/SymPrim/Data/Prim/NumTests.hs view
@@ -3,7 +3,7 @@  module Grisette.IR.SymPrim.Data.Prim.NumTests where -import Grisette.IR.SymPrim.Data.BV+import Grisette.Core.Data.BV import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool
test/Grisette/IR/SymPrim/Data/SymPrimTests.hs view
@@ -1,543 +1,1049 @@ {-# LANGUAGE DataKinds #-}-{-# LANGUAGE NegativeLiterals #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeOperators #-}-{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}--module Grisette.IR.SymPrim.Data.SymPrimTests where--import Control.Monad.Except-import Data.Bits-import qualified Data.HashMap.Strict as M-import qualified Data.HashSet as S-import Data.Int-import Data.Proxy-import Data.Word-import Grisette.Core.Control.Monad.UnionM-import Grisette.Core.Data.Class.BitVector-import Grisette.Core.Data.Class.Bool-import Grisette.Core.Data.Class.Evaluate-import Grisette.Core.Data.Class.ExtractSymbolics-import Grisette.Core.Data.Class.Function-import Grisette.Core.Data.Class.GenSym-import Grisette.Core.Data.Class.Integer-import Grisette.Core.Data.Class.Mergeable-import Grisette.Core.Data.Class.ModelOps-import Grisette.Core.Data.Class.SOrd-import Grisette.Core.Data.Class.SimpleMergeable-import Grisette.Core.Data.Class.Solvable-import Grisette.Core.Data.Class.ToCon-import Grisette.Core.Data.Class.ToSym-import Grisette.IR.SymPrim.Data.BV-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors-import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term-import Grisette.IR.SymPrim.Data.Prim.Model-import Grisette.IR.SymPrim.Data.Prim.ModelValue-import Grisette.IR.SymPrim.Data.Prim.PartialEval.BV-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bits-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer-import Grisette.IR.SymPrim.Data.Prim.PartialEval.Num-import Grisette.IR.SymPrim.Data.Prim.PartialEval.TabularFun-import Grisette.IR.SymPrim.Data.SymPrim-import Grisette.IR.SymPrim.Data.TabularFun-import Test.Tasty-import Test.Tasty.HUnit-import Test.Tasty.QuickCheck hiding ((.&.))-import Type.Reflection hiding (Con)--symPrimTests :: TestTree-symPrimTests =-  testGroup-    "SymPrimTests"-    [ testGroup-        "General SymPrim"-        [ testGroup-            "Solvable"-            [ testCase "con" $ do-                (con 1 :: Sym Integer) @=? Sym (conTerm 1),-              testCase "ssym" $ do-                (ssym "a" :: Sym Integer) @=? Sym (ssymTerm "a"),-              testCase "isym" $ do-                (isym "a" 1 :: Sym Integer) @=? Sym (isymTerm "a" 1),-              testCase "conView" $ do-                conView (con 1 :: Sym Integer) @=? Just 1-                conView (ssym "a" :: Sym Integer) @=? Nothing-                case con 1 :: Sym Integer of-                  Con 1 -> return ()-                  _ -> assertFailure "Bad match"-                case ssym "a" :: Sym Integer of-                  Con _ -> assertFailure "Bad match"-                  _ -> return ()-            ],-          testGroup-            "ITEOp"-            [ testCase "ites" $-                ites (ssym "a" :: Sym Bool) (ssym "b" :: Sym Integer) (ssym "c")-                  @=? Sym (pevalITETerm (ssymTerm "a") (ssymTerm "b") (ssymTerm "c"))-            ],-          testCase "Mergeable" $ do-            let SimpleStrategy s = rootStrategy :: MergingStrategy (Sym Integer)-            s (ssym "a") (ssym "b") (ssym "c")-              @=? ites (ssym "a" :: Sym Bool) (ssym "b" :: Sym Integer) (ssym "c"),-          testCase "SimpleMergeable" $ do-            mrgIte (ssym "a" :: Sym Bool) (ssym "b") (ssym "c")-              @=? ites (ssym "a" :: Sym Bool) (ssym "b" :: Sym Integer) (ssym "c"),-          testCase "IsString" $ do-            ("a" :: Sym Bool) @=? Sym (ssymTerm "a"),-          testGroup-            "ToSym"-            [ testCase "From self" $ do-                toSym (ssym "a" :: Sym Bool) @=? (ssym "a" :: Sym Bool),-              testCase "From concrete" $ do-                toSym True @=? (con True :: Sym Bool)-            ],-          testGroup-            "ToCon"-            [ testCase "To self" $ do-                toCon (ssym "a" :: Sym Bool) @=? (Nothing :: Maybe Bool),-              testCase "To concrete" $ do-                toCon True @=? Just True-            ],-          testCase "EvaluateSym" $ do-            let m1 = emptyModel :: Model-            let m2 = insertValue (SimpleSymbol "a") (1 :: Integer) m1-            let m3 = insertValue (SimpleSymbol "b") True m2-            evaluateSym False m3 (ites ("c" :: Sym Bool) "a" ("a" + "a" :: Sym Integer))-              @=? ites ("c" :: Sym Bool) 1 2-            evaluateSym True m3 (ites ("c" :: Sym Bool) "a" ("a" + "a" :: Sym Integer)) @=? 2,-          testCase "ExtractSymbolics" $ do-            extractSymbolics (ites ("c" :: Sym Bool) ("a" :: Sym Integer) ("b" :: Sym Integer))-              @=? SymbolSet-                ( S.fromList-                    [ someTypedSymbol (SimpleSymbol "c" :: TypedSymbol Bool),-                      someTypedSymbol (SimpleSymbol "a" :: TypedSymbol Integer),-                      someTypedSymbol (SimpleSymbol "b" :: TypedSymbol Integer)-                    ]-                ),-          testCase "GenSym" $ do-            (genSym () "a" :: UnionM (Sym Bool)) @=? mrgSingle (isym "a" 0)-            (genSymSimple () "a" :: Sym Bool) @=? isym "a" 0-            (genSym (ssym "a" :: Sym Bool) "a" :: UnionM (Sym Bool)) @=? mrgSingle (isym "a" 0)-            (genSymSimple (ssym "a" :: Sym Bool) "a" :: Sym Bool) @=? isym "a" 0-            (genSym () (nameWithInfo "a" True) :: UnionM (Sym Bool)) @=? mrgSingle (iinfosym "a" 0 True)-            (genSymSimple () (nameWithInfo "a" True) :: Sym Bool) @=? iinfosym "a" 0 True,-          testCase "SEq" $ do-            (ssym "a" :: Sym Bool) ==~ ssym "b" @=? Sym (pevalEqvTerm (ssymTerm "a" :: Term Bool) (ssymTerm "b"))-            (ssym "a" :: Sym Bool) /=~ ssym "b" @=? Sym (pevalNotTerm $ pevalEqvTerm (ssymTerm "a" :: Term Bool) (ssymTerm "b"))-        ],-      testGroup-        "Sym Bool"-        [ testGroup-            "LogicalOp"-            [ testCase "||~" $ do-                ssym "a" ||~ ssym "b" @=? Sym (pevalOrTerm (ssymTerm "a") (ssymTerm "b")),-              testCase "&&~" $ do-                ssym "a" &&~ ssym "b" @=? Sym (pevalAndTerm (ssymTerm "a") (ssymTerm "b")),-              testCase "nots" $ do-                nots (ssym "a") @=? Sym (pevalNotTerm (ssymTerm "a")),-              testCase "xors" $ do-                xors (ssym "a") (ssym "b") @=? Sym (pevalXorTerm (ssymTerm "a") (ssymTerm "b")),-              testCase "implies" $ do-                implies (ssym "a") (ssym "b") @=? Sym (pevalImplyTerm (ssymTerm "a") (ssymTerm "b"))-            ]-        ],-      testGroup-        "Sym Integer"-        [ testGroup-            "Num"-            [ testCase "fromInteger" $ do-                (1 :: Sym Integer) @=? Sym (conTerm 1),-              testCase "(+)" $ do-                (ssym "a" :: Sym Integer) + ssym "b" @=? Sym (pevalAddNumTerm (ssymTerm "a") (ssymTerm "b")),-              testCase "(-)" $ do-                (ssym "a" :: Sym Integer) - ssym "b" @=? Sym (pevalMinusNumTerm (ssymTerm "a") (ssymTerm "b")),-              testCase "(*)" $ do-                (ssym "a" :: Sym Integer) * ssym "b" @=? Sym (pevalTimesNumTerm (ssymTerm "a") (ssymTerm "b")),-              testCase "negate" $ do-                negate (ssym "a" :: Sym Integer) @=? Sym (pevalUMinusNumTerm (ssymTerm "a")),-              testCase "abs" $ do-                abs (ssym "a" :: Sym Integer) @=? Sym (pevalAbsNumTerm (ssymTerm "a")),-              testCase "signum" $ do-                signum (ssym "a" :: Sym Integer) @=? Sym (pevalSignumNumTerm (ssymTerm "a"))-            ],-          testGroup-            "SignedDivMod"-            [ testProperty "divs on concrete" $ \(i :: Integer, j :: Integer) ->-                ioProperty $-                  divs (con i :: Sym Integer) (con j)-                    @=? if j == 0-                      then merge $ throwError () :: ExceptT () UnionM SymInteger-                      else mrgSingle $ con $ i `div` j,-              testCase "divs when divided by zero" $ do-                divs (ssym "a" :: Sym Integer) (con 0)-                  @=? (merge $ throwError () :: ExceptT () UnionM SymInteger),-              testCase "divs on symbolic" $ do-                divs (ssym "a" :: Sym Integer) (ssym "b")-                  @=? ( mrgIf-                          ((ssym "b" :: Sym Integer) ==~ con (0 :: Integer) :: SymBool)-                          (throwError ())-                          (mrgSingle $ Sym $ pevalDivIntegerTerm (ssymTerm "a") (ssymTerm "b")) ::-                          ExceptT () UnionM SymInteger-                      ),-              testProperty "mods on concrete" $ \(i :: Integer, j :: Integer) ->-                ioProperty $-                  mods (con i :: Sym Integer) (con j)-                    @=? if j == 0-                      then merge $ throwError () :: ExceptT () UnionM SymInteger-                      else mrgSingle $ con $ i `mod` j,-              testCase "mods when divided by zero" $ do-                mods (ssym "a" :: Sym Integer) (con 0)-                  @=? (merge $ throwError () :: ExceptT () UnionM SymInteger),-              testCase "mods on symbolic" $ do-                mods (ssym "a" :: Sym Integer) (ssym "b")-                  @=? ( mrgIf-                          ((ssym "b" :: Sym Integer) ==~ con (0 :: Integer) :: SymBool)-                          (throwError ())-                          (mrgSingle $ Sym $ pevalModIntegerTerm (ssymTerm "a") (ssymTerm "b")) ::-                          ExceptT () UnionM SymInteger-                      )-            ],-          testGroup-            "SOrd"-            [ testProperty "SOrd on concrete" $ \(i :: Integer, j :: Integer) -> ioProperty $ do-                (con i :: Sym Integer) <=~ con j @=? (con (i <= j) :: SymBool)-                (con i :: Sym Integer) <~ con j @=? (con (i < j) :: SymBool)-                (con i :: Sym Integer) >=~ con j @=? (con (i >= j) :: SymBool)-                (con i :: Sym Integer) >~ con j @=? (con (i > j) :: SymBool)-                (con i :: Sym Integer)-                  `symCompare` con j-                  @=? (i `symCompare` j :: UnionM Ordering),-              testCase "SOrd on symbolic" $ do-                let a :: Sym Integer = ssym "a"-                let b :: Sym Integer = ssym "b"-                let at :: Term Integer = ssymTerm "a"-                let bt :: Term Integer = ssymTerm "b"-                a <=~ b @=? Sym (pevalLeNumTerm at bt)-                a <~ b @=? Sym (pevalLtNumTerm at bt)-                a >=~ b @=? Sym (pevalGeNumTerm at bt)-                a >~ b @=? Sym (pevalGtNumTerm at bt)-                (a `symCompare` ssym "b" :: UnionM Ordering)-                  @=? mrgIf (a <~ b) (mrgSingle LT) (mrgIf (a ==~ b) (mrgSingle EQ) (mrgSingle GT))-            ]-        ],-      let au :: Sym (WordN 4) = ssym "a"-          bu :: Sym (WordN 4) = ssym "b"-          as :: Sym (IntN 4) = ssym "a"-          bs :: Sym (IntN 4) = ssym "b"-          aut :: Term (WordN 4) = ssymTerm "a"-          but :: Term (WordN 4) = ssymTerm "b"-          ast :: Term (IntN 4) = ssymTerm "a"-          bst :: Term (IntN 4) = ssymTerm "b"-       in testGroup-            "Sym BV"-            [ testGroup-                "Num"-                [ testCase "fromInteger" $ do-                    (1 :: Sym (WordN 4)) @=? Sym (conTerm 1)-                    (1 :: Sym (IntN 4)) @=? Sym (conTerm 1),-                  testCase "(+)" $ do-                    au + bu @=? Sym (pevalAddNumTerm aut but)-                    as + bs @=? Sym (pevalAddNumTerm ast bst),-                  testCase "(-)" $ do-                    au - bu @=? Sym (pevalMinusNumTerm aut but)-                    as - bs @=? Sym (pevalMinusNumTerm ast bst),-                  testCase "(*)" $ do-                    au * bu @=? Sym (pevalTimesNumTerm aut but)-                    as * bs @=? Sym (pevalTimesNumTerm ast bst),-                  testCase "negate" $ do-                    negate au @=? Sym (pevalUMinusNumTerm aut)-                    negate as @=? Sym (pevalUMinusNumTerm ast),-                  testCase "abs" $ do-                    abs au @=? Sym (pevalAbsNumTerm aut)-                    abs as @=? Sym (pevalAbsNumTerm ast),-                  testCase "signum" $ do-                    signum au @=? Sym (pevalSignumNumTerm aut)-                    signum as @=? Sym (pevalSignumNumTerm ast)-                ],-              testGroup-                "SOrd"-                [ testProperty "SOrd on concrete" $ \(i :: Integer, j :: Integer) -> ioProperty $ do-                    let iu :: WordN 4 = fromInteger i-                    let ju :: WordN 4 = fromInteger j-                    let is :: IntN 4 = fromInteger i-                    let js :: IntN 4 = fromInteger j-                    let normalizeu k = k - k `div` 16 * 16-                    let normalizes k = if normalizeu k >= 8 then normalizeu k - 16 else normalizeu k-                    (con iu :: Sym (WordN 4)) <=~ con ju @=? (con (normalizeu i <= normalizeu j) :: SymBool)-                    (con iu :: Sym (WordN 4)) <~ con ju @=? (con (normalizeu i < normalizeu j) :: SymBool)-                    (con iu :: Sym (WordN 4)) >=~ con ju @=? (con (normalizeu i >= normalizeu j) :: SymBool)-                    (con iu :: Sym (WordN 4)) >~ con ju @=? (con (normalizeu i > normalizeu j) :: SymBool)-                    (con iu :: Sym (WordN 4))-                      `symCompare` con ju-                      @=? (normalizeu i `symCompare` normalizeu j :: UnionM Ordering)-                    (con is :: Sym (IntN 4)) <=~ con js @=? (con (normalizes i <= normalizes j) :: SymBool)-                    (con is :: Sym (IntN 4)) <~ con js @=? (con (normalizes i < normalizes j) :: SymBool)-                    (con is :: Sym (IntN 4)) >=~ con js @=? (con (normalizes i >= normalizes j) :: SymBool)-                    (con is :: Sym (IntN 4)) >~ con js @=? (con (normalizes i > normalizes j) :: SymBool)-                    (con is :: Sym (IntN 4))-                      `symCompare` con js-                      @=? (normalizes i `symCompare` normalizes j :: UnionM Ordering),-                  testCase "SOrd on symbolic" $ do-                    au <=~ bu @=? Sym (pevalLeNumTerm aut but)-                    au <~ bu @=? Sym (pevalLtNumTerm aut but)-                    au >=~ bu @=? Sym (pevalGeNumTerm aut but)-                    au >~ bu @=? Sym (pevalGtNumTerm aut but)-                    (au `symCompare` bu :: UnionM Ordering)-                      @=? mrgIf (au <~ bu) (mrgSingle LT) (mrgIf (au ==~ bu) (mrgSingle EQ) (mrgSingle GT))--                    as <=~ bs @=? Sym (pevalLeNumTerm ast bst)-                    as <~ bs @=? Sym (pevalLtNumTerm ast bst)-                    as >=~ bs @=? Sym (pevalGeNumTerm ast bst)-                    as >~ bs @=? Sym (pevalGtNumTerm ast bst)-                    (as `symCompare` bs :: UnionM Ordering)-                      @=? mrgIf (as <~ bs) (mrgSingle LT) (mrgIf (as ==~ bs) (mrgSingle EQ) (mrgSingle GT))-                ],-              testGroup-                "Bits"-                [ testCase ".&." $ do-                    au .&. bu @=? Sym (pevalAndBitsTerm aut but)-                    as .&. bs @=? Sym (pevalAndBitsTerm ast bst),-                  testCase ".|." $ do-                    au .|. bu @=? Sym (pevalOrBitsTerm aut but)-                    as .|. bs @=? Sym (pevalOrBitsTerm ast bst),-                  testCase "xor" $ do-                    au `xor` bu @=? Sym (pevalXorBitsTerm aut but)-                    as `xor` bs @=? Sym (pevalXorBitsTerm ast bst),-                  testCase "complement" $ do-                    complement au @=? Sym (pevalComplementBitsTerm aut)-                    complement as @=? Sym (pevalComplementBitsTerm ast),-                  testCase "shift" $ do-                    shift au 1 @=? Sym (pevalShiftBitsTerm aut 1)-                    shift as 1 @=? Sym (pevalShiftBitsTerm ast 1),-                  testCase "rotate" $ do-                    rotate au 1 @=? Sym (pevalRotateBitsTerm aut 1)-                    rotate as 1 @=? Sym (pevalRotateBitsTerm ast 1),-                  testCase "bitSize" $ do-                    bitSizeMaybe au @=? Just 4-                    bitSizeMaybe as @=? Just 4,-                  testCase "isSigned" $ do-                    isSigned au @=? False-                    isSigned as @=? True,-                  testCase "testBit would only work on concrete ones" $ do-                    testBit (con 3 :: Sym (WordN 4)) 1 @=? True-                    testBit (con 3 :: Sym (WordN 4)) 2 @=? False-                    testBit (con 3 :: Sym (IntN 4)) 1 @=? True-                    testBit (con 3 :: Sym (IntN 4)) 2 @=? False,-                  testCase "bit would work" $ do-                    bit 1 @=? (con 2 :: Sym (WordN 4))-                    bit 1 @=? (con 2 :: Sym (IntN 4)),-                  testCase "popCount would only work on concrete ones" $ do-                    popCount (con 3 :: Sym (WordN 4)) @=? 2-                    popCount (con 3 :: Sym (WordN 4)) @=? 2-                    popCount (con 3 :: Sym (IntN 4)) @=? 2-                    popCount (con 3 :: Sym (IntN 4)) @=? 2-                ],-              testGroup-                "BVConcat"-                [ testCase "bvconcat" $ do-                    bvconcat-                      (ssym "a" :: Sym (WordN 4))-                      (ssym "b" :: Sym (WordN 3))-                      @=? Sym-                        ( pevalBVConcatTerm-                            (ssymTerm "a" :: Term (WordN 4))-                            (ssymTerm "b" :: Term (WordN 3))-                        )-                ],-              testGroup-                "bvextend for Sym BV"-                [ testCase "bvzeroExtend" $ do-                    bvzeroExtend (Proxy @6) au @=? Sym (pevalBVExtendTerm False (Proxy @6) aut)-                    bvzeroExtend (Proxy @6) as @=? Sym (pevalBVExtendTerm False (Proxy @6) ast),-                  testCase "bvsignExtend" $ do-                    bvsignExtend (Proxy @6) au @=? Sym (pevalBVExtendTerm True (Proxy @6) aut)-                    bvsignExtend (Proxy @6) as @=? Sym (pevalBVExtendTerm True (Proxy @6) ast),-                  testCase "bvextend" $ do-                    bvextend (Proxy @6) au @=? Sym (pevalBVExtendTerm False (Proxy @6) aut)-                    bvextend (Proxy @6) as @=? Sym (pevalBVExtendTerm True (Proxy @6) ast)-                ],-              testGroup-                "bvselect for Sym BV"-                [ testCase "bvselect" $ do-                    bvselect (Proxy @2) (Proxy @1) au-                      @=? Sym (pevalBVSelectTerm (Proxy @2) (Proxy @1) aut)-                    bvselect (Proxy @2) (Proxy @1) as-                      @=? Sym (pevalBVSelectTerm (Proxy @2) (Proxy @1) ast)-                ],-              testGroup-                "conversion between Int8 and Sym BV"-                [ testCase "toSym" $ do-                    toSym (0 :: Int8) @=? (con 0 :: SymIntN 8)-                    toSym (-127 :: Int8) @=? (con $ -127 :: SymIntN 8)-                    toSym (-128 :: Int8) @=? (con $ -128 :: SymIntN 8)-                    toSym (127 :: Int8) @=? (con 127 :: SymIntN 8),-                  testCase "toCon" $ do-                    toCon (con 0 :: SymIntN 8) @=? Just (0 :: Int8)-                    toCon (con $ -127 :: SymIntN 8) @=? Just (-127 :: Int8)-                    toCon (con $ -128 :: SymIntN 8) @=? Just (-128 :: Int8)-                    toCon (con 127 :: SymIntN 8) @=? Just (127 :: Int8)-                ],-              testGroup-                "conversion between Word8 and Sym BV"-                [ testCase "toSym" $ do-                    toSym (0 :: Word8) @=? (con 0 :: SymWordN 8)-                    toSym (1 :: Word8) @=? (con 1 :: SymWordN 8)-                    toSym (255 :: Word8) @=? (con 255 :: SymWordN 8),-                  testCase "toCon" $ do-                    toCon (con 0 :: SymWordN 8) @=? Just (0 :: Word8)-                    toCon (con 1 :: SymWordN 8) @=? Just (1 :: Word8)-                    toCon (con 255 :: SymWordN 8) @=? Just (255 :: Word8)-                ]-            ],-      testGroup-        "TabularFun"-        [ testCase "apply" $ do-            (ssym "a" :: Integer =~> Integer)-              # ssym "b"-              @=? Sym (pevalTabularFunApplyTerm (ssymTerm "a" :: Term (Integer =-> Integer)) (ssymTerm "b"))-        ],-      testGroup-        "Symbolic size"-        [ testCase "symSize" $ do-            symSize (ssym "a" :: Sym Integer) @=? 1-            symSize (con 1 :: Sym Integer) @=? 1-            symSize (con 1 + ssym "a" :: Sym Integer) @=? 3-            symSize (ssym "a" + ssym "a" :: Sym Integer) @=? 2-            symSize (-(ssym "a") :: Sym Integer) @=? 2-            symSize (ites (ssym "a" :: Sym Bool) (ssym "b") (ssym "c") :: Sym Integer) @=? 4,-          testCase "symsSize" $ do-            symsSize [ssym "a" :: Sym Integer, ssym "a" + ssym "a"] @=? 2-        ],-      let asymbol :: TypedSymbol Integer = "a"-          bsymbol :: TypedSymbol Bool = "b"-          csymbol :: TypedSymbol Integer = "c"-          dsymbol :: TypedSymbol Bool = "d"-          esymbol :: TypedSymbol (WordN 4) = "e"-          fsymbol :: TypedSymbol (IntN 4) = "f"-          gsymbol :: TypedSymbol (WordN 16) = "g"-          hsymbol :: TypedSymbol (IntN 16) = "h"-          a :: Sym Integer = ssym "a"-          b :: Sym Bool = "b"-          c :: Sym Integer = "c"-          d :: Sym Bool = "d"-          e :: Sym (WordN 4) = "e"-          f :: Sym (IntN 4) = "f"-          g :: Sym (WordN 16) = "g"-          h :: Sym (IntN 16) = "h"-       in testCase-            "construting Model from ModelSymPair"-            $ do-              buildModel (a := 1) @=? Model (M.singleton (someTypedSymbol asymbol) (toModelValue (1 :: Integer)))-              buildModel (a := 1, b := True)-                @=? Model-                  ( M.fromList-                      [ (someTypedSymbol asymbol, toModelValue (1 :: Integer)),-                        (someTypedSymbol bsymbol, toModelValue True)-                      ]-                  )-              buildModel-                ( a := 1,-                  b := True,-                  c := 2-                )-                @=? Model-                  ( M.fromList-                      [ (someTypedSymbol asymbol, toModelValue (1 :: Integer)),-                        (someTypedSymbol bsymbol, toModelValue True),-                        (someTypedSymbol csymbol, toModelValue (2 :: Integer))-                      ]-                  )-              buildModel-                ( a := 1,-                  b := True,-                  c := 2,-                  d := False-                )-                @=? Model-                  ( M.fromList-                      [ (someTypedSymbol asymbol, toModelValue (1 :: Integer)),-                        (someTypedSymbol bsymbol, toModelValue True),-                        (someTypedSymbol csymbol, toModelValue (2 :: Integer)),-                        (someTypedSymbol dsymbol, toModelValue False)-                      ]-                  )-              buildModel-                ( a := 1,-                  b := True,-                  c := 2,-                  d := False,-                  e := 3-                )-                @=? Model-                  ( M.fromList-                      [ (someTypedSymbol asymbol, toModelValue (1 :: Integer)),-                        (someTypedSymbol bsymbol, toModelValue True),-                        (someTypedSymbol csymbol, toModelValue (2 :: Integer)),-                        (someTypedSymbol dsymbol, toModelValue False),-                        (someTypedSymbol esymbol, toModelValue (3 :: WordN 4))-                      ]-                  )-              buildModel-                ( a := 1,-                  b := True,-                  c := 2,-                  d := False,-                  e := 3,-                  f := 4-                )-                @=? Model-                  ( M.fromList-                      [ (someTypedSymbol asymbol, toModelValue (1 :: Integer)),-                        (someTypedSymbol bsymbol, toModelValue True),-                        (someTypedSymbol csymbol, toModelValue (2 :: Integer)),-                        (someTypedSymbol dsymbol, toModelValue False),-                        (someTypedSymbol esymbol, toModelValue (3 :: WordN 4)),-                        (someTypedSymbol fsymbol, toModelValue (4 :: IntN 4))-                      ]-                  )-              buildModel-                ( a := 1,-                  b := True,-                  c := 2,-                  d := False,-                  e := 3,-                  f := 4,-                  g := 5-                )-                @=? Model-                  ( M.fromList-                      [ (someTypedSymbol asymbol, toModelValue (1 :: Integer)),-                        (someTypedSymbol bsymbol, toModelValue True),-                        (someTypedSymbol csymbol, toModelValue (2 :: Integer)),-                        (someTypedSymbol dsymbol, toModelValue False),-                        (someTypedSymbol esymbol, toModelValue (3 :: WordN 4)),-                        (someTypedSymbol fsymbol, toModelValue (4 :: IntN 4)),-                        (someTypedSymbol gsymbol, toModelValue (5 :: WordN 16))-                      ]-                  )-              buildModel-                ( a := 1,-                  b := True,-                  c := 2,-                  d := False,-                  e := 3,-                  f := 4,-                  g := 5,-                  h := 6-                )-                @=? Model-                  ( M.fromList-                      [ (someTypedSymbol asymbol, toModelValue (1 :: Integer)),-                        (someTypedSymbol bsymbol, toModelValue True),-                        (someTypedSymbol csymbol, toModelValue (2 :: Integer)),-                        (someTypedSymbol dsymbol, toModelValue False),-                        (someTypedSymbol esymbol, toModelValue (3 :: WordN 4)),-                        (someTypedSymbol fsymbol, toModelValue (4 :: IntN 4)),-                        (someTypedSymbol gsymbol, toModelValue (5 :: WordN 16)),-                        (someTypedSymbol hsymbol, toModelValue (6 :: IntN 16))+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE NegativeLiterals #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}++module Grisette.IR.SymPrim.Data.SymPrimTests where++import Control.DeepSeq+import Control.Exception+import Control.Monad.Except+import Data.Bits+import qualified Data.HashMap.Strict as M+import qualified Data.HashSet as S+import Data.Int+import Data.Proxy+import Data.Word+import Grisette.Core.Control.Monad.UnionM+import Grisette.Core.Data.BV+import Grisette.Core.Data.Class.BitVector+import Grisette.Core.Data.Class.Bool+import Grisette.Core.Data.Class.Evaluate+import Grisette.Core.Data.Class.ExtractSymbolics+import Grisette.Core.Data.Class.Function+import Grisette.Core.Data.Class.GenSym+import Grisette.Core.Data.Class.Mergeable+import Grisette.Core.Data.Class.ModelOps+import Grisette.Core.Data.Class.SOrd+import Grisette.Core.Data.Class.SafeArith+import Grisette.Core.Data.Class.SimpleMergeable+import Grisette.Core.Data.Class.Solvable+import Grisette.Core.Data.Class.ToCon+import Grisette.Core.Data.Class.ToSym+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors+import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term+import Grisette.IR.SymPrim.Data.Prim.Model+import Grisette.IR.SymPrim.Data.Prim.ModelValue+import Grisette.IR.SymPrim.Data.Prim.PartialEval.BV+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bits+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Bool+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Integral+import Grisette.IR.SymPrim.Data.Prim.PartialEval.Num+import Grisette.IR.SymPrim.Data.Prim.PartialEval.TabularFun+import Grisette.IR.SymPrim.Data.SymPrim+import Grisette.IR.SymPrim.Data.TabularFun+import Test.Tasty+import Test.Tasty.HUnit+import Test.Tasty.QuickCheck hiding ((.&.))+import Type.Reflection hiding (Con)++newtype AEWrapper = AEWrapper ArithException deriving (Eq)++instance Show AEWrapper where+  show (AEWrapper x) = show x++instance NFData AEWrapper where+  rnf (AEWrapper x) = x `seq` ()++sameSafeDiv ::+  forall c s.+  ( Show s,+    Eq s,+    Eq c,+    Num c,+    Mergeable s,+    NFData c,+    Solvable c s+  ) =>+  c ->+  c ->+  (s -> s -> ExceptT ArithException UnionM s) ->+  (c -> c -> c) ->+  Assertion+sameSafeDiv i j f cf = do+  xc <- evaluate (force $ Right $ cf i j) `catch` \(e :: ArithException) -> return $ Left $ AEWrapper e+  case xc of+    Left (AEWrapper e) -> f (con i :: s) (con j) @=? merge (throwError e)+    Right c -> f (con i :: s) (con j) @=? mrgSingle (con c)++sameSafeDiv' ::+  forall c s.+  ( Show s,+    Eq s,+    Eq c,+    Num c,+    Mergeable s,+    NFData c,+    Solvable c s+  ) =>+  c ->+  c ->+  ((ArithException -> ()) -> s -> s -> ExceptT () UnionM s) ->+  (c -> c -> c) ->+  Assertion+sameSafeDiv' i j f cf = do+  xc <- evaluate (force $ Right $ cf i j) `catch` \(e :: ArithException) -> return $ Left ()+  case xc of+    Left () -> f (const ()) (con i :: s) (con j) @=? merge (throwError ())+    Right c -> f (const ()) (con i :: s) (con j) @=? mrgSingle (con c)++sameSafeDivMod ::+  forall c s.+  ( Show s,+    Eq s,+    Eq c,+    Num c,+    Mergeable s,+    NFData c,+    Solvable c s+  ) =>+  c ->+  c ->+  (s -> s -> ExceptT ArithException UnionM (s, s)) ->+  (c -> c -> (c, c)) ->+  Assertion+sameSafeDivMod i j f cf = do+  xc <- evaluate (force $ Right $ cf i j) `catch` \(e :: ArithException) -> return $ Left $ AEWrapper e+  case xc of+    Left (AEWrapper e) -> f (con i :: s) (con j) @=? merge (throwError e)+    Right (c1, c2) -> f (con i :: s) (con j) @=? mrgSingle (con c1, con c2)++sameSafeDivMod' ::+  forall c s.+  ( Show s,+    Eq s,+    Eq c,+    Num c,+    Mergeable s,+    NFData c,+    Solvable c s+  ) =>+  c ->+  c ->+  ((ArithException -> ()) -> s -> s -> ExceptT () UnionM (s, s)) ->+  (c -> c -> (c, c)) ->+  Assertion+sameSafeDivMod' i j f cf = do+  xc <- evaluate (force $ Right $ cf i j) `catch` \(e :: ArithException) -> return $ Left ()+  case xc of+    Left () -> f (const ()) (con i :: s) (con j) @=? merge (throwError ())+    Right (c1, c2) -> f (const ()) (con i :: s) (con j) @=? mrgSingle (con c1, con c2)++safeDivisionBoundedOnlyTests ::+  forall c s.+  (LinkedRep c s, Bounded c, Solvable c s, Eq s, Num c, Show s, Mergeable s, SEq s) =>+  (s -> s -> ExceptT ArithException UnionM s) ->+  ((ArithException -> ()) -> s -> s -> ExceptT () UnionM s) ->+  (c -> c -> c) ->+  (Term c -> Term c -> Term c) ->+  [TestTree]+safeDivisionBoundedOnlyTests f f' cf pf =+  [ testCase "on concrete min divided by minus one" $ do+      sameSafeDiv minBound (-1) f cf+      sameSafeDiv' minBound (-1) f' cf,+    testCase "on symbolic" $ do+      f (ssym "a" :: s) (ssym "b")+        @=? ( mrgIf+                ((ssym "b" :: s) ==~ con (0 :: c) :: SymBool)+                (throwError DivideByZero)+                ( mrgIf+                    ((ssym "b" :: s) ==~ con (-1) &&~ (ssym "a" :: s) ==~ con (minBound :: c) :: SymBool)+                    (throwError Overflow)+                    (mrgSingle $ wrapTerm $ pf (ssymTerm "a") (ssymTerm "b"))+                ) ::+                ExceptT ArithException UnionM s+            )+      f' (const ()) (ssym "a" :: s) (ssym "b")+        @=? ( mrgIf+                ((ssym "b" :: s) ==~ con (0 :: c) :: SymBool)+                (throwError ())+                ( mrgIf+                    ((ssym "b" :: s) ==~ con (-1) &&~ (ssym "a" :: s) ==~ con (minBound :: c) :: SymBool)+                    (throwError ())+                    (mrgSingle $ wrapTerm $ pf (ssymTerm "a") (ssymTerm "b"))+                ) ::+                ExceptT () UnionM s+            )+  ]++safeDivisionUnboundedOnlyTests ::+  forall c s.+  (LinkedRep c s, Solvable c s, Eq s, Num c, Show s, Mergeable s, SEq s) =>+  (s -> s -> ExceptT ArithException UnionM s) ->+  ((ArithException -> ()) -> s -> s -> ExceptT () UnionM s) ->+  (c -> c -> c) ->+  (Term c -> Term c -> Term c) ->+  [TestTree]+safeDivisionUnboundedOnlyTests f f' cf pf =+  [ testCase "on symbolic" $ do+      f (ssym "a" :: s) (ssym "b")+        @=? ( mrgIf+                ((ssym "b" :: s) ==~ con (0 :: c) :: SymBool)+                (throwError DivideByZero)+                (mrgSingle $ wrapTerm $ pf (ssymTerm "a") (ssymTerm "b")) ::+                ExceptT ArithException UnionM s+            )+      f' (const ()) (ssym "a" :: s) (ssym "b")+        @=? ( mrgIf+                ((ssym "b" :: s) ==~ con (0 :: c) :: SymBool)+                (throwError ())+                (mrgSingle $ wrapTerm $ pf (ssymTerm "a") (ssymTerm "b")) ::+                ExceptT () UnionM s+            )+  ]++safeDivisionGeneralTests ::+  forall c c0 s.+  (LinkedRep c s, Arbitrary c0, Show c0, Solvable c s, Eq s, Num c, Show s, Mergeable s, SEq s) =>+  (c0 -> c) ->+  (s -> s -> ExceptT ArithException UnionM s) ->+  ((ArithException -> ()) -> s -> s -> ExceptT () UnionM s) ->+  (c -> c -> c) ->+  (Term c -> Term c -> Term c) ->+  [TestTree]+safeDivisionGeneralTests transform f f' cf pf =+  [ testProperty "on concrete prop" $ \(i0 :: c0, j0 :: c0) ->+      ioProperty $ do+        let i = transform i0+        let j = transform j0+        sameSafeDiv i j f cf+        sameSafeDiv' i j f' cf,+    testProperty "on concrete divided by zero" $ \(i0 :: c0) ->+      ioProperty $ do+        let i = transform i0+        sameSafeDiv i 0 f cf+        sameSafeDiv' i 0 f' cf,+    testCase "when divided by zero" $ do+      f (ssym "a" :: s) (con 0)+        @=? (merge $ throwError DivideByZero :: ExceptT ArithException UnionM s)+      f' (const ()) (ssym "a" :: s) (con 0)+        @=? (merge $ throwError () :: ExceptT () UnionM s)+  ]++safeDivisionBoundedTests ::+  forall c c0 s.+  (LinkedRep c s, Arbitrary c0, Show c0, Bounded c, Solvable c s, Eq s, Num c, Show s, Mergeable s, SEq s) =>+  TestName ->+  (c0 -> c) ->+  (s -> s -> ExceptT ArithException UnionM s) ->+  ((ArithException -> ()) -> s -> s -> ExceptT () UnionM s) ->+  (c -> c -> c) ->+  (Term c -> Term c -> Term c) ->+  TestTree+safeDivisionBoundedTests name transform f f' cf pf =+  testGroup name $+    safeDivisionGeneralTests transform f f' cf pf+      ++ safeDivisionBoundedOnlyTests f f' cf pf++safeDivisionUnboundedTests ::+  forall c c0 s.+  (LinkedRep c s, Arbitrary c0, Show c0, Solvable c s, Eq s, Num c, Show s, Mergeable s, SEq s) =>+  TestName ->+  (c0 -> c) ->+  (s -> s -> ExceptT ArithException UnionM s) ->+  ((ArithException -> ()) -> s -> s -> ExceptT () UnionM s) ->+  (c -> c -> c) ->+  (Term c -> Term c -> Term c) ->+  TestTree+safeDivisionUnboundedTests name transform f f' cf pf =+  testGroup name $+    safeDivisionGeneralTests transform f f' cf pf+      ++ safeDivisionUnboundedOnlyTests f f' cf pf++safeDivModBoundedOnlyTests ::+  forall c s.+  (LinkedRep c s, Bounded c, Solvable c s, Eq s, Num c, Show s, Mergeable s, SEq s) =>+  ( s ->+    s ->+    ExceptT ArithException UnionM (s, s)+  ) ->+  ( (ArithException -> ()) ->+    s ->+    s ->+    ExceptT () UnionM (s, s)+  ) ->+  (c -> c -> (c, c)) ->+  (Term c -> Term c -> Term c) ->+  (Term c -> Term c -> Term c) ->+  [TestTree]+safeDivModBoundedOnlyTests f f' cf pf1 pf2 =+  [ testCase "on concrete min divided by minus one" $ do+      sameSafeDivMod minBound (-1) f cf+      sameSafeDivMod' minBound (-1) f' cf,+    testCase "on symbolic" $ do+      f (ssym "a" :: s) (ssym "b")+        @=? ( mrgIf+                ((ssym "b" :: s) ==~ con (0 :: c) :: SymBool)+                (throwError DivideByZero)+                ( mrgIf+                    ((ssym "b" :: s) ==~ con (-1) &&~ (ssym "a" :: s) ==~ con (minBound :: c) :: SymBool)+                    (throwError Overflow)+                    ( mrgSingle+                        ( wrapTerm $ pf1 (ssymTerm "a") (ssymTerm "b"),+                          wrapTerm $ pf2 (ssymTerm "a") (ssymTerm "b")+                        )+                    )+                ) ::+                ExceptT ArithException UnionM (s, s)+            )+      f' (const ()) (ssym "a" :: s) (ssym "b")+        @=? ( mrgIf+                ((ssym "b" :: s) ==~ con (0 :: c) :: SymBool)+                (throwError ())+                ( mrgIf+                    ((ssym "b" :: s) ==~ con (-1) &&~ (ssym "a" :: s) ==~ con (minBound :: c) :: SymBool)+                    (throwError ())+                    ( mrgSingle+                        ( wrapTerm $ pf1 (ssymTerm "a") (ssymTerm "b"),+                          wrapTerm $ pf2 (ssymTerm "a") (ssymTerm "b")+                        )+                    )+                ) ::+                ExceptT () UnionM (s, s)+            )+  ]++safeDivModUnboundedOnlyTests ::+  forall c s.+  (LinkedRep c s, Solvable c s, Eq s, Num c, Show s, Mergeable s, SEq s) =>+  ( s ->+    s ->+    ExceptT ArithException UnionM (s, s)+  ) ->+  ( (ArithException -> ()) ->+    s ->+    s ->+    ExceptT () UnionM (s, s)+  ) ->+  (c -> c -> (c, c)) ->+  (Term c -> Term c -> Term c) ->+  (Term c -> Term c -> Term c) ->+  [TestTree]+safeDivModUnboundedOnlyTests f f' cf pf1 pf2 =+  [ testCase "on symbolic" $ do+      f (ssym "a" :: s) (ssym "b")+        @=? ( mrgIf+                ((ssym "b" :: s) ==~ con (0 :: c) :: SymBool)+                (throwError DivideByZero)+                ( mrgSingle+                    ( wrapTerm $ pf1 (ssymTerm "a") (ssymTerm "b"),+                      wrapTerm $ pf2 (ssymTerm "a") (ssymTerm "b")+                    )+                ) ::+                ExceptT ArithException UnionM (s, s)+            )+      f' (const ()) (ssym "a" :: s) (ssym "b")+        @=? ( mrgIf+                ((ssym "b" :: s) ==~ con (0 :: c) :: SymBool)+                (throwError ())+                ( mrgSingle+                    ( wrapTerm $ pf1 (ssymTerm "a") (ssymTerm "b"),+                      wrapTerm $ pf2 (ssymTerm "a") (ssymTerm "b")+                    )+                ) ::+                ExceptT () UnionM (s, s)+            )+  ]++safeDivModGeneralTests ::+  forall c c0 s.+  (LinkedRep c s, Arbitrary c0, Show c0, Solvable c s, Eq s, Num c, Show s, Mergeable s, SEq s) =>+  (c0 -> c) ->+  ( s ->+    s ->+    ExceptT ArithException UnionM (s, s)+  ) ->+  ( (ArithException -> ()) ->+    s ->+    s ->+    ExceptT () UnionM (s, s)+  ) ->+  (c -> c -> (c, c)) ->+  (Term c -> Term c -> Term c) ->+  (Term c -> Term c -> Term c) ->+  [TestTree]+safeDivModGeneralTests transform f f' cf pf1 pf2 =+  [ testProperty "on concrete" $ \(i0 :: c0, j0 :: c0) ->+      ioProperty $ do+        let i = transform i0+        let j = transform j0+        sameSafeDivMod i j f cf+        sameSafeDivMod' i j f' cf,+    testProperty "on concrete divided by zero" $ \(i0 :: c0) ->+      ioProperty $ do+        let i = transform i0+        sameSafeDivMod i 0 f cf+        sameSafeDivMod' i 0 f' cf,+    testCase "when divided by zero" $ do+      f (ssym "a" :: s) (con 0)+        @=? (merge $ throwError DivideByZero :: ExceptT ArithException UnionM (s, s))+      f' (const ()) (ssym "a" :: s) (con 0)+        @=? (merge $ throwError () :: ExceptT () UnionM (s, s))+  ]++safeDivModBoundedTests ::+  forall c c0 s.+  (LinkedRep c s, Arbitrary c0, Show c0, Bounded c, Solvable c s, Eq s, Num c, Show s, Mergeable s, SEq s) =>+  TestName ->+  (c0 -> c) ->+  ( s ->+    s ->+    ExceptT ArithException UnionM (s, s)+  ) ->+  ( (ArithException -> ()) ->+    s ->+    s ->+    ExceptT () UnionM (s, s)+  ) ->+  (c -> c -> (c, c)) ->+  (Term c -> Term c -> Term c) ->+  (Term c -> Term c -> Term c) ->+  TestTree+safeDivModBoundedTests name transform f f' cf pf1 pf2 =+  testGroup name $+    safeDivModGeneralTests transform f f' cf pf1 pf2+      ++ safeDivModBoundedOnlyTests f f' cf pf1 pf2++safeDivModUnboundedTests ::+  forall c c0 s.+  (LinkedRep c s, Arbitrary c0, Show c0, Solvable c s, Eq s, Num c, Show s, Mergeable s, SEq s) =>+  TestName ->+  (c0 -> c) ->+  ( s ->+    s ->+    ExceptT ArithException UnionM (s, s)+  ) ->+  ( (ArithException -> ()) ->+    s ->+    s ->+    ExceptT () UnionM (s, s)+  ) ->+  (c -> c -> (c, c)) ->+  (Term c -> Term c -> Term c) ->+  (Term c -> Term c -> Term c) ->+  TestTree+safeDivModUnboundedTests name transform f f' cf pf1 pf2 =+  testGroup name $+    safeDivModGeneralTests transform f f' cf pf1 pf2+      ++ safeDivModUnboundedOnlyTests f f' cf pf1 pf2++symPrimTests :: TestTree+symPrimTests =+  testGroup+    "SymPrimTests"+    [ testGroup+        "General SymPrim"+        [ testGroup+            "Solvable"+            [ testCase "con" $ (con 1 :: SymInteger) @=? SymInteger (conTerm 1),+              testCase "ssym" $ (ssym "a" :: SymInteger) @=? SymInteger (ssymTerm "a"),+              testCase "isym" $ (isym "a" 1 :: SymInteger) @=? SymInteger (isymTerm "a" 1),+              testCase "conView" $ do+                conView (con 1 :: SymInteger) @=? Just 1+                conView (ssym "a" :: SymInteger) @=? Nothing+                case con 1 :: SymInteger of+                  Con 1 -> return ()+                  _ -> assertFailure "Bad match"+                case ssym "a" :: SymInteger of+                  Con _ -> assertFailure "Bad match"+                  _ -> return ()+            ],+          testGroup+            "ITEOp"+            [ testCase "ites" $+                ites (ssym "a" :: SymBool) (ssym "b" :: SymInteger) (ssym "c")+                  @=? SymInteger (pevalITETerm (ssymTerm "a") (ssymTerm "b") (ssymTerm "c"))+            ],+          testCase "Mergeable" $ do+            let SimpleStrategy s = rootStrategy :: MergingStrategy SymInteger+            s (ssym "a") (ssym "b") (ssym "c")+              @=? ites (ssym "a" :: SymBool) (ssym "b" :: SymInteger) (ssym "c"),+          testCase "SimpleMergeable" $+            mrgIte (ssym "a" :: SymBool) (ssym "b") (ssym "c")+              @=? ites (ssym "a" :: SymBool) (ssym "b" :: SymInteger) (ssym "c"),+          testCase "IsString" $ ("a" :: SymBool) @=? SymBool (ssymTerm "a"),+          testGroup+            "ToSym"+            [ testCase "From self" $ toSym (ssym "a" :: SymBool) @=? (ssym "a" :: SymBool),+              testCase "From concrete" $ toSym True @=? (con True :: SymBool)+            ],+          testGroup+            "ToCon"+            [ testCase "To self" $ toCon (ssym "a" :: SymBool) @=? (Nothing :: Maybe Bool),+              testCase "To concrete" $ toCon True @=? Just True+            ],+          testCase "EvaluateSym" $ do+            let m1 = emptyModel :: Model+            let m2 = insertValue (SimpleSymbol "a") (1 :: Integer) m1+            let m3 = insertValue (SimpleSymbol "b") True m2+            evaluateSym False m3 (ites ("c" :: SymBool) "a" ("a" + "a" :: SymInteger))+              @=? ites ("c" :: SymBool) 1 2+            evaluateSym True m3 (ites ("c" :: SymBool) "a" ("a" + "a" :: SymInteger)) @=? 2,+          testCase "ExtractSymbolics" $+            extractSymbolics (ites ("c" :: SymBool) ("a" :: SymInteger) ("b" :: SymInteger))+              @=? SymbolSet+                ( S.fromList+                    [ someTypedSymbol (SimpleSymbol "c" :: TypedSymbol Bool),+                      someTypedSymbol (SimpleSymbol "a" :: TypedSymbol Integer),+                      someTypedSymbol (SimpleSymbol "b" :: TypedSymbol Integer)+                    ]+                ),+          testCase "GenSym" $ do+            (genSym () "a" :: UnionM SymBool) @=? mrgSingle (isym "a" 0)+            (genSymSimple () "a" :: SymBool) @=? isym "a" 0+            (genSym (ssym "a" :: SymBool) "a" :: UnionM SymBool) @=? mrgSingle (isym "a" 0)+            (genSymSimple (ssym "a" :: SymBool) "a" :: SymBool) @=? isym "a" 0+            (genSym () (nameWithInfo "a" True) :: UnionM SymBool) @=? mrgSingle (iinfosym "a" 0 True)+            (genSymSimple () (nameWithInfo "a" True) :: SymBool) @=? iinfosym "a" 0 True,+          testCase "SEq" $ do+            (ssym "a" :: SymBool) ==~ ssym "b" @=? SymBool (pevalEqvTerm (ssymTerm "a" :: Term Bool) (ssymTerm "b"))+            (ssym "a" :: SymBool) /=~ ssym "b" @=? SymBool (pevalNotTerm $ pevalEqvTerm (ssymTerm "a" :: Term Bool) (ssymTerm "b"))+        ],+      testGroup+        "SymBool"+        [ testGroup+            "LogicalOp"+            [ testCase "||~" $ ssym "a" ||~ ssym "b" @=? SymBool (pevalOrTerm (ssymTerm "a") (ssymTerm "b")),+              testCase "&&~" $ ssym "a" &&~ ssym "b" @=? SymBool (pevalAndTerm (ssymTerm "a") (ssymTerm "b")),+              testCase "nots" $ nots (ssym "a") @=? SymBool (pevalNotTerm (ssymTerm "a")),+              testCase "xors" $ xors (ssym "a") (ssym "b") @=? SymBool (pevalXorTerm (ssymTerm "a") (ssymTerm "b")),+              testCase "implies" $ implies (ssym "a") (ssym "b") @=? SymBool (pevalImplyTerm (ssymTerm "a") (ssymTerm "b"))+            ]+        ],+      testGroup+        "SymInteger"+        [ testGroup+            "Num"+            [ testCase "fromInteger" $ (1 :: SymInteger) @=? SymInteger (conTerm 1),+              testCase "(+)" $ (ssym "a" :: SymInteger) + ssym "b" @=? SymInteger (pevalAddNumTerm (ssymTerm "a") (ssymTerm "b")),+              testCase "(-)" $ (ssym "a" :: SymInteger) - ssym "b" @=? SymInteger (pevalMinusNumTerm (ssymTerm "a") (ssymTerm "b")),+              testCase "(*)" $ (ssym "a" :: SymInteger) * ssym "b" @=? SymInteger (pevalTimesNumTerm (ssymTerm "a") (ssymTerm "b")),+              testCase "negate" $ negate (ssym "a" :: SymInteger) @=? SymInteger (pevalUMinusNumTerm (ssymTerm "a")),+              testCase "abs" $ abs (ssym "a" :: SymInteger) @=? SymInteger (pevalAbsNumTerm (ssymTerm "a")),+              testCase "signum" $ signum (ssym "a" :: SymInteger) @=? SymInteger (pevalSignumNumTerm (ssymTerm "a"))+            ],+          testGroup+            "SafeDivision"+            [ safeDivisionUnboundedTests @Integer "safeDiv" id safeDiv safeDiv' div pevalDivIntegralTerm,+              safeDivisionUnboundedTests @Integer "safeMod" id safeMod safeMod' mod pevalModIntegralTerm,+              safeDivModUnboundedTests @Integer "safeDivMod" id safeDivMod safeDivMod' divMod pevalDivIntegralTerm pevalModIntegralTerm,+              safeDivisionUnboundedTests @Integer "safeQuot" id safeQuot safeQuot' quot pevalQuotIntegralTerm,+              safeDivisionUnboundedTests @Integer "safeRem" id safeRem safeRem' rem pevalRemIntegralTerm,+              safeDivModUnboundedTests @Integer "safeQuotRem" id safeQuotRem safeQuotRem' quotRem pevalQuotIntegralTerm pevalRemIntegralTerm+            ],+          testGroup+            "SafeLinearArith"+            [ testProperty "safeAdd on concrete" $ \(i :: Integer, j :: Integer) ->+                ioProperty $ do+                  safeAdd (con i :: SymInteger) (con j)+                    @=? (mrgSingle $ con $ i + j :: ExceptT ArithException UnionM SymInteger)+                  safeAdd' (const ()) (con i :: SymInteger) (con j)+                    @=? (mrgSingle $ con $ i + j :: ExceptT () UnionM SymInteger),+              testCase "safeAdd on symbolic" $ do+                safeAdd (ssym "a" :: SymInteger) (ssym "b")+                  @=? (mrgSingle $ SymInteger $ pevalAddNumTerm (ssymTerm "a") (ssymTerm "b") :: ExceptT ArithException UnionM SymInteger)+                safeAdd' (const ()) (ssym "a" :: SymInteger) (ssym "b")+                  @=? (mrgSingle $ SymInteger $ pevalAddNumTerm (ssymTerm "a") (ssymTerm "b") :: ExceptT () UnionM SymInteger),+              testProperty "safeNeg on concrete" $ \(i :: Integer) ->+                ioProperty $ do+                  safeNeg (con i :: SymInteger)+                    @=? (mrgSingle $ con $ -i :: ExceptT ArithException UnionM SymInteger)+                  safeNeg' (const ()) (con i :: SymInteger)+                    @=? (mrgSingle $ con $ -i :: ExceptT () UnionM SymInteger),+              testCase "safeNeg on symbolic" $ do+                safeNeg (ssym "a" :: SymInteger)+                  @=? (mrgSingle $ SymInteger $ pevalUMinusNumTerm (ssymTerm "a") :: ExceptT ArithException UnionM SymInteger)+                safeNeg' (const ()) (ssym "a" :: SymInteger)+                  @=? (mrgSingle $ SymInteger $ pevalUMinusNumTerm (ssymTerm "a") :: ExceptT () UnionM SymInteger),+              testProperty "safeMinus on concrete" $ \(i :: Integer, j :: Integer) ->+                ioProperty $ do+                  safeMinus (con i :: SymInteger) (con j)+                    @=? (mrgSingle $ con $ i - j :: ExceptT ArithException UnionM SymInteger)+                  safeMinus' (const ()) (con i :: SymInteger) (con j)+                    @=? (mrgSingle $ con $ i - j :: ExceptT () UnionM SymInteger),+              testCase "safeMinus on symbolic" $ do+                safeMinus (ssym "a" :: SymInteger) (ssym "b")+                  @=? (mrgSingle $ SymInteger $ pevalMinusNumTerm (ssymTerm "a") (ssymTerm "b") :: ExceptT ArithException UnionM SymInteger)+                safeMinus' (const ()) (ssym "a" :: SymInteger) (ssym "b")+                  @=? (mrgSingle $ SymInteger $ pevalMinusNumTerm (ssymTerm "a") (ssymTerm "b") :: ExceptT () UnionM SymInteger)+            ],+          testGroup+            "SOrd"+            [ testProperty "SOrd on concrete" $ \(i :: Integer, j :: Integer) -> ioProperty $ do+                (con i :: SymInteger) <=~ con j @=? (con (i <= j) :: SymBool)+                (con i :: SymInteger) <~ con j @=? (con (i < j) :: SymBool)+                (con i :: SymInteger) >=~ con j @=? (con (i >= j) :: SymBool)+                (con i :: SymInteger) >~ con j @=? (con (i > j) :: SymBool)+                (con i :: SymInteger)+                  `symCompare` con j+                  @=? (i `symCompare` j :: UnionM Ordering),+              testCase "SOrd on symbolic" $ do+                let a :: SymInteger = ssym "a"+                let b :: SymInteger = ssym "b"+                let at :: Term Integer = ssymTerm "a"+                let bt :: Term Integer = ssymTerm "b"+                a <=~ b @=? SymBool (pevalLeNumTerm at bt)+                a <~ b @=? SymBool (pevalLtNumTerm at bt)+                a >=~ b @=? SymBool (pevalGeNumTerm at bt)+                a >~ b @=? SymBool (pevalGtNumTerm at bt)+                (a `symCompare` ssym "b" :: UnionM Ordering)+                  @=? mrgIf (a <~ b) (mrgSingle LT) (mrgIf (a ==~ b) (mrgSingle EQ) (mrgSingle GT))+            ]+        ],+      let au :: SymWordN 4 = ssym "a"+          bu :: SymWordN 4 = ssym "b"+          as :: SymIntN 4 = ssym "a"+          bs :: SymIntN 4 = ssym "b"+          aut :: Term (WordN 4) = ssymTerm "a"+          but :: Term (WordN 4) = ssymTerm "b"+          ast :: Term (IntN 4) = ssymTerm "a"+          bst :: Term (IntN 4) = ssymTerm "b"+       in testGroup+            "Sym BV"+            [ testGroup+                "Num"+                [ testCase "fromInteger" $ do+                    (1 :: SymWordN 4) @=? SymWordN (conTerm 1)+                    (1 :: SymIntN 4) @=? SymIntN (conTerm 1),+                  testCase "(+)" $ do+                    au + bu @=? SymWordN (pevalAddNumTerm aut but)+                    as + bs @=? SymIntN (pevalAddNumTerm ast bst),+                  testCase "(-)" $ do+                    au - bu @=? SymWordN (pevalMinusNumTerm aut but)+                    as - bs @=? SymIntN (pevalMinusNumTerm ast bst),+                  testCase "(*)" $ do+                    au * bu @=? SymWordN (pevalTimesNumTerm aut but)+                    as * bs @=? SymIntN (pevalTimesNumTerm ast bst),+                  testCase "negate" $ do+                    negate au @=? SymWordN (pevalUMinusNumTerm aut)+                    negate as @=? SymIntN (pevalUMinusNumTerm ast),+                  testCase "abs" $ do+                    abs au @=? SymWordN (pevalAbsNumTerm aut)+                    abs as @=? SymIntN (pevalAbsNumTerm ast),+                  testCase "signum" $ do+                    signum au @=? SymWordN (pevalSignumNumTerm aut)+                    signum as @=? SymIntN (pevalSignumNumTerm ast)+                ],+              testGroup+                "SafeDivision"+                [ testGroup+                    "WordN"+                    [ safeDivisionUnboundedTests @(WordN 4) "safeDiv" WordN safeDiv safeDiv' div pevalDivIntegralTerm,+                      safeDivisionUnboundedTests @(WordN 4) "safeMod" WordN safeMod safeMod' mod pevalModIntegralTerm,+                      safeDivModUnboundedTests @(WordN 4) "safeDivMod" WordN safeDivMod safeDivMod' divMod pevalDivIntegralTerm pevalModIntegralTerm,+                      safeDivisionUnboundedTests @(WordN 4) "safeQuot" WordN safeQuot safeQuot' quot pevalQuotIntegralTerm,+                      safeDivisionUnboundedTests @(WordN 4) "safeRem" WordN safeRem safeRem' rem pevalRemIntegralTerm,+                      safeDivModUnboundedTests @(WordN 4) "safeQuotRem" WordN safeQuotRem safeQuotRem' divMod pevalQuotIntegralTerm pevalRemIntegralTerm+                    ],+                  testGroup+                    "IntN"+                    [ safeDivisionBoundedTests @(IntN 4) "safeDiv" IntN safeDiv safeDiv' div pevalDivBoundedIntegralTerm,+                      safeDivisionUnboundedTests @(IntN 4) "safeMod" IntN safeMod safeMod' mod pevalModBoundedIntegralTerm,+                      safeDivModBoundedTests @(IntN 4) "safeDivMod" IntN safeDivMod safeDivMod' divMod pevalDivBoundedIntegralTerm pevalModBoundedIntegralTerm,+                      safeDivisionBoundedTests @(IntN 4) "safeQuot" IntN safeQuot safeQuot' quot pevalQuotBoundedIntegralTerm,+                      safeDivisionUnboundedTests @(IntN 4) "safeRem" IntN safeRem safeRem' rem pevalRemBoundedIntegralTerm,+                      safeDivModBoundedTests @(IntN 4) "safeQuotRem" IntN safeQuotRem safeQuotRem' quotRem pevalQuotBoundedIntegralTerm pevalRemBoundedIntegralTerm+                    ]+                ],+              testGroup+                "SafeLinearArith"+                [ testGroup+                    "IntN"+                    [ testProperty "safeAdd on concrete" $ \(i :: Int8, j :: Int8) ->+                        ioProperty $+                          let iint = fromIntegral i :: Integer+                              jint = fromIntegral j+                           in safeAdd (toSym i :: SymIntN 8) (toSym j)+                                @=? mrgIf+                                  (iint + jint <~ fromIntegral (i + j))+                                  (throwError Underflow)+                                  ( mrgIf+                                      (iint + jint >~ fromIntegral (i + j))+                                      (throwError Overflow)+                                      (mrgSingle $ toSym $ i + j :: ExceptT ArithException UnionM (SymIntN 8))+                                  ),+                      testProperty "safeMinus on concrete" $ \(i :: Int8, j :: Int8) ->+                        ioProperty $+                          let iint = fromIntegral i :: Integer+                              jint = fromIntegral j+                           in safeMinus (toSym i :: SymIntN 8) (toSym j)+                                @=? mrgIf+                                  (iint - jint <~ fromIntegral (i - j))+                                  (throwError Underflow)+                                  ( mrgIf+                                      (iint - jint >~ fromIntegral (i - j))+                                      (throwError Overflow)+                                      (mrgSingle $ toSym $ i - j :: ExceptT ArithException UnionM (SymIntN 8))+                                  ),+                      testProperty "safeNeg on concrete" $ \(i :: Int8) ->+                        ioProperty $+                          let iint = fromIntegral i :: Integer+                           in safeNeg (toSym i :: SymIntN 8)+                                @=? mrgIf+                                  (-iint <~ fromIntegral (-i))+                                  (throwError Underflow)+                                  ( mrgIf+                                      (-iint >~ fromIntegral (-i))+                                      (throwError Overflow)+                                      (mrgSingle $ toSym $ -i :: ExceptT ArithException UnionM (SymIntN 8))+                                  )+                    ],+                  testGroup+                    "WordN"+                    [ testProperty "safeAdd on concrete" $ \(i :: Word8, j :: Word8) ->+                        ioProperty $+                          let iint = fromIntegral i :: Integer+                              jint = fromIntegral j+                           in safeAdd (toSym i :: SymWordN 8) (toSym j)+                                @=? mrgIf+                                  (iint + jint <~ fromIntegral (i + j))+                                  (throwError Underflow)+                                  ( mrgIf+                                      (iint + jint >~ fromIntegral (i + j))+                                      (throwError Overflow)+                                      (mrgSingle $ toSym $ i + j :: ExceptT ArithException UnionM (SymWordN 8))+                                  ),+                      testProperty "safeMinus on concrete" $ \(i :: Word8, j :: Word8) ->+                        ioProperty $+                          let iint = fromIntegral i :: Integer+                              jint = fromIntegral j+                           in safeMinus (toSym i :: SymWordN 8) (toSym j)+                                @=? mrgIf+                                  (iint - jint <~ fromIntegral (i - j))+                                  (throwError Underflow)+                                  ( mrgIf+                                      (iint - jint >~ fromIntegral (i - j))+                                      (throwError Overflow)+                                      (mrgSingle $ toSym $ i - j :: ExceptT ArithException UnionM (SymWordN 8))+                                  ),+                      testProperty "safeNeg on concrete" $ \(i :: Word8) ->+                        ioProperty $+                          let iint = fromIntegral i :: Integer+                           in safeNeg (toSym i :: SymWordN 8)+                                @=? mrgIf+                                  (-iint <~ fromIntegral (-i))+                                  (throwError Underflow)+                                  ( mrgIf+                                      (-iint >~ fromIntegral (-i))+                                      (throwError Overflow)+                                      (mrgSingle $ toSym $ -i :: ExceptT ArithException UnionM (SymWordN 8))+                                  )+                    ]+                ],+              testGroup+                "SOrd"+                [ testProperty "SOrd on concrete" $ \(i :: Integer, j :: Integer) -> ioProperty $ do+                    let iu :: WordN 4 = fromInteger i+                    let ju :: WordN 4 = fromInteger j+                    let is :: IntN 4 = fromInteger i+                    let js :: IntN 4 = fromInteger j+                    let normalizeu k = k - k `div` 16 * 16+                    let normalizes k = if normalizeu k >= 8 then normalizeu k - 16 else normalizeu k+                    (con iu :: SymWordN 4) <=~ con ju @=? (con (normalizeu i <= normalizeu j) :: SymBool)+                    (con iu :: SymWordN 4) <~ con ju @=? (con (normalizeu i < normalizeu j) :: SymBool)+                    (con iu :: SymWordN 4) >=~ con ju @=? (con (normalizeu i >= normalizeu j) :: SymBool)+                    (con iu :: SymWordN 4) >~ con ju @=? (con (normalizeu i > normalizeu j) :: SymBool)+                    (con iu :: SymWordN 4)+                      `symCompare` con ju+                      @=? (normalizeu i `symCompare` normalizeu j :: UnionM Ordering)+                    (con is :: SymIntN 4) <=~ con js @=? (con (normalizes i <= normalizes j) :: SymBool)+                    (con is :: SymIntN 4) <~ con js @=? (con (normalizes i < normalizes j) :: SymBool)+                    (con is :: SymIntN 4) >=~ con js @=? (con (normalizes i >= normalizes j) :: SymBool)+                    (con is :: SymIntN 4) >~ con js @=? (con (normalizes i > normalizes j) :: SymBool)+                    (con is :: SymIntN 4)+                      `symCompare` con js+                      @=? (normalizes i `symCompare` normalizes j :: UnionM Ordering),+                  testCase "SOrd on symbolic" $ do+                    au <=~ bu @=? SymBool (pevalLeNumTerm aut but)+                    au <~ bu @=? SymBool (pevalLtNumTerm aut but)+                    au >=~ bu @=? SymBool (pevalGeNumTerm aut but)+                    au >~ bu @=? SymBool (pevalGtNumTerm aut but)+                    (au `symCompare` bu :: UnionM Ordering)+                      @=? mrgIf (au <~ bu) (mrgSingle LT) (mrgIf (au ==~ bu) (mrgSingle EQ) (mrgSingle GT))++                    as <=~ bs @=? SymBool (pevalLeNumTerm ast bst)+                    as <~ bs @=? SymBool (pevalLtNumTerm ast bst)+                    as >=~ bs @=? SymBool (pevalGeNumTerm ast bst)+                    as >~ bs @=? SymBool (pevalGtNumTerm ast bst)+                    (as `symCompare` bs :: UnionM Ordering)+                      @=? mrgIf (as <~ bs) (mrgSingle LT) (mrgIf (as ==~ bs) (mrgSingle EQ) (mrgSingle GT))+                ],+              testGroup+                "Bits"+                [ testCase ".&." $ do+                    au .&. bu @=? SymWordN (pevalAndBitsTerm aut but)+                    as .&. bs @=? SymIntN (pevalAndBitsTerm ast bst),+                  testCase ".|." $ do+                    au .|. bu @=? SymWordN (pevalOrBitsTerm aut but)+                    as .|. bs @=? SymIntN (pevalOrBitsTerm ast bst),+                  testCase "xor" $ do+                    au `xor` bu @=? SymWordN (pevalXorBitsTerm aut but)+                    as `xor` bs @=? SymIntN (pevalXorBitsTerm ast bst),+                  testCase "complement" $ do+                    complement au @=? SymWordN (pevalComplementBitsTerm aut)+                    complement as @=? SymIntN (pevalComplementBitsTerm ast),+                  testCase "shift" $ do+                    shift au 1 @=? SymWordN (pevalShiftBitsTerm aut 1)+                    shift as 1 @=? SymIntN (pevalShiftBitsTerm ast 1),+                  testCase "rotate" $ do+                    rotate au 1 @=? SymWordN (pevalRotateBitsTerm aut 1)+                    rotate as 1 @=? SymIntN (pevalRotateBitsTerm ast 1),+                  testCase "bitSize" $ do+                    bitSizeMaybe au @=? Just 4+                    bitSizeMaybe as @=? Just 4,+                  testCase "isSigned" $ do+                    isSigned au @=? False+                    isSigned as @=? True,+                  testCase "testBit would only work on concrete ones" $ do+                    testBit (con 3 :: SymWordN 4) 1 @=? True+                    testBit (con 3 :: SymWordN 4) 2 @=? False+                    testBit (con 3 :: SymIntN 4) 1 @=? True+                    testBit (con 3 :: SymIntN 4) 2 @=? False,+                  testCase "bit would work" $ do+                    bit 1 @=? (con 2 :: SymWordN 4)+                    bit 1 @=? (con 2 :: SymIntN 4),+                  testCase "popCount would only work on concrete ones" $ do+                    popCount (con 3 :: SymWordN 4) @=? 2+                    popCount (con 3 :: SymWordN 4) @=? 2+                    popCount (con 3 :: SymIntN 4) @=? 2+                    popCount (con 3 :: SymIntN 4) @=? 2+                ],+              testGroup+                "sizedBVConcat"+                [ testCase "sizedBVConcat" $+                    sizedBVConcat+                      (ssym "a" :: SymWordN 4)+                      (ssym "b" :: SymWordN 3)+                      @=? SymWordN+                        ( pevalBVConcatTerm+                            (ssymTerm "a" :: Term (WordN 4))+                            (ssymTerm "b" :: Term (WordN 3))+                        )+                ],+              testGroup+                "sizedBVExt for Sym BV"+                [ testCase "sizedBVZext" $ do+                    sizedBVZext (Proxy @6) au @=? SymWordN (pevalBVExtendTerm False (Proxy @6) aut)+                    sizedBVZext (Proxy @6) as @=? SymIntN (pevalBVExtendTerm False (Proxy @6) ast),+                  testCase "sizedBVSext" $ do+                    sizedBVSext (Proxy @6) au @=? SymWordN (pevalBVExtendTerm True (Proxy @6) aut)+                    sizedBVSext (Proxy @6) as @=? SymIntN (pevalBVExtendTerm True (Proxy @6) ast),+                  testCase "sizedBVExt" $ do+                    sizedBVExt (Proxy @6) au @=? SymWordN (pevalBVExtendTerm False (Proxy @6) aut)+                    sizedBVExt (Proxy @6) as @=? SymIntN (pevalBVExtendTerm True (Proxy @6) ast)+                ],+              testGroup+                "sizedBVSelect for Sym BV"+                [ testCase "sizedBVSelect" $ do+                    sizedBVSelect (Proxy @2) (Proxy @1) au+                      @=? SymWordN (pevalBVSelectTerm (Proxy @2) (Proxy @1) aut)+                    sizedBVSelect (Proxy @2) (Proxy @1) as+                      @=? SymIntN (pevalBVSelectTerm (Proxy @2) (Proxy @1) ast)+                ],+              testGroup+                "conversion between Int8 and Sym BV"+                [ testCase "toSym" $ do+                    toSym (0 :: Int8) @=? (con 0 :: SymIntN 8)+                    toSym (-127 :: Int8) @=? (con $ -127 :: SymIntN 8)+                    toSym (-128 :: Int8) @=? (con $ -128 :: SymIntN 8)+                    toSym (127 :: Int8) @=? (con 127 :: SymIntN 8),+                  testCase "toCon" $ do+                    toCon (con 0 :: SymIntN 8) @=? Just (0 :: Int8)+                    toCon (con $ -127 :: SymIntN 8) @=? Just (-127 :: Int8)+                    toCon (con $ -128 :: SymIntN 8) @=? Just (-128 :: Int8)+                    toCon (con 127 :: SymIntN 8) @=? Just (127 :: Int8)+                ],+              testGroup+                "conversion between Word8 and Sym BV"+                [ testCase "toSym" $ do+                    toSym (0 :: Word8) @=? (con 0 :: SymWordN 8)+                    toSym (1 :: Word8) @=? (con 1 :: SymWordN 8)+                    toSym (255 :: Word8) @=? (con 255 :: SymWordN 8),+                  testCase "toCon" $ do+                    toCon (con 0 :: SymWordN 8) @=? Just (0 :: Word8)+                    toCon (con 1 :: SymWordN 8) @=? Just (1 :: Word8)+                    toCon (con 255 :: SymWordN 8) @=? Just (255 :: Word8)+                ]+            ],+      testGroup+        "TabularFun"+        [ testCase "apply" $+            (ssym "a" :: SymInteger =~> SymInteger)+              # ssym "b"+              @=? SymInteger (pevalTabularFunApplyTerm (ssymTerm "a" :: Term (Integer =-> Integer)) (ssymTerm "b"))+        ],+      testGroup+        "GeneralFun"+        [ testCase "evaluate" $ do+            evaluateSym+              False+              (buildModel ("a" := (1 :: Integer), "b" := (2 :: Integer)))+              (con ("a" --> "a" + "b") :: SymInteger -~> SymInteger)+              @=? (con ("a" --> "a" + 2) :: SymInteger -~> SymInteger)+            evaluateSym+              False+              (buildModel ("a" := (1 :: Integer), "b" := (2 :: Integer), "c" := (3 :: Integer)))+              (con ("a" --> con ("b" --> "a" + "b" + "c")) :: SymInteger -~> SymInteger -~> SymInteger)+              @=? con ("a" --> con ("b" --> "a" + "b" + 3) :: Integer --> Integer --> Integer)+        ],+      testGroup+        "Symbolic size"+        [ testCase "symSize" $ do+            symSize (ssym "a" :: SymInteger) @=? 1+            symSize (con 1 :: SymInteger) @=? 1+            symSize (con 1 + ssym "a" :: SymInteger) @=? 3+            symSize (ssym "a" + ssym "a" :: SymInteger) @=? 2+            symSize (-(ssym "a") :: SymInteger) @=? 2+            symSize (ites (ssym "a" :: SymBool) (ssym "b") (ssym "c") :: SymInteger) @=? 4,+          testCase "symsSize" $ symsSize [ssym "a" :: SymInteger, ssym "a" + ssym "a"] @=? 2+        ],+      let asymbol :: TypedSymbol Integer = "a"+          bsymbol :: TypedSymbol Bool = "b"+          csymbol :: TypedSymbol Integer = "c"+          dsymbol :: TypedSymbol Bool = "d"+          esymbol :: TypedSymbol (WordN 4) = "e"+          fsymbol :: TypedSymbol (IntN 4) = "f"+          gsymbol :: TypedSymbol (WordN 16) = "g"+          hsymbol :: TypedSymbol (IntN 16) = "h"+          a :: SymInteger = ssym "a"+          b :: SymBool = "b"+          c :: SymInteger = "c"+          d :: SymBool = "d"+          e :: SymWordN 4 = "e"+          f :: SymIntN 4 = "f"+          g :: SymWordN 16 = "g"+          h :: SymIntN 16 = "h"+          va :: Integer = 1+          vc :: Integer = 2+          ve :: WordN 4 = 3+          vf :: IntN 4 = 4+          vg :: WordN 16 = 5+          vh :: IntN 16 = 6+       in testCase+            "construting Model from ModelSymPair"+            $ do+              buildModel ("a" := va) @=? Model (M.singleton (someTypedSymbol asymbol) (toModelValue va))+              buildModel ("a" := va, "b" := True)+                @=? Model+                  ( M.fromList+                      [ (someTypedSymbol asymbol, toModelValue va),+                        (someTypedSymbol bsymbol, toModelValue True)+                      ]+                  )+              buildModel+                ( "a" := va,+                  "b" := True,+                  "c" := vc+                )+                @=? Model+                  ( M.fromList+                      [ (someTypedSymbol asymbol, toModelValue va),+                        (someTypedSymbol bsymbol, toModelValue True),+                        (someTypedSymbol csymbol, toModelValue vc)+                      ]+                  )+              buildModel+                ( "a" := va,+                  "b" := True,+                  "c" := vc,+                  "d" := False+                )+                @=? Model+                  ( M.fromList+                      [ (someTypedSymbol asymbol, toModelValue va),+                        (someTypedSymbol bsymbol, toModelValue True),+                        (someTypedSymbol csymbol, toModelValue vc),+                        (someTypedSymbol dsymbol, toModelValue False)+                      ]+                  )+              buildModel+                ( "a" := va,+                  "b" := True,+                  "c" := vc,+                  "d" := False,+                  "e" := ve+                )+                @=? Model+                  ( M.fromList+                      [ (someTypedSymbol asymbol, toModelValue va),+                        (someTypedSymbol bsymbol, toModelValue True),+                        (someTypedSymbol csymbol, toModelValue vc),+                        (someTypedSymbol dsymbol, toModelValue False),+                        (someTypedSymbol esymbol, toModelValue ve)+                      ]+                  )+              buildModel+                ( "a" := va,+                  "b" := True,+                  "c" := vc,+                  "d" := False,+                  "e" := ve,+                  "f" := vf+                )+                @=? Model+                  ( M.fromList+                      [ (someTypedSymbol asymbol, toModelValue va),+                        (someTypedSymbol bsymbol, toModelValue True),+                        (someTypedSymbol csymbol, toModelValue vc),+                        (someTypedSymbol dsymbol, toModelValue False),+                        (someTypedSymbol esymbol, toModelValue ve),+                        (someTypedSymbol fsymbol, toModelValue vf)+                      ]+                  )+              buildModel+                ( "a" := va,+                  "b" := True,+                  "c" := vc,+                  "d" := False,+                  "e" := ve,+                  "f" := vf,+                  "g" := vg+                )+                @=? Model+                  ( M.fromList+                      [ (someTypedSymbol asymbol, toModelValue va),+                        (someTypedSymbol bsymbol, toModelValue True),+                        (someTypedSymbol csymbol, toModelValue vc),+                        (someTypedSymbol dsymbol, toModelValue False),+                        (someTypedSymbol esymbol, toModelValue ve),+                        (someTypedSymbol fsymbol, toModelValue vf),+                        (someTypedSymbol gsymbol, toModelValue vg)+                      ]+                  )+              buildModel+                ( "a" := va,+                  "b" := True,+                  "c" := vc,+                  "d" := False,+                  "e" := ve,+                  "f" := vf,+                  "g" := vg,+                  "h" := vh+                )+                @=? Model+                  ( M.fromList+                      [ (someTypedSymbol asymbol, toModelValue va),+                        (someTypedSymbol bsymbol, toModelValue True),+                        (someTypedSymbol csymbol, toModelValue vc),+                        (someTypedSymbol dsymbol, toModelValue False),+                        (someTypedSymbol esymbol, toModelValue ve),+                        (someTypedSymbol fsymbol, toModelValue vf),+                        (someTypedSymbol gsymbol, toModelValue vg),+                        (someTypedSymbol hsymbol, toModelValue vh)                       ]                   )     ]
test/Main.hs view
@@ -25,11 +25,12 @@ import Grisette.Backend.SBV.Data.SMT.CEGISTests import Grisette.Backend.SBV.Data.SMT.LoweringTests import Grisette.Backend.SBV.Data.SMT.TermRewritingTests-import qualified Grisette.IR.SymPrim.Data.BVTests+import Grisette.Core.Control.Monad.UnionMTests+import qualified Grisette.Core.Data.BVTests import qualified Grisette.IR.SymPrim.Data.Prim.BVTests import Grisette.IR.SymPrim.Data.Prim.BitsTests import Grisette.IR.SymPrim.Data.Prim.BoolTests-import Grisette.IR.SymPrim.Data.Prim.IntegerTests+import Grisette.IR.SymPrim.Data.Prim.IntegralTests import Grisette.IR.SymPrim.Data.Prim.ModelTests import Grisette.IR.SymPrim.Data.Prim.NumTests import qualified Grisette.IR.SymPrim.Data.Prim.TabularFunTests@@ -47,10 +48,19 @@ tests =   testGroup     "grisette"-    [ irTests,+    [ coreTests,+      irTests,       sbvTests     ] +coreTests :: TestTree+coreTests =+  testGroup+    "Grisette.Core.Control.Monad.UnionM"+    [ unionMTests,+      Grisette.Core.Data.BVTests.bvTests+    ]+ {- coreTests :: TestTree coreTests =@@ -119,12 +129,11 @@             [ bitsTests,               boolTests,               Grisette.IR.SymPrim.Data.Prim.BVTests.bvTests,-              integerTests,+              integralTests,               modelTests,               numTests,               Grisette.IR.SymPrim.Data.Prim.TabularFunTests.tabularFunTests             ],-          Grisette.IR.SymPrim.Data.BVTests.bvTests,           symPrimTests,           Grisette.IR.SymPrim.Data.TabularFunTests.tabularFunTests         ]