grisette 0.7.0.0 → 0.8.0.0
raw patch · 159 files changed
+17139/−7456 lines, 159 filesdep +libBFdep +th-lift-instancesdep −GlobPVP ok
version bump matches the API change (PVP)
Dependencies added: libBF, th-lift-instances
Dependencies removed: Glob
API changes (from Hackage documentation)
- Grisette.Backend: [Approx] :: (KnownNat n, BVIsNonZero n, KnownIsZero n) => p n -> ApproximationConfig n
- Grisette.Backend: [NoApprox] :: ApproximationConfig 0
- Grisette.Backend: [integerApprox] :: ExtraConfig (i :: Nat) -> ApproximationConfig i
- Grisette.Backend: approximate :: forall p m n. (KnownNat n, BVIsNonZero n, KnownIsZero n) => p n -> GrisetteSMTConfig m -> GrisetteSMTConfig n
- Grisette.Backend: data ApproximationConfig (n :: Nat)
- Grisette.Backend: data ExtraConfig (i :: Nat)
- Grisette.Backend: precise :: GrisetteSMTConfig n -> GrisetteSMTConfig 0
- Grisette.Core: class IEEEConstants a
- Grisette.Core: class (MonadError e m, TryMerge m, Mergeable a) => SafeDivision e a m
- Grisette.Core: genericExtractSym :: (Generic a, GExtractSym Arity0 (Rep a)) => a -> SymbolSet
- Grisette.Core: genericLiftExtractSym :: (Generic1 f, GExtractSym Arity1 (Rep1 f)) => (a -> SymbolSet) -> f a -> SymbolSet
- Grisette.Core: gextractSym :: GExtractSym arity f => ExtractSymArgs arity a -> f a -> SymbolSet
- Grisette.Core: liftExtractSym :: ExtractSym1 f => (a -> SymbolSet) -> f a -> SymbolSet
- Grisette.Core: liftExtractSym2 :: ExtractSym2 f => (a -> SymbolSet) -> (b -> SymbolSet) -> f a b -> SymbolSet
- Grisette.Core: symFpAbs :: IEEEFPOp a => a -> a
- Grisette.Core: symFpAdd :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
- Grisette.Core: symFpDiv :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
- Grisette.Core: symFpFMA :: IEEEFPRoundingOp a mode => mode -> a -> a -> a -> a
- Grisette.Core: symFpMax :: IEEEFPOp a => a -> a -> a
- Grisette.Core: symFpMin :: IEEEFPOp a => a -> a -> a
- Grisette.Core: symFpMul :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
- Grisette.Core: symFpNeg :: IEEEFPOp a => a -> a
- Grisette.Core: symFpRem :: IEEEFPOp a => a -> a -> a
- Grisette.Core: symFpRoundToIntegral :: IEEEFPRoundingOp a mode => mode -> a -> a
- Grisette.Core: symFpSqrt :: IEEEFPRoundingOp a mode => mode -> a -> a
- Grisette.Core: symFpSub :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
- Grisette.Internal.Backend.Solving: [Approx] :: (KnownNat n, BVIsNonZero n, KnownIsZero n) => p n -> ApproximationConfig n
- Grisette.Internal.Backend.Solving: [NoApprox] :: ApproximationConfig 0
- Grisette.Internal.Backend.Solving: [integerApprox] :: ExtraConfig (i :: Nat) -> ApproximationConfig i
- Grisette.Internal.Backend.Solving: approximate :: forall p m n. (KnownNat n, BVIsNonZero n, KnownIsZero n) => p n -> GrisetteSMTConfig m -> GrisetteSMTConfig n
- Grisette.Internal.Backend.Solving: data ApproximationConfig (n :: Nat)
- Grisette.Internal.Backend.Solving: data ExtraConfig (i :: Nat)
- Grisette.Internal.Backend.Solving: instance Control.Monad.IO.Class.MonadIO m => Grisette.Internal.Core.Data.Class.Solver.MonadicSolver (Grisette.Internal.Backend.Solving.SBVIncrementalT n m)
- Grisette.Internal.Backend.Solving: instance Grisette.Internal.Core.Data.Class.Solver.ConfigurableSolver (Grisette.Internal.Backend.Solving.GrisetteSMTConfig n) Grisette.Internal.Backend.Solving.SBVSolverHandle
- Grisette.Internal.Backend.Solving: precise :: GrisetteSMTConfig n -> GrisetteSMTConfig 0
- Grisette.Internal.Backend.SymBiMap: instance GHC.Show.Show Grisette.Internal.Backend.SymBiMap.SymBiMap
- Grisette.Internal.Core.Control.Monad.CBMCExcept: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon (m1 (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCEither e1 a)) (m2 (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCEither e2 b)) => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCExceptT e1 m1 a) (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCExceptT e2 m2 b)
- Grisette.Internal.Core.Control.Monad.CBMCExcept: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym (m1 (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCEither e1 a)) (m2 (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCEither e2 b)) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCExceptT e1 m1 a) (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCExceptT e2 m2 b)
- Grisette.Internal.Core.Data.Class.ExtractSym: genericExtractSym :: (Generic a, GExtractSym Arity0 (Rep a)) => a -> SymbolSet
- Grisette.Internal.Core.Data.Class.ExtractSym: genericLiftExtractSym :: (Generic1 f, GExtractSym Arity1 (Rep1 f)) => (a -> SymbolSet) -> f a -> SymbolSet
- Grisette.Internal.Core.Data.Class.ExtractSym: gextractSym :: GExtractSym arity f => ExtractSymArgs arity a -> f a -> SymbolSet
- Grisette.Internal.Core.Data.Class.ExtractSym: liftExtractSym :: ExtractSym1 f => (a -> SymbolSet) -> f a -> SymbolSet
- Grisette.Internal.Core.Data.Class.ExtractSym: liftExtractSym2 :: ExtractSym2 f => (a -> SymbolSet) -> (b -> SymbolSet) -> f a b -> SymbolSet
- Grisette.Internal.Core.Data.Class.IEEEFP: class IEEEConstants a
- Grisette.Internal.Core.Data.Class.IEEEFP: class SymIEEEFPTraits a
- Grisette.Internal.Core.Data.Class.IEEEFP: instance GHC.Float.RealFloat f => Grisette.Internal.Core.Data.Class.IEEEFP.SymIEEEFPTraits (Grisette.Internal.Core.Data.Class.IEEEFP.ConcreteFloat f)
- Grisette.Internal.Core.Data.Class.IEEEFP: instance Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPRoundingMode Grisette.Internal.SymPrim.FP.FPRoundingMode
- Grisette.Internal.Core.Data.Class.IEEEFP: instance Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPRoundingMode Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
- Grisette.Internal.Core.Data.Class.IEEEFP: instance Grisette.Internal.Core.Data.Class.IEEEFP.SymIEEEFPTraits GHC.Types.Double
- Grisette.Internal.Core.Data.Class.IEEEFP: instance Grisette.Internal.Core.Data.Class.IEEEFP.SymIEEEFPTraits GHC.Types.Float
- Grisette.Internal.Core.Data.Class.IEEEFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEConstants (Grisette.Internal.SymPrim.FP.FP eb sb)
- Grisette.Internal.Core.Data.Class.IEEEFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEConstants (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
- Grisette.Internal.Core.Data.Class.IEEEFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPOp (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
- Grisette.Internal.Core.Data.Class.IEEEFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPRoundingOp (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
- Grisette.Internal.Core.Data.Class.IEEEFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.SymIEEEFPTraits (Grisette.Internal.SymPrim.FP.FP eb sb)
- Grisette.Internal.Core.Data.Class.IEEEFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.SymIEEEFPTraits (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpAbs :: IEEEFPOp a => a -> a
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpAdd :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpDiv :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpFMA :: IEEEFPRoundingOp a mode => mode -> a -> a -> a -> a
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsInfinite :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsNaN :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsNegative :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsNegativeInfinite :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsNegativeZero :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsNormal :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsPoint :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsPositive :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsPositiveInfinite :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsPositiveZero :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsSubnormal :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpIsZero :: SymIEEEFPTraits a => a -> SymBool
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpMax :: IEEEFPOp a => a -> a -> a
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpMin :: IEEEFPOp a => a -> a -> a
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpMul :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpNeg :: IEEEFPOp a => a -> a
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpRem :: IEEEFPOp a => a -> a -> a
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpRoundToIntegral :: IEEEFPRoundingOp a mode => mode -> a -> a
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpSqrt :: IEEEFPRoundingOp a mode => mode -> a -> a
- Grisette.Internal.Core.Data.Class.IEEEFP: symFpSub :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
- Grisette.Internal.Core.Data.Class.Mergeable: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable Grisette.Internal.SymPrim.BV.BitwidthMismatch
- Grisette.Internal.Core.Data.Class.SafeDivision: DivideByZero :: ArithException
- Grisette.Internal.Core.Data.Class.SafeDivision: Overflow :: ArithException
- Grisette.Internal.Core.Data.Class.SafeDivision: Underflow :: ArithException
- Grisette.Internal.Core.Data.Class.SafeDivision: class (MonadError e m, TryMerge m, Mergeable a) => SafeDivision e a m
- Grisette.Internal.Core.Data.Class.SafeDivision: data () => ArithException
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.SymBV.SymIntN n) m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.SymBV.SymWordN n) m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException GHC.Int.Int16 m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException GHC.Int.Int32 m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException GHC.Int.Int64 m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException GHC.Int.Int8 m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException GHC.Num.Integer.Integer m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException GHC.Types.Int m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException GHC.Types.Word m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException GHC.Word.Word16 m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException GHC.Word.Word32 m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException GHC.Word.Word64 m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException GHC.Word.Word8 m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.BV.IntN n) m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.BV.WordN n) m
- Grisette.Internal.Core.Data.Class.SafeDivision: instance (Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision GHC.Exception.Type.ArithException Grisette.Internal.SymPrim.SymInteger.SymInteger m
- Grisette.Internal.Core.Data.Class.SafeDivision: safeDiv :: SafeDivision e a m => a -> a -> m a
- Grisette.Internal.Core.Data.Class.SafeDivision: safeDivMod :: SafeDivision e a m => a -> a -> m (a, a)
- Grisette.Internal.Core.Data.Class.SafeDivision: safeMod :: SafeDivision e a m => a -> a -> m a
- Grisette.Internal.Core.Data.Class.SafeDivision: safeQuot :: SafeDivision e a m => a -> a -> m a
- Grisette.Internal.Core.Data.Class.SafeDivision: safeQuotRem :: SafeDivision e a m => a -> a -> m (a, a)
- Grisette.Internal.Core.Data.Class.SafeDivision: safeRem :: SafeDivision e a m => a -> a -> m a
- Grisette.Internal.Core.Data.Class.ToCon: instance (Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621679116799 a_69895866216791167990, Grisette.Internal.Core.Data.Class.ToCon.ToCon b_6989586621679116800 b_69895866216791168000) => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Either.Either a_6989586621679116799 b_6989586621679116800) (Data.Either.Either a_69895866216791167990 b_69895866216791168000)
- Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621679116799 a_69895866216791167990 => Grisette.Internal.Core.Data.Class.ToCon.ToCon1 (Data.Either.Either a_6989586621679116799) (Data.Either.Either a_69895866216791167990)
- Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621679878422 a_69895866216798784220 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Semigroup.Internal.Dual a_6989586621679878422) (Data.Semigroup.Internal.Dual a_69895866216798784220)
- Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621679878428 a_69895866216798784280 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Semigroup.Internal.Sum a_6989586621679878428) (Data.Semigroup.Internal.Sum a_69895866216798784280)
- Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621679878434 a_69895866216798784340 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Semigroup.Internal.Product a_6989586621679878434) (Data.Semigroup.Internal.Product a_69895866216798784340)
- Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621679878440 a_69895866216798784400 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Monoid.First a_6989586621679878440) (Data.Monoid.First a_69895866216798784400)
- Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621679878446 a_69895866216798784460 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Monoid.Last a_6989586621679878446) (Data.Monoid.Last a_69895866216798784460)
- Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621679878452 a_69895866216798784520 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Ord.Down a_6989586621679878452) (Data.Ord.Down a_69895866216798784520)
- Grisette.Internal.Core.Data.Class.ToSym: instance (GHC.Generics.Generic a, GHC.Generics.Generic b, Grisette.Internal.Core.Data.Class.ToSym.GToSym Grisette.Internal.Utils.Derive.Arity0 (GHC.Generics.Rep a) (GHC.Generics.Rep b)) => Grisette.Internal.Core.Data.Class.ToSym.ToSym a (Generics.Deriving.Default.Default b)
- Grisette.Internal.Core.Data.Class.ToSym: instance (GHC.Generics.Generic1 f1, GHC.Generics.Generic1 f2, Grisette.Internal.Core.Data.Class.ToSym.GToSym Grisette.Internal.Utils.Derive.Arity1 (GHC.Generics.Rep1 f1) (GHC.Generics.Rep1 f2)) => Grisette.Internal.Core.Data.Class.ToSym.ToSym1 f1 (Generics.Deriving.Default.Default1 f2)
- Grisette.Internal.Core.Data.Class.ToSym: instance (GHC.Generics.Generic1 f1, GHC.Generics.Generic1 f2, Grisette.Internal.Core.Data.Class.ToSym.GToSym Grisette.Internal.Utils.Derive.Arity1 (GHC.Generics.Rep1 f1) (GHC.Generics.Rep1 f2), Grisette.Internal.Core.Data.Class.ToSym.ToSym a b) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (f1 a) (Generics.Deriving.Default.Default1 f2 b)
- Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621679116799 a_69895866216791167990, Grisette.Internal.Core.Data.Class.ToSym.ToSym b_6989586621679116800 b_69895866216791168000) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Either.Either a_6989586621679116799 b_6989586621679116800) (Data.Either.Either a_69895866216791167990 b_69895866216791168000)
- Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym s2 s1, Grisette.Internal.Core.Data.Class.ToSym.ToSym1 m1 m2) => Grisette.Internal.Core.Data.Class.ToSym.ToSym1 (Control.Monad.Trans.Reader.ReaderT s1 m1) (Control.Monad.Trans.Reader.ReaderT s2 m2)
- Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym1 f1 f2, Grisette.Internal.Core.Data.Class.ToSym.GToSym Grisette.Internal.Utils.Derive.Arity1 g1 g2) => Grisette.Internal.Core.Data.Class.ToSym.GToSym Grisette.Internal.Utils.Derive.Arity1 (f1 GHC.Generics.:.: g1) (f2 GHC.Generics.:.: g2)
- Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym1 m1 m2, Grisette.Internal.Core.Data.Class.ToSym.ToSym a1 a2) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Control.Monad.Trans.State.Lazy.StateT s m1 a1) (Control.Monad.Trans.State.Lazy.StateT s m2 a2)
- Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym1 m1 m2, Grisette.Internal.Core.Data.Class.ToSym.ToSym a1 a2) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Control.Monad.Trans.State.Strict.StateT s m1 a1) (Control.Monad.Trans.State.Strict.StateT s m2 a2)
- Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (a Grisette.Internal.SymPrim.SymGeneralFun.-~> b) (a Grisette.Internal.SymPrim.SymGeneralFun.-~> b)
- Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (a Grisette.Internal.SymPrim.SymTabularFun.=~> b) (a Grisette.Internal.SymPrim.SymTabularFun.=~> b)
- Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a a
- Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621679116799 a_69895866216791167990 => Grisette.Internal.Core.Data.Class.ToSym.ToSym1 (Data.Either.Either a_6989586621679116799) (Data.Either.Either a_69895866216791167990)
- Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621679878422 a_69895866216798784220 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Semigroup.Internal.Dual a_6989586621679878422) (Data.Semigroup.Internal.Dual a_69895866216798784220)
- Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621679878428 a_69895866216798784280 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Semigroup.Internal.Sum a_6989586621679878428) (Data.Semigroup.Internal.Sum a_69895866216798784280)
- Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621679878434 a_69895866216798784340 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Semigroup.Internal.Product a_6989586621679878434) (Data.Semigroup.Internal.Product a_69895866216798784340)
- Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621679878440 a_69895866216798784400 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Monoid.First a_6989586621679878440) (Data.Monoid.First a_69895866216798784400)
- Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621679878446 a_69895866216798784460 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Monoid.Last a_6989586621679878446) (Data.Monoid.Last a_69895866216798784460)
- Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621679878452 a_69895866216798784520 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Ord.Down a_6989586621679878452) (Data.Ord.Down a_69895866216798784520)
- Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym1 m1 m2 => Grisette.Internal.Core.Data.Class.ToSym.ToSym1 (Control.Monad.Trans.State.Lazy.StateT s m1) (Control.Monad.Trans.State.Lazy.StateT s m2)
- Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym1 m1 m2 => Grisette.Internal.Core.Data.Class.ToSym.ToSym1 (Control.Monad.Trans.State.Strict.StateT s m1) (Control.Monad.Trans.State.Strict.StateT s m2)
- Grisette.Internal.SymPrim.BV: BitwidthMismatch :: BitwidthMismatch
- Grisette.Internal.SymPrim.BV: data BitwidthMismatch
- Grisette.Internal.SymPrim.BV: instance GHC.Classes.Eq Grisette.Internal.SymPrim.BV.BitwidthMismatch
- Grisette.Internal.SymPrim.BV: instance GHC.Classes.Ord Grisette.Internal.SymPrim.BV.BitwidthMismatch
- Grisette.Internal.SymPrim.BV: instance GHC.Exception.Type.Exception Grisette.Internal.SymPrim.BV.BitwidthMismatch
- Grisette.Internal.SymPrim.BV: instance GHC.Generics.Generic Grisette.Internal.SymPrim.BV.BitwidthMismatch
- Grisette.Internal.SymPrim.BV: instance GHC.Show.Show Grisette.Internal.SymPrim.BV.BitwidthMismatch
- Grisette.Internal.SymPrim.FP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCast (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.IntN r)
- Grisette.Internal.SymPrim.FP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCast (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.WordN r)
- Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast Grisette.Internal.SymPrim.FP.FP16 GHC.Int.Int16
- Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast Grisette.Internal.SymPrim.FP.FP16 GHC.Word.Word16
- Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast Grisette.Internal.SymPrim.FP.FP32 GHC.Int.Int32
- Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast Grisette.Internal.SymPrim.FP.FP32 GHC.Types.Float
- Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast Grisette.Internal.SymPrim.FP.FP32 GHC.Word.Word32
- Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast Grisette.Internal.SymPrim.FP.FP64 GHC.Int.Int64
- Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast Grisette.Internal.SymPrim.FP.FP64 GHC.Types.Double
- Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast Grisette.Internal.SymPrim.FP.FP64 GHC.Word.Word64
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.GeneralFun.--> b)
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim f, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim g, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim h, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim f, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim g, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim h) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.GeneralFun.--> (b Grisette.Internal.SymPrim.GeneralFun.--> (c Grisette.Internal.SymPrim.GeneralFun.--> (d Grisette.Internal.SymPrim.GeneralFun.--> (e Grisette.Internal.SymPrim.GeneralFun.--> (f Grisette.Internal.SymPrim.GeneralFun.--> (g Grisette.Internal.SymPrim.GeneralFun.--> h)))))))
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim f, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim g, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim f, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim g) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.GeneralFun.--> (b Grisette.Internal.SymPrim.GeneralFun.--> (c Grisette.Internal.SymPrim.GeneralFun.--> (d Grisette.Internal.SymPrim.GeneralFun.--> (e Grisette.Internal.SymPrim.GeneralFun.--> (f Grisette.Internal.SymPrim.GeneralFun.--> g))))))
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim f, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim f) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.GeneralFun.--> (b Grisette.Internal.SymPrim.GeneralFun.--> (c Grisette.Internal.SymPrim.GeneralFun.--> (d Grisette.Internal.SymPrim.GeneralFun.--> (e Grisette.Internal.SymPrim.GeneralFun.--> f)))))
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim e) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.GeneralFun.--> (b Grisette.Internal.SymPrim.GeneralFun.--> (c Grisette.Internal.SymPrim.GeneralFun.--> (d Grisette.Internal.SymPrim.GeneralFun.--> e))))
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim d) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.GeneralFun.--> (b Grisette.Internal.SymPrim.GeneralFun.--> (c Grisette.Internal.SymPrim.GeneralFun.--> d)))
- Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.GeneralFun.--> (b Grisette.Internal.SymPrim.GeneralFun.--> c))
- Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBVSignConversionTerm Grisette.Internal.SymPrim.BV.WordN Grisette.Internal.SymPrim.BV.IntN
- Grisette.Internal.SymPrim.Prim.Internal.IsZero: [IsZeroEvidence] :: IsZero a ~ 'True => IsZeroCases a
- Grisette.Internal.SymPrim.Prim.Internal.IsZero: [NonZeroEvidence] :: (IsZero a ~ 'False, BVIsNonZero a, 1 <= a) => IsZeroCases a
- Grisette.Internal.SymPrim.Prim.Internal.IsZero: class (KnownNat a) => KnownIsZero (a :: Nat)
- Grisette.Internal.SymPrim.Prim.Internal.IsZero: data IsZeroCases (a :: Nat)
- Grisette.Internal.SymPrim.Prim.Internal.IsZero: instance (GHC.TypeNats.KnownNat a, Grisette.Internal.SymPrim.Prim.Internal.IsZero.IsZero a GHC.Types.~ 'GHC.Types.False, 1 Data.Type.Ord.<= a, Data.SBV.Core.Kind.BVIsNonZero a) => Grisette.Internal.SymPrim.Prim.Internal.IsZero.KnownIsZero a
- Grisette.Internal.SymPrim.Prim.Internal.IsZero: instance GHC.Show.Show (Grisette.Internal.SymPrim.Prim.Internal.IsZero.IsZeroCases a)
- Grisette.Internal.SymPrim.Prim.Internal.IsZero: instance Grisette.Internal.SymPrim.Prim.Internal.IsZero.KnownIsZero 0
- Grisette.Internal.SymPrim.Prim.Internal.IsZero: isZero :: KnownIsZero a => proxy a -> IsZeroCases a
- Grisette.Internal.SymPrim.Prim.Internal.IsZero: type family IsZero (a :: Nat) :: Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: FPMax :: FPBinaryOp
- Grisette.Internal.SymPrim.Prim.Internal.Term: FPMin :: FPBinaryOp
- Grisette.Internal.SymPrim.Prim.Internal.Term: [SqrtTerm] :: PEvalFloatingTerm t => {-# UNPACK #-} !Id -> !Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ToSignedTerm] :: (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) => {-# UNPACK #-} !Id -> !Term (u n) -> Term (s n)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [ToUnsignedTerm] :: (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) => {-# UNPACK #-} !Id -> !Term (s n) -> Term (u n)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [USqrtTerm] :: PEvalFloatingTerm t => !Term t -> UTerm t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [UToSignedTerm] :: (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) => !Term (u n) -> UTerm (s n)
- Grisette.Internal.SymPrim.Prim.Internal.Term: [UToUnsignedTerm] :: (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) => !Term (s n) -> UTerm (u n)
- Grisette.Internal.SymPrim.Prim.Internal.Term: class (PEvalBVTerm s, PEvalBVTerm u, forall n. (KnownNat n, 1 <= n) => SupportedNonFuncPrim (u n), forall n. (KnownNat n, 1 <= n) => SupportedNonFuncPrim (s n), forall n. (KnownNat n, 1 <= n) => SignConversion (u n) (s n)) => PEvalBVSignConversionTerm u s | u -> s, s -> u
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance Control.DeepSeq.NFData (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol t)
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance Control.DeepSeq.NFData Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance Data.Hashable.Class.Hashable (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol t)
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance Data.Hashable.Class.Hashable Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Classes.Eq (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol t)
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Classes.Eq Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Classes.Ord (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol t)
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Classes.Ord Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Show.Show (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol t)
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Show.Show Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim t => Data.String.IsString (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol t)
- Grisette.Internal.SymPrim.Prim.Internal.Term: instance Language.Haskell.TH.Syntax.Lift (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol t)
- Grisette.Internal.SymPrim.Prim.Internal.Term: pevalBVToSignedTerm :: (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) => Term (u n) -> Term (s n)
- Grisette.Internal.SymPrim.Prim.Internal.Term: pevalBVToUnsignedTerm :: (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) => Term (s n) -> Term (u n)
- Grisette.Internal.SymPrim.Prim.Internal.Term: pevalSqrtTerm :: PEvalFloatingTerm t => Term t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: pformat :: forall t. SupportedPrim t => Term t -> String
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvSqrtTerm :: (PEvalFloatingTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvToSigned :: forall n integerBitwidth o p q. (PEvalBVSignConversionTerm u s, KnownIsZero integerBitwidth, KnownNat n, 1 <= n) => o u -> p n -> q integerBitwidth -> SBVType integerBitwidth (u n) -> SBVType integerBitwidth (s n)
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvToUnsigned :: forall n integerBitwidth o p q. (PEvalBVSignConversionTerm u s, KnownIsZero integerBitwidth, KnownNat n, 1 <= n) => o s -> p n -> q integerBitwidth -> SBVType integerBitwidth (s n) -> SBVType integerBitwidth (u n)
- Grisette.Internal.SymPrim.Prim.Internal.Term: sqrtTerm :: PEvalFloatingTerm a => Term a -> Term a
- Grisette.Internal.SymPrim.Prim.Internal.Term: toSignedTerm :: (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) => Term (u n) -> Term (s n)
- Grisette.Internal.SymPrim.Prim.Internal.Term: toUnsignedTerm :: (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) => Term (s n) -> Term (u n)
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvSignConversionTermConstraint :: forall n integerBitwidth p q r. (PEvalBVSignConversionTerm u s, KnownIsZero integerBitwidth, KnownNat n, 1 <= n) => p n -> q integerBitwidth -> ((Integral (NonFuncSBVBaseType integerBitwidth (u n)), Integral (NonFuncSBVBaseType integerBitwidth (s n))) => r) -> r
- Grisette.Internal.SymPrim.Prim.Model: evaluateTerm :: forall a. SupportedPrim a => Bool -> Model -> Term a -> Term a
- Grisette.Internal.SymPrim.Prim.Model: instance Data.Hashable.Class.Hashable Grisette.Internal.SymPrim.Prim.Model.SymbolSet
- Grisette.Internal.SymPrim.Prim.Model: instance GHC.Base.Monoid Grisette.Internal.SymPrim.Prim.Model.SymbolSet
- Grisette.Internal.SymPrim.Prim.Model: instance GHC.Base.Semigroup Grisette.Internal.SymPrim.Prim.Model.SymbolSet
- Grisette.Internal.SymPrim.Prim.Model: instance GHC.Classes.Eq Grisette.Internal.SymPrim.Prim.Model.SymbolSet
- Grisette.Internal.SymPrim.Prim.Model: instance GHC.Generics.Generic Grisette.Internal.SymPrim.Prim.Model.SymbolSet
- Grisette.Internal.SymPrim.Prim.Model: instance GHC.Show.Show Grisette.Internal.SymPrim.Prim.Model.SymbolSet
- Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.ModelOps Grisette.Internal.SymPrim.Prim.Model.Model Grisette.Internal.SymPrim.Prim.Model.SymbolSet Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol
- Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetOps Grisette.Internal.SymPrim.Prim.Model.SymbolSet Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol
- Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol b) Grisette.Internal.SymPrim.Prim.Model.SymbolSet Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol
- Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol c) Grisette.Internal.SymPrim.Prim.Model.SymbolSet Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol
- Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol c, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol d) Grisette.Internal.SymPrim.Prim.Model.SymbolSet Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol
- Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol c, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol d, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol e) Grisette.Internal.SymPrim.Prim.Model.SymbolSet Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol
- Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol c, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol d, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol e, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol f) Grisette.Internal.SymPrim.Prim.Model.SymbolSet Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol
- Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol c, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol d, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol e, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol f, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol g) Grisette.Internal.SymPrim.Prim.Model.SymbolSet Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol
- Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol c, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol d, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol e, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol f, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol g, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol h) Grisette.Internal.SymPrim.Prim.Model.SymbolSet Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol
- Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol t) Grisette.Internal.SymPrim.Prim.Model.SymbolSet Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Data.Hashable.Class.Hashable (bv n)) => Data.Hashable.Class.Hashable (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.Bits (bv n)) => GHC.Bits.Bits (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.FiniteBits (bv n)) => GHC.Bits.FiniteBits (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Classes.Eq (bv n)) => GHC.Classes.Eq (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Classes.Ord (bv n)) => GHC.Classes.Ord (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.ITEOp.ITEOp (bv n)) => Grisette.Internal.Core.Data.Class.ITEOp.ITEOp (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision e (bv n) (Control.Monad.Trans.Except.ExceptT e m), Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch e) m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable e) => Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch e) (Grisette.Internal.SymPrim.SomeBV.SomeBV bv) m
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeLinearArith.SafeLinearArith e (bv n) (Control.Monad.Trans.Except.ExceptT e m), Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch e) m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable e) => Grisette.Internal.Core.Data.Class.SafeLinearArith.SafeLinearArith (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch e) (Grisette.Internal.SymPrim.SomeBV.SomeBV bv) m
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeSymRotate.SafeSymRotate e (bv n) (Control.Monad.Trans.Except.ExceptT e m), Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch e) m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable e) => Grisette.Internal.Core.Data.Class.SafeSymRotate.SafeSymRotate (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch e) (Grisette.Internal.SymPrim.SomeBV.SomeBV bv) m
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeSymShift.SafeSymShift e (bv n) (Control.Monad.Trans.Except.ExceptT e m), Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch e) m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable e) => Grisette.Internal.Core.Data.Class.SafeSymShift.SafeSymShift (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch e) (Grisette.Internal.SymPrim.SomeBV.SomeBV bv) m
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymEq.SymEq (bv n)) => Grisette.Internal.Core.Data.Class.SymEq.SymEq (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymOrd.SymOrd (bv n)) => Grisette.Internal.Core.Data.Class.SymOrd.SymOrd (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymRotate.SymRotate (bv n)) => Grisette.Internal.Core.Data.Class.SymRotate.SymRotate (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymShift.SymShift (bv n)) => Grisette.Internal.Core.Data.Class.SymShift.SymShift (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.TabularFun.=-> b)
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim f, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim g, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim h, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim f, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim g, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim h) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.TabularFun.=-> (b Grisette.Internal.SymPrim.TabularFun.=-> (c Grisette.Internal.SymPrim.TabularFun.=-> (d Grisette.Internal.SymPrim.TabularFun.=-> (e Grisette.Internal.SymPrim.TabularFun.=-> (f Grisette.Internal.SymPrim.TabularFun.=-> (g Grisette.Internal.SymPrim.TabularFun.=-> h)))))))
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim f, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim g, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim f, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim g) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.TabularFun.=-> (b Grisette.Internal.SymPrim.TabularFun.=-> (c Grisette.Internal.SymPrim.TabularFun.=-> (d Grisette.Internal.SymPrim.TabularFun.=-> (e Grisette.Internal.SymPrim.TabularFun.=-> (f Grisette.Internal.SymPrim.TabularFun.=-> g))))))
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim f, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim f) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.TabularFun.=-> (b Grisette.Internal.SymPrim.TabularFun.=-> (c Grisette.Internal.SymPrim.TabularFun.=-> (d Grisette.Internal.SymPrim.TabularFun.=-> (e Grisette.Internal.SymPrim.TabularFun.=-> f)))))
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim e, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim e) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.TabularFun.=-> (b Grisette.Internal.SymPrim.TabularFun.=-> (c Grisette.Internal.SymPrim.TabularFun.=-> (d Grisette.Internal.SymPrim.TabularFun.=-> e))))
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim d, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim d) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.TabularFun.=-> (b Grisette.Internal.SymPrim.TabularFun.=-> (c Grisette.Internal.SymPrim.TabularFun.=-> d)))
- Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim c, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim a, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim b, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim c) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a Grisette.Internal.SymPrim.TabularFun.=-> (b Grisette.Internal.SymPrim.TabularFun.=-> c))
- Grisette.SymPrim: data BitwidthMismatch
- Grisette.Unified: class UnifiedSafeDivision (mode :: EvalModeTag) e a m
- Grisette.Unified: withBaseSafeDivision :: UnifiedSafeDivision mode e a m => (SafeDivision e a m => r) -> r
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: class UnifiedSafeDivision (mode :: EvalModeTag) e a m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymIntN m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymWordN m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeIntN m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeWordN m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision 'Grisette.Unified.Internal.EvalModeTag.Sym GHC.Exception.Type.ArithException Grisette.Internal.SymPrim.SymInteger.SymInteger m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision 'Grisette.Unified.Internal.EvalModeTag.Sym GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.SymBV.SymIntN n) m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision 'Grisette.Unified.Internal.EvalModeTag.Sym GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.SymBV.SymWordN n) m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision mode GHC.Exception.Type.ArithException GHC.Num.Integer.Integer m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision mode GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.BV.IntN n) m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision mode GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.BV.WordN n) m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: instance (Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.Core.Data.Class.SafeDivision.SafeDivision e a m) => Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision mode e a m
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: safeDiv :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m a
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: safeDivMod :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m (a, a)
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: safeMod :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m a
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: safeQuot :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m a
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: safeQuotRem :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m (a, a)
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: safeRem :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m a
- Grisette.Unified.Internal.Class.UnifiedSafeDivision: withBaseSafeDivision :: UnifiedSafeDivision mode e a m => (SafeDivision e a m => r) -> r
- Grisette.Unified.Internal.Class.UnifiedSafeLinearArith: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymIntN m
- Grisette.Unified.Internal.Class.UnifiedSafeLinearArith: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymWordN m
- Grisette.Unified.Internal.Class.UnifiedSafeLinearArith: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeIntN m
- Grisette.Unified.Internal.Class.UnifiedSafeLinearArith: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeWordN m
- Grisette.Unified.Internal.Class.UnifiedSafeSymRotate: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymIntN m
- Grisette.Unified.Internal.Class.UnifiedSafeSymRotate: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymWordN m
- Grisette.Unified.Internal.Class.UnifiedSafeSymRotate: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeIntN m
- Grisette.Unified.Internal.Class.UnifiedSafeSymRotate: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeWordN m
- Grisette.Unified.Internal.Class.UnifiedSafeSymShift: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymIntN m
- Grisette.Unified.Internal.Class.UnifiedSafeSymShift: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymWordN m
- Grisette.Unified.Internal.Class.UnifiedSafeSymShift: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeIntN m
- Grisette.Unified.Internal.Class.UnifiedSafeSymShift: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeWordN m
- Grisette.Unified.Internal.UnifiedBV: instance (Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision mode GHC.Exception.Type.ArithException word m, Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode GHC.Exception.Type.ArithException word m, Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode GHC.Exception.Type.ArithException word m, Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode GHC.Exception.Type.ArithException word m, Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision mode GHC.Exception.Type.ArithException int m, Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode GHC.Exception.Type.ArithException int m, Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode GHC.Exception.Type.ArithException int m, Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode GHC.Exception.Type.ArithException int m, Grisette.Unified.Internal.UnifiedBV.UnifiedBVImpl mode wordn intn n word int) => Grisette.Unified.Internal.UnifiedBV.SafeUnifiedBVImpl mode wordn intn n word int m
- Grisette.Unified.Internal.UnifiedBV: instance (Grisette.Unified.Internal.UnifiedBV.SomeBVPair mode word int, Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) word m, Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) word m, Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) word m, Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) word m, Grisette.Unified.Internal.Class.UnifiedSafeDivision.UnifiedSafeDivision mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) int m, Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) int m, Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) int m, Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) int m) => Grisette.Unified.Internal.UnifiedBV.SafeUnifiedSomeBVImpl mode word int m
- Grisette.Unified.Internal.UnifiedBV: instance (forall (n :: GHC.TypeNats.Nat) (m :: * -> *). (Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.UnifiedBV.SafeUnifiedBV mode n m, forall (m :: * -> *). (Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.BV.BitwidthMismatch GHC.Exception.Type.ArithException) m) => Grisette.Unified.Internal.UnifiedBV.SafeUnifiedSomeBV mode m, forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.UnifiedBV.UnifiedBV mode n, Grisette.Unified.Internal.UnifiedBV.SomeBVPair mode (Grisette.Unified.Internal.UnifiedBV.GetSomeWordN mode) (Grisette.Unified.Internal.UnifiedBV.GetSomeIntN mode)) => Grisette.Unified.Internal.UnifiedBV.AllUnifiedBV mode
- Grisette.Unified.Internal.UnifiedData: instance (forall v. Grisette.Internal.Core.Data.Class.Mergeable.Mergeable v => Grisette.Unified.Internal.UnifiedData.UnifiedData bool v) => Grisette.Unified.Internal.UnifiedData.AllUnifiedData bool
- Grisette.Unified.Internal.UnifiedData: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable v => Grisette.Unified.Internal.UnifiedData.UnifiedDataImpl 'Grisette.Unified.Internal.EvalModeTag.Con v v
+ Grisette.Backend: AUFLIA :: Logic
+ Grisette.Backend: AUFLIRA :: Logic
+ Grisette.Backend: AUFNIRA :: Logic
+ Grisette.Backend: CustomLogic :: String -> Logic
+ Grisette.Backend: DiagnosticOutputChannel :: FilePath -> SMTOption
+ Grisette.Backend: LRA :: Logic
+ Grisette.Backend: Logic_ALL :: Logic
+ Grisette.Backend: Logic_NONE :: Logic
+ Grisette.Backend: OptionKeyword :: String -> [String] -> SMTOption
+ Grisette.Backend: ProduceAbducts :: Bool -> SMTOption
+ Grisette.Backend: ProduceAssertions :: Bool -> SMTOption
+ Grisette.Backend: ProduceAssignments :: Bool -> SMTOption
+ Grisette.Backend: ProduceInterpolants :: Bool -> SMTOption
+ Grisette.Backend: ProduceProofs :: Bool -> SMTOption
+ Grisette.Backend: ProduceUnsatAssumptions :: Bool -> SMTOption
+ Grisette.Backend: ProduceUnsatCores :: Bool -> SMTOption
+ Grisette.Backend: QF_ABV :: Logic
+ Grisette.Backend: QF_AUFBV :: Logic
+ Grisette.Backend: QF_AUFLIA :: Logic
+ Grisette.Backend: QF_AX :: Logic
+ Grisette.Backend: QF_BV :: Logic
+ Grisette.Backend: QF_FD :: Logic
+ Grisette.Backend: QF_FP :: Logic
+ Grisette.Backend: QF_FPBV :: Logic
+ Grisette.Backend: QF_IDL :: Logic
+ Grisette.Backend: QF_LIA :: Logic
+ Grisette.Backend: QF_LRA :: Logic
+ Grisette.Backend: QF_NIA :: Logic
+ Grisette.Backend: QF_NRA :: Logic
+ Grisette.Backend: QF_RDL :: Logic
+ Grisette.Backend: QF_S :: Logic
+ Grisette.Backend: QF_UF :: Logic
+ Grisette.Backend: QF_UFBV :: Logic
+ Grisette.Backend: QF_UFIDL :: Logic
+ Grisette.Backend: QF_UFLIA :: Logic
+ Grisette.Backend: QF_UFLRA :: Logic
+ Grisette.Backend: QF_UFNIRA :: Logic
+ Grisette.Backend: QF_UFNRA :: Logic
+ Grisette.Backend: RandomSeed :: Integer -> SMTOption
+ Grisette.Backend: ReproducibleResourceLimit :: Integer -> SMTOption
+ Grisette.Backend: SMTVerbosity :: Integer -> SMTOption
+ Grisette.Backend: SetInfo :: String -> [String] -> SMTOption
+ Grisette.Backend: SetLogic :: Logic -> SMTOption
+ Grisette.Backend: UFLRA :: Logic
+ Grisette.Backend: UFNIA :: Logic
+ Grisette.Backend: data () => Logic
+ Grisette.Backend: data () => SMTOption
+ Grisette.Backend: newtype ExtraConfig
+ Grisette.Core: bitCastCanonicalValue :: BitCastCanonical from to => proxy from -> to
+ Grisette.Core: bitCastOr :: BitCastOr from to => to -> from -> to
+ Grisette.Core: bitCastOrCanonical :: BitCastOrCanonical from to => from -> to
+ Grisette.Core: class BitCastCanonical from to
+ Grisette.Core: class BitCastOr from to
+ Grisette.Core: class DivOr a
+ Grisette.Core: class FdivOr a
+ Grisette.Core: class IEEEFPConstants a
+ Grisette.Core: class IEEEFPConvertible a fp mode | fp -> mode
+ Grisette.Core: class (IEEEFPConvertible a fp mode, IEEEFPRoundingMode mode) => IEEEFPToAlgReal a fp mode | fp -> mode
+ Grisette.Core: class LogBaseOr a
+ Grisette.Core: class (MonadError e m, TryMerge m, Mergeable b, BitCastOr a b) => SafeBitCast e a b m
+ Grisette.Core: class (MonadError e m, TryMerge m, Mergeable a, DivOr a) => SafeDiv e a m
+ Grisette.Core: class (MonadError e m, TryMerge m, Mergeable a) => SafeFdiv e a m
+ Grisette.Core: class (MonadError e m, TryMerge m, Mergeable a) => SafeLogBase e a m
+ Grisette.Core: class SymFromIntegral from to
+ Grisette.Core: distinct :: Eq a => [a] -> Bool
+ Grisette.Core: divModOr :: DivOr a => (a, a) -> a -> a -> (a, a)
+ Grisette.Core: divModOrZeroDividend :: (DivOr a, Num a) => a -> a -> (a, a)
+ Grisette.Core: divOr :: DivOr a => a -> a -> a -> a
+ Grisette.Core: divOrZero :: (DivOr a, Num a) => a -> a -> a
+ Grisette.Core: extractSymMaybe :: (ExtractSym a, IsSymbolKind knd) => a -> Maybe (SymbolSet knd)
+ Grisette.Core: extractSymMaybe1 :: (ExtractSym1 f, ExtractSym a, IsSymbolKind knd) => f a -> Maybe (SymbolSet knd)
+ Grisette.Core: extractSymMaybe2 :: (ExtractSym2 f, ExtractSym a, ExtractSym b, IsSymbolKind knd) => f a b -> Maybe (SymbolSet knd)
+ Grisette.Core: fdivOr :: FdivOr a => a -> a -> a -> a
+ Grisette.Core: fdivOrZero :: (FdivOr a, Num a) => a -> a -> a
+ Grisette.Core: fpAbs :: IEEEFPOp a => a -> a
+ Grisette.Core: fpAdd :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
+ Grisette.Core: fpDiv :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
+ Grisette.Core: fpFMA :: IEEEFPRoundingOp a mode => mode -> a -> a -> a -> a
+ Grisette.Core: fpMaxNormalized :: IEEEFPConstants a => a
+ Grisette.Core: fpMaxSubnormal :: IEEEFPConstants a => a
+ Grisette.Core: fpMaximum :: IEEEFPOp a => a -> a -> a
+ Grisette.Core: fpMaximumNumber :: IEEEFPOp a => a -> a -> a
+ Grisette.Core: fpMinNormalized :: IEEEFPConstants a => a
+ Grisette.Core: fpMinSubnormal :: IEEEFPConstants a => a
+ Grisette.Core: fpMinimum :: IEEEFPOp a => a -> a -> a
+ Grisette.Core: fpMinimumNumber :: IEEEFPOp a => a -> a -> a
+ Grisette.Core: fpMul :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
+ Grisette.Core: fpNeg :: IEEEFPOp a => a -> a
+ Grisette.Core: fpRem :: IEEEFPOp a => a -> a -> a
+ Grisette.Core: fpRoundToIntegral :: IEEEFPRoundingOp a mode => mode -> a -> a
+ Grisette.Core: fpSqrt :: IEEEFPRoundingOp a mode => mode -> a -> a
+ Grisette.Core: fpSub :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
+ Grisette.Core: fpToAlgReal :: IEEEFPToAlgReal a fp mode => a -> fp -> a
+ Grisette.Core: fromFPOr :: IEEEFPConvertible a fp mode => a -> mode -> fp -> a
+ Grisette.Core: genericExtractSymMaybe :: (Generic a, GExtractSym Arity0 (Rep a), IsSymbolKind knd) => a -> Maybe (SymbolSet knd)
+ Grisette.Core: genericLiftExtractSymMaybe :: (Generic1 f, GExtractSym Arity1 (Rep1 f), IsSymbolKind knd) => (a -> Maybe (SymbolSet knd)) -> f a -> Maybe (SymbolSet knd)
+ Grisette.Core: gextractSymMaybe :: (GExtractSym arity f, IsSymbolKind knd) => ExtractSymArgs arity knd a -> f a -> Maybe (SymbolSet knd)
+ Grisette.Core: liftExtractSymMaybe :: (ExtractSym1 f, IsSymbolKind knd) => (a -> Maybe (SymbolSet knd)) -> f a -> Maybe (SymbolSet knd)
+ Grisette.Core: liftExtractSymMaybe2 :: (ExtractSym2 f, IsSymbolKind knd) => (a -> Maybe (SymbolSet knd)) -> (b -> Maybe (SymbolSet knd)) -> f a b -> Maybe (SymbolSet knd)
+ Grisette.Core: logBaseOr :: LogBaseOr a => a -> a -> a -> a
+ Grisette.Core: logBaseOrZero :: (LogBaseOr a, Num a) => a -> a -> a
+ Grisette.Core: modOr :: DivOr a => a -> a -> a -> a
+ Grisette.Core: modOrDividend :: (DivOr a, Num a) => a -> a -> a
+ Grisette.Core: modifyIdentifier :: (Identifier -> Identifier) -> Symbol -> Symbol
+ Grisette.Core: quotOr :: DivOr a => a -> a -> a -> a
+ Grisette.Core: quotOrZero :: (DivOr a, Num a) => a -> a -> a
+ Grisette.Core: quotRemOr :: DivOr a => (a, a) -> a -> a -> (a, a)
+ Grisette.Core: quotRemOrZeroDividend :: (DivOr a, Num a) => a -> a -> (a, a)
+ Grisette.Core: recipOr :: FdivOr a => a -> a -> a
+ Grisette.Core: recipOrZero :: (FdivOr a, Num a) => a -> a
+ Grisette.Core: remOr :: DivOr a => a -> a -> a -> a
+ Grisette.Core: remOrDividend :: (DivOr a, Num a) => a -> a -> a
+ Grisette.Core: safeBitCast :: SafeBitCast e a b m => a -> m b
+ Grisette.Core: safeFdiv :: SafeFdiv e a m => a -> a -> m a
+ Grisette.Core: safeLogBase :: SafeLogBase e a m => a -> a -> m a
+ Grisette.Core: safeRecip :: (SafeFdiv e a m, Fractional a) => a -> m a
+ Grisette.Core: symDistinct :: SymEq a => [a] -> SymBool
+ Grisette.Core: symFromIntegral :: SymFromIntegral from to => from -> to
+ Grisette.Core: symbolIdentifier :: Symbol -> Identifier
+ Grisette.Core: toFP :: IEEEFPConvertible a fp mode => mode -> a -> fp
+ Grisette.Core: type BitCastOrCanonical a b = (BitCastCanonical a b, BitCastOr a b)
+ Grisette.Internal.Backend.QuantifiedStack: QuantifiedSymbols :: HashSet SomeTypedConstantSymbol -> QuantifiedSymbols
+ Grisette.Internal.Backend.QuantifiedStack: [_symbols] :: QuantifiedSymbols -> HashSet SomeTypedConstantSymbol
+ Grisette.Internal.Backend.QuantifiedStack: addQuantified :: TypedConstantSymbol a -> Dynamic -> QuantifiedStack -> QuantifiedStack
+ Grisette.Internal.Backend.QuantifiedStack: addQuantifiedSymbol :: TypedConstantSymbol a -> QuantifiedSymbols -> QuantifiedSymbols
+ Grisette.Internal.Backend.QuantifiedStack: data QuantifiedStack
+ Grisette.Internal.Backend.QuantifiedStack: emptyQuantifiedStack :: QuantifiedStack
+ Grisette.Internal.Backend.QuantifiedStack: emptyQuantifiedSymbols :: QuantifiedSymbols
+ Grisette.Internal.Backend.QuantifiedStack: instance GHC.Show.Show Grisette.Internal.Backend.QuantifiedStack.QuantifiedSymbols
+ Grisette.Internal.Backend.QuantifiedStack: isQuantifiedSymbol :: (SupportedPrim a, IsSymbolKind knd) => TypedSymbol knd a -> QuantifiedSymbols -> Bool
+ Grisette.Internal.Backend.QuantifiedStack: lookupQuantified :: (HasCallStack, IsSymbolKind knd) => SomeTypedSymbol knd -> QuantifiedStack -> Maybe Dynamic
+ Grisette.Internal.Backend.QuantifiedStack: newtype QuantifiedSymbols
+ Grisette.Internal.Backend.Solving: instance Control.Monad.IO.Class.MonadIO m => Grisette.Internal.Core.Data.Class.Solver.MonadicSolver (Grisette.Internal.Backend.Solving.SBVIncrementalT m)
+ Grisette.Internal.Backend.Solving: instance GHC.Base.Monoid Grisette.Internal.Backend.Solving.TermAll
+ Grisette.Internal.Backend.Solving: instance GHC.Base.Semigroup Grisette.Internal.Backend.Solving.TermAll
+ Grisette.Internal.Backend.Solving: instance Grisette.Internal.Core.Data.Class.Solver.ConfigurableSolver Grisette.Internal.Backend.Solving.GrisetteSMTConfig Grisette.Internal.Backend.Solving.SBVSolverHandle
+ Grisette.Internal.Backend.Solving: newtype ExtraConfig
+ Grisette.Internal.Backend.SymBiMap: QuantifiedSymbolInfo :: Int -> QuantifiedSymbolInfo
+ Grisette.Internal.Backend.SymBiMap: [quantifiedSymbolNum] :: SymBiMap -> Int
+ Grisette.Internal.Backend.SymBiMap: attachNextQuantifiedSymbolInfo :: SymBiMap -> TypedConstantSymbol a -> (SymBiMap, TypedConstantSymbol a)
+ Grisette.Internal.Backend.SymBiMap: instance Control.DeepSeq.NFData Grisette.Internal.Backend.SymBiMap.QuantifiedSymbolInfo
+ Grisette.Internal.Backend.SymBiMap: instance Data.Hashable.Class.Hashable Grisette.Internal.Backend.SymBiMap.QuantifiedSymbolInfo
+ Grisette.Internal.Backend.SymBiMap: instance GHC.Classes.Eq Grisette.Internal.Backend.SymBiMap.QuantifiedSymbolInfo
+ Grisette.Internal.Backend.SymBiMap: instance GHC.Classes.Ord Grisette.Internal.Backend.SymBiMap.QuantifiedSymbolInfo
+ Grisette.Internal.Backend.SymBiMap: instance GHC.Generics.Generic Grisette.Internal.Backend.SymBiMap.QuantifiedSymbolInfo
+ Grisette.Internal.Backend.SymBiMap: instance GHC.Show.Show Grisette.Internal.Backend.SymBiMap.QuantifiedSymbolInfo
+ Grisette.Internal.Backend.SymBiMap: instance Language.Haskell.TH.Syntax.Lift Grisette.Internal.Backend.SymBiMap.QuantifiedSymbolInfo
+ Grisette.Internal.Backend.SymBiMap: newtype QuantifiedSymbolInfo
+ Grisette.Internal.Core.Control.Monad.CBMCExcept: instance (Grisette.Internal.Core.Data.Class.ToCon.ToCon1 m1 m2, Grisette.Internal.Core.Data.Class.ToCon.ToCon e1 e2, Grisette.Internal.Core.Data.Class.ToCon.ToCon a b) => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCExceptT e1 m1 a) (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCExceptT e2 m2 b)
+ Grisette.Internal.Core.Control.Monad.CBMCExcept: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym e1 e2, Grisette.Internal.Core.Data.Class.ToSym.ToSym a b, Grisette.Internal.Core.Data.Class.ToSym.ToSym1 m1 m2) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCExceptT e1 m1 a) (Grisette.Internal.Core.Control.Monad.CBMCExcept.CBMCExceptT e2 m2 b)
+ Grisette.Internal.Core.Data.Class.BitCast: bitCastCanonicalValue :: BitCastCanonical from to => proxy from -> to
+ Grisette.Internal.Core.Data.Class.BitCast: bitCastOr :: BitCastOr from to => to -> from -> to
+ Grisette.Internal.Core.Data.Class.BitCast: bitCastOrCanonical :: BitCastOrCanonical from to => from -> to
+ Grisette.Internal.Core.Data.Class.BitCast: class BitCastCanonical from to
+ Grisette.Internal.Core.Data.Class.BitCast: class BitCastOr from to
+ Grisette.Internal.Core.Data.Class.BitCast: type BitCastOrCanonical a b = (BitCastCanonical a b, BitCastOr a b)
+ Grisette.Internal.Core.Data.Class.EvalSym: instance (Grisette.Internal.Core.Data.Class.EvalSym.EvalSym a, Grisette.Internal.Core.Data.Class.EvalSym.EvalSym b) => Grisette.Internal.Core.Data.Class.EvalSym.EvalSym (a Grisette.Internal.SymPrim.TabularFun.=-> b)
+ Grisette.Internal.Core.Data.Class.EvalSym: instance Grisette.Internal.Core.Data.Class.EvalSym.EvalSym (Grisette.Internal.SymPrim.Prim.Internal.Term.SymType b) => Grisette.Internal.Core.Data.Class.EvalSym.EvalSym (a Grisette.Internal.SymPrim.GeneralFun.--> b)
+ Grisette.Internal.Core.Data.Class.EvalSym: instance Grisette.Internal.Core.Data.Class.EvalSym.EvalSym Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.Core.Data.Class.EvalSym: instance Grisette.Internal.Core.Data.Class.EvalSym.EvalSym Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.Core.Data.Class.EvalSym: instance Grisette.Internal.Core.Data.Class.EvalSym.EvalSym Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.ExtractSym: extractSymMaybe :: (ExtractSym a, IsSymbolKind knd) => a -> Maybe (SymbolSet knd)
+ Grisette.Internal.Core.Data.Class.ExtractSym: extractSymMaybe1 :: (ExtractSym1 f, ExtractSym a, IsSymbolKind knd) => f a -> Maybe (SymbolSet knd)
+ Grisette.Internal.Core.Data.Class.ExtractSym: extractSymMaybe2 :: (ExtractSym2 f, ExtractSym a, ExtractSym b, IsSymbolKind knd) => f a b -> Maybe (SymbolSet knd)
+ Grisette.Internal.Core.Data.Class.ExtractSym: genericExtractSymMaybe :: (Generic a, GExtractSym Arity0 (Rep a), IsSymbolKind knd) => a -> Maybe (SymbolSet knd)
+ Grisette.Internal.Core.Data.Class.ExtractSym: genericLiftExtractSymMaybe :: (Generic1 f, GExtractSym Arity1 (Rep1 f), IsSymbolKind knd) => (a -> Maybe (SymbolSet knd)) -> f a -> Maybe (SymbolSet knd)
+ Grisette.Internal.Core.Data.Class.ExtractSym: gextractSymMaybe :: (GExtractSym arity f, IsSymbolKind knd) => ExtractSymArgs arity knd a -> f a -> Maybe (SymbolSet knd)
+ Grisette.Internal.Core.Data.Class.ExtractSym: instance (Grisette.Internal.Core.Data.Class.ExtractSym.ExtractSym a, Grisette.Internal.Core.Data.Class.ExtractSym.ExtractSym b) => Grisette.Internal.Core.Data.Class.ExtractSym.ExtractSym (a Grisette.Internal.SymPrim.TabularFun.=-> b)
+ Grisette.Internal.Core.Data.Class.ExtractSym: instance Grisette.Internal.Core.Data.Class.ExtractSym.ExtractSym (Grisette.Internal.SymPrim.Prim.Internal.Term.SymType b) => Grisette.Internal.Core.Data.Class.ExtractSym.ExtractSym (a Grisette.Internal.SymPrim.GeneralFun.--> b)
+ Grisette.Internal.Core.Data.Class.ExtractSym: instance Grisette.Internal.Core.Data.Class.ExtractSym.ExtractSym Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.Core.Data.Class.ExtractSym: instance Grisette.Internal.Core.Data.Class.ExtractSym.ExtractSym Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.Core.Data.Class.ExtractSym: instance Grisette.Internal.Core.Data.Class.ExtractSym.ExtractSym Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.ExtractSym: liftExtractSymMaybe :: (ExtractSym1 f, IsSymbolKind knd) => (a -> Maybe (SymbolSet knd)) -> f a -> Maybe (SymbolSet knd)
+ Grisette.Internal.Core.Data.Class.ExtractSym: liftExtractSymMaybe2 :: (ExtractSym2 f, IsSymbolKind knd) => (a -> Maybe (SymbolSet knd)) -> (b -> Maybe (SymbolSet knd)) -> f a b -> Maybe (SymbolSet knd)
+ Grisette.Internal.Core.Data.Class.GenSym: instance Grisette.Internal.Core.Data.Class.GenSym.GenSym () Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.GenSym: instance Grisette.Internal.Core.Data.Class.GenSym.GenSym Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.GenSym: instance Grisette.Internal.Core.Data.Class.GenSym.GenSymSimple () Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.GenSym: instance Grisette.Internal.Core.Data.Class.GenSym.GenSymSimple Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.IEEEFP: class IEEEFPConstants a
+ Grisette.Internal.Core.Data.Class.IEEEFP: class IEEEFPConvertible a fp mode | fp -> mode
+ Grisette.Internal.Core.Data.Class.IEEEFP: class (IEEEFPConvertible a fp mode, IEEEFPRoundingMode mode) => IEEEFPToAlgReal a fp mode | fp -> mode
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpAbs :: IEEEFPOp a => a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpAdd :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpDiv :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpFMA :: IEEEFPRoundingOp a mode => mode -> a -> a -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpMaxNormalized :: IEEEFPConstants a => a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpMaxSubnormal :: IEEEFPConstants a => a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpMaximum :: IEEEFPOp a => a -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpMaximumNumber :: IEEEFPOp a => a -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpMinNormalized :: IEEEFPConstants a => a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpMinSubnormal :: IEEEFPConstants a => a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpMinimum :: IEEEFPOp a => a -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpMinimumNumber :: IEEEFPOp a => a -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpMul :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpNeg :: IEEEFPOp a => a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpRem :: IEEEFPOp a => a -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpRoundToIntegral :: IEEEFPRoundingOp a mode => mode -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpSqrt :: IEEEFPRoundingOp a mode => mode -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpSub :: IEEEFPRoundingOp a mode => mode -> a -> a -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpToAlgReal :: IEEEFPToAlgReal a fp mode => a -> fp -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fromFPOr :: IEEEFPConvertible a fp mode => a -> mode -> fp -> a
+ Grisette.Internal.Core.Data.Class.IEEEFP: toFP :: IEEEFPConvertible a fp mode => mode -> a -> fp
+ Grisette.Internal.Core.Data.Class.ITEOp: instance Grisette.Internal.Core.Data.Class.ITEOp.ITEOp Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.ITEOp: instance Grisette.Internal.Core.Data.Class.ITEOp.ITEOp v => Grisette.Internal.Core.Data.Class.ITEOp.ITEOp (Data.Functor.Identity.Identity v)
+ Grisette.Internal.Core.Data.Class.LogicalOp: instance Grisette.Internal.Core.Data.Class.LogicalOp.LogicalOp a => Grisette.Internal.Core.Data.Class.LogicalOp.LogicalOp (Data.Functor.Identity.Identity a)
+ Grisette.Internal.Core.Data.Class.Mergeable: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable GHC.Real.Rational
+ Grisette.Internal.Core.Data.Class.Mergeable: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.Core.Data.Class.Mergeable: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable Grisette.Internal.SymPrim.AlgReal.AlgRealPoly
+ Grisette.Internal.Core.Data.Class.Mergeable: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable Grisette.Internal.SymPrim.AlgReal.RealPoint
+ Grisette.Internal.Core.Data.Class.Mergeable: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.Core.Data.Class.Mergeable: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.Mergeable: resolveMergeable1 :: forall f a r. (Mergeable1 f, Mergeable a) => (Mergeable (f a) => r) -> r
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint (Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol knd)
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd t)
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd)
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint Grisette.Internal.Core.Data.Symbol.Identifier
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint Grisette.Internal.Core.Data.Symbol.Symbol
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint Grisette.Internal.SymPrim.Prim.Model.Model
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint Grisette.Internal.SymPrim.Prim.ModelValue.ModelValue
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint k => Grisette.Internal.Core.Data.Class.PPrint.PPrint1 (Data.HashMap.Internal.HashMap k)
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint1 Data.HashSet.Internal.HashSet
+ Grisette.Internal.Core.Data.Class.PPrint: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint2 Data.HashMap.Internal.HashMap
+ Grisette.Internal.Core.Data.Class.SafeBitCast: class (MonadError e m, TryMerge m, Mergeable b, BitCastOr a b) => SafeBitCast e a b m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.FP.FP16 GHC.Int.Int16 m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.FP.FP16 GHC.Word.Word16 m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.FP.FP32 GHC.Int.Int32 m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.FP.FP32 GHC.Types.Float m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.FP.FP32 GHC.Word.Word32 m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.FP.FP64 GHC.Int.Int64 m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.FP.FP64 GHC.Types.Double m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.FP.FP64 GHC.Word.Word64 m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb), GHC.TypeNats.KnownNat r, 1 Data.Type.Ord.<= r, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) (Grisette.Internal.SymPrim.SymBV.SymIntN r) m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb), GHC.TypeNats.KnownNat r, 1 Data.Type.Ord.<= r, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) (Grisette.Internal.SymPrim.SymBV.SymWordN r) m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb), GHC.TypeNats.KnownNat r, 1 Data.Type.Ord.<= r, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.IntN r) m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb), GHC.TypeNats.KnownNat r, 1 Data.Type.Ord.<= r, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m) => Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.WordN r) m
+ Grisette.Internal.Core.Data.Class.SafeBitCast: safeBitCast :: SafeBitCast e a b m => a -> m b
+ Grisette.Internal.Core.Data.Class.SafeDiv: DivideByZero :: ArithException
+ Grisette.Internal.Core.Data.Class.SafeDiv: Overflow :: ArithException
+ Grisette.Internal.Core.Data.Class.SafeDiv: Underflow :: ArithException
+ Grisette.Internal.Core.Data.Class.SafeDiv: class DivOr a
+ Grisette.Internal.Core.Data.Class.SafeDiv: class (MonadError e m, TryMerge m, Mergeable a, DivOr a) => SafeDiv e a m
+ Grisette.Internal.Core.Data.Class.SafeDiv: data () => ArithException
+ Grisette.Internal.Core.Data.Class.SafeDiv: divModOr :: DivOr a => (a, a) -> a -> a -> (a, a)
+ Grisette.Internal.Core.Data.Class.SafeDiv: divModOrZeroDividend :: (DivOr a, Num a) => a -> a -> (a, a)
+ Grisette.Internal.Core.Data.Class.SafeDiv: divOr :: DivOr a => a -> a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeDiv: divOrZero :: (DivOr a, Num a) => a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.SymBV.SymIntN n) m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.SymBV.SymWordN n) m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException GHC.Int.Int16 m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException GHC.Int.Int32 m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException GHC.Int.Int64 m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException GHC.Int.Int8 m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException GHC.Num.Integer.Integer m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException GHC.Types.Int m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException GHC.Types.Word m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException GHC.Word.Word16 m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException GHC.Word.Word32 m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException GHC.Word.Word64 m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException GHC.Word.Word8 m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.BV.IntN n) m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.BV.WordN n) m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDiv.DivOr (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDiv.DivOr (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDiv.DivOr (Grisette.Internal.SymPrim.SymBV.SymIntN n)
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDiv.DivOr (Grisette.Internal.SymPrim.SymBV.SymWordN n)
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance (Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv GHC.Exception.Type.ArithException Grisette.Internal.SymPrim.SymInteger.SymInteger m
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr GHC.Int.Int16
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr GHC.Int.Int32
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr GHC.Int.Int64
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr GHC.Int.Int8
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr GHC.Num.Integer.Integer
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr GHC.Types.Int
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr GHC.Types.Word
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr GHC.Word.Word16
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr GHC.Word.Word32
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr GHC.Word.Word64
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr GHC.Word.Word8
+ Grisette.Internal.Core.Data.Class.SafeDiv: instance Grisette.Internal.Core.Data.Class.SafeDiv.DivOr Grisette.Internal.SymPrim.SymInteger.SymInteger
+ Grisette.Internal.Core.Data.Class.SafeDiv: modOr :: DivOr a => a -> a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeDiv: modOrDividend :: (DivOr a, Num a) => a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeDiv: quotOr :: DivOr a => a -> a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeDiv: quotOrZero :: (DivOr a, Num a) => a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeDiv: quotRemOr :: DivOr a => (a, a) -> a -> a -> (a, a)
+ Grisette.Internal.Core.Data.Class.SafeDiv: quotRemOrZeroDividend :: (DivOr a, Num a) => a -> a -> (a, a)
+ Grisette.Internal.Core.Data.Class.SafeDiv: remOr :: DivOr a => a -> a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeDiv: remOrDividend :: (DivOr a, Num a) => a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeDiv: safeDiv :: SafeDiv e a m => a -> a -> m a
+ Grisette.Internal.Core.Data.Class.SafeDiv: safeDivMod :: SafeDiv e a m => a -> a -> m (a, a)
+ Grisette.Internal.Core.Data.Class.SafeDiv: safeMod :: SafeDiv e a m => a -> a -> m a
+ Grisette.Internal.Core.Data.Class.SafeDiv: safeQuot :: SafeDiv e a m => a -> a -> m a
+ Grisette.Internal.Core.Data.Class.SafeDiv: safeQuotRem :: SafeDiv e a m => a -> a -> m (a, a)
+ Grisette.Internal.Core.Data.Class.SafeDiv: safeRem :: SafeDiv e a m => a -> a -> m a
+ Grisette.Internal.Core.Data.Class.SafeFdiv: class FdivOr a
+ Grisette.Internal.Core.Data.Class.SafeFdiv: class (MonadError e m, TryMerge m, Mergeable a) => SafeFdiv e a m
+ Grisette.Internal.Core.Data.Class.SafeFdiv: fdivOr :: FdivOr a => a -> a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeFdiv: fdivOrZero :: (FdivOr a, Num a) => a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeFdiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m) => Grisette.Internal.Core.Data.Class.SafeFdiv.SafeFdiv GHC.Exception.Type.ArithException Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal m
+ Grisette.Internal.Core.Data.Class.SafeFdiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m) => Grisette.Internal.Core.Data.Class.SafeFdiv.SafeFdiv GHC.Exception.Type.ArithException Grisette.Internal.SymPrim.AlgReal.AlgReal m
+ Grisette.Internal.Core.Data.Class.SafeFdiv: instance Grisette.Internal.Core.Data.Class.SafeFdiv.FdivOr Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.Core.Data.Class.SafeFdiv: instance Grisette.Internal.Core.Data.Class.SafeFdiv.FdivOr Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.SafeFdiv: recipOr :: FdivOr a => a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeFdiv: recipOrZero :: (FdivOr a, Num a) => a -> a
+ Grisette.Internal.Core.Data.Class.SafeFdiv: safeFdiv :: SafeFdiv e a m => a -> a -> m a
+ Grisette.Internal.Core.Data.Class.SafeFdiv: safeRecip :: (SafeFdiv e a m, Fractional a) => a -> m a
+ Grisette.Internal.Core.Data.Class.SafeFromFP: class (MonadError e m, TryMerge m, IEEEFPConvertible a fp fprd) => SafeFromFP e a fp fprd m
+ Grisette.Internal.Core.Data.Class.SafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Internal.Core.Data.Class.SafeFromFP.SafeFromFP Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode m
+ Grisette.Internal.Core.Data.Class.SafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Internal.Core.Data.Class.SafeFromFP.SafeFromFP Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.SymInteger.SymInteger (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode m
+ Grisette.Internal.Core.Data.Class.SafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeFromFP.SafeFromFP Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.SymBV.SymIntN n) (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode m
+ Grisette.Internal.Core.Data.Class.SafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeFromFP.SafeFromFP Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.SymBV.SymWordN n) (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode m
+ Grisette.Internal.Core.Data.Class.SafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Internal.Core.Data.Class.SafeFromFP.SafeFromFP Grisette.Internal.SymPrim.FP.NotRepresentableFPError GHC.Num.Integer.Integer (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode m
+ Grisette.Internal.Core.Data.Class.SafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Internal.Core.Data.Class.SafeFromFP.SafeFromFP Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.AlgReal.AlgReal (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode m
+ Grisette.Internal.Core.Data.Class.SafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeFromFP.SafeFromFP Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.BV.IntN n) (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode m
+ Grisette.Internal.Core.Data.Class.SafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeFromFP.SafeFromFP Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.BV.WordN n) (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode m
+ Grisette.Internal.Core.Data.Class.SafeFromFP: safeFromFP :: SafeFromFP e a fp fprd m => fprd -> fp -> m a
+ Grisette.Internal.Core.Data.Class.SafeLogBase: class LogBaseOr a
+ Grisette.Internal.Core.Data.Class.SafeLogBase: class (MonadError e m, TryMerge m, Mergeable a) => SafeLogBase e a m
+ Grisette.Internal.Core.Data.Class.SafeLogBase: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Internal.Core.Control.Monad.Class.Union.MonadUnion m) => Grisette.Internal.Core.Data.Class.SafeLogBase.SafeLogBase GHC.Exception.Type.ArithException Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal m
+ Grisette.Internal.Core.Data.Class.SafeLogBase: instance Grisette.Internal.Core.Data.Class.SafeLogBase.LogBaseOr Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.SafeLogBase: logBaseOr :: LogBaseOr a => a -> a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeLogBase: logBaseOrZero :: (LogBaseOr a, Num a) => a -> a -> a
+ Grisette.Internal.Core.Data.Class.SafeLogBase: safeLogBase :: SafeLogBase e a m => a -> a -> m a
+ Grisette.Internal.Core.Data.Class.SimpleMergeable: instance Grisette.Internal.Core.Data.Class.SimpleMergeable.SimpleMergeable Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.SubstSym: instance Grisette.Internal.Core.Data.Class.SubstSym.SubstSym Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.Core.Data.Class.SubstSym: instance Grisette.Internal.Core.Data.Class.SubstSym.SubstSym Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.Core.Data.Class.SubstSym: instance Grisette.Internal.Core.Data.Class.SubstSym.SubstSym Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.SymEq: distinct :: Eq a => [a] -> Bool
+ Grisette.Internal.Core.Data.Class.SymEq: instance Grisette.Internal.Core.Data.Class.SymEq.SymEq Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.Core.Data.Class.SymEq: instance Grisette.Internal.Core.Data.Class.SymEq.SymEq Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.Core.Data.Class.SymEq: instance Grisette.Internal.Core.Data.Class.SymEq.SymEq Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.SymEq: pairwiseSymDistinct :: SymEq a => [a] -> SymBool
+ Grisette.Internal.Core.Data.Class.SymEq: symDistinct :: SymEq a => [a] -> SymBool
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: bitBlast :: FiniteBits a => a -> [Bool]
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: class (FiniteBits a) => FromBits a
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: class (FiniteBits a, ITEOp a) => SymFiniteBits a
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: fromBits :: FromBits a => [Bool] -> a
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymFiniteBits.SymFiniteBits (Grisette.Internal.SymPrim.SymBV.SymIntN n)
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymFiniteBits.SymFiniteBits (Grisette.Internal.SymPrim.SymBV.SymWordN n)
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits GHC.Int.Int16
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits GHC.Int.Int32
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits GHC.Int.Int64
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits GHC.Int.Int8
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits GHC.Types.Int
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits GHC.Types.Word
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits GHC.Word.Word16
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits GHC.Word.Word32
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits GHC.Word.Word64
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits GHC.Word.Word8
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits Grisette.Internal.SymPrim.SomeBV.SomeIntN
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.FromBits Grisette.Internal.SymPrim.SomeBV.SomeWordN
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.SymFiniteBits (Grisette.Internal.SymPrim.SomeBV.SomeBV Grisette.Internal.SymPrim.SymBV.SymIntN)
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: instance Grisette.Internal.Core.Data.Class.SymFiniteBits.SymFiniteBits (Grisette.Internal.SymPrim.SomeBV.SomeBV Grisette.Internal.SymPrim.SymBV.SymWordN)
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: lsb :: Bits a => a -> Bool
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: msb :: FiniteBits a => a -> Bool
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: setBitTo :: Bits a => a -> Int -> Bool -> a
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: symBitBlast :: SymFiniteBits a => a -> [SymBool]
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: symCountLeadingZeros :: (Num b, ITEOp b, SymFiniteBits a) => a -> b
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: symCountTrailingZeros :: (Num b, ITEOp b, SymFiniteBits a) => a -> b
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: symFromBits :: SymFiniteBits a => [SymBool] -> a
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: symLsb :: SymFiniteBits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: symMsb :: SymFiniteBits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: symPopCount :: (Num b, ITEOp b, SymFiniteBits a) => a -> b
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: symSetBitTo :: SymFiniteBits a => a -> Int -> SymBool -> a
+ Grisette.Internal.Core.Data.Class.SymFiniteBits: symTestBit :: SymFiniteBits a => a -> Int -> SymBool
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: class SymFromIntegral from to
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral (Grisette.Internal.SymPrim.SymBV.SymIntN n) Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral (Grisette.Internal.SymPrim.SymBV.SymIntN n) Grisette.Internal.SymPrim.SymInteger.SymInteger
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral (Grisette.Internal.SymPrim.SymBV.SymWordN n) Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral (Grisette.Internal.SymPrim.SymBV.SymWordN n) Grisette.Internal.SymPrim.SymInteger.SymInteger
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral Grisette.Internal.SymPrim.SymInteger.SymInteger (Grisette.Internal.SymPrim.SymBV.SymIntN n)
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral Grisette.Internal.SymPrim.SymInteger.SymInteger (Grisette.Internal.SymPrim.SymBV.SymWordN n)
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral (Grisette.Internal.SymPrim.SymBV.SymIntN n) (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral (Grisette.Internal.SymPrim.SymBV.SymWordN n) (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, GHC.TypeNats.KnownNat m, 1 Data.Type.Ord.<= n, 1 Data.Type.Ord.<= m) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral (Grisette.Internal.SymPrim.SymBV.SymIntN n) (Grisette.Internal.SymPrim.SymBV.SymIntN m)
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, GHC.TypeNats.KnownNat m, 1 Data.Type.Ord.<= n, 1 Data.Type.Ord.<= m) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral (Grisette.Internal.SymPrim.SymBV.SymIntN n) (Grisette.Internal.SymPrim.SymBV.SymWordN m)
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, GHC.TypeNats.KnownNat m, 1 Data.Type.Ord.<= n, 1 Data.Type.Ord.<= m) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral (Grisette.Internal.SymPrim.SymBV.SymWordN n) (Grisette.Internal.SymPrim.SymBV.SymIntN m)
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance (GHC.TypeNats.KnownNat n, GHC.TypeNats.KnownNat m, 1 Data.Type.Ord.<= n, 1 Data.Type.Ord.<= m) => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral (Grisette.Internal.SymPrim.SymBV.SymWordN n) (Grisette.Internal.SymPrim.SymBV.SymWordN m)
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral Grisette.Internal.SymPrim.SymInteger.SymInteger Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral Grisette.Internal.SymPrim.SymInteger.SymInteger Grisette.Internal.SymPrim.SymInteger.SymInteger
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral Grisette.Internal.SymPrim.SymInteger.SymInteger (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
+ Grisette.Internal.Core.Data.Class.SymFromIntegral: symFromIntegral :: SymFromIntegral from to => from -> to
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: class SymIEEEFPTraits a
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: instance GHC.Float.RealFloat f => Grisette.Internal.Core.Data.Class.SymIEEEFP.SymIEEEFPTraits (Grisette.Internal.Core.Data.Class.SymIEEEFP.ConcreteFloat f)
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: instance Grisette.Internal.Core.Data.Class.SymIEEEFP.SymIEEEFPTraits GHC.Types.Double
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: instance Grisette.Internal.Core.Data.Class.SymIEEEFP.SymIEEEFPTraits GHC.Types.Float
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.SymIEEEFP.SymIEEEFPTraits (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsInfinite :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsNaN :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsNegative :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsNegativeInfinite :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsNegativeZero :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsNormal :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsPoint :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsPositive :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsPositiveInfinite :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsPositiveZero :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsSubnormal :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymIEEEFP: symFpIsZero :: SymIEEEFPTraits a => a -> SymBool
+ Grisette.Internal.Core.Data.Class.SymOrd: instance Grisette.Internal.Core.Data.Class.SymOrd.SymOrd Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.Core.Data.Class.SymOrd: instance Grisette.Internal.Core.Data.Class.SymOrd.SymOrd Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.Core.Data.Class.SymOrd: instance Grisette.Internal.Core.Data.Class.SymOrd.SymOrd Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.ToCon: instance (Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621679108257 a_69895866216791082570, Grisette.Internal.Core.Data.Class.ToCon.ToCon b_6989586621679108258 b_69895866216791082580) => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Either.Either a_6989586621679108257 b_6989586621679108258) (Data.Either.Either a_69895866216791082570 b_69895866216791082580)
+ Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621679108257 a_69895866216791082570 => Grisette.Internal.Core.Data.Class.ToCon.ToCon1 (Data.Either.Either a_6989586621679108257) (Data.Either.Either a_69895866216791082570)
+ Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621680088566 a_69895866216800885660 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Semigroup.Internal.Dual a_6989586621680088566) (Data.Semigroup.Internal.Dual a_69895866216800885660)
+ Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621680088572 a_69895866216800885720 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Semigroup.Internal.Sum a_6989586621680088572) (Data.Semigroup.Internal.Sum a_69895866216800885720)
+ Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621680088578 a_69895866216800885780 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Semigroup.Internal.Product a_6989586621680088578) (Data.Semigroup.Internal.Product a_69895866216800885780)
+ Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621680088584 a_69895866216800885840 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Monoid.First a_6989586621680088584) (Data.Monoid.First a_69895866216800885840)
+ Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621680088590 a_69895866216800885900 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Monoid.Last a_6989586621680088590) (Data.Monoid.Last a_69895866216800885900)
+ Grisette.Internal.Core.Data.Class.ToCon: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon a_6989586621680088596 a_69895866216800885960 => Grisette.Internal.Core.Data.Class.ToCon.ToCon (Data.Ord.Down a_6989586621680088596) (Data.Ord.Down a_69895866216800885960)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (GHC.Generics.Generic a, GHC.Generics.Generic b, Grisette.Internal.Core.Data.Class.ToSym.GToSym Grisette.Internal.Utils.Derive.Arity0 (GHC.Generics.Rep a) (GHC.Generics.Rep b), Grisette.Internal.Core.Data.Class.Mergeable.GMergeable Grisette.Internal.Utils.Derive.Arity0 (GHC.Generics.Rep b)) => Grisette.Internal.Core.Data.Class.ToSym.ToSym a (Generics.Deriving.Default.Default b)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (GHC.Generics.Generic1 f1, GHC.Generics.Generic1 f2, Grisette.Internal.Core.Data.Class.ToSym.GToSym Grisette.Internal.Utils.Derive.Arity1 (GHC.Generics.Rep1 f1) (GHC.Generics.Rep1 f2), Grisette.Internal.Core.Data.Class.Mergeable.GMergeable Grisette.Internal.Utils.Derive.Arity1 (GHC.Generics.Rep1 f2)) => Grisette.Internal.Core.Data.Class.ToSym.ToSym1 f1 (Generics.Deriving.Default.Default1 f2)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (GHC.Generics.Generic1 f1, GHC.Generics.Generic1 f2, Grisette.Internal.Core.Data.Class.ToSym.GToSym Grisette.Internal.Utils.Derive.Arity1 (GHC.Generics.Rep1 f1) (GHC.Generics.Rep1 f2), Grisette.Internal.Core.Data.Class.ToSym.ToSym a b, Grisette.Internal.Core.Data.Class.Mergeable.GMergeable Grisette.Internal.Utils.Derive.Arity1 (GHC.Generics.Rep1 f2)) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (f1 a) (Generics.Deriving.Default.Default1 f2 b)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621679108257 a_69895866216791082570, Grisette.Internal.Core.Data.Class.ToSym.ToSym b_6989586621679108258 b_69895866216791082580) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Either.Either a_6989586621679108257 b_6989586621679108258) (Data.Either.Either a_69895866216791082570 b_69895866216791082580)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym s2 s1, Grisette.Internal.Core.Data.Class.ToSym.ToSym1 m1 m2, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable1 m2) => Grisette.Internal.Core.Data.Class.ToSym.ToSym1 (Control.Monad.Trans.Reader.ReaderT s1 m1) (Control.Monad.Trans.Reader.ReaderT s2 m2)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym1 f1 f2, Grisette.Internal.Core.Data.Class.ToSym.GToSym Grisette.Internal.Utils.Derive.Arity1 g1 g2, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable1 g2) => Grisette.Internal.Core.Data.Class.ToSym.GToSym Grisette.Internal.Utils.Derive.Arity1 (f1 GHC.Generics.:.: g1) (f2 GHC.Generics.:.: g2)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym1 m1 m2, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable s) => Grisette.Internal.Core.Data.Class.ToSym.ToSym1 (Control.Monad.Trans.State.Lazy.StateT s m1) (Control.Monad.Trans.State.Lazy.StateT s m2)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym1 m1 m2, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable s) => Grisette.Internal.Core.Data.Class.ToSym.ToSym1 (Control.Monad.Trans.State.Strict.StateT s m1) (Control.Monad.Trans.State.Strict.StateT s m2)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym1 m1 m2, Grisette.Internal.Core.Data.Class.ToSym.ToSym a1 a2, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable s) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Control.Monad.Trans.State.Lazy.StateT s m1 a1) (Control.Monad.Trans.State.Lazy.StateT s m2 a2)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.Core.Data.Class.ToSym.ToSym1 m1 m2, Grisette.Internal.Core.Data.Class.ToSym.ToSym a1 a2, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable s) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Control.Monad.Trans.State.Strict.StateT s m1 a1) (Control.Monad.Trans.State.Strict.StateT s m2 a2)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (ca Grisette.Internal.SymPrim.GeneralFun.--> cb), Grisette.Internal.SymPrim.Prim.Internal.Term.LinkedRep ca sa, Grisette.Internal.SymPrim.Prim.Internal.Term.LinkedRep cb sb) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (sa Grisette.Internal.SymPrim.SymGeneralFun.-~> sb) (sa Grisette.Internal.SymPrim.SymGeneralFun.-~> sb)
+ Grisette.Internal.Core.Data.Class.ToSym: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (ca Grisette.Internal.SymPrim.TabularFun.=-> cb), Grisette.Internal.SymPrim.Prim.Internal.Term.LinkedRep ca sa, Grisette.Internal.SymPrim.Prim.Internal.Term.LinkedRep cb sb) => Grisette.Internal.Core.Data.Class.ToSym.ToSym (sa Grisette.Internal.SymPrim.SymTabularFun.=~> sb) (sa Grisette.Internal.SymPrim.SymTabularFun.=~> sb)
+ Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable a => Grisette.Internal.Core.Data.Class.ToSym.ToSym a a
+ Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym Grisette.Internal.SymPrim.AlgReal.AlgReal Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621679108257 a_69895866216791082570 => Grisette.Internal.Core.Data.Class.ToSym.ToSym1 (Data.Either.Either a_6989586621679108257) (Data.Either.Either a_69895866216791082570)
+ Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621680088566 a_69895866216800885660 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Semigroup.Internal.Dual a_6989586621680088566) (Data.Semigroup.Internal.Dual a_69895866216800885660)
+ Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621680088572 a_69895866216800885720 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Semigroup.Internal.Sum a_6989586621680088572) (Data.Semigroup.Internal.Sum a_69895866216800885720)
+ Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621680088578 a_69895866216800885780 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Semigroup.Internal.Product a_6989586621680088578) (Data.Semigroup.Internal.Product a_69895866216800885780)
+ Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621680088584 a_69895866216800885840 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Monoid.First a_6989586621680088584) (Data.Monoid.First a_69895866216800885840)
+ Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621680088590 a_69895866216800885900 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Monoid.Last a_6989586621680088590) (Data.Monoid.Last a_69895866216800885900)
+ Grisette.Internal.Core.Data.Class.ToSym: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym a_6989586621680088596 a_69895866216800885960 => Grisette.Internal.Core.Data.Class.ToSym.ToSym (Data.Ord.Down a_6989586621680088596) (Data.Ord.Down a_69895866216800885960)
+ Grisette.Internal.Core.Data.Symbol: modifyIdentifier :: (Identifier -> Identifier) -> Symbol -> Symbol
+ Grisette.Internal.Core.Data.Symbol: symbolIdentifier :: Symbol -> Identifier
+ Grisette.Internal.SymPrim.AlgReal: AlgRealPoly :: [(Integer, Integer)] -> AlgRealPoly
+ Grisette.Internal.SymPrim.AlgReal: ClosedPoint :: Rational -> RealPoint
+ Grisette.Internal.SymPrim.AlgReal: OpenPoint :: Rational -> RealPoint
+ Grisette.Internal.SymPrim.AlgReal: UnsupportedAlgRealOperation :: String -> String -> UnsupportedAlgRealOperation
+ Grisette.Internal.SymPrim.AlgReal: [AlgExactRational] :: Rational -> AlgReal
+ Grisette.Internal.SymPrim.AlgReal: [AlgInexactRational] :: Rational -> AlgReal
+ Grisette.Internal.SymPrim.AlgReal: [AlgInterval] :: RealPoint -> RealPoint -> AlgReal
+ Grisette.Internal.SymPrim.AlgReal: [AlgPolyRoot] :: Integer -> AlgRealPoly -> Maybe String -> AlgReal
+ Grisette.Internal.SymPrim.AlgReal: [msg] :: UnsupportedAlgRealOperation -> String
+ Grisette.Internal.SymPrim.AlgReal: [op] :: UnsupportedAlgRealOperation -> String
+ Grisette.Internal.SymPrim.AlgReal: data AlgReal
+ Grisette.Internal.SymPrim.AlgReal: data RealPoint
+ Grisette.Internal.SymPrim.AlgReal: data UnsupportedAlgRealOperation
+ Grisette.Internal.SymPrim.AlgReal: fromSBVAlgReal :: AlgReal -> AlgReal
+ Grisette.Internal.SymPrim.AlgReal: instance Control.DeepSeq.NFData Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.AlgReal: instance Control.DeepSeq.NFData Grisette.Internal.SymPrim.AlgReal.AlgRealPoly
+ Grisette.Internal.SymPrim.AlgReal: instance Control.DeepSeq.NFData Grisette.Internal.SymPrim.AlgReal.RealPoint
+ Grisette.Internal.SymPrim.AlgReal: instance Data.Hashable.Class.Hashable Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.AlgReal: instance Data.Hashable.Class.Hashable Grisette.Internal.SymPrim.AlgReal.AlgRealPoly
+ Grisette.Internal.SymPrim.AlgReal: instance Data.Hashable.Class.Hashable Grisette.Internal.SymPrim.AlgReal.RealPoint
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Classes.Eq Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Classes.Eq Grisette.Internal.SymPrim.AlgReal.AlgRealPoly
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Classes.Eq Grisette.Internal.SymPrim.AlgReal.RealPoint
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Classes.Ord Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Exception.Type.Exception Grisette.Internal.SymPrim.AlgReal.UnsupportedAlgRealOperation
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Generics.Generic Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Generics.Generic Grisette.Internal.SymPrim.AlgReal.AlgRealPoly
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Generics.Generic Grisette.Internal.SymPrim.AlgReal.RealPoint
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Num.Num Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Real.Fractional Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Real.Real Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Show.Show Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.AlgReal: instance GHC.Show.Show Grisette.Internal.SymPrim.AlgReal.UnsupportedAlgRealOperation
+ Grisette.Internal.SymPrim.AlgReal: instance Language.Haskell.TH.Syntax.Lift Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.AlgReal: instance Language.Haskell.TH.Syntax.Lift Grisette.Internal.SymPrim.AlgReal.AlgRealPoly
+ Grisette.Internal.SymPrim.AlgReal: instance Language.Haskell.TH.Syntax.Lift Grisette.Internal.SymPrim.AlgReal.RealPoint
+ Grisette.Internal.SymPrim.AlgReal: instance Test.QuickCheck.Arbitrary.Arbitrary Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.AlgReal: newtype AlgRealPoly
+ Grisette.Internal.SymPrim.AlgReal: toSBVAlgReal :: AlgReal -> AlgReal
+ Grisette.Internal.SymPrim.AllSyms: instance Grisette.Internal.SymPrim.AllSyms.AllSyms Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.BV: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast (Grisette.Internal.SymPrim.BV.IntN 1) GHC.Types.Bool
+ Grisette.Internal.SymPrim.BV: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast (Grisette.Internal.SymPrim.BV.WordN 1) GHC.Types.Bool
+ Grisette.Internal.SymPrim.BV: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast GHC.Types.Bool (Grisette.Internal.SymPrim.BV.IntN 1)
+ Grisette.Internal.SymPrim.BV: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast GHC.Types.Bool (Grisette.Internal.SymPrim.BV.WordN 1)
+ Grisette.Internal.SymPrim.FP: FPOverflowError :: NotRepresentableFPError
+ Grisette.Internal.SymPrim.FP: FPUnderflowError :: NotRepresentableFPError
+ Grisette.Internal.SymPrim.FP: NaNError :: NotRepresentableFPError
+ Grisette.Internal.SymPrim.FP: class ConvertibleBound bv
+ Grisette.Internal.SymPrim.FP: convertibleLowerBound :: forall eb sb n. (ConvertibleBound bv, ValidFP eb sb, KnownNat n, 1 <= n) => bv n -> FPRoundingMode -> FP eb sb
+ Grisette.Internal.SymPrim.FP: convertibleUpperBound :: forall eb sb n. (ConvertibleBound bv, ValidFP eb sb, KnownNat n, 1 <= n) => bv n -> FPRoundingMode -> FP eb sb
+ Grisette.Internal.SymPrim.FP: data NotRepresentableFPError
+ Grisette.Internal.SymPrim.FP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConvertible (Grisette.Internal.SymPrim.BV.IntN n) (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.FP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConvertible (Grisette.Internal.SymPrim.BV.WordN n) (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.FP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, Grisette.Internal.SymPrim.FP.ValidFP eb' sb') => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConvertible (Grisette.Internal.SymPrim.FP.FP eb' sb') (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.FP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, n GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Internal.SymPrim.FP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, n GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Internal.SymPrim.FP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, n GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCastOr (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Internal.SymPrim.FP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCastOr (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.WordN r)
+ Grisette.Internal.SymPrim.FP: instance GHC.Classes.Eq Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.SymPrim.FP: instance GHC.Classes.Ord Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.SymPrim.FP: instance GHC.Exception.Type.Exception Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.SymPrim.FP: instance GHC.Generics.Generic Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.SymPrim.FP: instance GHC.Show.Show Grisette.Internal.SymPrim.FP.NotRepresentableFPError
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical Grisette.Internal.SymPrim.FP.FP16 GHC.Int.Int16
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical Grisette.Internal.SymPrim.FP.FP16 GHC.Word.Word16
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical Grisette.Internal.SymPrim.FP.FP32 GHC.Int.Int32
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical Grisette.Internal.SymPrim.FP.FP32 GHC.Types.Float
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical Grisette.Internal.SymPrim.FP.FP32 GHC.Word.Word32
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical Grisette.Internal.SymPrim.FP.FP64 GHC.Int.Int64
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical Grisette.Internal.SymPrim.FP.FP64 GHC.Types.Double
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical Grisette.Internal.SymPrim.FP.FP64 GHC.Word.Word64
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastOr Grisette.Internal.SymPrim.FP.FP16 GHC.Int.Int16
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastOr Grisette.Internal.SymPrim.FP.FP16 GHC.Word.Word16
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastOr Grisette.Internal.SymPrim.FP.FP32 GHC.Int.Int32
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastOr Grisette.Internal.SymPrim.FP.FP32 GHC.Types.Float
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastOr Grisette.Internal.SymPrim.FP.FP32 GHC.Word.Word32
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastOr Grisette.Internal.SymPrim.FP.FP64 GHC.Int.Int64
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastOr Grisette.Internal.SymPrim.FP.FP64 GHC.Types.Double
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.BitCast.BitCastOr Grisette.Internal.SymPrim.FP.FP64 GHC.Word.Word64
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPRoundingMode Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.SymPrim.FP.ConvertibleBound Grisette.Internal.SymPrim.BV.IntN
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.SymPrim.FP.ConvertibleBound Grisette.Internal.SymPrim.BV.WordN
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConstants (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConvertible GHC.Num.Integer.Integer (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConvertible Grisette.Internal.SymPrim.AlgReal.AlgReal (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPOp (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPRoundingOp (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.FP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPToAlgReal Grisette.Internal.SymPrim.AlgReal.AlgReal (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Internal.SymPrim.FP: nextFP :: forall eb sb. ValidFP eb sb => FP eb sb -> FP eb sb
+ Grisette.Internal.SymPrim.FP: prevFP :: forall eb sb. ValidFP eb sb => FP eb sb -> FP eb sb
+ Grisette.Internal.SymPrim.FunInstanceGen: supportedPrimFun :: ExpQ -> ExpQ -> ([TypeQ] -> ExpQ) -> String -> String -> Name -> Int -> DecsQ
+ Grisette.Internal.SymPrim.FunInstanceGen: supportedPrimFunUpTo :: ExpQ -> ExpQ -> ([TypeQ] -> ExpQ) -> String -> String -> Name -> Int -> DecsQ
+ Grisette.Internal.SymPrim.GeneralFun: generalSubstSomeTerm :: forall v. (forall a. TypedSymbol 'AnyKind a -> Term a) -> HashSet SomeTypedConstantSymbol -> Term v -> Term v
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> a1)
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> a2))
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> a3)))
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> a4))))
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> (a4 Grisette.Internal.SymPrim.GeneralFun.--> a5)))))
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> (a4 Grisette.Internal.SymPrim.GeneralFun.--> (a5 Grisette.Internal.SymPrim.GeneralFun.--> a6))))))
+ Grisette.Internal.SymPrim.GeneralFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a7) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.GeneralFun.--> (a1 Grisette.Internal.SymPrim.GeneralFun.--> (a2 Grisette.Internal.SymPrim.GeneralFun.--> (a3 Grisette.Internal.SymPrim.GeneralFun.--> (a4 Grisette.Internal.SymPrim.GeneralFun.--> (a5 Grisette.Internal.SymPrim.GeneralFun.--> (a6 Grisette.Internal.SymPrim.GeneralFun.--> a7)))))))
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm (Grisette.Internal.SymPrim.BV.IntN n) (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm (Grisette.Internal.SymPrim.BV.WordN n) (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm: doPevalBitCast :: PEvalBitCastTerm a b => Term a -> Maybe (Term b)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm: instance (n GHC.Types.~ (eb GHC.TypeNats.+ sb), Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastOrTerm (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm: instance (n GHC.Types.~ (eb GHC.TypeNats.+ sb), Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastOrTerm (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm: instance (n GHC.Types.~ (eb GHC.TypeNats.+ sb), Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm (Grisette.Internal.SymPrim.BV.IntN n) (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm: instance (n GHC.Types.~ (eb GHC.TypeNats.+ sb), Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm (Grisette.Internal.SymPrim.BV.WordN n) (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm (Grisette.Internal.SymPrim.BV.IntN 1) GHC.Types.Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm (Grisette.Internal.SymPrim.BV.WordN 1) GHC.Types.Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm GHC.Types.Bool (Grisette.Internal.SymPrim.BV.IntN 1)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalBitCastTerm GHC.Types.Bool (Grisette.Internal.SymPrim.BV.WordN 1)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFloatingTerm: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFloatingTerm Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFractionalTerm: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFractionalTerm Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm (Grisette.Internal.SymPrim.BV.IntN n) GHC.Num.Integer.Integer
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm (Grisette.Internal.SymPrim.BV.IntN n) Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm (Grisette.Internal.SymPrim.BV.WordN n) GHC.Num.Integer.Integer
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm (Grisette.Internal.SymPrim.BV.WordN n) Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm GHC.Num.Integer.Integer (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm GHC.Num.Integer.Integer (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, GHC.TypeNats.KnownNat m, 1 Data.Type.Ord.<= m) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm (Grisette.Internal.SymPrim.BV.IntN n) (Grisette.Internal.SymPrim.BV.IntN m)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, GHC.TypeNats.KnownNat m, 1 Data.Type.Ord.<= m) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm (Grisette.Internal.SymPrim.BV.IntN n) (Grisette.Internal.SymPrim.BV.WordN m)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, GHC.TypeNats.KnownNat m, 1 Data.Type.Ord.<= m) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm (Grisette.Internal.SymPrim.BV.WordN n) (Grisette.Internal.SymPrim.BV.IntN m)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, GHC.TypeNats.KnownNat m, 1 Data.Type.Ord.<= m) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm (Grisette.Internal.SymPrim.BV.WordN n) (Grisette.Internal.SymPrim.BV.WordN m)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm (Grisette.Internal.SymPrim.BV.IntN n) (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm (Grisette.Internal.SymPrim.BV.WordN n) (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm GHC.Num.Integer.Integer (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalFromIntegralTerm GHC.Num.Integer.Integer Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm: genericFPCast :: forall a r. (HasKind a, HasKind r) => SRoundingMode -> SBV a -> SBV r
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalIEEEFPConvertibleTerm (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalIEEEFPConvertibleTerm (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalIEEEFPConvertibleTerm (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalIEEEFPConvertibleTerm GHC.Num.Integer.Integer
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalIEEEFPConvertibleTerm Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalNumTerm Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalOrdTerm: instance Grisette.Internal.SymPrim.Prim.Internal.Term.PEvalOrdTerm Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.NonFuncSBVRep Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SBVRep Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrimConstraint Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.Prim.Internal.Term: AnyKind :: SymbolKind
+ Grisette.Internal.SymPrim.Prim.Internal.Term: ConstantKind :: SymbolKind
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FPMaximum :: FPBinaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FPMaximumNumber :: FPBinaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FPMinimum :: FPBinaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FPMinimumNumber :: FPBinaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingAcos :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingAcosh :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingAsin :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingAsinh :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingAtan :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingAtanh :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingCos :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingCosh :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingExp :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingLog :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingSin :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingSinh :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingSqrt :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingTan :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: FloatingTanh :: FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [BitCastOrTerm] :: PEvalBitCastOrTerm a b => {-# UNPACK #-} !Id -> !Term b -> !Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [BitCastTerm] :: PEvalBitCastTerm a b => {-# UNPACK #-} !Id -> !Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [DistinctTerm] :: SupportedNonFuncPrim t => {-# UNPACK #-} !Id -> !NonEmpty (Term t) -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ExistsTerm] :: SupportedNonFuncPrim t => {-# UNPACK #-} !Id -> !TypedSymbol 'ConstantKind t -> !Term Bool -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FloatingUnaryTerm] :: PEvalFloatingTerm t => {-# UNPACK #-} !Id -> !FloatingUnaryOp -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ForallTerm] :: SupportedNonFuncPrim t => {-# UNPACK #-} !Id -> !TypedSymbol 'ConstantKind t -> !Term Bool -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FromFPOrTerm] :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) => {-# UNPACK #-} !Id -> !Term a -> !Term FPRoundingMode -> !Term (FP eb sb) -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [FromIntegralTerm] :: PEvalFromIntegralTerm a b => {-# UNPACK #-} !Id -> !Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [PowerTerm] :: PEvalFloatingTerm t => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [ToFPTerm] :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) => {-# UNPACK #-} !Id -> !Term FPRoundingMode -> !Term a -> Proxy eb -> Proxy sb -> Term (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UBitCastOrTerm] :: PEvalBitCastOrTerm a b => !Term b -> !Term a -> UTerm b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UBitCastTerm] :: PEvalBitCastTerm a b => !Term a -> UTerm b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UDistinctTerm] :: SupportedNonFuncPrim t => !NonEmpty (Term t) -> UTerm Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UExistsTerm] :: SupportedNonFuncPrim t => !TypedSymbol 'ConstantKind t -> !Term Bool -> UTerm Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UFloatingUnaryTerm] :: PEvalFloatingTerm t => !FloatingUnaryOp -> !Term t -> UTerm t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UForallTerm] :: SupportedNonFuncPrim t => !TypedSymbol 'ConstantKind t -> !Term Bool -> UTerm Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UFromFPOrTerm] :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim FPRoundingMode, SupportedPrim (FP eb sb)) => Term a -> !Term FPRoundingMode -> !Term (FP eb sb) -> UTerm a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UFromIntegralTerm] :: PEvalFromIntegralTerm a b => !Term a -> UTerm b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UPowerTerm] :: PEvalFloatingTerm t => !Term t -> !Term t -> UTerm t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UToFPTerm] :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim FPRoundingMode, SupportedPrim (FP eb sb)) => !Term FPRoundingMode -> !Term a -> Proxy eb -> Proxy sb -> UTerm (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: bitCastOrTerm :: PEvalBitCastOrTerm a b => Term b -> Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: bitCastTerm :: PEvalBitCastTerm a b => Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: castSomeTypedSymbol :: IsSymbolKind knd' => SomeTypedSymbol knd -> Maybe (SomeTypedSymbol knd')
+ Grisette.Internal.SymPrim.Prim.Internal.Term: castTypedSymbol :: (SupportedPrim t, IsSymbolKind knd') => TypedSymbol knd t -> Maybe (TypedSymbol knd' t)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class IsSymbolKind (ty :: SymbolKind) where {
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedNonFuncPrim a, SupportedNonFuncPrim b, BitCastOr a b) => PEvalBitCastOrTerm a b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedNonFuncPrim a, SupportedNonFuncPrim b, BitCast a b) => PEvalBitCastTerm a b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedNonFuncPrim a, SupportedNonFuncPrim b, Integral a, Num b) => PEvalFromIntegralTerm a b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedNonFuncPrim a) => PEvalIEEEFPConvertibleTerm a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: data FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: data SymbolKind
+ Grisette.Internal.SymPrim.Prim.Internal.Term: decideSymbolKind :: IsSymbolKind ty => Either (ty :~~: 'ConstantKind) (ty :~~: 'AnyKind)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: distinctTerm :: SupportedNonFuncPrim a => NonEmpty (Term a) -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: eqHeteroSymbol :: forall ta a tb b. TypedSymbol ta a -> TypedSymbol tb b -> Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: existsTerm :: (SupportedNonFuncPrim t, Typeable t) => TypedSymbol 'ConstantKind t -> Term Bool -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: floatingUnaryTerm :: PEvalFloatingTerm a => FloatingUnaryOp -> Term a -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: forallTerm :: (SupportedNonFuncPrim t, Typeable t) => TypedSymbol 'ConstantKind t -> Term Bool -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: fromFPOrTerm :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim FPRoundingMode, SupportedPrim (FP eb sb)) => Term a -> Term FPRoundingMode -> Term (FP eb sb) -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: fromIntegralTerm :: PEvalFromIntegralTerm a b => Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: funcDummyConstraint :: SupportedPrim t => SBVType t -> SBV Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SBVFreshMonad m, GHC.Base.Monoid w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SBVFreshMonad (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SBVFreshMonad m, GHC.Base.Monoid w) => Grisette.Internal.SymPrim.Prim.Internal.Term.SBVFreshMonad (Control.Monad.Trans.Writer.Lazy.WriterT w m)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim t, Grisette.Internal.SymPrim.Prim.Internal.Term.SymbolKindConstraint knd t, Grisette.Internal.SymPrim.Prim.Internal.Term.IsSymbolKind knd) => Data.String.IsString (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd t)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Control.DeepSeq.NFData (Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Control.DeepSeq.NFData (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd t)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Control.DeepSeq.NFData Grisette.Internal.SymPrim.Prim.Internal.Term.FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Data.Hashable.Class.Hashable (Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Data.Hashable.Class.Hashable (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd t)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Data.Hashable.Class.Hashable Grisette.Internal.SymPrim.Prim.Internal.Term.FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Classes.Eq (Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Classes.Eq (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd t)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Classes.Eq Grisette.Internal.SymPrim.Prim.Internal.Term.FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Classes.Ord (Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Classes.Ord (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd t)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Classes.Ord Grisette.Internal.SymPrim.Prim.Internal.Term.FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Generics.Generic Grisette.Internal.SymPrim.Prim.Internal.Term.FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Show.Show (Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Show.Show (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd t)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance GHC.Show.Show Grisette.Internal.SymPrim.Prim.Internal.Term.FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.IsSymbolKind 'Grisette.Internal.SymPrim.Prim.Internal.Term.AnyKind
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Grisette.Internal.SymPrim.Prim.Internal.Term.IsSymbolKind 'Grisette.Internal.SymPrim.Prim.Internal.Term.ConstantKind
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Language.Haskell.TH.Syntax.Lift (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd t)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: instance Language.Haskell.TH.Syntax.Lift Grisette.Internal.SymPrim.Prim.Internal.Term.FloatingUnaryOp
+ Grisette.Internal.SymPrim.Prim.Internal.Term: isFuncType :: SupportedPrim t => Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: parseScalarSMTModelResult :: forall v r. (SatModel r, Typeable v) => (r -> v) -> ([([CV], CV)], CV) -> v
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalBitCastOrTerm :: PEvalBitCastOrTerm a b => Term b -> Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalBitCastTerm :: PEvalBitCastTerm a b => Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalDistinctTerm :: SupportedPrim t => NonEmpty (Term t) -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalFloatingUnaryTerm :: PEvalFloatingTerm t => FloatingUnaryOp -> Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalFromFPOrTerm :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb) => Term a -> Term FPRoundingMode -> Term (FP eb sb) -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalFromIntegralTerm :: PEvalFromIntegralTerm a b => Term a -> Term b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalPowerTerm :: PEvalFloatingTerm t => Term t -> Term t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalToFPTerm :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb) => Term FPRoundingMode -> Term a -> Term (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pformatTerm :: forall t. SupportedPrim t => Term t -> String
+ Grisette.Internal.SymPrim.Prim.Internal.Term: powerTerm :: PEvalFloatingTerm a => Term a -> Term a -> Term a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvBitCast :: PEvalBitCastTerm a b => SBVType a -> SBVType b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvBitCastOr :: PEvalBitCastOrTerm a b => SBVType b -> SBVType a -> SBVType b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvDistinct :: (SupportedPrim t, EqSymbolic (SBVType t)) => NonEmpty (SBVType t) -> SBV Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvFloatingUnaryTerm :: PEvalFloatingTerm t => FloatingUnaryOp -> SBVType t -> SBVType t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvFromFPOrTerm :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb) => SBVType a -> SBVType FPRoundingMode -> SBVType (FP eb sb) -> SBVType a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvFromIntegralTerm :: PEvalFromIntegralTerm a b => SBVType a -> SBVType b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvPowerTerm :: PEvalFloatingTerm t => SBVType t -> SBVType t -> SBVType t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvToFPTerm :: (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb) => SBVType FPRoundingMode -> SBVType a -> SBVType (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: toFPTerm :: forall a eb sb. (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb, SupportedPrim FPRoundingMode, SupportedPrim (FP eb sb)) => Term FPRoundingMode -> Term a -> Term (FP eb sb)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type NonFuncPrimConstraint a = (SymVal (NonFuncSBVBaseType a), EqSymbolic (SBVType a), Mergeable (SBVType a), SMTDefinable (SBVType a), Mergeable (SBVType a), SBVType a ~ SBV (NonFuncSBVBaseType a), PrimConstraint a)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type SomeTypedAnySymbol = SomeTypedSymbol 'AnyKind
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type SomeTypedConstantSymbol = SomeTypedSymbol 'ConstantKind
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type SymbolKindConstraint ty :: Type -> Constraint;
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type TypedAnySymbol = TypedSymbol 'AnyKind
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type TypedConstantSymbol = TypedSymbol 'ConstantKind
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withSymbolKind :: TypedSymbol knd t -> (IsSymbolKind knd => a) -> a
+ Grisette.Internal.SymPrim.Prim.Model: evalTerm :: SupportedPrim a => Bool -> Model -> HashSet SomeTypedConstantSymbol -> Term a -> Term a
+ Grisette.Internal.SymPrim.Prim.Model: instance Data.Hashable.Class.Hashable (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance GHC.Base.Monoid (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance GHC.Base.Semigroup (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance GHC.Classes.Eq (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance GHC.Generics.Generic (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance GHC.Show.Show (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.ModelOps Grisette.Internal.SymPrim.Prim.Model.Model Grisette.Internal.SymPrim.Prim.Model.AnySymbolSet Grisette.Internal.SymPrim.Prim.Internal.Term.TypedAnySymbol
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetOps (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol knd) (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd b) (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd c) (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd c, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd d) (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd c, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd d, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd e) (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd c, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd d, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd e, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd f) (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd c, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd d, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd e, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd f, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd g) (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd a, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd b, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd c, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd d, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd e, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd f, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd g, Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd h) (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd t) (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep [Grisette.Internal.SymPrim.Prim.Internal.Term.SomeTypedSymbol knd] (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: instance Grisette.Internal.Core.Data.Class.ModelOps.SymbolSetRep [Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd t] (Grisette.Internal.SymPrim.Prim.Model.SymbolSet knd) (Grisette.Internal.SymPrim.Prim.Internal.Term.TypedSymbol knd)
+ Grisette.Internal.SymPrim.Prim.Model: type AnySymbolSet = SymbolSet 'AnyKind
+ Grisette.Internal.SymPrim.Prim.Model: type ConstantSymbolSet = SymbolSet 'ConstantKind
+ Grisette.Internal.SymPrim.Prim.SomeTerm: someTerm :: Term a -> SomeTerm
+ Grisette.Internal.SymPrim.Quantifier: existsFresh :: (HasCallStack, ExtractSym v, MonadFresh m, GenSym spec v, TryMerge m) => spec -> (v -> FreshT Union SymBool) -> m SymBool
+ Grisette.Internal.SymPrim.Quantifier: existsSet :: ConstantSymbolSet -> SymBool -> SymBool
+ Grisette.Internal.SymPrim.Quantifier: existsSym :: (HasCallStack, ExtractSym a) => a -> SymBool -> SymBool
+ Grisette.Internal.SymPrim.Quantifier: forallFresh :: (HasCallStack, ExtractSym v, MonadFresh m, GenSym spec v, TryMerge m) => spec -> (v -> FreshT Union SymBool) -> m SymBool
+ Grisette.Internal.SymPrim.Quantifier: forallSet :: ConstantSymbolSet -> SymBool -> SymBool
+ Grisette.Internal.SymPrim.Quantifier: forallSym :: (HasCallStack, ExtractSym a) => a -> SymBool -> SymBool
+ Grisette.Internal.SymPrim.SomeBV: BitwidthMismatch :: SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: UndeterminedBitwidth :: Text -> SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: [SomeBVLit] :: Integer -> SomeBV bv
+ Grisette.Internal.SymPrim.SomeBV: data SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Data.Hashable.Class.Hashable (bv n), forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Data.Hashable.Class.Hashable (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.Bits (bv n), forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => GHC.Bits.Bits (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Bits.FiniteBits (bv n), forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => GHC.Bits.FiniteBits (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Classes.Eq (bv n), forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => GHC.Classes.Eq (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Classes.Ord (bv n), forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => GHC.Classes.Ord (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.SymPrim.SomeBV.AssignBitWidth (Grisette.Internal.SymPrim.SomeBV.SomeBV bv, Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.SymPrim.SomeBV.AssignBitWidth (Grisette.Internal.SymPrim.SomeBV.SomeBV bv, Grisette.Internal.SymPrim.SomeBV.SomeBV bv, Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.SymPrim.SomeBV.AssignBitWidth (Grisette.Internal.SymPrim.SomeBV.SomeBV bv, Grisette.Internal.SymPrim.SomeBV.SomeBV bv, Grisette.Internal.SymPrim.SomeBV.SomeBV bv, Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.ITEOp.ITEOp (bv n), forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.Core.Data.Class.ITEOp.ITEOp (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDiv.DivOr (bv n), forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.Core.Data.Class.SafeDiv.DivOr (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv e (bv n) (Control.Monad.Trans.Except.ExceptT e m), Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException e) m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable e, forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException e) (Grisette.Internal.SymPrim.SomeBV.SomeBV bv) m
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeLinearArith.SafeLinearArith e (bv n) (Control.Monad.Trans.Except.ExceptT e m), Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException e) m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable e, forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.Core.Data.Class.SafeLinearArith.SafeLinearArith (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException e) (Grisette.Internal.SymPrim.SomeBV.SomeBV bv) m
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeSymRotate.SafeSymRotate e (bv n) (Control.Monad.Trans.Except.ExceptT e m), Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException e) m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable e, forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.Core.Data.Class.SafeSymRotate.SafeSymRotate (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException e) (Grisette.Internal.SymPrim.SomeBV.SomeBV bv) m
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SafeSymShift.SafeSymShift e (bv n) (Control.Monad.Trans.Except.ExceptT e m), Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException e) m, Grisette.Internal.Core.Data.Class.TryMerge.TryMerge m, Grisette.Internal.Core.Data.Class.Mergeable.Mergeable e, forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.Core.Data.Class.SafeSymShift.SafeSymShift (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException e) (Grisette.Internal.SymPrim.SomeBV.SomeBV bv) m
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymEq.SymEq (bv n), forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.Core.Data.Class.SymEq.SymEq (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymOrd.SymOrd (bv n), forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.Core.Data.Class.SymOrd.SymOrd (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymRotate.SymRotate (bv n), forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.Core.Data.Class.SymRotate.SymRotate (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance (forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.SymShift.SymShift (bv n), forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => GHC.Num.Num (bv n)) => Grisette.Internal.Core.Data.Class.SymShift.SymShift (Grisette.Internal.SymPrim.SomeBV.SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: instance Control.DeepSeq.NFData Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance Data.Hashable.Class.Hashable Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance GHC.Classes.Eq Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance GHC.Classes.Ord Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance GHC.Exception.Type.Exception Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance GHC.Generics.Generic Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance GHC.Show.Show Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance Grisette.Internal.Core.Data.Class.EvalSym.EvalSym Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance Grisette.Internal.Core.Data.Class.ExtractSym.ExtractSym Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance Grisette.Internal.Core.Data.Class.PPrint.PPrint Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance Grisette.Internal.Core.Data.Class.SubstSym.SubstSym Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance Grisette.Internal.Core.Data.Class.SymEq.SymEq Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance Grisette.Internal.Core.Data.Class.SymOrd.SymOrd Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance Grisette.Internal.Core.Data.Class.ToCon.ToCon Grisette.Internal.SymPrim.SomeBV.SomeBVException Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SomeBV: instance Grisette.Internal.Core.Data.Class.ToSym.ToSym Grisette.Internal.SymPrim.SomeBV.SomeBVException Grisette.Internal.SymPrim.SomeBV.SomeBVException
+ Grisette.Internal.SymPrim.SymAlgReal: SymAlgReal :: Term AlgReal -> SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance Control.DeepSeq.NFData Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance Data.Hashable.Class.Hashable Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance Data.String.IsString Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance GHC.Classes.Eq Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance GHC.Float.Floating Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance GHC.Generics.Generic Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance GHC.Num.Num Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance GHC.Real.Fractional Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance GHC.Show.Show Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance Grisette.Internal.Core.Data.Class.Function.Apply Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance Grisette.Internal.Core.Data.Class.Solvable.Solvable Grisette.Internal.SymPrim.AlgReal.AlgReal Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance Grisette.Internal.SymPrim.AllSyms.AllSyms Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance Grisette.Internal.SymPrim.Prim.Internal.Term.ConRep Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance Grisette.Internal.SymPrim.Prim.Internal.Term.LinkedRep Grisette.Internal.SymPrim.AlgReal.AlgReal Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance Grisette.Internal.SymPrim.Prim.Internal.Term.SymRep Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: instance Language.Haskell.TH.Syntax.Lift Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Internal.SymPrim.SymAlgReal: newtype SymAlgReal
+ Grisette.Internal.SymPrim.SymBV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.BitCast.BitCast (Grisette.Internal.SymPrim.SymBV.SymIntN n) (Grisette.Internal.SymPrim.SymBV.SymWordN n)
+ Grisette.Internal.SymPrim.SymBV: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.BitCast.BitCast (Grisette.Internal.SymPrim.SymBV.SymWordN n) (Grisette.Internal.SymPrim.SymBV.SymIntN n)
+ Grisette.Internal.SymPrim.SymBV: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast (Grisette.Internal.SymPrim.SymBV.SymIntN 1) Grisette.Internal.SymPrim.SymBool.SymBool
+ Grisette.Internal.SymPrim.SymBV: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast (Grisette.Internal.SymPrim.SymBV.SymWordN 1) Grisette.Internal.SymPrim.SymBool.SymBool
+ Grisette.Internal.SymPrim.SymBV: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast Grisette.Internal.SymPrim.SymBool.SymBool (Grisette.Internal.SymPrim.SymBV.SymIntN 1)
+ Grisette.Internal.SymPrim.SymBV: instance Grisette.Internal.Core.Data.Class.BitCast.BitCast Grisette.Internal.SymPrim.SymBool.SymBool (Grisette.Internal.SymPrim.SymBV.SymWordN 1)
+ Grisette.Internal.SymPrim.SymFP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConvertible (Grisette.Internal.SymPrim.SymBV.SymIntN n) (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
+ Grisette.Internal.SymPrim.SymFP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConvertible (Grisette.Internal.SymPrim.SymBV.SymWordN n) (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
+ Grisette.Internal.SymPrim.SymFP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, Grisette.Internal.SymPrim.FP.ValidFP eb' sb') => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConvertible (Grisette.Internal.SymPrim.SymFP.SymFP eb' sb') (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
+ Grisette.Internal.SymPrim.SymFP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCast (Grisette.Internal.SymPrim.SymBV.SymIntN r) (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
+ Grisette.Internal.SymPrim.SymFP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCast (Grisette.Internal.SymPrim.SymBV.SymWordN r) (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
+ Grisette.Internal.SymPrim.SymFP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) (Grisette.Internal.SymPrim.SymBV.SymIntN r)
+ Grisette.Internal.SymPrim.SymFP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCastCanonical (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) (Grisette.Internal.SymPrim.SymBV.SymWordN r)
+ Grisette.Internal.SymPrim.SymFP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCastOr (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) (Grisette.Internal.SymPrim.SymBV.SymIntN r)
+ Grisette.Internal.SymPrim.SymFP: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, r GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Internal.Core.Data.Class.BitCast.BitCastOr (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) (Grisette.Internal.SymPrim.SymBV.SymWordN r)
+ Grisette.Internal.SymPrim.SymFP: instance Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPRoundingMode Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
+ Grisette.Internal.SymPrim.SymFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConstants (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
+ Grisette.Internal.SymPrim.SymFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConvertible Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
+ Grisette.Internal.SymPrim.SymFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPConvertible Grisette.Internal.SymPrim.SymInteger.SymInteger (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
+ Grisette.Internal.SymPrim.SymFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPOp (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
+ Grisette.Internal.SymPrim.SymFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPRoundingOp (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
+ Grisette.Internal.SymPrim.SymFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.IEEEFP.IEEEFPToAlgReal Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
+ Grisette.Internal.SymPrim.SymFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Internal.Core.Data.Class.SymIEEEFP.SymIEEEFPTraits (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> a1)
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> a2))
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> a3)))
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> a4))))
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> (a4 Grisette.Internal.SymPrim.TabularFun.=-> a5)))))
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> (a4 Grisette.Internal.SymPrim.TabularFun.=-> (a5 Grisette.Internal.SymPrim.TabularFun.=-> a6))))))
+ Grisette.Internal.SymPrim.TabularFun: instance (Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a0, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a1, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a2, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a3, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a4, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a5, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a6, Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedNonFuncPrim a7) => Grisette.Internal.SymPrim.Prim.Internal.Term.SupportedPrim (a0 Grisette.Internal.SymPrim.TabularFun.=-> (a1 Grisette.Internal.SymPrim.TabularFun.=-> (a2 Grisette.Internal.SymPrim.TabularFun.=-> (a3 Grisette.Internal.SymPrim.TabularFun.=-> (a4 Grisette.Internal.SymPrim.TabularFun.=-> (a5 Grisette.Internal.SymPrim.TabularFun.=-> (a6 Grisette.Internal.SymPrim.TabularFun.=-> a7)))))))
+ Grisette.SymPrim: AlgRealPoly :: [(Integer, Integer)] -> AlgRealPoly
+ Grisette.SymPrim: AnyKind :: SymbolKind
+ Grisette.SymPrim: ClosedPoint :: Rational -> RealPoint
+ Grisette.SymPrim: ConstantKind :: SymbolKind
+ Grisette.SymPrim: OpenPoint :: Rational -> RealPoint
+ Grisette.SymPrim: SymAlgReal :: Term AlgReal -> SymAlgReal
+ Grisette.SymPrim: UndeterminedBitwidth :: Text -> SomeBVException
+ Grisette.SymPrim: UnsupportedAlgRealOperation :: String -> String -> UnsupportedAlgRealOperation
+ Grisette.SymPrim: [AlgExactRational] :: Rational -> AlgReal
+ Grisette.SymPrim: [AlgInexactRational] :: Rational -> AlgReal
+ Grisette.SymPrim: [AlgInterval] :: RealPoint -> RealPoint -> AlgReal
+ Grisette.SymPrim: [AlgPolyRoot] :: Integer -> AlgRealPoly -> Maybe String -> AlgReal
+ Grisette.SymPrim: [SomeBVLit] :: Integer -> SomeBV bv
+ Grisette.SymPrim: [SomeTypedSymbol] :: forall knd t. TypeRep t -> TypedSymbol knd t -> SomeTypedSymbol knd
+ Grisette.SymPrim: [msg] :: UnsupportedAlgRealOperation -> String
+ Grisette.SymPrim: [op] :: UnsupportedAlgRealOperation -> String
+ Grisette.SymPrim: class IsSymbolKind (ty :: SymbolKind) where {
+ Grisette.SymPrim: data AlgReal
+ Grisette.SymPrim: data RealPoint
+ Grisette.SymPrim: data SomeBVException
+ Grisette.SymPrim: data SomeTypedSymbol knd
+ Grisette.SymPrim: data SymbolKind
+ Grisette.SymPrim: data UnsupportedAlgRealOperation
+ Grisette.SymPrim: decideSymbolKind :: IsSymbolKind ty => Either (ty :~~: 'ConstantKind) (ty :~~: 'AnyKind)
+ Grisette.SymPrim: existsFresh :: (HasCallStack, ExtractSym v, MonadFresh m, GenSym spec v, TryMerge m) => spec -> (v -> FreshT Union SymBool) -> m SymBool
+ Grisette.SymPrim: existsSet :: ConstantSymbolSet -> SymBool -> SymBool
+ Grisette.SymPrim: existsSym :: (HasCallStack, ExtractSym a) => a -> SymBool -> SymBool
+ Grisette.SymPrim: forallFresh :: (HasCallStack, ExtractSym v, MonadFresh m, GenSym spec v, TryMerge m) => spec -> (v -> FreshT Union SymBool) -> m SymBool
+ Grisette.SymPrim: forallSet :: ConstantSymbolSet -> SymBool -> SymBool
+ Grisette.SymPrim: forallSym :: (HasCallStack, ExtractSym a) => a -> SymBool -> SymBool
+ Grisette.SymPrim: newtype AlgRealPoly
+ Grisette.SymPrim: newtype SymAlgReal
+ Grisette.SymPrim: type AnySymbolSet = SymbolSet 'AnyKind
+ Grisette.SymPrim: type ConstantSymbolSet = SymbolSet 'ConstantKind
+ Grisette.SymPrim: type SomeTypedAnySymbol = SomeTypedSymbol 'AnyKind
+ Grisette.SymPrim: type SomeTypedConstantSymbol = SomeTypedSymbol 'ConstantKind
+ Grisette.SymPrim: type SymbolKindConstraint ty :: Type -> Constraint;
+ Grisette.SymPrim: type TypedAnySymbol = TypedSymbol 'AnyKind
+ Grisette.SymPrim: type TypedConstantSymbol = TypedSymbol 'ConstantKind
+ Grisette.Unified: class (SafeUnifiedBVFPConversionImpl mode (GetWordN mode) (GetIntN mode) (GetFP mode) n eb sb (GetWordN mode n) (GetIntN mode n) (GetFP mode eb sb) (GetFPRoundingMode mode) m) => SafeUnifiedBVFPConversion mode n eb sb m
+ Grisette.Unified: class (SafeUnifiedFPImpl mode (GetFP mode) eb sb (GetFP mode eb sb) (GetFPRoundingMode mode) m, UnifiedSafeFromFP mode NotRepresentableFPError (GetInteger mode) (GetFP mode eb sb) (GetFPRoundingMode mode) m) => SafeUnifiedFP mode eb sb m
+ Grisette.Unified: class (UnifiedAlgRealImpl mode (GetAlgReal mode)) => UnifiedAlgReal (mode :: EvalModeTag)
+ Grisette.Unified: class (UnifiedBVBVConversionImpl mode (GetWordN mode) (GetWordN mode) n0 n1 (GetWordN mode n0) (GetWordN mode n1), UnifiedBVBVConversionImpl mode (GetWordN mode) (GetIntN mode) n0 n1 (GetWordN mode n0) (GetIntN mode n1), UnifiedBVBVConversionImpl mode (GetIntN mode) (GetWordN mode) n0 n1 (GetIntN mode n0) (GetWordN mode n1), UnifiedBVBVConversionImpl mode (GetIntN mode) (GetIntN mode) n0 n1 (GetIntN mode n0) (GetIntN mode n1)) => UnifiedBVBVConversion (mode :: EvalModeTag) n0 n1
+ Grisette.Unified: class (UnifiedBVFPConversionImpl (mode :: EvalModeTag) (GetWordN mode) (GetIntN mode) (GetFP mode) n eb sb (GetWordN mode n) (GetIntN mode n) (GetFP mode eb sb) (GetFPRoundingMode mode)) => UnifiedBVFPConversion mode n eb sb
+ Grisette.Unified: class (UnifiedFPImpl mode (GetFP mode) eb sb (GetFP mode eb sb) (GetFPRoundingMode mode)) => UnifiedFP mode eb sb
+ Grisette.Unified: class (UnifiedFPFPConversionImpl (mode :: EvalModeTag) (GetFP mode) eb0 sb0 eb1 sb1 (GetFP mode eb0 sb0) (GetFP mode eb1 sb1) (GetFPRoundingMode mode)) => UnifiedFPFPConversion mode eb0 sb0 eb1 sb1
+ Grisette.Unified: class UnifiedFiniteBits mode a
+ Grisette.Unified: class UnifiedFromIntegral (mode :: EvalModeTag) a b
+ Grisette.Unified: class UnifiedSafeBitCast (mode :: EvalModeTag) e a b m
+ Grisette.Unified: class UnifiedSafeDiv (mode :: EvalModeTag) e a m
+ Grisette.Unified: class UnifiedSafeFdiv (mode :: EvalModeTag) e a m
+ Grisette.Unified: class UnifiedSafeFromFP (mode :: EvalModeTag) e a fp fprd m
+ Grisette.Unified: safeBitCast :: forall mode e a b m. (MonadError e m, UnifiedSafeBitCast mode e a b m) => a -> m b
+ Grisette.Unified: safeFdiv :: forall mode e a m. (MonadError e m, UnifiedSafeFdiv mode e a m) => a -> a -> m a
+ Grisette.Unified: safeFromFP :: forall mode e a fp fprd m. (UnifiedSafeFromFP mode e a fp fprd m, MonadError e m) => fprd -> fp -> m a
+ Grisette.Unified: simpleMerge :: forall mode a. (Typeable mode, UnifiedSimpleMergeable mode a) => BaseMonad mode a -> a
+ Grisette.Unified: symBitBlast :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => a -> [GetBool mode]
+ Grisette.Unified: symCountLeadingZeros :: forall mode a b. (Typeable mode, UnifiedFiniteBits mode a, Num b, UnifiedITEOp mode b) => a -> b
+ Grisette.Unified: symCountTrailingZeros :: forall mode a b. (Typeable mode, UnifiedFiniteBits mode a, Num b, UnifiedITEOp mode b) => a -> b
+ Grisette.Unified: symDistinct :: forall mode a. (Typeable mode, UnifiedSymEq mode a) => [a] -> GetBool mode
+ Grisette.Unified: symFromBits :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => [GetBool mode] -> a
+ Grisette.Unified: symFromIntegral :: forall mode a b. (Typeable mode, UnifiedFromIntegral mode a b) => a -> b
+ Grisette.Unified: symLsb :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => a -> GetBool mode
+ Grisette.Unified: symMsb :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => a -> GetBool mode
+ Grisette.Unified: symPopCount :: forall mode a b. (Typeable mode, UnifiedFiniteBits mode a, Num b, UnifiedITEOp mode b) => a -> b
+ Grisette.Unified: symSetBitTo :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => a -> Int -> GetBool mode -> a
+ Grisette.Unified: symTestBit :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => a -> Int -> GetBool mode
+ Grisette.Unified: type GetAlgReal mode = real | real -> mode
+ Grisette.Unified: type GetFP mode = (f :: Nat -> Nat -> Type) | f -> mode
+ Grisette.Unified: type GetFPRoundingMode mode = r | r -> mode
+ Grisette.Unified: withBaseFiniteBits :: UnifiedFiniteBits mode a => (If (IsConMode mode) (FiniteBits a, FromBits a) (SymFiniteBits a) => r) -> r
+ Grisette.Unified: withBaseFromIntegral :: UnifiedFromIntegral mode a b => (If (IsConMode mode) (Integral a, Num b) (SymFromIntegral a b) => r) -> r
+ Grisette.Unified: withBaseSafeBitCast :: UnifiedSafeBitCast mode e a b m => (SafeBitCast e a b m => r) -> r
+ Grisette.Unified: withBaseSafeDiv :: UnifiedSafeDiv mode e a m => (SafeDiv e a m => r) -> r
+ Grisette.Unified: withBaseSafeFromFP :: UnifiedSafeFromFP mode e a fp fprd m => (SafeFromFP e a fp fprd m => r) -> r
+ Grisette.Unified: withBaseUnifiedSafeFdiv :: UnifiedSafeFdiv mode e a m => (SafeFdiv e a m => r) -> r
+ Grisette.Unified.Internal.BVBVConversion: class (forall n0 n1. (KnownNat n0, KnownNat n1, 1 <= n0, 1 <= n1) => UnifiedBVBVConversion mode n0 n1) => AllUnifiedBVBVConversion mode
+ Grisette.Unified.Internal.BVBVConversion: class (UnifiedBVBVConversionImpl mode (GetWordN mode) (GetWordN mode) n0 n1 (GetWordN mode n0) (GetWordN mode n1), UnifiedBVBVConversionImpl mode (GetWordN mode) (GetIntN mode) n0 n1 (GetWordN mode n0) (GetIntN mode n1), UnifiedBVBVConversionImpl mode (GetIntN mode) (GetWordN mode) n0 n1 (GetIntN mode n0) (GetWordN mode n1), UnifiedBVBVConversionImpl mode (GetIntN mode) (GetIntN mode) n0 n1 (GetIntN mode n0) (GetIntN mode n1)) => UnifiedBVBVConversion (mode :: EvalModeTag) n0 n1
+ Grisette.Unified.Internal.BVBVConversion: instance (GHC.TypeNats.KnownNat n0, 1 Data.Type.Ord.<= n0, GHC.TypeNats.KnownNat n1, 1 Data.Type.Ord.<= n1) => Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Con Grisette.Internal.SymPrim.BV.IntN Grisette.Internal.SymPrim.BV.IntN n0 n1 (Grisette.Internal.SymPrim.BV.IntN n0) (Grisette.Internal.SymPrim.BV.IntN n1)
+ Grisette.Unified.Internal.BVBVConversion: instance (GHC.TypeNats.KnownNat n0, 1 Data.Type.Ord.<= n0, GHC.TypeNats.KnownNat n1, 1 Data.Type.Ord.<= n1) => Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Con Grisette.Internal.SymPrim.BV.IntN Grisette.Internal.SymPrim.BV.WordN n0 n1 (Grisette.Internal.SymPrim.BV.IntN n0) (Grisette.Internal.SymPrim.BV.WordN n1)
+ Grisette.Unified.Internal.BVBVConversion: instance (GHC.TypeNats.KnownNat n0, 1 Data.Type.Ord.<= n0, GHC.TypeNats.KnownNat n1, 1 Data.Type.Ord.<= n1) => Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Con Grisette.Internal.SymPrim.BV.WordN Grisette.Internal.SymPrim.BV.IntN n0 n1 (Grisette.Internal.SymPrim.BV.WordN n0) (Grisette.Internal.SymPrim.BV.IntN n1)
+ Grisette.Unified.Internal.BVBVConversion: instance (GHC.TypeNats.KnownNat n0, 1 Data.Type.Ord.<= n0, GHC.TypeNats.KnownNat n1, 1 Data.Type.Ord.<= n1) => Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Con Grisette.Internal.SymPrim.BV.WordN Grisette.Internal.SymPrim.BV.WordN n0 n1 (Grisette.Internal.SymPrim.BV.WordN n0) (Grisette.Internal.SymPrim.BV.WordN n1)
+ Grisette.Unified.Internal.BVBVConversion: instance (GHC.TypeNats.KnownNat n0, 1 Data.Type.Ord.<= n0, GHC.TypeNats.KnownNat n1, 1 Data.Type.Ord.<= n1) => Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymBV.SymIntN Grisette.Internal.SymPrim.SymBV.SymIntN n0 n1 (Grisette.Internal.SymPrim.SymBV.SymIntN n0) (Grisette.Internal.SymPrim.SymBV.SymIntN n1)
+ Grisette.Unified.Internal.BVBVConversion: instance (GHC.TypeNats.KnownNat n0, 1 Data.Type.Ord.<= n0, GHC.TypeNats.KnownNat n1, 1 Data.Type.Ord.<= n1) => Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymBV.SymIntN Grisette.Internal.SymPrim.SymBV.SymWordN n0 n1 (Grisette.Internal.SymPrim.SymBV.SymIntN n0) (Grisette.Internal.SymPrim.SymBV.SymWordN n1)
+ Grisette.Unified.Internal.BVBVConversion: instance (GHC.TypeNats.KnownNat n0, 1 Data.Type.Ord.<= n0, GHC.TypeNats.KnownNat n1, 1 Data.Type.Ord.<= n1) => Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymBV.SymWordN Grisette.Internal.SymPrim.SymBV.SymIntN n0 n1 (Grisette.Internal.SymPrim.SymBV.SymWordN n0) (Grisette.Internal.SymPrim.SymBV.SymIntN n1)
+ Grisette.Unified.Internal.BVBVConversion: instance (GHC.TypeNats.KnownNat n0, 1 Data.Type.Ord.<= n0, GHC.TypeNats.KnownNat n1, 1 Data.Type.Ord.<= n1) => Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymBV.SymWordN Grisette.Internal.SymPrim.SymBV.SymWordN n0 n1 (Grisette.Internal.SymPrim.SymBV.SymWordN n0) (Grisette.Internal.SymPrim.SymBV.SymWordN n1)
+ Grisette.Unified.Internal.BVBVConversion: instance (Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl mode (Grisette.Unified.Internal.UnifiedBV.GetWordN mode) (Grisette.Unified.Internal.UnifiedBV.GetWordN mode) n0 n1 (Grisette.Unified.Internal.UnifiedBV.GetWordN mode n0) (Grisette.Unified.Internal.UnifiedBV.GetWordN mode n1), Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl mode (Grisette.Unified.Internal.UnifiedBV.GetWordN mode) (Grisette.Unified.Internal.UnifiedBV.GetIntN mode) n0 n1 (Grisette.Unified.Internal.UnifiedBV.GetWordN mode n0) (Grisette.Unified.Internal.UnifiedBV.GetIntN mode n1), Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl mode (Grisette.Unified.Internal.UnifiedBV.GetIntN mode) (Grisette.Unified.Internal.UnifiedBV.GetWordN mode) n0 n1 (Grisette.Unified.Internal.UnifiedBV.GetIntN mode n0) (Grisette.Unified.Internal.UnifiedBV.GetWordN mode n1), Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversionImpl mode (Grisette.Unified.Internal.UnifiedBV.GetIntN mode) (Grisette.Unified.Internal.UnifiedBV.GetIntN mode) n0 n1 (Grisette.Unified.Internal.UnifiedBV.GetIntN mode n0) (Grisette.Unified.Internal.UnifiedBV.GetIntN mode n1)) => Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversion mode n0 n1
+ Grisette.Unified.Internal.BVBVConversion: instance (forall (n0 :: GHC.TypeNats.Nat) (n1 :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n0, GHC.TypeNats.KnownNat n1, 1 Data.Type.Ord.<= n0, 1 Data.Type.Ord.<= n1) => Grisette.Unified.Internal.BVBVConversion.UnifiedBVBVConversion mode n0 n1) => Grisette.Unified.Internal.BVBVConversion.AllUnifiedBVBVConversion mode
+ Grisette.Unified.Internal.BVFPConversion: class (forall n eb sb. (ValidFP eb sb, KnownNat n, 1 <= n, n ~ (eb + sb)) => UnifiedBVFPConversion mode n eb sb, forall n eb sb m. (UnifiedBranching mode m, ValidFP eb sb, KnownNat n, 1 <= n, n ~ (eb + sb), MonadError NotRepresentableFPError m) => SafeUnifiedBVFPConversion mode n eb sb m) => AllUnifiedBVFPConversion mode
+ Grisette.Unified.Internal.BVFPConversion: class (SafeUnifiedBVFPConversionImpl mode (GetWordN mode) (GetIntN mode) (GetFP mode) n eb sb (GetWordN mode n) (GetIntN mode n) (GetFP mode eb sb) (GetFPRoundingMode mode) m) => SafeUnifiedBVFPConversion mode n eb sb m
+ Grisette.Unified.Internal.BVFPConversion: class (UnifiedBVFPConversionImpl (mode :: EvalModeTag) (GetWordN mode) (GetIntN mode) (GetFP mode) n eb sb (GetWordN mode n) (GetIntN mode n) (GetFP mode eb sb) (GetFPRoundingMode mode)) => UnifiedBVFPConversion mode n eb sb
+ Grisette.Unified.Internal.BVFPConversion: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, n GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Unified.Internal.BVFPConversion.UnifiedBVFPConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Con Grisette.Internal.SymPrim.BV.WordN Grisette.Internal.SymPrim.BV.IntN Grisette.Internal.SymPrim.FP.FP n eb sb (Grisette.Internal.SymPrim.BV.WordN n) (Grisette.Internal.SymPrim.BV.IntN n) (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Unified.Internal.BVFPConversion: instance (Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, n GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Unified.Internal.BVFPConversion.UnifiedBVFPConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymBV.SymWordN Grisette.Internal.SymPrim.SymBV.SymIntN Grisette.Internal.SymPrim.SymFP.SymFP n eb sb (Grisette.Internal.SymPrim.SymBV.SymWordN n) (Grisette.Internal.SymPrim.SymBV.SymIntN n) (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
+ Grisette.Unified.Internal.BVFPConversion: instance (Grisette.Unified.Internal.BVFPConversion.UnifiedBVFPConversionImpl mode wordn intn fpn n eb sb word int fp fprd, Grisette.Unified.Internal.Class.UnifiedSafeBitCast.UnifiedSafeBitCast mode Grisette.Internal.SymPrim.FP.NotRepresentableFPError fp int m, Grisette.Unified.Internal.Class.UnifiedSafeBitCast.UnifiedSafeBitCast mode Grisette.Internal.SymPrim.FP.NotRepresentableFPError fp word m, Grisette.Unified.Internal.Class.UnifiedSafeFromFP.UnifiedSafeFromFP mode Grisette.Internal.SymPrim.FP.NotRepresentableFPError word fp fprd m) => Grisette.Unified.Internal.BVFPConversion.SafeUnifiedBVFPConversionImpl mode wordn intn fpn n eb sb word int fp fprd m
+ Grisette.Unified.Internal.BVFPConversion: instance (forall (n :: GHC.TypeNats.Nat) (eb :: GHC.TypeNats.Nat) (sb :: GHC.TypeNats.Nat). (Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, n GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Unified.Internal.BVFPConversion.UnifiedBVFPConversion mode n eb sb, forall (n :: GHC.TypeNats.Nat) (eb :: GHC.TypeNats.Nat) (sb :: GHC.TypeNats.Nat) (m :: * -> *). (Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, n GHC.Types.~ (eb GHC.TypeNats.+ sb), Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m) => Grisette.Unified.Internal.BVFPConversion.SafeUnifiedBVFPConversion mode n eb sb m) => Grisette.Unified.Internal.BVFPConversion.AllUnifiedBVFPConversion mode
+ Grisette.Unified.Internal.BVFPConversion: instance Grisette.Unified.Internal.BVFPConversion.SafeUnifiedBVFPConversionImpl mode (Grisette.Unified.Internal.UnifiedBV.GetWordN mode) (Grisette.Unified.Internal.UnifiedBV.GetIntN mode) (Grisette.Unified.Internal.UnifiedFP.GetFP mode) n eb sb (Grisette.Unified.Internal.UnifiedBV.GetWordN mode n) (Grisette.Unified.Internal.UnifiedBV.GetIntN mode n) (Grisette.Unified.Internal.UnifiedFP.GetFP mode eb sb) (Grisette.Unified.Internal.UnifiedFP.GetFPRoundingMode mode) m => Grisette.Unified.Internal.BVFPConversion.SafeUnifiedBVFPConversion mode n eb sb m
+ Grisette.Unified.Internal.BVFPConversion: instance Grisette.Unified.Internal.BVFPConversion.UnifiedBVFPConversionImpl mode (Grisette.Unified.Internal.UnifiedBV.GetWordN mode) (Grisette.Unified.Internal.UnifiedBV.GetIntN mode) (Grisette.Unified.Internal.UnifiedFP.GetFP mode) n eb sb (Grisette.Unified.Internal.UnifiedBV.GetWordN mode n) (Grisette.Unified.Internal.UnifiedBV.GetIntN mode n) (Grisette.Unified.Internal.UnifiedFP.GetFP mode eb sb) (Grisette.Unified.Internal.UnifiedFP.GetFPRoundingMode mode) => Grisette.Unified.Internal.BVFPConversion.UnifiedBVFPConversion mode n eb sb
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: class UnifiedFiniteBits mode a
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFiniteBits.UnifiedFiniteBits 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFiniteBits.UnifiedFiniteBits 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFiniteBits.UnifiedFiniteBits 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymIntN n)
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFiniteBits.UnifiedFiniteBits 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymWordN n)
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: instance Grisette.Unified.Internal.Class.UnifiedFiniteBits.UnifiedFiniteBits 'Grisette.Unified.Internal.EvalModeTag.Con Grisette.Internal.SymPrim.SomeBV.SomeIntN
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: instance Grisette.Unified.Internal.Class.UnifiedFiniteBits.UnifiedFiniteBits 'Grisette.Unified.Internal.EvalModeTag.Con Grisette.Internal.SymPrim.SomeBV.SomeWordN
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: instance Grisette.Unified.Internal.Class.UnifiedFiniteBits.UnifiedFiniteBits 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SomeBV.SomeSymIntN
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: instance Grisette.Unified.Internal.Class.UnifiedFiniteBits.UnifiedFiniteBits 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SomeBV.SomeSymWordN
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: symBitBlast :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => a -> [GetBool mode]
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: symCountLeadingZeros :: forall mode a b. (Typeable mode, UnifiedFiniteBits mode a, Num b, UnifiedITEOp mode b) => a -> b
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: symCountTrailingZeros :: forall mode a b. (Typeable mode, UnifiedFiniteBits mode a, Num b, UnifiedITEOp mode b) => a -> b
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: symFromBits :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => [GetBool mode] -> a
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: symLsb :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => a -> GetBool mode
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: symMsb :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => a -> GetBool mode
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: symPopCount :: forall mode a b. (Typeable mode, UnifiedFiniteBits mode a, Num b, UnifiedITEOp mode b) => a -> b
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: symSetBitTo :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => a -> Int -> GetBool mode -> a
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: symTestBit :: forall mode a. (Typeable mode, UnifiedFiniteBits mode a) => a -> Int -> GetBool mode
+ Grisette.Unified.Internal.Class.UnifiedFiniteBits: withBaseFiniteBits :: UnifiedFiniteBits mode a => (If (IsConMode mode) (FiniteBits a, FromBits a) (SymFiniteBits a) => r) -> r
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: class UnifiedFromIntegral (mode :: EvalModeTag) a b
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (Data.Typeable.Internal.Typeable mode, Data.Type.Bool.If (Grisette.Unified.Internal.EvalModeTag.IsConMode mode) (GHC.Real.Integral a, GHC.Num.Num b) (Grisette.Internal.Core.Data.Class.SymFromIntegral.SymFromIntegral a b)) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral mode a b
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n') => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.IntN n') GHC.Num.Integer.Integer
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n') => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.IntN n') Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n') => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.WordN n') GHC.Num.Integer.Integer
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n') => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.WordN n') Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n') => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymIntN n') Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n') => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymIntN n') Grisette.Internal.SymPrim.SymInteger.SymInteger
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n') => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymWordN n') Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n') => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymWordN n') Grisette.Internal.SymPrim.SymInteger.SymInteger
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.IntN n') (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.IntN n') (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.WordN n') (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.WordN n') (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymIntN n') (Grisette.Internal.SymPrim.SymBV.SymIntN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymIntN n') (Grisette.Internal.SymPrim.SymBV.SymWordN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymWordN n') (Grisette.Internal.SymPrim.SymBV.SymIntN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymWordN n') (Grisette.Internal.SymPrim.SymBV.SymWordN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.IntN n') (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con (Grisette.Internal.SymPrim.BV.WordN n') (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymIntN n') (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n', 1 Data.Type.Ord.<= n', Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.SymPrim.SymBV.SymWordN n') (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con GHC.Num.Integer.Integer (Grisette.Internal.SymPrim.BV.IntN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con GHC.Num.Integer.Integer (Grisette.Internal.SymPrim.BV.WordN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymInteger.SymInteger (Grisette.Internal.SymPrim.SymBV.SymIntN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymInteger.SymInteger (Grisette.Internal.SymPrim.SymBV.SymWordN n)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con GHC.Num.Integer.Integer (Grisette.Internal.SymPrim.FP.FP eb sb)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymInteger.SymInteger (Grisette.Internal.SymPrim.SymFP.SymFP eb sb)
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con GHC.Num.Integer.Integer GHC.Num.Integer.Integer
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Con GHC.Num.Integer.Integer Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymInteger.SymInteger Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: instance Grisette.Unified.Internal.Class.UnifiedFromIntegral.UnifiedFromIntegral 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymInteger.SymInteger Grisette.Internal.SymPrim.SymInteger.SymInteger
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: symFromIntegral :: forall mode a b. (Typeable mode, UnifiedFromIntegral mode a b) => a -> b
+ Grisette.Unified.Internal.Class.UnifiedFromIntegral: withBaseFromIntegral :: UnifiedFromIntegral mode a b => (If (IsConMode mode) (Integral a, Num b) (SymFromIntegral a b) => r) -> r
+ Grisette.Unified.Internal.Class.UnifiedITEOp: instance (Grisette.Internal.Core.Data.Class.Mergeable.Mergeable v, Grisette.Unified.Internal.Class.UnifiedITEOp.UnifiedITEOp 'Grisette.Unified.Internal.EvalModeTag.Sym v) => Grisette.Unified.Internal.Class.UnifiedITEOp.UnifiedITEOp 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.Core.Control.Monad.Union.Union v)
+ Grisette.Unified.Internal.Class.UnifiedSafeBitCast: class UnifiedSafeBitCast (mode :: EvalModeTag) e a b m
+ Grisette.Unified.Internal.Class.UnifiedSafeBitCast: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, n GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Unified.Internal.Class.UnifiedSafeBitCast.UnifiedSafeBitCast 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) (Grisette.Internal.SymPrim.SymBV.SymIntN n) m
+ Grisette.Unified.Internal.Class.UnifiedSafeBitCast: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, n GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Unified.Internal.Class.UnifiedSafeBitCast.UnifiedSafeBitCast 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) (Grisette.Internal.SymPrim.SymBV.SymWordN n) m
+ Grisette.Unified.Internal.Class.UnifiedSafeBitCast: instance (Data.Typeable.Internal.Typeable mode, Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, n GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Unified.Internal.Class.UnifiedSafeBitCast.UnifiedSafeBitCast mode Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.IntN n) m
+ Grisette.Unified.Internal.Class.UnifiedSafeBitCast: instance (Data.Typeable.Internal.Typeable mode, Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n, n GHC.Types.~ (eb GHC.TypeNats.+ sb)) => Grisette.Unified.Internal.Class.UnifiedSafeBitCast.UnifiedSafeBitCast mode Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.FP.FP eb sb) (Grisette.Internal.SymPrim.BV.WordN n) m
+ Grisette.Unified.Internal.Class.UnifiedSafeBitCast: instance (Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.Core.Data.Class.SafeBitCast.SafeBitCast e a b m) => Grisette.Unified.Internal.Class.UnifiedSafeBitCast.UnifiedSafeBitCast mode e a b m
+ Grisette.Unified.Internal.Class.UnifiedSafeBitCast: safeBitCast :: forall mode e a b m. (MonadError e m, UnifiedSafeBitCast mode e a b m) => a -> m b
+ Grisette.Unified.Internal.Class.UnifiedSafeBitCast: withBaseSafeBitCast :: UnifiedSafeBitCast mode e a b m => (SafeBitCast e a b m => r) -> r
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: class UnifiedSafeDiv (mode :: EvalModeTag) e a m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymIntN m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymWordN m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeIntN m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeWordN m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv 'Grisette.Unified.Internal.EvalModeTag.Sym GHC.Exception.Type.ArithException Grisette.Internal.SymPrim.SymInteger.SymInteger m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv 'Grisette.Unified.Internal.EvalModeTag.Sym GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.SymBV.SymIntN n) m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv 'Grisette.Unified.Internal.EvalModeTag.Sym GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.SymBV.SymWordN n) m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv mode GHC.Exception.Type.ArithException GHC.Num.Integer.Integer m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv mode GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.BV.IntN n) m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv mode GHC.Exception.Type.ArithException (Grisette.Internal.SymPrim.BV.WordN n) m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: instance (Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.Core.Data.Class.SafeDiv.SafeDiv e a m) => Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv mode e a m
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: safeDiv :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m a
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: safeDivMod :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m (a, a)
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: safeMod :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m a
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: safeQuot :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m a
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: safeQuotRem :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m (a, a)
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: safeRem :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m a
+ Grisette.Unified.Internal.Class.UnifiedSafeDiv: withBaseSafeDiv :: UnifiedSafeDiv mode e a m => (SafeDiv e a m => r) -> r
+ Grisette.Unified.Internal.Class.UnifiedSafeFdiv: class UnifiedSafeFdiv (mode :: EvalModeTag) e a m
+ Grisette.Unified.Internal.Class.UnifiedSafeFdiv: instance (Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeFdiv.UnifiedSafeFdiv 'Grisette.Unified.Internal.EvalModeTag.Sym GHC.Exception.Type.ArithException Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal m
+ Grisette.Unified.Internal.Class.UnifiedSafeFdiv: instance (Data.Typeable.Internal.Typeable mode, Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeFdiv.UnifiedSafeFdiv mode GHC.Exception.Type.ArithException Grisette.Internal.SymPrim.AlgReal.AlgReal m
+ Grisette.Unified.Internal.Class.UnifiedSafeFdiv: instance (Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.Core.Data.Class.SafeFdiv.SafeFdiv e a m) => Grisette.Unified.Internal.Class.UnifiedSafeFdiv.UnifiedSafeFdiv mode e a m
+ Grisette.Unified.Internal.Class.UnifiedSafeFdiv: safeFdiv :: forall mode e a m. (MonadError e m, UnifiedSafeFdiv mode e a m) => a -> a -> m a
+ Grisette.Unified.Internal.Class.UnifiedSafeFdiv: withBaseUnifiedSafeFdiv :: UnifiedSafeFdiv mode e a m => (SafeFdiv e a m => r) -> r
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: class UnifiedSafeFromFP (mode :: EvalModeTag) e a fp fprd m
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Unified.Internal.Class.UnifiedSafeFromFP.UnifiedSafeFromFP 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode m
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Unified.Internal.Class.UnifiedSafeFromFP.UnifiedSafeFromFP 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.SymInteger.SymInteger (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode m
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeFromFP.UnifiedSafeFromFP 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.SymBV.SymIntN n) (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode m
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeFromFP.UnifiedSafeFromFP 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.SymBV.SymWordN n) (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode m
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Unified.Internal.Class.UnifiedSafeFromFP.UnifiedSafeFromFP mode Grisette.Internal.SymPrim.FP.NotRepresentableFPError GHC.Num.Integer.Integer (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode m
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.SymPrim.FP.ValidFP eb sb) => Grisette.Unified.Internal.Class.UnifiedSafeFromFP.UnifiedSafeFromFP mode Grisette.Internal.SymPrim.FP.NotRepresentableFPError Grisette.Internal.SymPrim.AlgReal.AlgReal (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode m
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeFromFP.UnifiedSafeFromFP mode Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.BV.IntN n) (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode m
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: instance (Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.SymPrim.FP.ValidFP eb sb, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.Class.UnifiedSafeFromFP.UnifiedSafeFromFP mode Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Internal.SymPrim.BV.WordN n) (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode m
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: instance (Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Grisette.Internal.Core.Data.Class.SafeFromFP.SafeFromFP e a fp fprd m) => Grisette.Unified.Internal.Class.UnifiedSafeFromFP.UnifiedSafeFromFP mode e a fp fprd m
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: safeFromFP :: forall mode e a fp fprd m. (UnifiedSafeFromFP mode e a fp fprd m, MonadError e m) => fprd -> fp -> m a
+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP: withBaseSafeFromFP :: UnifiedSafeFromFP mode e a fp fprd m => (SafeFromFP e a fp fprd m => r) -> r
+ Grisette.Unified.Internal.Class.UnifiedSafeLinearArith: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymIntN m
+ Grisette.Unified.Internal.Class.UnifiedSafeLinearArith: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymWordN m
+ Grisette.Unified.Internal.Class.UnifiedSafeLinearArith: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeIntN m
+ Grisette.Unified.Internal.Class.UnifiedSafeLinearArith: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeWordN m
+ Grisette.Unified.Internal.Class.UnifiedSafeSymRotate: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymIntN m
+ Grisette.Unified.Internal.Class.UnifiedSafeSymRotate: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymWordN m
+ Grisette.Unified.Internal.Class.UnifiedSafeSymRotate: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeIntN m
+ Grisette.Unified.Internal.Class.UnifiedSafeSymRotate: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeWordN m
+ Grisette.Unified.Internal.Class.UnifiedSafeSymShift: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymIntN m
+ Grisette.Unified.Internal.Class.UnifiedSafeSymShift: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching 'Grisette.Unified.Internal.EvalModeTag.Sym m) => Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift 'Grisette.Unified.Internal.EvalModeTag.Sym (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeSymWordN m
+ Grisette.Unified.Internal.Class.UnifiedSafeSymShift: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeIntN m
+ Grisette.Unified.Internal.Class.UnifiedSafeSymShift: instance (Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m) => Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) Grisette.Internal.SymPrim.SomeBV.SomeWordN m
+ Grisette.Unified.Internal.Class.UnifiedSimpleMergeable: simpleMerge :: forall mode a. (Typeable mode, UnifiedSimpleMergeable mode a) => BaseMonad mode a -> a
+ Grisette.Unified.Internal.Class.UnifiedSymEq: instance Grisette.Unified.Internal.Class.UnifiedSymEq.UnifiedSymEq 'Grisette.Unified.Internal.EvalModeTag.Sym v => Grisette.Unified.Internal.Class.UnifiedSymEq.UnifiedSymEq 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.Core.Control.Monad.Union.Union v)
+ Grisette.Unified.Internal.Class.UnifiedSymEq: symDistinct :: forall mode a. (Typeable mode, UnifiedSymEq mode a) => [a] -> GetBool mode
+ Grisette.Unified.Internal.Class.UnifiedSymOrd: instance Grisette.Unified.Internal.Class.UnifiedSymOrd.UnifiedSymOrd 'Grisette.Unified.Internal.EvalModeTag.Sym v => Grisette.Unified.Internal.Class.UnifiedSymOrd.UnifiedSymOrd 'Grisette.Unified.Internal.EvalModeTag.Sym (Grisette.Internal.Core.Control.Monad.Union.Union v)
+ Grisette.Unified.Internal.FPFPConversion: class (forall eb0 sb0 eb1 sb1. (ValidFP eb0 sb0, ValidFP eb1 sb1) => UnifiedFPFPConversion mode eb0 sb0 eb1 sb1) => AllUnifiedFPFPConversion mode
+ Grisette.Unified.Internal.FPFPConversion: class (UnifiedFPFPConversionImpl (mode :: EvalModeTag) (GetFP mode) eb0 sb0 eb1 sb1 (GetFP mode eb0 sb0) (GetFP mode eb1 sb1) (GetFPRoundingMode mode)) => UnifiedFPFPConversion mode eb0 sb0 eb1 sb1
+ Grisette.Unified.Internal.FPFPConversion: instance (Grisette.Internal.SymPrim.FP.ValidFP eb0 sb0, Grisette.Internal.SymPrim.FP.ValidFP eb1 sb1) => Grisette.Unified.Internal.FPFPConversion.UnifiedFPFPConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Con Grisette.Internal.SymPrim.FP.FP eb0 sb0 eb1 sb1 (Grisette.Internal.SymPrim.FP.FP eb0 sb0) (Grisette.Internal.SymPrim.FP.FP eb1 sb1) Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Unified.Internal.FPFPConversion: instance (Grisette.Internal.SymPrim.FP.ValidFP eb0 sb0, Grisette.Internal.SymPrim.FP.ValidFP eb1 sb1) => Grisette.Unified.Internal.FPFPConversion.UnifiedFPFPConversionImpl 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymFP.SymFP eb0 sb0 eb1 sb1 (Grisette.Internal.SymPrim.SymFP.SymFP eb0 sb0) (Grisette.Internal.SymPrim.SymFP.SymFP eb1 sb1) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
+ Grisette.Unified.Internal.FPFPConversion: instance (forall (eb0 :: GHC.TypeNats.Nat) (sb0 :: GHC.TypeNats.Nat) (eb1 :: GHC.TypeNats.Nat) (sb1 :: GHC.TypeNats.Nat). (Grisette.Internal.SymPrim.FP.ValidFP eb0 sb0, Grisette.Internal.SymPrim.FP.ValidFP eb1 sb1) => Grisette.Unified.Internal.FPFPConversion.UnifiedFPFPConversion mode eb0 sb0 eb1 sb1) => Grisette.Unified.Internal.FPFPConversion.AllUnifiedFPFPConversion mode
+ Grisette.Unified.Internal.FPFPConversion: instance Grisette.Unified.Internal.FPFPConversion.UnifiedFPFPConversionImpl mode (Grisette.Unified.Internal.UnifiedFP.GetFP mode) eb0 sb0 eb1 sb1 (Grisette.Unified.Internal.UnifiedFP.GetFP mode eb0 sb0) (Grisette.Unified.Internal.UnifiedFP.GetFP mode eb1 sb1) (Grisette.Unified.Internal.UnifiedFP.GetFPRoundingMode mode) => Grisette.Unified.Internal.FPFPConversion.UnifiedFPFPConversion mode eb0 sb0 eb1 sb1
+ Grisette.Unified.Internal.UnifiedAlgReal: class (UnifiedAlgRealImpl mode (GetAlgReal mode)) => UnifiedAlgReal (mode :: EvalModeTag)
+ Grisette.Unified.Internal.UnifiedAlgReal: instance Grisette.Unified.Internal.UnifiedAlgReal.UnifiedAlgReal 'Grisette.Unified.Internal.EvalModeTag.Con
+ Grisette.Unified.Internal.UnifiedAlgReal: instance Grisette.Unified.Internal.UnifiedAlgReal.UnifiedAlgReal 'Grisette.Unified.Internal.EvalModeTag.Sym
+ Grisette.Unified.Internal.UnifiedAlgReal: instance Grisette.Unified.Internal.UnifiedAlgReal.UnifiedAlgRealImpl 'Grisette.Unified.Internal.EvalModeTag.Con Grisette.Internal.SymPrim.AlgReal.AlgReal
+ Grisette.Unified.Internal.UnifiedAlgReal: instance Grisette.Unified.Internal.UnifiedAlgReal.UnifiedAlgRealImpl 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymAlgReal.SymAlgReal
+ Grisette.Unified.Internal.UnifiedAlgReal: type GetAlgReal mode = real | real -> mode
+ Grisette.Unified.Internal.UnifiedBV: class (BVConstraint mode (GetWordN mode n) (GetIntN mode n), ConSymConversion (WordN n) (SymWordN n) (GetWordN mode n), UnifiedSimpleMergeable mode (GetWordN mode n), ConSymConversion (IntN n) (SymIntN n) (GetIntN mode n), UnifiedSimpleMergeable mode (GetIntN mode n), wordn ~ GetWordN mode, intn ~ GetIntN mode, word ~ wordn n, int ~ intn n, BitCast word int, BitCast int word, DivOr word, DivOr int, UnifiedFromIntegral mode (GetInteger mode) word, UnifiedFromIntegral mode (GetInteger mode) int, UnifiedFromIntegral mode word (GetInteger mode), UnifiedFromIntegral mode word (GetAlgReal mode), UnifiedFromIntegral mode int (GetInteger mode), UnifiedFromIntegral mode int (GetAlgReal mode)) => UnifiedBVImpl (mode :: EvalModeTag) wordn intn n word int | wordn -> intn, intn -> wordn, wordn n -> word, word -> wordn n, intn n -> int, int -> intn n
+ Grisette.Unified.Internal.UnifiedBV: instance (Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv mode GHC.Exception.Type.ArithException word m, Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode GHC.Exception.Type.ArithException word m, Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode GHC.Exception.Type.ArithException word m, Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode GHC.Exception.Type.ArithException word m, Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv mode GHC.Exception.Type.ArithException int m, Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode GHC.Exception.Type.ArithException int m, Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode GHC.Exception.Type.ArithException int m, Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode GHC.Exception.Type.ArithException int m, Grisette.Unified.Internal.UnifiedBV.UnifiedBVImpl mode wordn intn n word int) => Grisette.Unified.Internal.UnifiedBV.SafeUnifiedBVImpl mode wordn intn n word int m
+ Grisette.Unified.Internal.UnifiedBV: instance (Grisette.Unified.Internal.UnifiedBV.SomeBVPair mode word int, Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) word m, Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) word m, Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) word m, Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) word m, Grisette.Unified.Internal.Class.UnifiedSafeDiv.UnifiedSafeDiv mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) int m, Grisette.Unified.Internal.Class.UnifiedSafeLinearArith.UnifiedSafeLinearArith mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) int m, Grisette.Unified.Internal.Class.UnifiedSafeSymRotate.UnifiedSafeSymRotate mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) int m, Grisette.Unified.Internal.Class.UnifiedSafeSymShift.UnifiedSafeSymShift mode (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) int m) => Grisette.Unified.Internal.UnifiedBV.SafeUnifiedSomeBVImpl mode word int m
+ Grisette.Unified.Internal.UnifiedBV: instance (forall (n :: GHC.TypeNats.Nat) (m :: * -> *). (Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Control.Monad.Error.Class.MonadError GHC.Exception.Type.ArithException m, GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.UnifiedBV.SafeUnifiedBV mode n m, forall (m :: * -> *). (Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Control.Monad.Error.Class.MonadError (Data.Either.Either Grisette.Internal.SymPrim.SomeBV.SomeBVException GHC.Exception.Type.ArithException) m) => Grisette.Unified.Internal.UnifiedBV.SafeUnifiedSomeBV mode m, forall (n :: GHC.TypeNats.Nat). (GHC.TypeNats.KnownNat n, 1 Data.Type.Ord.<= n) => Grisette.Unified.Internal.UnifiedBV.UnifiedBV mode n, Grisette.Unified.Internal.UnifiedBV.SomeBVPair mode (Grisette.Unified.Internal.UnifiedBV.GetSomeWordN mode) (Grisette.Unified.Internal.UnifiedBV.GetSomeIntN mode), Grisette.Internal.Core.Data.Class.BitVector.SizedBV (Grisette.Unified.Internal.UnifiedBV.GetWordN mode), Grisette.Internal.Core.Data.Class.BitVector.SizedBV (Grisette.Unified.Internal.UnifiedBV.GetIntN mode)) => Grisette.Unified.Internal.UnifiedBV.AllUnifiedBV mode
+ Grisette.Unified.Internal.UnifiedData: instance (forall v. Grisette.Internal.Core.Data.Class.Mergeable.Mergeable v => Grisette.Unified.Internal.UnifiedData.UnifiedData bool v, forall v. Grisette.Internal.Core.Data.Class.Mergeable.Mergeable v => Grisette.Unified.Internal.UnifiedData.UnifiedDataSimpleMergeable v) => Grisette.Unified.Internal.UnifiedData.AllUnifiedData bool
+ Grisette.Unified.Internal.UnifiedData: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable v => Grisette.Unified.Internal.UnifiedData.UnifiedDataImpl 'Grisette.Unified.Internal.EvalModeTag.Con v (Data.Functor.Identity.Identity v)
+ Grisette.Unified.Internal.UnifiedData: instance Grisette.Internal.Core.Data.Class.Mergeable.Mergeable v => Grisette.Unified.Internal.UnifiedData.UnifiedDataSimpleMergeable v
+ Grisette.Unified.Internal.UnifiedFP: class (forall eb sb. (ValidFP eb sb) => UnifiedFP mode eb sb, forall eb sb m. (ValidFP eb sb, UnifiedBranching mode m, MonadError NotRepresentableFPError m) => SafeUnifiedFP mode eb sb m) => AllUnifiedFP mode
+ Grisette.Unified.Internal.UnifiedFP: class (SafeUnifiedFPImpl mode (GetFP mode) eb sb (GetFP mode eb sb) (GetFPRoundingMode mode) m, UnifiedSafeFromFP mode NotRepresentableFPError (GetInteger mode) (GetFP mode eb sb) (GetFPRoundingMode mode) m) => SafeUnifiedFP mode eb sb m
+ Grisette.Unified.Internal.UnifiedFP: class (UnifiedFPImpl mode (GetFP mode) eb sb (GetFP mode eb sb) (GetFPRoundingMode mode)) => UnifiedFP mode eb sb
+ Grisette.Unified.Internal.UnifiedFP: class (BasicGrisetteType fp, ConSymConversion (FP eb sb) (SymFP eb sb) fp, UnifiedPrimitive mode fp, Floating fp, SymIEEEFPTraits fp, IEEEFPConstants fp, IEEEFPOp fp, IEEEFPRoundingOp fp rd, UnifiedFromIntegral mode (GetInteger mode) fp, IEEEFPToAlgReal (GetAlgReal mode) fp rd, IEEEFPConvertible (GetInteger mode) fp rd, fpn ~ GetFP mode, fp ~ fpn eb sb, rd ~ GetFPRoundingMode mode) => UnifiedFPImpl (mode :: EvalModeTag) fpn eb sb fp rd | fpn eb sb -> fp rd, fp -> fpn eb sb rd, rd -> fpn, rd eb sb -> fp
+ Grisette.Unified.Internal.UnifiedFP: instance (Grisette.Unified.Internal.UnifiedFP.SafeUnifiedFPImpl mode (Grisette.Unified.Internal.UnifiedFP.GetFP mode) eb sb (Grisette.Unified.Internal.UnifiedFP.GetFP mode eb sb) (Grisette.Unified.Internal.UnifiedFP.GetFPRoundingMode mode) m, Grisette.Unified.Internal.Class.UnifiedSafeFromFP.UnifiedSafeFromFP mode Grisette.Internal.SymPrim.FP.NotRepresentableFPError (Grisette.Unified.Internal.UnifiedInteger.GetInteger mode) (Grisette.Unified.Internal.UnifiedFP.GetFP mode eb sb) (Grisette.Unified.Internal.UnifiedFP.GetFPRoundingMode mode) m) => Grisette.Unified.Internal.UnifiedFP.SafeUnifiedFP mode eb sb m
+ Grisette.Unified.Internal.UnifiedFP: instance (forall (eb :: GHC.TypeNats.Nat) (sb :: GHC.TypeNats.Nat). Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Unified.Internal.UnifiedFP.UnifiedFP mode eb sb, forall (eb :: GHC.TypeNats.Nat) (sb :: GHC.TypeNats.Nat) (m :: * -> *). (Grisette.Internal.SymPrim.FP.ValidFP eb sb, Grisette.Unified.Internal.Class.UnifiedSimpleMergeable.UnifiedBranching mode m, Control.Monad.Error.Class.MonadError Grisette.Internal.SymPrim.FP.NotRepresentableFPError m) => Grisette.Unified.Internal.UnifiedFP.SafeUnifiedFP mode eb sb m) => Grisette.Unified.Internal.UnifiedFP.AllUnifiedFP mode
+ Grisette.Unified.Internal.UnifiedFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Unified.Internal.UnifiedFP.UnifiedFPImpl 'Grisette.Unified.Internal.EvalModeTag.Con Grisette.Internal.SymPrim.FP.FP eb sb (Grisette.Internal.SymPrim.FP.FP eb sb) Grisette.Internal.SymPrim.FP.FPRoundingMode
+ Grisette.Unified.Internal.UnifiedFP: instance Grisette.Internal.SymPrim.FP.ValidFP eb sb => Grisette.Unified.Internal.UnifiedFP.UnifiedFPImpl 'Grisette.Unified.Internal.EvalModeTag.Sym Grisette.Internal.SymPrim.SymFP.SymFP eb sb (Grisette.Internal.SymPrim.SymFP.SymFP eb sb) Grisette.Internal.SymPrim.SymFP.SymFPRoundingMode
+ Grisette.Unified.Internal.UnifiedFP: instance Grisette.Unified.Internal.UnifiedFP.UnifiedFPImpl mode (Grisette.Unified.Internal.UnifiedFP.GetFP mode) eb sb (Grisette.Unified.Internal.UnifiedFP.GetFP mode eb sb) (Grisette.Unified.Internal.UnifiedFP.GetFPRoundingMode mode) => Grisette.Unified.Internal.UnifiedFP.UnifiedFP mode eb sb
+ Grisette.Unified.Internal.UnifiedFP: instance Grisette.Unified.Internal.UnifiedFP.UnifiedFPImpl mode fpn eb sb fp rd => Grisette.Unified.Internal.UnifiedFP.SafeUnifiedFPImpl mode fpn eb sb fp rd m
+ Grisette.Unified.Internal.UnifiedFP: type GetFP mode = (f :: Nat -> Nat -> Type) | f -> mode
+ Grisette.Unified.Internal.UnifiedFP: type GetFPRoundingMode mode = r | r -> mode
- Grisette.Backend: ExtraConfig :: Maybe Int -> ApproximationConfig i -> ExtraConfig (i :: Nat)
+ Grisette.Backend: ExtraConfig :: Maybe Int -> ExtraConfig
- Grisette.Backend: GrisetteSMTConfig :: SMTConfig -> ExtraConfig i -> GrisetteSMTConfig (i :: Nat)
+ Grisette.Backend: GrisetteSMTConfig :: SMTConfig -> ExtraConfig -> GrisetteSMTConfig
- Grisette.Backend: [extraConfig] :: GrisetteSMTConfig (i :: Nat) -> ExtraConfig i
+ Grisette.Backend: [extraConfig] :: GrisetteSMTConfig -> ExtraConfig
- Grisette.Backend: [sbvConfig] :: GrisetteSMTConfig (i :: Nat) -> SMTConfig
+ Grisette.Backend: [sbvConfig] :: GrisetteSMTConfig -> SMTConfig
- Grisette.Backend: [timeout] :: ExtraConfig (i :: Nat) -> Maybe Int
+ Grisette.Backend: [timeout] :: ExtraConfig -> Maybe Int
- Grisette.Backend: abc :: GrisetteSMTConfig 0
+ Grisette.Backend: abc :: GrisetteSMTConfig
- Grisette.Backend: bitwuzla :: GrisetteSMTConfig 0
+ Grisette.Backend: bitwuzla :: GrisetteSMTConfig
- Grisette.Backend: boolector :: GrisetteSMTConfig 0
+ Grisette.Backend: boolector :: GrisetteSMTConfig
- Grisette.Backend: clearTimeout :: GrisetteSMTConfig i -> GrisetteSMTConfig i
+ Grisette.Backend: clearTimeout :: GrisetteSMTConfig -> GrisetteSMTConfig
- Grisette.Backend: cvc4 :: GrisetteSMTConfig 0
+ Grisette.Backend: cvc4 :: GrisetteSMTConfig
- Grisette.Backend: cvc5 :: GrisetteSMTConfig 0
+ Grisette.Backend: cvc5 :: GrisetteSMTConfig
- Grisette.Backend: dReal :: GrisetteSMTConfig 0
+ Grisette.Backend: dReal :: GrisetteSMTConfig
- Grisette.Backend: data GrisetteSMTConfig (i :: Nat)
+ Grisette.Backend: data GrisetteSMTConfig
- Grisette.Backend: mathSAT :: GrisetteSMTConfig 0
+ Grisette.Backend: mathSAT :: GrisetteSMTConfig
- Grisette.Backend: withTimeout :: Int -> GrisetteSMTConfig i -> GrisetteSMTConfig i
+ Grisette.Backend: withTimeout :: Int -> GrisetteSMTConfig -> GrisetteSMTConfig
- Grisette.Backend: yices :: GrisetteSMTConfig 0
+ Grisette.Backend: yices :: GrisetteSMTConfig
- Grisette.Backend: z3 :: GrisetteSMTConfig 0
+ Grisette.Backend: z3 :: GrisetteSMTConfig
- Grisette.Core: class ToSym a b
+ Grisette.Core: class (Mergeable b) => ToSym a b
- Grisette.Core: class (forall a b. (ToSym a b) => ToSym (f1 a) (f2 b)) => ToSym1 f1 f2
+ Grisette.Core: class (forall a b. (ToSym a b) => ToSym (f1 a) (f2 b), Mergeable1 f2) => ToSym1 f1 f2
- Grisette.Core: class (forall a b. (ToSym a b) => ToSym1 (f1 a) (f2 b)) => ToSym2 f1 f2
+ Grisette.Core: class (forall a b. (ToSym a b) => ToSym1 (f1 a) (f2 b), Mergeable2 f2) => ToSym2 f1 f2
- Grisette.Core: extractSym :: ExtractSym a => a -> SymbolSet
+ Grisette.Core: extractSym :: ExtractSym a => a -> AnySymbolSet
- Grisette.Core: extractSym1 :: (ExtractSym1 f, ExtractSym a) => f a -> SymbolSet
+ Grisette.Core: extractSym1 :: (ExtractSym1 f, ExtractSym a, IsSymbolKind knd) => f a -> SymbolSet knd
- Grisette.Core: extractSym2 :: (ExtractSym2 f, ExtractSym a, ExtractSym b) => f a b -> SymbolSet
+ Grisette.Core: extractSym2 :: (ExtractSym2 f, ExtractSym a, ExtractSym b, IsSymbolKind knd) => f a b -> SymbolSet knd
- Grisette.Core: fpNaN :: IEEEConstants a => a
+ Grisette.Core: fpNaN :: IEEEFPConstants a => a
- Grisette.Core: fpNegativeInfinite :: IEEEConstants a => a
+ Grisette.Core: fpNegativeInfinite :: IEEEFPConstants a => a
- Grisette.Core: fpNegativeZero :: IEEEConstants a => a
+ Grisette.Core: fpNegativeZero :: IEEEFPConstants a => a
- Grisette.Core: fpPositiveInfinite :: IEEEConstants a => a
+ Grisette.Core: fpPositiveInfinite :: IEEEFPConstants a => a
- Grisette.Core: fpPositiveZero :: IEEEConstants a => a
+ Grisette.Core: fpPositiveZero :: IEEEFPConstants a => a
- Grisette.Core: genericLiftSubstSym :: (Generic1 f, GSubstSym Arity1 (Rep1 f), LinkedRep cb sb) => (TypedSymbol cb -> sb -> a -> a) -> TypedSymbol cb -> sb -> f a -> f a
+ Grisette.Core: genericLiftSubstSym :: (Generic1 f, GSubstSym Arity1 (Rep1 f), LinkedRep cb sb, IsSymbolKind knd) => (TypedSymbol knd cb -> sb -> a -> a) -> TypedSymbol knd cb -> sb -> f a -> f a
- Grisette.Core: genericLiftToSym :: (Generic1 f1, Generic1 f2, GToSym Arity1 (Rep1 f1) (Rep1 f2)) => (a -> b) -> f1 a -> f2 b
+ Grisette.Core: genericLiftToSym :: (Generic1 f1, Generic1 f2, GToSym Arity1 (Rep1 f1) (Rep1 f2), Mergeable b) => (a -> b) -> f1 a -> f2 b
- Grisette.Core: genericSubstSym :: (Generic a, GSubstSym Arity0 (Rep a), LinkedRep cb sb) => TypedSymbol cb -> sb -> a -> a
+ Grisette.Core: genericSubstSym :: (Generic a, GSubstSym Arity0 (Rep a), LinkedRep cb sb, IsSymbolKind knd) => TypedSymbol knd cb -> sb -> a -> a
- Grisette.Core: gsubstSym :: (GSubstSym arity f, LinkedRep cb sb) => SubstSymArgs arity a cb sb -> TypedSymbol cb -> sb -> f a -> f a
+ Grisette.Core: gsubstSym :: (GSubstSym arity f, LinkedRep cb sb, IsSymbolKind knd) => SubstSymArgs arity knd a cb sb -> TypedSymbol knd cb -> sb -> f a -> f a
- Grisette.Core: liftPFormatList2 :: PPrint2 f => (Int -> a -> Doc ann) -> (Int -> b -> Doc ann) -> ([a] -> Doc ann) -> ([b] -> Doc ann) -> [f a b] -> Doc ann
+ Grisette.Core: liftPFormatList2 :: PPrint2 f => (Int -> a -> Doc ann) -> ([a] -> Doc ann) -> (Int -> b -> Doc ann) -> ([b] -> Doc ann) -> [f a b] -> Doc ann
- Grisette.Core: liftPFormatPrec2 :: PPrint2 f => (Int -> a -> Doc ann) -> (Int -> b -> Doc ann) -> ([a] -> Doc ann) -> ([b] -> Doc ann) -> Int -> f a b -> Doc ann
+ Grisette.Core: liftPFormatPrec2 :: PPrint2 f => (Int -> a -> Doc ann) -> ([a] -> Doc ann) -> (Int -> b -> Doc ann) -> ([b] -> Doc ann) -> Int -> f a b -> Doc ann
- Grisette.Core: liftSubstSym :: (SubstSym1 f, LinkedRep cb sb) => (TypedSymbol cb -> sb -> a -> a) -> TypedSymbol cb -> sb -> f a -> f a
+ Grisette.Core: liftSubstSym :: (SubstSym1 f, LinkedRep cb sb, IsSymbolKind knd) => (TypedSymbol knd cb -> sb -> a -> a) -> TypedSymbol knd cb -> sb -> f a -> f a
- Grisette.Core: liftSubstSym2 :: (SubstSym2 f, LinkedRep cb sb) => (TypedSymbol cb -> sb -> a -> a) -> (TypedSymbol cb -> sb -> b -> b) -> TypedSymbol cb -> sb -> f a b -> f a b
+ Grisette.Core: liftSubstSym2 :: (SubstSym2 f, LinkedRep cb sb, IsSymbolKind knd) => (TypedSymbol knd cb -> sb -> a -> a) -> (TypedSymbol knd cb -> sb -> b -> b) -> TypedSymbol knd cb -> sb -> f a b -> f a b
- Grisette.Core: liftToSym :: ToSym1 f1 f2 => (a -> b) -> f1 a -> f2 b
+ Grisette.Core: liftToSym :: (ToSym1 f1 f2, Mergeable b) => (a -> b) -> f1 a -> f2 b
- Grisette.Core: safeDiv :: SafeDivision e a m => a -> a -> m a
+ Grisette.Core: safeDiv :: SafeDiv e a m => a -> a -> m a
- Grisette.Core: safeDivMod :: SafeDivision e a m => a -> a -> m (a, a)
+ Grisette.Core: safeDivMod :: SafeDiv e a m => a -> a -> m (a, a)
- Grisette.Core: safeMod :: SafeDivision e a m => a -> a -> m a
+ Grisette.Core: safeMod :: SafeDiv e a m => a -> a -> m a
- Grisette.Core: safeQuot :: SafeDivision e a m => a -> a -> m a
+ Grisette.Core: safeQuot :: SafeDiv e a m => a -> a -> m a
- Grisette.Core: safeQuotRem :: SafeDivision e a m => a -> a -> m (a, a)
+ Grisette.Core: safeQuotRem :: SafeDiv e a m => a -> a -> m (a, a)
- Grisette.Core: safeRem :: SafeDivision e a m => a -> a -> m a
+ Grisette.Core: safeRem :: SafeDiv e a m => a -> a -> m a
- Grisette.Core: substSym :: (SubstSym a, LinkedRep cb sb) => TypedSymbol cb -> sb -> a -> a
+ Grisette.Core: substSym :: (SubstSym a, LinkedRep cb sb, IsSymbolKind knd) => TypedSymbol knd cb -> sb -> a -> a
- Grisette.Core: substSym1 :: (SubstSym1 f, SubstSym a, LinkedRep cb sb) => TypedSymbol cb -> sb -> f a -> f a
+ Grisette.Core: substSym1 :: (SubstSym1 f, SubstSym a, LinkedRep cb sb, IsSymbolKind knd) => TypedSymbol knd cb -> sb -> f a -> f a
- Grisette.Core: substSym2 :: (SubstSym2 f, SubstSym a, SubstSym b, LinkedRep cb sb) => TypedSymbol cb -> sb -> f a b -> f a b
+ Grisette.Core: substSym2 :: (SubstSym2 f, SubstSym a, SubstSym b, LinkedRep cb sb, IsSymbolKind knd) => TypedSymbol knd cb -> sb -> f a b -> f a b
- Grisette.Internal.Backend.Solving: ExtraConfig :: Maybe Int -> ApproximationConfig i -> ExtraConfig (i :: Nat)
+ Grisette.Internal.Backend.Solving: ExtraConfig :: Maybe Int -> ExtraConfig
- Grisette.Internal.Backend.Solving: GrisetteSMTConfig :: SMTConfig -> ExtraConfig i -> GrisetteSMTConfig (i :: Nat)
+ Grisette.Internal.Backend.Solving: GrisetteSMTConfig :: SMTConfig -> ExtraConfig -> GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: [extraConfig] :: GrisetteSMTConfig (i :: Nat) -> ExtraConfig i
+ Grisette.Internal.Backend.Solving: [extraConfig] :: GrisetteSMTConfig -> ExtraConfig
- Grisette.Internal.Backend.Solving: [sbvConfig] :: GrisetteSMTConfig (i :: Nat) -> SMTConfig
+ Grisette.Internal.Backend.Solving: [sbvConfig] :: GrisetteSMTConfig -> SMTConfig
- Grisette.Internal.Backend.Solving: [timeout] :: ExtraConfig (i :: Nat) -> Maybe Int
+ Grisette.Internal.Backend.Solving: [timeout] :: ExtraConfig -> Maybe Int
- Grisette.Internal.Backend.Solving: abc :: GrisetteSMTConfig 0
+ Grisette.Internal.Backend.Solving: abc :: GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: bitwuzla :: GrisetteSMTConfig 0
+ Grisette.Internal.Backend.Solving: bitwuzla :: GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: boolector :: GrisetteSMTConfig 0
+ Grisette.Internal.Backend.Solving: boolector :: GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: clearTimeout :: GrisetteSMTConfig i -> GrisetteSMTConfig i
+ Grisette.Internal.Backend.Solving: clearTimeout :: GrisetteSMTConfig -> GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: cvc4 :: GrisetteSMTConfig 0
+ Grisette.Internal.Backend.Solving: cvc4 :: GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: cvc5 :: GrisetteSMTConfig 0
+ Grisette.Internal.Backend.Solving: cvc5 :: GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: dReal :: GrisetteSMTConfig 0
+ Grisette.Internal.Backend.Solving: dReal :: GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: data GrisetteSMTConfig (i :: Nat)
+ Grisette.Internal.Backend.Solving: data GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: lowerSinglePrim :: forall integerBitWidth a m. (HasCallStack, SBVFreshMonad m) => GrisetteSMTConfig integerBitWidth -> Term a -> m (SymBiMap, SBVType integerBitWidth a)
+ Grisette.Internal.Backend.Solving: lowerSinglePrim :: forall a m. (HasCallStack, SBVFreshMonad m) => GrisetteSMTConfig -> Term a -> m (SymBiMap, QuantifiedStack -> SBVType a, SBool)
- Grisette.Internal.Backend.Solving: lowerSinglePrimCached :: forall integerBitWidth a m. (HasCallStack, SBVFreshMonad m) => GrisetteSMTConfig integerBitWidth -> Term a -> SymBiMap -> m (SymBiMap, SBVType integerBitWidth a)
+ Grisette.Internal.Backend.Solving: lowerSinglePrimCached :: forall a m. (HasCallStack, SBVFreshMonad m) => GrisetteSMTConfig -> Term a -> SymBiMap -> m (SymBiMap, QuantifiedStack -> SBVType a, SBool)
- Grisette.Internal.Backend.Solving: mathSAT :: GrisetteSMTConfig 0
+ Grisette.Internal.Backend.Solving: mathSAT :: GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: parseModel :: forall integerBitWidth. GrisetteSMTConfig integerBitWidth -> SMTModel -> SymBiMap -> Model
+ Grisette.Internal.Backend.Solving: parseModel :: GrisetteSMTConfig -> SMTModel -> SymBiMap -> Model
- Grisette.Internal.Backend.Solving: runSBVIncremental :: GrisetteSMTConfig n -> SBVIncremental n a -> IO a
+ Grisette.Internal.Backend.Solving: runSBVIncremental :: GrisetteSMTConfig -> SBVIncremental a -> IO a
- Grisette.Internal.Backend.Solving: runSBVIncrementalT :: ExtractIO m => GrisetteSMTConfig n -> SBVIncrementalT n m a -> m a
+ Grisette.Internal.Backend.Solving: runSBVIncrementalT :: ExtractIO m => GrisetteSMTConfig -> SBVIncrementalT m a -> m a
- Grisette.Internal.Backend.Solving: type SBVIncremental n = SBVIncrementalT n IO
+ Grisette.Internal.Backend.Solving: type SBVIncremental = SBVIncrementalT IO
- Grisette.Internal.Backend.Solving: type SBVIncrementalT n m = ReaderT (GrisetteSMTConfig n) (StateT SymBiMap (QueryT m))
+ Grisette.Internal.Backend.Solving: type SBVIncrementalT m = ReaderT GrisetteSMTConfig (StateT SymBiMap (QueryT m))
- Grisette.Internal.Backend.Solving: withTimeout :: Int -> GrisetteSMTConfig i -> GrisetteSMTConfig i
+ Grisette.Internal.Backend.Solving: withTimeout :: Int -> GrisetteSMTConfig -> GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: yices :: GrisetteSMTConfig 0
+ Grisette.Internal.Backend.Solving: yices :: GrisetteSMTConfig
- Grisette.Internal.Backend.Solving: z3 :: GrisetteSMTConfig 0
+ Grisette.Internal.Backend.Solving: z3 :: GrisetteSMTConfig
- Grisette.Internal.Backend.SymBiMap: SymBiMap :: HashMap SomeTerm Dynamic -> HashMap String SomeTypedSymbol -> SymBiMap
+ Grisette.Internal.Backend.SymBiMap: SymBiMap :: HashMap SomeTerm (QuantifiedStack -> Dynamic) -> HashMap String SomeTypedAnySymbol -> Int -> SymBiMap
- Grisette.Internal.Backend.SymBiMap: [biMapFromSBV] :: SymBiMap -> HashMap String SomeTypedSymbol
+ Grisette.Internal.Backend.SymBiMap: [biMapFromSBV] :: SymBiMap -> HashMap String SomeTypedAnySymbol
- Grisette.Internal.Backend.SymBiMap: [biMapToSBV] :: SymBiMap -> HashMap SomeTerm Dynamic
+ Grisette.Internal.Backend.SymBiMap: [biMapToSBV] :: SymBiMap -> HashMap SomeTerm (QuantifiedStack -> Dynamic)
- Grisette.Internal.Backend.SymBiMap: addBiMap :: HasCallStack => SomeTerm -> Dynamic -> String -> SomeTypedSymbol -> SymBiMap -> SymBiMap
+ Grisette.Internal.Backend.SymBiMap: addBiMap :: HasCallStack => SomeTerm -> Dynamic -> String -> SomeTypedSymbol knd -> SymBiMap -> SymBiMap
- Grisette.Internal.Backend.SymBiMap: addBiMapIntermediate :: HasCallStack => SomeTerm -> Dynamic -> SymBiMap -> SymBiMap
+ Grisette.Internal.Backend.SymBiMap: addBiMapIntermediate :: HasCallStack => SomeTerm -> (QuantifiedStack -> Dynamic) -> SymBiMap -> SymBiMap
- Grisette.Internal.Backend.SymBiMap: findStringToSymbol :: String -> SymBiMap -> Maybe SomeTypedSymbol
+ Grisette.Internal.Backend.SymBiMap: findStringToSymbol :: IsSymbolKind knd => String -> SymBiMap -> Maybe (SomeTypedSymbol knd)
- Grisette.Internal.Backend.SymBiMap: lookupTerm :: HasCallStack => SomeTerm -> SymBiMap -> Maybe Dynamic
+ Grisette.Internal.Backend.SymBiMap: lookupTerm :: HasCallStack => SomeTerm -> SymBiMap -> Maybe (QuantifiedStack -> Dynamic)
- Grisette.Internal.Core.Data.Class.ExtractSym: data family ExtractSymArgs arity a :: Type
+ Grisette.Internal.Core.Data.Class.ExtractSym: data family ExtractSymArgs arity (knd :: SymbolKind) a :: Type
- Grisette.Internal.Core.Data.Class.ExtractSym: extractSym :: ExtractSym a => a -> SymbolSet
+ Grisette.Internal.Core.Data.Class.ExtractSym: extractSym :: ExtractSym a => a -> AnySymbolSet
- Grisette.Internal.Core.Data.Class.ExtractSym: extractSym1 :: (ExtractSym1 f, ExtractSym a) => f a -> SymbolSet
+ Grisette.Internal.Core.Data.Class.ExtractSym: extractSym1 :: (ExtractSym1 f, ExtractSym a, IsSymbolKind knd) => f a -> SymbolSet knd
- Grisette.Internal.Core.Data.Class.ExtractSym: extractSym2 :: (ExtractSym2 f, ExtractSym a, ExtractSym b) => f a b -> SymbolSet
+ Grisette.Internal.Core.Data.Class.ExtractSym: extractSym2 :: (ExtractSym2 f, ExtractSym a, ExtractSym b, IsSymbolKind knd) => f a b -> SymbolSet knd
- Grisette.Internal.Core.Data.Class.IEEEFP: fpNaN :: IEEEConstants a => a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpNaN :: IEEEFPConstants a => a
- Grisette.Internal.Core.Data.Class.IEEEFP: fpNegativeInfinite :: IEEEConstants a => a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpNegativeInfinite :: IEEEFPConstants a => a
- Grisette.Internal.Core.Data.Class.IEEEFP: fpNegativeZero :: IEEEConstants a => a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpNegativeZero :: IEEEFPConstants a => a
- Grisette.Internal.Core.Data.Class.IEEEFP: fpPositiveInfinite :: IEEEConstants a => a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpPositiveInfinite :: IEEEFPConstants a => a
- Grisette.Internal.Core.Data.Class.IEEEFP: fpPositiveZero :: IEEEConstants a => a
+ Grisette.Internal.Core.Data.Class.IEEEFP: fpPositiveZero :: IEEEFPConstants a => a
- Grisette.Internal.Core.Data.Class.PPrint: liftPFormatList2 :: PPrint2 f => (Int -> a -> Doc ann) -> (Int -> b -> Doc ann) -> ([a] -> Doc ann) -> ([b] -> Doc ann) -> [f a b] -> Doc ann
+ Grisette.Internal.Core.Data.Class.PPrint: liftPFormatList2 :: PPrint2 f => (Int -> a -> Doc ann) -> ([a] -> Doc ann) -> (Int -> b -> Doc ann) -> ([b] -> Doc ann) -> [f a b] -> Doc ann
- Grisette.Internal.Core.Data.Class.PPrint: liftPFormatPrec2 :: PPrint2 f => (Int -> a -> Doc ann) -> (Int -> b -> Doc ann) -> ([a] -> Doc ann) -> ([b] -> Doc ann) -> Int -> f a b -> Doc ann
+ Grisette.Internal.Core.Data.Class.PPrint: liftPFormatPrec2 :: PPrint2 f => (Int -> a -> Doc ann) -> ([a] -> Doc ann) -> (Int -> b -> Doc ann) -> ([b] -> Doc ann) -> Int -> f a b -> Doc ann
- Grisette.Internal.Core.Data.Class.SubstSym: data family SubstSymArgs arity a cb sb :: Type
+ Grisette.Internal.Core.Data.Class.SubstSym: data family SubstSymArgs arity (knd :: SymbolKind) a cb sb :: Type
- Grisette.Internal.Core.Data.Class.SubstSym: genericLiftSubstSym :: (Generic1 f, GSubstSym Arity1 (Rep1 f), LinkedRep cb sb) => (TypedSymbol cb -> sb -> a -> a) -> TypedSymbol cb -> sb -> f a -> f a
+ Grisette.Internal.Core.Data.Class.SubstSym: genericLiftSubstSym :: (Generic1 f, GSubstSym Arity1 (Rep1 f), LinkedRep cb sb, IsSymbolKind knd) => (TypedSymbol knd cb -> sb -> a -> a) -> TypedSymbol knd cb -> sb -> f a -> f a
- Grisette.Internal.Core.Data.Class.SubstSym: genericSubstSym :: (Generic a, GSubstSym Arity0 (Rep a), LinkedRep cb sb) => TypedSymbol cb -> sb -> a -> a
+ Grisette.Internal.Core.Data.Class.SubstSym: genericSubstSym :: (Generic a, GSubstSym Arity0 (Rep a), LinkedRep cb sb, IsSymbolKind knd) => TypedSymbol knd cb -> sb -> a -> a
- Grisette.Internal.Core.Data.Class.SubstSym: gsubstSym :: (GSubstSym arity f, LinkedRep cb sb) => SubstSymArgs arity a cb sb -> TypedSymbol cb -> sb -> f a -> f a
+ Grisette.Internal.Core.Data.Class.SubstSym: gsubstSym :: (GSubstSym arity f, LinkedRep cb sb, IsSymbolKind knd) => SubstSymArgs arity knd a cb sb -> TypedSymbol knd cb -> sb -> f a -> f a
- Grisette.Internal.Core.Data.Class.SubstSym: liftSubstSym :: (SubstSym1 f, LinkedRep cb sb) => (TypedSymbol cb -> sb -> a -> a) -> TypedSymbol cb -> sb -> f a -> f a
+ Grisette.Internal.Core.Data.Class.SubstSym: liftSubstSym :: (SubstSym1 f, LinkedRep cb sb, IsSymbolKind knd) => (TypedSymbol knd cb -> sb -> a -> a) -> TypedSymbol knd cb -> sb -> f a -> f a
- Grisette.Internal.Core.Data.Class.SubstSym: liftSubstSym2 :: (SubstSym2 f, LinkedRep cb sb) => (TypedSymbol cb -> sb -> a -> a) -> (TypedSymbol cb -> sb -> b -> b) -> TypedSymbol cb -> sb -> f a b -> f a b
+ Grisette.Internal.Core.Data.Class.SubstSym: liftSubstSym2 :: (SubstSym2 f, LinkedRep cb sb, IsSymbolKind knd) => (TypedSymbol knd cb -> sb -> a -> a) -> (TypedSymbol knd cb -> sb -> b -> b) -> TypedSymbol knd cb -> sb -> f a b -> f a b
- Grisette.Internal.Core.Data.Class.SubstSym: substSym :: (SubstSym a, LinkedRep cb sb) => TypedSymbol cb -> sb -> a -> a
+ Grisette.Internal.Core.Data.Class.SubstSym: substSym :: (SubstSym a, LinkedRep cb sb, IsSymbolKind knd) => TypedSymbol knd cb -> sb -> a -> a
- Grisette.Internal.Core.Data.Class.SubstSym: substSym1 :: (SubstSym1 f, SubstSym a, LinkedRep cb sb) => TypedSymbol cb -> sb -> f a -> f a
+ Grisette.Internal.Core.Data.Class.SubstSym: substSym1 :: (SubstSym1 f, SubstSym a, LinkedRep cb sb, IsSymbolKind knd) => TypedSymbol knd cb -> sb -> f a -> f a
- Grisette.Internal.Core.Data.Class.SubstSym: substSym2 :: (SubstSym2 f, SubstSym a, SubstSym b, LinkedRep cb sb) => TypedSymbol cb -> sb -> f a b -> f a b
+ Grisette.Internal.Core.Data.Class.SubstSym: substSym2 :: (SubstSym2 f, SubstSym a, SubstSym b, LinkedRep cb sb, IsSymbolKind knd) => TypedSymbol knd cb -> sb -> f a b -> f a b
- Grisette.Internal.Core.Data.Class.ToSym: class ToSym a b
+ Grisette.Internal.Core.Data.Class.ToSym: class (Mergeable b) => ToSym a b
- Grisette.Internal.Core.Data.Class.ToSym: class (forall a b. (ToSym a b) => ToSym (f1 a) (f2 b)) => ToSym1 f1 f2
+ Grisette.Internal.Core.Data.Class.ToSym: class (forall a b. (ToSym a b) => ToSym (f1 a) (f2 b), Mergeable1 f2) => ToSym1 f1 f2
- Grisette.Internal.Core.Data.Class.ToSym: class (forall a b. (ToSym a b) => ToSym1 (f1 a) (f2 b)) => ToSym2 f1 f2
+ Grisette.Internal.Core.Data.Class.ToSym: class (forall a b. (ToSym a b) => ToSym1 (f1 a) (f2 b), Mergeable2 f2) => ToSym2 f1 f2
- Grisette.Internal.Core.Data.Class.ToSym: genericLiftToSym :: (Generic1 f1, Generic1 f2, GToSym Arity1 (Rep1 f1) (Rep1 f2)) => (a -> b) -> f1 a -> f2 b
+ Grisette.Internal.Core.Data.Class.ToSym: genericLiftToSym :: (Generic1 f1, Generic1 f2, GToSym Arity1 (Rep1 f1) (Rep1 f2), Mergeable b) => (a -> b) -> f1 a -> f2 b
- Grisette.Internal.Core.Data.Class.ToSym: liftToSym :: ToSym1 f1 f2 => (a -> b) -> f1 a -> f2 b
+ Grisette.Internal.Core.Data.Class.ToSym: liftToSym :: (ToSym1 f1 f2, Mergeable b) => (a -> b) -> f1 a -> f2 b
- Grisette.Internal.SymPrim.GeneralFun: [GeneralFun] :: (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Term b -> a --> b
+ Grisette.Internal.SymPrim.GeneralFun: [GeneralFun] :: (SupportedPrim a, SupportedPrim b) => TypedConstantSymbol a -> Term b -> a --> b
- Grisette.Internal.SymPrim.GeneralFun: buildGeneralFun :: (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Term b -> a --> b
+ Grisette.Internal.SymPrim.GeneralFun: buildGeneralFun :: (SupportedNonFuncPrim a, SupportedPrim b) => TypedConstantSymbol a -> Term b -> a --> b
- Grisette.Internal.SymPrim.GeneralFun: substTerm :: forall a b. (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Term a -> Term b -> Term b
+ Grisette.Internal.SymPrim.GeneralFun: substTerm :: forall knd a b. (SupportedPrim a, SupportedPrim b, IsSymbolKind knd) => TypedSymbol knd a -> Term a -> Term b -> Term b
- Grisette.Internal.SymPrim.Prim.Internal.Term: [EqTerm] :: SupportedPrim t => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [EqTerm] :: SupportedNonFuncPrim t => {-# UNPACK #-} !Id -> !Term t -> !Term t -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [SomeTypedSymbol] :: forall t. TypeRep t -> TypedSymbol t -> SomeTypedSymbol
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [SomeTypedSymbol] :: forall knd t. TypeRep t -> TypedSymbol knd t -> SomeTypedSymbol knd
- Grisette.Internal.SymPrim.Prim.Internal.Term: [SymTerm] :: SupportedPrim t => {-# UNPACK #-} !Id -> !TypedSymbol t -> Term t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [SymTerm] :: SupportedPrim t => {-# UNPACK #-} !Id -> !TypedSymbol 'AnyKind t -> Term t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [TypedSymbol] :: SupportedPrim t => Symbol -> TypedSymbol t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [TypedSymbol] :: (SupportedPrim t, SymbolKindConstraint knd t, IsSymbolKind knd) => Symbol -> TypedSymbol knd t
- Grisette.Internal.SymPrim.Prim.Internal.Term: [UEqTerm] :: SupportedPrim t => !Term t -> !Term t -> UTerm Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [UEqTerm] :: SupportedNonFuncPrim t => !Term t -> !Term t -> UTerm Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: [USymTerm] :: SupportedPrim t => !TypedSymbol t -> UTerm t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: [USymTerm] :: SupportedPrim t => !TypedSymbol 'AnyKind t -> UTerm t
- Grisette.Internal.SymPrim.Prim.Internal.Term: class (forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n), SizedBV bv, Typeable bv) => PEvalBVTerm bv
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (forall n. (KnownNat n, 1 <= n) => SupportedNonFuncPrim (bv n), SizedBV bv, Typeable bv) => PEvalBVTerm bv
- Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedPrim t, Bits t) => PEvalBitwiseTerm t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedNonFuncPrim t, Bits t) => PEvalBitwiseTerm t
- Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedPrim t, Integral t) => PEvalDivModIntegralTerm t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedNonFuncPrim t, Integral t) => PEvalDivModIntegralTerm t
- Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedPrim t, Floating t) => PEvalFloatingTerm t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedNonFuncPrim t) => PEvalFloatingTerm t
- Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedPrim t, Fractional t) => PEvalFractionalTerm t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedNonFuncPrim t, Fractional t) => PEvalFractionalTerm t
- Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedPrim t, Num t) => PEvalNumTerm t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedNonFuncPrim t, Num t) => PEvalNumTerm t
- Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedPrim t, Ord t) => PEvalOrdTerm t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: class (SupportedNonFuncPrim t, Ord t) => PEvalOrdTerm t
- Grisette.Internal.SymPrim.Prim.Internal.Term: conNonFuncSBVTerm :: (SupportedNonFuncPrim a, KnownIsZero n) => proxy n -> a -> SBV (NonFuncSBVBaseType n a)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: conNonFuncSBVTerm :: SupportedNonFuncPrim a => a -> SBV (NonFuncSBVBaseType a)
- Grisette.Internal.SymPrim.Prim.Internal.Term: conSBVTerm :: (SupportedPrim t, KnownIsZero n) => proxy n -> t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: conSBVTerm :: SupportedPrim t => t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: data SomeTypedSymbol
+ Grisette.Internal.SymPrim.Prim.Internal.Term: data SomeTypedSymbol knd
- Grisette.Internal.SymPrim.Prim.Internal.Term: data TypedSymbol t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: data TypedSymbol (knd :: SymbolKind) t
- Grisette.Internal.SymPrim.Prim.Internal.Term: eqTerm :: SupportedPrim a => Term a -> Term a -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: eqTerm :: SupportedNonFuncPrim a => Term a -> Term a -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: pevalDefaultEqTerm :: SupportedPrim a => Term a -> Term a -> Term Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pevalDefaultEqTerm :: SupportedNonFuncPrim a => Term a -> Term a -> Term Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: pformatSym :: SupportedPrim t => TypedSymbol t -> String
+ Grisette.Internal.SymPrim.Prim.Internal.Term: pformatSym :: SupportedPrim t => TypedSymbol 'AnyKind t -> String
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvAbsNumTerm :: forall proxy n. (PEvalNumTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvAbsNumTerm :: PEvalNumTerm t => SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvAddNumTerm :: forall proxy n. (PEvalNumTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvAddNumTerm :: PEvalNumTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvAndBitsTerm :: (PEvalBitwiseTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvAndBitsTerm :: PEvalBitwiseTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvApplyTerm :: (PEvalApplyTerm f a b, KnownIsZero n) => proxy n -> SBVType n f -> SBVType n a -> SBVType n b
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvApplyTerm :: PEvalApplyTerm f a b => SBVType f -> SBVType a -> SBVType b
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvBVConcatTerm :: (PEvalBVTerm bv, KnownIsZero n, KnownNat l, KnownNat r, 1 <= l, 1 <= r) => p0 n -> p1 l -> p2 r -> SBVType n (bv l) -> SBVType n (bv r) -> SBVType n (bv (l + r))
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvBVConcatTerm :: (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r) => p1 l -> p2 r -> SBVType (bv l) -> SBVType (bv r) -> SBVType (bv (l + r))
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvBVExtendTerm :: (PEvalBVTerm bv, KnownIsZero n, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) => p0 n -> p1 l -> p2 r -> Bool -> SBVType n (bv l) -> SBVType n (bv r)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvBVExtendTerm :: (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) => p1 l -> p2 r -> Bool -> SBVType (bv l) -> SBVType (bv r)
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvBVSelectTerm :: (PEvalBVTerm bv, KnownIsZero int, KnownNat ix, KnownNat w, KnownNat n, 1 <= n, 1 <= w, (ix + w) <= n) => p0 int -> p1 ix -> p2 w -> p3 n -> SBVType int (bv n) -> SBVType int (bv w)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvBVSelectTerm :: (PEvalBVTerm bv, KnownNat ix, KnownNat w, KnownNat n, 1 <= n, 1 <= w, (ix + w) <= n) => p1 ix -> p2 w -> p3 n -> SBVType (bv n) -> SBVType (bv w)
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvComplementBitsTerm :: (PEvalBitwiseTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvComplementBitsTerm :: PEvalBitwiseTerm t => SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvDivIntegralTerm :: forall proxy n. (PEvalDivModIntegralTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvDivIntegralTerm :: PEvalDivModIntegralTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvEq :: (SupportedPrim t, KnownIsZero n, EqSymbolic (SBVType n t)) => proxy n -> SBVType n t -> SBVType n t -> SBV Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvEq :: (SupportedPrim t, EqSymbolic (SBVType t)) => SBVType t -> SBVType t -> SBV Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvFdivTerm :: (PEvalFractionalTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvFdivTerm :: PEvalFractionalTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvIte :: (SupportedPrim t, KnownIsZero n) => proxy n -> SBV Bool -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvIte :: SupportedPrim t => SBV Bool -> SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvLeOrdTerm :: (PEvalOrdTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBV Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvLeOrdTerm :: PEvalOrdTerm t => SBVType t -> SBVType t -> SBV Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvLtOrdTerm :: (PEvalOrdTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBV Bool
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvLtOrdTerm :: PEvalOrdTerm t => SBVType t -> SBVType t -> SBV Bool
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvModIntegralTerm :: forall proxy n. (PEvalDivModIntegralTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvModIntegralTerm :: PEvalDivModIntegralTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvMulNumTerm :: forall proxy n. (PEvalNumTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvMulNumTerm :: PEvalNumTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvNegNumTerm :: forall proxy n. (PEvalNumTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvNegNumTerm :: PEvalNumTerm t => SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvOrBitsTerm :: (PEvalBitwiseTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvOrBitsTerm :: PEvalBitwiseTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvQuotIntegralTerm :: forall proxy n. (PEvalDivModIntegralTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvQuotIntegralTerm :: PEvalDivModIntegralTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvRecipTerm :: (PEvalFractionalTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvRecipTerm :: PEvalFractionalTerm t => SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvRemIntegralTerm :: forall proxy n. (PEvalDivModIntegralTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvRemIntegralTerm :: PEvalDivModIntegralTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvRotateLeftTerm :: forall proxy n. (PEvalRotateTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvRotateLeftTerm :: PEvalRotateTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvRotateRightTerm :: forall proxy n. (PEvalRotateTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvRotateRightTerm :: PEvalRotateTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvShiftLeftTerm :: forall proxy n. (PEvalShiftTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvShiftLeftTerm :: PEvalShiftTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvShiftRightTerm :: forall proxy n. (PEvalShiftTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvShiftRightTerm :: PEvalShiftTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvSignumNumTerm :: forall proxy n. (PEvalNumTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvSignumNumTerm :: PEvalNumTerm t => SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: sbvXorBitsTerm :: (PEvalBitwiseTerm t, KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t
+ Grisette.Internal.SymPrim.Prim.Internal.Term: sbvXorBitsTerm :: PEvalBitwiseTerm t => SBVType t -> SBVType t -> SBVType t
- Grisette.Internal.SymPrim.Prim.Internal.Term: showUntyped :: TypedSymbol t -> String
+ Grisette.Internal.SymPrim.Prim.Internal.Term: showUntyped :: TypedSymbol knd t -> String
- Grisette.Internal.SymPrim.Prim.Internal.Term: someTypedSymbol :: forall t. TypedSymbol t -> SomeTypedSymbol
+ Grisette.Internal.SymPrim.Prim.Internal.Term: someTypedSymbol :: forall knd t. TypedSymbol knd t -> SomeTypedSymbol knd
- Grisette.Internal.SymPrim.Prim.Internal.Term: symNonFuncSBVTerm :: (SupportedNonFuncPrim a, SBVFreshMonad m, KnownIsZero n) => proxy n -> String -> m (SBV (NonFuncSBVBaseType n a))
+ Grisette.Internal.SymPrim.Prim.Internal.Term: symNonFuncSBVTerm :: (SupportedNonFuncPrim a, SBVFreshMonad m) => String -> m (SBV (NonFuncSBVBaseType a))
- Grisette.Internal.SymPrim.Prim.Internal.Term: symSBVName :: SupportedPrim t => TypedSymbol t -> Int -> String
+ Grisette.Internal.SymPrim.Prim.Internal.Term: symSBVName :: SupportedPrim t => TypedSymbol 'AnyKind t -> Int -> String
- Grisette.Internal.SymPrim.Prim.Internal.Term: symSBVTerm :: (SupportedPrim t, SBVFreshMonad m, KnownIsZero n) => proxy n -> String -> m (SBVType n t)
+ Grisette.Internal.SymPrim.Prim.Internal.Term: symSBVTerm :: (SupportedPrim t, SBVFreshMonad m) => String -> m (SBVType t)
- Grisette.Internal.SymPrim.Prim.Internal.Term: type NonFuncSBVBaseType (n :: Nat) a;
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type NonFuncSBVBaseType a;
- Grisette.Internal.SymPrim.Prim.Internal.Term: type PrimConstraint _ _ = ();
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type PrimConstraint _ = ();
- Grisette.Internal.SymPrim.Prim.Internal.Term: type SBVType (n :: Nat) t;
+ Grisette.Internal.SymPrim.Prim.Internal.Term: type SBVType t;
- Grisette.Internal.SymPrim.Prim.Internal.Term: withNonFuncPrim :: (SupportedNonFuncPrim a, KnownIsZero n) => proxy n -> ((SymVal (NonFuncSBVBaseType n a), EqSymbolic (SBVType n a), Mergeable (SBVType n a), SMTDefinable (SBVType n a), Mergeable (SBVType n a), SBVType n a ~ SBV (NonFuncSBVBaseType n a), PrimConstraint n a) => r) -> r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withNonFuncPrim :: SupportedNonFuncPrim a => (NonFuncPrimConstraint a => r) -> r
- Grisette.Internal.SymPrim.Prim.Internal.Term: withPrim :: (SupportedPrim t, KnownIsZero n) => p n -> ((PrimConstraint n t, SMTDefinable (SBVType n t), Mergeable (SBVType n t), Typeable (SBVType n t)) => a) -> a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withPrim :: SupportedPrim t => ((PrimConstraint t, SMTDefinable (SBVType t), Mergeable (SBVType t), Typeable (SBVType t)) => a) -> a
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvBitwiseTermConstraint :: (PEvalBitwiseTerm t, KnownIsZero n) => proxy n -> (Bits (SBVType n t) => r) -> r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvBitwiseTermConstraint :: PEvalBitwiseTerm t => (Bits (SBVType t) => r) -> r
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvDivModIntegralTermConstraint :: (PEvalDivModIntegralTerm t, KnownIsZero n) => proxy n -> (SDivisible (SBVType n t) => r) -> r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvDivModIntegralTermConstraint :: PEvalDivModIntegralTerm t => (SDivisible (SBVType t) => r) -> r
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvFloatingTermConstraint :: (PEvalFloatingTerm t, KnownIsZero n) => proxy n -> (Floating (SBVType n t) => r) -> r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvFloatingTermConstraint :: PEvalFloatingTerm t => (Floating (SBVType t) => r) -> r
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvFractionalTermConstraint :: (PEvalFractionalTerm t, KnownIsZero n) => proxy n -> (Fractional (SBVType n t) => r) -> r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvFractionalTermConstraint :: PEvalFractionalTerm t => (Fractional (SBVType t) => r) -> r
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvNumTermConstraint :: (PEvalNumTerm t, KnownIsZero n) => proxy n -> (Num (SBVType n t) => r) -> r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvNumTermConstraint :: PEvalNumTerm t => (Num (SBVType t) => r) -> r
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvOrdTermConstraint :: (PEvalOrdTerm t, KnownIsZero n) => proxy n -> (OrdSymbolic (SBVType n t) => r) -> r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvOrdTermConstraint :: PEvalOrdTerm t => (OrdSymbolic (SBVType t) => r) -> r
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvRotateTermConstraint :: (PEvalRotateTerm t, KnownIsZero n) => proxy n -> (SIntegral (NonFuncSBVBaseType n t) => r) -> r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvRotateTermConstraint :: PEvalRotateTerm t => (SIntegral (NonFuncSBVBaseType t) => r) -> r
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvShiftTermConstraint :: (PEvalShiftTerm t, KnownIsZero n) => proxy n -> (SIntegral (NonFuncSBVBaseType n t) => r) -> r
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withSbvShiftTermConstraint :: PEvalShiftTerm t => (SIntegral (NonFuncSBVBaseType t) => r) -> r
- Grisette.Internal.SymPrim.Prim.Internal.Term: withSymbolSupported :: TypedSymbol t -> (SupportedPrim t => a) -> a
+ Grisette.Internal.SymPrim.Prim.Internal.Term: withSymbolSupported :: TypedSymbol knd t -> (SupportedPrim t => a) -> a
- Grisette.Internal.SymPrim.Prim.Model: (::=) :: TypedSymbol t -> t -> ModelValuePair t
+ Grisette.Internal.SymPrim.Prim.Model: (::=) :: TypedAnySymbol t -> t -> ModelValuePair t
- Grisette.Internal.SymPrim.Prim.Model: Model :: HashMap SomeTypedSymbol ModelValue -> Model
+ Grisette.Internal.SymPrim.Prim.Model: Model :: HashMap SomeTypedAnySymbol ModelValue -> Model
- Grisette.Internal.SymPrim.Prim.Model: SymbolSet :: HashSet SomeTypedSymbol -> SymbolSet
+ Grisette.Internal.SymPrim.Prim.Model: SymbolSet :: HashSet (SomeTypedSymbol knd) -> SymbolSet knd
- Grisette.Internal.SymPrim.Prim.Model: [unModel] :: Model -> HashMap SomeTypedSymbol ModelValue
+ Grisette.Internal.SymPrim.Prim.Model: [unModel] :: Model -> HashMap SomeTypedAnySymbol ModelValue
- Grisette.Internal.SymPrim.Prim.Model: [unSymbolSet] :: SymbolSet -> HashSet SomeTypedSymbol
+ Grisette.Internal.SymPrim.Prim.Model: [unSymbolSet] :: SymbolSet knd -> HashSet (SomeTypedSymbol knd)
- Grisette.Internal.SymPrim.Prim.Model: equation :: TypedSymbol a -> Model -> Maybe (Term Bool)
+ Grisette.Internal.SymPrim.Prim.Model: equation :: TypedAnySymbol a -> Model -> Maybe (Term Bool)
- Grisette.Internal.SymPrim.Prim.Model: newtype SymbolSet
+ Grisette.Internal.SymPrim.Prim.Model: newtype SymbolSet knd
- Grisette.Internal.SymPrim.Prim.TermUtils: extractTerm :: SupportedPrim a => Term a -> HashSet SomeTypedSymbol
+ Grisette.Internal.SymPrim.Prim.TermUtils: extractTerm :: (IsSymbolKind knd, SymbolKindConstraint knd a, SupportedPrim a) => HashSet SomeTypedConstantSymbol -> Term a -> Maybe (HashSet (SomeTypedSymbol knd))
- Grisette.Internal.SymPrim.SomeBV: binSomeBV :: (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> r) -> SomeBV bv -> SomeBV bv -> r
+ Grisette.Internal.SymPrim.SomeBV: binSomeBV :: (forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> r) -> (Integer -> Integer -> r) -> SomeBV bv -> SomeBV bv -> r
- Grisette.Internal.SymPrim.SomeBV: binSomeBVR1 :: (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> bv n) -> SomeBV bv -> SomeBV bv -> SomeBV bv
+ Grisette.Internal.SymPrim.SomeBV: binSomeBVR1 :: (forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> bv n) -> (Integer -> Integer -> Integer) -> SomeBV bv -> SomeBV bv -> SomeBV bv
- Grisette.Internal.SymPrim.SomeBV: binSomeBVR2 :: (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> (bv n, bv n)) -> SomeBV bv -> SomeBV bv -> (SomeBV bv, SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: binSomeBVR2 :: (forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> (bv n, bv n)) -> (Integer -> Integer -> (Integer, Integer)) -> SomeBV bv -> SomeBV bv -> (SomeBV bv, SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: binSomeBVSafe :: (MonadError (Either BitwidthMismatch e) m, TryMerge m, Mergeable e, Mergeable r) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m r) -> SomeBV bv -> SomeBV bv -> m r
+ Grisette.Internal.SymPrim.SomeBV: binSomeBVSafe :: (MonadError (Either SomeBVException e) m, TryMerge m, Mergeable e, Mergeable r, forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m r) -> (Integer -> Integer -> ExceptT (Either SomeBVException e) m r) -> SomeBV bv -> SomeBV bv -> m r
- Grisette.Internal.SymPrim.SomeBV: binSomeBVSafeR1 :: (MonadError (Either BitwidthMismatch e) m, TryMerge m, Mergeable e, forall n. (KnownNat n, 1 <= n) => Mergeable (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m (bv n)) -> SomeBV bv -> SomeBV bv -> m (SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: binSomeBVSafeR1 :: (MonadError (Either SomeBVException e) m, TryMerge m, Mergeable e, forall n. (KnownNat n, 1 <= n) => Mergeable (bv n), forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m (bv n)) -> (Integer -> Integer -> ExceptT (Either SomeBVException e) m Integer) -> SomeBV bv -> SomeBV bv -> m (SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: binSomeBVSafeR2 :: (MonadError (Either BitwidthMismatch e) m, TryMerge m, Mergeable e, forall n. (KnownNat n, 1 <= n) => Mergeable (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m (bv n, bv n)) -> SomeBV bv -> SomeBV bv -> m (SomeBV bv, SomeBV bv)
+ Grisette.Internal.SymPrim.SomeBV: binSomeBVSafeR2 :: (MonadError (Either SomeBVException e) m, TryMerge m, Mergeable e, forall n. (KnownNat n, 1 <= n) => Mergeable (bv n), forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m (bv n, bv n)) -> (Integer -> Integer -> ExceptT (Either SomeBVException e) m (Integer, Integer)) -> SomeBV bv -> SomeBV bv -> m (SomeBV bv, SomeBV bv)
- Grisette.Internal.SymPrim.SomeBV: unarySomeBV :: forall bv r. (forall n. (KnownNat n, 1 <= n) => bv n -> r) -> SomeBV bv -> r
+ Grisette.Internal.SymPrim.SomeBV: unarySomeBV :: forall bv r. (forall n. (KnownNat n, 1 <= n) => bv n -> r) -> (Integer -> r) -> SomeBV bv -> r
- Grisette.Internal.SymPrim.SomeBV: unarySomeBVR1 :: (forall n. (KnownNat n, 1 <= n) => bv n -> bv n) -> SomeBV bv -> SomeBV bv
+ Grisette.Internal.SymPrim.SomeBV: unarySomeBVR1 :: (forall n. (KnownNat n, 1 <= n) => bv n -> bv n) -> (Integer -> Integer) -> SomeBV bv -> SomeBV bv
- Grisette.Internal.SymPrim.SymGeneralFun: (-->) :: (SupportedPrim ca, SupportedPrim cb, LinkedRep cb sb) => TypedSymbol ca -> sb -> ca --> cb
+ Grisette.Internal.SymPrim.SymGeneralFun: (-->) :: (SupportedNonFuncPrim ca, SupportedPrim cb, LinkedRep cb sb) => TypedConstantSymbol ca -> sb -> ca --> cb
- Grisette.Internal.TH.DeriveBuiltin: deriveBuiltinExtra :: [SomeDeriveTypeParamHandler] -> Bool -> Strategy -> [Name] -> Name -> Q [Dec]
+ Grisette.Internal.TH.DeriveBuiltin: deriveBuiltinExtra :: [SomeDeriveTypeParamHandler] -> Maybe [SomeDeriveTypeParamHandler] -> Bool -> Strategy -> [Name] -> Name -> Q [Dec]
- Grisette.Internal.TH.DerivePredefined: derivePredefined :: Maybe EvalModeTag -> Name -> Name -> Q [Dec]
+ Grisette.Internal.TH.DerivePredefined: derivePredefined :: Name -> Name -> Q [Dec]
- Grisette.Internal.TH.DerivePredefined: derivePredefinedMultipleClasses :: Maybe EvalModeTag -> [Name] -> Name -> Q [Dec]
+ Grisette.Internal.TH.DerivePredefined: derivePredefinedMultipleClasses :: [Name] -> Name -> Q [Dec]
- Grisette.Lib.Data.Bool: mrgFalse :: forall m_a5SMr. (Mergeable Bool, Applicative m_a5SMr, TryMerge m_a5SMr) => m_a5SMr Bool
+ Grisette.Lib.Data.Bool: mrgFalse :: forall m_a6GSQ. (Mergeable Bool, Applicative m_a6GSQ, TryMerge m_a6GSQ) => m_a6GSQ Bool
- Grisette.Lib.Data.Bool: mrgTrue :: forall m_a5SMs. (Mergeable Bool, Applicative m_a5SMs, TryMerge m_a5SMs) => m_a5SMs Bool
+ Grisette.Lib.Data.Bool: mrgTrue :: forall m_a6GSR. (Mergeable Bool, Applicative m_a6GSR, TryMerge m_a6GSR) => m_a6GSR Bool
- Grisette.Lib.Data.Either: mrgLeft :: forall (a_arPV :: Type) (b_arPW :: Type) m_a5SKg. (Mergeable (Either a_arPV b_arPW), Applicative m_a5SKg, TryMerge m_a5SKg) => a_arPV -> m_a5SKg (Either a_arPV b_arPW)
+ Grisette.Lib.Data.Either: mrgLeft :: forall (a_apC9 :: Type) (b_apCa :: Type) m_a6GQF. (Mergeable (Either a_apC9 b_apCa), Applicative m_a6GQF, TryMerge m_a6GQF) => a_apC9 -> m_a6GQF (Either a_apC9 b_apCa)
- Grisette.Lib.Data.Either: mrgRight :: forall (a_arPV :: Type) (b_arPW :: Type) m_a5SKi. (Mergeable (Either a_arPV b_arPW), Applicative m_a5SKi, TryMerge m_a5SKi) => b_arPW -> m_a5SKi (Either a_arPV b_arPW)
+ Grisette.Lib.Data.Either: mrgRight :: forall (a_apC9 :: Type) (b_apCa :: Type) m_a6GQH. (Mergeable (Either a_apC9 b_apCa), Applicative m_a6GQH, TryMerge m_a6GQH) => b_apCa -> m_a6GQH (Either a_apC9 b_apCa)
- Grisette.Lib.Data.Functor.Sum: mrgInL :: forall (k_a37Js :: Type) (f_a37Jt :: k_a37Js -> Type) (g_a37Ju :: k_a37Js -> Type) (a_a37Jv :: k_a37Js) m_a5SHr. (Mergeable (Sum f_a37Jt g_a37Ju a_a37Jv), Applicative m_a5SHr, TryMerge m_a5SHr) => f_a37Jt a_a37Jv -> m_a5SHr (Sum f_a37Jt g_a37Ju a_a37Jv)
+ Grisette.Lib.Data.Functor.Sum: mrgInL :: forall (k_a3UIG :: Type) (f_a3UIH :: k_a3UIG -> Type) (g_a3UII :: k_a3UIG -> Type) (a_a3UIJ :: k_a3UIG) m_a6GNQ. (Mergeable (Sum f_a3UIH g_a3UII a_a3UIJ), Applicative m_a6GNQ, TryMerge m_a6GNQ) => f_a3UIH a_a3UIJ -> m_a6GNQ (Sum f_a3UIH g_a3UII a_a3UIJ)
- Grisette.Lib.Data.Functor.Sum: mrgInR :: forall (k_a37Js :: Type) (f_a37Jt :: k_a37Js -> Type) (g_a37Ju :: k_a37Js -> Type) (a_a37Jv :: k_a37Js) m_a5SHt. (Mergeable (Sum f_a37Jt g_a37Ju a_a37Jv), Applicative m_a5SHt, TryMerge m_a5SHt) => g_a37Ju a_a37Jv -> m_a5SHt (Sum f_a37Jt g_a37Ju a_a37Jv)
+ Grisette.Lib.Data.Functor.Sum: mrgInR :: forall (k_a3UIG :: Type) (f_a3UIH :: k_a3UIG -> Type) (g_a3UII :: k_a3UIG -> Type) (a_a3UIJ :: k_a3UIG) m_a6GNS. (Mergeable (Sum f_a3UIH g_a3UII a_a3UIJ), Applicative m_a6GNS, TryMerge m_a6GNS) => g_a3UII a_a3UIJ -> m_a6GNS (Sum f_a3UIH g_a3UII a_a3UIJ)
- Grisette.Lib.Data.Maybe: mrgJust :: forall (a_11 :: Type) m_a5SFk. (Mergeable (Maybe a_11), Applicative m_a5SFk, TryMerge m_a5SFk) => a_11 -> m_a5SFk (Maybe a_11)
+ Grisette.Lib.Data.Maybe: mrgJust :: forall (a_11 :: Type) m_a6GLJ. (Mergeable (Maybe a_11), Applicative m_a6GLJ, TryMerge m_a6GLJ) => a_11 -> m_a6GLJ (Maybe a_11)
- Grisette.Lib.Data.Maybe: mrgNothing :: forall (a_11 :: Type) m_a5SFj. (Mergeable (Maybe a_11), Applicative m_a5SFj, TryMerge m_a5SFj) => m_a5SFj (Maybe a_11)
+ Grisette.Lib.Data.Maybe: mrgNothing :: forall (a_11 :: Type) m_a6GLI. (Mergeable (Maybe a_11), Applicative m_a6GLI, TryMerge m_a6GLI) => m_a6GLI (Maybe a_11)
- Grisette.Lib.Data.Tuple: mrgTuple2 :: forall (a_11 :: Type) (b_12 :: Type) m_a5Ss4. (Mergeable ((,) a_11 b_12), Applicative m_a5Ss4, TryMerge m_a5Ss4) => a_11 -> b_12 -> m_a5Ss4 ((,) a_11 b_12)
+ Grisette.Lib.Data.Tuple: mrgTuple2 :: forall (a_11 :: Type) (b_12 :: Type) m_a6Gyt. (Mergeable ((,) a_11 b_12), Applicative m_a6Gyt, TryMerge m_a6Gyt) => a_11 -> b_12 -> m_a6Gyt ((,) a_11 b_12)
- Grisette.Lib.Data.Tuple: mrgTuple3 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) m_a5Sth. (Mergeable ((,,) a_11 b_12 c_13), Applicative m_a5Sth, TryMerge m_a5Sth) => a_11 -> b_12 -> c_13 -> m_a5Sth ((,,) a_11 b_12 c_13)
+ Grisette.Lib.Data.Tuple: mrgTuple3 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) m_a6GzG. (Mergeable ((,,) a_11 b_12 c_13), Applicative m_a6GzG, TryMerge m_a6GzG) => a_11 -> b_12 -> c_13 -> m_a6GzG ((,,) a_11 b_12 c_13)
- Grisette.Lib.Data.Tuple: mrgTuple4 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) m_a5SuG. (Mergeable ((,,,) a_11 b_12 c_13 d_14), Applicative m_a5SuG, TryMerge m_a5SuG) => a_11 -> b_12 -> c_13 -> d_14 -> m_a5SuG ((,,,) a_11 b_12 c_13 d_14)
+ Grisette.Lib.Data.Tuple: mrgTuple4 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) m_a6GB5. (Mergeable ((,,,) a_11 b_12 c_13 d_14), Applicative m_a6GB5, TryMerge m_a6GB5) => a_11 -> b_12 -> c_13 -> d_14 -> m_a6GB5 ((,,,) a_11 b_12 c_13 d_14)
- Grisette.Lib.Data.Tuple: mrgTuple5 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) m_a5Swh. (Mergeable ((,,,,) a_11 b_12 c_13 d_14 e_15), Applicative m_a5Swh, TryMerge m_a5Swh) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> m_a5Swh ((,,,,) a_11 b_12 c_13 d_14 e_15)
+ Grisette.Lib.Data.Tuple: mrgTuple5 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) m_a6GCG. (Mergeable ((,,,,) a_11 b_12 c_13 d_14 e_15), Applicative m_a6GCG, TryMerge m_a6GCG) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> m_a6GCG ((,,,,) a_11 b_12 c_13 d_14 e_15)
- Grisette.Lib.Data.Tuple: mrgTuple6 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) m_a5Sy4. (Mergeable ((,,,,,) a_11 b_12 c_13 d_14 e_15 f_16), Applicative m_a5Sy4, TryMerge m_a5Sy4) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> m_a5Sy4 ((,,,,,) a_11 b_12 c_13 d_14 e_15 f_16)
+ Grisette.Lib.Data.Tuple: mrgTuple6 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) m_a6GEt. (Mergeable ((,,,,,) a_11 b_12 c_13 d_14 e_15 f_16), Applicative m_a6GEt, TryMerge m_a6GEt) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> m_a6GEt ((,,,,,) a_11 b_12 c_13 d_14 e_15 f_16)
- Grisette.Lib.Data.Tuple: mrgTuple7 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) (g_17 :: Type) m_a5SA3. (Mergeable ((,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17), Applicative m_a5SA3, TryMerge m_a5SA3) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> g_17 -> m_a5SA3 ((,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17)
+ Grisette.Lib.Data.Tuple: mrgTuple7 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) (g_17 :: Type) m_a6GGs. (Mergeable ((,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17), Applicative m_a6GGs, TryMerge m_a6GGs) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> g_17 -> m_a6GGs ((,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17)
- Grisette.Lib.Data.Tuple: mrgTuple8 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) (g_17 :: Type) (h_18 :: Type) m_a5SCe. (Mergeable ((,,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17 h_18), Applicative m_a5SCe, TryMerge m_a5SCe) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> g_17 -> h_18 -> m_a5SCe ((,,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17 h_18)
+ Grisette.Lib.Data.Tuple: mrgTuple8 :: forall (a_11 :: Type) (b_12 :: Type) (c_13 :: Type) (d_14 :: Type) (e_15 :: Type) (f_16 :: Type) (g_17 :: Type) (h_18 :: Type) m_a6GID. (Mergeable ((,,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17 h_18), Applicative m_a6GID, TryMerge m_a6GID) => a_11 -> b_12 -> c_13 -> d_14 -> e_15 -> f_16 -> g_17 -> h_18 -> m_a6GID ((,,,,,,,) a_11 b_12 c_13 d_14 e_15 f_16 g_17 h_18)
- Grisette.Lib.Data.Tuple: mrgUnit :: forall m_a5Src. (Mergeable (), Applicative m_a5Src, TryMerge m_a5Src) => m_a5Src ()
+ Grisette.Lib.Data.Tuple: mrgUnit :: forall m_a6GxB. (Mergeable (), Applicative m_a6GxB, TryMerge m_a6GxB) => m_a6GxB ()
- Grisette.SymPrim: (-->) :: (SupportedPrim ca, SupportedPrim cb, LinkedRep cb sb) => TypedSymbol ca -> sb -> ca --> cb
+ Grisette.SymPrim: (-->) :: (SupportedNonFuncPrim ca, SupportedPrim cb, LinkedRep cb sb) => TypedConstantSymbol ca -> sb -> ca --> cb
- Grisette.SymPrim: (::=) :: TypedSymbol t -> t -> ModelValuePair t
+ Grisette.SymPrim: (::=) :: TypedAnySymbol t -> t -> ModelValuePair t
- Grisette.SymPrim: BitwidthMismatch :: BitwidthMismatch
+ Grisette.SymPrim: BitwidthMismatch :: SomeBVException
- Grisette.SymPrim: [TypedSymbol] :: SupportedPrim t => Symbol -> TypedSymbol t
+ Grisette.SymPrim: [TypedSymbol] :: (SupportedPrim t, SymbolKindConstraint knd t, IsSymbolKind knd) => Symbol -> TypedSymbol knd t
- Grisette.SymPrim: binSomeBV :: (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> r) -> SomeBV bv -> SomeBV bv -> r
+ Grisette.SymPrim: binSomeBV :: (forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> r) -> (Integer -> Integer -> r) -> SomeBV bv -> SomeBV bv -> r
- Grisette.SymPrim: binSomeBVR1 :: (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> bv n) -> SomeBV bv -> SomeBV bv -> SomeBV bv
+ Grisette.SymPrim: binSomeBVR1 :: (forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> bv n) -> (Integer -> Integer -> Integer) -> SomeBV bv -> SomeBV bv -> SomeBV bv
- Grisette.SymPrim: binSomeBVR2 :: (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> (bv n, bv n)) -> SomeBV bv -> SomeBV bv -> (SomeBV bv, SomeBV bv)
+ Grisette.SymPrim: binSomeBVR2 :: (forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> (bv n, bv n)) -> (Integer -> Integer -> (Integer, Integer)) -> SomeBV bv -> SomeBV bv -> (SomeBV bv, SomeBV bv)
- Grisette.SymPrim: binSomeBVSafe :: (MonadError (Either BitwidthMismatch e) m, TryMerge m, Mergeable e, Mergeable r) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m r) -> SomeBV bv -> SomeBV bv -> m r
+ Grisette.SymPrim: binSomeBVSafe :: (MonadError (Either SomeBVException e) m, TryMerge m, Mergeable e, Mergeable r, forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m r) -> (Integer -> Integer -> ExceptT (Either SomeBVException e) m r) -> SomeBV bv -> SomeBV bv -> m r
- Grisette.SymPrim: binSomeBVSafeR1 :: (MonadError (Either BitwidthMismatch e) m, TryMerge m, Mergeable e, forall n. (KnownNat n, 1 <= n) => Mergeable (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m (bv n)) -> SomeBV bv -> SomeBV bv -> m (SomeBV bv)
+ Grisette.SymPrim: binSomeBVSafeR1 :: (MonadError (Either SomeBVException e) m, TryMerge m, Mergeable e, forall n. (KnownNat n, 1 <= n) => Mergeable (bv n), forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m (bv n)) -> (Integer -> Integer -> ExceptT (Either SomeBVException e) m Integer) -> SomeBV bv -> SomeBV bv -> m (SomeBV bv)
- Grisette.SymPrim: binSomeBVSafeR2 :: (MonadError (Either BitwidthMismatch e) m, TryMerge m, Mergeable e, forall n. (KnownNat n, 1 <= n) => Mergeable (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m (bv n, bv n)) -> SomeBV bv -> SomeBV bv -> m (SomeBV bv, SomeBV bv)
+ Grisette.SymPrim: binSomeBVSafeR2 :: (MonadError (Either SomeBVException e) m, TryMerge m, Mergeable e, forall n. (KnownNat n, 1 <= n) => Mergeable (bv n), forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m (bv n, bv n)) -> (Integer -> Integer -> ExceptT (Either SomeBVException e) m (Integer, Integer)) -> SomeBV bv -> SomeBV bv -> m (SomeBV bv, SomeBV bv)
- Grisette.SymPrim: data SymbolSet
+ Grisette.SymPrim: data SymbolSet knd
- Grisette.SymPrim: data TypedSymbol t
+ Grisette.SymPrim: data TypedSymbol (knd :: SymbolKind) t
- Grisette.SymPrim: unarySomeBV :: forall bv r. (forall n. (KnownNat n, 1 <= n) => bv n -> r) -> SomeBV bv -> r
+ Grisette.SymPrim: unarySomeBV :: forall bv r. (forall n. (KnownNat n, 1 <= n) => bv n -> r) -> (Integer -> r) -> SomeBV bv -> r
- Grisette.SymPrim: unarySomeBVR1 :: (forall n. (KnownNat n, 1 <= n) => bv n -> bv n) -> SomeBV bv -> SomeBV bv
+ Grisette.SymPrim: unarySomeBVR1 :: (forall n. (KnownNat n, 1 <= n) => bv n -> bv n) -> (Integer -> Integer) -> SomeBV bv -> SomeBV bv
- Grisette.TH: deriveBuiltinExtra :: [SomeDeriveTypeParamHandler] -> Bool -> Strategy -> [Name] -> Name -> Q [Dec]
+ Grisette.TH: deriveBuiltinExtra :: [SomeDeriveTypeParamHandler] -> Maybe [SomeDeriveTypeParamHandler] -> Bool -> Strategy -> [Name] -> Name -> Q [Dec]
- Grisette.TH: derivePredefined :: Maybe EvalModeTag -> Name -> Name -> Q [Dec]
+ Grisette.TH: derivePredefined :: Name -> Name -> Q [Dec]
- Grisette.TH: derivePredefinedMultipleClasses :: Maybe EvalModeTag -> [Name] -> Name -> Q [Dec]
+ Grisette.TH: derivePredefinedMultipleClasses :: [Name] -> Name -> Q [Dec]
- Grisette.Unified: class (Typeable mode, UnifiedBool mode, UnifiedPrimitive mode (GetBool mode), UnifiedInteger mode, AllUnifiedBV mode, AllUnifiedData mode, Monad (BaseMonad mode), TryMerge (BaseMonad mode), UnifiedBranching mode (BaseMonad mode)) => EvalMode mode
+ Grisette.Unified: class (Typeable mode, UnifiedBool mode, UnifiedPrimitive mode (GetBool mode), UnifiedInteger mode, UnifiedAlgReal mode, AllUnifiedBV mode, AllUnifiedData mode, AllUnifiedFP mode, AllUnifiedBVFPConversion mode, AllUnifiedBVBVConversion mode, AllUnifiedFPFPConversion mode, Monad (BaseMonad mode), TryMerge (BaseMonad mode), UnifiedBranching mode (BaseMonad mode)) => EvalMode mode
- Grisette.Unified: safeDiv :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m a
+ Grisette.Unified: safeDiv :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m a
- Grisette.Unified: safeDivMod :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m (a, a)
+ Grisette.Unified: safeDivMod :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m (a, a)
- Grisette.Unified: safeMod :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m a
+ Grisette.Unified: safeMod :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m a
- Grisette.Unified: safeQuot :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m a
+ Grisette.Unified: safeQuot :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m a
- Grisette.Unified: safeQuotRem :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m (a, a)
+ Grisette.Unified: safeQuotRem :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m (a, a)
- Grisette.Unified: safeRem :: forall mode e a m. (MonadError e m, UnifiedSafeDivision mode e a m) => a -> a -> m a
+ Grisette.Unified: safeRem :: forall mode e a m. (MonadError e m, UnifiedSafeDiv mode e a m) => a -> a -> m a
- Grisette.Unified: type GetData mode v
+ Grisette.Unified: type GetData mode v = r | r -> mode v
- Grisette.Unified.Internal.EvalMode: class (Typeable mode, UnifiedBool mode, UnifiedPrimitive mode (GetBool mode), UnifiedInteger mode, AllUnifiedBV mode, AllUnifiedData mode, Monad (BaseMonad mode), TryMerge (BaseMonad mode), UnifiedBranching mode (BaseMonad mode)) => EvalMode mode
+ Grisette.Unified.Internal.EvalMode: class (Typeable mode, UnifiedBool mode, UnifiedPrimitive mode (GetBool mode), UnifiedInteger mode, UnifiedAlgReal mode, AllUnifiedBV mode, AllUnifiedData mode, AllUnifiedFP mode, AllUnifiedBVFPConversion mode, AllUnifiedBVBVConversion mode, AllUnifiedFPFPConversion mode, Monad (BaseMonad mode), TryMerge (BaseMonad mode), UnifiedBranching mode (BaseMonad mode)) => EvalMode mode
- Grisette.Unified.Internal.UnifiedBV: class (forall n m. (UnifiedBranching mode m, MonadError ArithException m, KnownNat n, 1 <= n) => SafeUnifiedBV mode n m, forall m. (UnifiedBranching mode m, MonadError (Either BitwidthMismatch ArithException) m) => SafeUnifiedSomeBV mode m, forall n. (KnownNat n, 1 <= n) => UnifiedBV mode n, SomeBVPair mode (GetSomeWordN mode) (GetSomeIntN mode)) => AllUnifiedBV mode
+ Grisette.Unified.Internal.UnifiedBV: class (forall n m. (UnifiedBranching mode m, MonadError ArithException m, KnownNat n, 1 <= n) => SafeUnifiedBV mode n m, forall m. (UnifiedBranching mode m, MonadError (Either SomeBVException ArithException) m) => SafeUnifiedSomeBV mode m, forall n. (KnownNat n, 1 <= n) => UnifiedBV mode n, SomeBVPair mode (GetSomeWordN mode) (GetSomeIntN mode), SizedBV (GetWordN mode), SizedBV (GetIntN mode)) => AllUnifiedBV mode
- Grisette.Unified.Internal.UnifiedData: class (forall v. (Mergeable v) => UnifiedData bool v) => AllUnifiedData bool
+ Grisette.Unified.Internal.UnifiedData: class (forall v. (Mergeable v) => UnifiedData bool v, forall v. (Mergeable v) => UnifiedDataSimpleMergeable v) => AllUnifiedData bool
- Grisette.Unified.Internal.UnifiedData: type GetData mode v
+ Grisette.Unified.Internal.UnifiedData: type GetData mode v = r | r -> mode v
Files
- CHANGELOG.md +72/−1
- README.md +19/−5
- doctest/Main.hs +28/−3
- grisette.cabal +50/−15
- src/Grisette/Backend.hs +4/−7
- src/Grisette/Core.hs +92/−45
- src/Grisette/Experimental.hs +8/−0
- src/Grisette/Experimental/GenSymConstrained.hs +5/−3
- src/Grisette/Experimental/MonadParallelUnion.hs +0/−1
- src/Grisette/Experimental/Qualified/ParallelUnionDo.hs +2/−0
- src/Grisette/Internal/Backend/QuantifiedStack.hs +86/−0
- src/Grisette/Internal/Backend/Solving.hs +392/−348
- src/Grisette/Internal/Backend/SymBiMap.hs +72/−13
- src/Grisette/Internal/Core/Control/Monad/CBMCExcept.hs +10/−9
- src/Grisette/Internal/Core/Control/Monad/Union.hs +7/−8
- src/Grisette/Internal/Core/Data/Class/BitCast.hs +49/−1
- src/Grisette/Internal/Core/Data/Class/BitVector.hs +0/−5
- src/Grisette/Internal/Core/Data/Class/CEGISSolver.hs +5/−9
- src/Grisette/Internal/Core/Data/Class/Error.hs +2/−4
- src/Grisette/Internal/Core/Data/Class/EvalSym.hs +31/−10
- src/Grisette/Internal/Core/Data/Class/ExtractSym.hs +195/−110
- src/Grisette/Internal/Core/Data/Class/Function.hs +0/−7
- src/Grisette/Internal/Core/Data/Class/GenSym.hs +9/−6
- src/Grisette/Internal/Core/Data/Class/IEEEFP.hs +85/−249
- src/Grisette/Internal/Core/Data/Class/ITEOp.hs +7/−5
- src/Grisette/Internal/Core/Data/Class/LogicalOp.hs +16/−5
- src/Grisette/Internal/Core/Data/Class/Mergeable.hs +150/−132
- src/Grisette/Internal/Core/Data/Class/ModelOps.hs +19/−19
- src/Grisette/Internal/Core/Data/Class/PPrint.hs +92/−26
- src/Grisette/Internal/Core/Data/Class/SafeBitCast.hs +141/−0
- src/Grisette/Internal/Core/Data/Class/SafeDiv.hs +475/−0
- src/Grisette/Internal/Core/Data/Class/SafeDivision.hs +0/−290
- src/Grisette/Internal/Core/Data/Class/SafeFdiv.hs +153/−0
- src/Grisette/Internal/Core/Data/Class/SafeFromFP.hs +265/−0
- src/Grisette/Internal/Core/Data/Class/SafeLogBase.hs +86/−0
- src/Grisette/Internal/Core/Data/Class/SimpleMergeable.hs +2/−0
- src/Grisette/Internal/Core/Data/Class/Solvable.hs +0/−2
- src/Grisette/Internal/Core/Data/Class/Solver.hs +4/−4
- src/Grisette/Internal/Core/Data/Class/SubstSym.hs +39/−27
- src/Grisette/Internal/Core/Data/Class/SymEq.hs +73/−12
- src/Grisette/Internal/Core/Data/Class/SymFiniteBits.hs +206/−0
- src/Grisette/Internal/Core/Data/Class/SymFromIntegral.hs +110/−0
- src/Grisette/Internal/Core/Data/Class/SymIEEEFP.hs +125/−0
- src/Grisette/Internal/Core/Data/Class/SymOrd.hs +12/−7
- src/Grisette/Internal/Core/Data/Class/ToCon.hs +9/−4
- src/Grisette/Internal/Core/Data/Class/ToSym.hs +82/−24
- src/Grisette/Internal/Core/Data/Symbol.hs +12/−1
- src/Grisette/Internal/SymPrim/AlgReal.hs +182/−0
- src/Grisette/Internal/SymPrim/AllSyms.hs +5/−3
- src/Grisette/Internal/SymPrim/BV.hs +17/−13
- src/Grisette/Internal/SymPrim/FP.hs +621/−34
- src/Grisette/Internal/SymPrim/FunInstanceGen.hs +253/−0
- src/Grisette/Internal/SymPrim/GeneralFun.hs +301/−461
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/BVPEval.hs +77/−75
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalBitCastTerm.hs +135/−0
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalBitwiseTerm.hs +2/−2
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalDivModIntegralTerm.hs +11/−13
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFP.hs +92/−8
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFloatingTerm.hs +34/−5
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFractionalTerm.hs +46/−3
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFromIntegralTerm.hs +176/−0
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalIEEEFPConvertibleTerm.hs +298/−0
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalNumTerm.hs +42/−35
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalOrdTerm.hs +26/−22
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalRotateTerm.hs +12/−10
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalShiftTerm.hs +6/−4
- src/Grisette/Internal/SymPrim/Prim/Internal/Instances/SupportedPrim.hs +204/−108
- src/Grisette/Internal/SymPrim/Prim/Internal/IsZero.hs +0/−44
- src/Grisette/Internal/SymPrim/Prim/Internal/PartialEval.hs +12/−0
- src/Grisette/Internal/SymPrim/Prim/Internal/Term.hs +3125/−2706
- src/Grisette/Internal/SymPrim/Prim/Internal/Unfold.hs +14/−9
- src/Grisette/Internal/SymPrim/Prim/Internal/Utils.hs +8/−0
- src/Grisette/Internal/SymPrim/Prim/Model.hs +131/−471
- src/Grisette/Internal/SymPrim/Prim/SomeTerm.hs +7/−1
- src/Grisette/Internal/SymPrim/Prim/Term.hs +4/−0
- src/Grisette/Internal/SymPrim/Prim/TermUtils.hs +228/−145
- src/Grisette/Internal/SymPrim/Quantifier.hs +199/−0
- src/Grisette/Internal/SymPrim/SomeBV.hs +603/−168
- src/Grisette/Internal/SymPrim/SymAlgReal.hs +136/−0
- src/Grisette/Internal/SymPrim/SymBV.hs +28/−8
- src/Grisette/Internal/SymPrim/SymBool.hs +5/−4
- src/Grisette/Internal/SymPrim/SymFP.hs +301/−8
- src/Grisette/Internal/SymPrim/SymGeneralFun.hs +7/−8
- src/Grisette/Internal/SymPrim/SymInteger.hs +2/−2
- src/Grisette/Internal/SymPrim/SymTabularFun.hs +2/−3
- src/Grisette/Internal/SymPrim/TabularFun.hs +54/−361
- src/Grisette/Internal/TH/DeriveBuiltin.hs +16/−7
- src/Grisette/Internal/TH/DerivePredefined.hs +83/−23
- src/Grisette/Internal/TH/UnifiedConstructor.hs +35/−18
- src/Grisette/Internal/TH/Util.hs +1/−1
- src/Grisette/Internal/Utils/Parameterized.hs +16/−16
- src/Grisette/SymPrim.hs +76/−20
- src/Grisette/Unified.hs +93/−3
- src/Grisette/Unified/Internal/BVBVConversion.hs +161/−0
- src/Grisette/Unified/Internal/BVFPConversion.hs +231/−0
- src/Grisette/Unified/Internal/Class/UnifiedFiniteBits.hs +203/−0
- src/Grisette/Unified/Internal/Class/UnifiedFromIntegral.hs +226/−0
- src/Grisette/Unified/Internal/Class/UnifiedITEOp.hs +11/−1
- src/Grisette/Unified/Internal/Class/UnifiedSafeBitCast.hs +128/−0
- src/Grisette/Unified/Internal/Class/UnifiedSafeDiv.hs +265/−0
- src/Grisette/Unified/Internal/Class/UnifiedSafeDivision.hs +0/−264
- src/Grisette/Unified/Internal/Class/UnifiedSafeFdiv.hs +83/−0
- src/Grisette/Unified/Internal/Class/UnifiedSafeFromFP.hs +213/−0
- src/Grisette/Unified/Internal/Class/UnifiedSafeLinearArith.hs +11/−10
- src/Grisette/Unified/Internal/Class/UnifiedSafeSymRotate.hs +12/−13
- src/Grisette/Unified/Internal/Class/UnifiedSafeSymShift.hs +12/−13
- src/Grisette/Unified/Internal/Class/UnifiedSimpleMergeable.hs +13/−0
- src/Grisette/Unified/Internal/Class/UnifiedSymEq.hs +31/−1
- src/Grisette/Unified/Internal/Class/UnifiedSymOrd.hs +10/−1
- src/Grisette/Unified/Internal/EvalMode.hs +11/−3
- src/Grisette/Unified/Internal/FPFPConversion.hs +127/−0
- src/Grisette/Unified/Internal/UnifiedAlgReal.hs +76/−0
- src/Grisette/Unified/Internal/UnifiedBV.hs +63/−35
- src/Grisette/Unified/Internal/UnifiedData.hs +34/−11
- src/Grisette/Unified/Internal/UnifiedFP.hs +191/−0
- src/Grisette/Unified/Internal/UnifiedInteger.hs +4/−2
- test/Grisette/Backend/CEGISTests.hs +2/−2
- test/Grisette/Backend/LoweringTests.hs +446/−136
- test/Grisette/Backend/TermRewritingGen.hs +277/−67
- test/Grisette/Backend/TermRewritingTests.hs +537/−37
- test/Grisette/Core/Control/Monad/UnionTests.hs +8/−6
- test/Grisette/Core/Data/Class/BitCastTests.hs +93/−0
- test/Grisette/Core/Data/Class/EvalSymTests.hs +1/−0
- test/Grisette/Core/Data/Class/ExtractSymTests.hs +1/−0
- test/Grisette/Core/Data/Class/PPrintTests.hs +103/−19
- test/Grisette/Core/Data/Class/SafeDivTests.hs +400/−0
- test/Grisette/Core/Data/Class/SafeDivisionTests.hs +0/−278
- test/Grisette/Core/Data/Class/SafeLinearArithTests.hs +7/−8
- test/Grisette/Core/Data/Class/SafeSymRotateTests.hs +5/−19
- test/Grisette/Core/Data/Class/SafeSymShiftTests.hs +5/−20
- test/Grisette/Core/Data/Class/SymFiniteBitsTests.hs +162/−0
- test/Grisette/Core/Data/Class/SymOrdTests.hs +1/−1
- test/Grisette/Core/Data/Class/SymRotateTests.hs +0/−6
- test/Grisette/Core/Data/Class/SymShiftTests.hs +1/−7
- test/Grisette/Core/Data/Class/TestValues.hs +5/−2
- test/Grisette/Core/Data/Class/ToSymTests.hs +3/−1
- test/Grisette/Core/TH/DerivationTest.hs +12/−1
- test/Grisette/Lib/Control/Monad/Trans/State/Common.hs +4/−4
- test/Grisette/Lib/Control/MonadTests.hs +1/−1
- test/Grisette/Lib/Data/ListTests.hs +11/−12
- test/Grisette/SymPrim/AlgRealTests.hs +105/−0
- test/Grisette/SymPrim/BVTests.hs +12/−13
- test/Grisette/SymPrim/FPTests.hs +893/−24
- test/Grisette/SymPrim/GeneralFunTests.hs +54/−0
- test/Grisette/SymPrim/Prim/BVTests.hs +27/−25
- test/Grisette/SymPrim/Prim/BitsTests.hs +2/−6
- test/Grisette/SymPrim/Prim/IntegralTests.hs +4/−4
- test/Grisette/SymPrim/Prim/ModelTests.hs +52/−39
- test/Grisette/SymPrim/Prim/TabularFunTests.hs +11/−9
- test/Grisette/SymPrim/QuantifierTests.hs +77/−0
- test/Grisette/SymPrim/SomeBVTests.hs +275/−33
- test/Grisette/SymPrim/SymGeneralFunTests.hs +37/−0
- test/Grisette/SymPrim/SymPrimTests.hs +132/−27
- test/Grisette/SymPrim/TabularFunTests.hs +6/−6
- test/Grisette/TestUtil/SymbolicAssertion.hs +6/−7
- test/Grisette/Unified/EvalModeTest.hs +155/−22
- test/Grisette/Unified/UnifiedClassesTest.hs +3/−2
- test/Grisette/Unified/UnifiedConstructorTest.hs +44/−15
- test/Main.hs +16/−4
CHANGELOG.md view
@@ -6,6 +6,76 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.8.0.0] - 2024-08-13++### Added+- Added pretty printer for models.+ ([#225](https://github.com/lsrcz/grisette/pull/225))+- Added support for algebraic reals (`AlgReal` and `SymAlgReal`).+ ([#228](https://github.com/lsrcz/grisette/pull/228),+ [#229](https://github.com/lsrcz/grisette/pull/229))+- Added support for quantifiers.+ ([#230](https://github.com/lsrcz/grisette/pull/230))+- Added `SafeFdiv`, `SafeLogBase`, `DivOr`, `FdivOr`, and `LogBaseOr`.+ ([#228](https://github.com/lsrcz/grisette/pull/228),+ [#231](https://github.com/lsrcz/grisette/pull/231))+- Added bitcast from and to `Bool`, `IntN`, `WordN`, `FP` and their symbolic+ counterparts when appropriate.+ ([#232](https://github.com/lsrcz/grisette/pull/232))+- Add `SymFromIntegral`. ([#233](https://github.com/lsrcz/grisette/pull/233))+- Add operations for concrete floating point numbers. Add IEEE754-2019+ `fpMinimum`, `fpMinimumNumber`, `fpMaximum`, and `fpMaximumNumber` operations.+ ([#235](https://github.com/lsrcz/grisette/pull/235))+- Add conversion from and to floating points.+ ([#236](https://github.com/lsrcz/grisette/pull/236))+- Add `SymFiniteBits`. ([#237](https://github.com/lsrcz/grisette/pull/237))+- Add unified instances for all provided operations, including `FP` and+ `AlgReal`.+ ([#239](https://github.com/lsrcz/grisette/pull/239),+ [#240](https://github.com/lsrcz/grisette/pull/240),+ [#243](https://github.com/lsrcz/grisette/pull/243))+- Allow the use of number literals for `SomeBV`.+ ([#245](https://github.com/lsrcz/grisette/pull/245))+- Add `symDistinct`.+ ([#246](https://github.com/lsrcz/grisette/pull/246),+ [#247](https://github.com/lsrcz/grisette/pull/247))++### Fixed+- Fixed model parsing for floating points.+ ([#227](https://github.com/lsrcz/grisette/pull/227))+- Allowed `mkUnifiedConstructor` to be used with types without modes or args.+ ([#242](https://github.com/lsrcz/grisette/pull/242))++### Changed+- [Breaking] Changed the operand order for `liftPFormatPrec2` and+ `liftPFormatList2`.+ ([#225](https://github.com/lsrcz/grisette/pull/225))+- [Breaking] Changed the term representation with a compile-time tag for its+ kind (`AnyKind` for all symbols and `ConstantKind` for symbols other than+ uninterpreted functions). This also affects the 'ExtractSym'. A new+ `extractSymMaybe` will regard this tag if not all symbols can be casted to+ that tag. `extractSym` will always succeed, returning a set with `AnyKind`.+ ([#230](https://github.com/lsrcz/grisette/pull/230))+- [Breaking] `SafeDivision` renamed to `SafeDiv`.+ ([#231](https://github.com/lsrcz/grisette/pull/231))+- Refined the template-haskell-based derivation mechanism.+ ([#238](https://github.com/lsrcz/grisette/pull/238))+- [Breaking] `GetData` is made injective by giving `Identity` wrapped type for+ concrete evaluation instead of the type itself.+ ([#242](https://github.com/lsrcz/grisette/pull/242))+- Changed pprint for `Identity` to not to print the constructor.+ ([#242](https://github.com/lsrcz/grisette/pull/242))+- Make `ToSym` requires the target type to be `Mergeable`. This enable us to+ merge the results for converting from `Union a` to `Union b` again.+ ([#244](https://github.com/lsrcz/grisette/pull/244))++### Removed+- Removed `fpMin` and `fpMax`, which is removed in IEEE754-2019.+ ([#235](https://github.com/lsrcz/grisette/pull/235))+- Dropped support for post-evaluation approximation.+ ([#241](https://github.com/lsrcz/grisette/pull/241))+ + ## [0.7.0.0] - 2024-07-02 ### Added@@ -379,7 +449,8 @@ - Initial release for Grisette. -[Unreleased]: https://github.com/lsrcz/grisette/compare/v0.7.0.0...HEAD+[Unreleased]: https://github.com/lsrcz/grisette/compare/v0.8.0.0...HEAD+[0.8.0.0]: https://github.com/lsrcz/grisette/compare/v0.7.0.0...v0.8.0.0 [0.7.0.0]: https://github.com/lsrcz/grisette/compare/v0.6.0.0...v0.7.0.0 [0.6.0.0]: https://github.com/lsrcz/grisette/compare/v0.5.0.1...v0.6.0.0 [0.5.0.1]: https://github.com/lsrcz/grisette/compare/v0.5.0.0...v0.5.0.1
README.md view
@@ -49,7 +49,7 @@ ```cabal library ...- build-depends: grisette >= 0.7 < 0.8+ build-depends: grisette >= 0.8 < 0.9 ``` #### Quick start template with `stack new`@@ -276,6 +276,23 @@ ## Note +Grisette is fully compatible with GHC 9.6+, and works in most cases with GHC+8.10+.++### CLC proposal #10+As the type classes provided by Grisette implements+[CLC proposal #10](https://github.com/haskell/core-libraries-committee/issues/10),+which requires `base-4.18.0.0` to work reliably, Grisette is fully compatible+with GHC 9.6.+You may experience instance resolution failure when using older GHCs in the+client code (Grisette itself is buildable against GHC 8.10+ with some tricks).++### Quantifiers++Grisette currently supports universal and existential quantifiers $\forall$ and+$\exists$, but only when building with sbv >= 10.1. This also means that you+need to use GHC >= 9.2.+ ### Floating-points Grisette currently supports boolean, uninterpreted functions, bitvector,@@ -290,11 +307,8 @@ interface](https://hackage.haskell.org/package/grisette/docs/Grisette-Unified.html) to symbolic and concrete evaluations. GHC 9.0 or earlier, without the [QuickLook](https://dl.acm.org/doi/10.1145/3408971) type inference algorithm for-impredicative types, may fail to resolve some constraints . You may need to+impredicative types, may fail to resolve some constraints. You may need to provide additional constraints in your code to help the compiler.--If you don't use the unified interface, Grisette should work fine with GHC 8.10-or later. ## Citing Grisette
doctest/Main.hs view
@@ -1,9 +1,34 @@ module Main (main) where -import System.FilePath.Glob (glob) import Test.DocTest (doctest) main :: IO () main = do- core <- glob "src/**/*.hs"- doctest core+ doctest+ [ "-isrc",+ "--fast",+ "-XBinaryLiterals",+ "-XDataKinds",+ "-XDeriveAnyClass",+ "-XDeriveGeneric",+ "-XDeriveLift",+ "-XDerivingStrategies",+ "-XDerivingVia",+ "-XFlexibleContexts",+ "-XFlexibleInstances",+ "-XFunctionalDependencies",+ "-XLambdaCase",+ "-XMonoLocalBinds",+ "-XMultiParamTypeClasses",+ "-XOverloadedStrings",+ "-XScopedTypeVariables",+ "-XStandaloneDeriving",+ "-XTemplateHaskell",+ "-XTypeApplications",+ "-XTypeOperators",+ "-XUndecidableInstances",+ "-Wno-unrecognised-warning-flags",+ "-Wno-x-partial",+ "-Wno-deriving-defaults",+ "src"+ ]
grisette.cabal view
@@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.36.0.+-- This file has been generated from package.yaml by hpack version 0.36.1. -- -- see: https://github.com/sol/hpack name: grisette-version: 0.7.0.0+version: 0.8.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@@ -37,7 +37,7 @@ , GHC == 9.0.2 , GHC == 9.2.8 , GHC == 9.4.8- , GHC == 9.6.5+ , GHC == 9.6.6 , GHC == 9.8.2 , GHC == 9.10.1 extra-source-files:@@ -62,6 +62,7 @@ Grisette.Experimental.GenSymConstrained Grisette.Experimental.MonadParallelUnion Grisette.Experimental.Qualified.ParallelUnionDo+ Grisette.Internal.Backend.QuantifiedStack Grisette.Internal.Backend.Solving Grisette.Internal.Backend.SymBiMap Grisette.Internal.Core.Control.Exception@@ -83,8 +84,12 @@ Grisette.Internal.Core.Data.Class.ModelOps Grisette.Internal.Core.Data.Class.PlainUnion Grisette.Internal.Core.Data.Class.PPrint- Grisette.Internal.Core.Data.Class.SafeDivision+ Grisette.Internal.Core.Data.Class.SafeBitCast+ Grisette.Internal.Core.Data.Class.SafeDiv+ Grisette.Internal.Core.Data.Class.SafeFdiv+ Grisette.Internal.Core.Data.Class.SafeFromFP Grisette.Internal.Core.Data.Class.SafeLinearArith+ Grisette.Internal.Core.Data.Class.SafeLogBase Grisette.Internal.Core.Data.Class.SafeSymRotate Grisette.Internal.Core.Data.Class.SafeSymShift Grisette.Internal.Core.Data.Class.SignConversion@@ -93,6 +98,9 @@ Grisette.Internal.Core.Data.Class.Solver Grisette.Internal.Core.Data.Class.SubstSym Grisette.Internal.Core.Data.Class.SymEq+ Grisette.Internal.Core.Data.Class.SymFiniteBits+ Grisette.Internal.Core.Data.Class.SymFromIntegral+ Grisette.Internal.Core.Data.Class.SymIEEEFP Grisette.Internal.Core.Data.Class.SymOrd Grisette.Internal.Core.Data.Class.SymRotate Grisette.Internal.Core.Data.Class.SymShift@@ -102,25 +110,29 @@ Grisette.Internal.Core.Data.MemoUtils Grisette.Internal.Core.Data.Symbol Grisette.Internal.Core.Data.UnionBase+ Grisette.Internal.SymPrim.AlgReal Grisette.Internal.SymPrim.AllSyms Grisette.Internal.SymPrim.BV Grisette.Internal.SymPrim.FP+ Grisette.Internal.SymPrim.FunInstanceGen Grisette.Internal.SymPrim.GeneralFun Grisette.Internal.SymPrim.IntBitwidth Grisette.Internal.SymPrim.ModelRep Grisette.Internal.SymPrim.Prim.Internal.Caches Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitwiseTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalDivModIntegralTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFloatingTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFractionalTerm+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm+ Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalOrdTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalRotateTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalShiftTerm Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim- Grisette.Internal.SymPrim.Prim.Internal.IsZero Grisette.Internal.SymPrim.Prim.Internal.PartialEval Grisette.Internal.SymPrim.Prim.Internal.Term Grisette.Internal.SymPrim.Prim.Internal.Unfold@@ -130,7 +142,9 @@ Grisette.Internal.SymPrim.Prim.SomeTerm Grisette.Internal.SymPrim.Prim.Term Grisette.Internal.SymPrim.Prim.TermUtils+ Grisette.Internal.SymPrim.Quantifier Grisette.Internal.SymPrim.SomeBV+ Grisette.Internal.SymPrim.SymAlgReal Grisette.Internal.SymPrim.SymBool Grisette.Internal.SymPrim.SymBV Grisette.Internal.SymPrim.SymFP@@ -175,8 +189,15 @@ Grisette.Unified Grisette.Unified.Internal.BaseConstraint Grisette.Unified.Internal.BaseMonad+ Grisette.Unified.Internal.BVBVConversion+ Grisette.Unified.Internal.BVFPConversion+ Grisette.Unified.Internal.Class.UnifiedFiniteBits+ Grisette.Unified.Internal.Class.UnifiedFromIntegral Grisette.Unified.Internal.Class.UnifiedITEOp- Grisette.Unified.Internal.Class.UnifiedSafeDivision+ Grisette.Unified.Internal.Class.UnifiedSafeBitCast+ Grisette.Unified.Internal.Class.UnifiedSafeDiv+ Grisette.Unified.Internal.Class.UnifiedSafeFdiv+ Grisette.Unified.Internal.Class.UnifiedSafeFromFP Grisette.Unified.Internal.Class.UnifiedSafeLinearArith Grisette.Unified.Internal.Class.UnifiedSafeSymRotate Grisette.Unified.Internal.Class.UnifiedSafeSymShift@@ -185,11 +206,14 @@ Grisette.Unified.Internal.Class.UnifiedSymOrd Grisette.Unified.Internal.EvalMode Grisette.Unified.Internal.EvalModeTag+ Grisette.Unified.Internal.FPFPConversion Grisette.Unified.Internal.MonadWithMode+ Grisette.Unified.Internal.UnifiedAlgReal Grisette.Unified.Internal.UnifiedBool Grisette.Unified.Internal.UnifiedBV Grisette.Unified.Internal.UnifiedConstraint Grisette.Unified.Internal.UnifiedData+ Grisette.Unified.Internal.UnifiedFP Grisette.Unified.Internal.UnifiedInteger Grisette.Unified.Internal.Util Grisette.Unified.Lib.Control.Applicative@@ -201,7 +225,7 @@ Paths_grisette hs-source-dirs: src- ghc-options: -Wextra -Wcompat -Widentities -Wincomplete-record-updates -Wmissing-export-lists -Wmissing-home-modules -Wmissing-import-lists -Wpartial-fields -Wunused-type-patterns+ ghc-options: -Wextra -Wcompat -Widentities -Wincomplete-record-updates -Wmissing-export-lists -Wmissing-home-modules -Wmissing-import-lists -Wpartial-fields -Wunused-type-patterns -Wno-x-partial -Wno-unrecognised-warning-flags build-depends: QuickCheck >=2.14 && <2.16 , array >=0.5.4 && <0.6@@ -211,9 +235,10 @@ , containers >=0.4 && <0.8 , deepseq >=1.4.4 && <1.6 , generic-deriving >=1.14.1 && <1.15- , hashable >=1.2.3 && <1.5+ , hashable >=1.2.3 && <1.6 , hashtables >=1.2.3.4 && <1.4 , intern >=0.9.2 && <0.10+ , libBF >=0.6.3 && <0.7 , loch-th >=0.2.2 && <0.3 , mtl >=2.2.2 && <2.4 , parallel >=3.2.2.0 && <3.3@@ -224,6 +249,7 @@ , text >=1.2.4.1 && <2.2 , th-abstraction >=0.4 && <0.8 , th-compat >=0.1.2 && <0.2+ , th-lift-instances >=0.1.16 && <0.2 , transformers >=0.5.6 && <0.7 , unordered-containers >=0.2.11 && <0.3 default-language: Haskell2010@@ -239,10 +265,9 @@ Paths_grisette hs-source-dirs: doctest- ghc-options: -Wextra -Wcompat -Widentities -Wincomplete-record-updates -Wmissing-export-lists -Wmissing-home-modules -Wmissing-import-lists -Wpartial-fields -Wunused-type-patterns -threaded -rtsopts -with-rtsopts=-N+ ghc-options: -Wextra -Wcompat -Widentities -Wincomplete-record-updates -Wmissing-export-lists -Wmissing-home-modules -Wmissing-import-lists -Wpartial-fields -Wunused-type-patterns -Wno-x-partial -Wno-unrecognised-warning-flags -threaded -rtsopts -with-rtsopts=-N build-depends:- Glob- , QuickCheck >=2.14 && <2.16+ QuickCheck >=2.14 && <2.16 , array >=0.5.4 && <0.6 , async >=2.2.2 && <2.3 , base >=4.14 && <5@@ -252,9 +277,10 @@ , doctest >=0.18.2 && <0.23 , generic-deriving >=1.14.1 && <1.15 , grisette- , hashable >=1.2.3 && <1.5+ , hashable >=1.2.3 && <1.6 , hashtables >=1.2.3.4 && <1.4 , intern >=0.9.2 && <0.10+ , libBF >=0.6.3 && <0.7 , loch-th >=0.2.2 && <0.3 , mtl >=2.2.2 && <2.4 , parallel >=3.2.2.0 && <3.3@@ -265,6 +291,7 @@ , text >=1.2.4.1 && <2.2 , th-abstraction >=0.4 && <0.8 , th-compat >=0.1.2 && <0.2+ , th-lift-instances >=0.1.16 && <0.2 , transformers >=0.5.6 && <0.7 , unordered-containers >=0.2.11 && <0.3 default-language: Haskell2010@@ -283,6 +310,7 @@ Grisette.Backend.TermRewritingTests Grisette.Core.Control.ExceptionTests Grisette.Core.Control.Monad.UnionTests+ Grisette.Core.Data.Class.BitCastTests Grisette.Core.Data.Class.BoolTests Grisette.Core.Data.Class.EvalSymTests Grisette.Core.Data.Class.ExtractSymTests@@ -290,13 +318,14 @@ Grisette.Core.Data.Class.MergeableTests Grisette.Core.Data.Class.PlainUnionTests Grisette.Core.Data.Class.PPrintTests- Grisette.Core.Data.Class.SafeDivisionTests+ Grisette.Core.Data.Class.SafeDivTests Grisette.Core.Data.Class.SafeLinearArithTests Grisette.Core.Data.Class.SafeSymRotateTests Grisette.Core.Data.Class.SafeSymShiftTests Grisette.Core.Data.Class.SimpleMergeableTests Grisette.Core.Data.Class.SubstSymTests Grisette.Core.Data.Class.SymEqTests+ Grisette.Core.Data.Class.SymFiniteBitsTests Grisette.Core.Data.Class.SymOrdTests Grisette.Core.Data.Class.SymRotateTests Grisette.Core.Data.Class.SymShiftTests@@ -319,8 +348,10 @@ Grisette.Lib.Data.FunctorTests Grisette.Lib.Data.ListTests Grisette.Lib.Data.TraversableTests+ Grisette.SymPrim.AlgRealTests Grisette.SymPrim.BVTests Grisette.SymPrim.FPTests+ Grisette.SymPrim.GeneralFunTests Grisette.SymPrim.Prim.BitsTests Grisette.SymPrim.Prim.BoolTests Grisette.SymPrim.Prim.BVTests@@ -328,7 +359,9 @@ Grisette.SymPrim.Prim.ModelTests Grisette.SymPrim.Prim.NumTests Grisette.SymPrim.Prim.TabularFunTests+ Grisette.SymPrim.QuantifierTests Grisette.SymPrim.SomeBVTests+ Grisette.SymPrim.SymGeneralFunTests Grisette.SymPrim.SymPrimTests Grisette.SymPrim.TabularFunTests Grisette.TestUtil.NoMerge@@ -340,7 +373,7 @@ Paths_grisette hs-source-dirs: test- ghc-options: -Wextra -Wcompat -Widentities -Wincomplete-record-updates -Wmissing-export-lists -Wmissing-home-modules -Wmissing-import-lists -Wpartial-fields -Wunused-type-patterns -threaded -rtsopts -with-rtsopts=-N+ ghc-options: -Wextra -Wcompat -Widentities -Wincomplete-record-updates -Wmissing-export-lists -Wmissing-home-modules -Wmissing-import-lists -Wpartial-fields -Wunused-type-patterns -Wno-x-partial -Wno-unrecognised-warning-flags -threaded -rtsopts -with-rtsopts=-N -Wredundant-constraints build-depends: HUnit ==1.6.* , QuickCheck >=2.14 && <2.16@@ -352,9 +385,10 @@ , deepseq >=1.4.4 && <1.6 , generic-deriving >=1.14.1 && <1.15 , grisette- , hashable >=1.2.3 && <1.5+ , hashable >=1.2.3 && <1.6 , hashtables >=1.2.3.4 && <1.4 , intern >=0.9.2 && <0.10+ , libBF >=0.6.3 && <0.7 , loch-th >=0.2.2 && <0.3 , mtl >=2.2.2 && <2.4 , parallel >=3.2.2.0 && <3.3@@ -368,6 +402,7 @@ , text >=1.2.4.1 && <2.2 , th-abstraction >=0.4 && <0.8 , th-compat >=0.1.2 && <0.2+ , th-lift-instances >=0.1.16 && <0.2 , transformers >=0.5.6 && <0.7 , unordered-containers >=0.2.11 && <0.3 default-language: Haskell2010
src/Grisette/Backend.hs view
@@ -23,27 +23,25 @@ abc, -- * Changing the extra configurations- ApproximationConfig (..), ExtraConfig (..),- precise,- approximate, withTimeout, clearTimeout, -- * SBV backend solver configuration SBV.SMTConfig (..),+ SBV.Logic (..),+ SBVC.SMTOption (..), SBV.Timing (..), SBV.SMTSolver (..), ) where import qualified Data.SBV as SBV+import qualified Data.SBV.Control as SBVC import Grisette.Internal.Backend.Solving- ( ApproximationConfig (..),- ExtraConfig (..),+ ( ExtraConfig (..), GrisetteSMTConfig (..), abc,- approximate, bitwuzla, boolector, clearTimeout,@@ -51,7 +49,6 @@ cvc5, dReal, mathSAT,- precise, withTimeout, yices, z3,
src/Grisette/Core.hs view
@@ -41,7 +41,7 @@ -- Additional tools for building symbolic evaluation based applications are -- also provided: --- -- * Pretty printing (e.g., 'Format')+ -- * Pretty printing (e.g., 'PPrint') -- * Symbolic generation, or generating fresh symbolic values (e.g., -- 'GenSym') -- * Error handling (e.g., 'symAssert')@@ -204,7 +204,6 @@ -- result is then merged into a single formula, and further operation on it -- won't have to split into multiple paths: --- -- >>> :set -Wno-unrecognised-warning-flags -Wno-x-partial -- >>> x = mrgIf "a1" (return ["b"]) (mrgIf "a2" (return ["c", "d"]) (return ["f"])) :: Union [SymBool] -- >>> :{ -- do@@ -239,6 +238,8 @@ -- * @'Grisette.SymPrim.SymFP' eb sb@ (@'Grisette.SymPrim.FP' eb sb@, -- symbolic IEEE-754 floating point numbers with @eb@ exponent bits and -- @sb@ significand bits)+ -- * 'Grisette.SymPrim.SymAlgReal' ('Grisette.SymPrim.AlgReal'), symbolic+ -- algebraic real numbers. -- * @'Grisette.SymPrim.SymBool' t'Grisette.SymPrim.=~>' 'Grisette.SymPrim.SymBool'@ -- (@'Bool' t'Grisette.SymPrim.=->' 'Bool'@, symbolic functions, -- uninterpreted or represented as a table for the input-outputs@@ -262,7 +263,6 @@ -- -- __Examples:__ --- -- >>> import Grisette -- >>> con True :: SymBool -- a concrete value -- true -- >>> true :: SymBool -- via the LogicalOp instance@@ -275,7 +275,6 @@ -- With the @OverloadedStrings@ GHC extension enabled, symbolic constants -- can also be constructed from strings. --- -- >>> :set -XOverloadedStrings -- >>> "a" :: SymBool -- a --@@ -309,6 +308,8 @@ uniqueIdentifier, simple, indexed,+ symbolIdentifier,+ modifyIdentifier, -- ** Creation and extraction of solvable values Solvable (..),@@ -329,6 +330,9 @@ SymEq2 (..), symEq2, + -- ** Supplemental operation for 'Eq'+ distinct,+ -- ** Symbolic comparison SymOrd (..), SymOrd1 (..),@@ -350,11 +354,24 @@ SymRotate (..), SafeSymRotate (..), SignConversion (..),- BitCast (..), -- ** Safe operation for Numbers- SafeDivision (..),+ DivOr (..),+ divOrZero,+ modOrDividend,+ quotOrZero,+ remOrDividend,+ divModOrZeroDividend,+ quotRemOrZeroDividend,+ SafeDiv (..), SafeLinearArith (..),+ FdivOr (..),+ fdivOrZero,+ recipOrZero,+ SafeFdiv (..),+ LogBaseOr (..),+ logBaseOrZero,+ SafeLogBase (..), -- ** Functions Function (..),@@ -374,10 +391,12 @@ fpIsSubnormal, fpIsPoint, SymIEEEFPTraits (..),- IEEEConstants (..),+ IEEEFPConstants (..), IEEEFPRoundingMode (..), IEEEFPOp (..), IEEEFPRoundingOp (..),+ IEEEFPConvertible (..),+ IEEEFPToAlgReal (..), -- ** Conversion between Concrete and Symbolic values ToCon (..),@@ -391,6 +410,15 @@ ToSym2 (..), toSym2, + -- ** Conversion between different symbolic types+ BitCast (..),+ BitCastCanonical (..),+ BitCastOr (..),+ BitCastOrCanonical,+ bitCastOrCanonical,+ SafeBitCast (..),+ SymFromIntegral (..),+ -- * Unsolvable types and merging -- | There are types that be directly represented as SMT formulas and@@ -921,7 +949,6 @@ -- We can generate many symbolic values at once with the 'Fresh' monad. -- The symbolic constants are ensured to be unique: --- -- >>> :set -XScopedTypeVariables -- >>> :{ -- flip runFresh "x" $ do -- a :: SymBool <- simpleFresh ()@@ -1008,9 +1035,7 @@ -- You can define your own error types, and reason about them with the -- solver APIs. --- -- >>> :set -XDerivingVia -XDeriveGeneric -XDerivingStrategies -XLambdaCase -- >>> import GHC.Generics- -- >>> import Grisette.Backend -- >>> :{ -- data Error = Error1 | Error2 | Error3 -- deriving (Show, Generic)@@ -1140,7 +1165,6 @@ -- -- We can first define the error type used in the program. --- -- >>> :set -XLambdaCase -XDeriveGeneric -XDerivingStrategies -XDerivingVia -- >>> import Control.Monad.Except -- >>> import Grisette.Lib.Control.Monad.Trans.Except -- >>> import Control.Exception@@ -1257,8 +1281,10 @@ ExtractSym (..), ExtractSym1 (..), extractSym1,+ extractSymMaybe1, ExtractSym2 (..), extractSym2,+ extractSymMaybe2, -- ** Evaluation with a model @@ -1345,8 +1371,8 @@ -- *** 'ExtractSym' ExtractSymArgs (..), GExtractSym (..),- genericExtractSym,- genericLiftExtractSym,+ genericExtractSymMaybe,+ genericLiftExtractSymMaybe, -- *** 'SubstSym' SubstSymArgs (..),@@ -1365,6 +1391,12 @@ ) where +#if MIN_VERSION_prettyprinter(1,7,0)+import Prettyprinter+#else+import Data.Text.Prettyprint.Doc as Prettyprinter+#endif+ import Generics.Deriving (Default (..), Default1 (..)) import Grisette.Internal.Core.Control.Exception ( AssertionError (..),@@ -1388,7 +1420,13 @@ unionSize, unionUnaryOp, )-import Grisette.Internal.Core.Data.Class.BitCast (BitCast (..))+import Grisette.Internal.Core.Data.Class.BitCast+ ( BitCast (..),+ BitCastCanonical (..),+ BitCastOr (..),+ BitCastOrCanonical,+ bitCastOrCanonical,+ ) import Grisette.Internal.Core.Data.Class.BitVector ( BV (..), SizedBV (..),@@ -1462,8 +1500,10 @@ GExtractSym (..), extractSym1, extractSym2,- genericExtractSym,- genericLiftExtractSym,+ extractSymMaybe1,+ extractSymMaybe2,+ genericExtractSymMaybe,+ genericLiftExtractSymMaybe, ) import Grisette.Internal.Core.Data.Class.Function (Apply (..), Function (..)) import Grisette.Internal.Core.Data.Class.GenSym@@ -1496,11 +1536,12 @@ runFreshT, ) import Grisette.Internal.Core.Data.Class.IEEEFP- ( IEEEConstants (..),+ ( IEEEFPConstants (..),+ IEEEFPConvertible (..), IEEEFPOp (..), IEEEFPRoundingMode (..), IEEEFPRoundingOp (..),- SymIEEEFPTraits (..),+ IEEEFPToAlgReal (..), fpIsInfinite, fpIsNaN, fpIsNegative,@@ -1582,8 +1623,29 @@ pattern If, pattern Single, )-import Grisette.Internal.Core.Data.Class.SafeDivision (SafeDivision (..))+import Grisette.Internal.Core.Data.Class.SafeBitCast (SafeBitCast (..))+import Grisette.Internal.Core.Data.Class.SafeDiv+ ( DivOr (..),+ SafeDiv (..),+ divModOrZeroDividend,+ divOrZero,+ modOrDividend,+ quotOrZero,+ quotRemOrZeroDividend,+ remOrDividend,+ )+import Grisette.Internal.Core.Data.Class.SafeFdiv+ ( FdivOr (..),+ SafeFdiv (..),+ fdivOrZero,+ recipOrZero,+ ) import Grisette.Internal.Core.Data.Class.SafeLinearArith (SafeLinearArith (..))+import Grisette.Internal.Core.Data.Class.SafeLogBase+ ( LogBaseOr (..),+ SafeLogBase (..),+ logBaseOrZero,+ ) import Grisette.Internal.Core.Data.Class.SafeSymRotate (SafeSymRotate (..)) import Grisette.Internal.Core.Data.Class.SafeSymShift (SafeSymShift (..)) import Grisette.Internal.Core.Data.Class.SignConversion (SignConversion (..))@@ -1643,11 +1705,18 @@ SymEq1 (..), SymEq2 (..), SymEqArgs (..),+ distinct, genericLiftSymEq, genericSymEq, symEq1, symEq2, )+import Grisette.Internal.Core.Data.Class.SymFromIntegral+ ( SymFromIntegral (..),+ )+import Grisette.Internal.Core.Data.Class.SymIEEEFP+ ( SymIEEEFPTraits (..),+ ) import Grisette.Internal.Core.Data.Class.SymOrd ( GSymOrd (..), SymOrd (..),@@ -1706,40 +1775,18 @@ Symbol (..), identifier, indexed,+ modifyIdentifier, simple,+ symbolIdentifier, uniqueIdentifier, withInfo, withLoc, )-#if MIN_VERSION_prettyprinter(1,7,0)-import Prettyprinter-#else-import Data.Text.Prettyprint.Doc as Prettyprinter-#endif+import Instances.TH.Lift () -- $setup+-- >>> import Grisette -- >>> import Grisette.Core -- >>> import Grisette.Lib.Base -- >>> import Grisette.SymPrim -- >>> import Grisette.TH--- >>> :set -XDataKinds--- >>> :set -XBinaryLiterals--- >>> :set -XFlexibleContexts--- >>> :set -XFlexibleInstances--- >>> :set -XFunctionalDependencies--- >>> :set -XOverloadedStrings--- >>> :set -XTemplateHaskell--- >>> :set -XScopedTypeVariables--- >>> :set -XDerivingVia--- >>> :set -XStandaloneDeriving--- >>> :set -XTypeApplications--- >>> :set -XFlexibleInstances--- >>> :set -XMultiParamTypeClasses--- >>> :set -XFlexibleContexts--- >>> :set -XDeriveLift--- >>> :set -XUndecidableInstances--- >>> :set -XDeriveAnyClass--- >>> :set -XMonoLocalBinds--- >>> :set -XDerivingStrategies--- >>> :set -XDerivingVia--- >>> :set -XDeriveGeneric
src/Grisette/Experimental.hs view
@@ -1,6 +1,14 @@ -- Disable this warning because we are re-exporting things. {-# OPTIONS_GHC -Wno-missing-import-lists #-} +-- |+-- Module : Grisette.Experimental+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only module Grisette.Experimental ( -- * Experimental features
src/Grisette/Experimental/GenSymConstrained.hs view
@@ -77,8 +77,6 @@ -- >>> import Grisette.Core -- >>> import Grisette.Experimental -- >>> import Grisette.SymPrim--- >>> :set -XOverloadedStrings--- >>> :set -XTypeApplications -- | Class of types in which symbolic values can be generated with some -- specification.@@ -108,6 +106,8 @@ m (Union a) freshConstrained e spec = mrgSingle <$> simpleFreshConstrained e spec +-- | Generates a symbolic value with the given specification, also place the+-- necessary constraints. genSymConstrained :: forall spec a e. (GenSymConstrained spec a, Mergeable e) => e -> spec -> Identifier -> ExceptT e Union (Union a) genSymConstrained e spec = tryMerge . runFreshT (freshConstrained e spec) @@ -129,6 +129,8 @@ spec -> m a +-- | Generates a symbolic value with the given specification, also place the+-- necessary constraints. genSymSimpleConstrained :: forall spec a e. (GenSymSimpleConstrained spec a, Mergeable e) => e -> spec -> Identifier -> ExceptT e Union a genSymSimpleConstrained e spec = tryMerge . runFreshT (simpleFreshConstrained e spec) @@ -857,7 +859,7 @@ -- your own types. -- -- This 'simpleFreshConstrained' 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. -- It will not work on sum types. -- -- __Note:__ __Never__ use on recursive types.
src/Grisette/Experimental/MonadParallelUnion.hs view
@@ -37,7 +37,6 @@ -- 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
src/Grisette/Experimental/Qualified/ParallelUnionDo.hs view
@@ -15,8 +15,10 @@ import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable) import Prelude (const, ($)) +-- | Parallel '(>>=)' operation. (>>=) :: (MonadParallelUnion m, Mergeable b, NFData b) => m a -> (a -> m b) -> m b (>>=) = parBindUnion +-- | Parallel '(>>)' operation. (>>) :: (MonadParallelUnion m, Mergeable b, NFData b) => m a -> m b -> m b (>>) a b = parBindUnion a $ const b
+ src/Grisette/Internal/Backend/QuantifiedStack.hs view
@@ -0,0 +1,86 @@+{-# LANGUAGE DataKinds #-}++-- |+-- Module : Grisette.Internal.Backend.QuantifiedStack+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.Backend.QuantifiedStack+ ( QuantifiedSymbols (..),+ QuantifiedStack,+ addQuantified,+ lookupQuantified,+ emptyQuantifiedSymbols,+ addQuantifiedSymbol,+ isQuantifiedSymbol,+ emptyQuantifiedStack,+ )+where++import Data.Dynamic (Dynamic)+import qualified Data.HashMap.Lazy as M+import qualified Data.HashSet as S+import GHC.Stack (HasCallStack)+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( IsSymbolKind,+ SomeTypedConstantSymbol,+ SomeTypedSymbol,+ SupportedPrim (castTypedSymbol),+ TypedConstantSymbol,+ TypedSymbol,+ castSomeTypedSymbol,+ someTypedSymbol,+ )++-- | A set of quantified symbols.+newtype QuantifiedSymbols = QuantifiedSymbols+ { _symbols :: S.HashSet SomeTypedConstantSymbol+ }+ deriving (Show)++-- | An empty set of quantified symbols.+emptyQuantifiedSymbols :: QuantifiedSymbols+emptyQuantifiedSymbols = QuantifiedSymbols S.empty++-- | Add a quantified symbol to the set.+addQuantifiedSymbol ::+ TypedConstantSymbol a -> QuantifiedSymbols -> QuantifiedSymbols+addQuantifiedSymbol s (QuantifiedSymbols t) =+ QuantifiedSymbols (S.insert (someTypedSymbol s) t)++-- | Check if a symbol is quantified.+isQuantifiedSymbol ::+ (SupportedPrim a, IsSymbolKind knd) =>+ TypedSymbol knd a ->+ QuantifiedSymbols ->+ Bool+isQuantifiedSymbol s (QuantifiedSymbols t) =+ case castTypedSymbol s of+ Just s' -> S.member (someTypedSymbol s') t+ _ -> False++-- | A stack of quantified symbols.+newtype QuantifiedStack = QuantifiedStack+ {_stack :: M.HashMap SomeTypedConstantSymbol Dynamic}++-- | An empty stack of quantified symbols.+emptyQuantifiedStack :: QuantifiedStack+emptyQuantifiedStack = QuantifiedStack M.empty++-- | Add a quantified symbol to the stack.+addQuantified ::+ TypedConstantSymbol a -> Dynamic -> QuantifiedStack -> QuantifiedStack+addQuantified s d (QuantifiedStack t) =+ QuantifiedStack (M.insert (someTypedSymbol s) d t)++-- | Look up a quantified symbol in the stack.+lookupQuantified ::+ (HasCallStack, IsSymbolKind knd) =>+ SomeTypedSymbol knd ->+ QuantifiedStack ->+ Maybe Dynamic+lookupQuantified s (QuantifiedStack t) =+ (`M.lookup` t) =<< castSomeTypedSymbol s
src/Grisette/Internal/Backend/Solving.hs view
@@ -34,10 +34,7 @@ abc, -- * Changing the extra configurations- ApproximationConfig (..), ExtraConfig (..),- precise,- approximate, withTimeout, clearTimeout, @@ -69,15 +66,21 @@ ) import Control.Concurrent.STM.TChan (TChan, newTChan, readTChan, writeTChan) import Control.Exception (handle, throwTo)+import Control.Monad (when) import Control.Monad.IO.Class (MonadIO, liftIO)+import Control.Monad.RWS (RWST (runRWST)) import Control.Monad.Reader ( MonadReader (ask), MonadTrans (lift), ReaderT (runReaderT),+ ask,+ local, ) import Control.Monad.STM (STM)-import Control.Monad.State (MonadState (get, put), StateT, evalStateT)+import Control.Monad.State (MonadState (get, put), StateT, evalStateT, modify)+import Control.Monad.Writer (tell) import Data.Dynamic (fromDyn, toDyn)+import Data.List.NonEmpty (NonEmpty) import Data.Proxy (Proxy (Proxy)) import qualified Data.SBV as SBV import qualified Data.SBV.Control as SBVC@@ -87,11 +90,21 @@ import qualified Data.SBV.Trans.Control as SBVTC import GHC.IO.Exception (ExitCode (ExitSuccess)) import GHC.Stack (HasCallStack)-import GHC.TypeNats (KnownNat, Nat)+import Grisette.Internal.Backend.QuantifiedStack+ ( QuantifiedStack,+ QuantifiedSymbols,+ addQuantified,+ addQuantifiedSymbol,+ emptyQuantifiedStack,+ emptyQuantifiedSymbols,+ isQuantifiedSymbol,+ lookupQuantified,+ ) import Grisette.Internal.Backend.SymBiMap ( SymBiMap, addBiMap, addBiMapIntermediate,+ attachNextQuantifiedSymbolInfo, emptySymBiMap, findStringToSymbol, lookupTerm,@@ -125,6 +138,7 @@ ), SolvingFailure (SolvingError, Terminated, Unk, Unsat), )+import Grisette.Internal.SymPrim.GeneralFun (substTerm) import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP ( sbvFPBinaryTerm, sbvFPFMATerm,@@ -133,11 +147,11 @@ sbvFPTraitTerm, sbvFPUnaryTerm, )-import Grisette.Internal.SymPrim.Prim.Internal.IsZero (KnownIsZero) import Grisette.Internal.SymPrim.Prim.Internal.Term ( PEvalApplyTerm (sbvApplyTerm),- PEvalBVSignConversionTerm (sbvToSigned, sbvToUnsigned), PEvalBVTerm (sbvBVConcatTerm, sbvBVExtendTerm, sbvBVSelectTerm),+ PEvalBitCastOrTerm (sbvBitCastOr),+ PEvalBitCastTerm (sbvBitCast), PEvalBitwiseTerm ( sbvAndBitsTerm, sbvComplementBitsTerm,@@ -150,8 +164,10 @@ sbvQuotIntegralTerm, sbvRemIntegralTerm ),- PEvalFloatingTerm (sbvSqrtTerm),+ PEvalFloatingTerm (sbvFloatingUnaryTerm, sbvPowerTerm), PEvalFractionalTerm (sbvFdivTerm, sbvRecipTerm),+ PEvalFromIntegralTerm (sbvFromIntegralTerm),+ PEvalIEEEFPConvertibleTerm (sbvFromFPOrTerm, sbvToFPTerm), PEvalNumTerm ( sbvAbsNumTerm, sbvAddNumTerm,@@ -165,9 +181,13 @@ SBVFreshMonad, SBVRep (SBVType), SomeTypedSymbol (SomeTypedSymbol),+ SupportedNonFuncPrim (withNonFuncPrim), SupportedPrim ( conSBVTerm,+ funcDummyConstraint,+ isFuncType, parseSMTModelResult,+ sbvDistinct, sbvEq, sbvIte, symSBVName,@@ -183,10 +203,15 @@ BVConcatTerm, BVExtendTerm, BVSelectTerm,+ BinaryTerm,+ BitCastOrTerm,+ BitCastTerm, ComplementBitsTerm, ConTerm,+ DistinctTerm, DivIntegralTerm, EqTerm,+ ExistsTerm, FPBinaryTerm, FPFMATerm, FPRoundingBinaryTerm,@@ -194,6 +219,10 @@ FPTraitTerm, FPUnaryTerm, FdivTerm,+ FloatingUnaryTerm,+ ForallTerm,+ FromFPOrTerm,+ FromIntegralTerm, ITETerm, LeOrdTerm, LtOrdTerm,@@ -203,6 +232,7 @@ NotTerm, OrBitsTerm, OrTerm,+ PowerTerm, QuotIntegralTerm, RecipTerm, RemIntegralTerm,@@ -211,14 +241,17 @@ ShiftLeftTerm, ShiftRightTerm, SignumNumTerm,- SqrtTerm, SymTerm,- ToSignedTerm,- ToUnsignedTerm,+ TernaryTerm,+ ToFPTerm,+ UnaryTerm, XorBitsTerm ),+ TypedConstantSymbol,+ TypedSymbol (TypedSymbol), introSupportedPrimConstraint, someTypedSymbol,+ symTerm, withSymbolSupported, ) import Grisette.Internal.SymPrim.Prim.Model as PM@@ -233,36 +266,11 @@ -- >>> import Grisette.Backend -- >>> import Data.Proxy --- | 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, and usually you should not use--- this feature. See 'approximate' for more details.-data ApproximationConfig (n :: Nat) where- NoApprox :: ApproximationConfig 0- Approx ::- (KnownNat n, SBV.BVIsNonZero n, KnownIsZero n) =>- p n ->- ApproximationConfig n- -- | Grisette specific extra configurations for the SBV backend.-data ExtraConfig (i :: Nat) = ExtraConfig- { -- | Timeout in milliseconds for each solver call. CEGIS may call the+newtype ExtraConfig = ExtraConfig+ { -- | Timeout in microseconds 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+ timeout :: Maybe Int } -- | Solver configuration for the Grisette SBV backend.@@ -271,144 +279,60 @@ -- some extra configurations. -- -- You should start with the predefined configurations.-data GrisetteSMTConfig (i :: Nat) = GrisetteSMTConfig+data GrisetteSMTConfig = GrisetteSMTConfig { sbvConfig :: SBV.SMTConfig,- extraConfig :: ExtraConfig i+ extraConfig :: ExtraConfig } -preciseExtraConfig :: ExtraConfig 0-preciseExtraConfig =- ExtraConfig- { timeout = Nothing,- integerApprox = NoApprox- }+preciseExtraConfig :: ExtraConfig+preciseExtraConfig = ExtraConfig {timeout = Nothing} -- | Solver configuration for Boolector. <https://boolector.github.io/>-boolector :: GrisetteSMTConfig 0+boolector :: GrisetteSMTConfig boolector = GrisetteSMTConfig SBV.boolector preciseExtraConfig -- | Solver configuration for Bitwuzla. <https://bitwuzla.github.io/>-bitwuzla :: GrisetteSMTConfig 0+bitwuzla :: GrisetteSMTConfig bitwuzla = GrisetteSMTConfig SBV.bitwuzla preciseExtraConfig -- | Solver configuration for CVC4. <https://cvc4.github.io/>-cvc4 :: GrisetteSMTConfig 0+cvc4 :: GrisetteSMTConfig cvc4 = GrisetteSMTConfig SBV.cvc4 preciseExtraConfig -- | Solver configuration for CVC5. <https://cvc5.github.io/>-cvc5 :: GrisetteSMTConfig 0+cvc5 :: GrisetteSMTConfig cvc5 = GrisetteSMTConfig SBV.cvc5 preciseExtraConfig -- | Solver configuration for Yices. <https://yices.csl.sri.com/>-yices :: GrisetteSMTConfig 0+yices :: GrisetteSMTConfig yices = GrisetteSMTConfig SBV.yices preciseExtraConfig -- | Solver configuration for DReal. <http://dreal.github.io/>-dReal :: GrisetteSMTConfig 0+dReal :: GrisetteSMTConfig dReal = GrisetteSMTConfig SBV.dReal preciseExtraConfig -- | Solver configuration for Z3. <https://github.com/Z3Prover/z3/>-z3 :: GrisetteSMTConfig 0+z3 :: GrisetteSMTConfig z3 = GrisetteSMTConfig SBV.z3 preciseExtraConfig -- | Solver configuration for MathSAT. <http://mathsat.fbk.eu/>-mathSAT :: GrisetteSMTConfig 0+mathSAT :: GrisetteSMTConfig mathSAT = GrisetteSMTConfig SBV.mathSAT preciseExtraConfig -- | Solver configuration for ABC. <http://www.eecs.berkeley.edu/~alanmi/abc/>-abc :: GrisetteSMTConfig 0+abc :: GrisetteSMTConfig abc = GrisetteSMTConfig SBV.abc preciseExtraConfig --- | Set to perform precise reasoning with the solver configuration.-precise :: GrisetteSMTConfig n -> GrisetteSMTConfig 0-precise config =- config {extraConfig = (extraConfig config) {integerApprox = NoApprox}}---- | Set to perform approximate reasoning with the solver configuration.------ __Note:__ This isn't the preferred way to control the reasoning precision.--- A better way is to write your symbolic evaluation code in a generic way, and--- control the evaluation with the types.------ >>> f :: (Num a) => a -> a -> a; f x y = x + y--- >>> solve z3 $ f "a" 5 .== (2 :: SymInteger)--- Right (Model {a -> -3 :: Integer})--- >>> solve z3 $ f "a" 5 .== (2 :: SymWordN 4)--- Right (Model {a -> 0xd :: WordN 4})------ __Description:__------ Integers can be unbounded (mathematical integer) or bounded (machine--- integer/bit vector). The two types of integers have their own use cases,--- and should be used to model different systems.--- However, the solvers are known to have bad performance on some unbounded--- integer operations, for example, when reason about non-linear integer--- algebraic (e.g., multiplication or division),--- the solver may not be able to get a result in a reasonable time.--- In contrast, reasoning about bounded integers is usually more efficient.------ To bridge the performance gap between the two types of integers, Grisette--- allows to model the system with unbounded integers, and evaluate them with--- 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" :: 'Grisette.SymPrim.SymInteger'@--- should be translated to the following SMT with the unbounded reasoning--- configuration (the term is @t1@):------ > (declare-fun a () Int) ; declare symbolic constant a--- > (define-fun c1 () Int 5) ; define the concrete value 5--- > (define-fun t1 () Int (* c1 a)) ; define the term------ While with reasoning precision 4, it would be translated to the following--- SMT (the term is @t1@):------ > ; declare symbolic constant a, the type is a bit vector with bit width 4--- > (declare-fun a () (_ BitVec 4))--- > ; define the concrete value 1, translated to the bit vector #x1--- > (define-fun c1 () (_ BitVec 4) #x5)--- > ; define the term, using bit vector addition rather than integer addition--- > (define-fun t1 () (_ BitVec 4) (bvmul c1 a))------ This bounded translation can usually be solved faster than the unbounded--- one, and should work well when no overflow is possible, in which case the--- performance can be improved with almost no cost.------ We must note that the bounded translation is an approximation and is--- __/not sound/__. As the approximation happens only during the final--- translation, the symbolic evaluation may aggressively optimize the term based--- on the properties of mathematical integer arithmetic. This may cause the--- solver yield results that is incorrect under both unbounded or bounded--- semantics.------ The following is an example that is correct under bounded semantics, while is--- incorrect under the unbounded semantics:------ >>> :set -XTypeApplications -XOverloadedStrings -XDataKinds--- >>> let a = "a" :: SymInteger--- >>> solve z3 $ a .> 7 .&& a .< 9--- Right (Model {a -> 8 :: Integer})--- >>> solve (approximate (Proxy @4) z3) $ a .> 7 .&& a .< 9--- Left Unsat------ This may be avoided by setting an large enough reasoning precision to prevent--- overflows.-approximate ::- forall p m n.- (KnownNat n, SBV.BVIsNonZero n, KnownIsZero n) =>- p n ->- GrisetteSMTConfig m ->- GrisetteSMTConfig n-approximate p config =- config {extraConfig = (extraConfig config) {integerApprox = Approx p}}- -- | Set the timeout for the solver configuration.-withTimeout :: Int -> GrisetteSMTConfig i -> GrisetteSMTConfig i+--+-- The timeout is in microseconds (1e-6 seconds). The timeout is applied to each+-- individual solver query.+withTimeout :: Int -> GrisetteSMTConfig -> GrisetteSMTConfig withTimeout t config = config {extraConfig = (extraConfig config) {timeout = Just t}} -- | Clear the timeout for the solver configuration.-clearTimeout :: GrisetteSMTConfig i -> GrisetteSMTConfig i+clearTimeout :: GrisetteSMTConfig -> GrisetteSMTConfig clearTimeout config = config {extraConfig = (extraConfig config) {timeout = Nothing}} @@ -420,27 +344,27 @@ -- | Apply the timeout to the configuration. applyTimeout ::- (MonadIO m, SBVTC.MonadQuery m) => GrisetteSMTConfig i -> m a -> m a+ (MonadIO m, SBVTC.MonadQuery m) => GrisetteSMTConfig -> m a -> m a applyTimeout config q = case timeout (extraConfig config) of Nothing -> q Just t -> SBVTC.timeout t q -- | Incremental solver monad transformer with the SBV backend.-type SBVIncrementalT n m =- ReaderT (GrisetteSMTConfig n) (StateT SymBiMap (SBVTC.QueryT m))+type SBVIncrementalT m =+ ReaderT GrisetteSMTConfig (StateT SymBiMap (SBVTC.QueryT m)) -- | Incremental solver monad with the SBV backend.-type SBVIncremental n = SBVIncrementalT n IO+type SBVIncremental = SBVIncrementalT IO -- | Run the incremental solver monad with a given configuration.-runSBVIncremental :: GrisetteSMTConfig n -> SBVIncremental n a -> IO a+runSBVIncremental :: GrisetteSMTConfig -> SBVIncremental a -> IO a runSBVIncremental = runSBVIncrementalT -- | Run the incremental solver monad transformer with a given configuration. runSBVIncrementalT :: (SBVTC.ExtractIO m) =>- GrisetteSMTConfig n ->- SBVIncrementalT n m a ->+ GrisetteSMTConfig ->+ SBVIncrementalT m a -> m a runSBVIncrementalT config sbvIncrementalT = SBVT.runSMTWith (sbvConfig config) $@@ -449,12 +373,14 @@ flip evalStateT emptySymBiMap $ runReaderT sbvIncrementalT config -instance (MonadIO m) => MonadicSolver (SBVIncrementalT n m) where+instance (MonadIO m) => MonadicSolver (SBVIncrementalT m) where monadicSolverAssert (SymBool formula) = do symBiMap <- get config <- ask- (newSymBiMap, lowered) <- lowerSinglePrimCached config formula symBiMap- lift $ lift $ SBV.constrain lowered+ (newSymBiMap, lowered, dummyConstraint) <-+ lowerSinglePrimCached config formula symBiMap+ lift $ lift $ SBV.constrain dummyConstraint+ lift $ lift $ SBV.constrain (lowered emptyQuantifiedStack) put newSymBiMap monadicSolverCheckSat = do checkSatResult <- SBVTC.checkSat@@ -487,7 +413,7 @@ _ <- tryTakeTMVar status putTMVar status SBVSolverTerminated -instance ConfigurableSolver (GrisetteSMTConfig n) SBVSolverHandle where+instance ConfigurableSolver GrisetteSMTConfig SBVSolverHandle where newSolver config = do sbvSolverHandleInChan <- atomically newTChan sbvSolverHandleOutChan <- atomically newTChan@@ -500,7 +426,8 @@ writeTChan sbvSolverHandleOutChan (Left (SolvingError e)) handle handler $ runSBVIncremental config $ do let loop = do- nextFormula <- liftIO $ atomically $ readTChan sbvSolverHandleInChan+ nextFormula <-+ liftIO $ atomically $ readTChan sbvSolverHandleInChan case nextFormula of SolverPush n -> monadicSolverPush n >> loop SolverPop n -> monadicSolverPop n >> loop@@ -554,223 +481,341 @@ throwTo (asyncThreadId thread) ExitSuccess wait thread -configIntroKnownIsZero :: GrisetteSMTConfig n -> ((KnownIsZero n) => r) -> r-configIntroKnownIsZero (GrisetteSMTConfig _ (ExtraConfig _ (Approx _))) r = r-configIntroKnownIsZero (GrisetteSMTConfig _ (ExtraConfig _ NoApprox)) r = r+newtype TermAll = TermAll SBV.SBool +instance Semigroup TermAll where+ TermAll a <> TermAll b = TermAll (a SBV..&& b)++instance Monoid TermAll where+ mempty = TermAll SBV.sTrue+ -- | Lower a single primitive term to SBV. With an explicitly provided -- 'SymBiMap' cache. lowerSinglePrimCached ::- forall integerBitWidth a m.+ forall a m. (HasCallStack, SBVFreshMonad m) =>- GrisetteSMTConfig integerBitWidth ->+ GrisetteSMTConfig -> Term a -> SymBiMap ->- m (SymBiMap, SBVType integerBitWidth a)-lowerSinglePrimCached config t m =- introSupportedPrimConstraint t $- configIntroKnownIsZero config $- case lookupTerm (SomeTerm t) m of- Just x ->- return- ( m,- withPrim @a (Proxy @integerBitWidth) $ fromDyn x undefined- )- Nothing -> lowerSinglePrimImpl config t m+ m (SymBiMap, QuantifiedStack -> SBVType a, SBV.SBool)+lowerSinglePrimCached config t m = do+ -- (_, newm, dummy) <- declareAllUFuncsImpl config t HS.empty m+ (r, finalm, TermAll dummy) <-+ runRWST (lowerSinglePrimCached' config t) emptyQuantifiedSymbols m+ return (finalm, r, dummy) -- | Lower a single primitive term to SBV. lowerSinglePrim ::- forall integerBitWidth a m.+ forall a m. (HasCallStack, SBVFreshMonad m) =>- GrisetteSMTConfig integerBitWidth ->+ GrisetteSMTConfig -> Term a ->- m (SymBiMap, SBVType integerBitWidth a)-lowerSinglePrim config t = lowerSinglePrimCached config t emptySymBiMap+ m (SymBiMap, QuantifiedStack -> SBVType a, SBV.SBool)+lowerSinglePrim config t =+ lowerSinglePrimCached config t emptySymBiMap +lowerSinglePrimCached' ::+ forall a m.+ (HasCallStack, SBVFreshMonad m) =>+ GrisetteSMTConfig ->+ Term a ->+ RWST+ QuantifiedSymbols+ TermAll+ SymBiMap+ m+ (QuantifiedStack -> SBVType a)+lowerSinglePrimCached' config t = do+ m <- get+ introSupportedPrimConstraint t $+ case lookupTerm (SomeTerm t) m of+ Just x ->+ return+ ( \qst ->+ withPrim @a $+ fromDyn (x qst) undefined+ )+ Nothing -> do+ lowerSinglePrimImpl config t+ lowerSinglePrimImpl ::- forall integerBitWidth a m.- (HasCallStack, SBVFreshMonad m, KnownIsZero integerBitWidth) =>- GrisetteSMTConfig integerBitWidth ->+ forall a m.+ (HasCallStack, SBVFreshMonad m) =>+ GrisetteSMTConfig -> Term a ->- SymBiMap ->- m (SymBiMap, SBVType integerBitWidth a)-lowerSinglePrimImpl config (ConTerm _ v) m =- return (m, conSBVTerm config v)-lowerSinglePrimImpl config t@(SymTerm _ ts) m =- withPrim @a config $ do- let name = symSBVName ts (sizeBiMap m)- g <- symSBVTerm @a config name- return (addBiMap (SomeTerm t) (toDyn g) name (someTypedSymbol ts) m, g)-lowerSinglePrimImpl config t m =+ RWST+ QuantifiedSymbols+ TermAll+ SymBiMap+ m+ (QuantifiedStack -> SBVType a)+lowerSinglePrimImpl _ (ConTerm _ v) =+ return $ const $ conSBVTerm v+lowerSinglePrimImpl _ t@(SymTerm _ ts) = do+ qs <- ask+ if isQuantifiedSymbol ts qs+ then withPrim @a $ do+ let retDyn qst =+ case lookupQuantified (someTypedSymbol ts) qst of+ Just v -> v+ Nothing -> error "BUG: Symbol not found in the quantified stack"+ modify $ \m -> addBiMapIntermediate (SomeTerm t) retDyn m+ return $+ \x ->+ fromDyn+ (retDyn x)+ (error "BUG: Symbol not found in the quantified stack")+ else withPrim @a $ do+ m <- get+ let name = symSBVName ts (sizeBiMap m)+ g <- symSBVTerm @a name+ when (isFuncType @a) $ tell $ TermAll $ funcDummyConstraint @a g+ put $ addBiMap (SomeTerm t) (toDyn g) name (someTypedSymbol ts) m+ return $ const g+#if MIN_VERSION_sbv(10,1,0)+lowerSinglePrimImpl config t@(ForallTerm _ (ts :: TypedConstantSymbol t1) v) =+ withNonFuncPrim @t1 $ do+ do+ m <- get+ let (newm, sb@(TypedSymbol sbs)) = attachNextQuantifiedSymbolInfo m ts+ put newm+ let substedTerm = substTerm ts (symTerm sbs) v+ r <-+ local (addQuantifiedSymbol sb) $+ lowerSinglePrimCached'+ config+ substedTerm+ let ret qst = SBV.quantifiedBool $+ \(SBV.Forall (a :: SBVType t1)) ->+ r $ addQuantified sb (toDyn a) qst+ modify $ addBiMapIntermediate (SomeTerm t) (toDyn . ret)+ return ret+lowerSinglePrimImpl config t@(ExistsTerm _ (ts :: TypedConstantSymbol t1) v) =+ withNonFuncPrim @t1 $ do+ do+ m <- get+ let (newm, sb@(TypedSymbol sbs)) = attachNextQuantifiedSymbolInfo m ts+ put newm+ let substedTerm = substTerm ts (symTerm sbs) v+ r <-+ local (addQuantifiedSymbol sb) $+ lowerSinglePrimCached'+ config+ substedTerm+ let ret qst = SBV.quantifiedBool $+ \(SBV.Exists (a :: SBVType t1)) ->+ r $ addQuantified sb (toDyn a) qst+ modify $ addBiMapIntermediate (SomeTerm t) (toDyn . ret)+ return ret+#else+lowerSinglePrimImpl _ ForallTerm {} =+ error "Quantifiers are only available when you build with SBV 10.1.0 or later"+lowerSinglePrimImpl _ ExistsTerm {} =+ error "Quantifiers are only available when you build with SBV 10.1.0 or later"+#endif+lowerSinglePrimImpl config t = introSupportedPrimConstraint t $- withPrim @a config $ do- (m, r) <- lowerSinglePrimIntermediate config t m- return (addBiMapIntermediate (SomeTerm t) (toDyn r) m, r)+ withPrim @a $ do+ r <- lowerSinglePrimIntermediate config t+ modify $ addBiMapIntermediate (SomeTerm t) (toDyn . r)+ return r lowerSinglePrimIntermediate ::- forall integerBitWidth a m.- (HasCallStack, SBVFreshMonad m, KnownIsZero integerBitWidth) =>- GrisetteSMTConfig integerBitWidth ->+ forall a m.+ (HasCallStack, SBVFreshMonad m) =>+ GrisetteSMTConfig -> Term a ->- SymBiMap ->- m (SymBiMap, SBVType integerBitWidth a)-lowerSinglePrimIntermediate config (NotTerm _ a) m = do- (m1, a') <- lowerSinglePrimCached config a m- return (m1, SBV.sNot a')-lowerSinglePrimIntermediate config (OrTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, a' SBV..|| b')-lowerSinglePrimIntermediate config (AndTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, a' SBV..&& b')-lowerSinglePrimIntermediate config (EqTerm _ (a :: Term v) b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvEq @v config a' b')-lowerSinglePrimIntermediate config (ITETerm _ c a b) m = do- (m1, c') <- lowerSinglePrimCached config c m- (m2, a') <- lowerSinglePrimCached config a m1- (m3, b') <- lowerSinglePrimCached config b m2- return (m3, sbvIte @a config c' a' b')-lowerSinglePrimIntermediate config (AddNumTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvAddNumTerm @a config a' b')-lowerSinglePrimIntermediate config (NegNumTerm _ a) m = do- (m1, a') <- lowerSinglePrimCached config a m- return (m1, sbvNegNumTerm @a config a')-lowerSinglePrimIntermediate config (MulNumTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvMulNumTerm @a config a' b')-lowerSinglePrimIntermediate config (AbsNumTerm _ a) m = do- (m1, a') <- lowerSinglePrimCached config a m- return (m1, sbvAbsNumTerm @a config a')-lowerSinglePrimIntermediate config (SignumNumTerm _ a) m = do- (m1, a') <- lowerSinglePrimCached config a m- return (m1, sbvSignumNumTerm @a config a')-lowerSinglePrimIntermediate config (LtOrdTerm _ (a :: Term v) b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvLtOrdTerm @v config a' b')-lowerSinglePrimIntermediate config (LeOrdTerm _ (a :: Term v) b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvLeOrdTerm @v config a' b')-lowerSinglePrimIntermediate config (AndBitsTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvAndBitsTerm @a config a' b')-lowerSinglePrimIntermediate config (OrBitsTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvOrBitsTerm @a config a' b')-lowerSinglePrimIntermediate config (XorBitsTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvXorBitsTerm @a config a' b')-lowerSinglePrimIntermediate config (ComplementBitsTerm _ a) m = do- (m1, a') <- lowerSinglePrimCached config a m- return (m1, sbvComplementBitsTerm @a config a')-lowerSinglePrimIntermediate config (ShiftLeftTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvShiftLeftTerm @a config a' b')-lowerSinglePrimIntermediate config (ShiftRightTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvShiftRightTerm @a config a' b')-lowerSinglePrimIntermediate config (RotateLeftTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvRotateLeftTerm @a config a' b')-lowerSinglePrimIntermediate config (RotateRightTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvRotateRightTerm @a config a' b')-lowerSinglePrimIntermediate config (ApplyTerm _ (f :: Term f) a) m = do- (m1, l1) <- lowerSinglePrimCached config f m- (m2, l2) <- lowerSinglePrimCached config a m1- return (m2, sbvApplyTerm @f config l1 l2)-lowerSinglePrimIntermediate config (ToSignedTerm _ (a :: Term (u n))) m = do- (m1, a') <- lowerSinglePrimCached config a m- return (m1, sbvToSigned (Proxy @u) (Proxy @n) config a')-lowerSinglePrimIntermediate config (ToUnsignedTerm _ (a :: Term (s n))) m = do- (m1, a') <- lowerSinglePrimCached config a m- return (m1, sbvToUnsigned (Proxy @s) (Proxy @n) config a')+ RWST+ QuantifiedSymbols+ TermAll+ SymBiMap+ m+ (QuantifiedStack -> SBVType a)+lowerSinglePrimIntermediate config (NotTerm _ a) = do+ a' <- lowerSinglePrimCached' config a+ return $ SBV.sNot . a'+lowerSinglePrimIntermediate config (OrTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> a' qst SBV..|| b' qst+lowerSinglePrimIntermediate config (AndTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> a' qst SBV..&& b' qst+lowerSinglePrimIntermediate config (EqTerm _ (a :: Term v) b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvEq @v (a' qst) (b' qst)+lowerSinglePrimIntermediate config (DistinctTerm _ (args :: NonEmpty (Term t))) = do+ args' <- traverse (lowerSinglePrimCached' config) args+ return $ \qst -> sbvDistinct @t (fmap ($ qst) args')+lowerSinglePrimIntermediate config (ITETerm _ c a b) = do+ c' <- lowerSinglePrimCached' config c+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvIte @a (c' qst) (a' qst) (b' qst)+lowerSinglePrimIntermediate config (AddNumTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvAddNumTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (NegNumTerm _ a) = do+ a' <- lowerSinglePrimCached' config a+ return $ sbvNegNumTerm @a . a'+lowerSinglePrimIntermediate config (MulNumTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvMulNumTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (AbsNumTerm _ a) = do+ a' <- lowerSinglePrimCached' config a+ return $ sbvAbsNumTerm @a . a'+lowerSinglePrimIntermediate config (SignumNumTerm _ a) = do+ a' <- lowerSinglePrimCached' config a+ return $ sbvSignumNumTerm @a . a'+lowerSinglePrimIntermediate config (LtOrdTerm _ (a :: Term v) b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvLtOrdTerm @v (a' qst) (b' qst)+lowerSinglePrimIntermediate config (LeOrdTerm _ (a :: Term v) b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvLeOrdTerm @v (a' qst) (b' qst)+lowerSinglePrimIntermediate config (AndBitsTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvAndBitsTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (OrBitsTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvOrBitsTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (XorBitsTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvXorBitsTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (ComplementBitsTerm _ a) = do+ a' <- lowerSinglePrimCached' config a+ return $ sbvComplementBitsTerm @a . a'+lowerSinglePrimIntermediate config (ShiftLeftTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvShiftLeftTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (ShiftRightTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvShiftRightTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (RotateLeftTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvRotateLeftTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (RotateRightTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvRotateRightTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (ApplyTerm _ (f :: Term f) a) = do+ l1 <- lowerSinglePrimCached' config f+ l2 <- lowerSinglePrimCached' config a+ return $ \qst -> sbvApplyTerm @f (l1 qst) (l2 qst)+lowerSinglePrimIntermediate config (BitCastTerm _ (a :: Term x)) = do+ a' <- lowerSinglePrimCached' config a+ return $ sbvBitCast @x @a . a' lowerSinglePrimIntermediate config- (BVConcatTerm _ (a :: Term (bv l)) (b :: Term (bv r)))- m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvBVConcatTerm @bv config (Proxy @l) (Proxy @r) a' b')+ (BitCastOrTerm _ (d :: Term a) (a :: Term x)) = do+ d' <- lowerSinglePrimCached' config d+ a' <- lowerSinglePrimCached' config a+ return $ \qst -> sbvBitCastOr @x @a (d' qst) (a' qst) lowerSinglePrimIntermediate config- (BVExtendTerm _ signed (pr :: p r) (a :: Term (bv l)))- m = do- (m1, a') <- lowerSinglePrimCached config a m- return (m1, sbvBVExtendTerm @bv config (Proxy @l) pr signed a')+ (BVConcatTerm _ (a :: Term (bv l)) (b :: Term (bv r))) =+ do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvBVConcatTerm @bv (Proxy @l) (Proxy @r) (a' qst) (b' qst) lowerSinglePrimIntermediate config- (BVSelectTerm _ (pix :: p ix) (pw :: q w) (a :: Term (bv n)))- m = do- (m1, a') <- lowerSinglePrimCached config a m- return (m1, sbvBVSelectTerm @bv config pix pw (Proxy @n) a')-lowerSinglePrimIntermediate config (DivIntegralTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvDivIntegralTerm @a config a' b')-lowerSinglePrimIntermediate config (ModIntegralTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvModIntegralTerm @a config a' b')-lowerSinglePrimIntermediate config (QuotIntegralTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvQuotIntegralTerm @a config a' b')-lowerSinglePrimIntermediate config (RemIntegralTerm _ a b) m = do- (m1, a') <- lowerSinglePrimCached config a m- (m2, b') <- lowerSinglePrimCached config b m1- return (m2, sbvRemIntegralTerm @a config a' b')-lowerSinglePrimIntermediate config (FPTraitTerm _ trait a) m = do- (m, a') <- lowerSinglePrimCached config a m- return (m, sbvFPTraitTerm trait a')-lowerSinglePrimIntermediate config (FdivTerm _ a b) m = do- (m, a) <- lowerSinglePrimCached config a m- (m, b) <- lowerSinglePrimCached config b m- return (m, sbvFdivTerm @a config a b)-lowerSinglePrimIntermediate config (RecipTerm _ a) m = do- (m, a) <- lowerSinglePrimCached config a m- return (m, sbvRecipTerm @a config a)-lowerSinglePrimIntermediate config (SqrtTerm _ a) m = do- (m, a) <- lowerSinglePrimCached config a m- return (m, sbvSqrtTerm @a config a)-lowerSinglePrimIntermediate config (FPUnaryTerm _ op a) m = do- (m, a) <- lowerSinglePrimCached config a m- return (m, sbvFPUnaryTerm op a)-lowerSinglePrimIntermediate config (FPBinaryTerm _ op a b) m = do- (m, a) <- lowerSinglePrimCached config a m- (m, b) <- lowerSinglePrimCached config b m- return (m, sbvFPBinaryTerm op a b)-lowerSinglePrimIntermediate config (FPRoundingUnaryTerm _ op round a) m = do- (m, round) <- lowerSinglePrimCached config round m- (m, a) <- lowerSinglePrimCached config a m- return (m, sbvFPRoundingUnaryTerm op round a)-lowerSinglePrimIntermediate config (FPRoundingBinaryTerm _ op round a b) m = do- (m, round) <- lowerSinglePrimCached config round m- (m, a) <- lowerSinglePrimCached config a m- (m, b) <- lowerSinglePrimCached config b m- return (m, sbvFPRoundingBinaryTerm op round a b)-lowerSinglePrimIntermediate config (FPFMATerm _ round a b c) m = do- (m, round) <- lowerSinglePrimCached config round m- (m, a) <- lowerSinglePrimCached config a m- (m, b) <- lowerSinglePrimCached config b m- (m, c) <- lowerSinglePrimCached config c m- return (m, sbvFPFMATerm round a b c)-lowerSinglePrimIntermediate _ _ _ = undefined+ (BVExtendTerm _ signed (pr :: p r) (a :: Term (bv l))) =+ do+ a' <- lowerSinglePrimCached' config a+ return $ sbvBVExtendTerm @bv (Proxy @l) pr signed . a'+lowerSinglePrimIntermediate+ config+ (BVSelectTerm _ (pix :: p ix) (pw :: q w) (a :: Term (bv n))) =+ do+ a' <- lowerSinglePrimCached' config a+ return $ sbvBVSelectTerm @bv pix pw (Proxy @n) . a'+lowerSinglePrimIntermediate config (DivIntegralTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvDivIntegralTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (ModIntegralTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvModIntegralTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (QuotIntegralTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvQuotIntegralTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (RemIntegralTerm _ a b) = do+ a' <- lowerSinglePrimCached' config a+ b' <- lowerSinglePrimCached' config b+ return $ \qst -> sbvRemIntegralTerm @a (a' qst) (b' qst)+lowerSinglePrimIntermediate config (FPTraitTerm _ trait a) = do+ a' <- lowerSinglePrimCached' config a+ return $ sbvFPTraitTerm trait . a'+lowerSinglePrimIntermediate config (FdivTerm _ a b) = do+ a <- lowerSinglePrimCached' config a+ b <- lowerSinglePrimCached' config b+ return $ \qst -> sbvFdivTerm @a (a qst) (b qst)+lowerSinglePrimIntermediate config (RecipTerm _ a) = do+ a <- lowerSinglePrimCached' config a+ return $ sbvRecipTerm @a . a+lowerSinglePrimIntermediate config (FloatingUnaryTerm _ op a) = do+ a <- lowerSinglePrimCached' config a+ return $ sbvFloatingUnaryTerm @a op . a+lowerSinglePrimIntermediate config (PowerTerm _ a b) = do+ a <- lowerSinglePrimCached' config a+ b <- lowerSinglePrimCached' config b+ return $ \qst -> sbvPowerTerm @a (a qst) (b qst)+lowerSinglePrimIntermediate config (FPUnaryTerm _ op a) = do+ a <- lowerSinglePrimCached' config a+ return $ sbvFPUnaryTerm op . a+lowerSinglePrimIntermediate config (FPBinaryTerm _ op a b) = do+ a <- lowerSinglePrimCached' config a+ b <- lowerSinglePrimCached' config b+ return $ \qst -> sbvFPBinaryTerm op (a qst) (b qst)+lowerSinglePrimIntermediate config (FPRoundingUnaryTerm _ op round a) = do+ round <- lowerSinglePrimCached' config round+ a <- lowerSinglePrimCached' config a+ return $ \qst -> sbvFPRoundingUnaryTerm op (round qst) (a qst)+lowerSinglePrimIntermediate config (FPRoundingBinaryTerm _ op round a b) = do+ round <- lowerSinglePrimCached' config round+ a <- lowerSinglePrimCached' config a+ b <- lowerSinglePrimCached' config b+ return $ \qst -> sbvFPRoundingBinaryTerm op (round qst) (a qst) (b qst)+lowerSinglePrimIntermediate config (FPFMATerm _ round a b c) = do+ round <- lowerSinglePrimCached' config round+ a <- lowerSinglePrimCached' config a+ b <- lowerSinglePrimCached' config b+ c <- lowerSinglePrimCached' config c+ return $ \qst -> sbvFPFMATerm (round qst) (a qst) (b qst) (c qst)+lowerSinglePrimIntermediate config (FromIntegralTerm _ (b :: Term b)) = do+ b <- lowerSinglePrimCached' config b+ return $ sbvFromIntegralTerm @b @a . b+lowerSinglePrimIntermediate config (FromFPOrTerm _ d mode arg) = do+ d <- lowerSinglePrimCached' config d+ mode <- lowerSinglePrimCached' config mode+ arg <- lowerSinglePrimCached' config arg+ return $ \qst -> sbvFromFPOrTerm @a (d qst) (mode qst) (arg qst)+lowerSinglePrimIntermediate config (ToFPTerm _ mode (arg :: Term b) _ _) = do+ mode <- lowerSinglePrimCached' config mode+ arg <- lowerSinglePrimCached' config arg+ return $ \qst -> sbvToFPTerm @b (mode qst) (arg qst)+lowerSinglePrimIntermediate _ ConTerm {} = error "Should not happen"+lowerSinglePrimIntermediate _ SymTerm {} = error "Should not happen"+lowerSinglePrimIntermediate _ ForallTerm {} = error "Should not happen"+lowerSinglePrimIntermediate _ ExistsTerm {} = error "Should not happen"+lowerSinglePrimIntermediate _ UnaryTerm {} = error "Not implemented"+lowerSinglePrimIntermediate _ BinaryTerm {} = error "Not implemented"+lowerSinglePrimIntermediate _ TernaryTerm {} = error "Not implemented" #if MIN_VERSION_sbv(10,3,0) preprocessUIFuncs ::@@ -799,8 +844,7 @@ -- | Parse an SBV model to a Grisette model. parseModel ::- forall integerBitWidth.- GrisetteSMTConfig integerBitWidth ->+ GrisetteSMTConfig -> SBVI.SMTModel -> SymBiMap -> PM.Model@@ -809,7 +853,7 @@ Just funcs -> foldr goSingle emptyModel $ funcs ++ assocFuncs _ -> error "SBV Failed to parse model" where- assocFuncs = (\(s, v) -> (s, ([([], v)], v))) <$> assoc+ assocFuncs = (\(s, v) -> (s, ([], v))) <$> assoc goSingle :: (String, ([([SBVD.CV], SBVD.CV)], SBVD.CV)) -> PM.Model -> PM.Model goSingle (name, cv) m = case findStringToSymbol name mp of Just (SomeTypedSymbol (_ :: p r) s) ->
src/Grisette/Internal/Backend/SymBiMap.hs view
@@ -1,8 +1,12 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE ScopedTypeVariables #-} -- | -- Module : Grisette.Internal.Backend.SymBiMap--- Copyright : (c) Sirui Lu 2021-2023+-- Copyright : (c) Sirui Lu 2021-2024 -- License : BSD-3-Clause (see the LICENSE file) -- -- Maintainer : siruilu@cs.washington.edu@@ -16,47 +20,102 @@ addBiMapIntermediate, findStringToSymbol, lookupTerm,+ QuantifiedSymbolInfo (..),+ attachNextQuantifiedSymbolInfo, ) where +import Control.DeepSeq (NFData) import Data.Dynamic (Dynamic) import qualified Data.HashMap.Strict as M+import Data.Hashable (Hashable)+import GHC.Generics (Generic) import GHC.Stack (HasCallStack)+import Grisette.Internal.Backend.QuantifiedStack (QuantifiedStack)+import Grisette.Internal.Core.Data.Symbol+ ( Symbol (IndexedSymbol, SimpleSymbol),+ withInfo,+ ) import Grisette.Internal.SymPrim.Prim.SomeTerm ( SomeTerm, ) import Grisette.Internal.SymPrim.Prim.Term- ( SomeTypedSymbol,+ ( IsSymbolKind,+ SomeTypedAnySymbol,+ SomeTypedSymbol,+ TypedConstantSymbol,+ TypedSymbol (TypedSymbol),+ castSomeTypedSymbol, )+import Language.Haskell.TH.Syntax (Lift) -- | A bidirectional map between symbolic Grisette terms and sbv terms. data SymBiMap = SymBiMap- { biMapToSBV :: M.HashMap SomeTerm Dynamic,- biMapFromSBV :: M.HashMap String SomeTypedSymbol+ { biMapToSBV :: M.HashMap SomeTerm (QuantifiedStack -> Dynamic),+ biMapFromSBV :: M.HashMap String SomeTypedAnySymbol,+ quantifiedSymbolNum :: Int }- deriving (Show) +-- | Information about a quantified symbol.+newtype QuantifiedSymbolInfo = QuantifiedSymbolInfo Int+ deriving (Generic, Ord, Eq, Show, Hashable, Lift, NFData)++nextQuantifiedSymbolInfo :: SymBiMap -> (SymBiMap, QuantifiedSymbolInfo)+nextQuantifiedSymbolInfo (SymBiMap t f num) =+ (SymBiMap t f (num + 1), QuantifiedSymbolInfo num)++attachQuantifiedSymbolInfo ::+ QuantifiedSymbolInfo -> TypedConstantSymbol a -> TypedConstantSymbol a+attachQuantifiedSymbolInfo+ info+ (TypedSymbol (SimpleSymbol ident)) =+ TypedSymbol $ SimpleSymbol $ withInfo ident info+attachQuantifiedSymbolInfo+ info+ (TypedSymbol (IndexedSymbol ident idx)) =+ TypedSymbol $ IndexedSymbol (withInfo ident info) idx++-- | Attach the next quantified symbol info to a symbol.+attachNextQuantifiedSymbolInfo ::+ SymBiMap -> TypedConstantSymbol a -> (SymBiMap, TypedConstantSymbol a)+attachNextQuantifiedSymbolInfo m s =+ let (m', info) = nextQuantifiedSymbolInfo m+ in (m', attachQuantifiedSymbolInfo info s)+ -- | An empty bidirectional map. emptySymBiMap :: SymBiMap-emptySymBiMap = SymBiMap M.empty M.empty+emptySymBiMap = SymBiMap M.empty M.empty 0 -- | The size of the bidirectional map. sizeBiMap :: SymBiMap -> Int sizeBiMap = M.size . biMapToSBV -- | Add a new entry to the bidirectional map.-addBiMap :: (HasCallStack) => SomeTerm -> Dynamic -> String -> SomeTypedSymbol -> SymBiMap -> SymBiMap-addBiMap s d n sb (SymBiMap t f) = SymBiMap (M.insert s d t) (M.insert n sb f)+addBiMap ::+ (HasCallStack) =>+ SomeTerm ->+ Dynamic ->+ String ->+ SomeTypedSymbol knd ->+ SymBiMap ->+ SymBiMap+addBiMap s d n sb (SymBiMap t f num) =+ case castSomeTypedSymbol sb of+ Just sb' -> SymBiMap (M.insert s (const d) t) (M.insert n sb' f) num+ _ -> error "Casting to AnySymbol, should not fail" -- | Add a new entry to the bidirectional map for intermediate values.-addBiMapIntermediate :: (HasCallStack) => SomeTerm -> Dynamic -> SymBiMap -> SymBiMap-addBiMapIntermediate s d (SymBiMap t f) = SymBiMap (M.insert s d t) f+addBiMapIntermediate ::+ (HasCallStack) => SomeTerm -> (QuantifiedStack -> Dynamic) -> SymBiMap -> SymBiMap+addBiMapIntermediate s d (SymBiMap t f num) = SymBiMap (M.insert s d t) f num -- | Find a symbolic Grisette term from a string.-findStringToSymbol :: String -> SymBiMap -> Maybe SomeTypedSymbol-findStringToSymbol s (SymBiMap _ f) = M.lookup s f+findStringToSymbol :: (IsSymbolKind knd) => String -> SymBiMap -> Maybe (SomeTypedSymbol knd)+findStringToSymbol s (SymBiMap _ f _) = do+ r <- M.lookup s f+ castSomeTypedSymbol r -- | Look up an sbv value with a symbolic Grisette term in the bidirectional -- map.-lookupTerm :: (HasCallStack) => SomeTerm -> SymBiMap -> Maybe Dynamic+lookupTerm :: (HasCallStack) => SomeTerm -> SymBiMap -> Maybe (QuantifiedStack -> Dynamic) lookupTerm t m = M.lookup t (biMapToSBV m)
src/Grisette/Internal/Core/Control/Monad/CBMCExcept.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveLift #-} {-# LANGUAGE DerivingStrategies #-}@@ -67,7 +68,7 @@ import Grisette.Internal.Core.Control.Monad.Union (Union) import Grisette.Internal.Core.Data.Class.EvalSym (EvalSym (evalSym)) import Grisette.Internal.Core.Data.Class.ExtractSym- ( ExtractSym (extractSym),+ ( ExtractSym (extractSymMaybe), ) import Grisette.Internal.Core.Data.Class.GenSym ( GenSym (fresh),@@ -91,8 +92,8 @@ import Grisette.Internal.Core.Data.Class.Solver (UnionWithExcept (extractUnionExcept)) import Grisette.Internal.Core.Data.Class.SymEq (SymEq ((.==))) import Grisette.Internal.Core.Data.Class.SymOrd (SymOrd (symCompare, (.<), (.<=), (.>), (.>=)))-import Grisette.Internal.Core.Data.Class.ToCon (ToCon (toCon))-import Grisette.Internal.Core.Data.Class.ToSym (ToSym (toSym))+import Grisette.Internal.Core.Data.Class.ToCon (ToCon (toCon), ToCon1)+import Grisette.Internal.Core.Data.Class.ToSym (ToSym (toSym), ToSym1) import Grisette.Internal.Core.Data.Class.TryMerge ( TryMerge (tryMergeWithStrategy), tryMerge,@@ -197,15 +198,15 @@ cbmcEither :: forall a c b. (a -> c) -> (b -> c) -> CBMCEither a b -> c cbmcEither l r v = either l r (unsafeCoerce v) --- | Wrap an 'Either' value in 'CBMCExceptT'+-- | Wrap an 'Either' value in t'CBMCExceptT' cbmcExcept :: (Monad m) => Either e a -> CBMCExceptT e m a cbmcExcept m = CBMCExceptT (return $ CBMCEither m) --- | Map the error and values in a 'CBMCExceptT'+-- | Map the error and values in a t'CBMCExceptT' mapCBMCExceptT :: (m (Either e a) -> n (Either e' b)) -> CBMCExceptT e m a -> CBMCExceptT e' n b mapCBMCExceptT f m = CBMCExceptT $ (unsafeCoerce . f . unsafeCoerce) (runCBMCExceptT m) --- | Map the error in a 'CBMCExceptT'+-- | Map the error in a t'CBMCExceptT' withCBMCExceptT :: (Functor m) => (e -> e') -> CBMCExceptT e m a -> CBMCExceptT e' m a withCBMCExceptT f = mapCBMCExceptT $ fmap $ either (Left . f) Right @@ -366,7 +367,7 @@ (ExtractSym (m (CBMCEither e a))) => ExtractSym (CBMCExceptT e m a) where- extractSym (CBMCExceptT v) = extractSym v+ extractSymMaybe (CBMCExceptT v) = extractSymMaybe v instance (Mergeable1 m, Mergeable e, Mergeable a) =>@@ -455,7 +456,7 @@ symCompare (CBMCExceptT l) (CBMCExceptT r) = symCompare l r instance- (ToCon (m1 (CBMCEither e1 a)) (m2 (CBMCEither e2 b))) =>+ (ToCon1 m1 m2, ToCon e1 e2, ToCon a b) => ToCon (CBMCExceptT e1 m1 a) (CBMCExceptT e2 m2 b) where toCon (CBMCExceptT v) = CBMCExceptT <$> toCon v@@ -467,7 +468,7 @@ toCon (CBMCExceptT v) = toCon v instance- (ToSym (m1 (CBMCEither e1 a)) (m2 (CBMCEither e2 b))) =>+ (ToSym e1 e2, ToSym a b, ToSym1 m1 m2) => ToSym (CBMCExceptT e1 m1 a) (CBMCExceptT e2 m2 b) where toSym (CBMCExceptT v) = CBMCExceptT $ toSym v
src/Grisette/Internal/Core/Control/Monad/Union.hs view
@@ -58,9 +58,9 @@ evalSym1, ) import Grisette.Internal.Core.Data.Class.ExtractSym- ( ExtractSym (extractSym),- ExtractSym1 (liftExtractSym),- extractSym1,+ ( ExtractSym (extractSymMaybe),+ ExtractSym1 (liftExtractSymMaybe),+ extractSymMaybe1, ) import Grisette.Internal.Core.Data.Class.Function (Function ((#))) import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp (symIte))@@ -154,7 +154,6 @@ -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim--- >>> :set -XScopedTypeVariables -- | 'Union' is the 'UnionBase' container (hidden) enhanced with -- 'MergingStrategy'@@ -469,7 +468,7 @@ toSym = toSym1 instance ToSym1 Union Union where- liftToSym = fmap+ liftToSym f = tryMerge . fmap f instance ToSym (Union Bool) SymBool where toSym = simpleMerge . fmap con@@ -545,13 +544,13 @@ unionIf = maybe mrgIfPropagatedStrategy mrgIfWithStrategy strategy instance (ExtractSym a) => ExtractSym (Union a) where- extractSym = extractSym1+ extractSymMaybe = extractSymMaybe1 instance ExtractSym1 Union where- liftExtractSym e v = go $ unionBase v+ liftExtractSymMaybe e v = go $ unionBase v where go (UnionSingle x) = e x- go (UnionIf _ _ cond t f) = extractSym cond <> go t <> go f+ go (UnionIf _ _ cond t f) = extractSymMaybe cond <> go t <> go f instance (Hashable a) => Hashable (Union a) where s `hashWithSalt` (UAny u) = s `hashWithSalt` (0 :: Int) `hashWithSalt` u
src/Grisette/Internal/Core/Data/Class/BitCast.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}@@ -13,7 +14,14 @@ -- Maintainer : siruilu@cs.washington.edu -- Stability : Experimental -- Portability : GHC only-module Grisette.Internal.Core.Data.Class.BitCast (BitCast (..)) where+module Grisette.Internal.Core.Data.Class.BitCast+ ( BitCast (..),+ BitCastCanonical (..),+ BitCastOr (..),+ bitCastOrCanonical,+ BitCastOrCanonical,+ )+where import Control.Monad.ST (ST, runST) import Data.Array.ST (MArray (newArray), STUArray, readArray)@@ -22,6 +30,22 @@ import Data.Word (Word32, Word64) -- | Type class for bit-casting between types.+--+-- __Special Considerations for Floating-Point Types:__+--+-- Typically, bit-casting a value from type @a@ to type @b@ and then back to+-- type @a@ should result in the original value. However, this is not always+-- true for floating-point values. In SMT-LIB2, there is only one NaN value with+-- multiple bit representations.+--+-- Given this, we do not provide 'BitCast' for the t'Grisette.SymPrim.FP' type,+-- instead, we use the 'bitCastOrCanonical' function to use a canonical+-- representation for the NaN values.+--+-- If your application requires distinguishing between different NaN values,+-- it is recommended to define your own floating-point type using bit-vectors.+-- This allows you to check for NaN values and perform operations by bitcasting+-- back to the provided floating-point types when they are not NaN values. class BitCast from to where bitCast :: from -> to @@ -54,3 +78,27 @@ ST s b bitcastWithMArray x = newArray (0 :: Int, 0) x >>= castSTUArray >>= flip readArray 0++-- | The canonical value when the bitcast cannot be precisely performed.+--+-- For example, with SMT-LIB2, there is only one NaN for floating point numbers,+-- with multiple bit representations. Our underlying t'Grisette.SymPrim.FP' type+-- also follows this convention. This means that we cannot precisely bitcast a+-- t'Grisette.SymPrim.FP' to other types. So instead, we bitcast the NaN value+-- to a canonical representation, defined with this type class.+class BitCastCanonical from to where+ bitCastCanonicalValue :: proxy from -> to++-- | Bitcasting a value. If the value cannot be precisely bitcast, use the+-- default value.+class BitCastOr from to where+ bitCastOr :: to -> from -> to++-- | Constraint for bitcasting a value and when the value cannot be precisely+-- bitcast, use the canonical value.+type BitCastOrCanonical a b = (BitCastCanonical a b, BitCastOr a b)++-- | Bitcasting a value and when the value cannot be precisely bitcast, use the+-- canonical value.+bitCastOrCanonical :: (BitCastOrCanonical from to) => from -> to+bitCastOrCanonical x = bitCastOr (bitCastCanonicalValue [x]) x
src/Grisette/Internal/Core/Data/Class/BitVector.hs view
@@ -43,11 +43,6 @@ -- >>> import Grisette.Core -- >>> import Grisette.SymPrim -- >>> import Grisette.Utils--- >>> :set -XDataKinds--- >>> :set -XBinaryLiterals--- >>> :set -XFlexibleContexts--- >>> :set -XFlexibleInstances--- >>> :set -XFunctionalDependencies -- | Bit vector operations. Including concatenation ('bvConcat'), -- extension ('bvZext', 'bvSext', 'bvExt'), and selection
src/Grisette/Internal/Core/Data/Class/CEGISSolver.hs view
@@ -332,7 +332,7 @@ handle -> -- | Initial symbolic inputs. The solver will try to find a -- program that works on all the inputs representable by these inputs (see- -- 'CEGISCondition').+ -- t'CEGISCondition'). [input] -> -- | The condition for the solver to solve. All the -- symbolic constants that are not in the inputs will@@ -393,7 +393,7 @@ handle -> -- | Initial symbolic inputs. The solver will try to find a -- program that works on all the inputs representable by it (see- -- 'CEGISCondition').+ -- t'CEGISCondition'). inputs -> -- | The condition for the solver to solve. All the -- symbolic constants that are not in the inputs will@@ -751,7 +751,7 @@ -- | -- CEGIS with multiple (possibly symbolic) inputs. Solves the following formula--- (see 'CEGISCondition' for details).+-- (see t'CEGISCondition' for details). -- -- \[ -- \forall P. (\exists I\in\mathrm{inputs}. \mathrm{pre}(P, I)) \wedge (\forall I\in\mathrm{inputs}. \mathrm{pre}(P, I)\implies \mathrm{post}(P, I))@@ -769,7 +769,7 @@ config -> -- | Initial symbolic inputs. The solver will try to find a -- program that works on all the inputs representable by these inputs (see- -- 'CEGISCondition').+ -- t'CEGISCondition'). [input] -> -- | The condition for the solver to solve. All the -- symbolic constants that are not in the inputs will@@ -795,7 +795,6 @@ -- positive @x@, @x * c < 0 && c > -2@. The @c .> -2@ clause is used to make -- the solution unique. ----- >>> :set -XOverloadedStrings -- >>> let [x,c] = ["x","c"] :: [SymInteger] -- >>> cegis z3 x (\x -> cegisPrePost (x .> 0) (x * c .< 0 .&& c .> -2)) -- (...,CEGISSuccess (Model {c -> -1 :: Integer}))@@ -809,7 +808,7 @@ config -> -- | Initial symbolic inputs. The solver will try to find a -- program that works on all the inputs representable by it (see- -- 'CEGISCondition').+ -- t'CEGISCondition'). inputs -> -- | The condition for the solver to solve. All the -- symbolic constants that are not in the inputs will@@ -917,7 +916,6 @@ -- positive @x@, @x * c < 0 && c > -2@. The @c .> -2@ assertion is used to make -- the solution unique. ----- >>> :set -XOverloadedStrings -- >>> let [x,c] = ["x","c"] :: [SymInteger] -- >>> import Control.Monad.Except -- >>> :{@@ -993,7 +991,6 @@ -- positive @x@, @x * c < 0 && c > -2@. The @c .> -2@ assertion is used to make -- the solution unique. ----- >>> :set -XOverloadedStrings -- >>> let [x,c] = ["x","c"] :: [SymInteger] -- >>> import Control.Monad.Except -- >>> :{@@ -1031,7 +1028,6 @@ -- positive @x@, @x * c < 0 && c > -2@. The @c .> -2@ clause is used to make -- the solution unique. ----- >>> :set -XOverloadedStrings -- >>> let [x,c] = ["x","c"] :: [SymInteger] -- >>> cegisForAll z3 x $ cegisPrePost (x .> 0) (x * c .< 0 .&& c .> -2) -- (...,CEGISSuccess (Model {c -> -1 :: Integer}))
src/Grisette/Internal/Core/Data/Class/Error.hs view
@@ -42,8 +42,6 @@ -- >>> import Grisette.SymPrim -- >>> import Grisette.Lib.Control.Monad -- >>> import Control.Monad.Except--- >>> :set -XOverloadedStrings--- >>> :set -XFlexibleContexts -- | This class indicates that the error type @to@ can always represent the -- error type @from@.@@ -152,7 +150,7 @@ -- The symbolic execution will continue on the then-branch, where the condition is true. -- For the else branch, where the condition is false, the execution will be terminated. ----- The resulting monadic environment should be compatible with the 'AssertionError'+-- The resulting monadic environment should be compatible with the t'AssertionError' -- error type. See 'TransformError' type class for details. -- -- __/Examples/__:@@ -182,7 +180,7 @@ -- >>> do; symAssert (ssym "a"); mrgReturn 1 :: ExceptT AssertionError Union Integer -- ExceptT {If (! a) (Left AssertionError) (Right 1)} ----- 'AssertionError' is compatible with 'VerificationConditions':+-- t'AssertionError' is compatible with 'VerificationConditions': -- -- >>> symAssert (ssym "a") :: ExceptT VerificationConditions Union () -- ExceptT {If (! a) (Left AssertionViolation) (Right ())}
src/Grisette/Internal/Core/Data/Class/EvalSym.hs view
@@ -55,6 +55,7 @@ import Data.Functor.Const (Const) import Data.Functor.Product (Product) import Data.Functor.Sum (Sum)+import qualified Data.HashSet as HS import Data.Int (Int16, Int32, Int64, Int8) import Data.Kind (Type) import Data.Maybe (fromJust)@@ -91,11 +92,18 @@ toCon1, toCon2, )+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)-import Grisette.Internal.SymPrim.GeneralFun (type (-->))-import Grisette.Internal.SymPrim.Prim.Model (Model, evaluateTerm)-import Grisette.Internal.SymPrim.Prim.Term (LinkedRep, SupportedPrim)+import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, NotRepresentableFPError, ValidFP)+import Grisette.Internal.SymPrim.GeneralFun (type (-->) (GeneralFun))+import Grisette.Internal.SymPrim.Prim.Model (Model, evalTerm)+import Grisette.Internal.SymPrim.Prim.Term+ ( LinkedRep,+ SupportedPrim,+ SymRep (SymType),+ someTypedSymbol,+ )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal)) import Grisette.Internal.SymPrim.SymBV ( SymIntN (SymIntN), SymWordN (SymWordN),@@ -108,7 +116,7 @@ import Grisette.Internal.SymPrim.SymGeneralFun (type (-~>) (SymGeneralFun)) import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger)) import Grisette.Internal.SymPrim.SymTabularFun (type (=~>) (SymTabularFun))-import Grisette.Internal.SymPrim.TabularFun (type (=->))+import Grisette.Internal.SymPrim.TabularFun (type (=->) (TabularFun)) import Grisette.Internal.TH.DeriveBuiltin (deriveBuiltins) import Grisette.Internal.TH.DeriveInstanceProvider ( Strategy (ViaDefault, ViaDefault1),@@ -119,7 +127,6 @@ -- >>> import Grisette.Core -- >>> import Grisette.SymPrim -- >>> import Data.Proxy--- >>> :set -XTypeApplications -- | Evaluating symbolic values with some model. This would substitute the -- symbols (symbolic constants) with the values in the model.@@ -348,6 +355,7 @@ CONCRETE_EVALUATESYM(Ordering) CONCRETE_EVALUATESYM_BV(IntN) CONCRETE_EVALUATESYM_BV(WordN)+CONCRETE_EVALUATESYM(AlgReal) #endif instance (ValidFP eb fb) => EvalSym (FP eb fb) where@@ -357,23 +365,24 @@ #define EVALUATE_SYM_SIMPLE(symtype) \ instance EvalSym symtype where \ evalSym fillDefault model (symtype t) = \- symtype $ evaluateTerm fillDefault model t+ symtype $ evalTerm fillDefault model HS.empty t #define EVALUATE_SYM_BV(symtype) \ instance (KnownNat n, 1 <= n) => EvalSym (symtype n) where \ evalSym fillDefault model (symtype t) = \- symtype $ evaluateTerm fillDefault model t+ symtype $ evalTerm fillDefault model HS.empty t #define EVALUATE_SYM_FUN(cop, op, cons) \ instance (SupportedPrim (cop ca cb), LinkedRep ca sa, LinkedRep cb sb) => \ EvalSym (op sa sb) where \ evalSym fillDefault model (cons t) = \- cons $ evaluateTerm fillDefault model t+ cons $ evalTerm fillDefault model HS.empty t #if 1 EVALUATE_SYM_SIMPLE(SymBool) EVALUATE_SYM_SIMPLE(SymInteger) EVALUATE_SYM_SIMPLE(SymFPRoundingMode)+EVALUATE_SYM_SIMPLE(SymAlgReal) EVALUATE_SYM_BV(SymIntN) EVALUATE_SYM_BV(SymWordN) EVALUATE_SYM_FUN((=->), (=~>), SymTabularFun)@@ -382,7 +391,7 @@ instance (ValidFP eb sb) => EvalSym (SymFP eb sb) where evalSym fillDefault model (SymFP t) =- SymFP $ evaluateTerm fillDefault model t+ SymFP $ evalTerm fillDefault model HS.empty t -- Instances deriveBuiltins@@ -408,6 +417,7 @@ ''(,,,,,,,,,,,,,,), ''AssertionError, ''VerificationConditions,+ ''NotRepresentableFPError, ''Identity, ''Monoid.Dual, ''Monoid.Sum,@@ -629,3 +639,14 @@ g fillDefault model d ) {-# INLINE liftEvalSym2 #-}++instance (EvalSym a, EvalSym b) => EvalSym (a =-> b) where+ evalSym fillDefault model (TabularFun s t) =+ TabularFun+ (evalSym fillDefault model s)+ (evalSym fillDefault model t)++instance (EvalSym (SymType b)) => EvalSym (a --> b) where+ evalSym fillDefault model (GeneralFun s t) =+ GeneralFun s $+ evalTerm fillDefault model (HS.singleton $ someTypedSymbol s) t
src/Grisette/Internal/Core/Data/Class/ExtractSym.hs view
@@ -4,11 +4,14 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE Trustworthy #-}+{-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-}@@ -25,15 +28,17 @@ ( -- * Extracting symbolic constant set from a value ExtractSym (..), ExtractSym1 (..),+ extractSymMaybe1, extractSym1, ExtractSym2 (..),+ extractSymMaybe2, extractSym2, -- * Generic 'ExtractSym' ExtractSymArgs (..), GExtractSym (..),- genericExtractSym,- genericLiftExtractSym,+ genericExtractSymMaybe,+ genericLiftExtractSymMaybe, ) where @@ -50,12 +55,15 @@ import Data.Functor.Const (Const) import Data.Functor.Product (Product) import Data.Functor.Sum (Sum)+import qualified Data.HashSet as HS import Data.Int (Int16, Int32, Int64, Int8) import Data.Kind (Type)+import Data.Maybe (fromJust) import Data.Monoid (Alt, Ap) import qualified Data.Monoid as Monoid import Data.Ord (Down) import qualified Data.Text as T+import Data.Typeable (type (:~~:) (HRefl)) import Data.Word (Word16, Word32, Word64, Word8) import GHC.TypeNats (KnownNat, type (<=)) import Generics.Deriving@@ -73,18 +81,28 @@ type (:+:) (L1, R1), type (:.:) (Comp1), )-import Grisette.Internal.Core.Control.Exception (AssertionError, VerificationConditions)+import Grisette.Internal.Core.Control.Exception+ ( AssertionError,+ VerificationConditions,+ )+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)-import Grisette.Internal.SymPrim.GeneralFun (type (-->))+import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, NotRepresentableFPError, ValidFP)+import Grisette.Internal.SymPrim.GeneralFun (type (-->) (GeneralFun)) import Grisette.Internal.SymPrim.Prim.Model- ( SymbolSet (SymbolSet),+ ( AnySymbolSet,+ SymbolSet (SymbolSet), ) import Grisette.Internal.SymPrim.Prim.Term- ( LinkedRep,+ ( IsSymbolKind (decideSymbolKind),+ LinkedRep, SupportedPrim,+ SymRep (SymType),+ SymbolKind,+ someTypedSymbol, ) import Grisette.Internal.SymPrim.Prim.TermUtils (extractTerm)+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal)) import Grisette.Internal.SymPrim.SymBV ( SymIntN (SymIntN), SymWordN (SymWordN),@@ -97,7 +115,7 @@ import Grisette.Internal.SymPrim.SymGeneralFun (type (-~>) (SymGeneralFun)) import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger)) import Grisette.Internal.SymPrim.SymTabularFun (type (=~>) (SymTabularFun))-import Grisette.Internal.SymPrim.TabularFun (type (=->))+import Grisette.Internal.SymPrim.TabularFun (type (=->) (TabularFun)) import Grisette.Internal.TH.DeriveBuiltin (deriveBuiltins) import Grisette.Internal.TH.DeriveInstanceProvider ( Strategy (ViaDefault, ViaDefault1),@@ -114,10 +132,10 @@ -- | Extracts all the symbols (symbolic constants) that are transitively -- contained in the given value. ----- >>> extractSym ("a" :: SymBool) :: SymbolSet+-- >>> extractSym ("a" :: SymBool) -- SymbolSet {a :: Bool} ----- >>> extractSym (mrgIf "a" (mrgReturn ["b"]) (mrgReturn ["c", "d"]) :: Union [SymBool]) :: SymbolSet+-- >>> extractSym (mrgIf "a" (mrgReturn ["b"]) (mrgReturn ["c", "d"]) :: Union [SymBool]) -- SymbolSet {a :: Bool, b :: Bool, c :: Bool, d :: Bool} -- -- __Note 1:__ This type class can be derived for algebraic data types.@@ -125,145 +143,178 @@ -- -- > data X = ... deriving Generic deriving ExtractSym via (Default X) class ExtractSym a where- extractSym :: a -> SymbolSet+ extractSym :: a -> AnySymbolSet+ extractSym = fromJust . extractSymMaybe+ {-# INLINE extractSym #-}+ extractSymMaybe :: (IsSymbolKind knd) => a -> Maybe (SymbolSet knd) -- | Lifting of 'ExtractSym' to unary type constructors. class (forall a. (ExtractSym a) => ExtractSym (f a)) => ExtractSym1 f where- -- | Lifts the 'extractSym' function to unary type constructors.- liftExtractSym :: (a -> SymbolSet) -> f a -> SymbolSet+ -- | Lifts the 'extractSymMaybe' function to unary type constructors.+ liftExtractSymMaybe ::+ (IsSymbolKind knd) =>+ (a -> Maybe (SymbolSet knd)) ->+ f a ->+ Maybe (SymbolSet knd) -- | Lift the standard 'extractSym' to unary type constructors.-extractSym1 :: (ExtractSym1 f, ExtractSym a) => f a -> SymbolSet-extractSym1 = liftExtractSym extractSym+extractSym1 ::+ (ExtractSym1 f, ExtractSym a, IsSymbolKind knd) =>+ f a ->+ SymbolSet knd+extractSym1 = fromJust . liftExtractSymMaybe extractSymMaybe {-# INLINE extractSym1 #-} +-- | Lift the standard 'extractSymMaybe' to unary type constructors.+extractSymMaybe1 ::+ (ExtractSym1 f, ExtractSym a, IsSymbolKind knd) =>+ f a ->+ Maybe (SymbolSet knd)+extractSymMaybe1 = liftExtractSymMaybe extractSymMaybe+{-# INLINE extractSymMaybe1 #-}+ -- | Lifting of 'ExtractSym' to binary type constructors. class (forall a. (ExtractSym a) => ExtractSym1 (f a)) => ExtractSym2 f where- -- | Lifts the 'extractSym' function to binary type constructors.- liftExtractSym2 ::- (a -> SymbolSet) -> (b -> SymbolSet) -> f a b -> SymbolSet+ -- | Lifts the 'extractSymMaybe' function to binary type constructors.+ liftExtractSymMaybe2 ::+ (IsSymbolKind knd) =>+ (a -> Maybe (SymbolSet knd)) ->+ (b -> Maybe (SymbolSet knd)) ->+ f a b ->+ Maybe (SymbolSet knd) -- | Lift the standard 'extractSym' to binary type constructors. extractSym2 ::- (ExtractSym2 f, ExtractSym a, ExtractSym b) =>+ (ExtractSym2 f, ExtractSym a, ExtractSym b, IsSymbolKind knd) => f a b ->- SymbolSet-extractSym2 = liftExtractSym2 extractSym extractSym-{-# INLINE extractSym2 #-}+ SymbolSet knd+extractSym2 = fromJust . liftExtractSymMaybe2 extractSymMaybe extractSymMaybe +-- | Lift the standard 'extractSymMaybe' to binary type constructors.+extractSymMaybe2 ::+ (ExtractSym2 f, ExtractSym a, ExtractSym b, IsSymbolKind knd) =>+ f a b ->+ Maybe (SymbolSet knd)+extractSymMaybe2 = liftExtractSymMaybe2 extractSymMaybe extractSymMaybe+{-# INLINE extractSymMaybe2 #-}+ -- Derivations -- | The arguments to the generic 'extractSym' function.-data family ExtractSymArgs arity a :: Type+data family ExtractSymArgs arity (knd :: SymbolKind) a :: Type -data instance ExtractSymArgs Arity0 _ = ExtractSymArgs0+data instance ExtractSymArgs Arity0 _ _ = ExtractSymArgs0 -newtype instance ExtractSymArgs Arity1 a- = ExtractSymArgs1 (a -> SymbolSet)+newtype instance ExtractSymArgs Arity1 knd a+ = ExtractSymArgs1 (a -> Maybe (SymbolSet knd)) -- | The class of types that can generically extract the symbols. class GExtractSym arity f where- gextractSym :: ExtractSymArgs arity a -> f a -> SymbolSet+ gextractSymMaybe ::+ (IsSymbolKind knd) =>+ ExtractSymArgs arity knd a ->+ f a ->+ Maybe (SymbolSet knd) instance GExtractSym arity V1 where- gextractSym _ _ = mempty- {-# INLINE gextractSym #-}+ gextractSymMaybe _ _ = Just mempty+ {-# INLINE gextractSymMaybe #-} instance GExtractSym arity U1 where- gextractSym _ _ = mempty- {-# INLINE gextractSym #-}+ gextractSymMaybe _ _ = Just mempty+ {-# INLINE gextractSymMaybe #-} instance (GExtractSym arity a) => GExtractSym arity (M1 i c a) where- gextractSym args (M1 x) = gextractSym args x- {-# INLINE gextractSym #-}+ gextractSymMaybe args (M1 x) = gextractSymMaybe args x+ {-# INLINE gextractSymMaybe #-} instance (ExtractSym a) => GExtractSym arity (K1 i a) where- gextractSym _ (K1 x) = extractSym x- {-# INLINE gextractSym #-}+ gextractSymMaybe _ (K1 x) = extractSymMaybe x+ {-# INLINE gextractSymMaybe #-} instance (GExtractSym arity a, GExtractSym arity b) => GExtractSym arity (a :+: b) where- gextractSym args (L1 x) = gextractSym args x- gextractSym args (R1 x) = gextractSym args x- {-# INLINE gextractSym #-}+ gextractSymMaybe args (L1 x) = gextractSymMaybe args x+ gextractSymMaybe args (R1 x) = gextractSymMaybe args x+ {-# INLINE gextractSymMaybe #-} instance (GExtractSym arity a, GExtractSym arity b) => GExtractSym arity (a :*: b) where- gextractSym args (x :*: y) =- gextractSym args x <> gextractSym args y- {-# INLINE gextractSym #-}+ gextractSymMaybe args (x :*: y) =+ gextractSymMaybe args x <> gextractSymMaybe args y+ {-# INLINE gextractSymMaybe #-} instance GExtractSym Arity1 Par1 where- gextractSym (ExtractSymArgs1 f) (Par1 x) = f x- {-# INLINE gextractSym #-}+ gextractSymMaybe (ExtractSymArgs1 f) (Par1 x) = f x+ {-# INLINE gextractSymMaybe #-} instance (ExtractSym1 a) => GExtractSym Arity1 (Rec1 a) where- gextractSym (ExtractSymArgs1 f) (Rec1 x) =- liftExtractSym f x- {-# INLINE gextractSym #-}+ gextractSymMaybe (ExtractSymArgs1 f) (Rec1 x) =+ liftExtractSymMaybe f x+ {-# INLINE gextractSymMaybe #-} instance (ExtractSym1 f, GExtractSym Arity1 g) => GExtractSym Arity1 (f :.: g) where- gextractSym targs (Comp1 x) =- liftExtractSym (gextractSym targs) x- {-# INLINE gextractSym #-}+ gextractSymMaybe targs (Comp1 x) =+ liftExtractSymMaybe (gextractSymMaybe targs) x+ {-# INLINE gextractSymMaybe #-} -- | Generic 'extractSym' function.-genericExtractSym ::- (Generic a, GExtractSym Arity0 (Rep a)) =>+genericExtractSymMaybe ::+ (Generic a, GExtractSym Arity0 (Rep a), IsSymbolKind knd) => a ->- SymbolSet-genericExtractSym = gextractSym ExtractSymArgs0 . from+ Maybe (SymbolSet knd)+genericExtractSymMaybe = gextractSymMaybe ExtractSymArgs0 . from --- | Generic 'liftExtractSym' function.-genericLiftExtractSym ::- (Generic1 f, GExtractSym Arity1 (Rep1 f)) =>- (a -> SymbolSet) ->+-- | Generic 'liftExtractSymMaybe' function.+genericLiftExtractSymMaybe ::+ (Generic1 f, GExtractSym Arity1 (Rep1 f), IsSymbolKind knd) =>+ (a -> Maybe (SymbolSet knd)) -> f a ->- SymbolSet-genericLiftExtractSym f =- gextractSym (ExtractSymArgs1 f) . from1+ Maybe (SymbolSet knd)+genericLiftExtractSymMaybe f =+ gextractSymMaybe (ExtractSymArgs1 f) . from1 instance (Generic a, GExtractSym Arity0 (Rep a)) => ExtractSym (Default a) where- extractSym = genericExtractSym . unDefault- {-# INLINE extractSym #-}+ extractSymMaybe = genericExtractSymMaybe . unDefault+ {-# INLINE extractSymMaybe #-} instance (Generic1 f, GExtractSym Arity1 (Rep1 f), ExtractSym a) => ExtractSym (Default1 f a) where- extractSym = extractSym1- {-# INLINE extractSym #-}+ extractSymMaybe = extractSymMaybe1+ {-# INLINE extractSymMaybe #-} instance (Generic1 f, GExtractSym Arity1 (Rep1 f)) => ExtractSym1 (Default1 f) where- liftExtractSym f = genericLiftExtractSym f . unDefault1- {-# INLINE liftExtractSym #-}+ liftExtractSymMaybe f = genericLiftExtractSymMaybe f . unDefault1+ {-# INLINE liftExtractSymMaybe #-} #define CONCRETE_EXTRACT_SYMBOLICS(type) \ instance ExtractSym type where \- extractSym _ = mempty+ extractSymMaybe _ = return mempty #define CONCRETE_EXTRACT_SYMBOLICS_BV(type) \ instance (KnownNat n, 1 <= n) => ExtractSym (type n) where \- extractSym _ = mempty+ extractSymMaybe _ = return mempty #if 1 CONCRETE_EXTRACT_SYMBOLICS(Bool)@@ -289,28 +340,45 @@ CONCRETE_EXTRACT_SYMBOLICS(Ordering) CONCRETE_EXTRACT_SYMBOLICS_BV(WordN) CONCRETE_EXTRACT_SYMBOLICS_BV(IntN)+CONCRETE_EXTRACT_SYMBOLICS(AlgReal) #endif instance (ValidFP eb sb) => ExtractSym (FP eb sb) where- extractSym _ = mempty+ extractSymMaybe _ = return mempty #define EXTRACT_SYMBOLICS_SIMPLE(symtype) \ instance ExtractSym symtype where \- extractSym (symtype t) = SymbolSet $ extractTerm t+ extractSymMaybe :: \+ forall knd. (IsSymbolKind knd) => symtype -> Maybe (SymbolSet knd); \+ extractSymMaybe (symtype t) = \+ case decideSymbolKind @knd of\+ Left HRefl -> SymbolSet <$> extractTerm HS.empty t; \+ Right HRefl -> SymbolSet <$> extractTerm HS.empty t #define EXTRACT_SYMBOLICS_BV(symtype) \ instance (KnownNat n, 1 <= n) => ExtractSym (symtype n) where \- extractSym (symtype t) = SymbolSet $ extractTerm t+ extractSymMaybe :: \+ forall knd. (IsSymbolKind knd) => symtype n -> Maybe (SymbolSet knd); \+ extractSymMaybe (symtype t) = \+ case decideSymbolKind @knd of\+ Left HRefl -> SymbolSet <$> extractTerm HS.empty t; \+ Right HRefl -> SymbolSet <$> extractTerm HS.empty t #define EXTRACT_SYMBOLICS_FUN(cop, op, cons) \ instance (SupportedPrim (cop ca cb), LinkedRep ca sa, LinkedRep cb sb) => \ ExtractSym (op sa sb) where \- extractSym (cons t) = SymbolSet $ extractTerm t+ extractSymMaybe :: \+ forall knd. (IsSymbolKind knd) => op sa sb -> Maybe (SymbolSet knd); \+ extractSymMaybe (cons t) = \+ case decideSymbolKind @knd of \+ Left HRefl -> Nothing; \+ Right HRefl -> SymbolSet <$> extractTerm HS.empty t #if 1 EXTRACT_SYMBOLICS_SIMPLE(SymBool) EXTRACT_SYMBOLICS_SIMPLE(SymInteger) EXTRACT_SYMBOLICS_SIMPLE(SymFPRoundingMode)+EXTRACT_SYMBOLICS_SIMPLE(SymAlgReal) EXTRACT_SYMBOLICS_BV(SymIntN) EXTRACT_SYMBOLICS_BV(SymWordN) EXTRACT_SYMBOLICS_FUN((=->), (=~>), SymTabularFun)@@ -318,7 +386,12 @@ #endif instance (ValidFP eb fb) => ExtractSym (SymFP eb fb) where- extractSym (SymFP t) = SymbolSet $ extractTerm t+ extractSymMaybe ::+ forall knd. (IsSymbolKind knd) => SymFP eb fb -> Maybe (SymbolSet knd)+ extractSymMaybe (SymFP t) =+ case decideSymbolKind @knd of+ Left HRefl -> SymbolSet <$> extractTerm HS.empty t+ Right HRefl -> SymbolSet <$> extractTerm HS.empty t -- Instances deriveBuiltins@@ -344,6 +417,7 @@ ''(,,,,,,,,,,,,,,), ''AssertionError, ''VerificationConditions,+ ''NotRepresentableFPError, ''Identity, ''Monoid.Dual, ''Monoid.Sum,@@ -387,75 +461,75 @@ (ExtractSym1 m, ExtractSym e, ExtractSym a) => ExtractSym (ExceptT e m a) where- extractSym = extractSym1- {-# INLINE extractSym #-}+ extractSymMaybe = extractSymMaybe1+ {-# INLINE extractSymMaybe #-} instance (ExtractSym1 m, ExtractSym e) => ExtractSym1 (ExceptT e m) where- liftExtractSym f (ExceptT v) =- liftExtractSym (liftExtractSym f) v- {-# INLINE liftExtractSym #-}+ liftExtractSymMaybe f (ExceptT v) =+ liftExtractSymMaybe (liftExtractSymMaybe f) v+ {-# INLINE liftExtractSymMaybe #-} -- MaybeT instance (ExtractSym1 m, ExtractSym a) => ExtractSym (MaybeT m a) where- extractSym = extractSym1- {-# INLINE extractSym #-}+ extractSymMaybe = extractSymMaybe1+ {-# INLINE extractSymMaybe #-} instance (ExtractSym1 m) => ExtractSym1 (MaybeT m) where- liftExtractSym f (MaybeT v) =- liftExtractSym (liftExtractSym f) v- {-# INLINE liftExtractSym #-}+ liftExtractSymMaybe f (MaybeT v) =+ liftExtractSymMaybe (liftExtractSymMaybe f) v+ {-# INLINE liftExtractSymMaybe #-} -- WriterT instance (ExtractSym1 m, ExtractSym w, ExtractSym a) => ExtractSym (WriterLazy.WriterT w m a) where- extractSym = extractSym1- {-# INLINE extractSym #-}+ extractSymMaybe = extractSymMaybe1+ {-# INLINE extractSymMaybe #-} instance (ExtractSym1 m, ExtractSym w) => ExtractSym1 (WriterLazy.WriterT w m) where- liftExtractSym f (WriterLazy.WriterT v) =- liftExtractSym (liftExtractSym2 f extractSym) v- {-# INLINE liftExtractSym #-}+ liftExtractSymMaybe f (WriterLazy.WriterT v) =+ liftExtractSymMaybe (liftExtractSymMaybe2 f extractSymMaybe) v+ {-# INLINE liftExtractSymMaybe #-} instance (ExtractSym1 m, ExtractSym w, ExtractSym a) => ExtractSym (WriterStrict.WriterT w m a) where- extractSym = extractSym1- {-# INLINE extractSym #-}+ extractSymMaybe = extractSymMaybe1+ {-# INLINE extractSymMaybe #-} instance (ExtractSym1 m, ExtractSym w) => ExtractSym1 (WriterStrict.WriterT w m) where- liftExtractSym f (WriterStrict.WriterT v) =- liftExtractSym (liftExtractSym2 f extractSym) v- {-# INLINE liftExtractSym #-}+ liftExtractSymMaybe f (WriterStrict.WriterT v) =+ liftExtractSymMaybe (liftExtractSymMaybe2 f extractSymMaybe) v+ {-# INLINE liftExtractSymMaybe #-} -- IdentityT instance (ExtractSym1 m, ExtractSym a) => ExtractSym (IdentityT m a) where- extractSym = extractSym1- {-# INLINE extractSym #-}+ extractSymMaybe = extractSymMaybe1+ {-# INLINE extractSymMaybe #-} instance (ExtractSym1 m) => ExtractSym1 (IdentityT m) where- liftExtractSym f (IdentityT v) = liftExtractSym f v- {-# INLINE liftExtractSym #-}+ liftExtractSymMaybe f (IdentityT v) = liftExtractSymMaybe f v+ {-# INLINE liftExtractSymMaybe #-} -- Product deriving via@@ -492,9 +566,9 @@ (ExtractSym1 f, ExtractSym1 g) => ExtractSym1 (Compose f g) where- liftExtractSym f (Compose l) =- liftExtractSym (liftExtractSym f) l- {-# INLINE liftExtractSym #-}+ liftExtractSymMaybe f (Compose l) =+ liftExtractSymMaybe (liftExtractSymMaybe f) l+ {-# INLINE liftExtractSymMaybe #-} -- Const deriving via@@ -573,22 +647,33 @@ -- ExtractSym2 instance ExtractSym2 Either where- liftExtractSym2 f _ (Left x) = f x- liftExtractSym2 _ g (Right y) = g y- {-# INLINE liftExtractSym2 #-}+ liftExtractSymMaybe2 f _ (Left x) = f x+ liftExtractSymMaybe2 _ g (Right y) = g y+ {-# INLINE liftExtractSymMaybe2 #-} instance ExtractSym2 (,) where- liftExtractSym2 f g (x, y) = f x <> g y- {-# INLINE liftExtractSym2 #-}+ liftExtractSymMaybe2 f g (x, y) = f x <> g y+ {-# INLINE liftExtractSymMaybe2 #-} instance (ExtractSym a) => ExtractSym2 ((,,) a) where- liftExtractSym2 f g (x, y, z) = extractSym x <> f y <> g z- {-# INLINE liftExtractSym2 #-}+ liftExtractSymMaybe2 f g (x, y, z) = extractSymMaybe x <> f y <> g z+ {-# INLINE liftExtractSymMaybe2 #-} instance (ExtractSym a, ExtractSym b) => ExtractSym2 ((,,,) a b) where- liftExtractSym2 f g (x, y, z, w) =- extractSym x <> extractSym y <> f z <> g w- {-# INLINE liftExtractSym2 #-}+ liftExtractSymMaybe2 f g (x, y, z, w) =+ extractSymMaybe x <> extractSymMaybe y <> f z <> g w+ {-# INLINE liftExtractSymMaybe2 #-}++instance (ExtractSym a, ExtractSym b) => ExtractSym (a =-> b) where+ extractSymMaybe (TabularFun s t) =+ extractSymMaybe s <> extractSymMaybe t++instance (ExtractSym (SymType b)) => ExtractSym (a --> b) where+ extractSymMaybe :: forall knd. (IsSymbolKind knd) => (a --> b) -> Maybe (SymbolSet knd)+ extractSymMaybe (GeneralFun t f) =+ case decideSymbolKind @knd of+ Left HRefl -> Nothing+ Right HRefl -> SymbolSet <$> extractTerm (HS.singleton $ someTypedSymbol t) f
src/Grisette/Internal/Core/Data/Class/Function.hs view
@@ -21,13 +21,6 @@ -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim--- >>> :set -XDataKinds--- >>> :set -XBinaryLiterals--- >>> :set -XFlexibleContexts--- >>> :set -XFlexibleInstances--- >>> :set -XFunctionalDependencies--- >>> :set -XOverloadedStrings--- >>> :set -XTypeOperators -- | Abstraction for function-like types. class Function f arg ret | f -> arg ret where
src/Grisette/Internal/Core/Data/Class/GenSym.hs view
@@ -140,6 +140,7 @@ ( LinkedRep, SupportedPrim, )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal) import Grisette.Internal.SymPrim.SymBV ( SymIntN, SymWordN,@@ -154,8 +155,6 @@ -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim--- >>> :set -XOverloadedStrings--- >>> :set -XTypeApplications -- | Index type used for 'GenSym'. --@@ -175,7 +174,7 @@ -- | Monad class for fresh symbolic value generation. -- -- The monad should be a reader monad for the 'Identifier' and a state monad for--- the 'FreshIndex'.+-- the t'FreshIndex'. class (Monad m) => MonadFresh m where -- | Get the current index for fresh variable generation. getFreshIndex :: m FreshIndex@@ -389,7 +388,7 @@ localIdentifier f (RWSStrict.RWST m) = RWSStrict.RWST $ \r s -> localIdentifier f (m r s) --- | 'FreshT' specialized with Identity.+-- | t'FreshT' specialized with Identity. type Fresh = FreshT Identity -- | Run the symbolic generation with the given identifier and 0 as the initial@@ -413,7 +412,7 @@ -- This ensures that we can generate those types with complex merging rules. -- -- The uniqueness of symbolic constants is managed with the a monadic context.--- 'Fresh' and 'FreshT' can be useful.+-- 'Fresh' and t'FreshT' can be useful. class (Mergeable a) => GenSym spec a where -- | Generate a symbolic value given some specification. Within a single -- `MonadFresh` context, calls to `fresh` would generate unique symbolic@@ -474,7 +473,7 @@ -- The result will __/not/__ be wrapped in a union-like monad. -- -- The uniqueness of symbolic constants is managed with the a monadic context.--- 'Fresh' and 'FreshT' can be useful.+-- 'Fresh' and t'FreshT' can be useful. class GenSymSimple spec a where -- | Generate a symbolic value given some specification. The uniqueness is ensured. --@@ -1699,6 +1698,10 @@ GENSYM_SIMPLE_SIMPLE(SymFPRoundingMode) GENSYM_UNIT_SIMPLE(SymFPRoundingMode) GENSYM_UNIT_SIMPLE_SIMPLE(SymFPRoundingMode)+GENSYM_SIMPLE(SymAlgReal)+GENSYM_SIMPLE_SIMPLE(SymAlgReal)+GENSYM_UNIT_SIMPLE(SymAlgReal)+GENSYM_UNIT_SIMPLE_SIMPLE(SymAlgReal) GENSYM_BV(SymIntN) GENSYM_SIMPLE_BV(SymIntN)
src/Grisette/Internal/Core/Data/Class/IEEEFP.hs view
@@ -1,7 +1,7 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE UndecidableInstances #-} -- |@@ -25,48 +25,15 @@ fpIsNormal, fpIsSubnormal, fpIsPoint,- SymIEEEFPTraits (..),- IEEEConstants (..),+ IEEEFPConstants (..), IEEEFPRoundingMode (..), IEEEFPOp (..), IEEEFPRoundingOp (..),+ IEEEFPConvertible (..),+ IEEEFPToAlgReal (..), ) where -import Data.SBV (infinity, nan)-import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con))-import Grisette.Internal.SymPrim.FP (FP (FP), FPRoundingMode (RNA, RNE, RTN, RTP, RTZ), ValidFP)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP- ( pevalFPBinaryTerm,- pevalFPFMATerm,- pevalFPRoundingBinaryTerm,- pevalFPRoundingUnaryTerm,- pevalFPTraitTerm,- pevalFPUnaryTerm,- )-import Grisette.Internal.SymPrim.Prim.Internal.Term- ( FPBinaryOp (FPMax, FPMin, FPRem),- FPRoundingBinaryOp (FPAdd, FPDiv, FPMul, FPSub),- FPRoundingUnaryOp (FPRoundToIntegral, FPSqrt),- FPTrait- ( FPIsInfinite,- FPIsNaN,- FPIsNegative,- FPIsNegativeInfinite,- FPIsNegativeZero,- FPIsNormal,- FPIsPoint,- FPIsPositive,- FPIsPositiveInfinite,- FPIsPositiveZero,- FPIsSubnormal,- FPIsZero- ),- FPUnaryOp (FPAbs, FPNeg),- )-import Grisette.Internal.SymPrim.SymBool (SymBool (SymBool))-import Grisette.Internal.SymPrim.SymFP (SymFP (SymFP), SymFPRoundingMode (SymFPRoundingMode))- -- | Check if a floating-point number is not-a-number. fpIsNaN :: (RealFloat a) => a -> Bool fpIsNaN = isNaN@@ -101,7 +68,7 @@ -- | Check if a floating-point number is negative. -- -0, -inf are considered negative. nan, +0, +inf are not negative. fpIsNegative :: (RealFloat a) => a -> Bool-fpIsNegative = isNegativeZero+fpIsNegative x = not (fpIsNaN x) && (x < 0 || isNegativeZero x) {-# INLINE fpIsNegative #-} -- | Check if a floating-point number is infinite.@@ -135,127 +102,8 @@ fpIsPoint x = not (fpIsInfinite x) && not (fpIsNaN x) {-# INLINE fpIsPoint #-} --- | A class for symbolic traits of IEEE floating-point numbers.-class SymIEEEFPTraits a where- -- | Check if a symbolic floating-point number is not-a-number.- symFpIsNaN :: a -> SymBool-- -- | Check if a symbolic floating-point number is positive.- -- +0, +inf are considered positive. nan, -0, -inf are not positive.- symFpIsPositive :: a -> SymBool-- -- | Check if a symbolic floating-point number is negative.- -- -0, -inf are considered negative. nan, +0, +inf are not negative.- symFpIsNegative :: a -> SymBool-- -- | Check if a symbolic floating-point number is positive infinite.- symFpIsPositiveInfinite :: a -> SymBool-- -- | Check if a symbolic floating-point number is negative infinite.- symFpIsNegativeInfinite :: a -> SymBool-- -- | Check if a symbolic floating-point number is infinite.- symFpIsInfinite :: a -> SymBool-- -- | Check if a symbolic floating-point number is positive zero.- symFpIsPositiveZero :: a -> SymBool-- -- | Check if a symbolic floating-point number is negative zero.- symFpIsNegativeZero :: a -> SymBool-- -- | Check if a symbolic floating-point number is zero.- symFpIsZero :: a -> SymBool-- -- | Check if a symbolic floating-point number is normal, i.e., not 0, not- -- inf, not nan, and not denormalized.- symFpIsNormal :: a -> SymBool-- -- | Check if a symbolic floating-point number is subnormal, i.e.,- -- denormalized. 0, inf, or nan are not subnormal.- symFpIsSubnormal :: a -> SymBool-- -- | Check if a symbolic floating-point number is a point, i.e., not inf, not- -- nan.- symFpIsPoint :: a -> SymBool--newtype ConcreteFloat f = ConcreteFloat f--instance (RealFloat f) => SymIEEEFPTraits (ConcreteFloat f) where- symFpIsNaN (ConcreteFloat x) = con $ fpIsNaN x- {-# INLINE symFpIsNaN #-}-- symFpIsPositive (ConcreteFloat x) = con $ fpIsPositive x- {-# INLINE symFpIsPositive #-}-- symFpIsNegative (ConcreteFloat x) = con $ fpIsNegative x- {-# INLINE symFpIsNegative #-}-- symFpIsInfinite (ConcreteFloat x) = con $ fpIsInfinite x- {-# INLINE symFpIsInfinite #-}-- symFpIsPositiveInfinite (ConcreteFloat x) = con $ fpIsPositiveInfinite x- {-# INLINE symFpIsPositiveInfinite #-}-- symFpIsNegativeInfinite (ConcreteFloat x) = con $ fpIsNegativeInfinite x- {-# INLINE symFpIsNegativeInfinite #-}-- symFpIsPositiveZero (ConcreteFloat x) = con $ fpIsPositiveZero x- {-# INLINE symFpIsPositiveZero #-}-- symFpIsNegativeZero (ConcreteFloat x) = con $ fpIsNegativeZero x- {-# INLINE symFpIsNegativeZero #-}-- symFpIsZero (ConcreteFloat x) = con $ fpIsZero x- {-# INLINE symFpIsZero #-}-- symFpIsNormal (ConcreteFloat x) = con $ fpIsNormal x- {-# INLINE symFpIsNormal #-}-- symFpIsSubnormal (ConcreteFloat x) = con $ fpIsSubnormal x- {-# INLINE symFpIsSubnormal #-}-- symFpIsPoint (ConcreteFloat x) = con $ fpIsPoint x- {-# INLINE symFpIsPoint #-}--deriving via (ConcreteFloat Float) instance SymIEEEFPTraits Float--deriving via (ConcreteFloat Double) instance SymIEEEFPTraits Double--deriving via- (ConcreteFloat (FP eb sb))- instance- (ValidFP eb sb) => SymIEEEFPTraits (FP eb sb)--instance (ValidFP eb sb) => SymIEEEFPTraits (SymFP eb sb) where- symFpIsNaN (SymFP x) = SymBool $ pevalFPTraitTerm FPIsNaN x- {-# INLINE symFpIsNaN #-}- symFpIsPositive (SymFP x) = SymBool $ pevalFPTraitTerm FPIsPositive x- {-# INLINE symFpIsPositive #-}- symFpIsNegative (SymFP x) = SymBool $ pevalFPTraitTerm FPIsNegative x- {-# INLINE symFpIsNegative #-}- symFpIsInfinite (SymFP x) = SymBool $ pevalFPTraitTerm FPIsInfinite x- {-# INLINE symFpIsInfinite #-}- symFpIsPositiveInfinite (SymFP x) =- SymBool $ pevalFPTraitTerm FPIsPositiveInfinite x- {-# INLINE symFpIsPositiveInfinite #-}- symFpIsNegativeInfinite (SymFP x) =- SymBool $ pevalFPTraitTerm FPIsNegativeInfinite x- {-# INLINE symFpIsNegativeInfinite #-}- symFpIsPositiveZero (SymFP x) = SymBool $ pevalFPTraitTerm FPIsPositiveZero x- {-# INLINE symFpIsPositiveZero #-}- symFpIsNegativeZero (SymFP x) = SymBool $ pevalFPTraitTerm FPIsNegativeZero x- {-# INLINE symFpIsNegativeZero #-}- symFpIsZero (SymFP x) = SymBool $ pevalFPTraitTerm FPIsZero x- {-# INLINE symFpIsZero #-}- symFpIsNormal (SymFP x) = SymBool $ pevalFPTraitTerm FPIsNormal x- {-# INLINE symFpIsNormal #-}- symFpIsSubnormal (SymFP x) = SymBool $ pevalFPTraitTerm FPIsSubnormal x- {-# INLINE symFpIsSubnormal #-}- symFpIsPoint (SymFP x) = SymBool $ pevalFPTraitTerm FPIsPoint x- {-# INLINE symFpIsPoint #-}- -- | Constants for IEEE floating-point numbers.-class IEEEConstants a where+class IEEEFPConstants a where -- | Positive infinity. fpPositiveInfinite :: a @@ -271,50 +119,53 @@ -- | Positive zero. fpPositiveZero :: a -instance (ValidFP eb sb) => IEEEConstants (FP eb sb) where- fpPositiveInfinite = FP infinity- {-# INLINE fpPositiveInfinite #-}- fpNegativeInfinite = FP $ -infinity- {-# INLINE fpNegativeInfinite #-}- fpNaN = FP nan- {-# INLINE fpNaN #-}- fpNegativeZero = FP $ -0- {-# INLINE fpNegativeZero #-}- fpPositiveZero = FP 0- {-# INLINE fpPositiveZero #-}+ -- | Smallest positive normalized number.+ fpMinNormalized :: a -instance (ValidFP eb sb) => IEEEConstants (SymFP eb sb) where- fpPositiveInfinite = con fpPositiveInfinite- {-# INLINE fpPositiveInfinite #-}- fpNegativeInfinite = con fpNegativeInfinite- {-# INLINE fpNegativeInfinite #-}- fpNaN = con fpNaN- {-# INLINE fpNaN #-}- fpNegativeZero = con fpNegativeZero- {-# INLINE fpNegativeZero #-}- fpPositiveZero = con fpPositiveZero- {-# INLINE fpPositiveZero #-}+ -- | Smallest positive subnormal number.+ fpMinSubnormal :: a + -- | Largest positive normalized number.+ fpMaxNormalized :: a++ -- | Largest positive subnormal number.+ fpMaxSubnormal :: a+ -- | Operations on IEEE floating-point numbers, without rounding mode. class IEEEFPOp a where- symFpAbs :: a -> a- symFpNeg :: a -> a- symFpRem :: a -> a -> a- symFpMin :: a -> a -> a- symFpMax :: a -> a -> a+ -- | IEEE754-2019 abs operation.+ fpAbs :: a -> a -instance (ValidFP eb sb) => IEEEFPOp (SymFP eb sb) where- symFpAbs (SymFP l) = SymFP $ pevalFPUnaryTerm FPAbs l- {-# INLINE symFpAbs #-}- symFpNeg (SymFP l) = SymFP $ pevalFPUnaryTerm FPNeg l- {-# INLINE symFpNeg #-}- symFpRem (SymFP l) (SymFP r) = SymFP $ pevalFPBinaryTerm FPRem l r- {-# INLINE symFpRem #-}- symFpMin (SymFP l) (SymFP r) = SymFP $ pevalFPBinaryTerm FPMin l r- {-# INLINE symFpMin #-}- symFpMax (SymFP l) (SymFP r) = SymFP $ pevalFPBinaryTerm FPMax l r- {-# INLINE symFpMax #-}+ -- | IEEE754-2019 negate operation.+ fpNeg :: a -> a + -- | IEEE754-2019 remainder operation.+ fpRem :: a -> a -> a++ -- | IEEE754-2019 minimum operation.+ --+ -- * The comparison for zeros follows -0 < 0+ -- * Returns NaN if one operand is NaN.+ fpMinimum :: a -> a -> a++ -- | IEEE754-2019 minimumNumber operation.+ --+ -- * The comparison for zeros follows -0 < 0+ -- * Returns the other operand if one operand is NaN.+ fpMinimumNumber :: a -> a -> a++ -- | IEEE754-2019 maximum operation.+ --+ -- * The comparison for zeros follows -0 < 0+ -- * Returns NaN if one operand is NaN.+ fpMaximum :: a -> a -> a++ -- | IEEE754-2019 maximumNumber operation.+ --+ -- * The comparison for zeros follows -0 < 0+ -- * Returns the other operand if one operand is NaN.+ fpMaximumNumber :: a -> a -> a+ -- | Rounding modes for floating-point operations. class IEEEFPRoundingMode mode where -- | Round to nearest, ties to even.@@ -332,59 +183,44 @@ -- | Round towards zero. rtz :: mode -instance IEEEFPRoundingMode FPRoundingMode where- rne = RNE- {-# INLINE rne #-}- rna = RNA- {-# INLINE rna #-}- rtp = RTP- {-# INLINE rtp #-}- rtn = RTN- {-# INLINE rtn #-}- rtz = RTZ- {-# INLINE rtz #-}--instance IEEEFPRoundingMode SymFPRoundingMode where- rne = con RNE- {-# INLINE rne #-}- rna = con RNA- {-# INLINE rna #-}- rtp = con RTP- {-# INLINE rtp #-}- rtn = con RTN- {-# INLINE rtn #-}- rtz = con RTZ- {-# INLINE rtz #-}- -- | Operations on IEEE floating-point numbers, with rounding mode. class (IEEEFPRoundingMode mode) => IEEEFPRoundingOp a mode | a -> mode where- symFpAdd :: mode -> a -> a -> a- symFpSub :: mode -> a -> a -> a- symFpMul :: mode -> a -> a -> a- symFpDiv :: mode -> a -> a -> a- symFpFMA :: mode -> a -> a -> a -> a- symFpSqrt :: mode -> a -> a- symFpRoundToIntegral :: mode -> a -> a+ fpAdd :: mode -> a -> a -> a+ fpSub :: mode -> a -> a -> a+ fpMul :: mode -> a -> a -> a+ fpDiv :: mode -> a -> a -> a+ fpFMA :: mode -> a -> a -> a -> a+ fpSqrt :: mode -> a -> a+ fpRoundToIntegral :: mode -> a -> a -instance (ValidFP eb sb) => IEEEFPRoundingOp (SymFP eb sb) SymFPRoundingMode where- symFpAdd (SymFPRoundingMode mode) (SymFP l) (SymFP r) =- SymFP $ pevalFPRoundingBinaryTerm FPAdd mode l r- {-# INLINE symFpAdd #-}- symFpSub (SymFPRoundingMode mode) (SymFP l) (SymFP r) =- SymFP $ pevalFPRoundingBinaryTerm FPSub mode l r- {-# INLINE symFpSub #-}- symFpMul (SymFPRoundingMode mode) (SymFP l) (SymFP r) =- SymFP $ pevalFPRoundingBinaryTerm FPMul mode l r- {-# INLINE symFpMul #-}- symFpDiv (SymFPRoundingMode mode) (SymFP l) (SymFP r) =- SymFP $ pevalFPRoundingBinaryTerm FPDiv mode l r- {-# INLINE symFpDiv #-}- symFpFMA (SymFPRoundingMode mode) (SymFP l) (SymFP m) (SymFP r) =- SymFP $ pevalFPFMATerm mode l m r- {-# INLINE symFpFMA #-}- symFpSqrt (SymFPRoundingMode mode) (SymFP v) =- SymFP $ pevalFPRoundingUnaryTerm FPSqrt mode v- {-# INLINE symFpSqrt #-}- symFpRoundToIntegral (SymFPRoundingMode mode) (SymFP v) =- SymFP $ pevalFPRoundingUnaryTerm FPRoundToIntegral mode v- {-# INLINE symFpRoundToIntegral #-}+-- | Conversion from and to FPs.+class IEEEFPConvertible a fp mode | fp -> mode where+ fromFPOr ::+ -- | Default value when converting non-representable FPs. For example, when+ -- converting to non-FP types, the NaN and infinities are not representable.+ -- Additionally, when converting to bit-vectors, out-of-bound FPs are not+ -- representable.+ --+ -- Note that out-of-bound means that the /value after conversion/ is out of+ -- bound, not the /value before conversion/, meaning that converting from+ -- 3.5 to 2-bit unsigned bit-vector is out-of-bound when rounding to+ -- positive, but not when rounding to negative.+ a ->+ -- | Rounding mode. Ignored when converting to 'Grisette.AlgReal' because+ -- every representable FP value is converted to an exact 'Grisette.AlgReal'.+ mode ->+ -- | FP value.+ fp ->+ a+ toFP :: mode -> a -> fp++-- | Converting FP to real numbers.+class+ (IEEEFPConvertible a fp mode, IEEEFPRoundingMode mode) =>+ IEEEFPToAlgReal a fp mode+ | fp -> mode+ where+ -- | Similar to 'fromFPOr' for 'Grisette.AlgReal', but dropped the ignored+ -- rounding mode.+ fpToAlgReal :: a -> fp -> a+ fpToAlgReal d = fromFPOr d rna
src/Grisette/Internal/Core/Data/Class/ITEOp.hs view
@@ -18,6 +18,7 @@ ) where +import Control.Monad.Identity (Identity (Identity)) import GHC.TypeNats (KnownNat, type (<=)) import Grisette.Internal.SymPrim.FP (ValidFP) import Grisette.Internal.SymPrim.GeneralFun (type (-->))@@ -25,6 +26,7 @@ ( LinkedRep, SupportedPrim (pevalITETerm), )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal)) import Grisette.Internal.SymPrim.SymBV ( SymIntN (SymIntN), SymWordN (SymWordN),@@ -42,11 +44,6 @@ -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim--- >>> :set -XDataKinds--- >>> :set -XBinaryLiterals--- >>> :set -XFlexibleContexts--- >>> :set -XFlexibleInstances--- >>> :set -XFunctionalDependencies -- | ITE operator for solvable (see "Grisette.Core#g:solvable")s, including -- symbolic boolean, integer, etc.@@ -80,6 +77,7 @@ ITEOP_SIMPLE(SymBool) ITEOP_SIMPLE(SymInteger) ITEOP_SIMPLE(SymFPRoundingMode)+ITEOP_SIMPLE(SymAlgReal) ITEOP_BV(SymIntN) ITEOP_BV(SymWordN) ITEOP_FUN((=->), (=~>), SymTabularFun)@@ -88,4 +86,8 @@ instance (ValidFP eb sb) => ITEOp (SymFP eb sb) where symIte (SymBool c) (SymFP t) (SymFP f) = SymFP $ pevalITETerm c t f+ {-# INLINE symIte #-}++instance (ITEOp v) => ITEOp (Identity v) where+ symIte c (Identity t) (Identity f) = Identity $ symIte c t f {-# INLINE symIte #-}
src/Grisette/Internal/Core/Data/Class/LogicalOp.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | -- Module : Grisette.Internal.Core.Data.Class.LogicalOp -- Copyright : (c) Sirui Lu 2021-2024@@ -11,6 +13,11 @@ ) where +#if !MIN_VERSION_base(4,18,0)+import Control.Applicative (liftA2)+#endif++import Control.Monad.Identity (Identity) import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con)) import Grisette.Internal.SymPrim.Prim.Term ( pevalAndTerm,@@ -24,11 +31,6 @@ -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim--- >>> :set -XDataKinds--- >>> :set -XBinaryLiterals--- >>> :set -XFlexibleContexts--- >>> :set -XFlexibleInstances--- >>> :set -XFunctionalDependencies -- | Symbolic logical operators for symbolic booleans. --@@ -125,3 +127,12 @@ symNot (SymBool v) = SymBool $ pevalNotTerm v (SymBool l) `symXor` (SymBool r) = SymBool $ pevalXorTerm l r (SymBool l) `symImplies` (SymBool r) = SymBool $ pevalImplyTerm l r++instance (LogicalOp a) => LogicalOp (Identity a) where+ true = pure true+ false = pure false+ (.||) = liftA2 (.||)+ (.&&) = liftA2 (.&&)+ symNot = fmap symNot+ symXor = liftA2 symXor+ symImplies = liftA2 symImplies
src/Grisette/Internal/Core/Data/Class/Mergeable.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingVia #-}@@ -52,6 +53,7 @@ buildStrategyList, resolveStrategy, resolveStrategy',+ resolveMergeable1, ) where @@ -124,16 +126,17 @@ ( AssertionError, VerificationConditions, )-import Grisette.Internal.Core.Data.Class.BitCast (BitCast (bitCast))+import Grisette.Internal.Core.Data.Class.BitCast (bitCastOrCanonical) import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp (symIte))+import Grisette.Internal.SymPrim.AlgReal (AlgReal, AlgRealPoly, RealPoint) import Grisette.Internal.SymPrim.BV- ( BitwidthMismatch,- IntN,+ ( IntN, WordN, ) import Grisette.Internal.SymPrim.FP ( FP, FPRoundingMode,+ NotRepresentableFPError, ValidFP, withValidFPProofs, )@@ -142,6 +145,7 @@ ( LinkedRep, SupportedPrim, )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal) import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN) import Grisette.Internal.SymPrim.SymBool (SymBool) import Grisette.Internal.SymPrim.SymFP (SymFP, SymFPRoundingMode)@@ -285,6 +289,15 @@ rootStrategy1 = liftRootStrategy rootStrategy {-# INLINE rootStrategy1 #-} +-- | Workaround as GHC prior to 9.6 doesn't support quantified constraints+-- reliably.+--+-- Similar to https://github.com/haskell/core-libraries-committee/issues/10,+-- which is only available with 9.6 or higher.+resolveMergeable1 ::+ forall f a r. (Mergeable1 f, Mergeable a) => ((Mergeable (f a)) => r) -> r+resolveMergeable1 v = v+ -- | Lifting of the 'Mergeable' class to binary type constructors. class (forall a. (Mergeable a) => Mergeable1 (u a)) =>@@ -572,6 +585,7 @@ CONCRETE_ORD_MERGEABLE(Word64) CONCRETE_ORD_MERGEABLE(Float) CONCRETE_ORD_MERGEABLE(Double)+CONCRETE_ORD_MERGEABLE(Rational) CONCRETE_ORD_MERGEABLE(B.ByteString) CONCRETE_ORD_MERGEABLE(T.Text) CONCRETE_ORD_MERGEABLE(FPRoundingMode)@@ -587,7 +601,7 @@ let sub = SimpleStrategy $ \_ t _ -> t in withValidFPProofs @eb @sb $ SortedStrategy- (\fp -> (bitCast fp :: WordN (eb + sb)))+ (\fp -> (bitCastOrCanonical fp :: WordN (eb + sb))) $ const sub #define MERGEABLE_SIMPLE(symtype) \@@ -607,6 +621,7 @@ MERGEABLE_SIMPLE(SymBool) MERGEABLE_SIMPLE(SymInteger) MERGEABLE_SIMPLE(SymFPRoundingMode)+MERGEABLE_SIMPLE(SymAlgReal) MERGEABLE_BV(SymIntN) MERGEABLE_BV(SymWordN) MERGEABLE_FUN((=->), (=~>))@@ -635,71 +650,6 @@ _ -> NoStrategy {-# INLINE liftRootStrategy2 #-} --- Instances-deriveBuiltins- (ViaDefault ''Mergeable)- [''Mergeable]- [ ''Maybe,- ''Either,- ''(),- -- The following three are implemented by hand because they need to be- -- consistent with Mergeable2 instances.- -- ''(,),- -- ''(,,),- -- ''(,,,),- ''(,,,,),- ''(,,,,,),- ''(,,,,,,),- ''(,,,,,,,),- ''(,,,,,,,,),- ''(,,,,,,,,,),- ''(,,,,,,,,,,),- ''(,,,,,,,,,,,),- ''(,,,,,,,,,,,,),- ''(,,,,,,,,,,,,,),- ''(,,,,,,,,,,,,,,),- ''AssertionError,- ''VerificationConditions,- ''BitwidthMismatch,- ''Identity,- ''Monoid.Dual,- ''Monoid.Sum,- ''Monoid.Product,- ''Monoid.First,- ''Monoid.Last,- ''Down- ]--deriveBuiltins- (ViaDefault1 ''Mergeable1)- [''Mergeable, ''Mergeable1]- [ ''Maybe,- ''Either,- -- The following three are implemented by hand because they need to be- -- consistent with Mergeable2 instances.- -- ''(,),- -- ''(,,),- -- ''(,,,),- ''(,,,,),- ''(,,,,,),- ''(,,,,,,),- ''(,,,,,,,),- ''(,,,,,,,,),- ''(,,,,,,,,,),- ''(,,,,,,,,,,),- ''(,,,,,,,,,,,),- ''(,,,,,,,,,,,,),- ''(,,,,,,,,,,,,,),- ''(,,,,,,,,,,,,,,),- ''Identity,- ''Monoid.Dual,- ''Monoid.Sum,- ''Monoid.Product,- ''Monoid.First,- ''Monoid.Last,- ''Down- ]- -- List -- | Helper type for building efficient merge strategy for list-like containers.@@ -780,6 +730,137 @@ else NoStrategy {-# INLINE liftRootStrategy #-} +-- (,)+instance (Mergeable a, Mergeable b) => Mergeable (a, b) where+ rootStrategy = rootStrategy1+ {-# INLINE rootStrategy #-}++instance (Mergeable a) => Mergeable1 ((,) a) where+ liftRootStrategy = liftRootStrategy2 rootStrategy+ {-# INLINE liftRootStrategy #-}++instance Mergeable2 (,) where+ liftRootStrategy2 = product2Strategy (,) id+ {-# INLINE liftRootStrategy2 #-}++-- (,,)+instance (Mergeable a, Mergeable b, Mergeable c) => Mergeable ((,,) a b c) where+ rootStrategy = rootStrategy1+ {-# INLINE rootStrategy #-}++instance (Mergeable a, Mergeable b) => Mergeable1 ((,,) a b) where+ liftRootStrategy = liftRootStrategy2 rootStrategy+ {-# INLINE liftRootStrategy #-}++instance (Mergeable a) => Mergeable2 ((,,) a) where+ liftRootStrategy2 = liftRootStrategy3 rootStrategy+ {-# INLINE liftRootStrategy2 #-}++instance Mergeable3 (,,) where+ liftRootStrategy3 m1 m2 m3 =+ product2Strategy+ (\a (b, c) -> (a, b, c))+ (\(a, b, c) -> (a, (b, c)))+ m1+ (liftRootStrategy2 m2 m3)+ {-# INLINE liftRootStrategy3 #-}++-- (,,,)+instance+ (Mergeable a, Mergeable b, Mergeable c, Mergeable d) =>+ Mergeable ((,,,) a b c d)+ where+ rootStrategy = rootStrategy1+ {-# INLINE rootStrategy #-}++instance+ (Mergeable a, Mergeable b, Mergeable c) =>+ Mergeable1 ((,,,) a b c)+ where+ liftRootStrategy = liftRootStrategy2 rootStrategy+ {-# INLINE liftRootStrategy #-}++instance (Mergeable a, Mergeable b) => Mergeable2 ((,,,) a b) where+ liftRootStrategy2 = liftRootStrategy3 rootStrategy+ {-# INLINE liftRootStrategy2 #-}++instance (Mergeable a) => Mergeable3 ((,,,) a) where+ liftRootStrategy3 m1 m2 m3 =+ product2Strategy+ (\(a, b) (c, d) -> (a, b, c, d))+ (\(a, b, c, d) -> ((a, b), (c, d)))+ (liftRootStrategy m1)+ (liftRootStrategy2 m2 m3)+ {-# INLINE liftRootStrategy3 #-}++-- Instances+deriveBuiltins+ (ViaDefault ''Mergeable)+ [''Mergeable]+ [ ''Maybe,+ ''Either,+ ''AlgRealPoly,+ ''RealPoint,+ ''AlgReal,+ ''(),+ -- The following three are implemented by hand because they need to be+ -- consistent with Mergeable2 instances.+ -- ''(,),+ -- ''(,,),+ -- ''(,,,),+ ''(,,,,),+ ''(,,,,,),+ ''(,,,,,,),+ ''(,,,,,,,),+ ''(,,,,,,,,),+ ''(,,,,,,,,,),+ ''(,,,,,,,,,,),+ ''(,,,,,,,,,,,),+ ''(,,,,,,,,,,,,),+ ''(,,,,,,,,,,,,,),+ ''(,,,,,,,,,,,,,,),+ ''AssertionError,+ ''VerificationConditions,+ ''NotRepresentableFPError,+ ''Identity,+ ''Monoid.Dual,+ ''Monoid.Sum,+ ''Monoid.Product,+ ''Monoid.First,+ ''Monoid.Last,+ ''Down+ ]++deriveBuiltins+ (ViaDefault1 ''Mergeable1)+ [''Mergeable, ''Mergeable1]+ [ ''Maybe,+ ''Either,+ -- The following three are implemented by hand because they need to be+ -- consistent with Mergeable2 instances.+ -- ''(,),+ -- ''(,,),+ -- ''(,,,),+ ''(,,,,),+ ''(,,,,,),+ ''(,,,,,,),+ ''(,,,,,,,),+ ''(,,,,,,,,),+ ''(,,,,,,,,,),+ ''(,,,,,,,,,,),+ ''(,,,,,,,,,,,),+ ''(,,,,,,,,,,,,),+ ''(,,,,,,,,,,,,,),+ ''(,,,,,,,,,,,,,,),+ ''Identity,+ ''Monoid.Dual,+ ''Monoid.Sum,+ ''Monoid.Product,+ ''Monoid.First,+ ''Monoid.Last,+ ''Down+ ]+ -- MaybeT instance (Mergeable1 m, Mergeable a) => Mergeable (MaybeT m a) where rootStrategy = rootStrategy1@@ -1098,66 +1179,3 @@ True -> wrapStrategy m2 Right (\case (Right v) -> v; _ -> undefined) ) {-# INLINE liftRootStrategy2 #-}---- (,)-instance (Mergeable a, Mergeable b) => Mergeable (a, b) where- rootStrategy = rootStrategy1- {-# INLINE rootStrategy #-}--instance (Mergeable a) => Mergeable1 ((,) a) where- liftRootStrategy = liftRootStrategy2 rootStrategy- {-# INLINE liftRootStrategy #-}--instance Mergeable2 (,) where- liftRootStrategy2 = product2Strategy (,) id- {-# INLINE liftRootStrategy2 #-}---- (,,)-instance (Mergeable a, Mergeable b, Mergeable c) => Mergeable ((,,) a b c) where- rootStrategy = rootStrategy1- {-# INLINE rootStrategy #-}--instance (Mergeable a, Mergeable b) => Mergeable1 ((,,) a b) where- liftRootStrategy = liftRootStrategy2 rootStrategy- {-# INLINE liftRootStrategy #-}--instance (Mergeable a) => Mergeable2 ((,,) a) where- liftRootStrategy2 = liftRootStrategy3 rootStrategy- {-# INLINE liftRootStrategy2 #-}--instance Mergeable3 (,,) where- liftRootStrategy3 m1 m2 m3 =- product2Strategy- (\a (b, c) -> (a, b, c))- (\(a, b, c) -> (a, (b, c)))- m1- (liftRootStrategy2 m2 m3)- {-# INLINE liftRootStrategy3 #-}---- (,,,)-instance- (Mergeable a, Mergeable b, Mergeable c, Mergeable d) =>- Mergeable ((,,,) a b c d)- where- rootStrategy = rootStrategy1- {-# INLINE rootStrategy #-}--instance- (Mergeable a, Mergeable b, Mergeable c) =>- Mergeable1 ((,,,) a b c)- where- liftRootStrategy = liftRootStrategy2 rootStrategy- {-# INLINE liftRootStrategy #-}--instance (Mergeable a, Mergeable b) => Mergeable2 ((,,,) a b) where- liftRootStrategy2 = liftRootStrategy3 rootStrategy- {-# INLINE liftRootStrategy2 #-}--instance (Mergeable a) => Mergeable3 ((,,,) a) where- liftRootStrategy3 m1 m2 m3 =- product2Strategy- (\(a, b) (c, d) -> (a, b, c, d))- (\(a, b, c, d) -> ((a, b), (c, d)))- (liftRootStrategy m1)- (liftRootStrategy2 m2 m3)- {-# INLINE liftRootStrategy3 #-}
src/Grisette/Internal/Core/Data/Class/ModelOps.hs view
@@ -31,22 +31,22 @@ -- -- Note that symbolic constants with different types are considered different. ----- >>> let aBool = "a" :: TypedSymbol Bool--- >>> let bBool = "b" :: TypedSymbol Bool--- >>> let cBool = "c" :: TypedSymbol Bool--- >>> let aInteger = "a" :: TypedSymbol Integer--- >>> emptySet :: SymbolSet+-- >>> let aBool = "a" :: TypedAnySymbol Bool+-- >>> let bBool = "b" :: TypedAnySymbol Bool+-- >>> let cBool = "c" :: TypedAnySymbol Bool+-- >>> let aInteger = "a" :: TypedAnySymbol Integer+-- >>> emptySet :: AnySymbolSet -- SymbolSet {}--- >>> containsSymbol aBool (buildSymbolSet aBool :: SymbolSet)+-- >>> containsSymbol aBool (buildSymbolSet aBool :: AnySymbolSet) -- True--- >>> containsSymbol bBool (buildSymbolSet aBool :: SymbolSet)+-- >>> containsSymbol bBool (buildSymbolSet aBool :: AnySymbolSet) -- False--- >>> insertSymbol aBool (buildSymbolSet aBool :: SymbolSet)+-- >>> insertSymbol aBool (buildSymbolSet aBool :: AnySymbolSet) -- SymbolSet {a :: Bool}--- >>> insertSymbol aInteger (buildSymbolSet aBool :: SymbolSet)+-- >>> insertSymbol aInteger (buildSymbolSet aBool :: AnySymbolSet) -- SymbolSet {a :: Bool, a :: Integer}--- >>> let abSet = buildSymbolSet (aBool, bBool) :: SymbolSet--- >>> let acSet = buildSymbolSet (aBool, cBool) :: SymbolSet+-- >>> let abSet = buildSymbolSet (aBool, bBool) :: AnySymbolSet+-- >>> let acSet = buildSymbolSet (aBool, cBool) :: AnySymbolSet -- >>> intersectionSet abSet acSet -- SymbolSet {a :: Bool} -- >>> unionSet abSet acSet@@ -82,7 +82,7 @@ -- | A type class for building a symbolic constant set manually from a symbolic -- constant set representation ----- >>> buildSymbolSet ("a" :: TypedSymbol Bool, "b" :: TypedSymbol Bool) :: SymbolSet+-- >>> buildSymbolSet ("a" :: TypedAnySymbol Bool, "b" :: TypedAnySymbol Bool) :: AnySymbolSet -- SymbolSet {a :: Bool, b :: Bool} class (SymbolSetOps symbolSet typedSymbol) =>@@ -95,10 +95,10 @@ -- -- Note that symbolic constants with different types are considered different. ----- >>> let aBool = "a" :: TypedSymbol Bool--- >>> let bBool = "b" :: TypedSymbol Bool--- >>> let cBool = "c" :: TypedSymbol Bool--- >>> let aInteger = "a" :: TypedSymbol Integer+-- >>> let aBool = "a" :: TypedAnySymbol Bool+-- >>> let bBool = "b" :: TypedAnySymbol Bool+-- >>> let cBool = "c" :: TypedAnySymbol Bool+-- >>> let aInteger = "a" :: TypedAnySymbol Integer -- >>> emptyModel :: Model -- Model {} -- >>> valueOf aBool (buildModel (aBool ::= True) :: Model)@@ -108,7 +108,7 @@ -- >>> insertValue bBool False (buildModel (aBool ::= True) :: Model) -- Model {a -> True :: Bool, b -> False :: Bool} -- >>> let abModel = buildModel (aBool ::= True, bBool ::= False) :: Model--- >>> let acSet = buildSymbolSet (aBool, cBool) :: SymbolSet+-- >>> let acSet = buildSymbolSet (aBool, cBool) :: AnySymbolSet -- >>> exceptFor acSet abModel -- Model {b -> False :: Bool} -- >>> restrictTo acSet abModel@@ -163,8 +163,8 @@ class ModelRep rep model | rep -> model where -- | Build a model --- -- >>> let aBool = "a" :: TypedSymbol Bool- -- >>> let bBool = "b" :: TypedSymbol Bool+ -- >>> let aBool = "a" :: TypedAnySymbol Bool+ -- >>> let bBool = "b" :: TypedAnySymbol Bool -- >>> buildModel (aBool ::= True, bBool ::= False) :: Model -- Model {a -> True :: Bool, b -> False :: Bool} buildModel :: rep -> model
src/Grisette/Internal/Core/Data/Class/PPrint.hs view
@@ -126,13 +126,24 @@ ( AssertionError, VerificationConditions, )+import Grisette.Internal.Core.Data.Symbol (Identifier, Symbol)+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)+import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, NotRepresentableFPError, ValidFP)+import Grisette.Internal.SymPrim.Prim.Internal.Term ()+import Grisette.Internal.SymPrim.Prim.Model+ ( Model (Model),+ SymbolSet (SymbolSet),+ )+import Grisette.Internal.SymPrim.Prim.ModelValue (ModelValue) import Grisette.Internal.SymPrim.Prim.Term ( LinkedRep,+ SomeTypedSymbol (SomeTypedSymbol), SupportedPrim,+ TypedSymbol (unTypedSymbol), prettyPrintTerm, )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal)) import Grisette.Internal.SymPrim.SymBV ( SymIntN (SymIntN), SymWordN (SymWordN),@@ -174,14 +185,18 @@ {-# MINIMAL pformat | pformatPrec #-} -prettyPrintList :: [Doc ann] -> Doc ann-prettyPrintList l- | null l = "[]"- | length l == 1 = align $ group $ vcat ["[" <> flatAlt " " "" <> head l, "]"]+pformatListLike :: Doc ann -> Doc ann -> [Doc ann] -> Doc ann+pformatListLike ldelim rdelim l+ | null l = ldelim <> rdelim+ | length l == 1 =+ align $ group $ vcat [ldelim <> flatAlt " " "" <> head l, rdelim] | otherwise =- groupedEnclose "[" "]" . align . vcat $+ groupedEnclose ldelim rdelim . align . vcat $ ((\v -> v <> flatAlt "," ", ") <$> init l) ++ [last l] +prettyPrintList :: [Doc ann] -> Doc ann+prettyPrintList = pformatListLike "[" "]"+ prettyPrintTuple :: [Doc ann] -> Doc ann prettyPrintTuple l | length l >= 2 =@@ -198,7 +213,7 @@ -- | Convenience function to layout and render a 'Doc' to 'T.Text'. ----- You can control the layout with 'LayoutOptions'.+-- You can control the layout with t'LayoutOptions'. docToTextWith :: LayoutOptions -> Doc ann -> T.Text docToTextWith options = renderStrict . layoutPretty options @@ -218,7 +233,7 @@ -- | Convenience function to format a value to 'T.Text'. ----- You can control the layout with 'LayoutOptions'.+-- You can control the layout with t'LayoutOptions'. pformatTextWith :: (PPrint a) => LayoutOptions -> a -> T.Text pformatTextWith options = docToTextWith options . pformat @@ -275,8 +290,8 @@ -- | Lift two pretty-printers to a binary type constructor. liftPFormatPrec2 :: (Int -> a -> Doc ann) ->- (Int -> b -> Doc ann) -> ([a] -> Doc ann) ->+ (Int -> b -> Doc ann) -> ([b] -> Doc ann) -> Int -> f a b ->@@ -285,8 +300,8 @@ -- | Lift two pretty-printers to list of values with binary type constructors. liftPFormatList2 :: (Int -> a -> Doc ann) ->- (Int -> b -> Doc ann) -> ([a] -> Doc ann) ->+ (Int -> b -> Doc ann) -> ([b] -> Doc ann) -> [f a b] -> Doc ann@@ -296,13 +311,13 @@ -- | Lift the standard pretty-printer ('pformatPrec', 'pformatList') to binary -- type constructors. pformatPrec2 :: (PPrint2 f, PPrint a, PPrint b) => Int -> f a b -> Doc ann-pformatPrec2 = liftPFormatPrec2 pformatPrec pformatPrec pformatList pformatList+pformatPrec2 = liftPFormatPrec2 pformatPrec pformatList pformatPrec pformatList {-# INLINE pformatPrec2 #-} -- | Lift the standard pretty-printer ('pformatPrec', 'pformatList') to list of -- values with binary type constructors. pformatList2 :: (PPrint2 f, PPrint a, PPrint b) => [f a b] -> Doc ann-pformatList2 = liftPFormatList2 pformatPrec pformatPrec pformatList pformatList+pformatList2 = liftPFormatList2 pformatPrec pformatList pformatPrec pformatList {-# INLINE pformatList2 #-} -- | The arguments to the generic 'PPrint' class.@@ -546,6 +561,7 @@ FORMAT_SIMPLE(Monoid.All) FORMAT_SIMPLE(Monoid.Any) FORMAT_SIMPLE(Ordering)+FORMAT_SIMPLE(AlgReal) #endif instance PPrint B.ByteString where@@ -581,6 +597,7 @@ FORMAT_SYM_SIMPLE(SymBool) FORMAT_SYM_SIMPLE(SymInteger) FORMAT_SYM_SIMPLE(SymFPRoundingMode)+FORMAT_SYM_SIMPLE(SymAlgReal) FORMAT_SYM_BV(SymIntN) FORMAT_SYM_BV(SymWordN) FORMAT_SYM_FUN(=~>, SymTabularFun)@@ -613,6 +630,7 @@ ''(,,,,,,,,,,,,,,), ''AssertionError, ''VerificationConditions,+ ''NotRepresentableFPError, ''Monoid.Dual, ''Monoid.Sum, ''Monoid.Product,@@ -653,8 +671,7 @@ pformatPrec = pformatPrec1 instance PPrint1 Identity where- liftPFormatPrec f _ n (Identity a) =- pformatWithConstructor n "Identity" [f 11 a]+ liftPFormatPrec f _ n (Identity a) = f n a -- MaybeT instance@@ -706,8 +723,8 @@ n "WriterT" [ liftPFormatPrec- (liftPFormatPrec2 f pformatPrec l pformatList)- (liftPFormatList2 f pformatPrec l pformatList)+ (liftPFormatPrec2 f l pformatPrec pformatList)+ (liftPFormatList2 f l pformatPrec pformatList) 11 a ]@@ -727,8 +744,8 @@ n "WriterT" [ liftPFormatPrec- (liftPFormatPrec2 f pformatPrec l pformatList)- (liftPFormatList2 f pformatPrec l pformatList)+ (liftPFormatPrec2 f l pformatPrec pformatList)+ (liftPFormatList2 f l pformatPrec pformatList) 11 a ]@@ -834,25 +851,74 @@ instance PPrint2 Either where liftPFormatPrec2 fe _ _ _ n (Left e) = pformatWithConstructor n "Left" [fe 11 e]- liftPFormatPrec2 _ fa _ _ n (Right a) =+ liftPFormatPrec2 _ _ fa _ n (Right a) = pformatWithConstructor n "Right" [fa 11 a] instance PPrint2 (,) where- liftPFormatPrec2 fa fb _ _ _ (a, b) =+ liftPFormatPrec2 fa _ fb _ _ (a, b) = prettyPrintTuple [fa 0 a, fb 0 b] instance (PPrint a) => PPrint2 ((,,) a) where- liftPFormatPrec2 fb fc _ _ _ (a, b, c) =+ liftPFormatPrec2 fb _ fc _ _ (a, b, c) = prettyPrintTuple [pformat a, fb 0 b, fc 0 c] instance (PPrint a, PPrint b) => PPrint2 ((,,,) a b) where- liftPFormatPrec2 fc fd _ _ _ (a, b, c, d) =+ liftPFormatPrec2 fc _ fd _ _ (a, b, c, d) = prettyPrintTuple [pformat a, pformat b, fc 0 c, fd 0 d] instance (PPrint a) => PPrint (HS.HashSet a) where- pformatPrec n s =- pformatWithConstructor n "fromList" [pformatPrec 11 $ HS.toList s]+ pformatPrec = pformatPrec1 +instance PPrint1 HS.HashSet where+ liftPFormatPrec p l n s =+ pformatWithConstructor n "HashSet" [liftPFormatPrec p l 11 $ HS.toList s]+ instance (PPrint k, PPrint v) => PPrint (HM.HashMap k v) where- pformatPrec n s =- pformatWithConstructor n "fromList" [pformatPrec 11 $ HM.toList s]+ pformatPrec = pformatPrec1++instance (PPrint k) => PPrint1 (HM.HashMap k) where+ liftPFormatPrec = liftPFormatPrec2 pformatPrec pformatList++instance PPrint2 HM.HashMap where+ liftPFormatPrec2 pk lk pv lv n s =+ pformatWithConstructor+ n+ "HashMap"+ [ liftPFormatPrec+ (liftPFormatPrec2 pk lk pv lv)+ (liftPFormatList2 pk lk pv lv)+ 11+ $ HM.toList s+ ]++instance PPrint Identifier where+ pformat = viaShow++instance PPrint Symbol where+ pformat = viaShow++instance PPrint (TypedSymbol knd t) where+ pformat = viaShow++instance PPrint (SomeTypedSymbol knd) where+ pformat = viaShow++instance PPrint ModelValue where+ pformat = viaShow++instance PPrint Model where+ pformatPrec n (Model m) =+ pformatWithConstructor n "Model" [bodyFormatted]+ where+ pformatSymbolWithoutType :: SomeTypedSymbol knd -> Doc ann+ pformatSymbolWithoutType (SomeTypedSymbol _ s) = pformat $ unTypedSymbol s+ pformatPair :: (SomeTypedSymbol knd, ModelValue) -> Doc ann+ pformatPair (s, v) = pformatSymbolWithoutType s <> " -> " <> pformat v+ bodyFormatted = pformatListLike "{" "}" $ pformatPair <$> HM.toList m++instance PPrint (SymbolSet knd) where+ pformatPrec n (SymbolSet s) =+ pformatWithConstructor+ n+ "SymbolSet"+ [pformatListLike "{" "}" $ pformat <$> HS.toList s]
+ src/Grisette/Internal/Core/Data/Class/SafeBitCast.hs view
@@ -0,0 +1,141 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Internal.Core.Data.Class.SafeBitCast+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.Core.Data.Class.SafeBitCast+ ( SafeBitCast (..),+ )+where++import Control.Monad.Error.Class (MonadError (throwError))+import Data.Int (Int16, Int32, Int64)+import Data.SBV (Word32)+import Data.Word (Word16, Word64)+import GHC.TypeLits (KnownNat, type (+), type (<=))+import Grisette.Internal.Core.Control.Monad.Class.Union (MonadUnion)+import Grisette.Internal.Core.Data.Class.BitCast+ ( BitCast (bitCast),+ BitCastOr,+ bitCastOrCanonical,+ )+import Grisette.Internal.Core.Data.Class.IEEEFP (fpIsNaN)+import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)+import Grisette.Internal.Core.Data.Class.SimpleMergeable (mrgIf)+import Grisette.Internal.Core.Data.Class.SymIEEEFP+ ( SymIEEEFPTraits (symFpIsNaN),+ )+import Grisette.Internal.Core.Data.Class.TryMerge (TryMerge, tryMerge)+import Grisette.Internal.SymPrim.BV (IntN, WordN, WordN16, WordN32, WordN64)+import Grisette.Internal.SymPrim.FP+ ( FP,+ FP16,+ FP32,+ FP64,+ NotRepresentableFPError (NaNError),+ ValidFP,+ )+import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)+import Grisette.Internal.SymPrim.SymFP (SymFP)++-- | Bitcasting a value. If the value cannot be precisely bitcast, throw an+-- error.+class+ (MonadError e m, TryMerge m, Mergeable b, BitCastOr a b) =>+ SafeBitCast e a b m+ where+ safeBitCast :: a -> m b++instance+ ( ValidFP eb sb,+ r ~ (eb + sb),+ KnownNat r,+ 1 <= r,+ TryMerge m,+ MonadError NotRepresentableFPError m+ ) =>+ SafeBitCast NotRepresentableFPError (FP eb sb) (WordN r) m+ where+ safeBitCast a+ | fpIsNaN a = tryMerge $ throwError NaNError+ | otherwise = tryMerge $ return $ bitCastOrCanonical a++instance+ ( ValidFP eb sb,+ r ~ (eb + sb),+ KnownNat r,+ 1 <= r,+ TryMerge m,+ MonadError NotRepresentableFPError m+ ) =>+ SafeBitCast NotRepresentableFPError (FP eb sb) (IntN r) m+ where+ safeBitCast a+ | fpIsNaN a = tryMerge $ throwError NaNError+ | otherwise = tryMerge $ return $ bitCastOrCanonical a++#define SAFE_BIT_CAST_VIA_INTERMEDIATE(from, to, intermediate) \+instance \+ (MonadError NotRepresentableFPError m, TryMerge m) => \+ SafeBitCast NotRepresentableFPError from to m \+ where \+ safeBitCast a = do \+ r :: intermediate <- safeBitCast a; \+ tryMerge $ return $ bitCast r++#if 1+SAFE_BIT_CAST_VIA_INTERMEDIATE(FP64, Word64, WordN64)+SAFE_BIT_CAST_VIA_INTERMEDIATE(FP64, Int64, WordN64)+SAFE_BIT_CAST_VIA_INTERMEDIATE(FP64, Double, WordN64)+SAFE_BIT_CAST_VIA_INTERMEDIATE(FP32, Word32, WordN32)+SAFE_BIT_CAST_VIA_INTERMEDIATE(FP32, Int32, WordN32)+SAFE_BIT_CAST_VIA_INTERMEDIATE(FP32, Float, WordN32)+SAFE_BIT_CAST_VIA_INTERMEDIATE(FP16, Word16, WordN16)+SAFE_BIT_CAST_VIA_INTERMEDIATE(FP16, Int16, WordN16)+#endif++instance+ ( ValidFP eb sb,+ r ~ (eb + sb),+ KnownNat r,+ 1 <= r,+ MonadUnion m,+ MonadError NotRepresentableFPError m+ ) =>+ SafeBitCast NotRepresentableFPError (SymFP eb sb) (SymWordN r) m+ where+ safeBitCast a =+ mrgIf+ (symFpIsNaN a)+ (throwError NaNError)+ (return $ bitCastOrCanonical a)++instance+ ( ValidFP eb sb,+ r ~ (eb + sb),+ KnownNat r,+ 1 <= r,+ MonadUnion m,+ MonadError NotRepresentableFPError m+ ) =>+ SafeBitCast NotRepresentableFPError (SymFP eb sb) (SymIntN r) m+ where+ safeBitCast a =+ mrgIf+ (symFpIsNaN a)+ (throwError NaNError)+ (return $ bitCastOrCanonical a)
+ src/Grisette/Internal/Core/Data/Class/SafeDiv.hs view
@@ -0,0 +1,475 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DerivingVia #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Internal.Core.Data.Class.SafeDiv+-- Copyright : (c) Sirui Lu 2021-2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.Core.Data.Class.SafeDiv+ ( ArithException (..),+ SafeDiv (..),+ DivOr (..),+ divOrZero,+ modOrDividend,+ quotOrZero,+ remOrDividend,+ divModOrZeroDividend,+ quotRemOrZeroDividend,+ )+where++import Control.Exception (ArithException (DivideByZero, Overflow, Underflow))+import Control.Monad.Except (MonadError (throwError))+import Data.Int (Int16, Int32, Int64, Int8)+import Data.Word (Word16, Word32, Word64, Word8)+import GHC.TypeNats (KnownNat, type (<=))+import Grisette.Internal.Core.Control.Monad.Class.Union (MonadUnion)+import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp (symIte))+import Grisette.Internal.Core.Data.Class.LogicalOp (LogicalOp ((.&&)))+import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)+import Grisette.Internal.Core.Data.Class.SimpleMergeable+ ( mrgIf,+ )+import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con))+import Grisette.Internal.Core.Data.Class.SymEq (SymEq ((.==)))+import Grisette.Internal.Core.Data.Class.TryMerge+ ( TryMerge,+ mrgSingle,+ tryMerge,+ )+import Grisette.Internal.SymPrim.BV+ ( IntN,+ WordN,+ )+import Grisette.Internal.SymPrim.Prim.Term+ ( PEvalDivModIntegralTerm+ ( pevalDivIntegralTerm,+ pevalModIntegralTerm,+ pevalQuotIntegralTerm,+ pevalRemIntegralTerm+ ),+ )+import Grisette.Internal.SymPrim.SymBV+ ( SymIntN (SymIntN),+ SymWordN (SymWordN),+ )+import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger))+import Grisette.Lib.Data.Functor (mrgFmap)++-- $setup+-- >>> import Grisette.Core+-- >>> import Grisette.SymPrim+-- >>> import Control.Monad.Except+-- >>> import Control.Exception++-- | Safe division handling with default values returned on exception.+class DivOr a where+ -- | Safe 'div' with default value returned on exception.+ --+ -- >>> divOr "d" "a" "b" :: SymInteger+ -- (ite (= b 0) d (div a b))+ divOr :: a -> a -> a -> a++ -- | Safe 'mod' with default value returned on exception.+ --+ -- >>> modOr "d" "a" "b" :: SymInteger+ -- (ite (= b 0) d (mod a b))+ modOr :: a -> a -> a -> a++ -- | Safe 'divMod' with default value returned on exception.+ --+ -- >>> divModOr ("d", "m") "a" "b" :: (SymInteger, SymInteger)+ -- ((ite (= b 0) d (div a b)),(ite (= b 0) m (mod a b)))+ divModOr :: (a, a) -> a -> a -> (a, a)++ -- | Safe 'quot' with default value returned on exception.+ quotOr :: a -> a -> a -> a++ -- | Safe 'rem' with default value returned on exception.+ remOr :: a -> a -> a -> a++ -- | Safe 'quotRem' with default value returned on exception.+ quotRemOr :: (a, a) -> a -> a -> (a, a)++-- | Safe 'div' with 0 returned on exception.+divOrZero :: (DivOr a, Num a) => a -> a -> a+divOrZero l = divOr (l - l) l+{-# INLINE divOrZero #-}++-- | Safe 'mod' with dividend returned on exception.+modOrDividend :: (DivOr a, Num a) => a -> a -> a+modOrDividend l = modOr l l+{-# INLINE modOrDividend #-}++-- | Safe 'quot' with 0 returned on exception.+quotOrZero :: (DivOr a, Num a) => a -> a -> a+quotOrZero l = quotOr (l - l) l+{-# INLINE quotOrZero #-}++-- | Safe 'rem' with dividend returned on exception.+remOrDividend :: (DivOr a, Num a) => a -> a -> a+remOrDividend l = remOr l l+{-# INLINE remOrDividend #-}++-- | Safe 'divMod' with 0 returned on exception.+divModOrZeroDividend :: (DivOr a, Num a) => a -> a -> (a, a)+divModOrZeroDividend l = divModOr (l - l, l) l+{-# INLINE divModOrZeroDividend #-}++-- | Safe 'quotRem' with 0 returned on exception.+quotRemOrZeroDividend :: (DivOr a, Num a) => a -> a -> (a, a)+quotRemOrZeroDividend l = quotRemOr (l - l, l) l+{-# INLINE quotRemOrZeroDividend #-}++-- | 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 (MonadError e m, TryMerge m, Mergeable a, DivOr a) => SafeDiv e a m where+ -- | Safe 'div' with monadic error handling in multi-path execution.+ --+ -- >>> safeDiv "a" "b" :: ExceptT ArithException Union SymInteger+ -- ExceptT {If (= b 0) (Left divide by zero) (Right (div a b))}+ safeDiv :: a -> a -> m a+ safeDiv l r = mrgFmap fst $ safeDivMod l r+ {-# INLINE safeDiv #-}++ -- | Safe 'mod' with monadic error handling in multi-path execution.+ --+ -- >>> safeMod "a" "b" :: ExceptT ArithException Union SymInteger+ -- ExceptT {If (= b 0) (Left divide by zero) (Right (mod a b))}+ safeMod :: a -> a -> m a+ safeMod l r = mrgFmap snd $ safeDivMod l r+ {-# INLINE safeMod #-}++ -- | Safe 'divMod' with monadic error handling in multi-path execution.+ --+ -- >>> safeDivMod "a" "b" :: ExceptT ArithException Union (SymInteger, SymInteger)+ -- ExceptT {If (= b 0) (Left divide by zero) (Right ((div a b),(mod a b)))}+ safeDivMod :: a -> a -> m (a, a)+ safeDivMod l r = do+ d <- safeDiv l r+ m <- safeMod l r+ mrgSingle (d, m)+ {-# INLINE safeDivMod #-}++ -- | Safe 'quot' with monadic error handling in multi-path execution.+ safeQuot :: a -> a -> m a+ safeQuot l r = mrgFmap fst $ safeQuotRem l r+ {-# INLINE safeQuot #-}++ -- | Safe 'rem' with monadic error handling in multi-path execution.+ safeRem :: a -> a -> m a+ safeRem l r = mrgFmap snd $ safeQuotRem l r+ {-# INLINE safeRem #-}++ -- | Safe 'quotRem' with monadic error handling in multi-path execution.+ safeQuotRem :: a -> a -> m (a, a)+ safeQuotRem l r = do+ q <- safeQuot l r+ m <- safeRem l r+ mrgSingle (q, m)+ {-# INLINE safeQuotRem #-}++ {-# MINIMAL+ ((safeDiv, safeMod) | safeDivMod),+ ((safeQuot, safeRem) | safeQuotRem)+ #-}++concreteDivOrHelper ::+ (Integral a) =>+ (a -> a -> r) ->+ r ->+ a ->+ a ->+ r+concreteDivOrHelper f d l r+ | r == 0 = d+ | otherwise = f l r++concreteSafeDivHelper ::+ (MonadError ArithException m, TryMerge m, Integral a, Mergeable r) =>+ (a -> a -> r) ->+ a ->+ a ->+ m r+concreteSafeDivHelper f l r+ | r == 0 = tryMerge $ throwError DivideByZero+ | otherwise = mrgSingle $ f l r++concreteSignedBoundedDivOrHelper ::+ ( Integral a,+ Bounded a,+ Mergeable r+ ) =>+ (a -> a -> r) ->+ r ->+ a ->+ a ->+ r+concreteSignedBoundedDivOrHelper f d l r+ | r == 0 = d+ | l == minBound && r == -1 = d+ | otherwise = f l r++concreteSignedBoundedSafeDivHelper ::+ ( MonadError ArithException m,+ TryMerge m,+ Integral a,+ Bounded a,+ Mergeable r+ ) =>+ (a -> a -> r) ->+ a ->+ a ->+ m r+concreteSignedBoundedSafeDivHelper f l r+ | r == 0 = tryMerge $ throwError DivideByZero+ | l == minBound && r == -1 = tryMerge $ throwError Overflow+ | otherwise = mrgSingle $ f l r++#define QUOTE() '+#define QID(a) a+#define QRIGHT(a) QID(a)'++#define QRIGHTT(a) QID(a)' t'+#define QRIGHTU(a) QID(a)' _'++#define DIVISION_OR_CONCRETE(type) \+instance DivOr type where \+ divOr = concreteDivOrHelper div; \+ modOr = concreteDivOrHelper mod; \+ divModOr = concreteDivOrHelper divMod; \+ quotOr = concreteDivOrHelper quot; \+ remOr = concreteDivOrHelper rem; \+ quotRemOr = concreteDivOrHelper quotRem++#define SAFE_DIVISION_CONCRETE(type) \+instance (MonadError ArithException m, TryMerge m) => \+ SafeDiv ArithException type m where \+ safeDiv = concreteSafeDivHelper div; \+ safeMod = concreteSafeDivHelper mod; \+ safeDivMod = concreteSafeDivHelper divMod; \+ safeQuot = concreteSafeDivHelper quot; \+ safeRem = concreteSafeDivHelper rem; \+ safeQuotRem = concreteSafeDivHelper quotRem++#define DIVISION_OR_CONCRETE_SIGNED_BOUNDED(type) \+instance DivOr type where \+ divOr = concreteSignedBoundedDivOrHelper div; \+ modOr = concreteDivOrHelper mod; \+ divModOr = concreteSignedBoundedDivOrHelper divMod; \+ quotOr = concreteSignedBoundedDivOrHelper quot; \+ remOr = concreteDivOrHelper rem; \+ quotRemOr = concreteSignedBoundedDivOrHelper quotRem++#define SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(type) \+instance (MonadError ArithException m, TryMerge m) => \+ SafeDiv ArithException type m where \+ safeDiv = concreteSignedBoundedSafeDivHelper div; \+ safeMod = concreteSafeDivHelper mod; \+ safeDivMod = concreteSignedBoundedSafeDivHelper divMod; \+ safeQuot = concreteSignedBoundedSafeDivHelper quot; \+ safeRem = concreteSafeDivHelper rem; \+ safeQuotRem = concreteSignedBoundedSafeDivHelper quotRem++#if 1+DIVISION_OR_CONCRETE(Integer)+SAFE_DIVISION_CONCRETE(Integer)+DIVISION_OR_CONCRETE_SIGNED_BOUNDED(Int8)+SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(Int8)+DIVISION_OR_CONCRETE_SIGNED_BOUNDED(Int16)+SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(Int16)+DIVISION_OR_CONCRETE_SIGNED_BOUNDED(Int32)+SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(Int32)+DIVISION_OR_CONCRETE_SIGNED_BOUNDED(Int64)+SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(Int64)+DIVISION_OR_CONCRETE_SIGNED_BOUNDED(Int)+SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(Int)+DIVISION_OR_CONCRETE(Word8)+SAFE_DIVISION_CONCRETE(Word8)+DIVISION_OR_CONCRETE(Word16)+SAFE_DIVISION_CONCRETE(Word16)+DIVISION_OR_CONCRETE(Word32)+SAFE_DIVISION_CONCRETE(Word32)+DIVISION_OR_CONCRETE(Word64)+SAFE_DIVISION_CONCRETE(Word64)+DIVISION_OR_CONCRETE(Word)+SAFE_DIVISION_CONCRETE(Word)+++#endif++instance (KnownNat n, 1 <= n) => DivOr (IntN n) where+ divOr = concreteSignedBoundedDivOrHelper div+ modOr = concreteDivOrHelper mod+ divModOr = concreteSignedBoundedDivOrHelper divMod+ quotOr = concreteSignedBoundedDivOrHelper quot+ remOr = concreteDivOrHelper rem+ quotRemOr = concreteSignedBoundedDivOrHelper quotRem++instance+ (MonadError ArithException m, TryMerge m, KnownNat n, 1 <= n) =>+ SafeDiv ArithException (IntN n) m+ where+ safeDiv = concreteSignedBoundedSafeDivHelper div+ safeMod = concreteSafeDivHelper mod+ safeDivMod = concreteSignedBoundedSafeDivHelper divMod+ safeQuot = concreteSignedBoundedSafeDivHelper quot+ safeRem = concreteSafeDivHelper rem+ safeQuotRem = concreteSignedBoundedSafeDivHelper quotRem++instance (KnownNat n, 1 <= n) => DivOr (WordN n) where+ divOr = concreteDivOrHelper div+ modOr = concreteDivOrHelper mod+ divModOr = concreteDivOrHelper divMod+ quotOr = concreteDivOrHelper quot+ remOr = concreteDivOrHelper rem+ quotRemOr = concreteDivOrHelper quotRem++instance+ (MonadError ArithException m, TryMerge m, KnownNat n, 1 <= n) =>+ SafeDiv ArithException (WordN n) m+ where+ safeDiv = concreteSafeDivHelper div+ safeMod = concreteSafeDivHelper mod+ safeDivMod = concreteSafeDivHelper divMod+ safeQuot = concreteSafeDivHelper quot+ safeRem = concreteSafeDivHelper rem+ safeQuotRem = concreteSafeDivHelper quotRem++#define DIVISION_OR_SYMBOLIC_FUNC(name, type, op) \+name d (type l) rs@(type r) = \+ symIte (rs .== con 0) d (type $ op l r)++#define DIVISION_OR_SYMBOLIC_FUNC2(name, type, op1, op2) \+name (dd, dm) (type l) rs@(type r) = \+ (symIte (rs .== con 0) dd (type $ op1 l r), \+ symIte (rs .== con 0) dm (type $ op2 l r))++#define SAFE_DIVISION_SYMBOLIC_FUNC(name, type, op) \+name (type l) rs@(type r) = \+ mrgIf \+ (rs .== con 0) \+ (throwError DivideByZero) \+ (mrgSingle $ type $ op l r); \++#define SAFE_DIVISION_SYMBOLIC_FUNC2(name, type, op1, op2) \+name (type l) rs@(type r) = \+ mrgIf \+ (rs .== con 0) \+ (throwError DivideByZero) \+ (mrgSingle (type $ op1 l r, type $ op2 l r)); \++#if 1+instance DivOr SymInteger where+ DIVISION_OR_SYMBOLIC_FUNC(divOr, SymInteger, pevalDivIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC(modOr, SymInteger, pevalModIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC(quotOr, SymInteger, pevalQuotIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC(remOr, SymInteger, pevalRemIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC2(divModOr, SymInteger, pevalDivIntegralTerm, pevalModIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC2(quotRemOr, SymInteger, pevalQuotIntegralTerm, pevalRemIntegralTerm)+instance+ (MonadUnion m, MonadError ArithException m) =>+ SafeDiv ArithException SymInteger m where+ SAFE_DIVISION_SYMBOLIC_FUNC(safeDiv, SymInteger, pevalDivIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC(safeMod, SymInteger, pevalModIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC(safeQuot, SymInteger, pevalQuotIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC(safeRem, SymInteger, pevalRemIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC2(safeDivMod, SymInteger, pevalDivIntegralTerm, pevalModIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC2(safeQuotRem, SymInteger, pevalQuotIntegralTerm, pevalRemIntegralTerm)+#endif++#define DIVISION_OR_SYMBOLIC_FUNC_BOUNDED_SIGNED(name, type, op) \+name d ls@(type l) rs@(type r) = \+ symIte \+ (rs .== con 0) \+ d \+ (symIte (rs .== con (-1) .&& ls .== con minBound) \+ d \+ (type $ op l r)) \++#define DIVISION_OR_SYMBOLIC_FUNC2_BOUNDED_SIGNED(name, type, op1, op2) \+name (dd, dr) ls@(type l) rs@(type r) = \+ (symIte \+ (rs .== con 0) \+ dd \+ (symIte (rs .== con (-1) .&& ls .== con minBound) \+ dd \+ (type $ op1 l r)), \+ symIte \+ (rs .== con 0) \+ dr \+ (symIte (rs .== con (-1) .&& ls .== con minBound) \+ dr \+ (type $ op2 l r))) \++#define SAFE_DIVISION_SYMBOLIC_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) \+ (mrgSingle $ type $ op l r)); \++#define SAFE_DIVISION_SYMBOLIC_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) \+ (mrgSingle (type $ op1 l r, type $ op2 l r))); \++#if 1+instance (KnownNat n, 1 <= n) => DivOr (SymIntN n) where+ DIVISION_OR_SYMBOLIC_FUNC_BOUNDED_SIGNED(divOr, SymIntN, pevalDivIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC(modOr, SymIntN, pevalModIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC_BOUNDED_SIGNED(quotOr, SymIntN, pevalQuotIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC(remOr, SymIntN, pevalRemIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC2_BOUNDED_SIGNED(divModOr, SymIntN, pevalDivIntegralTerm, pevalModIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC2_BOUNDED_SIGNED(quotRemOr, SymIntN, pevalQuotIntegralTerm, pevalRemIntegralTerm)+instance+ (MonadError ArithException m, MonadUnion m, KnownNat n, 1 <= n) =>+ SafeDiv ArithException (SymIntN n) m where+ SAFE_DIVISION_SYMBOLIC_FUNC_BOUNDED_SIGNED(safeDiv, SymIntN, pevalDivIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC(safeMod, SymIntN, pevalModIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC_BOUNDED_SIGNED(safeQuot, SymIntN, pevalQuotIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC(safeRem, SymIntN, pevalRemIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC2_BOUNDED_SIGNED(safeDivMod, SymIntN, pevalDivIntegralTerm, pevalModIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC2_BOUNDED_SIGNED(safeQuotRem, SymIntN, pevalQuotIntegralTerm, pevalRemIntegralTerm)+#endif++#if 1+instance (KnownNat n, 1 <= n) => DivOr (SymWordN n) where+ DIVISION_OR_SYMBOLIC_FUNC(divOr, SymWordN, pevalDivIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC(modOr, SymWordN, pevalModIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC(quotOr, SymWordN, pevalQuotIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC(remOr, SymWordN, pevalRemIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC2(divModOr, SymWordN, pevalDivIntegralTerm, pevalModIntegralTerm)+ DIVISION_OR_SYMBOLIC_FUNC2(quotRemOr, SymWordN, pevalQuotIntegralTerm, pevalRemIntegralTerm)+instance+ (MonadError ArithException m, MonadUnion m, KnownNat n, 1 <= n) =>+ SafeDiv ArithException (SymWordN n) m where+ SAFE_DIVISION_SYMBOLIC_FUNC(safeDiv, SymWordN, pevalDivIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC(safeMod, SymWordN, pevalModIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC(safeQuot, SymWordN, pevalQuotIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC(safeRem, SymWordN, pevalRemIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC2(safeDivMod, SymWordN, pevalDivIntegralTerm, pevalModIntegralTerm)+ SAFE_DIVISION_SYMBOLIC_FUNC2(safeQuotRem, SymWordN, pevalQuotIntegralTerm, pevalRemIntegralTerm)+#endif
− src/Grisette/Internal/Core/Data/Class/SafeDivision.hs
@@ -1,290 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DerivingVia #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE Trustworthy #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE UndecidableInstances #-}---- |--- Module : Grisette.Internal.Core.Data.Class.SafeDivision--- Copyright : (c) Sirui Lu 2021-2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Internal.Core.Data.Class.SafeDivision- ( ArithException (..),- SafeDivision (..),- )-where--import Control.Exception (ArithException (DivideByZero, Overflow, Underflow))-import Control.Monad.Except (MonadError (throwError))-import Data.Int (Int16, Int32, Int64, Int8)-import Data.Word (Word16, Word32, Word64, Word8)-import GHC.TypeNats (KnownNat, type (<=))-import Grisette.Internal.Core.Control.Monad.Class.Union (MonadUnion)-import Grisette.Internal.Core.Data.Class.LogicalOp (LogicalOp ((.&&)))-import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)-import Grisette.Internal.Core.Data.Class.SimpleMergeable- ( mrgIf,- )-import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con))-import Grisette.Internal.Core.Data.Class.SymEq (SymEq ((.==)))-import Grisette.Internal.Core.Data.Class.TryMerge- ( TryMerge,- mrgSingle,- tryMerge,- )-import Grisette.Internal.SymPrim.BV- ( IntN,- WordN,- )-import Grisette.Internal.SymPrim.Prim.Term- ( PEvalDivModIntegralTerm- ( pevalDivIntegralTerm,- pevalModIntegralTerm,- pevalQuotIntegralTerm,- pevalRemIntegralTerm- ),- )-import Grisette.Internal.SymPrim.SymBV- ( SymIntN (SymIntN),- SymWordN (SymWordN),- )-import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger))-import Grisette.Lib.Data.Functor (mrgFmap)---- $setup--- >>> import Grisette.Core--- >>> import Grisette.SymPrim--- >>> import Control.Monad.Except--- >>> import Control.Exception---- | 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 (MonadError e m, TryMerge m, Mergeable a) => SafeDivision e a m where- -- | Safe signed 'div' with monadic error handling in multi-path execution.- --- -- >>> safeDiv (ssym "a") (ssym "b") :: ExceptT ArithException Union SymInteger- -- ExceptT {If (= b 0) (Left divide by zero) (Right (div a b))}- safeDiv :: a -> a -> m a- safeDiv l r = mrgFmap fst $ safeDivMod l r- {-# INLINE safeDiv #-}-- -- | Safe signed 'mod' with monadic error handling in multi-path execution.- --- -- >>> safeMod (ssym "a") (ssym "b") :: ExceptT ArithException Union SymInteger- -- ExceptT {If (= b 0) (Left divide by zero) (Right (mod a b))}- safeMod :: a -> a -> m a- safeMod l r = mrgFmap snd $ safeDivMod l r- {-# INLINE safeMod #-}-- -- | Safe signed 'divMod' with monadic error handling in multi-path execution.- --- -- >>> safeDivMod (ssym "a") (ssym "b") :: ExceptT ArithException Union (SymInteger, SymInteger)- -- ExceptT {If (= b 0) (Left divide by zero) (Right ((div a b),(mod a b)))}- safeDivMod :: a -> a -> m (a, a)- safeDivMod l r = do- d <- safeDiv l r- m <- safeMod l r- mrgSingle (d, m)- {-# INLINE safeDivMod #-}-- -- | Safe signed 'quot' with monadic error handling in multi-path execution.- safeQuot :: a -> a -> m a- safeQuot l r = mrgFmap fst $ safeQuotRem l r- {-# INLINE safeQuot #-}-- -- | Safe signed 'rem' with monadic error handling in multi-path execution.- safeRem :: a -> a -> m a- safeRem l r = mrgFmap snd $ safeQuotRem l r- {-# INLINE safeRem #-}-- -- | Safe signed 'quotRem' with monadic error handling in multi-path execution.- safeQuotRem :: a -> a -> m (a, a)- safeQuotRem l r = do- q <- safeQuot l r- m <- safeRem l r- mrgSingle (q, m)- {-# INLINE safeQuotRem #-}-- {-# MINIMAL- ((safeDiv, safeMod) | safeDivMod),- ((safeQuot, safeRem) | safeQuotRem)- #-}--concreteSafeDivisionHelper ::- (MonadError ArithException m, TryMerge m, Integral a, Mergeable r) =>- (a -> a -> r) ->- a ->- a ->- m r-concreteSafeDivisionHelper f l r- | r == 0 = tryMerge $ throwError DivideByZero- | otherwise = mrgSingle $ f l r--concreteSignedBoundedSafeDivisionHelper ::- ( MonadError ArithException m,- TryMerge m,- Integral a,- Bounded a,- Mergeable r- ) =>- (a -> a -> r) ->- a ->- a ->- m r-concreteSignedBoundedSafeDivisionHelper f l r- | r == 0 = tryMerge $ throwError DivideByZero- | l == minBound && r == -1 = tryMerge $ throwError Overflow- | otherwise = mrgSingle $ f l r--#define QUOTE() '-#define QID(a) a-#define QRIGHT(a) QID(a)'--#define QRIGHTT(a) QID(a)' t'-#define QRIGHTU(a) QID(a)' _'--#define SAFE_DIVISION_CONCRETE(type) \-instance (MonadError ArithException m, TryMerge m) => \- SafeDivision ArithException type m where \- safeDiv = concreteSafeDivisionHelper div; \- safeMod = concreteSafeDivisionHelper mod; \- safeDivMod = concreteSafeDivisionHelper divMod; \- safeQuot = concreteSafeDivisionHelper quot; \- safeRem = concreteSafeDivisionHelper rem; \- safeQuotRem = concreteSafeDivisionHelper quotRem--#define SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(type) \-instance (MonadError ArithException m, TryMerge m) => \- SafeDivision ArithException type m where \- safeDiv = concreteSignedBoundedSafeDivisionHelper div; \- safeMod = concreteSafeDivisionHelper mod; \- safeDivMod = concreteSignedBoundedSafeDivisionHelper divMod; \- safeQuot = concreteSignedBoundedSafeDivisionHelper quot; \- safeRem = concreteSafeDivisionHelper rem; \- safeQuotRem = concreteSignedBoundedSafeDivisionHelper quotRem--#define SAFE_DIVISION_CONCRETE_BV(type) \-instance \- (MonadError ArithException m, TryMerge m, KnownNat n, 1 <= n) => \- SafeDivision ArithException (type n) m where \- safeDiv = concreteSafeDivisionHelper div; \- safeMod = concreteSafeDivisionHelper mod; \- safeDivMod = concreteSafeDivisionHelper divMod; \- safeQuot = concreteSafeDivisionHelper quot; \- safeRem = concreteSafeDivisionHelper rem; \- safeQuotRem = concreteSafeDivisionHelper quotRem--#if 1-SAFE_DIVISION_CONCRETE(Integer)-SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(Int8)-SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(Int16)-SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(Int32)-SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(Int64)-SAFE_DIVISION_CONCRETE_SIGNED_BOUNDED(Int)-SAFE_DIVISION_CONCRETE(Word8)-SAFE_DIVISION_CONCRETE(Word16)-SAFE_DIVISION_CONCRETE(Word32)-SAFE_DIVISION_CONCRETE(Word64)-SAFE_DIVISION_CONCRETE(Word)--instance- (MonadError ArithException m, TryMerge m, KnownNat n, 1 <= n) =>- SafeDivision ArithException (IntN n) m where- safeDiv = concreteSignedBoundedSafeDivisionHelper div- safeMod = concreteSafeDivisionHelper mod- safeDivMod = concreteSignedBoundedSafeDivisionHelper divMod- safeQuot = concreteSignedBoundedSafeDivisionHelper quot- safeRem = concreteSafeDivisionHelper rem- safeQuotRem = concreteSignedBoundedSafeDivisionHelper quotRem--instance- (MonadError ArithException m, TryMerge m, KnownNat n, 1 <= n) =>- SafeDivision ArithException (WordN n) m where- safeDiv = concreteSafeDivisionHelper div- safeMod = concreteSafeDivisionHelper mod- safeDivMod = concreteSafeDivisionHelper divMod- safeQuot = concreteSafeDivisionHelper quot- safeRem = concreteSafeDivisionHelper rem- safeQuotRem = concreteSafeDivisionHelper quotRem-#endif--#define SAFE_DIVISION_SYMBOLIC_FUNC(name, type, op) \-name (type l) rs@(type r) = \- mrgIf \- (rs .== con 0) \- (throwError DivideByZero) \- (mrgSingle $ type $ op l r); \--#define SAFE_DIVISION_SYMBOLIC_FUNC2(name, type, op1, op2) \-name (type l) rs@(type r) = \- mrgIf \- (rs .== con 0) \- (throwError DivideByZero) \- (mrgSingle (type $ op1 l r, type $ op2 l r)); \--#if 1-instance- (MonadUnion m, MonadError ArithException m) =>- SafeDivision ArithException SymInteger m where- SAFE_DIVISION_SYMBOLIC_FUNC(safeDiv, SymInteger, pevalDivIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC(safeMod, SymInteger, pevalModIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC(safeQuot, SymInteger, pevalQuotIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC(safeRem, SymInteger, pevalRemIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC2(safeDivMod, SymInteger, pevalDivIntegralTerm, pevalModIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC2(safeQuotRem, SymInteger, pevalQuotIntegralTerm, pevalRemIntegralTerm)-#endif--#define SAFE_DIVISION_SYMBOLIC_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) \- (mrgSingle $ type $ op l r)); \--#define SAFE_DIVISION_SYMBOLIC_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) \- (mrgSingle (type $ op1 l r, type $ op2 l r))); \--#if 1-instance- (MonadError ArithException m, MonadUnion m, KnownNat n, 1 <= n) =>- SafeDivision ArithException (SymIntN n) m where- SAFE_DIVISION_SYMBOLIC_FUNC_BOUNDED_SIGNED(safeDiv, SymIntN, pevalDivIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC(safeMod, SymIntN, pevalModIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC_BOUNDED_SIGNED(safeQuot, SymIntN, pevalQuotIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC(safeRem, SymIntN, pevalRemIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC2_BOUNDED_SIGNED(safeDivMod, SymIntN, pevalDivIntegralTerm, pevalModIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC2_BOUNDED_SIGNED(safeQuotRem, SymIntN, pevalQuotIntegralTerm, pevalRemIntegralTerm)-#endif--#if 1-instance- (MonadError ArithException m, MonadUnion m, KnownNat n, 1 <= n) =>- SafeDivision ArithException (SymWordN n) m where- SAFE_DIVISION_SYMBOLIC_FUNC(safeDiv, SymWordN, pevalDivIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC(safeMod, SymWordN, pevalModIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC(safeQuot, SymWordN, pevalQuotIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC(safeRem, SymWordN, pevalRemIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC2(safeDivMod, SymWordN, pevalDivIntegralTerm, pevalModIntegralTerm)- SAFE_DIVISION_SYMBOLIC_FUNC2(safeQuotRem, SymWordN, pevalQuotIntegralTerm, pevalRemIntegralTerm)-#endif
+ src/Grisette/Internal/Core/Data/Class/SafeFdiv.hs view
@@ -0,0 +1,153 @@+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Internal.Core.Data.Class.SafeFdiv+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.Core.Data.Class.SafeFdiv+ ( SafeFdiv (..),+ FdivOr (..),+ fdivOrZero,+ recipOrZero,+ )+where++import Control.Exception (ArithException (RatioZeroDenominator), throw)+import Control.Monad.Error.Class (MonadError (throwError))+import Grisette.Internal.Core.Control.Monad.Class.Union (MonadUnion)+import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp (symIte))+import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)+import Grisette.Internal.Core.Data.Class.SimpleMergeable (mrgIf)+import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con))+import Grisette.Internal.Core.Data.Class.SymEq (SymEq ((.==)))+import Grisette.Internal.Core.Data.Class.TryMerge (TryMerge, tryMerge)+import Grisette.Internal.SymPrim.AlgReal+ ( AlgReal (AlgExactRational),+ UnsupportedAlgRealOperation (UnsupportedAlgRealOperation),+ )+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( PEvalFractionalTerm (pevalFdivTerm, pevalRecipTerm),+ )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal))++-- $setup+-- >>> import Grisette.Core+-- >>> import Grisette.SymPrim+-- >>> import Control.Monad.Except+-- >>> import Control.Exception++-- | Safe fractional with default values returned on exception.+class FdivOr a where+ -- | Safe '/' with default values returned on exception.+ --+ -- >>> fdivOr "d" "a" "b" :: SymAlgReal+ -- (ite (= b 0.0) d (fdiv a b))+ fdivOr :: a -> a -> a -> a++ -- | Safe 'recip' with default values returned on exception.+ --+ -- >>> recipOr "d" "a" :: SymAlgReal+ -- (ite (= a 0.0) d (recip a))+ recipOr :: a -> a -> a++-- | Safe '/' with 0 returned on exception.+fdivOrZero :: (FdivOr a, Num a) => a -> a -> a+fdivOrZero l = fdivOr (l - l) l++-- | Safe 'recip' with 0 returned on exception.+recipOrZero :: (FdivOr a, Num a) => a -> a+recipOrZero v = recipOr (v - v) v++-- | Safe fractional division with monadic error handling in multi-path+-- execution. These procedures throw an exception when the denominator is zero.+-- The result should be able to handle errors with `MonadError`.+class (MonadError e m, TryMerge m, Mergeable a) => SafeFdiv e a m where+ -- | Safe fractional division with monadic error handling in multi-path+ -- execution.+ --+ -- >>> safeFdiv "a" "b" :: ExceptT ArithException Union SymAlgReal+ -- ExceptT {If (= b 0.0) (Left Ratio has zero denominator) (Right (fdiv a b))}+ safeFdiv :: a -> a -> m a++ -- | Safe fractional reciprocal with monadic error handling in multi-path+ -- execution.+ --+ -- >>> safeRecip "a" :: ExceptT ArithException Union SymAlgReal+ -- ExceptT {If (= a 0.0) (Left Ratio has zero denominator) (Right (recip a))}+ safeRecip :: a -> m a+ default safeRecip :: (Fractional a) => a -> m a+ safeRecip = safeFdiv (fromRational 1)+ {-# INLINE safeRecip #-}++ {-# MINIMAL safeFdiv #-}++instance FdivOr AlgReal where+ fdivOr d (AlgExactRational l) (AlgExactRational r)+ | r /= 0 = AlgExactRational (l / r)+ | otherwise = d+ fdivOr d l r =+ -- Throw the error because the user should never construct an AlgReal+ -- other than AlgExactRational.+ throw $+ UnsupportedAlgRealOperation "fdivOr" $+ show d <> " and " <> show l <> " and " <> show r+ {-# INLINE fdivOr #-}+ recipOr d (AlgExactRational l)+ | l /= 0 = AlgExactRational (recip l)+ | otherwise = d+ recipOr d l =+ throw $ UnsupportedAlgRealOperation "recipOr" $ show d <> " and " <> show l+ {-# INLINE recipOr #-}++instance+ ( MonadError ArithException m,+ TryMerge m+ ) =>+ SafeFdiv ArithException AlgReal m+ where+ safeFdiv (AlgExactRational l) (AlgExactRational r)+ | r /= 0 =+ pure $ AlgExactRational (l / r)+ | otherwise = tryMerge $ throwError RatioZeroDenominator+ safeFdiv l r =+ -- Throw the error because the user should never construct an AlgReal+ -- other than AlgExactRational.+ throw $+ UnsupportedAlgRealOperation "safeFdiv" $+ show l <> " and " <> show r+ {-# INLINE safeFdiv #-}+ safeRecip (AlgExactRational l)+ | l /= 0 =+ pure $ AlgExactRational (recip l)+ | otherwise = tryMerge $ throwError RatioZeroDenominator+ safeRecip l =+ throw $ UnsupportedAlgRealOperation "safeRecip" $ show l++instance FdivOr SymAlgReal where+ fdivOr d (SymAlgReal lt) r@(SymAlgReal rt) =+ symIte (r .== con 0) d (SymAlgReal $ pevalFdivTerm lt rt)+ recipOr d l@(SymAlgReal lt) =+ symIte (l .== con 0) d (SymAlgReal $ pevalRecipTerm lt)++instance+ (MonadError ArithException m, MonadUnion m) =>+ SafeFdiv ArithException SymAlgReal m+ where+ safeFdiv (SymAlgReal lt) r@(SymAlgReal rt) =+ mrgIf+ (r .== con 0)+ (throwError RatioZeroDenominator)+ (pure $ SymAlgReal $ pevalFdivTerm lt rt)+ safeRecip l@(SymAlgReal lt) =+ mrgIf+ (l .== con 0)+ (throwError RatioZeroDenominator)+ (pure $ SymAlgReal $ pevalRecipTerm lt)
+ src/Grisette/Internal/Core/Data/Class/SafeFromFP.hs view
@@ -0,0 +1,265 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Internal.Core.Data.Class.SafeFromFP+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.Core.Data.Class.SafeFromFP (SafeFromFP (..)) where++import Control.Monad.Error.Class (MonadError (throwError))+import GHC.TypeLits (KnownNat, type (<=))+import Grisette.Internal.Core.Control.Monad.Class.Union (MonadUnion)+import Grisette.Internal.Core.Data.Class.IEEEFP+ ( IEEEFPConvertible (fromFPOr),+ IEEEFPRoundingMode (rna, rne, rtn, rtp, rtz),+ fpIsNaN,+ fpIsNegativeInfinite,+ fpIsPositiveInfinite,+ )+import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp (symIte))+import Grisette.Internal.Core.Data.Class.SimpleMergeable (mrgIf)+import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con))+import Grisette.Internal.Core.Data.Class.SymEq (SymEq ((.==)))+import Grisette.Internal.Core.Data.Class.SymIEEEFP+ ( SymIEEEFPTraits+ ( symFpIsNaN,+ symFpIsNegativeInfinite,+ symFpIsPositiveInfinite+ ),+ )+import Grisette.Internal.Core.Data.Class.SymOrd (SymOrd ((.<), (.>)))+import Grisette.Internal.Core.Data.Class.TryMerge+ ( TryMerge,+ mrgSingle,+ tryMerge,+ )+import Grisette.Internal.SymPrim.AlgReal (AlgReal)+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.FP+ ( ConvertibleBound (convertibleLowerBound, convertibleUpperBound),+ FP,+ FPRoundingMode,+ NotRepresentableFPError+ ( FPOverflowError,+ FPUnderflowError,+ NaNError+ ),+ ValidFP,+ )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal)+import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)+import Grisette.Internal.SymPrim.SymFP (SymFP, SymFPRoundingMode)+import Grisette.Internal.SymPrim.SymInteger (SymInteger)++-- | Safe conversion from floating point numbers that throws exceptions when+-- the result isn't representable by the type.+class+ (MonadError e m, TryMerge m, IEEEFPConvertible a fp fprd) =>+ SafeFromFP e a fp fprd m+ where+ safeFromFP :: fprd -> fp -> m a++instance+ (MonadError NotRepresentableFPError m, TryMerge m, ValidFP eb sb) =>+ SafeFromFP NotRepresentableFPError AlgReal (FP eb sb) FPRoundingMode m+ where+ safeFromFP mode a+ | fpIsPositiveInfinite a = tryMerge $ throwError FPOverflowError+ | fpIsNegativeInfinite a = tryMerge $ throwError FPUnderflowError+ | fpIsNaN a = tryMerge $ throwError NaNError+ | otherwise = mrgSingle $ fromFPOr undefined mode a++instance+ (MonadError NotRepresentableFPError m, MonadUnion m, ValidFP eb sb) =>+ SafeFromFP+ NotRepresentableFPError+ SymAlgReal+ (SymFP eb sb)+ SymFPRoundingMode+ m+ where+ safeFromFP mode a =+ mrgIf (symFpIsPositiveInfinite a) (tryMerge $ throwError FPOverflowError)+ $ mrgIf+ (symFpIsNegativeInfinite a)+ (tryMerge $ throwError FPUnderflowError)+ $ mrgIf (symFpIsNaN a) (tryMerge $ throwError NaNError)+ $ mrgSingle+ $ fromFPOr 0 mode a++instance+ (MonadError NotRepresentableFPError m, TryMerge m, ValidFP eb sb) =>+ SafeFromFP NotRepresentableFPError Integer (FP eb sb) FPRoundingMode m+ where+ safeFromFP mode a+ | fpIsPositiveInfinite a = tryMerge $ throwError FPOverflowError+ | fpIsNegativeInfinite a = tryMerge $ throwError FPUnderflowError+ | fpIsNaN a = tryMerge $ throwError NaNError+ | otherwise = mrgSingle $ fromFPOr 0 mode a++instance+ (MonadError NotRepresentableFPError m, MonadUnion m, ValidFP eb sb) =>+ SafeFromFP+ NotRepresentableFPError+ SymInteger+ (SymFP eb sb)+ SymFPRoundingMode+ m+ where+ safeFromFP mode a =+ mrgIf (symFpIsPositiveInfinite a) (tryMerge $ throwError FPOverflowError)+ $ mrgIf+ (symFpIsNegativeInfinite a)+ (tryMerge $ throwError FPUnderflowError)+ $ mrgIf+ (symFpIsNaN a)+ (tryMerge $ throwError NaNError)+ $ mrgSingle+ $ fromFPOr 0 mode a++instance+ ( MonadError NotRepresentableFPError m,+ TryMerge m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n+ ) =>+ SafeFromFP NotRepresentableFPError (WordN n) (FP eb sb) FPRoundingMode m+ where+ safeFromFP mode a = do+ p :: Integer <- safeFromFP mode a+ if p < (fromIntegral (minBound :: WordN n))+ then tryMerge $ throwError FPUnderflowError+ else+ if p > (fromIntegral (maxBound :: WordN n))+ then tryMerge $ throwError FPOverflowError+ else mrgSingle $ fromIntegral p++symConvertibleLowerBound ::+ forall conBV symBV n eb sb.+ ( ConvertibleBound conBV,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n,+ Solvable (conBV n) (symBV n)+ ) =>+ symBV n ->+ SymFPRoundingMode ->+ SymFP eb sb+symConvertibleLowerBound _ mode =+ symIte+ (mode .== rne)+ (con $ convertibleLowerBound (undefined :: conBV n) rne)+ $ symIte+ (mode .== rna)+ (con $ convertibleLowerBound (undefined :: conBV n) rna)+ $ symIte+ (mode .== rtp)+ (con $ convertibleLowerBound (undefined :: conBV n) rtp)+ $ symIte+ (mode .== rtn)+ (con $ convertibleLowerBound (undefined :: conBV n) rtn)+ (con $ convertibleLowerBound (undefined :: conBV n) rtz)++symConvertibleUpperBound ::+ forall conBV symBV n eb sb.+ ( ConvertibleBound conBV,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n,+ Solvable (conBV n) (symBV n)+ ) =>+ symBV n ->+ SymFPRoundingMode ->+ SymFP eb sb+symConvertibleUpperBound _ mode =+ symIte+ (mode .== rne)+ (con $ convertibleUpperBound (undefined :: conBV n) rne)+ $ symIte+ (mode .== rna)+ (con $ convertibleUpperBound (undefined :: conBV n) rna)+ $ symIte+ (mode .== rtp)+ (con $ convertibleUpperBound (undefined :: conBV n) rtp)+ $ symIte+ (mode .== rtn)+ (con $ convertibleUpperBound (undefined :: conBV n) rtn)+ (con $ convertibleUpperBound (undefined :: conBV n) rtz)++instance+ ( MonadError NotRepresentableFPError m,+ MonadUnion m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n+ ) =>+ SafeFromFP NotRepresentableFPError (SymWordN n) (SymFP eb sb) SymFPRoundingMode m+ where+ safeFromFP mode a =+ mrgIf (symFpIsPositiveInfinite a) (tryMerge $ throwError FPOverflowError)+ $ mrgIf+ (symFpIsNegativeInfinite a)+ (tryMerge $ throwError FPUnderflowError)+ $ mrgIf (symFpIsNaN a) (tryMerge $ throwError NaNError)+ $ mrgIf+ (a .< symConvertibleLowerBound (undefined :: SymWordN n) mode)+ (tryMerge $ throwError FPUnderflowError)+ $ mrgIf+ (a .> symConvertibleUpperBound (undefined :: SymWordN n) mode)+ (tryMerge $ throwError FPOverflowError)+ $ mrgSingle+ $ fromFPOr 0 mode a++instance+ ( MonadError NotRepresentableFPError m,+ TryMerge m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n+ ) =>+ SafeFromFP NotRepresentableFPError (IntN n) (FP eb sb) FPRoundingMode m+ where+ safeFromFP mode a = do+ p :: Integer <- safeFromFP mode a+ if p < (fromIntegral (minBound :: IntN n))+ then tryMerge $ throwError FPUnderflowError+ else+ if p > (fromIntegral (maxBound :: IntN n))+ then tryMerge $ throwError FPOverflowError+ else mrgSingle $ fromIntegral p++instance+ ( MonadError NotRepresentableFPError m,+ MonadUnion m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n+ ) =>+ SafeFromFP NotRepresentableFPError (SymIntN n) (SymFP eb sb) SymFPRoundingMode m+ where+ safeFromFP mode a =+ mrgIf (symFpIsPositiveInfinite a) (tryMerge $ throwError FPOverflowError)+ $ mrgIf+ (symFpIsNegativeInfinite a)+ (tryMerge $ throwError FPUnderflowError)+ $ mrgIf (symFpIsNaN a) (tryMerge $ throwError NaNError)+ $ mrgIf+ (a .< symConvertibleLowerBound (undefined :: SymIntN n) mode)+ (tryMerge $ throwError FPUnderflowError)+ $ mrgIf+ (a .> symConvertibleUpperBound (undefined :: SymIntN n) mode)+ (tryMerge $ throwError FPOverflowError)+ $ mrgSingle+ $ fromFPOr 0 mode a
+ src/Grisette/Internal/Core/Data/Class/SafeLogBase.hs view
@@ -0,0 +1,86 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++-- |+-- Module : Grisette.Internal.Core.Data.Class.SafeLogBase+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.Core.Data.Class.SafeLogBase+ ( SafeLogBase (..),+ LogBaseOr (..),+ logBaseOrZero,+ )+where++import Control.Exception (ArithException (RatioZeroDenominator))+import Control.Monad.Error.Class (MonadError (throwError))+import Grisette.Internal.Core.Control.Monad.Class.Union (MonadUnion)+import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp (symIte))+import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)+import Grisette.Internal.Core.Data.Class.SimpleMergeable (mrgIf)+import Grisette.Internal.Core.Data.Class.SymEq (SymEq ((.==)))+import Grisette.Internal.Core.Data.Class.TryMerge (TryMerge)+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( FloatingUnaryOp (FloatingLog),+ PEvalFloatingTerm (pevalFloatingUnaryTerm),+ PEvalFractionalTerm (pevalFdivTerm),+ )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal))++-- $setup+-- >>> import Grisette.Core+-- >>> import Grisette.SymPrim+-- >>> import Control.Monad.Except+-- >>> import Control.Exception++-- | Safe 'logBase' with default values returned on exception.+class LogBaseOr a where+ -- | Safe 'logBase' with default values returned on exception.+ --+ -- >>> logBaseOr "d" "base" "val" :: SymAlgReal+ -- (ite (= base 1.0) d (fdiv (log val) (log base)))+ logBaseOr :: a -> a -> a -> a++-- | Safe 'logBase' with 0 returned on exception.+logBaseOrZero :: (LogBaseOr a, Num a) => a -> a -> a+logBaseOrZero l = logBaseOr (l - l) l+{-# INLINE logBaseOrZero #-}++-- | Safe 'logBase' with monadic error handling in multi-path execution.+-- These procedures throw an exception when the base is 1.+-- The result should be able to handle errors with `MonadError`.+class (MonadError e m, TryMerge m, Mergeable a) => SafeLogBase e a m where+ -- | Safe 'logBase' with monadic error handling in multi-path execution.+ --+ -- >>> safeLogBase (ssym "base") (ssym "val") :: ExceptT ArithException Union SymAlgReal+ -- ExceptT {If (= base 1.0) (Left Ratio has zero denominator) (Right (fdiv (log val) (log base)))}+ safeLogBase :: a -> a -> m a+ safeLogBase = undefined+ {-# INLINE safeLogBase #-}++instance LogBaseOr SymAlgReal where+ logBaseOr d base@(SymAlgReal baset) (SymAlgReal at) =+ symIte (base .== 1) d $+ SymAlgReal $+ pevalFdivTerm+ (pevalFloatingUnaryTerm FloatingLog at)+ (pevalFloatingUnaryTerm FloatingLog baset)+ {-# INLINE logBaseOr #-}++instance+ (MonadError ArithException m, MonadUnion m) =>+ SafeLogBase ArithException SymAlgReal m+ where+ safeLogBase base@(SymAlgReal baset) (SymAlgReal at) =+ mrgIf (base .== 1) (throwError RatioZeroDenominator) $+ pure $+ SymAlgReal $+ pevalFdivTerm+ (pevalFloatingUnaryTerm FloatingLog at)+ (pevalFloatingUnaryTerm FloatingLog baset)+ {-# INLINE safeLogBase #-}
src/Grisette/Internal/Core/Data/Class/SimpleMergeable.hs view
@@ -99,6 +99,7 @@ ( LinkedRep, SupportedPrim, )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal) import Grisette.Internal.SymPrim.SymBV ( SymIntN, SymWordN,@@ -828,6 +829,7 @@ SIMPLE_MERGEABLE_SIMPLE(SymBool) SIMPLE_MERGEABLE_SIMPLE(SymInteger) SIMPLE_MERGEABLE_SIMPLE(SymFPRoundingMode)+SIMPLE_MERGEABLE_SIMPLE(SymAlgReal) SIMPLE_MERGEABLE_BV(SymIntN) SIMPLE_MERGEABLE_BV(SymWordN) SIMPLE_MERGEABLE_FUN((=->), (=~>))
src/Grisette/Internal/Core/Data/Class/Solvable.hs view
@@ -38,8 +38,6 @@ -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim--- >>> :set -XOverloadedStrings--- >>> :set -XTemplateHaskell -- | The class defines the creation and pattern matching of solvable type -- values.
src/Grisette/Internal/Core/Data/Class/Solver.hs view
@@ -70,7 +70,8 @@ ) import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con)) import Grisette.Internal.SymPrim.Prim.Model- ( Model,+ ( AnySymbolSet,+ Model, SymbolSet (unSymbolSet), equation, )@@ -84,10 +85,10 @@ deriving (Eq, Show, Ord, Generic, Hashable, Lift, NFData) -- $setup+-- >>> import Grisette -- >>> import Grisette.Core -- >>> import Grisette.SymPrim -- >>> import Grisette.Backend--- >>> :set -XOverloadedStrings -- | The current failures that can be returned by the solver. data SolvingFailure@@ -214,7 +215,7 @@ (models, err) <- go solver model numOfModelRequested return (model : models, err) where- allSymbols = extractSym formula :: SymbolSet+ allSymbols = extractSym formula :: AnySymbolSet go solver prevModel n | n <= 1 = return ([], ResultNumLimitReached) | otherwise = do@@ -353,7 +354,6 @@ -- | -- Solver procedure for programs with error handling. ----- >>> :set -XLambdaCase -- >>> import Control.Monad.Except -- >>> let x = "x" :: SymInteger -- >>> :{
src/Grisette/Internal/Core/Data/Class/SubstSym.hs view
@@ -79,14 +79,18 @@ ( AssertionError, VerificationConditions, )+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)+import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, NotRepresentableFPError, ValidFP) import Grisette.Internal.SymPrim.GeneralFun (substTerm, type (-->)) import Grisette.Internal.SymPrim.Prim.Term- ( LinkedRep (underlyingTerm),+ ( IsSymbolKind,+ LinkedRep (underlyingTerm), SupportedPrim,+ SymbolKind, TypedSymbol, )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal)) import Grisette.Internal.SymPrim.SymBV ( SymIntN (SymIntN), SymWordN (SymWordN),@@ -112,7 +116,7 @@ -- | Substitution of symbols (symbolic constants) to a symbolic value. ----- >>> a = "a" :: TypedSymbol Bool+-- >>> a = "a" :: TypedAnySymbol Bool -- >>> v = "x" .&& "y" :: SymBool -- >>> substSym a v (["a" .&& "b", "a"] :: [SymBool]) -- [(&& (&& x y) b),(&& x y)]@@ -126,7 +130,12 @@ -- -- >>> substSym "a" ("c" .&& "d" :: Sym Bool) ["a" .&& "b" :: Sym Bool, "a"] -- [(&& (&& c d) b),(&& c d)]- substSym :: (LinkedRep cb sb) => TypedSymbol cb -> sb -> a -> a+ substSym ::+ (LinkedRep cb sb, IsSymbolKind knd) =>+ TypedSymbol knd cb ->+ sb ->+ a ->+ a -- | Lifting of 'SubstSym' to unary type constructors. class@@ -135,17 +144,17 @@ where -- | Lift a symbol substitution function to unary type constructors. liftSubstSym ::- (LinkedRep cb sb) =>- (TypedSymbol cb -> sb -> a -> a) ->- TypedSymbol cb ->+ (LinkedRep cb sb, IsSymbolKind knd) =>+ (TypedSymbol knd cb -> sb -> a -> a) ->+ TypedSymbol knd cb -> sb -> f a -> f a -- | Lifting the standard 'substSym' to unary type constructors. substSym1 ::- (SubstSym1 f, SubstSym a, LinkedRep cb sb) =>- TypedSymbol cb ->+ (SubstSym1 f, SubstSym a, LinkedRep cb sb, IsSymbolKind knd) =>+ TypedSymbol knd cb -> sb -> f a -> f a@@ -158,18 +167,18 @@ where -- | Lift a symbol substitution function to binary type constructors. liftSubstSym2 ::- (LinkedRep cb sb) =>- (TypedSymbol cb -> sb -> a -> a) ->- (TypedSymbol cb -> sb -> b -> b) ->- TypedSymbol cb ->+ (LinkedRep cb sb, IsSymbolKind knd) =>+ (TypedSymbol knd cb -> sb -> a -> a) ->+ (TypedSymbol knd cb -> sb -> b -> b) ->+ TypedSymbol knd cb -> sb -> f a b -> f a b -- | Lifting the standard 'substSym' to binary type constructors. substSym2 ::- (SubstSym2 f, SubstSym a, SubstSym b, LinkedRep cb sb) =>- TypedSymbol cb ->+ (SubstSym2 f, SubstSym a, SubstSym b, LinkedRep cb sb, IsSymbolKind knd) =>+ TypedSymbol knd cb -> sb -> f a b -> f a b@@ -178,20 +187,20 @@ -- Derivations -- | The arguments to the generic 'substSym' function.-data family SubstSymArgs arity a cb sb :: Type+data family SubstSymArgs arity (knd :: SymbolKind) a cb sb :: Type -data instance SubstSymArgs Arity0 _ _ _ = SubstSymArgs0+data instance SubstSymArgs Arity0 _ _ _ _ = SubstSymArgs0 -newtype instance SubstSymArgs Arity1 a cb sb- = SubstSymArgs1 (TypedSymbol cb -> sb -> a -> a)+newtype instance SubstSymArgs Arity1 knd a cb sb+ = SubstSymArgs1 (TypedSymbol knd cb -> sb -> a -> a) -- | The class of types where we can generically substitute the symbols in a -- value. class GSubstSym arity f where gsubstSym ::- (LinkedRep cb sb) =>- SubstSymArgs arity a cb sb ->- TypedSymbol cb ->+ (LinkedRep cb sb, IsSymbolKind knd) =>+ SubstSymArgs arity knd a cb sb ->+ TypedSymbol knd cb -> sb -> f a -> f a@@ -241,8 +250,8 @@ -- | Generic 'substSym' function. genericSubstSym ::- (Generic a, GSubstSym Arity0 (Rep a), LinkedRep cb sb) =>- TypedSymbol cb ->+ (Generic a, GSubstSym Arity0 (Rep a), LinkedRep cb sb, IsSymbolKind knd) =>+ TypedSymbol knd cb -> sb -> a -> a@@ -252,9 +261,9 @@ -- | Generic 'liftSubstSym' function. genericLiftSubstSym ::- (Generic1 f, GSubstSym Arity1 (Rep1 f), LinkedRep cb sb) =>- (TypedSymbol cb -> sb -> a -> a) ->- TypedSymbol cb ->+ (Generic1 f, GSubstSym Arity1 (Rep1 f), LinkedRep cb sb, IsSymbolKind knd) =>+ (TypedSymbol knd cb -> sb -> a -> a) ->+ TypedSymbol knd cb -> sb -> f a -> f a@@ -316,6 +325,7 @@ CONCRETE_SUBSTITUTESYM_BV(WordN) CONCRETE_SUBSTITUTESYM_BV(IntN) CONCRETE_SUBSTITUTESYM(FPRoundingMode)+CONCRETE_SUBSTITUTESYM(AlgReal) #endif instance (ValidFP eb sb) => SubstSym (FP eb sb) where@@ -337,6 +347,7 @@ #if 1 SUBSTITUTE_SYM_SIMPLE(SymBool) SUBSTITUTE_SYM_SIMPLE(SymInteger)+SUBSTITUTE_SYM_SIMPLE(SymAlgReal) SUBSTITUTE_SYM_BV(SymIntN) SUBSTITUTE_SYM_BV(SymWordN) SUBSTITUTE_SYM_FUN((=->), (=~>), SymTabularFun)@@ -371,6 +382,7 @@ ''(,,,,,,,,,,,,,,), ''AssertionError, ''VerificationConditions,+ ''NotRepresentableFPError, ''Identity, ''Monoid.Dual, ''Monoid.Sum,
src/Grisette/Internal/Core/Data/Class/SymEq.hs view
@@ -29,7 +29,11 @@ symEq1, SymEq2 (..), symEq2,+ pairwiseSymDistinct, + -- * More 'Eq' helper+ distinct,+ -- * Generic 'SymEq' SymEqArgs (..), GSymEq (..),@@ -53,6 +57,7 @@ import Data.Functor.Sum (Sum) import Data.Int (Int16, Int32, Int64, Int8) import Data.Kind (Type)+import Data.List.NonEmpty (NonEmpty ((:|))) import Data.Monoid (Alt, Ap) import qualified Data.Monoid as Monoid import Data.Ord (Down)@@ -80,9 +85,20 @@ ) import Grisette.Internal.Core.Data.Class.LogicalOp (LogicalOp (symNot, (.&&))) import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con))+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)-import Grisette.Internal.SymPrim.Prim.Term (pevalEqTerm)+import Grisette.Internal.SymPrim.FP+ ( FP,+ FPRoundingMode,+ NotRepresentableFPError,+ ValidFP,+ )+import Grisette.Internal.SymPrim.Prim.Term+ ( SupportedPrim (pevalDistinctTerm),+ pevalEqTerm,+ underlyingTerm,+ )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal)) import Grisette.Internal.SymPrim.SymBV ( SymIntN (SymIntN), SymWordN (SymWordN),@@ -99,14 +115,29 @@ ) import Grisette.Internal.Utils.Derive (Arity0, Arity1) +-- | Check if all elements in a list are distinct.+--+-- Note that empty or singleton lists are always distinct.+--+-- >>> distinct []+-- True+-- >>> distinct [1]+-- True+-- >>> distinct [1, 2, 3]+-- True+-- >>> distinct [1, 2, 2]+-- False+distinct :: (Eq a) => [a] -> Bool+distinct [] = True+distinct [_] = True+distinct (x : xs) = go x xs && distinct xs+ where+ go _ [] = True+ go x' (y : ys) = x' /= y .&& go x' ys+ -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim--- >>> :set -XDataKinds--- >>> :set -XBinaryLiterals--- >>> :set -XFlexibleContexts--- >>> :set -XFlexibleInstances--- >>> :set -XFunctionalDependencies -- | Symbolic equality. Note that we can't use Haskell's 'Eq' class since -- symbolic comparison won't necessarily return a concrete 'Bool' value.@@ -120,10 +151,10 @@ -- -- >>> let a = "a" :: SymInteger -- >>> let b = "b" :: SymInteger--- >>> a ./= b--- (! (= a b))+-- >>> a .== b+-- (= a b) -- >>> a ./= b--- (! (= a b))+-- (distinct a b) -- -- __Note:__ This type class can be derived for algebraic data types. -- You may need the @DerivingVia@ and @DerivingStrategies@ extensions.@@ -139,8 +170,23 @@ a ./= b = symNot $ a .== b {-# INLINE (./=) #-} infix 4 ./=++ -- | Check if all elements in a list are distinct, under the symbolic equality+ -- semantics.+ symDistinct :: [a] -> SymBool+ symDistinct = pairwiseSymDistinct+ {-# MINIMAL (.==) | (./=) #-} +-- | Default pairwise symbolic distinct implementation.+pairwiseSymDistinct :: (SymEq a) => [a] -> SymBool+pairwiseSymDistinct [] = con True+pairwiseSymDistinct [_] = con True+pairwiseSymDistinct (x : xs) = go x xs .&& pairwiseSymDistinct xs+ where+ go _ [] = con True+ go x' (y : ys) = x' ./= y .&& go x' ys+ -- | Lifting of the 'SymEq' class to unary type constructors. -- -- Any instance should be subject to the following law that canonicity is@@ -294,6 +340,7 @@ CONCRETE_SEQ(Ordering) CONCRETE_SEQ_BV(WordN) CONCRETE_SEQ_BV(IntN)+CONCRETE_SEQ(AlgReal) #endif instance (ValidFP eb sb) => SymEq (FP eb sb) where@@ -304,17 +351,30 @@ #define SEQ_SIMPLE(symtype) \ instance SymEq symtype where \ (symtype l) .== (symtype r) = SymBool $ pevalEqTerm l r; \- {-# INLINE (.==) #-}+ {-# INLINE (.==) #-}; \+ l ./= r = symDistinct [l, r]; \+ {-# INLINE (./=) #-}; \+ symDistinct [] = con True; \+ symDistinct [_] = con True; \+ symDistinct (l:ls) = SymBool $ \+ pevalDistinctTerm (underlyingTerm l :| (underlyingTerm <$> ls)) #define SEQ_BV(symtype) \ instance (KnownNat n, 1 <= n) => SymEq (symtype n) where \ (symtype l) .== (symtype r) = SymBool $ pevalEqTerm l r; \- {-# INLINE (.==) #-}+ {-# INLINE (.==) #-}; \+ l ./= r = symDistinct [l, r]; \+ {-# INLINE (./=) #-}; \+ symDistinct [] = con True; \+ symDistinct [_] = con True; \+ symDistinct (l:ls) = SymBool $ \+ pevalDistinctTerm (underlyingTerm l :| (underlyingTerm <$> ls)) #if 1 SEQ_SIMPLE(SymBool) SEQ_SIMPLE(SymInteger) SEQ_SIMPLE(SymFPRoundingMode)+SEQ_SIMPLE(SymAlgReal) SEQ_BV(SymIntN) SEQ_BV(SymWordN) #endif@@ -347,6 +407,7 @@ ''(,,,,,,,,,,,,,,), ''AssertionError, ''VerificationConditions,+ ''NotRepresentableFPError, ''Identity, ''Monoid.Dual, ''Monoid.Sum,
+ src/Grisette/Internal/Core/Data/Class/SymFiniteBits.hs view
@@ -0,0 +1,206 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Internal.Core.Data.Class.SymFiniteBits+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.Core.Data.Class.SymFiniteBits+ ( lsb,+ msb,+ setBitTo,+ bitBlast,+ FromBits (..),+ SymFiniteBits (..),+ symBitBlast,+ symLsb,+ symMsb,+ symPopCount,+ symCountLeadingZeros,+ symCountTrailingZeros,+ )+where++import Data.Bits+ ( Bits (bit, clearBit, setBit, testBit, zeroBits, (.|.)),+ FiniteBits (finiteBitSize),+ )+import Data.Int (Int16, Int32, Int64, Int8)+import Data.Word (Word16, Word32, Word64, Word8)+import GHC.TypeLits (KnownNat, type (<=))+import Grisette.Internal.Core.Data.Class.BitVector+ ( BV (bv, bvSelect),+ )+import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp (symIte))+import Grisette.Internal.Core.Data.Class.SymEq (SymEq ((.==)))+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.SomeBV+ ( SomeBV (SomeBV),+ SomeIntN,+ SomeWordN,+ unsafeSomeBV,+ )+import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)+import Grisette.Internal.SymPrim.SymBool (SymBool)++-- | Set a bit in a concrete value to a specific value.+setBitTo :: (Bits a) => a -> Int -> Bool -> a+setBitTo v i b = if b then setBit v i else clearBit v i++-- | Bit-blast a concrete value into a list of concrete bits. The first element+-- in the resulting list corresponds to the least significant bit.+bitBlast :: (FiniteBits a) => a -> [Bool]+bitBlast x = map (testBit x) [0 .. finiteBitSize x - 1]++-- | Extract the least significant bit of a concrete value.+lsb :: (Bits a) => a -> Bool+lsb x = testBit x 0++-- | Extract the most significant bit of a concrete value.+msb :: (FiniteBits a) => a -> Bool+msb x = testBit x (finiteBitSize x - 1)++-- | Type class for assembling concrete bits to a bit-vector.+class (FiniteBits a) => FromBits a where+ -- | Assembling concrete bits to a bit-vector. The first boolean value in the+ -- list corresponding to the least signification value.+ fromBits :: [Bool] -> a+ fromBits bits+ | length bits /= finiteBitSize (undefined :: a) =+ error "fromBits: length mismatch"+ | otherwise = foldl1 (.|.) lst+ where+ lst :: [a]+ lst = (\(pos, b) -> if b then bit pos else zeroBits) <$> zip [0 ..] bits++instance FromBits Int++instance FromBits Int8++instance FromBits Int16++instance FromBits Int32++instance FromBits Int64++instance FromBits Word++instance FromBits Word8++instance FromBits Word16++instance FromBits Word32++instance FromBits Word64++instance (KnownNat n, 1 <= n) => FromBits (WordN n)++instance (KnownNat n, 1 <= n) => FromBits (IntN n)++instance FromBits SomeIntN where+ fromBits bits+ | null bits =+ error "Cannot create a SomeBV from an empty list of bits."+ fromBits bits = unsafeSomeBV (length bits) $ \_ -> fromBits bits++instance FromBits SomeWordN where+ fromBits bits+ | null bits =+ error "Cannot create a SomeBV from an empty list of bits."+ fromBits bits = unsafeSomeBV (length bits) $ \_ -> fromBits bits++-- | A class for symbolic finite bit operations.+class (FiniteBits a, ITEOp a) => SymFiniteBits a where+ -- | Test a symbolic bit in a symbolic bit-vector.+ symTestBit :: a -> Int -> SymBool++ -- | Set a bit in a symbolic value to a specific value.+ symSetBitTo :: a -> Int -> SymBool -> a+ symSetBitTo v i b = symIte b (setBit v i) (clearBit v i)++ -- | Assembling symbolic bits to a symbolic bit-vector. The first symbolic+ -- boolean value in the list corresponding to the least signification value.+ symFromBits :: [SymBool] -> a++instance SymFiniteBits (SomeBV SymIntN) where+ symTestBit v i = bvSelect i 1 v .== bv 1 1+ symFromBits bits+ | null bits =+ error "Cannot create a SomeBV from an empty list of bits."+ symFromBits bits = unsafeSomeBV (length bits) $ \_ -> symFromBits bits++instance SymFiniteBits (SomeBV SymWordN) where+ symTestBit v i = bvSelect i 1 v .== bv 1 1+ symFromBits bits+ | null bits =+ error "Cannot create a SomeBV from an empty list of bits."+ symFromBits bits = unsafeSomeBV (length bits) $ \_ -> symFromBits bits++instance (KnownNat n, 1 <= n) => SymFiniteBits (SymIntN n) where+ symTestBit v = symTestBit (SomeBV v)+ symSetBitTo v i b = symIte b (setBit v i) (clearBit v i)+ symFromBits bits+ | length bits /= finiteBitSize (undefined :: SymWordN n) =+ error "symFromBits: length mismatch"+ | otherwise = foldl1 (.|.) lst+ where+ lst :: [SymIntN n]+ lst = (\(pos, b) -> symIte b (setBit 0 pos) 0) <$> zip [0 ..] bits++instance (KnownNat n, 1 <= n) => SymFiniteBits (SymWordN n) where+ symTestBit v = symTestBit (SomeBV v)+ symSetBitTo v i b = symIte b (setBit v i) (clearBit v i)+ symFromBits bits+ | length bits /= finiteBitSize (undefined :: SymWordN n) =+ error "symFromBits: length mismatch"+ | otherwise = foldl1 (.|.) lst+ where+ lst :: [SymWordN n]+ lst = (\(pos, b) -> symIte b (setBit 0 pos) 0) <$> zip [0 ..] bits++-- | Bit-blast a symbolic value into a list of symbolic bits. The first element+-- in the resulting list corresponds to the least significant bit.+symBitBlast :: (SymFiniteBits a) => a -> [SymBool]+symBitBlast x = map (symTestBit x) [0 .. finiteBitSize x - 1]++-- | Extract the least significant bit of a symbolic value.+symLsb :: (SymFiniteBits a) => a -> SymBool+symLsb x = symTestBit x 0++-- | Extract the most significant bit of a symbolic value.+symMsb :: (SymFiniteBits a) => a -> SymBool+symMsb x = symTestBit x (finiteBitSize x - 1)++-- | Count the number of set bits in a symbolic value.+symPopCount :: (Num b, ITEOp b, SymFiniteBits a) => a -> b+symPopCount v = sum $ (\b -> symIte b 1 0) <$> symBitBlast v++-- | Count the number of leading zeros in a symbolic value.+symCountLeadingZeros :: (Num b, ITEOp b, SymFiniteBits a) => a -> b+symCountLeadingZeros v = go bits rs+ where+ bits = reverse $ symBitBlast v+ rs = fromIntegral <$> [0 ..]+ go [] (r : _) = r+ go (b : bs) (r : rs) = symIte b r (go bs rs)+ go _ [] = error "Should not happen"++-- | Count the number of trailing zeros in a symbolic value.+symCountTrailingZeros :: (Num b, ITEOp b, SymFiniteBits a) => a -> b+symCountTrailingZeros v = go bits rs+ where+ bits = symBitBlast v+ rs = fromIntegral <$> [0 ..]+ go [] (r : _) = r+ go (b : bs) (r : rs) = symIte b r (go bs rs)+ go _ [] = error "Should not happen"
+ src/Grisette/Internal/Core/Data/Class/SymFromIntegral.hs view
@@ -0,0 +1,110 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Internal.Core.Data.Class.SymFromIntegral+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.Core.Data.Class.SymFromIntegral+ ( SymFromIntegral (..),+ )+where++import GHC.TypeLits (KnownNat, type (<=))+import Grisette.Internal.SymPrim.FP (ValidFP)+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( PEvalFromIntegralTerm (pevalFromIntegralTerm),+ )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal))+import Grisette.Internal.SymPrim.SymBV (SymIntN (SymIntN), SymWordN (SymWordN))+import Grisette.Internal.SymPrim.SymFP (SymFP (SymFP))+import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger))++-- | Conversion from a symbolic integral type.+class SymFromIntegral from to where+ symFromIntegral :: from -> to++instance SymFromIntegral SymInteger SymInteger where+ symFromIntegral = id+ {-# INLINE symFromIntegral #-}++instance SymFromIntegral SymInteger SymAlgReal where+ symFromIntegral (SymInteger x) = SymAlgReal $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance (KnownNat n, 1 <= n) => SymFromIntegral SymInteger (SymWordN n) where+ symFromIntegral (SymInteger x) = SymWordN $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance (KnownNat n, 1 <= n) => SymFromIntegral SymInteger (SymIntN n) where+ symFromIntegral (SymInteger x) = SymIntN $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance (ValidFP eb sb) => SymFromIntegral SymInteger (SymFP eb sb) where+ symFromIntegral (SymInteger x) = SymFP $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance (KnownNat n, 1 <= n) => SymFromIntegral (SymWordN n) SymInteger where+ symFromIntegral (SymWordN x) = SymInteger $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance+ (KnownNat n, KnownNat m, 1 <= n, 1 <= m) =>+ SymFromIntegral (SymWordN n) (SymWordN m)+ where+ symFromIntegral (SymWordN x) = SymWordN $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance (KnownNat n, 1 <= n) => SymFromIntegral (SymWordN n) SymAlgReal where+ symFromIntegral (SymWordN x) = SymAlgReal $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance+ (KnownNat n, KnownNat m, 1 <= n, 1 <= m) =>+ SymFromIntegral (SymWordN n) (SymIntN m)+ where+ symFromIntegral (SymWordN x) = SymIntN $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance+ (KnownNat n, 1 <= n, ValidFP eb sb) =>+ SymFromIntegral (SymWordN n) (SymFP eb sb)+ where+ symFromIntegral (SymWordN x) = SymFP $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance (KnownNat n, 1 <= n) => SymFromIntegral (SymIntN n) SymInteger where+ symFromIntegral (SymIntN x) = SymInteger $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance+ (KnownNat n, KnownNat m, 1 <= n, 1 <= m) =>+ SymFromIntegral (SymIntN n) (SymWordN m)+ where+ symFromIntegral (SymIntN x) = SymWordN $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance (KnownNat n, 1 <= n) => SymFromIntegral (SymIntN n) SymAlgReal where+ symFromIntegral (SymIntN x) = SymAlgReal $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance+ (KnownNat n, KnownNat m, 1 <= n, 1 <= m) =>+ SymFromIntegral (SymIntN n) (SymIntN m)+ where+ symFromIntegral (SymIntN x) = SymIntN $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}++instance+ (KnownNat n, 1 <= n, ValidFP eb sb) =>+ SymFromIntegral (SymIntN n) (SymFP eb sb)+ where+ symFromIntegral (SymIntN x) = SymFP $ pevalFromIntegralTerm x+ {-# INLINE symFromIntegral #-}
+ src/Grisette/Internal/Core/Data/Class/SymIEEEFP.hs view
@@ -0,0 +1,125 @@+{-# LANGUAGE DerivingVia #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Internal.Core.Data.Class.SymIEEEFP+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.Core.Data.Class.SymIEEEFP+ ( SymIEEEFPTraits (..),+ )+where++import Grisette.Internal.Core.Data.Class.IEEEFP+ ( fpIsInfinite,+ fpIsNaN,+ fpIsNegative,+ fpIsNegativeInfinite,+ fpIsNegativeZero,+ fpIsNormal,+ fpIsPoint,+ fpIsPositive,+ fpIsPositiveInfinite,+ fpIsPositiveZero,+ fpIsSubnormal,+ fpIsZero,+ )+import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con))+import Grisette.Internal.SymPrim.FP (FP, ValidFP)+import Grisette.Internal.SymPrim.SymBool (SymBool)++-- | A class for symbolic traits of IEEE floating-point numbers.+class SymIEEEFPTraits a where+ -- | Check if a symbolic floating-point number is not-a-number.+ symFpIsNaN :: a -> SymBool++ -- | Check if a symbolic floating-point number is positive.+ -- +0, +inf are considered positive. nan, -0, -inf are not positive.+ symFpIsPositive :: a -> SymBool++ -- | Check if a symbolic floating-point number is negative.+ -- -0, -inf are considered negative. nan, +0, +inf are not negative.+ symFpIsNegative :: a -> SymBool++ -- | Check if a symbolic floating-point number is positive infinite.+ symFpIsPositiveInfinite :: a -> SymBool++ -- | Check if a symbolic floating-point number is negative infinite.+ symFpIsNegativeInfinite :: a -> SymBool++ -- | Check if a symbolic floating-point number is infinite.+ symFpIsInfinite :: a -> SymBool++ -- | Check if a symbolic floating-point number is positive zero.+ symFpIsPositiveZero :: a -> SymBool++ -- | Check if a symbolic floating-point number is negative zero.+ symFpIsNegativeZero :: a -> SymBool++ -- | Check if a symbolic floating-point number is zero.+ symFpIsZero :: a -> SymBool++ -- | Check if a symbolic floating-point number is normal, i.e., not 0, not+ -- inf, not nan, and not denormalized.+ symFpIsNormal :: a -> SymBool++ -- | Check if a symbolic floating-point number is subnormal, i.e.,+ -- denormalized. 0, inf, or nan are not subnormal.+ symFpIsSubnormal :: a -> SymBool++ -- | Check if a symbolic floating-point number is a point, i.e., not inf, not+ -- nan.+ symFpIsPoint :: a -> SymBool++newtype ConcreteFloat f = ConcreteFloat f++instance (RealFloat f) => SymIEEEFPTraits (ConcreteFloat f) where+ symFpIsNaN (ConcreteFloat x) = con $ fpIsNaN x+ {-# INLINE symFpIsNaN #-}++ symFpIsPositive (ConcreteFloat x) = con $ fpIsPositive x+ {-# INLINE symFpIsPositive #-}++ symFpIsNegative (ConcreteFloat x) = con $ fpIsNegative x+ {-# INLINE symFpIsNegative #-}++ symFpIsInfinite (ConcreteFloat x) = con $ fpIsInfinite x+ {-# INLINE symFpIsInfinite #-}++ symFpIsPositiveInfinite (ConcreteFloat x) = con $ fpIsPositiveInfinite x+ {-# INLINE symFpIsPositiveInfinite #-}++ symFpIsNegativeInfinite (ConcreteFloat x) = con $ fpIsNegativeInfinite x+ {-# INLINE symFpIsNegativeInfinite #-}++ symFpIsPositiveZero (ConcreteFloat x) = con $ fpIsPositiveZero x+ {-# INLINE symFpIsPositiveZero #-}++ symFpIsNegativeZero (ConcreteFloat x) = con $ fpIsNegativeZero x+ {-# INLINE symFpIsNegativeZero #-}++ symFpIsZero (ConcreteFloat x) = con $ fpIsZero x+ {-# INLINE symFpIsZero #-}++ symFpIsNormal (ConcreteFloat x) = con $ fpIsNormal x+ {-# INLINE symFpIsNormal #-}++ symFpIsSubnormal (ConcreteFloat x) = con $ fpIsSubnormal x+ {-# INLINE symFpIsSubnormal #-}++ symFpIsPoint (ConcreteFloat x) = con $ fpIsPoint x+ {-# INLINE symFpIsPoint #-}++deriving via (ConcreteFloat Float) instance SymIEEEFPTraits Float++deriving via (ConcreteFloat Double) instance SymIEEEFPTraits Double++deriving via+ (ConcreteFloat (FP eb sb))+ instance+ (ValidFP eb sb) => SymIEEEFPTraits (FP eb sb)
src/Grisette/Internal/Core/Data/Class/SymOrd.hs view
@@ -99,13 +99,19 @@ mrgIf, ) import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con))-import Grisette.Internal.Core.Data.Class.SymEq (GSymEq, SymEq ((.==)), SymEq1, SymEq2)+import Grisette.Internal.Core.Data.Class.SymEq+ ( GSymEq,+ SymEq ((.==)),+ SymEq1,+ SymEq2,+ ) import Grisette.Internal.Core.Data.Class.TryMerge ( mrgSingle, tryMerge, )+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)+import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, NotRepresentableFPError, ValidFP) import Grisette.Internal.SymPrim.Prim.Term ( PEvalOrdTerm ( pevalLeOrdTerm,@@ -114,6 +120,7 @@ pevalGeOrdTerm, pevalGtOrdTerm, )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal)) import Grisette.Internal.SymPrim.SymBV ( SymIntN (SymIntN), SymWordN (SymWordN),@@ -133,11 +140,6 @@ -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim--- >>> :set -XDataKinds--- >>> :set -XBinaryLiterals--- >>> :set -XFlexibleContexts--- >>> :set -XFlexibleInstances--- >>> :set -XFunctionalDependencies -- | Symbolic total order. Note that we can't use Haskell's 'Ord' class since -- symbolic comparison won't necessarily return a concrete 'Bool' or 'Ordering'@@ -424,6 +426,7 @@ CONCRETE_SORD(Ordering) CONCRETE_SORD_BV(WordN) CONCRETE_SORD_BV(IntN)+CONCRETE_SORD(AlgReal) #endif instance (ValidFP eb sb) => SymOrd (FP eb sb) where@@ -497,6 +500,7 @@ #if 1 SORD_SIMPLE(SymInteger)+SORD_SIMPLE(SymAlgReal) SORD_SIMPLE(SymFPRoundingMode) SORD_BV(SymIntN) SORD_BV(SymWordN)@@ -554,6 +558,7 @@ ''(,,,,,,,,,,,,,,), ''AssertionError, ''VerificationConditions,+ ''NotRepresentableFPError, ''Identity, ''Monoid.Dual, ''Monoid.Sum,
src/Grisette/Internal/Core/Data/Class/ToCon.hs view
@@ -80,22 +80,24 @@ ( AssertionError, VerificationConditions, )-import Grisette.Internal.Core.Data.Class.BitCast (BitCast (bitCast))+import Grisette.Internal.Core.Data.Class.BitCast (bitCastOrCanonical) import Grisette.Internal.Core.Data.Class.Solvable ( Solvable (conView), pattern Con, )+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV ( IntN (IntN), WordN (WordN), )-import Grisette.Internal.SymPrim.FP (FP, FP32, FP64, FPRoundingMode, ValidFP)+import Grisette.Internal.SymPrim.FP (FP, FP32, FP64, FPRoundingMode, NotRepresentableFPError, ValidFP) import Grisette.Internal.SymPrim.GeneralFun (type (-->)) import Grisette.Internal.SymPrim.IntBitwidth (intBitwidthQ) import Grisette.Internal.SymPrim.Prim.Term ( LinkedRep, SupportedPrim, )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal) import Grisette.Internal.SymPrim.SymBV ( SymIntN, SymWordN,@@ -316,6 +318,7 @@ #if 1 TO_CON_SYMID_SIMPLE(SymBool) TO_CON_SYMID_SIMPLE(SymInteger)+TO_CON_SYMID_SIMPLE(SymAlgReal) TO_CON_SYMID_BV(SymIntN) TO_CON_SYMID_BV(SymWordN) TO_CON_SYMID_FUN(=~>)@@ -342,6 +345,7 @@ #if 1 TO_CON_FROMSYM_SIMPLE(Bool, SymBool) TO_CON_FROMSYM_SIMPLE(Integer, SymInteger)+TO_CON_FROMSYM_SIMPLE(AlgReal, SymAlgReal) TO_CON_FROMSYM_BV(IntN, SymIntN) TO_CON_FROMSYM_BV(WordN, SymWordN) TO_CON_FROMSYM_FUN((=->), (=~>))@@ -371,11 +375,11 @@ #endif instance ToCon SymFP32 Float where- toCon (Con (fp :: FP32)) = Just $ bitCast fp+ toCon (Con (fp :: FP32)) = Just $ bitCastOrCanonical fp toCon _ = Nothing instance ToCon SymFP64 Double where- toCon (Con (fp :: FP64)) = Just $ bitCast fp+ toCon (Con (fp :: FP64)) = Just $ bitCastOrCanonical fp toCon _ = Nothing deriveBuiltins@@ -401,6 +405,7 @@ ''(,,,,,,,,,,,,,,), ''AssertionError, ''VerificationConditions,+ ''NotRepresentableFPError, ''Monoid.Dual, ''Monoid.Sum, ''Monoid.Product,
src/Grisette/Internal/Core/Data/Class/ToSym.hs view
@@ -4,11 +4,15 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE Trustworthy #-}+{-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-}@@ -81,18 +85,32 @@ VerificationConditions, ) import Grisette.Internal.Core.Data.Class.BitCast (BitCast (bitCast))+import Grisette.Internal.Core.Data.Class.Mergeable+ ( GMergeable,+ Mergeable,+ Mergeable1,+ Mergeable2,+ resolveMergeable1,+ ) import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con))+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV ( IntN, WordN, )-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)+import Grisette.Internal.SymPrim.FP+ ( FP,+ FPRoundingMode,+ NotRepresentableFPError,+ ValidFP,+ ) import Grisette.Internal.SymPrim.GeneralFun (type (-->)) import Grisette.Internal.SymPrim.IntBitwidth (intBitwidthQ) import Grisette.Internal.SymPrim.Prim.Term ( LinkedRep, SupportedPrim, )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal) import Grisette.Internal.SymPrim.SymBV ( SymIntN, SymWordN,@@ -118,7 +136,7 @@ -- >>> import Grisette.SymPrim -- | Convert a concrete value to symbolic value.-class ToSym a b where+class (Mergeable b) => ToSym a b where -- | Convert a concrete value to symbolic value. -- -- >>> toSym False :: SymBool@@ -128,14 +146,17 @@ -- [false,true] toSym :: a -> b -instance {-# INCOHERENT #-} ToSym a a where+instance {-# INCOHERENT #-} (Mergeable a) => ToSym a a where toSym = id {-# INLINE toSym #-} -- | Lifting of 'ToSym' to unary type constructors.-class (forall a b. (ToSym a b) => ToSym (f1 a) (f2 b)) => ToSym1 f1 f2 where+class+ (forall a b. (ToSym a b) => ToSym (f1 a) (f2 b), Mergeable1 f2) =>+ ToSym1 f1 f2+ where -- | Lift a conversion to symbolic function to unary type constructors.- liftToSym :: (a -> b) -> f1 a -> f2 b+ liftToSym :: (Mergeable b) => (a -> b) -> f1 a -> f2 b -- | Lift the standard 'toSym' to unary type constructors. toSym1 :: (ToSym1 f1 f2, ToSym a b) => f1 a -> f2 b@@ -143,7 +164,10 @@ {-# INLINE toSym1 #-} -- | Lifting of 'ToSym' to binary type constructors.-class (forall a b. (ToSym a b) => ToSym1 (f1 a) (f2 b)) => ToSym2 f1 f2 where+class+ (forall a b. (ToSym a b) => ToSym1 (f1 a) (f2 b), Mergeable2 f2) =>+ ToSym2 f1 f2+ where -- | Lift conversion to symbolic functions to binary type constructors. liftToSym2 :: (a -> b) -> (c -> d) -> f1 a c -> f2 b d @@ -159,7 +183,8 @@ data instance ToSymArgs Arity0 _ _ = ToSymArgs0 -newtype instance ToSymArgs Arity1 a b = ToSymArgs1 (a -> b)+data instance ToSymArgs Arity1 _ _ where+ ToSymArgs1 :: (Mergeable b) => (a -> b) -> ToSymArgs Arity1 a b -- | The class of types that can be generically converted to symbolic values. class GToSym arity f1 f2 where@@ -205,10 +230,10 @@ {-# INLINE gtoSym #-} instance- (ToSym1 f1 f2, GToSym Arity1 g1 g2) =>+ (ToSym1 f1 f2, GToSym Arity1 g1 g2, Mergeable1 g2) => GToSym Arity1 (f1 :.: g1) (f2 :.: g2) where- gtoSym targs (Comp1 a) = Comp1 $ liftToSym (gtoSym targs) a+ gtoSym targs@ToSymArgs1 {} (Comp1 a) = Comp1 $ liftToSym (gtoSym targs) a {-# INLINE gtoSym #-} -- | Generic 'toSym' function.@@ -221,7 +246,7 @@ -- | Generic 'liftToSym' function. genericLiftToSym ::- (Generic1 f1, Generic1 f2, GToSym Arity1 (Rep1 f1) (Rep1 f2)) =>+ (Generic1 f1, Generic1 f2, GToSym Arity1 (Rep1 f1) (Rep1 f2), Mergeable b) => (a -> b) -> f1 a -> f2 b@@ -229,20 +254,33 @@ {-# INLINE genericLiftToSym #-} instance- (Generic a, Generic b, GToSym Arity0 (Rep a) (Rep b)) =>+ ( Generic a,+ Generic b,+ GToSym Arity0 (Rep a) (Rep b),+ GMergeable Arity0 (Rep b)+ ) => ToSym a (Default b) where toSym = Default . genericToSym {-# INLINE toSym #-} instance- (Generic1 f1, Generic1 f2, GToSym Arity1 (Rep1 f1) (Rep1 f2), ToSym a b) =>+ ( Generic1 f1,+ Generic1 f2,+ GToSym Arity1 (Rep1 f1) (Rep1 f2),+ ToSym a b,+ GMergeable Arity1 (Rep1 f2)+ ) => ToSym (f1 a) (Default1 f2 b) where toSym = toSym1 instance- (Generic1 f1, Generic1 f2, GToSym Arity1 (Rep1 f1) (Rep1 f2)) =>+ ( Generic1 f1,+ Generic1 f2,+ GToSym Arity1 (Rep1 f1) (Rep1 f2),+ GMergeable Arity1 (Rep1 f2)+ ) => ToSym1 f1 (Default1 f2) where liftToSym f = Default1 . genericLiftToSym f@@ -293,17 +331,19 @@ 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 \+#define TO_SYM_SYMID_FUN(cop, op) \+instance (SupportedPrim (cop ca cb), LinkedRep ca sa, LinkedRep cb sb) => \+ ToSym (op sa sb) (op sa sb) where \ toSym = id #if 1 TO_SYM_SYMID_SIMPLE(SymBool) TO_SYM_SYMID_SIMPLE(SymInteger)+TO_SYM_SYMID_SIMPLE(SymAlgReal) TO_SYM_SYMID_BV(SymIntN) TO_SYM_SYMID_BV(SymWordN)-TO_SYM_SYMID_FUN(=~>)-TO_SYM_SYMID_FUN(-~>)+TO_SYM_SYMID_FUN((=->), (=~>))+TO_SYM_SYMID_FUN((-->), (-~>)) TO_SYM_SYMID_SIMPLE(SymFPRoundingMode) #endif @@ -326,6 +366,7 @@ #if 1 TO_SYM_FROMCON_SIMPLE(Bool, SymBool) TO_SYM_FROMCON_SIMPLE(Integer, SymInteger)+TO_SYM_FROMCON_SIMPLE(AlgReal, SymAlgReal) TO_SYM_FROMCON_BV(IntN, SymIntN) TO_SYM_FROMCON_BV(WordN, SymWordN) TO_SYM_FROMCON_FUN((=->), (=~>))@@ -384,6 +425,7 @@ ''(,,,,,,,,,,,,,,), ''AssertionError, ''VerificationConditions,+ ''NotRepresentableFPError, ''Monoid.Dual, ''Monoid.Sum, ''Monoid.Product,@@ -483,14 +525,14 @@ -- StateT instance- (ToSym1 m1 m2, ToSym a1 a2) =>+ (ToSym1 m1 m2, ToSym a1 a2, Mergeable s) => ToSym (StateLazy.StateT s m1 a1) (StateLazy.StateT s m2 a2) where toSym = toSym1 {-# INLINE toSym #-} instance- (ToSym1 m1 m2) =>+ (ToSym1 m1 m2, Mergeable s) => ToSym1 (StateLazy.StateT s m1) (StateLazy.StateT s m2) where liftToSym f (StateLazy.StateT f1) =@@ -498,14 +540,14 @@ {-# INLINE liftToSym #-} instance- (ToSym1 m1 m2, ToSym a1 a2) =>+ (ToSym1 m1 m2, ToSym a1 a2, Mergeable s) => ToSym (StateStrict.StateT s m1 a1) (StateStrict.StateT s m2 a2) where toSym = toSym1 {-# INLINE toSym #-} instance- (ToSym1 m1 m2) =>+ (ToSym1 m1 m2, Mergeable s) => ToSym1 (StateStrict.StateT s m1) (StateStrict.StateT s m2) where liftToSym f (StateStrict.StateT f1) =@@ -521,10 +563,19 @@ {-# INLINE toSym #-} instance- (ToSym s2 s1, ToSym1 m1 m2) =>+ (ToSym s2 s1, ToSym1 m1 m2, Mergeable1 m2) => ToSym1 (ReaderT s1 m1) (ReaderT s2 m2) where- liftToSym f (ReaderT f1) = ReaderT $ liftToSym (liftToSym f) f1+ liftToSym ::+ forall a b.+ (ToSym s2 s1, ToSym1 m1 m2, Mergeable1 m2, Mergeable b) =>+ (a -> b) ->+ ReaderT s1 m1 a ->+ ReaderT s2 m2 b+ liftToSym f (ReaderT f1) =+ resolveMergeable1 @m2 @b $+ ReaderT $+ liftToSym (liftToSym f) f1 {-# INLINE liftToSym #-} -- IdentityT@@ -596,7 +647,14 @@ (ToSym1 f0 f, ToSym1 g0 g) => ToSym1 (Compose f0 g0) (Compose f g) where- liftToSym f (Compose v) = Compose $ liftToSym (liftToSym f) v+ liftToSym ::+ forall a b.+ (ToSym1 f0 f, ToSym1 g0 g, Mergeable b) =>+ (a -> b) ->+ Compose f0 g0 a ->+ Compose f g b+ liftToSym f (Compose v) =+ resolveMergeable1 @g @b $ Compose $ liftToSym (liftToSym f) v {-# INLINE liftToSym #-} -- Const
src/Grisette/Internal/Core/Data/Symbol.hs view
@@ -29,6 +29,8 @@ Symbol (..), simple, indexed,+ symbolIdentifier,+ modifyIdentifier, ) where @@ -159,7 +161,6 @@ -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim--- >>> :set -XTemplateHaskell -- File location type. data FileLocation = FileLocation@@ -222,6 +223,16 @@ SimpleSymbol :: Identifier -> Symbol IndexedSymbol :: Identifier -> Int -> Symbol deriving (Eq, Ord, Generic, Lift, NFData, Hashable)++-- | Get the identifier of a symbol.+symbolIdentifier :: Symbol -> Identifier+symbolIdentifier (SimpleSymbol i) = i+symbolIdentifier (IndexedSymbol i _) = i++-- | Modify the identifier of a symbol.+modifyIdentifier :: (Identifier -> Identifier) -> Symbol -> Symbol+modifyIdentifier f (SimpleSymbol i) = SimpleSymbol (f i)+modifyIdentifier f (IndexedSymbol i idx) = IndexedSymbol (f i) idx instance Show Symbol where show (SimpleSymbol i) = show i
+ src/Grisette/Internal/SymPrim/AlgReal.hs view
@@ -0,0 +1,182 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++-- |+-- Module : Grisette.Internal.SymPrim.AlgReal+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.SymPrim.AlgReal+ ( AlgRealPoly (..),+ UnsupportedAlgRealOperation (..),+ toSBVAlgReal,+ fromSBVAlgReal,+ RealPoint (..),+ AlgReal (..),+ )+where++import Control.DeepSeq (NFData)+import Control.Exception (Exception, throw)+import Data.Hashable (Hashable)+import qualified Data.SBV as SBV+import qualified Data.SBV.Internals as SBV+import GHC.Generics (Generic)+import Language.Haskell.TH.Syntax (Lift)+import Test.QuickCheck (Arbitrary)+import Test.QuickCheck.Arbitrary (Arbitrary (arbitrary))++-- | A univariate polynomial with integer coefficients.+--+-- For instance, @5x^3+2x-5@ is represented as+-- @v'AlgRealPoly' [(5, 3), (2, 1), (-5, 0)]@.+newtype AlgRealPoly = AlgRealPoly [(Integer, Integer)]+ deriving (Eq, Generic, Lift)+ deriving newtype (Hashable, NFData)++-- | Boundary point for real intervals.+data RealPoint+ = -- | Open point.+ OpenPoint Rational+ | -- | Closed point.+ ClosedPoint Rational+ deriving (Eq, Generic, Lift)+ deriving anyclass (Hashable, NFData)++toSBVRealPoint :: RealPoint -> SBV.RealPoint Rational+toSBVRealPoint (OpenPoint r) = SBV.OpenPoint r+toSBVRealPoint (ClosedPoint r) = SBV.ClosedPoint r++fromSBVRealPoint :: SBV.RealPoint Rational -> RealPoint+fromSBVRealPoint (SBV.OpenPoint r) = OpenPoint r+fromSBVRealPoint (SBV.ClosedPoint r) = ClosedPoint r++-- | Algebraic real numbers. The representation can be abstract for+-- roots-of-polynomials or intervals.+data AlgReal where+ -- | Exact rational number.+ AlgExactRational :: Rational -> AlgReal+ -- | Inexact rational numbers. SMT-solver return it with ? at the end.+ AlgInexactRational :: Rational -> AlgReal+ -- | Algebraic real number as a root of a polynomial.+ AlgPolyRoot ::+ -- | Which root is it?+ Integer ->+ -- | Polynomial defining equation.+ AlgRealPoly ->+ -- | Approximate decimal representation.+ Maybe String ->+ AlgReal+ -- | Interval with low and high bounds.+ AlgInterval ::+ -- | Lower bound.+ RealPoint ->+ -- | Upper bound.+ RealPoint ->+ AlgReal+ deriving (Generic, Lift)+ deriving anyclass (Hashable, NFData)++-- | Convert algebraic real numbers to SBV's algebraic real numbers.+toSBVAlgReal :: AlgReal -> SBV.AlgReal+toSBVAlgReal (AlgExactRational r) = SBV.AlgRational True r+toSBVAlgReal (AlgInexactRational r) = SBV.AlgRational False r+toSBVAlgReal (AlgPolyRoot i (AlgRealPoly ps) approx) =+ SBV.AlgPolyRoot (i, SBV.AlgRealPoly ps) approx+toSBVAlgReal (AlgInterval l u) =+ SBV.AlgInterval (toSBVRealPoint l) (toSBVRealPoint u)++-- | Convert SBV's algebraic real numbers to algebraic real numbers.+fromSBVAlgReal :: SBV.AlgReal -> AlgReal+fromSBVAlgReal (SBV.AlgRational True r) = AlgExactRational r+fromSBVAlgReal (SBV.AlgRational False r) = AlgInexactRational r+fromSBVAlgReal (SBV.AlgPolyRoot (i, SBV.AlgRealPoly ps) approx) =+ AlgPolyRoot i (AlgRealPoly ps) approx+fromSBVAlgReal (SBV.AlgInterval l u) =+ AlgInterval (fromSBVRealPoint l) (fromSBVRealPoint u)++instance Show AlgReal where+ show r = show $ toSBVAlgReal r++-- | Exception for unsupported operations on algebraic real numbers.+--+-- We only support operations on exact rationals.+data UnsupportedAlgRealOperation = UnsupportedAlgRealOperation+ { op :: String,+ msg :: String+ }+ deriving anyclass (Exception)++instance Show UnsupportedAlgRealOperation where+ show (UnsupportedAlgRealOperation op msg) =+ "AlgReal."+ ++ op+ ++ ": unsupported operation on algebraic rationals, only support exact "+ ++ "rationals"+ ++ ": "+ ++ msg++op1 :: String -> (Rational -> Rational) -> AlgReal -> AlgReal+op1 _ f (AlgExactRational r) = AlgExactRational $ f r+op1 name _ r =+ throw+ UnsupportedAlgRealOperation {op = name, msg = show r}++op2 ::+ String ->+ (Rational -> Rational -> Rational) ->+ AlgReal ->+ AlgReal ->+ AlgReal+op2 _ f (AlgExactRational l) (AlgExactRational r) = AlgExactRational $ f l r+op2 name _ l r =+ throw+ UnsupportedAlgRealOperation+ { op = name,+ msg = show l <> " and " <> show r+ }++instance Eq AlgReal where+ (AlgExactRational l) == (AlgExactRational r) = l == r+ l == r =+ throw $+ UnsupportedAlgRealOperation "==" $+ show l <> " and " <> show r++instance Ord AlgReal where+ compare (AlgExactRational l) (AlgExactRational r) = compare l r+ compare l r =+ throw $+ UnsupportedAlgRealOperation "compare" $+ show l <> " and " <> show r++instance Num AlgReal where+ (+) = op2 "+" (+)+ (*) = op2 "*" (*)+ (-) = op2 "-" (-)+ negate = op1 "negate" negate+ abs = op1 "abs" abs+ signum = op1 "signum" signum+ fromInteger = AlgExactRational . fromInteger++-- | Unlike sbv, we throw the error when divided by zero happens+instance Fractional AlgReal where+ (/) = op2 "/" (/)+ fromRational = AlgExactRational++instance Real AlgReal where+ toRational (AlgExactRational r) = r+ toRational r =+ throw $+ UnsupportedAlgRealOperation "toRational" $+ show r++instance Arbitrary AlgReal where+ arbitrary = AlgExactRational <$> arbitrary
src/Grisette/Internal/SymPrim/AllSyms.hs view
@@ -5,6 +5,7 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE RankNTypes #-}@@ -80,6 +81,7 @@ ( AssertionError, VerificationConditions, )+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP) import Grisette.Internal.SymPrim.Prim.SomeTerm@@ -87,7 +89,7 @@ ) import Grisette.Internal.SymPrim.Prim.Term ( LinkedRep (underlyingTerm),- pformat,+ pformatTerm, ) import Grisette.Internal.SymPrim.Prim.TermUtils ( someTermsSize,@@ -105,14 +107,13 @@ -- >>> import Grisette.SymPrim -- >>> import Grisette.Backend -- >>> import Data.Proxy--- >>> :set -XOverloadedStrings -- | Some symbolic value with 'LinkedRep' constraint. data SomeSym where SomeSym :: (LinkedRep con sym) => sym -> SomeSym instance Show SomeSym where- show (SomeSym s) = pformat $ underlyingTerm s+ show (SomeSym s) = pformatTerm $ underlyingTerm s -- | Extract all symbolic primitive values that are represented as SMT terms. --@@ -460,6 +461,7 @@ CONCRETE_ALLSYMS(FPRoundingMode) CONCRETE_ALLSYMS_BV(WordN) CONCRETE_ALLSYMS_BV(IntN)+CONCRETE_ALLSYMS(AlgReal) #endif instance (ValidFP eb sb) => AllSyms (FP eb sb) where
src/Grisette/Internal/SymPrim/BV.hs view
@@ -26,8 +26,7 @@ -- Stability : Experimental -- Portability : GHC only module Grisette.Internal.SymPrim.BV- ( BitwidthMismatch (..),- IntN (..),+ ( IntN (..), IntN8, IntN16, IntN32,@@ -44,7 +43,6 @@ import Control.DeepSeq (NFData) import Control.Exception ( ArithException (Overflow),- Exception (displayException), throw, ) import Data.Bits@@ -136,19 +134,10 @@ -- >>> import Grisette.Backend -- >>> import Data.Proxy --- | An exception that would be thrown when operations are performed on--- incompatible bit widths.-data BitwidthMismatch = BitwidthMismatch- deriving (Show, Eq, Ord, Generic)--instance Exception BitwidthMismatch where- displayException BitwidthMismatch = "Bit width does not match"- -- | -- Unsigned bit vector type. Indexed with the bit width. Signedness affect the -- semantics of the operations, including comparison/extension, etc. ----- >>> :set -XOverloadedStrings -XDataKinds -XBinaryLiterals -- >>> 3 + 5 :: WordN 5 -- 0b01000 -- >>> sizedBVConcat (0b101 :: WordN 3) (0b110 :: WordN 3)@@ -216,7 +205,6 @@ -- Signed bit vector type. Indexed with the bit width. Signedness affects the -- semantics of the operations, including comparison/extension, etc. ----- >>> :set -XOverloadedStrings -XDataKinds -XBinaryLiterals -- >>> 3 + 5 :: IntN 5 -- 0b01000 -- >>> sizedBVConcat (0b101 :: IntN 3) (0b110 :: IntN 3)@@ -629,3 +617,19 @@ BITCAST_VIA_WORDx(IntN32, Float, Word32) BITCAST_VIA_WORDx(Float, IntN32, Word32) #endif++instance BitCast Bool (WordN 1) where+ bitCast False = 0+ bitCast True = 1++instance BitCast (WordN 1) Bool where+ bitCast 0 = False+ bitCast _ = True++instance BitCast Bool (IntN 1) where+ bitCast False = 0+ bitCast True = 1++instance BitCast (IntN 1) Bool where+ bitCast 0 = False+ bitCast _ = True
src/Grisette/Internal/SymPrim/FP.hs view
@@ -10,8 +10,10 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-}@@ -39,15 +41,21 @@ withValidFPProofs, FPRoundingMode (..), allFPRoundingMode,+ NotRepresentableFPError (..),+ ConvertibleBound (..),+ nextFP,+ prevFP, ) where import Control.DeepSeq (NFData (rnf))+import Control.Exception (Exception, throw) import Data.Bits (Bits (complement, shiftL, shiftR, xor, (.&.))) import Data.Hashable (Hashable (hashWithSalt)) import Data.Int (Int16, Int32, Int64) import Data.Maybe (fromJust) import Data.Proxy (Proxy (Proxy))+import Data.Ratio (numerator) import Data.SBV ( BVIsNonZero, FloatingPoint,@@ -57,17 +65,64 @@ Word16, Word32, Word64,+ denominator, infinity, nan, sFloatingPointAsSWord, sWordAsSFloatingPoint, )+import Data.SBV.Float (fpEncodeFloat)+import qualified Data.SBV.Float as SBVF+import qualified Data.SBV.Internals as SBVI import Data.Type.Equality (type (:~:) (Refl))+import GHC.Exception (Exception (displayException)) import GHC.Generics (Generic) import GHC.TypeLits (KnownNat, Nat, natVal, type (+), type (<=))-import Grisette.Internal.Core.Data.Class.BitCast (BitCast (bitCast))+import Grisette.Internal.Core.Data.Class.BitCast+ ( BitCast (bitCast),+ BitCastCanonical (bitCastCanonicalValue),+ BitCastOr (bitCastOr),+ bitCastOrCanonical,+ ) import Grisette.Internal.Core.Data.Class.BitVector (SizedBV (sizedBVConcat))-import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.Core.Data.Class.IEEEFP+ ( IEEEFPConstants+ ( fpMaxNormalized,+ fpMaxSubnormal,+ fpMinNormalized,+ fpMinSubnormal,+ fpNaN,+ fpNegativeInfinite,+ fpNegativeZero,+ fpPositiveInfinite,+ fpPositiveZero+ ),+ IEEEFPConvertible (fromFPOr, toFP),+ IEEEFPOp+ ( fpAbs,+ fpMaximum,+ fpMaximumNumber,+ fpMinimum,+ fpMinimumNumber,+ fpNeg,+ fpRem+ ),+ IEEEFPRoundingMode (rna, rne, rtn, rtp, rtz),+ IEEEFPRoundingOp (fpAdd, fpDiv, fpFMA, fpMul, fpRoundToIntegral, fpSqrt, fpSub),+ IEEEFPToAlgReal,+ fpIsInfinite,+ fpIsNaN,+ fpIsNegativeInfinite,+ fpIsNegativeZero,+ fpIsPositiveInfinite,+ fpIsPositiveZero,+ fpIsZero,+ )+import Grisette.Internal.SymPrim.AlgReal+ ( AlgReal (AlgExactRational),+ UnsupportedAlgRealOperation (UnsupportedAlgRealOperation, msg, op),+ )+import Grisette.Internal.SymPrim.BV (IntN, WordN, WordN16, WordN32, WordN64) import Grisette.Internal.Utils.Parameterized ( KnownProof (KnownProof), knownAdd,@@ -77,6 +132,40 @@ withLeqProof, ) import Language.Haskell.TH.Syntax (Lift (liftTyped))+import LibBF+ ( BFOpts,+ BigFloat,+ RoundMode,+ Status,+ allowSubnormal,+ bfAdd,+ bfDiv,+ bfFMA,+ bfFromInteger,+ bfIsInf,+ bfIsNaN,+ bfIsNeg,+ bfIsPos,+ bfIsZero,+ bfMul,+ bfNaN,+ bfNegInf,+ bfNegZero,+ bfPosInf,+ bfPosZero,+ bfRoundFloat,+ bfRoundInt,+ bfSqrt,+ bfSub,+ expBits,+ precBits,+ rnd,+ pattern NearAway,+ pattern NearEven,+ pattern ToNegInf,+ pattern ToPosInf,+ pattern ToZero,+ ) import Test.QuickCheck (frequency, oneof) import qualified Test.QuickCheck as QC @@ -102,7 +191,6 @@ -- | IEEE 754 floating-point number with @eb@ exponent bits and @sb@ significand -- bits. ----- >>> :set -XDataKinds -- >>> 1.0 + 2.0 :: FP 11 53 -- 3.0 --@@ -152,27 +240,6 @@ withLeqProof (unsafeLeqProof @1 @sb) $ bvIsNonZeroFromGEq1 (Proxy @(eb + sb)) r -instance (ValidFP eb sb, r ~ (eb + sb)) => BitCast (FP eb sb) (WordN r) where- bitCast (FP f)- | isNaN f =- withValidFPProofs @eb @sb $- sizedBVConcat (shiftR (-1) 1 :: WordN eb) highsb- | otherwise = wordn- where- sb = fromIntegral $ natVal (Proxy @sb) :: Int- highsb = withValidFPProofs @eb @sb $ shiftL 3 (sb - 2) :: WordN sb- wordn :: WordN (eb + sb)- wordn =- withValidFPProofs @eb @sb $- fromIntegral $- fromJust $- unliteral $- sFloatingPointAsSWord $- literal f--instance (ValidFP eb sb, r ~ (eb + sb)) => BitCast (FP eb sb) (IntN r) where- bitCast x = withValidFPProofs @eb @sb bitCast (bitCast x :: WordN r)- instance (ValidFP eb sb, r ~ (eb + sb)) => BitCast (WordN r) (FP eb sb) where bitCast v = FP fp where@@ -193,22 +260,14 @@ bitCast x = bitCast (bitCast x :: intermediate) #if 1-BITCAST_VIA_INTERMEDIATE(FP64, Double, WordN 64)-BITCAST_VIA_INTERMEDIATE(FP64, Int64, WordN 64)-BITCAST_VIA_INTERMEDIATE(FP64, Word64, WordN 64) BITCAST_VIA_INTERMEDIATE(Double, FP64, WordN 64) BITCAST_VIA_INTERMEDIATE(Int64, FP64, WordN 64) BITCAST_VIA_INTERMEDIATE(Word64, FP64, WordN 64) -BITCAST_VIA_INTERMEDIATE(FP32, Float, WordN 32)-BITCAST_VIA_INTERMEDIATE(FP32, Int32, WordN 32)-BITCAST_VIA_INTERMEDIATE(FP32, Word32, WordN 32) BITCAST_VIA_INTERMEDIATE(Float, FP32, WordN 32) BITCAST_VIA_INTERMEDIATE(Int32, FP32, WordN 32) BITCAST_VIA_INTERMEDIATE(Word32, FP32, WordN 32) -BITCAST_VIA_INTERMEDIATE(FP16, Word16, WordN 16)-BITCAST_VIA_INTERMEDIATE(FP16, Int16, WordN 16) BITCAST_VIA_INTERMEDIATE(Word16, FP16, WordN 16) BITCAST_VIA_INTERMEDIATE(Int16, FP16, WordN 16) #endif@@ -218,10 +277,11 @@ instance (ValidFP eb sb) => Lift (FP eb sb) where liftTyped fp = [||bitCast wordnValue||] where- wordnValue = bitCast fp :: WordN (eb + sb)+ wordnValue = bitCastOrCanonical fp :: WordN (eb + sb) instance (ValidFP eb sb) => Hashable (FP eb sb) where- hashWithSalt salt x = hashWithSalt salt (bitCast x :: WordN (eb + sb))+ hashWithSalt salt x =+ hashWithSalt salt (bitCastOrCanonical x :: WordN (eb + sb)) deriving newtype instance (ValidFloat eb sb) => Num (FP eb sb) @@ -305,3 +365,530 @@ instance QC.Arbitrary FPRoundingMode where arbitrary = QC.elements [RNE, RNA, RTP, RTN, RTZ]++instance+ (ValidFP eb sb, n ~ (eb + sb)) =>+ BitCastCanonical (FP eb sb) (WordN n)+ where+ bitCastCanonicalValue _ =+ withValidFPProofs @eb @sb $+ sizedBVConcat (shiftR (-1) 1 :: WordN eb) highsb+ where+ sb = fromIntegral $ natVal (Proxy @sb) :: Int+ highsb = withValidFPProofs @eb @sb $ shiftL 3 (sb - 2) :: WordN sb++instance+ (ValidFP eb sb, n ~ (eb + sb)) =>+ BitCastCanonical (FP eb sb) (IntN n)+ where+ bitCastCanonicalValue n =+ withValidFPProofs @eb @sb $+ bitCast (bitCastCanonicalValue n :: WordN n)++#define BIT_CAST_CANONICAL_VIA_INTERMEDIATE(from, to, intermediate) \+ instance BitCastCanonical (from) (to) where \+ bitCastCanonicalValue x = bitCast (bitCastCanonicalValue x :: intermediate)++#if 1+BIT_CAST_CANONICAL_VIA_INTERMEDIATE(FP64, Word64, WordN64)+BIT_CAST_CANONICAL_VIA_INTERMEDIATE(FP64, Int64, WordN64)+BIT_CAST_CANONICAL_VIA_INTERMEDIATE(FP64, Double, WordN64)+BIT_CAST_CANONICAL_VIA_INTERMEDIATE(FP32, Word32, WordN32)+BIT_CAST_CANONICAL_VIA_INTERMEDIATE(FP32, Int32, WordN32)+BIT_CAST_CANONICAL_VIA_INTERMEDIATE(FP32, Float, WordN32)+BIT_CAST_CANONICAL_VIA_INTERMEDIATE(FP16, Word16, WordN16)+BIT_CAST_CANONICAL_VIA_INTERMEDIATE(FP16, Int16, WordN16)+#endif++instance (ValidFP eb sb, r ~ (eb + sb)) => BitCastOr (FP eb sb) (WordN r) where+ bitCastOr d (FP f)+ | isNaN f = d+ | otherwise = wordn+ where+ wordn :: WordN (eb + sb)+ wordn =+ withValidFPProofs @eb @sb $+ fromIntegral $+ fromJust $+ unliteral $+ sFloatingPointAsSWord $+ literal f++instance+ (ValidFP eb sb, n ~ (eb + sb)) =>+ BitCastOr (FP eb sb) (IntN n)+ where+ bitCastOr d n =+ withValidFPProofs @eb @sb $+ bitCast (bitCastOr (bitCast d) n :: WordN n)++#define BIT_CAST_OR_VIA_INTERMEDIATE(from, to, intermediate) \+ instance BitCastOr (from) (to) where \+ bitCastOr d x = bitCast (bitCastOr (bitCast d) x :: intermediate)++#if 1+BIT_CAST_OR_VIA_INTERMEDIATE(FP64, Word64, WordN64)+BIT_CAST_OR_VIA_INTERMEDIATE(FP64, Int64, WordN64)+BIT_CAST_OR_VIA_INTERMEDIATE(FP64, Double, WordN64)+BIT_CAST_OR_VIA_INTERMEDIATE(FP32, Word32, WordN32)+BIT_CAST_OR_VIA_INTERMEDIATE(FP32, Int32, WordN32)+BIT_CAST_OR_VIA_INTERMEDIATE(FP32, Float, WordN32)+BIT_CAST_OR_VIA_INTERMEDIATE(FP16, Word16, WordN16)+BIT_CAST_OR_VIA_INTERMEDIATE(FP16, Int16, WordN16)+#endif++-- | An error thrown when bitcasting or converting t'FP' NaN to other types.+data NotRepresentableFPError+ = NaNError+ | FPUnderflowError+ | FPOverflowError+ deriving (Show, Eq, Ord, Generic)++instance Exception NotRepresentableFPError where+ displayException NaNError =+ "Converting NaN value cannot be done precisely with SMT-LIB2"+ displayException FPUnderflowError =+ "Converting FP values that cannot be represented by non-FP types due to "+ <> "underflowing"+ displayException FPOverflowError =+ "Converting FP values that cannot be represented by non-FP types due to "+ <> "overflowing"++instance (ValidFP eb sb) => IEEEFPConstants (FP eb sb) where+ fpPositiveInfinite = FP infinity+ {-# INLINE fpPositiveInfinite #-}+ fpNegativeInfinite = FP $ -infinity+ {-# INLINE fpNegativeInfinite #-}+ fpNaN = FP nan+ {-# INLINE fpNaN #-}+ fpNegativeZero = FP $ -0+ {-# INLINE fpNegativeZero #-}+ fpPositiveZero = FP 0+ {-# INLINE fpPositiveZero #-}++ fpMinNormalized =+ withValidFPProofs @eb @sb $+ bitCast $+ (1 :: WordN (eb + sb)) `shiftL` fromIntegral (natVal (Proxy @sb) - 1)+ {-# INLINE fpMinNormalized #-}++ fpMaxNormalized =+ withValidFPProofs @eb @sb $+ bitCast $+ complement+ ( (1 :: WordN (eb + sb))+ `shiftL` fromIntegral (natVal (Proxy @sb) - 1)+ )+ `shiftL` 1+ `shiftR` 1+ {-# INLINE fpMaxNormalized #-}++ fpMinSubnormal = withValidFPProofs @eb @sb $ bitCast (1 :: WordN (eb + sb))+ {-# INLINE fpMinSubnormal #-}++ fpMaxSubnormal =+ withValidFPProofs @eb @sb $+ bitCast+ ( (1 :: WordN (eb + sb))+ `shiftL` fromIntegral (natVal (Proxy @sb) - 1)+ - 1+ )+ {-# INLINE fpMaxSubnormal #-}++cmpHandleNegZero :: (ValidFP eb sb) => FP eb sb -> FP eb sb -> Bool+cmpHandleNegZero x y =+ if fpIsZero x && fpIsZero y then fpIsNegativeZero x else x < y++instance (ValidFP eb sb) => IEEEFPOp (FP eb sb) where+ fpAbs = abs+ {-# INLINE fpAbs #-}+ fpNeg = negate+ {-# INLINE fpNeg #-}+ fpRem = SBVI.fpRemH+ {-# INLINE fpRem #-}+ fpMinimum a b+ | fpIsNaN a || fpIsNaN b = fpNaN+ | cmpHandleNegZero a b = a+ | otherwise = b+ {-# INLINE fpMinimum #-}+ fpMinimumNumber a b+ | fpIsNaN a = b+ | fpIsNaN b = a+ | cmpHandleNegZero a b = a+ | otherwise = b+ {-# INLINE fpMinimumNumber #-}+ fpMaximum a b+ | fpIsNaN a || fpIsNaN b = fpNaN+ | cmpHandleNegZero a b = b+ | otherwise = a+ {-# INLINE fpMaximum #-}+ fpMaximumNumber a b+ | fpIsNaN a = b+ | fpIsNaN b = a+ | cmpHandleNegZero a b = b+ | otherwise = a+ {-# INLINE fpMaximumNumber #-}++instance IEEEFPRoundingMode FPRoundingMode where+ rne = RNE+ {-# INLINE rne #-}+ rna = RNA+ {-# INLINE rna #-}+ rtp = RTP+ {-# INLINE rtp #-}+ rtn = RTN+ {-# INLINE rtn #-}+ rtz = RTZ+ {-# INLINE rtz #-}++libBFRoundingMode :: FPRoundingMode -> RoundMode+libBFRoundingMode RNE = NearEven+libBFRoundingMode RNA = NearAway+libBFRoundingMode RTP = ToPosInf+libBFRoundingMode RTN = ToNegInf+libBFRoundingMode RTZ = ToZero++libBFOpts ::+ forall eb sb. (ValidFP eb sb) => FPRoundingMode -> FP eb sb -> BFOpts+libBFOpts mode _ = rnd rd <> precBits sb <> expBits eb <> allowSubnormal+ where+ eb = fromIntegral $ natVal (Proxy @eb) :: Int+ sb = fromIntegral $ natVal (Proxy @sb) :: Word+ rd = libBFRoundingMode mode++toLibBF :: forall eb sb. (ValidFP eb sb) => FP eb sb -> BigFloat+toLibBF f+ | fpIsNegativeZero f = bfNegZero+ | fpIsPositiveZero f = bfPosZero+ | fpIsPositiveInfinite f = bfPosInf+ | fpIsNegativeInfinite f = bfNegInf+ | fpIsNaN f = bfNaN+ | otherwise =+ SBVF.fpValue $+ uncurry (fpEncodeFloat eb sb) $+ decodeFloat f+ where+ eb = fromIntegral $ natVal (Proxy @eb) :: Int+ sb = fromIntegral $ natVal (Proxy @sb) :: Int++fromLibBF :: forall eb sb. (ValidFP eb sb) => BigFloat -> FP eb sb+fromLibBF f+ | bfIsNeg f && bfIsZero f = fpNegativeZero+ | bfIsPos f && bfIsZero f = fpPositiveZero+ | bfIsNeg f && bfIsInf f = fpNegativeInfinite+ | bfIsPos f && bfIsInf f = fpPositiveInfinite+ | bfIsNaN f = fpNaN+ | otherwise = uncurry encodeFloat $ decodeFloat fp+ where+ fp = SBVF.FP eb sb f+ eb = fromIntegral $ natVal (Proxy @eb) :: Int+ sb = fromIntegral $ natVal (Proxy @sb) :: Int++liftLibBF1 ::+ (ValidFP eb sb) =>+ (BFOpts -> BigFloat -> (BigFloat, Status)) ->+ FPRoundingMode ->+ FP eb sb ->+ FP eb sb+liftLibBF1 f rd x = fromLibBF $ fst $ f opts xbf+ where+ opts = libBFOpts rd x+ xbf = toLibBF x++liftLibBF2 ::+ (ValidFP eb sb) =>+ (BFOpts -> BigFloat -> BigFloat -> (BigFloat, Status)) ->+ FPRoundingMode ->+ FP eb sb ->+ FP eb sb ->+ FP eb sb+liftLibBF2 f rd l r = fromLibBF $ fst $ f opts lbf rbf+ where+ opts = libBFOpts rd l+ lbf = toLibBF l+ rbf = toLibBF r++liftLibBF3 ::+ (ValidFP eb sb) =>+ (BFOpts -> BigFloat -> BigFloat -> BigFloat -> (BigFloat, Status)) ->+ FPRoundingMode ->+ FP eb sb ->+ FP eb sb ->+ FP eb sb ->+ FP eb sb+liftLibBF3 f rd x y z = fromLibBF $ fst $ f opts xbf ybf zbf+ where+ opts = libBFOpts rd x+ xbf = toLibBF x+ ybf = toLibBF y+ zbf = toLibBF z++instance (ValidFP eb sb) => IEEEFPRoundingOp (FP eb sb) FPRoundingMode where+ fpAdd = liftLibBF2 bfAdd+ {-# INLINE fpAdd #-}+ fpSub = liftLibBF2 bfSub+ {-# INLINE fpSub #-}+ fpMul = liftLibBF2 bfMul+ {-# INLINE fpMul #-}+ fpDiv = liftLibBF2 bfDiv+ {-# INLINE fpDiv #-}+ fpFMA = liftLibBF3 bfFMA+ {-# INLINE fpFMA #-}+ fpSqrt = liftLibBF1 bfSqrt+ {-# INLINE fpSqrt #-}+ fpRoundToIntegral rd x =+ fromLibBF $ fst $ bfRoundInt (libBFRoundingMode rd) $ toLibBF x+ {-# INLINE fpRoundToIntegral #-}++instance+ (ValidFP eb sb) =>+ IEEEFPConvertible AlgReal (FP eb sb) FPRoundingMode+ where+ fromFPOr d _ fp+ | fpIsInfinite fp = d+ | fpIsNaN fp = d+ | otherwise =+ let (m, n) = decodeFloat fp+ in fromRational (toRational m * (2 ^^ n))+ toFP mode (AlgExactRational v) = fromLibBF $ fst $ bfDiv opts n d+ where+ opts = libBFOpts mode (undefined :: FP eb sb)+ n = bfFromInteger $ numerator v+ d = bfFromInteger $ denominator v+ toFP _ r =+ throw+ UnsupportedAlgRealOperation {op = "toFP", msg = show r}++instance+ (ValidFP eb sb) =>+ IEEEFPToAlgReal AlgReal (FP eb sb) FPRoundingMode++roundRationalToInteger :: FPRoundingMode -> Rational -> Integer+roundRationalToInteger mode r+ | d == 1 = n+ | d == 2 = case mode of+ RNE -> if even ndivd then ndivd else ndivd + 1+ RNA -> if n > 0 then ndivd + 1 else ndivd+ RTP -> ndivd + 1+ RTN -> ndivd+ RTZ -> if n > 0 then ndivd else ndivd + 1+ | otherwise = case mode of+ RNE -> if nmodd > d `div` 2 then ndivd + 1 else ndivd+ RNA -> if nmodd > d `div` 2 then ndivd + 1 else ndivd+ RTP -> ndivd + 1+ RTN -> ndivd+ RTZ -> if n > 0 then ndivd else ndivd + 1+ where+ n = numerator r+ d = denominator r+ ndivd = n `div` d+ nmodd = n `mod` d++instance+ (ValidFP eb sb) =>+ IEEEFPConvertible Integer (FP eb sb) FPRoundingMode+ where+ fromFPOr d mode fp+ | fpIsInfinite fp = d+ | fpIsNaN fp = d+ | otherwise =+ let r = fromFPOr (fromIntegral d) mode fp+ in case r of+ AlgExactRational v -> roundRationalToInteger mode v+ _ -> error "Should not happen"+ toFP mode r = toFP mode (fromIntegral r :: AlgReal)++instance+ (ValidFP eb sb, KnownNat n, 1 <= n) =>+ IEEEFPConvertible (WordN n) (FP eb sb) FPRoundingMode+ where+ fromFPOr d mode fp+ | fpIsInfinite fp = d+ | fpIsNaN fp = d+ | otherwise =+ let p = fromFPOr (fromIntegral d :: Integer) mode fp+ in if p < (fromIntegral (minBound :: WordN n))+ || p > (fromIntegral (maxBound :: WordN n))+ then d+ else fromIntegral p+ toFP mode r = toFP mode (fromIntegral r :: AlgReal)++instance+ (ValidFP eb sb, KnownNat n, 1 <= n) =>+ IEEEFPConvertible (IntN n) (FP eb sb) FPRoundingMode+ where+ fromFPOr d mode fp+ | fpIsInfinite fp = d+ | fpIsNaN fp = d+ | otherwise =+ let p = fromFPOr (fromIntegral d :: Integer) mode fp+ in if p < (fromIntegral (minBound :: IntN n))+ || p > (fromIntegral (maxBound :: IntN n))+ then d+ else fromIntegral p+ toFP mode r = toFP mode (fromIntegral r :: AlgReal)++instance+ (ValidFP eb sb, ValidFP eb' sb') =>+ IEEEFPConvertible (FP eb' sb') (FP eb sb) FPRoundingMode+ where+ fromFPOr _ = toFP+ toFP mode fp+ | fpIsNegativeInfinite fp = fpNegativeInfinite+ | fpIsPositiveInfinite fp = fpPositiveInfinite+ | fpIsNaN fp = fpNaN+ | fpIsNegativeZero fp = fpNegativeZero+ | fpIsPositiveZero fp = fpPositiveZero+ | otherwise =+ let bffp = toLibBF fp+ opts = libBFOpts mode (undefined :: FP eb sb)+ in fromLibBF $ fst $ bfRoundFloat opts bffp++-- | Next representable floating-point number.+--+-- Note:+--+-- > nextFP(+inf) = +inf+-- > nextFP(-inf) = -maxNormalized+-- > nextFP(NaN) = NaN+--+-- The function do not distinguish between -0 and +0.+nextFP :: forall eb sb. (ValidFP eb sb) => FP eb sb -> FP eb sb+nextFP x+ | fpIsNaN x = fpNaN+ | fpIsNegativeInfinite x = -fpMaxNormalized+ | x == -fpMinNormalized = -fpMaxSubnormal+ | x == -fpMinSubnormal = 0+ | x == 0 = fpMinSubnormal+ | x == fpMaxSubnormal = fpMinNormalized+ | x == fpMaxNormalized = fpPositiveInfinite+ | fpIsPositiveInfinite x = fpPositiveInfinite+ | x > 0 =+ withValidFPProofs @eb @sb $+ bitCast ((bitCastOrCanonical x :: WordN (eb + sb)) + 1)+ | otherwise =+ withValidFPProofs @eb @sb $+ bitCast ((bitCastOrCanonical x :: WordN (eb + sb)) - 1)++-- | Previous representable floating-point number.+--+-- Note:+--+-- > prevFP(+inf) = +maxNormalized+-- > prevFP(-inf) = -inf+-- > prevFP(NaN) = NaN+--+-- The function do not distinguish between -0 and +0.+prevFP :: forall eb sb. (ValidFP eb sb) => FP eb sb -> FP eb sb+prevFP x+ | fpIsNaN x = fpNaN+ | fpIsPositiveInfinite x = fpMaxNormalized+ | x == fpMinNormalized = fpMaxSubnormal+ | x == fpMinSubnormal = 0+ | x == 0 = -fpMinSubnormal+ | x == -fpMaxSubnormal = -fpMinNormalized+ | x == -fpMaxNormalized = fpNegativeInfinite+ | fpIsNegativeInfinite x = fpNegativeInfinite+ | x > 0 =+ withValidFPProofs @eb @sb $+ bitCast ((bitCastOrCanonical x :: WordN (eb + sb)) - 1)+ | otherwise =+ withValidFPProofs @eb @sb $+ bitCast ((bitCastOrCanonical x :: WordN (eb + sb)) + 1)++-- | Bounds for converting bit vectors to floating-point numbers. Out-of-range+-- FP values cannot be converted to a representable bit-vector.+class ConvertibleBound bv where+ convertibleLowerBound ::+ forall eb sb n.+ (ValidFP eb sb, KnownNat n, 1 <= n) =>+ bv n ->+ FPRoundingMode ->+ FP eb sb+ convertibleUpperBound ::+ forall eb sb n.+ (ValidFP eb sb, KnownNat n, 1 <= n) =>+ bv n ->+ FPRoundingMode ->+ FP eb sb++instance ConvertibleBound WordN where+ convertibleLowerBound _ RTP = nextFP $ -1+ convertibleLowerBound _ RTZ = nextFP $ -1+ convertibleLowerBound _ RTN = 0+ convertibleLowerBound _ RNA = nextFP $ -0.5+ convertibleLowerBound _ RNE = -0.5+ convertibleUpperBound ::+ forall eb sb n.+ (ValidFP eb sb, KnownNat n, 1 <= n) =>+ WordN n ->+ FPRoundingMode ->+ FP eb sb+ convertibleUpperBound _ mode+ | ebn < n = fpMaxNormalized+ | ebn == n && sb <= n = fpMaxNormalized+ | ebn >= n && sb > n = case mode of+ RTP -> toFP rne (maxBound :: WordN n)+ RTZ -> prevFP $ toFP rne (maxBound :: WordN n) + 1+ RTN -> prevFP $ toFP rne (maxBound :: WordN n) + 1+ RNA -> prevFP $ toFP rne (maxBound :: WordN n) + 0.5+ RNE -> prevFP $ toFP rne (maxBound :: WordN n) + 0.5+ | ebn > n && sb == n = toFP rne (maxBound :: WordN n)+ -- ebn > n && sb < n+ | otherwise =+ prevFP $ toFP rne (maxBound `div` 2 + 1 :: WordN n) * 2+ where+ n = natVal (Proxy @n)+ eb = natVal (Proxy @eb)+ ebn = 2 ^ (eb - 1)+ sb = natVal (Proxy @sb)++instance ConvertibleBound IntN where+ convertibleLowerBound ::+ forall eb sb n.+ (ValidFP eb sb, KnownNat n, 1 <= n) =>+ IntN n ->+ FPRoundingMode ->+ FP eb sb+ convertibleLowerBound _ mode+ | ebn <= n - 1 = -fpMaxNormalized+ | ebn > n - 1 && sb <= n - 1 = toFP rne (minBound :: IntN n)+ -- ebn > n - 1 && sb > n - 1+ | otherwise = case mode of+ RTP -> nextFP $ toFP rne (minBound :: IntN n) - 1+ RTZ -> nextFP $ toFP rne (minBound :: IntN n) - 1+ RTN -> toFP rne (minBound :: IntN n)+ RNA ->+ if sb == n+ then toFP rne (minBound :: IntN n) - 0.5+ else nextFP $ toFP rne (minBound :: IntN n) - 0.5+ RNE -> toFP rne (minBound :: IntN n) - 0.5+ where+ n = natVal (Proxy @n)+ eb = natVal (Proxy @eb)+ ebn = 2 ^ (eb - 1)+ sb = natVal (Proxy @sb)+ convertibleUpperBound ::+ forall eb sb n.+ (ValidFP eb sb, KnownNat n, 1 <= n) =>+ IntN n ->+ FPRoundingMode ->+ FP eb sb+ convertibleUpperBound _ mode+ | ebn < n - 1 = fpMaxNormalized+ | ebn == n - 1 && sb <= n - 1 = fpMaxNormalized+ | ebn >= n - 1 && sb > n - 1 = case mode of+ RTP -> toFP rne (maxBound :: IntN n)+ RTZ -> prevFP $ toFP rne (maxBound :: IntN n) + 1+ RTN -> prevFP $ toFP rne (maxBound :: IntN n) + 1+ RNA -> prevFP $ toFP rne (maxBound :: IntN n) + 0.5+ RNE -> prevFP $ toFP rne (maxBound :: IntN n) + 0.5+ | ebn > n - 1 && sb == n - 1 = toFP rne (maxBound :: IntN n)+ -- ebn > n - 1 && sb < n - 1+ | otherwise =+ prevFP $ toFP rne (maxBound `div` 2 + 1 :: IntN n) * 2+ where+ n = natVal (Proxy @n)+ eb = natVal (Proxy @eb)+ ebn = 2 ^ (eb - 1)+ sb = natVal (Proxy @sb)
+ src/Grisette/Internal/SymPrim/FunInstanceGen.hs view
@@ -0,0 +1,253 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Avoid lambda" #-}++-- |+-- Module : Grisette.Internal.SymPrim.FunInstanceGen+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.SymPrim.FunInstanceGen+ ( supportedPrimFun,+ supportedPrimFunUpTo,+ )+where++import qualified Data.SBV as SBV+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( IsSymbolKind,+ SupportedNonFuncPrim,+ SupportedPrim+ ( castTypedSymbol,+ conSBVTerm,+ defaultValue,+ funcDummyConstraint,+ isFuncType,+ parseSMTModelResult,+ pevalDistinctTerm,+ pevalEqTerm,+ pevalITETerm,+ sbvDistinct,+ sbvEq,+ symSBVName,+ symSBVTerm,+ withPrim+ ),+ TypedSymbol (TypedSymbol),+ decideSymbolKind,+ pevalITEBasicTerm,+ translateTypeError,+ withNonFuncPrim,+ )+import Language.Haskell.TH+ ( Cxt,+ Dec (InstanceD),+ DecsQ,+ Exp,+ ExpQ,+ Name,+ Overlap (Overlapping),+ Q,+ Type,+ TypeQ,+ forallT,+ lamE,+ newName,+ sigD,+ stringE,+ varE,+ varP,+ varT,+ )+import Language.Haskell.TH.Datatype.TyVarBndr+ ( plainTVInferred,+ plainTVSpecified,+ )+import Type.Reflection (TypeRep, typeRep, type (:~~:) (HRefl))++instanceWithOverlapDescD ::+ Maybe Overlap -> Q Cxt -> Q Type -> [DecsQ] -> DecsQ+instanceWithOverlapDescD o ctxts ty descs = do+ ctxts1 <- ctxts+ descs1 <- sequence descs+ ty1 <- ty+ return [InstanceD o ctxts1 ty1 (concat descs1)]++-- | Generate an instance of 'SupportedPrim' for a function with a given number+-- of arguments.+supportedPrimFun ::+ ExpQ ->+ ExpQ ->+ ([TypeQ] -> ExpQ) ->+ String ->+ String ->+ Name ->+ Int ->+ DecsQ+supportedPrimFun+ dv+ parse+ consbv+ funNameInError+ funNamePrefix+ funTypeName+ numArg = do+ names <- traverse (newName . ("a" <>) . show) [0 .. numArg - 1]++ let tyVars = varT <$> names+ knd <- newName "knd"+ knd' <- newName "knd'"+ let kndty = varT knd+ let knd'ty = varT knd'+ instanceWithOverlapDescD+ (if numArg == 2 then Nothing else Just Overlapping)+ (constraints tyVars)+ [t|SupportedPrim $(funType tyVars)|]+ ( [ [d|$(varP 'defaultValue) = $dv|],+ [d|$(varP 'pevalITETerm) = pevalITEBasicTerm|],+ [d|+ $(varP 'pevalEqTerm) =+ $( translateError+ tyVars+ "does not supported equality comparison."+ )+ |],+ [d|+ $(varP 'pevalDistinctTerm) =+ $( translateError+ tyVars+ "does not supported equality comparison."+ )+ |],+ [d|+ $(varP 'conSBVTerm) = $(consbv tyVars)+ |],+ -- \$( translateError+ -- tyVars+ -- ( "must have already been partially evaluated away before "+ -- <> "reaching this point."+ -- )+ -- )++ [d|+ $(varP 'symSBVName) = \_ num ->+ $(stringE $ funNamePrefix <> show numArg <> "_") <> show num+ |],+ [d|+ $(varP 'symSBVTerm) = \r ->+ withPrim @($(funType tyVars)) $ return $ SBV.uninterpret r+ |],+ [d|$(varP 'withPrim) = $(withPrims tyVars)|],+ [d|+ $(varP 'sbvEq) =+ $( translateError+ tyVars+ "does not support equality comparison."+ )+ |],+ [d|+ $(varP 'sbvDistinct) =+ $( translateError+ tyVars+ "does not support equality comparison."+ )+ |],+ [d|$(varP 'parseSMTModelResult) = $parse|],+ (: [])+ <$> sigD+ 'castTypedSymbol+ ( forallT+ [plainTVInferred knd, plainTVSpecified knd']+ ((: []) <$> [t|IsSymbolKind $knd'ty|])+ [t|+ TypedSymbol $kndty $(funType tyVars) ->+ Maybe (TypedSymbol $knd'ty $(funType tyVars))+ |]+ ),+ [d|+ $(varP 'castTypedSymbol) = \(TypedSymbol sym) ->+ case decideSymbolKind @($knd'ty) of+ Left HRefl -> Nothing+ Right HRefl -> Just $ TypedSymbol sym+ |],+ [d|$(varP 'isFuncType) = True|],+ ( if numArg == 2+ then+ [d|+ $(varP 'funcDummyConstraint) = \f ->+ withPrim @($(funType tyVars)) $+ withNonFuncPrim @($(last tyVars)) $ do+ f (conSBVTerm (defaultValue :: $(head tyVars)))+ SBV..== f+ (conSBVTerm (defaultValue :: $(head tyVars)))+ |]+ else+ [d|+ $(varP 'funcDummyConstraint) = \f ->+ withNonFuncPrim @($(head tyVars)) $+ funcDummyConstraint @($(funType $ tail tyVars))+ (f (conSBVTerm (defaultValue :: $(head tyVars))))+ |]+ )+ ]+ )+ where+ translateError tyVars finalMsg =+ [|+ translateTypeError+ ( Just+ $( stringE $+ "BUG. Please send a bug report. "+ <> funNameInError+ <> " "+ <> finalMsg+ )+ )+ (typeRep :: TypeRep $(funType tyVars))+ |]++ constraints = traverse (\ty -> [t|SupportedNonFuncPrim $ty|])+ funType =+ foldl1 (\fty ty -> [t|$(varT funTypeName) $ty $fty|]) . reverse+ withPrims :: [Q Type] -> Q Exp+ withPrims tyVars = do+ r <- newName "r"+ lamE [varP r] $+ foldr+ (\ty r -> [|withNonFuncPrim @($ty) $r|])+ (varE r)+ tyVars++-- | Generate instances of 'SupportedPrim' for functions with up to a given+-- number of arguments.+supportedPrimFunUpTo ::+ ExpQ -> ExpQ -> ([TypeQ] -> ExpQ) -> String -> String -> Name -> Int -> DecsQ+supportedPrimFunUpTo+ dv+ parse+ consbv+ funNameInError+ funNamePrefix+ funTypeName+ numArg =+ concat+ <$> sequence+ [ supportedPrimFun+ dv+ parse+ consbv+ funNameInError+ funNamePrefix+ funTypeName+ n+ | n <- [2 .. numArg]+ ]
src/Grisette/Internal/SymPrim/GeneralFun.hs view
@@ -1,3 +1,5 @@+{-# HLINT ignore "Eta reduce" #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveLift #-} {-# LANGUAGE FlexibleContexts #-}@@ -7,16 +9,15 @@ {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TemplateHaskellQuotes #-}+{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} -{-# HLINT ignore "Eta reduce" #-}- -- | -- Module : Grisette.Internal.SymPrim.GeneralFun -- Copyright : (c) Sirui Lu 2024@@ -28,6 +29,7 @@ module Grisette.Internal.SymPrim.GeneralFun ( type (-->) (..), buildGeneralFun,+ generalSubstSomeTerm, substTerm, ) where@@ -35,6 +37,7 @@ import Control.DeepSeq (NFData (rnf)) import Data.Bifunctor (Bifunctor (second)) import Data.Foldable (Foldable (foldl'))+import qualified Data.HashSet as HS import Data.Hashable (Hashable (hashWithSalt)) import qualified Data.SBV as SBV import qualified Data.SBV.Dynamic as SBVD@@ -45,23 +48,26 @@ ( Symbol (IndexedSymbol, SimpleSymbol), withInfo, )+import Grisette.Internal.SymPrim.FunInstanceGen (supportedPrimFunUpTo)+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP+ ( pevalFPBinaryTerm,+ pevalFPFMATerm,+ pevalFPRoundingBinaryTerm,+ pevalFPRoundingUnaryTerm,+ pevalFPTraitTerm,+ pevalFPUnaryTerm,+ ) import Grisette.Internal.SymPrim.Prim.Internal.PartialEval (totalize2) import Grisette.Internal.SymPrim.Prim.Internal.Term- ( PEvalFloatingTerm (pevalSqrtTerm),- PEvalFractionalTerm (pevalFdivTerm, pevalRecipTerm),- SBVRep (SBVType),- SupportedPrim (parseSMTModelResult, sbvEq),- Term (FPBinaryTerm, FPFMATerm, FPRoundingBinaryTerm, FPRoundingUnaryTerm, FPTraitTerm, FdivTerm, RecipTerm, SqrtTerm),- partitionCVArg,- )-import Grisette.Internal.SymPrim.Prim.SomeTerm (SomeTerm (SomeTerm))-import Grisette.Internal.SymPrim.Prim.Term ( BinaryOp (pevalBinary),+ IsSymbolKind, LinkedRep (underlyingTerm, wrapTerm),+ NonFuncPrimConstraint, NonFuncSBVBaseType, PEvalApplyTerm (pevalApplyTerm, sbvApplyTerm),- PEvalBVSignConversionTerm (pevalBVToSignedTerm, pevalBVToUnsignedTerm), PEvalBVTerm (pevalBVConcatTerm, pevalBVExtendTerm, pevalBVSelectTerm),+ PEvalBitCastOrTerm (pevalBitCastOrTerm),+ PEvalBitCastTerm (pevalBitCastTerm), PEvalBitwiseTerm ( pevalAndBitsTerm, pevalComplementBitsTerm,@@ -72,6 +78,10 @@ ( pevalDivIntegralTerm, pevalModIntegralTerm ),+ PEvalFloatingTerm (pevalFloatingUnaryTerm, pevalPowerTerm),+ PEvalFractionalTerm (pevalFdivTerm, pevalRecipTerm),+ PEvalFromIntegralTerm (pevalFromIntegralTerm),+ PEvalIEEEFPConvertibleTerm (pevalFromFPOrTerm, pevalToFPTerm), PEvalNumTerm ( pevalAbsNumTerm, pevalAddNumTerm,@@ -82,16 +92,19 @@ PEvalOrdTerm (pevalLeOrdTerm, pevalLtOrdTerm), PEvalRotateTerm (pevalRotateRightTerm), PEvalShiftTerm (pevalShiftLeftTerm, pevalShiftRightTerm),+ SBVRep (SBVType),+ SomeTypedConstantSymbol, SupportedNonFuncPrim (withNonFuncPrim), SupportedPrim- ( conSBVTerm,+ ( castTypedSymbol, defaultValue,+ parseSMTModelResult,+ pevalDistinctTerm, pevalITETerm,- symSBVName,- symSBVTerm, withPrim ), SupportedPrimConstraint (PrimConstraint),+ SymbolKind (AnyKind), Term ( AbsNumTerm, AddNumTerm,@@ -102,11 +115,25 @@ BVExtendTerm, BVSelectTerm, BinaryTerm,+ BitCastOrTerm,+ BitCastTerm, ComplementBitsTerm, ConTerm,+ DistinctTerm, DivIntegralTerm, EqTerm,+ ExistsTerm,+ FPBinaryTerm,+ FPFMATerm,+ FPRoundingBinaryTerm,+ FPRoundingUnaryTerm,+ FPTraitTerm, FPUnaryTerm,+ FdivTerm,+ FloatingUnaryTerm,+ ForallTerm,+ FromFPOrTerm,+ FromIntegralTerm, ITETerm, LeOrdTerm, LtOrdTerm,@@ -116,7 +143,9 @@ NotTerm, OrBitsTerm, OrTerm,+ PowerTerm, QuotIntegralTerm,+ RecipTerm, RemIntegralTerm, RotateLeftTerm, RotateRightTerm,@@ -125,36 +154,33 @@ SignumNumTerm, SymTerm, TernaryTerm,- ToSignedTerm,- ToUnsignedTerm,+ ToFPTerm, UnaryTerm, XorBitsTerm ), TernaryOp (pevalTernary),+ TypedConstantSymbol, TypedSymbol (TypedSymbol, unTypedSymbol), UnaryOp (pevalUnary), applyTerm, conTerm,+ eqHeteroSymbol,+ existsTerm,+ forallTerm,+ partitionCVArg, pevalAndTerm,- pevalDefaultEqTerm, pevalEqTerm,- pevalFPBinaryTerm,- pevalFPFMATerm,- pevalFPRoundingBinaryTerm,- pevalFPRoundingUnaryTerm,- pevalFPTraitTerm,- pevalFPUnaryTerm,- pevalITEBasicTerm, pevalNotTerm, pevalOrTerm, pevalQuotIntegralTerm, pevalRemIntegralTerm, pevalRotateLeftTerm,- pformat,+ pformatTerm, someTypedSymbol, symTerm, translateTypeError, )+import Grisette.Internal.SymPrim.Prim.SomeTerm (SomeTerm (SomeTerm), someTerm) import Language.Haskell.TH.Syntax (Lift (liftTyped)) import Type.Reflection ( TypeRep,@@ -177,9 +203,7 @@ -- -- The result would be partially evaluated. ----- >>> :set -XOverloadedStrings--- >>> :set -XTypeOperators--- >>> let f = ("x" :: TypedSymbol Integer) --> ("x" + 1 + "y" :: SymInteger) :: Integer --> Integer+-- >>> let f = ("x" :: TypedConstantSymbol Integer) --> ("x" + 1 + "y" :: SymInteger) :: Integer --> Integer -- >>> f # 1 -- 1 has the type SymInteger -- (+ 2 y) -- >>> f # "a" -- "a" has the type SymInteger@@ -187,7 +211,7 @@ data (-->) a b where GeneralFun :: (SupportedPrim a, SupportedPrim b) =>- TypedSymbol a ->+ TypedConstantSymbol a -> Term b -> a --> b @@ -198,7 +222,10 @@ -- | Build a general symbolic function with a bounded symbol and a term. buildGeneralFun ::- (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Term b -> a --> b+ (SupportedNonFuncPrim a, SupportedPrim b) =>+ TypedConstantSymbol a ->+ Term b ->+ a --> b buildGeneralFun arg v = GeneralFun (TypedSymbol newarg)@@ -221,7 +248,7 @@ GeneralFun sym1 tm1 == GeneralFun sym2 tm2 = sym1 == sym2 && tm1 == tm2 instance Show (a --> b) where- show (GeneralFun sym tm) = "\\(" ++ show sym ++ ") -> " ++ pformat tm+ show (GeneralFun sym tm) = "\\(" ++ show sym ++ ") -> " ++ pformatTerm tm instance Lift (a --> b) where liftTyped (GeneralFun sym tm) = [||GeneralFun sym tm||]@@ -237,11 +264,12 @@ SupportedPrimConstraint (a --> b) where type- PrimConstraint n (a --> b) =+ PrimConstraint (a --> b) = ( SupportedNonFuncPrim a, SupportedPrim b,- PrimConstraint n b,- SBVType n (a --> b) ~ (SBV.SBV (NonFuncSBVBaseType n a) -> SBVType n b)+ NonFuncPrimConstraint a,+ PrimConstraint b,+ SBVType (a --> b) ~ (SBV.SBV (NonFuncSBVBaseType a) -> SBVType b) ) instance@@ -249,10 +277,37 @@ SBVRep (a --> b) where type- SBVType n (a --> b) =- SBV.SBV (NonFuncSBVBaseType n a) ->- SBVType n b+ SBVType (a --> b) =+ SBV.SBV (NonFuncSBVBaseType a) ->+ SBVType b +pevalGeneralFunApplyTerm ::+ ( SupportedNonFuncPrim a,+ SupportedPrim b,+ SupportedPrim (a --> b)+ ) =>+ Term (a --> b) ->+ Term a ->+ Term b+pevalGeneralFunApplyTerm = totalize2 doPevalApplyTerm applyTerm+ where+ doPevalApplyTerm (ConTerm _ (GeneralFun arg tm)) v =+ Just $ substTerm arg v tm+ doPevalApplyTerm (ITETerm _ c l r) v =+ return $ pevalITETerm c (pevalApplyTerm l v) (pevalApplyTerm r v)+ doPevalApplyTerm _ _ = Nothing++instance+ ( SupportedPrim (a --> b),+ SupportedNonFuncPrim a,+ SupportedPrim b+ ) =>+ PEvalApplyTerm (a --> b) a b+ where+ pevalApplyTerm = pevalGeneralFunApplyTerm+ sbvApplyTerm f a =+ withPrim @(a --> b) $ withNonFuncPrim @a $ f a+ parseGeneralFunSMTModelResult :: forall a b. (SupportedNonFuncPrim a, SupportedPrim b) =>@@ -263,7 +318,11 @@ let sym = IndexedSymbol "arg" level funs = second- (\r -> parseSMTModelResult (level + 1) (r, s))+ ( \r ->+ case r of+ [([], v)] -> parseSMTModelResult (level + 1) ([], v)+ _ -> parseSMTModelResult (level + 1) (r, s)+ ) <$> partitionCVArg @a l def = parseSMTModelResult (level + 1) ([], s) body =@@ -278,429 +337,210 @@ funs in buildGeneralFun (TypedSymbol sym) body -instance- (SupportedNonFuncPrim a, SupportedNonFuncPrim b) =>- SupportedPrim (a --> b)- where- defaultValue = buildGeneralFun (TypedSymbol "a") (conTerm defaultValue)- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun must have already been "- <> "partial evaluated away before reaching this point."- )- (typeRep @(a --> b))- symSBVName _ num = "gfunc2_" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- return $- SBV.uninterpret name- withPrim p r = withNonFuncPrim @a p $ withNonFuncPrim @b p r- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun is not supported for "- <> "equality comparison."- )- (typeRep @(a --> b))- parseSMTModelResult = parseGeneralFunSMTModelResult--instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c- ) =>- SupportedPrim (a --> b --> c)- where- defaultValue = buildGeneralFun (TypedSymbol "a") (conTerm defaultValue)- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun must have already been "- <> "partial evaluated away before reaching this point."- )- (typeRep @(a --> b --> c))- symSBVName _ num = "gfunc3_" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p r- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun is not supported for "- <> "equality comparison."- )- (typeRep @(a --> b --> c))- parseSMTModelResult = parseGeneralFunSMTModelResult--instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedNonFuncPrim d,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c,- SupportedPrim d- ) =>- SupportedPrim (a --> b --> c --> d)- where- defaultValue = buildGeneralFun (TypedSymbol "a") (conTerm defaultValue)- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun must have already been "- <> "partial evaluated away before reaching this point."- )- (typeRep @(a --> b --> c --> d))- symSBVName _ num = "gfunc4_" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p r- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun is not supported for "- <> "equality comparison."- )- (typeRep @(a --> b --> c --> d))- parseSMTModelResult = parseGeneralFunSMTModelResult--instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedNonFuncPrim d,- SupportedNonFuncPrim e,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c,- SupportedPrim d,- SupportedPrim e- ) =>- SupportedPrim (a --> b --> c --> d --> e)- where- defaultValue = buildGeneralFun (TypedSymbol "a") (conTerm defaultValue)- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun must have already been "- <> "partial evaluated away before reaching this point."- )- (typeRep @(a --> b --> c --> d --> e))- symSBVName _ num = "gfunc5_" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p r- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun is not supported for "- <> "equality comparison."- )- (typeRep @(a --> b --> c --> d --> e))- parseSMTModelResult = parseGeneralFunSMTModelResult--instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedNonFuncPrim d,- SupportedNonFuncPrim e,- SupportedNonFuncPrim f,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c,- SupportedPrim d,- SupportedPrim e,- SupportedPrim f- ) =>- SupportedPrim (a --> b --> c --> d --> e --> f)- where- defaultValue = buildGeneralFun (TypedSymbol "a") (conTerm defaultValue)- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun must have already been "- <> "partial evaluated away before reaching this point."- )- (typeRep @(a --> b --> c --> d --> e --> f))- symSBVName _ num = "gfunc6_" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p r- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun is not supported for "- <> "equality comparison."- )- (typeRep @(a --> b --> c --> d --> e --> f))- parseSMTModelResult = parseGeneralFunSMTModelResult--instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedNonFuncPrim d,- SupportedNonFuncPrim e,- SupportedNonFuncPrim f,- SupportedNonFuncPrim g,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c,- SupportedPrim d,- SupportedPrim e,- SupportedPrim f,- SupportedPrim g- ) =>- SupportedPrim (a --> b --> c --> d --> e --> f --> g)- where- defaultValue = buildGeneralFun (TypedSymbol "a") (conTerm defaultValue)- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun must have already been "- <> "partial evaluated away before reaching this point."- )- (typeRep @(a --> b --> c --> d --> e --> f --> g))- symSBVName _ num = "gfunc7_" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p $- withNonFuncPrim @g p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p $- withNonFuncPrim @g p r- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun is not supported for "- <> "equality comparison."- )- (typeRep @(a --> b --> c --> d --> e --> f --> g))- parseSMTModelResult = parseGeneralFunSMTModelResult--instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedNonFuncPrim d,- SupportedNonFuncPrim e,- SupportedNonFuncPrim f,- SupportedNonFuncPrim g,- SupportedNonFuncPrim h,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c,- SupportedPrim d,- SupportedPrim e,- SupportedPrim f,- SupportedPrim g,- SupportedPrim h- ) =>- SupportedPrim (a --> b --> c --> d --> e --> f --> g --> h)+-- | General procedure for substituting symbols in a term.+{-# NOINLINE generalSubstSomeTerm #-}+generalSubstSomeTerm ::+ forall v.+ (forall a. TypedSymbol 'AnyKind a -> Term a) ->+ HS.HashSet SomeTypedConstantSymbol ->+ Term v ->+ Term v+generalSubstSomeTerm subst initialBoundedSymbols = go initialMemo where- defaultValue = buildGeneralFun (TypedSymbol "a") (conTerm defaultValue)- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun must have already been "- <> "partial evaluated away before reaching this point."- )- (typeRep @(a --> b --> c --> d --> e --> f --> g --> h))- symSBVName _ num = "gfunc8_" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p $- withNonFuncPrim @g p $- withNonFuncPrim @h p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p $- withNonFuncPrim @g p $- withNonFuncPrim @h p r- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. GeneralFun is not supported for "- <> "equality comparison."- )- (typeRep @(a --> b --> c --> d --> e --> f --> g --> h))- parseSMTModelResult = parseGeneralFunSMTModelResult+ go :: forall a. (SomeTerm -> SomeTerm) -> Term a -> Term a+ go memo a = case memo $ someTerm a of+ SomeTerm v -> unsafeCoerce v+ initialMemo :: SomeTerm -> SomeTerm+ initialMemo = htmemo (goSome initialMemo initialBoundedSymbols)+ {-# NOINLINE initialMemo #-}+ goSome ::+ (SomeTerm -> SomeTerm) ->+ HS.HashSet SomeTypedConstantSymbol ->+ SomeTerm ->+ SomeTerm+ goSome _ bs c@(SomeTerm (ConTerm _ cv :: Term x)) =+ case (typeRep :: TypeRep x) of+ App (App gf _) _ ->+ case eqTypeRep gf (typeRep @(-->)) of+ Just HRefl -> case cv of+ GeneralFun sym (tm :: Term r) ->+ let newmemo =+ htmemo+ ( goSome+ newmemo+ (HS.union (HS.singleton (someTypedSymbol sym)) bs)+ )+ {-# NOINLINE newmemo #-}+ in SomeTerm $ conTerm $ GeneralFun sym (go newmemo tm)+ Nothing -> c+ _ -> c+ goSome _ bs c@(SomeTerm ((SymTerm _ sym) :: Term a)) =+ case castTypedSymbol sym of+ Just sym' | HS.member (someTypedSymbol sym') bs -> c+ _ -> SomeTerm $ subst sym+ goSome _ bs (SomeTerm (ForallTerm _ tsym b)) =+ let newmemo =+ htmemo (goSome newmemo (HS.insert (someTypedSymbol tsym) bs))+ {-# NOINLINE newmemo #-}+ in goUnary newmemo (forallTerm tsym) b+ goSome _ bs (SomeTerm (ExistsTerm _ tsym b)) =+ let newmemo =+ htmemo (goSome newmemo (HS.insert (someTypedSymbol tsym) bs))+ {-# NOINLINE newmemo #-}+ in goUnary newmemo (existsTerm tsym) b+ goSome memo _ (SomeTerm (UnaryTerm _ tag (arg :: Term a))) =+ goUnary memo (pevalUnary tag) arg+ goSome+ memo+ _+ (SomeTerm (BinaryTerm _ tag (arg1 :: Term a1) (arg2 :: Term a2))) =+ goBinary memo (pevalBinary tag) arg1 arg2+ goSome+ memo+ _+ ( SomeTerm+ ( TernaryTerm+ _+ tag+ (arg1 :: Term a1)+ (arg2 :: Term a2)+ (arg3 :: Term a3)+ )+ ) = do+ goTernary memo (pevalTernary tag) arg1 arg2 arg3+ goSome memo _ (SomeTerm (NotTerm _ arg)) =+ goUnary memo pevalNotTerm arg+ goSome memo _ (SomeTerm (OrTerm _ arg1 arg2)) =+ goBinary memo pevalOrTerm arg1 arg2+ goSome memo _ (SomeTerm (AndTerm _ arg1 arg2)) =+ goBinary memo pevalAndTerm arg1 arg2+ goSome memo _ (SomeTerm (EqTerm _ arg1 arg2)) =+ goBinary memo pevalEqTerm arg1 arg2+ goSome memo _ (SomeTerm (DistinctTerm _ args)) =+ SomeTerm $ pevalDistinctTerm (fmap (go memo) args)+ goSome memo _ (SomeTerm (ITETerm _ cond arg1 arg2)) =+ goTernary memo pevalITETerm cond arg1 arg2+ goSome memo _ (SomeTerm (AddNumTerm _ arg1 arg2)) =+ goBinary memo pevalAddNumTerm arg1 arg2+ goSome memo _ (SomeTerm (NegNumTerm _ arg)) =+ goUnary memo pevalNegNumTerm arg+ goSome memo _ (SomeTerm (MulNumTerm _ arg1 arg2)) =+ goBinary memo pevalMulNumTerm arg1 arg2+ goSome memo _ (SomeTerm (AbsNumTerm _ arg)) =+ goUnary memo pevalAbsNumTerm arg+ goSome memo _ (SomeTerm (SignumNumTerm _ arg)) =+ goUnary memo pevalSignumNumTerm arg+ goSome memo _ (SomeTerm (LtOrdTerm _ arg1 arg2)) =+ goBinary memo pevalLtOrdTerm arg1 arg2+ goSome memo _ (SomeTerm (LeOrdTerm _ arg1 arg2)) =+ goBinary memo pevalLeOrdTerm arg1 arg2+ goSome memo _ (SomeTerm (AndBitsTerm _ arg1 arg2)) =+ goBinary memo pevalAndBitsTerm arg1 arg2+ goSome memo _ (SomeTerm (OrBitsTerm _ arg1 arg2)) =+ goBinary memo pevalOrBitsTerm arg1 arg2+ goSome memo _ (SomeTerm (XorBitsTerm _ arg1 arg2)) =+ goBinary memo pevalXorBitsTerm arg1 arg2+ goSome memo _ (SomeTerm (ComplementBitsTerm _ arg)) =+ goUnary memo pevalComplementBitsTerm arg+ goSome memo _ (SomeTerm (ShiftLeftTerm _ arg n)) =+ goBinary memo pevalShiftLeftTerm arg n+ goSome memo _ (SomeTerm (RotateLeftTerm _ arg n)) =+ goBinary memo pevalRotateLeftTerm arg n+ goSome memo _ (SomeTerm (ShiftRightTerm _ arg n)) =+ goBinary memo pevalShiftRightTerm arg n+ goSome memo _ (SomeTerm (RotateRightTerm _ arg n)) =+ goBinary memo pevalRotateRightTerm arg n+ goSome memo _ (SomeTerm (BitCastTerm _ (arg :: Term a) :: Term r)) =+ goUnary memo (pevalBitCastTerm @a @r) arg+ goSome memo _ (SomeTerm (BitCastOrTerm _ (d :: term r) (arg :: Term a) :: Term r)) =+ goBinary memo (pevalBitCastOrTerm @a @r) d arg+ goSome memo _ (SomeTerm (BVConcatTerm _ arg1 arg2)) =+ goBinary memo pevalBVConcatTerm arg1 arg2+ goSome memo _ (SomeTerm (BVSelectTerm _ ix w arg)) =+ goUnary memo (pevalBVSelectTerm ix w) arg+ goSome memo _ (SomeTerm (BVExtendTerm _ n signed arg)) =+ goUnary memo (pevalBVExtendTerm n signed) arg+ goSome memo _ (SomeTerm (ApplyTerm _ f arg)) =+ goBinary memo pevalApplyTerm f arg+ goSome memo _ (SomeTerm (DivIntegralTerm _ arg1 arg2)) =+ goBinary memo pevalDivIntegralTerm arg1 arg2+ goSome memo _ (SomeTerm (ModIntegralTerm _ arg1 arg2)) =+ goBinary memo pevalModIntegralTerm arg1 arg2+ goSome memo _ (SomeTerm (QuotIntegralTerm _ arg1 arg2)) =+ goBinary memo pevalQuotIntegralTerm arg1 arg2+ goSome memo _ (SomeTerm (RemIntegralTerm _ arg1 arg2)) =+ goBinary memo pevalRemIntegralTerm arg1 arg2+ goSome memo _ (SomeTerm (FPTraitTerm _ trait arg)) =+ goUnary memo (pevalFPTraitTerm trait) arg+ goSome memo _ (SomeTerm (FdivTerm _ arg1 arg2)) =+ goBinary memo pevalFdivTerm arg1 arg2+ goSome memo _ (SomeTerm (RecipTerm _ arg)) =+ goUnary memo pevalRecipTerm arg+ goSome memo _ (SomeTerm (FloatingUnaryTerm _ op arg)) =+ goUnary memo (pevalFloatingUnaryTerm op) arg+ goSome memo _ (SomeTerm (PowerTerm _ arg1 arg2)) =+ goBinary memo pevalPowerTerm arg1 arg2+ goSome memo _ (SomeTerm (FPUnaryTerm _ op arg)) =+ goUnary memo (pevalFPUnaryTerm op) arg+ goSome memo _ (SomeTerm (FPBinaryTerm _ op arg1 arg2)) =+ goBinary memo (pevalFPBinaryTerm op) arg1 arg2+ goSome memo _ (SomeTerm (FPRoundingUnaryTerm _ op mode arg)) =+ goUnary memo (pevalFPRoundingUnaryTerm op mode) arg+ goSome memo _ (SomeTerm (FPRoundingBinaryTerm _ op mode arg1 arg2)) =+ goBinary memo (pevalFPRoundingBinaryTerm op mode) arg1 arg2+ goSome memo _ (SomeTerm (FPFMATerm _ mode arg1 arg2 arg3)) =+ SomeTerm $+ pevalFPFMATerm+ (go memo mode)+ (go memo arg1)+ (go memo arg2)+ (go memo arg3)+ goSome memo _ (SomeTerm (FromIntegralTerm _ (arg :: Term a) :: Term b)) =+ goUnary memo (pevalFromIntegralTerm @a @b) arg+ goSome memo _ (SomeTerm (FromFPOrTerm _ d mode arg)) =+ goTernary memo pevalFromFPOrTerm d mode arg+ goSome+ memo+ _+ (SomeTerm (ToFPTerm _ mode (arg :: Term a) (_ :: p eb) (_ :: q sb))) =+ goBinary memo (pevalToFPTerm @a @eb @sb) mode arg+ goUnary memo f a = SomeTerm $ f (go memo a)+ goBinary memo f a b = SomeTerm $ f (go memo a) (go memo b)+ goTernary memo f a b c =+ SomeTerm $ f (go memo a) (go memo b) (go memo c) -pevalGeneralFunApplyTerm ::- ( SupportedNonFuncPrim a,- SupportedPrim b,- SupportedPrim (a --> b)- ) =>- Term (a --> b) ->+-- | Substitute a term for a symbol in a term.+substTerm ::+ forall knd a b.+ (SupportedPrim a, SupportedPrim b, IsSymbolKind knd) =>+ TypedSymbol knd a -> Term a ->+ Term b -> Term b-pevalGeneralFunApplyTerm = totalize2 doPevalApplyTerm applyTerm- where- doPevalApplyTerm (ConTerm _ (GeneralFun arg tm)) v =- Just $ substTerm arg v tm- doPevalApplyTerm (ITETerm _ c l r) v =- return $ pevalITETerm c (pevalApplyTerm l v) (pevalApplyTerm r v)- doPevalApplyTerm _ _ = Nothing--instance- ( SupportedPrim (a --> b),- SupportedNonFuncPrim a,- SupportedPrim b- ) =>- PEvalApplyTerm (a --> b) a b- where- pevalApplyTerm = pevalGeneralFunApplyTerm- sbvApplyTerm p f a =- withPrim @(a --> b) p $ withNonFuncPrim @a p $ f a+substTerm sym a =+ generalSubstSomeTerm+ ( \t@(TypedSymbol t') ->+ if eqHeteroSymbol sym t then unsafeCoerce a else symTerm t'+ )+ HS.empty --- | Substitute a term for a symbol in a term.-substTerm :: forall a b. (SupportedPrim a, SupportedPrim b) => TypedSymbol a -> Term a -> Term b -> Term b-substTerm sym term = gov- where- gov :: (SupportedPrim x) => Term x -> Term x- gov b = case go (SomeTerm b) of- SomeTerm v -> unsafeCoerce v- go :: SomeTerm -> SomeTerm- go = htmemo $ \stm@(SomeTerm (tm :: Term v)) ->- case tm of- ConTerm _ cv -> case (typeRep :: TypeRep v) of- App (App gf _) _ ->- case eqTypeRep gf (typeRep @(-->)) of- Just HRefl -> case cv of- GeneralFun sym1 tm1 ->- if someTypedSymbol sym1 == someTypedSymbol sym- then stm- else SomeTerm $ conTerm $ GeneralFun sym1 (gov tm1)- Nothing -> stm- _ -> stm- SymTerm _ ts -> SomeTerm $ if someTypedSymbol ts == someTypedSymbol sym then unsafeCoerce term else tm- UnaryTerm _ tag te -> SomeTerm $ pevalUnary tag (gov te)- BinaryTerm _ tag te te' -> SomeTerm $ pevalBinary tag (gov te) (gov te')- TernaryTerm _ tag op1 op2 op3 -> SomeTerm $ pevalTernary tag (gov op1) (gov op2) (gov op3)- NotTerm _ op -> SomeTerm $ pevalNotTerm (gov op)- OrTerm _ op1 op2 -> SomeTerm $ pevalOrTerm (gov op1) (gov op2)- AndTerm _ op1 op2 -> SomeTerm $ pevalAndTerm (gov op1) (gov op2)- EqTerm _ op1 op2 -> SomeTerm $ pevalEqTerm (gov op1) (gov op2)- ITETerm _ c op1 op2 -> SomeTerm $ pevalITETerm (gov c) (gov op1) (gov op2)- AddNumTerm _ op1 op2 -> SomeTerm $ pevalAddNumTerm (gov op1) (gov op2)- NegNumTerm _ op -> SomeTerm $ pevalNegNumTerm (gov op)- MulNumTerm _ op1 op2 -> SomeTerm $ pevalMulNumTerm (gov op1) (gov op2)- AbsNumTerm _ op -> SomeTerm $ pevalAbsNumTerm (gov op)- SignumNumTerm _ op -> SomeTerm $ pevalSignumNumTerm (gov op)- LtOrdTerm _ op1 op2 -> SomeTerm $ pevalLtOrdTerm (gov op1) (gov op2)- LeOrdTerm _ op1 op2 -> SomeTerm $ pevalLeOrdTerm (gov op1) (gov op2)- AndBitsTerm _ op1 op2 -> SomeTerm $ pevalAndBitsTerm (gov op1) (gov op2)- OrBitsTerm _ op1 op2 -> SomeTerm $ pevalOrBitsTerm (gov op1) (gov op2)- XorBitsTerm _ op1 op2 -> SomeTerm $ pevalXorBitsTerm (gov op1) (gov op2)- ComplementBitsTerm _ op -> SomeTerm $ pevalComplementBitsTerm (gov op)- ShiftLeftTerm _ op n -> SomeTerm $ pevalShiftLeftTerm (gov op) (gov n)- RotateLeftTerm _ op n -> SomeTerm $ pevalRotateLeftTerm (gov op) (gov n)- ShiftRightTerm _ op n -> SomeTerm $ pevalShiftRightTerm (gov op) (gov n)- RotateRightTerm _ op n -> SomeTerm $ pevalRotateRightTerm (gov op) (gov n)- ToSignedTerm _ op -> SomeTerm $ pevalBVToSignedTerm op- ToUnsignedTerm _ op -> SomeTerm $ pevalBVToUnsignedTerm op- BVConcatTerm _ op1 op2 -> SomeTerm $ pevalBVConcatTerm (gov op1) (gov op2)- BVSelectTerm _ ix w op -> SomeTerm $ pevalBVSelectTerm ix w (gov op)- BVExtendTerm _ n signed op -> SomeTerm $ pevalBVExtendTerm n signed (gov op)- ApplyTerm _ f op -> SomeTerm $ pevalApplyTerm (gov f) (gov op)- 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)- FPTraitTerm _ trait op -> SomeTerm $ pevalFPTraitTerm trait (gov op)- FdivTerm _ op1 op2 -> SomeTerm $ pevalFdivTerm (gov op1) (gov op2)- RecipTerm _ op -> SomeTerm $ pevalRecipTerm (gov op)- SqrtTerm _ op -> SomeTerm $ pevalSqrtTerm (gov op)- FPUnaryTerm _ uop op -> SomeTerm $ pevalFPUnaryTerm uop (gov op)- FPBinaryTerm _ bop op1 op2 -> SomeTerm $ pevalFPBinaryTerm bop (gov op1) (gov op2)- FPRoundingUnaryTerm _ uop mode op -> SomeTerm $ pevalFPRoundingUnaryTerm uop mode (gov op)- FPRoundingBinaryTerm _ bop mode op1 op2 -> SomeTerm $ pevalFPRoundingBinaryTerm bop mode (gov op1) (gov op2)- FPFMATerm _ mode op1 op2 op3 -> SomeTerm $ pevalFPFMATerm (gov mode) (gov op1) (gov op2) (gov op3)+supportedPrimFunUpTo+ [|buildGeneralFun (TypedSymbol "a") (conTerm defaultValue)|]+ [|parseGeneralFunSMTModelResult|]+ ( \tyVars ->+ [|+ translateTypeError+ (Just "x")+ ( typeRep ::+ TypeRep+ $( foldl1 (\fty ty -> [t|$ty --> $fty|])+ . reverse+ $ tyVars+ )+ )+ |]+ )+ "GeneralFun"+ "gfunc"+ ''(-->)+ 8
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/BVPEval.hs view
@@ -1,22 +1,34 @@+{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-} {-# HLINT ignore "Eta reduce" #-}-{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +-- |+-- Module : Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only module Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval () where +import Data.Kind (Type) import Data.Maybe (isJust) import Data.Proxy (Proxy (Proxy)) import qualified Data.SBV as SBV import Data.Typeable (type (:~:) (Refl))-import GHC.TypeNats (KnownNat, natVal, sameNat, type (+), type (-), type (<=))+import GHC.TypeNats (KnownNat, Nat, natVal, sameNat, type (+), type (-), type (<=)) import Grisette.Internal.Core.Data.Class.BitVector ( SizedBV ( sizedBVConcat,@@ -26,22 +38,13 @@ sizedBVZext ), )-import Grisette.Internal.Core.Data.Class.SignConversion- ( SignConversion (toSigned, toUnsigned),- ) import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm (doPevalBitCast) import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim ( bvIsNonZeroFromGEq1, ) import Grisette.Internal.SymPrim.Prim.Internal.Term- ( PEvalBVSignConversionTerm- ( pevalBVToSignedTerm,- pevalBVToUnsignedTerm,- sbvToSigned,- sbvToUnsigned,- withSbvSignConversionTermConstraint- ),- PEvalBVTerm+ ( PEvalBVTerm ( pevalBVConcatTerm, pevalBVExtendTerm, pevalBVSelectTerm,@@ -49,26 +52,25 @@ sbvBVExtendTerm, sbvBVSelectTerm ),- SupportedPrim (withPrim),+ PEvalBitCastTerm (pevalBitCastTerm, sbvBitCast), Term ( BVConcatTerm, BVExtendTerm, BVSelectTerm,- ConTerm,- ToSignedTerm,- ToUnsignedTerm+ BitCastTerm,+ ConTerm ),+ bitCastTerm, bvconcatTerm, bvextendTerm, bvselectTerm, conTerm,- toSignedTerm,- toUnsignedTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold ( binaryUnfoldOnce, unaryUnfoldOnce, )+import Grisette.Internal.SymPrim.Prim.Internal.Utils (pattern Dyn) import Grisette.Internal.SymPrim.Prim.TermUtils (castTerm) import Grisette.Internal.Utils.Parameterized ( LeqProof (LeqProof),@@ -86,58 +88,24 @@ withKnownProof, ) -instance PEvalBVSignConversionTerm WordN IntN where- pevalBVToSignedTerm = unaryUnfoldOnce doPevalToSignedTerm toSignedTerm- where- doPevalToSignedTerm ::- forall n.- (KnownNat n, 1 <= n) =>- Term (WordN n) ->- Maybe (Term (IntN n))- doPevalToSignedTerm (ConTerm _ b) = Just $ conTerm $ toSigned b- doPevalToSignedTerm (ToUnsignedTerm _ b) = Just b >>= castTerm- doPevalToSignedTerm (BVConcatTerm _ b1 b2) =- Just $- pevalBVConcatTerm (pevalBVToSignedTerm b1) (pevalBVToSignedTerm b2)- doPevalToSignedTerm (BVExtendTerm _ signed pr b) =- Just $ pevalBVExtendTerm signed pr $ pevalBVToSignedTerm b- doPevalToSignedTerm _ = Nothing- pevalBVToUnsignedTerm = unaryUnfoldOnce doPevalToUnsignedTerm toUnsignedTerm- where- doPevalToUnsignedTerm ::- forall n.- (KnownNat n, 1 <= n) =>- Term (IntN n) ->- Maybe (Term (WordN n))- doPevalToUnsignedTerm (ConTerm _ b) = Just $ conTerm $ toUnsigned b- doPevalToUnsignedTerm (ToSignedTerm _ b) = Just b >>= castTerm- doPevalToUnsignedTerm (BVConcatTerm _ b1 b2) =- Just $- pevalBVConcatTerm- (pevalBVToUnsignedTerm b1)- (pevalBVToUnsignedTerm b2)- doPevalToUnsignedTerm (BVExtendTerm _ signed pr b) =- Just $ pevalBVExtendTerm signed pr $ pevalBVToUnsignedTerm b- doPevalToUnsignedTerm _ = Nothing- withSbvSignConversionTermConstraint (_ :: p n) qint r =- withPrim @(WordN n) qint r- pevalDefaultBVSelectTerm ::- forall bv n ix w p q.+ forall (bv2 :: Nat -> Type) bv n ix w p q. ( KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, ix + w <= n,- PEvalBVTerm bv+ PEvalBVTerm bv,+ forall x. (KnownNat x, 1 <= x) => PEvalBitCastTerm (bv2 x) (bv x),+ PEvalBVTerm bv2 ) => p ix -> q w -> Term (bv n) -> Term (bv w) pevalDefaultBVSelectTerm ix w =- unaryUnfoldOnce (doPevalDefaultBVSelectTerm ix w) (bvselectTerm ix w)+ unaryUnfoldOnce (doPevalDefaultBVSelectTerm @bv2 ix w) (bvselectTerm ix w) unsafePevalBVSelectTerm :: forall bv n ix w.@@ -158,14 +126,16 @@ (LeqProof, LeqProof, LeqProof) -> pevalBVSelectTerm ix w term doPevalDefaultBVSelectTerm ::- forall bv n ix w p q.+ forall (bv2 :: Nat -> Type) bv n ix w p q. ( KnownNat n, KnownNat ix, KnownNat w,+ forall x. (KnownNat x, 1 <= x) => PEvalBitCastTerm (bv2 x) (bv x), 1 <= n, 1 <= w, ix + w <= n,- PEvalBVTerm bv+ PEvalBVTerm bv,+ PEvalBVTerm bv2 ) => p ix -> q w ->@@ -177,10 +147,8 @@ Just rhs >>= castTerm doPevalDefaultBVSelectTerm ix w (ConTerm _ b) = Just $ conTerm $ sizedBVSelect ix w b-doPevalDefaultBVSelectTerm ix w (ToSignedTerm _ b) =- Just $ pevalBVToSignedTerm $ pevalBVSelectTerm ix w b-doPevalDefaultBVSelectTerm ix w (ToUnsignedTerm _ b) =- Just $ pevalBVToUnsignedTerm $ pevalBVSelectTerm ix w b+doPevalDefaultBVSelectTerm ix w (BitCastTerm _ (Dyn (b :: Term (bv2 n)))) =+ Just $ pevalBitCastTerm $ pevalBVSelectTerm ix w b doPevalDefaultBVSelectTerm pix pw@@ -497,18 +465,18 @@ doPevalDefaultBVConcatTerm _ _ = Nothing instance PEvalBVTerm WordN where- pevalBVSelectTerm = pevalDefaultBVSelectTerm+ pevalBVSelectTerm = pevalDefaultBVSelectTerm @IntN pevalBVConcatTerm = pevalDefaultBVConcatTerm pevalBVExtendTerm = pevalDefaultBVExtendTerm- sbvBVConcatTerm _ pl pr l r =+ sbvBVConcatTerm pl pr l r = bvIsNonZeroFromGEq1 pl $ bvIsNonZeroFromGEq1 pr $ l SBV.# r- sbvBVSelectTerm _ (pix :: p0 ix) (pw :: p1 w) (pn :: p2 n) bv =+ sbvBVSelectTerm (pix :: p0 ix) (pw :: p1 w) (pn :: p2 n) bv = bvIsNonZeroFromGEq1 (Proxy @n) $ bvIsNonZeroFromGEq1 (Proxy @w) $ sbvDefaultBVSelectTerm pix pw pn bv- sbvBVExtendTerm _ (_ :: p0 l) (_ :: p1 r) signed bv =+ sbvBVExtendTerm (_ :: p0 l) (_ :: p1 r) signed bv = withKnownProof (unsafeKnownProof @(r - l) (natVal (Proxy @r) - natVal (Proxy @l))) $ case (unsafeLeqProof @(l + 1) @r, unsafeLeqProof @1 @(r - l)) of@@ -519,24 +487,24 @@ if signed then SBV.signExtend bv else SBV.zeroExtend bv instance PEvalBVTerm IntN where- pevalBVSelectTerm = pevalDefaultBVSelectTerm+ pevalBVSelectTerm = pevalDefaultBVSelectTerm @WordN pevalBVConcatTerm = pevalDefaultBVConcatTerm pevalBVExtendTerm = pevalDefaultBVExtendTerm- sbvBVConcatTerm pn (pl :: p l) (pr :: q r) l r =+ sbvBVConcatTerm (pl :: p l) (pr :: q r) l r = bvIsNonZeroFromGEq1 pl $ bvIsNonZeroFromGEq1 pr $ withKnownNat (addNat (natRepr @l) (natRepr @r)) $ case unsafeLeqProof @1 @(l + r) of LeqProof -> bvIsNonZeroFromGEq1 (Proxy @(l + r)) $- sbvToSigned (Proxy @WordN) (Proxy @(l + r)) pn $- sbvToUnsigned (Proxy @IntN) pl pn l- SBV.# sbvToUnsigned (Proxy @IntN) pr pn r- sbvBVSelectTerm _ (pix :: p0 ix) (pw :: p1 w) (pn :: p2 n) bv =+ sbvBitCast @(WordN (l + r)) @(IntN (l + r)) $+ (sbvBitCast @(IntN l) @(WordN l) l)+ SBV.# (sbvBitCast @(IntN r) @(WordN r) r)+ sbvBVSelectTerm (pix :: p0 ix) (pw :: p1 w) (pn :: p2 n) bv = bvIsNonZeroFromGEq1 (Proxy @n) $ bvIsNonZeroFromGEq1 (Proxy @w) $ sbvDefaultBVSelectTerm pix pw pn bv- sbvBVExtendTerm _ (_ :: p0 l) (_ :: p1 r) signed bv =+ sbvBVExtendTerm (_ :: p0 l) (_ :: p1 r) signed bv = withKnownProof (unsafeKnownProof @(r - l) (natVal (Proxy @r) - natVal (Proxy @l))) $ case (unsafeLeqProof @(l + 1) @r, unsafeLeqProof @1 @(r - l)) of@@ -580,3 +548,37 @@ bvIsNonZeroFromGEq1 (Proxy @n) $ bvIsNonZeroFromGEq1 (Proxy @w) $ SBV.bvExtract (Proxy @(w + ix - 1)) (Proxy @ix) bv++instance (KnownNat n, 1 <= n) => PEvalBitCastTerm (WordN n) (IntN n) where+ pevalBitCastTerm = unaryUnfoldOnce doPevalBitCastBV bitCastTerm+ where+ doPevalBitCastBV :: Term (WordN n) -> Maybe (Term (IntN n))+ doPevalBitCastBV+ (BVConcatTerm _ (l :: Term (WordN l)) (r :: Term (WordN r))) =+ Just $+ pevalBVConcatTerm+ (pevalBitCastTerm @(WordN l) @(IntN l) l)+ (pevalBitCastTerm @(WordN r) @(IntN r) r)+ doPevalBitCastBV (BVExtendTerm _ signed pr (b :: Term (WordN l))) =+ Just $+ pevalBVExtendTerm signed pr $+ pevalBitCastTerm @(WordN l) @(IntN l) b+ doPevalBitCastBV v = doPevalBitCast v+ sbvBitCast = bvIsNonZeroFromGEq1 (Proxy @n) SBV.sFromIntegral++instance (KnownNat n, 1 <= n) => PEvalBitCastTerm (IntN n) (WordN n) where+ pevalBitCastTerm = unaryUnfoldOnce doPevalBitCastBV bitCastTerm+ where+ doPevalBitCastBV :: Term (IntN n) -> Maybe (Term (WordN n))+ doPevalBitCastBV+ (BVConcatTerm _ (l :: Term (IntN l)) (r :: Term (IntN r))) =+ Just $+ pevalBVConcatTerm+ (pevalBitCastTerm @(IntN l) @(WordN l) l)+ (pevalBitCastTerm @(IntN r) @(WordN r) r)+ doPevalBitCastBV (BVExtendTerm _ signed pr (b :: Term (IntN l))) =+ Just $+ pevalBVExtendTerm signed pr $+ pevalBitCastTerm @(IntN l) @(WordN l) b+ doPevalBitCastBV v = doPevalBitCast v+ sbvBitCast = bvIsNonZeroFromGEq1 (Proxy @n) SBV.sFromIntegral
+ src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalBitCastTerm.hs view
@@ -0,0 +1,135 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm+ ( doPevalBitCast,+ )+where++import qualified Data.SBV as SBV+import GHC.TypeLits (KnownNat, type (+), type (<=))+import Grisette.Internal.Core.Data.Class.BitCast+ ( BitCast (bitCast),+ BitCastOr (bitCastOr),+ )+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.FP (FP, ValidFP, withValidFPProofs)+import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim ()+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( PEvalBitCastOrTerm (pevalBitCastOrTerm, sbvBitCastOr),+ PEvalBitCastTerm (pevalBitCastTerm, sbvBitCast),+ SupportedNonFuncPrim,+ Term (BitCastTerm, ConTerm),+ bitCastOrTerm,+ bitCastTerm,+ conTerm,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Unfold (binaryUnfoldOnce, unaryUnfoldOnce)+import Grisette.Internal.SymPrim.Prim.Internal.Utils (pattern Dyn)++doPevalBitCastSameType ::+ forall x b. (SupportedNonFuncPrim b) => Term x -> Maybe (Term b)+doPevalBitCastSameType (BitCastTerm _ (Dyn (b :: Term b))) = Just b+doPevalBitCastSameType (BitCastTerm _ x) = doPevalBitCastSameType x+doPevalBitCastSameType _ = Nothing++-- | Partially evaluate a bitcast term. If no reduction is performed, return+-- Nothing.+doPevalBitCast :: (PEvalBitCastTerm a b) => Term a -> Maybe (Term b)+doPevalBitCast (ConTerm _ v) = Just $ conTerm $ bitCast v+doPevalBitCast t = doPevalBitCastSameType t++pevalBitCastGeneral ::+ forall a b.+ (PEvalBitCastTerm a b) =>+ Term a ->+ Term b+pevalBitCastGeneral = unaryUnfoldOnce doPevalBitCast bitCastTerm++doPevalBitCastOr ::+ (PEvalBitCastOrTerm a b) =>+ Term b ->+ Term a ->+ Maybe (Term b)+doPevalBitCastOr (ConTerm _ d) (ConTerm _ v) = Just $ conTerm $ bitCastOr d v+doPevalBitCastOr _ _ = Nothing++pevalBitCastOr ::+ forall a b.+ (PEvalBitCastOrTerm a b) =>+ Term b ->+ Term a ->+ Term b+pevalBitCastOr =+ binaryUnfoldOnce doPevalBitCastOr bitCastOrTerm++instance PEvalBitCastTerm Bool (IntN 1) where+ pevalBitCastTerm = pevalBitCastGeneral+ sbvBitCast x = SBV.ite x (SBV.literal 1) (SBV.literal 0)++instance PEvalBitCastTerm Bool (WordN 1) where+ pevalBitCastTerm = pevalBitCastGeneral+ sbvBitCast x = SBV.ite x (SBV.literal 1) (SBV.literal 0)++instance PEvalBitCastTerm (IntN 1) Bool where+ pevalBitCastTerm = pevalBitCastGeneral+ sbvBitCast x = SBV.sTestBit x 0++instance PEvalBitCastTerm (WordN 1) Bool where+ pevalBitCastTerm = pevalBitCastGeneral+ sbvBitCast x = SBV.sTestBit x 0++instance+ (n ~ (eb + sb), ValidFP eb sb, KnownNat n, 1 <= n) =>+ PEvalBitCastTerm (WordN n) (FP eb sb)+ where+ pevalBitCastTerm = pevalBitCastGeneral+ sbvBitCast = withValidFPProofs @eb @sb $ SBV.sWordAsSFloatingPoint++instance+ (n ~ (eb + sb), ValidFP eb sb, KnownNat n, 1 <= n) =>+ PEvalBitCastTerm (IntN n) (FP eb sb)+ where+ pevalBitCastTerm = pevalBitCastGeneral+ sbvBitCast =+ withValidFPProofs @eb @sb $ SBV.sWordAsSFloatingPoint . SBV.sFromIntegral++instance+ (n ~ (eb + sb), ValidFP eb sb, KnownNat n, 1 <= n) =>+ PEvalBitCastOrTerm (FP eb sb) (WordN n)+ where+ pevalBitCastOrTerm = pevalBitCastOr+ sbvBitCastOr d v =+ withValidFPProofs @eb @sb $+ SBV.ite+ (SBV.fpIsNaN v)+ d+ (SBV.sFloatingPointAsSWord v)++instance+ (n ~ (eb + sb), ValidFP eb sb, KnownNat n, 1 <= n) =>+ PEvalBitCastOrTerm (FP eb sb) (IntN n)+ where+ pevalBitCastOrTerm = pevalBitCastOr+ sbvBitCastOr d v =+ withValidFPProofs @eb @sb $+ SBV.ite+ (SBV.fpIsNaN v)+ d+ (SBV.sFromIntegral $ SBV.sFloatingPointAsSWord v)
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalBitwiseTerm.hs view
@@ -107,11 +107,11 @@ pevalOrBitsTerm = pevalDefaultOrBitsTerm pevalXorBitsTerm = pevalDefaultXorBitsTerm pevalComplementBitsTerm = pevalDefaultComplementBitsTerm- withSbvBitwiseTermConstraint p r = withPrim @(WordN n) p r+ withSbvBitwiseTermConstraint r = withPrim @(WordN n) r instance (KnownNat n, 1 <= n) => PEvalBitwiseTerm (IntN n) where pevalAndBitsTerm = pevalDefaultAndBitsTerm pevalOrBitsTerm = pevalDefaultOrBitsTerm pevalXorBitsTerm = pevalDefaultXorBitsTerm pevalComplementBitsTerm = pevalDefaultComplementBitsTerm- withSbvBitwiseTermConstraint p r = withPrim @(IntN n) p r+ withSbvBitwiseTermConstraint r = withPrim @(IntN n) r
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalDivModIntegralTerm.hs view
@@ -28,10 +28,6 @@ import GHC.TypeNats (KnownNat, type (<=)) import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim ()-import Grisette.Internal.SymPrim.Prim.Internal.IsZero- ( IsZeroCases (IsZeroEvidence, NonZeroEvidence),- KnownIsZero (isZero),- ) import Grisette.Internal.SymPrim.Prim.Internal.Term ( PEvalDivModIntegralTerm ( pevalDivIntegralTerm,@@ -50,7 +46,7 @@ ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (binaryUnfoldOnce) --- div+-- | Default partial evaluation of division operation for integral types. pevalDefaultDivIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a pevalDefaultDivIntegralTerm =@@ -63,6 +59,8 @@ doPevalDefaultDivIntegralTerm a (ConTerm _ 1) = Just a doPevalDefaultDivIntegralTerm _ _ = Nothing +-- | Default partial evaluation of division operation for bounded integral+-- types. pevalDefaultDivBoundedIntegralTerm :: (PEvalDivModIntegralTerm a, Bounded a) => Term a -> Term a -> Term a pevalDefaultDivBoundedIntegralTerm =@@ -78,7 +76,7 @@ doPevalDefaultDivBoundedIntegralTerm a (ConTerm _ 1) = Just a doPevalDefaultDivBoundedIntegralTerm _ _ = Nothing --- mod+-- | Default partial evaluation of modulo operation for integral types. pevalDefaultModIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a pevalDefaultModIntegralTerm =@@ -92,7 +90,7 @@ doPevalDefaultModIntegralTerm _ (ConTerm _ (-1)) = Just $ conTerm 0 doPevalDefaultModIntegralTerm _ _ = Nothing --- quot+-- | Default partial evaluation of quotient operation for integral types. pevalDefaultQuotIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a pevalDefaultQuotIntegralTerm =@@ -105,6 +103,8 @@ doPevalDefaultQuotIntegralTerm a (ConTerm _ 1) = Just a doPevalDefaultQuotIntegralTerm _ _ = Nothing +-- | Default partial evaluation of quotient operation for bounded integral+-- types. pevalDefaultQuotBoundedIntegralTerm :: (PEvalDivModIntegralTerm a, Bounded a) => Term a -> Term a -> Term a pevalDefaultQuotBoundedIntegralTerm =@@ -120,7 +120,7 @@ doPevalDefaultQuotBoundedIntegralTerm a (ConTerm _ 1) = Just a doPevalDefaultQuotBoundedIntegralTerm _ _ = Nothing --- rem+-- | Default partial evaluation of remainder operation for integral types. pevalDefaultRemIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a pevalDefaultRemIntegralTerm =@@ -139,20 +139,18 @@ pevalModIntegralTerm = pevalDefaultModIntegralTerm pevalQuotIntegralTerm = pevalDefaultQuotIntegralTerm pevalRemIntegralTerm = pevalDefaultRemIntegralTerm- withSbvDivModIntegralTermConstraint p r = case isZero p of- IsZeroEvidence -> r- NonZeroEvidence -> r+ withSbvDivModIntegralTermConstraint r = r instance (KnownNat n, 1 <= n) => PEvalDivModIntegralTerm (IntN n) where pevalDivIntegralTerm = pevalDefaultDivBoundedIntegralTerm pevalModIntegralTerm = pevalDefaultModIntegralTerm pevalQuotIntegralTerm = pevalDefaultQuotBoundedIntegralTerm pevalRemIntegralTerm = pevalDefaultRemIntegralTerm- withSbvDivModIntegralTermConstraint p r = withPrim @(IntN n) p r+ withSbvDivModIntegralTermConstraint r = withPrim @(IntN n) r instance (KnownNat n, 1 <= n) => PEvalDivModIntegralTerm (WordN n) where pevalDivIntegralTerm = pevalDefaultDivIntegralTerm pevalModIntegralTerm = pevalDefaultModIntegralTerm pevalQuotIntegralTerm = pevalDefaultQuotIntegralTerm pevalRemIntegralTerm = pevalDefaultRemIntegralTerm- withSbvDivModIntegralTermConstraint p r = withPrim @(WordN n) p r+ withSbvDivModIntegralTermConstraint r = withPrim @(WordN n) r
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFP.hs view
@@ -1,5 +1,13 @@ {-# LANGUAGE FlexibleContexts #-} +-- |+-- Module : Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP ( pevalFPTraitTerm, sbvFPTraitTerm,@@ -17,9 +25,27 @@ where import qualified Data.SBV as SBV+import Grisette.Internal.Core.Data.Class.IEEEFP+ ( IEEEFPOp+ ( fpMaximum,+ fpMaximumNumber,+ fpMinimum,+ fpMinimumNumber,+ fpRem+ ),+ IEEEFPRoundingOp+ ( fpAdd,+ fpDiv,+ fpFMA,+ fpMul,+ fpRoundToIntegral,+ fpSqrt,+ fpSub+ ),+ ) import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP) import Grisette.Internal.SymPrim.Prim.Internal.Term- ( FPBinaryOp (FPMax, FPMin, FPRem),+ ( FPBinaryOp (FPMaximum, FPMaximumNumber, FPMinimum, FPMinimumNumber, FPRem), FPRoundingBinaryOp (FPAdd, FPDiv, FPMul, FPSub), FPRoundingUnaryOp (FPRoundToIntegral, FPSqrt), FPTrait@@ -49,6 +75,7 @@ ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (unaryUnfoldOnce) +-- | Partially evaluate a floating-point trait term. pevalFPTraitTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPTrait ->@@ -96,6 +123,7 @@ goodFpIsNegative x = SBV.sNot (SBV.fpIsNaN x) SBV..&& SBV.fpIsNegative x {-# INLINE goodFpIsNegative #-} +-- | Lowering an floating-point trait term to sbv. sbvFPTraitTerm :: (ValidFP eb sb) => FPTrait ->@@ -118,6 +146,7 @@ sbvFPTraitTerm FPIsSubnormal = SBV.fpIsSubnormal sbvFPTraitTerm FPIsPoint = SBV.fpIsPoint +-- | Partially evaluate a floating-point unary term. pevalFPUnaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPUnaryOp ->@@ -126,6 +155,7 @@ pevalFPUnaryTerm = fpUnaryTerm {-# INLINE pevalFPUnaryTerm #-} +-- | Lowering an floating-point unary term to sbv. sbvFPUnaryTerm :: (ValidFP eb sb) => FPUnaryOp ->@@ -135,35 +165,77 @@ sbvFPUnaryTerm FPNeg = SBV.fpNeg {-# INLINE sbvFPUnaryTerm #-} +-- | Partially evaluate a floating-point binary term. pevalFPBinaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb)) => FPBinaryOp -> Term (FP eb sb) -> Term (FP eb sb) -> Term (FP eb sb)-pevalFPBinaryTerm = fpBinaryTerm+pevalFPBinaryTerm bop (ConTerm _ l) (ConTerm _ r) =+ case bop of+ FPMaximum -> conTerm $ fpMaximum l r+ FPMaximumNumber -> conTerm $ fpMaximumNumber l r+ FPMinimum -> conTerm $ fpMinimum l r+ FPMinimumNumber -> conTerm $ fpMinimumNumber l r+ FPRem -> conTerm $ fpRem l r+pevalFPBinaryTerm FPMaximum l r | l == r = l+pevalFPBinaryTerm FPMaximumNumber l r | l == r = l+pevalFPBinaryTerm FPMinimum l r | l == r = l+pevalFPBinaryTerm FPMinimumNumber l r | l == r = l+pevalFPBinaryTerm bop l r = fpBinaryTerm bop l r {-# INLINE pevalFPBinaryTerm #-} +sbvCmpHandleNegZero ::+ (ValidFP eb sb) =>+ SBV.SFloatingPoint eb sb ->+ SBV.SFloatingPoint eb sb ->+ SBV.SBool+sbvCmpHandleNegZero x y =+ SBV.ite+ (SBV.fpIsZero x SBV..&& SBV.fpIsZero y)+ (SBV.fpIsNegativeZero x)+ (x SBV..< y)++-- | Lowering an floating-point binary term to sbv. sbvFPBinaryTerm :: (ValidFP eb sb) => FPBinaryOp -> SBV.SFloatingPoint eb sb -> SBV.SFloatingPoint eb sb -> SBV.SFloatingPoint eb sb-sbvFPBinaryTerm FPRem = SBV.fpRem-sbvFPBinaryTerm FPMin = SBV.fpMin-sbvFPBinaryTerm FPMax = SBV.fpMax+sbvFPBinaryTerm FPRem x y = SBV.fpRem x y+sbvFPBinaryTerm FPMinimum x y =+ SBV.ite (SBV.fpIsNaN x SBV..|| SBV.fpIsNaN y) SBV.nan $+ SBV.ite (sbvCmpHandleNegZero x y) x y+sbvFPBinaryTerm FPMinimumNumber x y =+ SBV.ite (SBV.fpIsNaN x) y $+ SBV.ite (SBV.fpIsNaN y) x $+ SBV.ite (sbvCmpHandleNegZero x y) x y+sbvFPBinaryTerm FPMaximum x y =+ SBV.ite (SBV.fpIsNaN x SBV..|| SBV.fpIsNaN y) SBV.nan $+ SBV.ite (sbvCmpHandleNegZero x y) y x+sbvFPBinaryTerm FPMaximumNumber x y =+ SBV.ite (SBV.fpIsNaN x) y $+ SBV.ite (SBV.fpIsNaN y) x $+ SBV.ite (sbvCmpHandleNegZero x y) y x {-# INLINE sbvFPBinaryTerm #-} +-- | Partially evaluate a floating-point rounding unary term. pevalFPRoundingUnaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) => FPRoundingUnaryOp -> Term FPRoundingMode -> Term (FP eb sb) -> Term (FP eb sb)-pevalFPRoundingUnaryTerm = fpRoundingUnaryTerm+pevalFPRoundingUnaryTerm uop (ConTerm _ rd) (ConTerm _ l) =+ case uop of+ FPSqrt -> conTerm $ fpSqrt rd l+ FPRoundToIntegral -> conTerm $ fpRoundToIntegral rd l+pevalFPRoundingUnaryTerm uop rd l = fpRoundingUnaryTerm uop rd l {-# INLINE pevalFPRoundingUnaryTerm #-} +-- | Lowering an floating-point rounding unary term to sbv. sbvFPRoundingUnaryTerm :: (ValidFP eb sb) => FPRoundingUnaryOp ->@@ -174,6 +246,7 @@ sbvFPRoundingUnaryTerm FPRoundToIntegral = SBV.fpRoundToIntegral {-# INLINE sbvFPRoundingUnaryTerm #-} +-- | Partially evaluate a floating-point rounding binary term. pevalFPRoundingBinaryTerm :: (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) => FPRoundingBinaryOp ->@@ -181,9 +254,16 @@ Term (FP eb sb) -> Term (FP eb sb) -> Term (FP eb sb)-pevalFPRoundingBinaryTerm = fpRoundingBinaryTerm+pevalFPRoundingBinaryTerm bop (ConTerm _ rd) (ConTerm _ l) (ConTerm _ r) =+ case bop of+ FPAdd -> conTerm $ fpAdd rd l r+ FPSub -> conTerm $ fpSub rd l r+ FPMul -> conTerm $ fpMul rd l r+ FPDiv -> conTerm $ fpDiv rd l r+pevalFPRoundingBinaryTerm bop rd l r = fpRoundingBinaryTerm bop rd l r {-# INLINE pevalFPRoundingBinaryTerm #-} +-- | Lowering an floating-point rounding binary term to sbv. sbvFPRoundingBinaryTerm :: (ValidFP eb sb) => FPRoundingBinaryOp ->@@ -197,6 +277,7 @@ sbvFPRoundingBinaryTerm FPDiv = SBV.fpDiv {-# INLINE sbvFPRoundingBinaryTerm #-} +-- | Partially evaluate a floating-point fused multiply-add term. pevalFPFMATerm :: (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) => Term FPRoundingMode ->@@ -204,9 +285,12 @@ Term (FP eb sb) -> Term (FP eb sb) -> Term (FP eb sb)-pevalFPFMATerm = fpFMATerm+pevalFPFMATerm (ConTerm _ rd) (ConTerm _ x) (ConTerm _ y) (ConTerm _ z) =+ conTerm $ fpFMA rd x y z+pevalFPFMATerm rd x y z = fpFMATerm rd x y z {-# INLINE pevalFPFMATerm #-} +-- | Lowering an floating-point fused multiply-add term to sbv. sbvFPFMATerm :: (ValidFP eb sb) => SBV.SRoundingMode ->
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFloatingTerm.hs view
@@ -4,22 +4,51 @@ {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +-- |+-- Module : Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFloatingTerm+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFloatingTerm () where +import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.FP (FP, ValidFP) import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim () import Grisette.Internal.SymPrim.Prim.Internal.Term- ( PEvalFloatingTerm- ( pevalSqrtTerm,+ ( FloatingUnaryOp (FloatingAcosh, FloatingAsinh, FloatingAtanh, FloatingSqrt),+ PEvalFloatingTerm+ ( pevalFloatingUnaryTerm,+ pevalPowerTerm, withSbvFloatingTermConstraint ), SupportedPrim (withPrim),- sqrtTerm,+ floatingUnaryTerm,+ powerTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold ( generalUnaryUnfolded, ) instance (ValidFP eb sb) => PEvalFloatingTerm (FP eb sb) where- pevalSqrtTerm = generalUnaryUnfolded sqrt sqrtTerm- withSbvFloatingTermConstraint p r = withPrim @(FP eb sb) p r+ pevalFloatingUnaryTerm op =+ case op of+ FloatingSqrt -> generalUnaryUnfolded sqrt $ floatingUnaryTerm op+ _ -> error $ "operation " <> show op <> " not supported for FP"+ pevalPowerTerm = error "power operation not supported for FP"+ withSbvFloatingTermConstraint r = withPrim @(FP eb sb) r++instance PEvalFloatingTerm AlgReal where+ pevalFloatingUnaryTerm op =+ case op of+ FloatingAsinh ->+ error "operation asinh not supported by sbv for AlgReal"+ FloatingAcosh ->+ error "operation acosh not supported by sbv for AlgReal"+ FloatingAtanh ->+ error "operation atanh not supported by sbv for AlgReal"+ _ -> floatingUnaryTerm op+ pevalPowerTerm = powerTerm+ withSbvFloatingTermConstraint r = withPrim @AlgReal r
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFractionalTerm.hs view
@@ -5,22 +5,65 @@ {-# HLINT ignore "Eta reduce" #-} +-- |+-- Module : Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFractionalTerm+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFractionalTerm () where +import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.FP (FP, ValidFP) import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim () import Grisette.Internal.SymPrim.Prim.Internal.Term- ( PEvalFractionalTerm (pevalFdivTerm, pevalRecipTerm, withSbvFractionalTermConstraint),+ ( PEvalFractionalTerm+ ( pevalFdivTerm,+ pevalRecipTerm,+ withSbvFractionalTermConstraint+ ), SupportedPrim (withPrim),+ Term (ConTerm),+ conTerm, fdivTerm, recipTerm, ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold- ( generalBinaryUnfolded,+ ( binaryUnfoldOnce,+ generalBinaryUnfolded, generalUnaryUnfolded,+ unaryUnfoldOnce, ) instance (ValidFP eb sb) => PEvalFractionalTerm (FP eb sb) where pevalFdivTerm = generalBinaryUnfolded (/) fdivTerm pevalRecipTerm = generalUnaryUnfolded recip recipTerm- withSbvFractionalTermConstraint p r = withPrim @(FP eb sb) p r+ withSbvFractionalTermConstraint r = withPrim @(FP eb sb) r++pevalDefaultFdivTerm ::+ (PEvalFractionalTerm a) => Term a -> Term a -> Term a+pevalDefaultFdivTerm =+ binaryUnfoldOnce doPevalDefaultFdivTerm fdivTerm++doPevalDefaultFdivTerm ::+ (PEvalFractionalTerm a) => Term a -> Term a -> Maybe (Term a)+doPevalDefaultFdivTerm (ConTerm _ a) (ConTerm _ b)+ | b /= 0 = Just $ conTerm $ a / b+doPevalDefaultFdivTerm a (ConTerm _ 1) = Just a+doPevalDefaultFdivTerm _ _ = Nothing++pevalDefaultRecipTerm ::+ (PEvalFractionalTerm a) => Term a -> Term a+pevalDefaultRecipTerm = unaryUnfoldOnce doPevalDefaultRecipTerm recipTerm++doPevalDefaultRecipTerm ::+ (PEvalFractionalTerm a) => Term a -> Maybe (Term a)+doPevalDefaultRecipTerm (ConTerm _ n) | n /= 0 = Just $ conTerm $ recip n+doPevalDefaultRecipTerm _ = Nothing++instance PEvalFractionalTerm AlgReal where+ pevalFdivTerm = pevalDefaultFdivTerm+ pevalRecipTerm = pevalDefaultRecipTerm+ withSbvFractionalTermConstraint r = withPrim @AlgReal r
+ src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalFromIntegralTerm.hs view
@@ -0,0 +1,176 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm () where++import Data.Proxy (Proxy (Proxy))+import qualified Data.SBV as SBV+import qualified Data.SBV.Internals as SBVI+import GHC.TypeLits (KnownNat, type (<=))+import Grisette.Internal.SymPrim.AlgReal (AlgReal)+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.FP (FP, ValidFP)+import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim+ ( bvIsNonZeroFromGEq1,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( PEvalFromIntegralTerm (pevalFromIntegralTerm, sbvFromIntegralTerm),+ SupportedNonFuncPrim (withNonFuncPrim),+ Term (ConTerm),+ conTerm,+ fromIntegralTerm,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Unfold (unaryUnfoldOnce)++pevalFromIntegralTermGeneric :: (PEvalFromIntegralTerm a b) => Term a -> Term b+pevalFromIntegralTermGeneric =+ unaryUnfoldOnce doPEvalFromIntegralTerm fromIntegralTerm+ where+ doPEvalFromIntegralTerm (ConTerm _ a) = Just $ conTerm $ fromIntegral a+ doPEvalFromIntegralTerm _ = Nothing++instance PEvalFromIntegralTerm Integer AlgReal where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l = withNonFuncPrim @Integer $ SBV.sFromIntegral l++instance (KnownNat n, 1 <= n) => PEvalFromIntegralTerm Integer (WordN n) where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ withNonFuncPrim @Integer $+ SBV.sFromIntegral l++instance (KnownNat n, 1 <= n) => PEvalFromIntegralTerm Integer (IntN n) where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ withNonFuncPrim @Integer $+ SBV.sFromIntegral l++genericFPCast ::+ forall a r.+ (SBV.HasKind a, SBV.HasKind r) =>+ SBV.SRoundingMode ->+ SBV.SBV a ->+ SBV.SBV r+genericFPCast rm f = SBVI.SBV (SBVI.SVal kTo (Right (SBVI.cache r)))+ where+ kFrom = SBVI.kindOf f+ kTo = SBVI.kindOf (Proxy @r)+ r st = do+ msv <- SBVI.sbvToSV st rm+ xsv <- SBVI.sbvToSV st f+ SBVI.newExpr st kTo $+ SBVI.SBVApp+ (SBVI.IEEEFP (SBVI.FP_Cast kFrom kTo msv))+ [xsv]++instance (ValidFP eb sb) => PEvalFromIntegralTerm Integer (FP eb sb) where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ withNonFuncPrim @Integer $+ SBV.toSFloatingPoint SBV.sRoundNearestTiesToEven l++instance (KnownNat n, 1 <= n) => PEvalFromIntegralTerm (WordN n) Integer where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ withNonFuncPrim @Integer $+ SBV.sFromIntegral l++instance+ (KnownNat n, 1 <= n, KnownNat m, 1 <= m) =>+ PEvalFromIntegralTerm (WordN n) (WordN m)+ where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ bvIsNonZeroFromGEq1 (Proxy @m) $+ withNonFuncPrim @Integer $+ SBV.sFromIntegral l++instance+ (KnownNat n, 1 <= n, KnownNat m, 1 <= m) =>+ PEvalFromIntegralTerm (WordN n) (IntN m)+ where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ bvIsNonZeroFromGEq1 (Proxy @m) $+ withNonFuncPrim @Integer $+ SBV.sFromIntegral l++instance (KnownNat n, 1 <= n) => PEvalFromIntegralTerm (WordN n) AlgReal where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1+ (Proxy @n)+ (SBV.sFromIntegral (SBV.sFromIntegral l :: SBV.SInteger))++instance+ (KnownNat n, 1 <= n, ValidFP eb sb) =>+ PEvalFromIntegralTerm (WordN n) (FP eb sb)+ where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ genericFPCast SBV.sRoundNearestTiesToEven l++instance (KnownNat n, 1 <= n) => PEvalFromIntegralTerm (IntN n) Integer where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ withNonFuncPrim @Integer $+ SBV.sFromIntegral l++instance+ (KnownNat n, 1 <= n, KnownNat m, 1 <= m) =>+ PEvalFromIntegralTerm (IntN n) (WordN m)+ where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ bvIsNonZeroFromGEq1 (Proxy @m) $+ withNonFuncPrim @Integer $+ SBV.sFromIntegral l++instance+ (KnownNat n, 1 <= n, KnownNat m, 1 <= m) =>+ PEvalFromIntegralTerm (IntN n) (IntN m)+ where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ bvIsNonZeroFromGEq1 (Proxy @m) $+ withNonFuncPrim @Integer $+ SBV.sFromIntegral l++instance (KnownNat n, 1 <= n) => PEvalFromIntegralTerm (IntN n) AlgReal where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1+ (Proxy @n)+ (SBV.sFromIntegral (SBV.sFromIntegral l :: SBV.SInteger))++instance+ (KnownNat n, 1 <= n, ValidFP eb sb) =>+ PEvalFromIntegralTerm (IntN n) (FP eb sb)+ where+ pevalFromIntegralTerm = pevalFromIntegralTermGeneric+ sbvFromIntegralTerm l =+ bvIsNonZeroFromGEq1 (Proxy @n) $+ genericFPCast SBV.sRoundNearestTiesToEven l
+ src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalIEEEFPConvertibleTerm.hs view
@@ -0,0 +1,298 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm+ ( genericFPCast,+ )+where++import Data.Proxy (Proxy (Proxy))+import qualified Data.SBV as SBV+import qualified Data.SBV.Internals as SBVI+import GHC.TypeLits (KnownNat, Nat, type (<=))+import Grisette.Internal.Core.Data.Class.IEEEFP+ ( IEEEFPConstants (fpNaN, fpNegativeInfinite, fpNegativeZero, fpPositiveInfinite, fpPositiveZero),+ IEEEFPConvertible (fromFPOr, toFP),+ fpIsInfinite,+ fpIsNaN,+ fpIsNegativeInfinite,+ fpIsNegativeZero,+ fpIsPositiveInfinite,+ fpIsPositiveZero,+ )+import Grisette.Internal.SymPrim.AlgReal (AlgReal)+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.FP+ ( ConvertibleBound (convertibleLowerBound, convertibleUpperBound),+ FP,+ FPRoundingMode (RNA, RNE, RTN, RTP, RTZ),+ ValidFP,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim+ ( bvIsNonZeroFromGEq1,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( PEvalIEEEFPConvertibleTerm+ ( pevalFromFPOrTerm,+ pevalToFPTerm,+ sbvFromFPOrTerm,+ sbvToFPTerm+ ),+ SBVRep (SBVType),+ SupportedPrim (conSBVTerm),+ Term (ConTerm),+ conTerm,+ fromFPOrTerm,+ toFPTerm,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Unfold (binaryUnfoldOnce)++-- | Generic implementation for floating-point casting operators for sbv.+genericFPCast ::+ forall a r.+ (SBV.HasKind a, SBV.HasKind r) =>+ SBV.SRoundingMode ->+ SBV.SBV a ->+ SBV.SBV r+genericFPCast rm f = SBVI.SBV (SBVI.SVal kTo (Right (SBVI.cache r)))+ where+ kFrom = SBVI.kindOf f+ kTo = SBVI.kindOf (Proxy @r)+ r st = do+ msv <- SBVI.sbvToSV st rm+ xsv <- SBVI.sbvToSV st f+ SBVI.newExpr st kTo $+ SBVI.SBVApp+ (SBVI.IEEEFP (SBVI.FP_Cast kFrom kTo msv))+ [xsv]++boundedSBVFromFPTerm ::+ forall bv (n :: Nat) eb sb r.+ ( ValidFP eb sb,+ SBVI.HasKind r,+ SBVI.SymVal r,+ Bounded r,+ Num r,+ Ord r,+ SBVI.SBV r ~ SBVType (bv n),+ KnownNat n,+ 1 <= n,+ ConvertibleBound bv+ ) =>+ SBVI.SBV r ->+ SBVType FPRoundingMode ->+ SBVType (FP eb sb) ->+ SBVI.SBV r+boundedSBVFromFPTerm d mode l =+ SBV.ite+ ( SBV.fpIsNaN l+ SBV..|| SBV.fpIsInfinite l+ SBV..|| l SBV..< bound convertibleLowerBound+ SBV..|| l SBV..> bound convertibleUpperBound+ )+ d+ $ genericFPCast mode l+ where+ lst =+ [ (SBV.sRTP, RTP),+ (SBV.sRTN, RTN),+ (SBV.sRTZ, RTZ),+ (SBV.sRNE, RNE),+ (SBV.sRNA, RNA)+ ]+ bound f =+ foldl+ ( \acc (srm, rm) ->+ SBV.ite+ (mode SBV..== srm)+ (conSBVTerm (f (undefined :: bv n) rm :: FP eb sb))+ acc+ )+ (0 :: SBVType (FP eb sb))+ lst++generalPevalFromFPOrTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ IEEEFPConvertible a (FP eb sb) FPRoundingMode+ ) =>+ Term a ->+ Term FPRoundingMode ->+ Term (FP eb sb) ->+ Term a+generalPevalFromFPOrTerm (ConTerm _ d) (ConTerm _ rd) (ConTerm _ f) =+ conTerm $ fromFPOr d rd f+generalPevalFromFPOrTerm d _ (ConTerm _ f) | fpIsNaN f || fpIsInfinite f = d+generalPevalFromFPOrTerm d rd f = fromFPOrTerm d rd f++algRealPevalFromFPOrTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ IEEEFPConvertible a (FP eb sb) FPRoundingMode+ ) =>+ Term a ->+ Term FPRoundingMode ->+ Term (FP eb sb) ->+ Term a+algRealPevalFromFPOrTerm (ConTerm _ d) _ (ConTerm _ f) =+ conTerm $ fromFPOr d RNE f+algRealPevalFromFPOrTerm d _ (ConTerm _ f) | fpIsNaN f || fpIsInfinite f = d+algRealPevalFromFPOrTerm d _ f = fromFPOrTerm d (conTerm RNE) f++generalDoPevalToFPTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ IEEEFPConvertible a (FP eb sb) FPRoundingMode+ ) =>+ Term FPRoundingMode ->+ Term a ->+ Maybe (Term (FP eb sb))+generalDoPevalToFPTerm (ConTerm _ rd) (ConTerm _ f) =+ Just $ conTerm $ toFP rd f+generalDoPevalToFPTerm _ _ = Nothing++generalPevalToFPTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ IEEEFPConvertible a (FP eb sb) FPRoundingMode+ ) =>+ Term FPRoundingMode ->+ Term a ->+ Term (FP eb sb)+generalPevalToFPTerm = binaryUnfoldOnce generalDoPevalToFPTerm toFPTerm++fpDoPevalToFPTerm ::+ ( ValidFP eb sb,+ ValidFP eb1 sb1,+ IEEEFPConvertible (FP eb1 sb1) (FP eb sb) FPRoundingMode+ ) =>+ Term FPRoundingMode ->+ Term (FP eb1 sb1) ->+ Maybe (Term (FP eb sb))+fpDoPevalToFPTerm (ConTerm _ rd) (ConTerm _ f) =+ Just $ conTerm $ toFP rd f+fpDoPevalToFPTerm _ (ConTerm _ f)+ | fpIsNaN f = Just $ conTerm fpNaN+ | fpIsPositiveInfinite f = Just $ conTerm fpPositiveInfinite+ | fpIsNegativeInfinite f = Just $ conTerm fpNegativeInfinite+ | fpIsPositiveZero f = Just $ conTerm fpPositiveZero+ | fpIsNegativeZero f = Just $ conTerm fpNegativeZero+fpDoPevalToFPTerm _ _ = Nothing++fpPevalToFPTerm ::+ ( ValidFP eb sb,+ ValidFP eb1 sb1,+ IEEEFPConvertible (FP eb1 sb1) (FP eb sb) FPRoundingMode+ ) =>+ Term FPRoundingMode ->+ Term (FP eb1 sb1) ->+ Term (FP eb sb)+fpPevalToFPTerm = binaryUnfoldOnce fpDoPevalToFPTerm toFPTerm++instance PEvalIEEEFPConvertibleTerm Integer where+ pevalFromFPOrTerm = generalPevalFromFPOrTerm+ pevalToFPTerm = generalPevalToFPTerm+ sbvFromFPOrTerm d mode l =+ SBV.ite (SBV.fpIsNaN l SBV..|| SBV.fpIsInfinite l) d $+ let r = SBV.fromSFloatingPoint mode l :: SBV.SReal+ ifloor = SBV.sRealToSInteger r+ diff = r - SBV.sFromIntegral ifloor+ in SBV.ite (diff SBV..== 0) ifloor+ $ SBV.ite (mode SBV..== SBV.sRTN) ifloor+ $ SBV.ite (mode SBV..== SBV.sRTP) (ifloor + 1)+ $ SBV.ite+ (mode SBV..== SBV.sRTZ)+ (SBV.ite (ifloor SBV..< 0) (ifloor + 1) ifloor)+ $ SBV.ite+ (diff SBV..== 0.5)+ ( SBV.ite+ (mode SBV..== SBV.sRNE)+ ( SBV.ite+ (SBV.sMod ifloor 2 SBV..== 0)+ ifloor+ (ifloor + 1)+ )+ (SBV.ite (ifloor SBV..< 0) ifloor (ifloor + 1))+ )+ $ SBV.ite+ (diff SBV..< 0.5)+ ifloor+ (ifloor + 1)+ sbvToFPTerm mode l =+ case SBV.unliteral l of+ Nothing -> SBV.toSFloatingPoint mode l+ Just _ ->+ error $+ "SBV's toSFloatingPoint does not regard the rounding mode for "+ ++ "integers. This should never be called. "++instance PEvalIEEEFPConvertibleTerm AlgReal where+ pevalFromFPOrTerm = algRealPevalFromFPOrTerm+ pevalToFPTerm = generalPevalToFPTerm+ sbvFromFPOrTerm d mode l =+ SBV.ite (SBV.fpIsNaN l SBV..|| SBV.fpIsInfinite l) d $+ SBV.fromSFloatingPoint mode l+ sbvToFPTerm rm l =+ case SBV.unliteral l of+ Nothing -> SBV.toSFloatingPoint rm l+ Just _ ->+ error $+ "SBV is buggy on converting literal AlgReal to an FP. "+ ++ "This should never be called. "+ ++ "https://github.com/LeventErkok/sbv/pull/718"++instance (KnownNat n, 1 <= n) => PEvalIEEEFPConvertibleTerm (WordN n) where+ pevalFromFPOrTerm = generalPevalFromFPOrTerm+ pevalToFPTerm = generalPevalToFPTerm+ sbvFromFPOrTerm = bvIsNonZeroFromGEq1 (Proxy @n) $ boundedSBVFromFPTerm @WordN+ sbvToFPTerm mode l = bvIsNonZeroFromGEq1 (Proxy @n) $ genericFPCast mode l++instance (KnownNat n, 1 <= n) => PEvalIEEEFPConvertibleTerm (IntN n) where+ pevalFromFPOrTerm = generalPevalFromFPOrTerm+ pevalToFPTerm = generalPevalToFPTerm+ sbvFromFPOrTerm = bvIsNonZeroFromGEq1 (Proxy @n) $ boundedSBVFromFPTerm @IntN+ sbvToFPTerm mode l = bvIsNonZeroFromGEq1 (Proxy @n) $ genericFPCast mode l++instance (ValidFP eb sb) => PEvalIEEEFPConvertibleTerm (FP eb sb) where+ pevalFromFPOrTerm _ = fpPevalToFPTerm+ pevalToFPTerm = fpPevalToFPTerm+ sbvFromFPOrTerm _ rm v = case (SBV.unliteral rm, SBV.unliteral v) of+ (Just _, Just _) ->+ error $+ "SBV is buggy on converting literal FP to another FP with different "+ ++ "precision. This should never be called. "+ ++ "https://github.com/LeventErkok/sbv/pull/717"+ _ ->+ SBV.ite (SBV.fpIsNaN v) (conSBVTerm (fpNaN :: FP eb sb)) $+ SBV.toSFloatingPoint rm v+ sbvToFPTerm ::+ forall eb1 sb1.+ (ValidFP eb sb, ValidFP eb1 sb1) =>+ SBVType FPRoundingMode ->+ SBVType (FP eb sb) ->+ SBVType (FP eb1 sb1)+ sbvToFPTerm rm v = case (SBV.unliteral rm, SBV.unliteral v) of+ (Just _, Just _) ->+ error $+ "SBV is buggy on converting literal FP to another FP with different "+ ++ "precision. This should never be called. "+ ++ "https://github.com/LeventErkok/sbv/pull/717"+ _ ->+ SBV.ite (SBV.fpIsNaN v) (conSBVTerm (fpNaN :: FP eb1 sb1)) $+ SBV.toSFloatingPoint rm v
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalNumTerm.hs view
@@ -26,13 +26,10 @@ import Data.Bits (Bits) import Data.SBV (Bits (isSigned)) import GHC.TypeLits (KnownNat, type (<=))+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.FP (FP, ValidFP) import Grisette.Internal.SymPrim.Prim.Internal.Instances.SupportedPrim ()-import Grisette.Internal.SymPrim.Prim.Internal.IsZero- ( IsZeroCases (IsZeroEvidence, NonZeroEvidence),- KnownIsZero (isZero),- ) import Grisette.Internal.SymPrim.Prim.Internal.Term ( PEvalNumTerm ( pevalAbsNumTerm,@@ -59,7 +56,7 @@ unaryUnfoldOnce, ) --- Add+-- | Default partial evaluation of addition of numerical terms. pevalDefaultAddNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a pevalDefaultAddNumTerm = binaryUnfoldOnce@@ -99,7 +96,7 @@ normalizeAddNum (AddNumTerm _ l r@(ConTerm _ _)) = addNumTerm r l normalizeAddNum v = v --- Neg+-- | Default partial evaluation of negation of numerical terms. pevalDefaultNegNumTerm :: (PEvalNumTerm a) => Term a -> Term a pevalDefaultNegNumTerm = unaryUnfoldOnce doPevalDefaultNegNumTerm negNumTerm @@ -186,6 +183,16 @@ doPevalGeneralAbsNumTerm t ] +doPevalNoOverflowAbsNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)+doPevalNoOverflowAbsNumTerm t =+ msum+ [ doPevalGeneralAbsNumTerm t,+ case t of+ MulNumTerm _ l r ->+ Just $ pevalMulNumTerm (pevalAbsNumTerm l) $ pevalAbsNumTerm r+ _ -> Nothing+ ]+ -- Signum pevalGeneralSignumNumTerm :: (PEvalNumTerm a) => Term a -> Term a@@ -196,36 +203,27 @@ doPevalGeneralSignumNumTerm (ConTerm _ a) = Just $ conTerm $ signum a doPevalGeneralSignumNumTerm _ = Nothing +doPevalNoOverflowSignumNumTerm :: (PEvalNumTerm a) => Term a -> Maybe (Term a)+doPevalNoOverflowSignumNumTerm t =+ msum+ [ doPevalGeneralSignumNumTerm t,+ case t of+ NegNumTerm _ v -> Just $ pevalNegNumTerm $ pevalSignumNumTerm v+ MulNumTerm _ l r ->+ Just $+ pevalMulNumTerm (pevalSignumNumTerm l) $+ pevalSignumNumTerm r+ _ -> Nothing+ ]+ instance PEvalNumTerm Integer where pevalAddNumTerm = pevalDefaultAddNumTerm pevalNegNumTerm = pevalDefaultNegNumTerm pevalMulNumTerm = pevalDefaultMulNumTerm- pevalAbsNumTerm = unaryUnfoldOnce doPevalIntegerAbsNumTerm absNumTerm- where- doPevalIntegerAbsNumTerm t =- msum- [ doPevalGeneralAbsNumTerm t,- case t of- MulNumTerm _ l r ->- Just $ pevalMulNumTerm (pevalAbsNumTerm l) $ pevalAbsNumTerm r- _ -> Nothing- ]- pevalSignumNumTerm = unaryUnfoldOnce doPevalIntegerSignumNumTerm signumNumTerm- where- doPevalIntegerSignumNumTerm t =- msum- [ doPevalGeneralSignumNumTerm t,- case t of- NegNumTerm _ v -> Just $ pevalNegNumTerm $ pevalSignumNumTerm v- MulNumTerm _ l r ->- Just $- pevalMulNumTerm (pevalSignumNumTerm l) $- pevalSignumNumTerm r- _ -> Nothing- ]- withSbvNumTermConstraint p r = case isZero p of- IsZeroEvidence -> r- NonZeroEvidence -> r+ pevalAbsNumTerm = unaryUnfoldOnce doPevalNoOverflowAbsNumTerm absNumTerm+ pevalSignumNumTerm =+ unaryUnfoldOnce doPevalNoOverflowSignumNumTerm signumNumTerm+ withSbvNumTermConstraint r = r instance (KnownNat n, 1 <= n) => PEvalNumTerm (WordN n) where pevalAddNumTerm = pevalDefaultAddNumTerm@@ -233,7 +231,7 @@ pevalMulNumTerm = pevalDefaultMulNumTerm pevalAbsNumTerm = pevalBitsAbsNumTerm pevalSignumNumTerm = pevalGeneralSignumNumTerm- withSbvNumTermConstraint p r = withPrim @(WordN n) p r+ withSbvNumTermConstraint r = withPrim @(WordN n) r instance (KnownNat n, 1 <= n) => PEvalNumTerm (IntN n) where pevalAddNumTerm = pevalDefaultAddNumTerm@@ -241,7 +239,7 @@ pevalMulNumTerm = pevalDefaultMulNumTerm pevalAbsNumTerm = pevalBitsAbsNumTerm pevalSignumNumTerm = pevalGeneralSignumNumTerm- withSbvNumTermConstraint p r = withPrim @(IntN n) p r+ withSbvNumTermConstraint r = withPrim @(IntN n) r instance (ValidFP eb sb) => PEvalNumTerm (FP eb sb) where pevalAddNumTerm = generalBinaryUnfolded (+) addNumTerm@@ -249,4 +247,13 @@ pevalMulNumTerm = generalBinaryUnfolded (*) mulNumTerm pevalAbsNumTerm = generalUnaryUnfolded abs absNumTerm pevalSignumNumTerm = generalUnaryUnfolded signum signumNumTerm- withSbvNumTermConstraint p r = withPrim @(FP eb sb) p r+ withSbvNumTermConstraint r = withPrim @(FP eb sb) r++instance PEvalNumTerm AlgReal where+ pevalAddNumTerm = pevalDefaultAddNumTerm+ pevalNegNumTerm = pevalDefaultNegNumTerm+ pevalMulNumTerm = pevalDefaultMulNumTerm+ pevalAbsNumTerm = unaryUnfoldOnce doPevalNoOverflowAbsNumTerm absNumTerm+ pevalSignumNumTerm =+ unaryUnfoldOnce doPevalNoOverflowSignumNumTerm signumNumTerm+ withSbvNumTermConstraint r = withPrim @AlgReal r
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalOrdTerm.hs view
@@ -24,16 +24,17 @@ import Control.Monad (msum) import Data.Foldable (Foldable (foldl'))-import Data.Proxy (Proxy (Proxy)) import qualified Data.SBV as SBV import GHC.TypeNats (KnownNat, type (<=))+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN)-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP, allFPRoundingMode)-import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm ()-import Grisette.Internal.SymPrim.Prim.Internal.IsZero- ( IsZeroCases (IsZeroEvidence, NonZeroEvidence),- KnownIsZero (isZero),+import Grisette.Internal.SymPrim.FP+ ( FP,+ FPRoundingMode,+ ValidFP,+ allFPRoundingMode, )+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm () import Grisette.Internal.SymPrim.Prim.Internal.Term ( PEvalNumTerm (pevalNegNumTerm), PEvalOrdTerm@@ -52,7 +53,7 @@ ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (binaryUnfoldOnce) --- Lt+-- | General partially evaluation of less than operation. pevalGeneralLtOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool pevalGeneralLtOrdTerm = binaryUnfoldOnce doPevalGeneralLtOrdTerm ltOrdTerm @@ -61,7 +62,7 @@ doPevalGeneralLtOrdTerm (ConTerm _ a) (ConTerm _ b) = Just $ conTerm $ a < b doPevalGeneralLtOrdTerm _ _ = Nothing --- Le+-- | General partially evaluation of less than or equal to operation. pevalGeneralLeOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool pevalGeneralLeOrdTerm = binaryUnfoldOnce doPevalGeneralLeOrdTerm leOrdTerm @@ -110,33 +111,31 @@ Just $ pevalLeOrdTerm (conTerm $ -r) (pevalNegNumTerm l) _ -> Nothing ]- withSbvOrdTermConstraint p r = case isZero p of- IsZeroEvidence -> r- NonZeroEvidence -> r+ withSbvOrdTermConstraint r = r instance (KnownNat n, 1 <= n) => PEvalOrdTerm (WordN n) where pevalLtOrdTerm = pevalGeneralLtOrdTerm pevalLeOrdTerm = pevalGeneralLeOrdTerm- withSbvOrdTermConstraint p r = withPrim @(WordN n) p r+ withSbvOrdTermConstraint r = withPrim @(WordN n) r instance (KnownNat n, 1 <= n) => PEvalOrdTerm (IntN n) where pevalLtOrdTerm = pevalGeneralLtOrdTerm pevalLeOrdTerm = pevalGeneralLeOrdTerm- withSbvOrdTermConstraint p r = withPrim @(IntN n) p r+ withSbvOrdTermConstraint r = withPrim @(IntN n) r instance (ValidFP eb sb) => PEvalOrdTerm (FP eb sb) where pevalLtOrdTerm = pevalGeneralLtOrdTerm pevalLeOrdTerm = pevalGeneralLeOrdTerm- withSbvOrdTermConstraint p r = withPrim @(FP eb sb) p r- sbvLeOrdTerm _ x y =+ withSbvOrdTermConstraint r = withPrim @(FP eb sb) r+ sbvLeOrdTerm x y = (SBV.sNot (SBV.fpIsNaN x) SBV..&& SBV.sNot (SBV.fpIsNaN y)) SBV..&& (x SBV..<= y) -- Use this table to avoid accidental breakage introduced by sbv. fpRoundingModeLtTable :: [(SBV.SRoundingMode, SBV.SRoundingMode)] fpRoundingModeLtTable =- [ ( conSBVTerm @FPRoundingMode (Proxy @0) a,- conSBVTerm @FPRoundingMode (Proxy @0) b+ [ ( conSBVTerm @FPRoundingMode a,+ conSBVTerm @FPRoundingMode b ) | a <- allFPRoundingMode, b <- allFPRoundingMode,@@ -145,8 +144,8 @@ fpRoundingModeLeTable :: [(SBV.SRoundingMode, SBV.SRoundingMode)] fpRoundingModeLeTable =- [ ( conSBVTerm @FPRoundingMode (Proxy @0) a,- conSBVTerm @FPRoundingMode (Proxy @0) b+ [ ( conSBVTerm @FPRoundingMode a,+ conSBVTerm @FPRoundingMode b ) | a <- allFPRoundingMode, b <- allFPRoundingMode,@@ -167,6 +166,11 @@ instance PEvalOrdTerm FPRoundingMode where pevalLtOrdTerm = pevalGeneralLtOrdTerm pevalLeOrdTerm = pevalGeneralLeOrdTerm- withSbvOrdTermConstraint p r = withPrim @FPRoundingMode p r- sbvLtOrdTerm _ = sbvTableLookup fpRoundingModeLtTable- sbvLeOrdTerm _ = sbvTableLookup fpRoundingModeLeTable+ withSbvOrdTermConstraint r = withPrim @FPRoundingMode r+ sbvLtOrdTerm = sbvTableLookup fpRoundingModeLtTable+ sbvLeOrdTerm = sbvTableLookup fpRoundingModeLeTable++instance PEvalOrdTerm AlgReal where+ pevalLtOrdTerm = pevalGeneralLtOrdTerm+ pevalLeOrdTerm = pevalGeneralLeOrdTerm+ withSbvOrdTermConstraint r = withPrim @AlgReal r
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalRotateTerm.hs view
@@ -37,6 +37,7 @@ ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (unaryUnfoldOnce) +-- | Partial evaluation of symbolic rotate left term for finite bits types. pevalFiniteBitsSymRotateRotateLeftTerm :: forall a. (Integral a, SymRotate a, FiniteBits a, PEvalRotateTerm a) =>@@ -70,6 +71,7 @@ bs = finiteBitSize n doPevalFiniteBitsSymRotateRotateLeftTerm _ _ = Nothing +-- | Partial evaluation of symbolic rotate right term for finite bits types. pevalFiniteBitsSymRotateRotateRightTerm :: forall a. (Integral a, SymRotate a, FiniteBits a, PEvalRotateTerm a) =>@@ -113,23 +115,23 @@ instance (KnownNat n, 1 <= n) => PEvalRotateTerm (IntN n) where pevalRotateLeftTerm = pevalFiniteBitsSymRotateRotateLeftTerm pevalRotateRightTerm = pevalFiniteBitsSymRotateRotateRightTerm- withSbvRotateTermConstraint p r =+ withSbvRotateTermConstraint r = bvIsNonZeroFromGEq1 (Proxy @n) $- withNonFuncPrim @(IntN n) p r+ withNonFuncPrim @(IntN n) r -- SBV's rotateLeft and rotateRight are broken for signed values, so we have to -- do this -- https://github.com/LeventErkok/sbv/issues/673- sbvRotateLeftTerm p l r =- withNonFuncPrim @(IntN n) p $- withSbvRotateTermConstraint @(IntN n) p $+ sbvRotateLeftTerm l r =+ withNonFuncPrim @(IntN n) $+ withSbvRotateTermConstraint @(IntN n) $ SBV.sFromIntegral $ SBV.sRotateLeft (SBV.sFromIntegral l :: SBV.SWord n) (SBV.sFromIntegral r :: SBV.SWord n)- sbvRotateRightTerm p l r =- withNonFuncPrim @(IntN n) p $- withSbvRotateTermConstraint @(IntN n) p $+ sbvRotateRightTerm l r =+ withNonFuncPrim @(IntN n) $+ withSbvRotateTermConstraint @(IntN n) $ SBV.sFromIntegral $ SBV.sRotateRight (SBV.sFromIntegral l :: SBV.SWord n)@@ -138,6 +140,6 @@ instance (KnownNat n, 1 <= n) => PEvalRotateTerm (WordN n) where pevalRotateLeftTerm = pevalFiniteBitsSymRotateRotateLeftTerm pevalRotateRightTerm = pevalFiniteBitsSymRotateRotateRightTerm- withSbvRotateTermConstraint p r =+ withSbvRotateTermConstraint r = bvIsNonZeroFromGEq1 (Proxy @n) $- withNonFuncPrim @(WordN n) p r+ withNonFuncPrim @(WordN n) r
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/PEvalShiftTerm.hs view
@@ -37,6 +37,7 @@ ) import Grisette.Internal.SymPrim.Prim.Internal.Unfold (unaryUnfoldOnce) +-- | Partial evaluation of symbolic shift left term for finite bits types. pevalFiniteBitsSymShiftShiftLeftTerm :: forall a. (Integral a, SymShift a, FiniteBits a, PEvalShiftTerm a) =>@@ -69,6 +70,7 @@ Just $ conTerm zeroBits doPevalFiniteBitsSymShiftShiftLeftTerm _ _ = Nothing +-- | Partial evaluation of symbolic shift right term for finite bits types. pevalFiniteBitsSymShiftShiftRightTerm :: forall a. (Integral a, SymShift a, FiniteBits a, PEvalShiftTerm a) =>@@ -107,13 +109,13 @@ instance (KnownNat n, 1 <= n) => PEvalShiftTerm (IntN n) where pevalShiftLeftTerm = pevalFiniteBitsSymShiftShiftLeftTerm pevalShiftRightTerm = pevalFiniteBitsSymShiftShiftRightTerm- withSbvShiftTermConstraint p r =+ withSbvShiftTermConstraint r = bvIsNonZeroFromGEq1 (Proxy @n) $- withNonFuncPrim @(IntN n) p r+ withNonFuncPrim @(IntN n) r instance (KnownNat n, 1 <= n) => PEvalShiftTerm (WordN n) where pevalShiftLeftTerm = pevalFiniteBitsSymShiftShiftLeftTerm pevalShiftRightTerm = pevalFiniteBitsSymShiftShiftRightTerm- withSbvShiftTermConstraint p r =+ withSbvShiftTermConstraint r = bvIsNonZeroFromGEq1 (Proxy @n) $- withNonFuncPrim @(WordN n) p r+ withNonFuncPrim @(WordN n) r
src/Grisette/Internal/SymPrim/Prim/Internal/Instances/SupportedPrim.hs view
@@ -1,8 +1,8 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-}-{-# HLINT ignore "Eta reduce" #-} {-# LANGUAGE InstanceSigs #-}+{-# HLINT ignore "Eta reduce" #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}@@ -24,35 +24,40 @@ ) where +import Data.Coerce (coerce)+import Data.List.NonEmpty (NonEmpty ((:|)), toList) import Data.Proxy (Proxy (Proxy))-import Data.SBV (BVIsNonZero, FiniteBits (finiteBitSize))+import Data.SBV (BVIsNonZero) import qualified Data.SBV as SBV-import qualified Data.SBV.Dynamic as SBVD-import Data.Type.Bool (If)-import Data.Type.Equality ((:~:) (Refl))-import GHC.TypeNats (KnownNat, natVal, type (<=))+import Data.Type.Equality ((:~:) (Refl), type (:~~:) (HRefl))+import GHC.TypeNats (KnownNat, type (<=))+import Grisette.Internal.SymPrim.AlgReal (AlgReal, fromSBVAlgReal, toSBVAlgReal) import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.FP ( FP (FP), FPRoundingMode (RNA, RNE, RTN, RTP, RTZ), ValidFP, )-import Grisette.Internal.SymPrim.Prim.Internal.IsZero- ( IsZero,- IsZeroCases (IsZeroEvidence, NonZeroEvidence),- KnownIsZero (isZero),- ) import Grisette.Internal.SymPrim.Prim.Internal.Term- ( NonFuncSBVRep (NonFuncSBVBaseType),+ ( IsSymbolKind (decideSymbolKind),+ NonFuncSBVRep (NonFuncSBVBaseType), SBVRep ( SBVType ),- SupportedNonFuncPrim (conNonFuncSBVTerm, symNonFuncSBVTerm, withNonFuncPrim),+ SupportedNonFuncPrim+ ( conNonFuncSBVTerm,+ symNonFuncSBVTerm,+ withNonFuncPrim+ ), SupportedPrim- ( conSBVTerm,+ ( castTypedSymbol,+ conSBVTerm, defaultValue, defaultValueDynamic,+ funcDummyConstraint,+ isFuncType, parseSMTModelResult,+ pevalDistinctTerm, pevalEqTerm, pevalITETerm, pformatCon,@@ -65,17 +70,18 @@ ( PrimConstraint ), Term (ConTerm),+ TypedSymbol (TypedSymbol), conTerm,+ distinctTerm, eqTerm,- parseSMTModelResultError,+ parseScalarSMTModelResult, pevalDefaultEqTerm, pevalITEBasicTerm,+ pevalNotTerm, sbvFresh, ) import Grisette.Internal.SymPrim.Prim.ModelValue (ModelValue, toModelValue) import Grisette.Internal.Utils.Parameterized (unsafeAxiom)-import Type.Reflection (typeRep)-import Unsafe.Coerce (unsafeCoerce) defaultValueForInteger :: Integer defaultValueForInteger = 0@@ -85,68 +91,93 @@ -- Basic Integer instance SBVRep Integer where- type SBVType n Integer = SBV.SBV (If (IsZero n) (Integer) (SBV.IntN n))+ type SBVType Integer = SBV.SBV Integer -instance SupportedPrimConstraint Integer+instance SupportedPrimConstraint Integer where+ type PrimConstraint Integer = (Integral (NonFuncSBVBaseType Integer)) +pairwiseHasConcreteEqual :: (SupportedNonFuncPrim a) => [Term a] -> Bool+pairwiseHasConcreteEqual [] = False+pairwiseHasConcreteEqual [_] = False+pairwiseHasConcreteEqual (x : xs) =+ go x xs || pairwiseHasConcreteEqual xs+ where+ go _ [] = False+ go x (y : ys) = x == y || go x ys++pevalGeneralDistinct ::+ (SupportedNonFuncPrim a) => NonEmpty (Term a) -> Term Bool+pevalGeneralDistinct (_ :| []) = conTerm True+pevalGeneralDistinct (a :| [b]) = pevalNotTerm $ pevalEqTerm a b+pevalGeneralDistinct l | pairwiseHasConcreteEqual $ toList l = conTerm False+pevalGeneralDistinct l = distinctTerm l+ instance SupportedPrim Integer where pformatCon = show defaultValue = defaultValueForInteger defaultValueDynamic _ = defaultValueForIntegerDyn pevalITETerm = pevalITEBasicTerm pevalEqTerm = pevalDefaultEqTerm- conSBVTerm p n = case isZero p of- IsZeroEvidence -> fromInteger n- NonZeroEvidence -> fromInteger n+ pevalDistinctTerm = pevalGeneralDistinct+ conSBVTerm n = fromInteger n symSBVName symbol _ = show symbol- symSBVTerm p name = case isZero p of- IsZeroEvidence -> sbvFresh name- NonZeroEvidence -> sbvFresh name- withPrim p r = case isZero p of- IsZeroEvidence -> r- NonZeroEvidence -> r- parseSMTModelResult :: Int -> ([([SBVD.CV], SBVD.CV)], SBVD.CV) -> Integer- parseSMTModelResult _ ([], SBVD.CV SBVD.KUnbounded (SBVD.CInteger i)) = i- parseSMTModelResult _ ([([], SBVD.CV SBVD.KUnbounded (SBVD.CInteger i))], _) = i- parseSMTModelResult _ cv = parseSMTModelResultError (typeRep @Integer) cv+ symSBVTerm name = sbvFresh name+ withPrim r = r+ parseSMTModelResult _ = parseScalarSMTModelResult id+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd Integer ->+ Maybe (TypedSymbol knd' Integer)+ castTypedSymbol (TypedSymbol s) =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ TypedSymbol s+ Right HRefl -> Just $ TypedSymbol s+ isFuncType = False+ funcDummyConstraint _ = SBV.sTrue instance NonFuncSBVRep Integer where- type NonFuncSBVBaseType n Integer = If (IsZero n) Integer (SBV.IntN n)+ type NonFuncSBVBaseType Integer = Integer instance SupportedNonFuncPrim Integer where conNonFuncSBVTerm = conSBVTerm symNonFuncSBVTerm = symSBVTerm @Integer- withNonFuncPrim p r = case isZero p of- IsZeroEvidence -> r- NonZeroEvidence -> bvIsNonZeroFromGEq1 p r+ withNonFuncPrim r = r -- Signed BV instance (KnownNat w, 1 <= w) => SupportedPrimConstraint (IntN w) where- type PrimConstraint _ (IntN w) = (KnownNat w, 1 <= w, BVIsNonZero w)+ type PrimConstraint (IntN w) = (KnownNat w, 1 <= w, BVIsNonZero w) instance (KnownNat w, 1 <= w) => SBVRep (IntN w) where- type SBVType _ (IntN w) = SBV.SBV (SBV.IntN w)+ type SBVType (IntN w) = SBV.SBV (SBV.IntN w) instance (KnownNat w, 1 <= w) => SupportedPrim (IntN w) where pformatCon = show defaultValue = 0 pevalITETerm = pevalITEBasicTerm pevalEqTerm = pevalDefaultEqTerm- conSBVTerm _ n = bvIsNonZeroFromGEq1 (Proxy @w) $ fromIntegral n+ pevalDistinctTerm = pevalGeneralDistinct+ conSBVTerm n = bvIsNonZeroFromGEq1 (Proxy @w) $ fromIntegral n symSBVName symbol _ = show symbol- symSBVTerm _ name = bvIsNonZeroFromGEq1 (Proxy @w) $ sbvFresh name- withPrim _ r = bvIsNonZeroFromGEq1 (Proxy @w) r- parseSMTModelResult :: Int -> ([([SBVD.CV], SBVD.CV)], SBVD.CV) -> IntN w- parseSMTModelResult- _- ([], SBVD.CV (SBVD.KBounded _ bitWidth) (SBVD.CInteger i))- | bitWidth == finiteBitSize (undefined :: IntN w) = fromIntegral i- parseSMTModelResult- _- ([([], SBVD.CV (SBVD.KBounded _ bitWidth) (SBVD.CInteger i))], _)- | bitWidth == finiteBitSize (undefined :: IntN w) = fromIntegral i- parseSMTModelResult _ cv = parseSMTModelResultError (typeRep @(IntN w)) cv+ symSBVTerm name = bvIsNonZeroFromGEq1 (Proxy @w) $ sbvFresh name+ withPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r+ parseSMTModelResult _ cv =+ withPrim @(IntN w) $+ parseScalarSMTModelResult (\(x :: SBV.IntN w) -> fromIntegral x) cv+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd (IntN w) ->+ Maybe (TypedSymbol knd' (IntN w))+ castTypedSymbol (TypedSymbol s) =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ TypedSymbol s+ Right HRefl -> Just $ TypedSymbol s+ isFuncType = False+ funcDummyConstraint _ = SBV.sTrue +-- | Construct the 'SBV.BVIsNonZero' constraint from the proof that the width is+-- at least 1. bvIsNonZeroFromGEq1 :: forall w r proxy. (1 <= w) =>@@ -157,53 +188,59 @@ Refl -> r1 instance (KnownNat w, 1 <= w) => NonFuncSBVRep (IntN w) where- type NonFuncSBVBaseType _ (IntN w) = SBV.IntN w+ type NonFuncSBVBaseType (IntN w) = SBV.IntN w instance (KnownNat w, 1 <= w) => SupportedNonFuncPrim (IntN w) where conNonFuncSBVTerm = conSBVTerm symNonFuncSBVTerm = symSBVTerm @(IntN w)- withNonFuncPrim _ r = bvIsNonZeroFromGEq1 (Proxy @w) r+ withNonFuncPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r -- Unsigned BV instance (KnownNat w, 1 <= w) => SupportedPrimConstraint (WordN w) where- type PrimConstraint _ (WordN w) = (KnownNat w, 1 <= w, BVIsNonZero w)+ type PrimConstraint (WordN w) = (KnownNat w, 1 <= w, BVIsNonZero w) instance (KnownNat w, 1 <= w) => SBVRep (WordN w) where- type SBVType _ (WordN w) = SBV.SBV (SBV.WordN w)+ type SBVType (WordN w) = SBV.SBV (SBV.WordN w) instance (KnownNat w, 1 <= w) => SupportedPrim (WordN w) where pformatCon = show defaultValue = 0 pevalITETerm = pevalITEBasicTerm pevalEqTerm = pevalDefaultEqTerm- conSBVTerm _ n = bvIsNonZeroFromGEq1 (Proxy @w) $ fromIntegral n+ pevalDistinctTerm = pevalGeneralDistinct+ conSBVTerm n = bvIsNonZeroFromGEq1 (Proxy @w) $ fromIntegral n symSBVName symbol _ = show symbol- symSBVTerm _ name = bvIsNonZeroFromGEq1 (Proxy @w) $ sbvFresh name- withPrim _ r = bvIsNonZeroFromGEq1 (Proxy @w) r- parseSMTModelResult- _- ([], SBVD.CV (SBVD.KBounded _ bitWidth) (SBVD.CInteger i))- | bitWidth == finiteBitSize (undefined :: WordN w) = fromIntegral i- parseSMTModelResult- _- ([([], SBVD.CV (SBVD.KBounded _ bitWidth) (SBVD.CInteger i))], _)- | bitWidth == finiteBitSize (undefined :: WordN w) = fromIntegral i- parseSMTModelResult _ cv = parseSMTModelResultError (typeRep @(WordN w)) cv+ symSBVTerm name = bvIsNonZeroFromGEq1 (Proxy @w) $ sbvFresh name+ withPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r+ parseSMTModelResult _ cv =+ withPrim @(IntN w) $+ parseScalarSMTModelResult (\(x :: SBV.WordN w) -> fromIntegral x) cv+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd (WordN w) ->+ Maybe (TypedSymbol knd' (WordN w))+ castTypedSymbol (TypedSymbol s) =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ TypedSymbol s+ Right HRefl -> Just $ TypedSymbol s+ isFuncType = False+ funcDummyConstraint _ = SBV.sTrue instance (KnownNat w, 1 <= w) => NonFuncSBVRep (WordN w) where- type NonFuncSBVBaseType _ (WordN w) = SBV.WordN w+ type NonFuncSBVBaseType (WordN w) = SBV.WordN w instance (KnownNat w, 1 <= w) => SupportedNonFuncPrim (WordN w) where conNonFuncSBVTerm = conSBVTerm symNonFuncSBVTerm = symSBVTerm @(WordN w)- withNonFuncPrim _ r = bvIsNonZeroFromGEq1 (Proxy @w) r+ withNonFuncPrim r = bvIsNonZeroFromGEq1 (Proxy @w) r -- FP instance (ValidFP eb sb) => SupportedPrimConstraint (FP eb sb) where- type PrimConstraint _ (FP eb sb) = ValidFP eb sb+ type PrimConstraint (FP eb sb) = ValidFP eb sb instance (ValidFP eb sb) => SBVRep (FP eb sb) where- type SBVType _ (FP eb sb) = SBV.SBV (SBV.FloatingPoint eb sb)+ type SBVType (FP eb sb) = SBV.SBV (SBV.FloatingPoint eb sb) instance (ValidFP eb sb) => SupportedPrim (FP eb sb) where defaultValue = 0@@ -211,55 +248,52 @@ pevalEqTerm (ConTerm _ l) (ConTerm _ r) = conTerm $ l == r pevalEqTerm l@ConTerm {} r = pevalEqTerm r l pevalEqTerm l r = eqTerm l r- conSBVTerm _ (FP fp) = SBV.literal fp+ pevalDistinctTerm = distinctTerm+ conSBVTerm (FP fp) = SBV.literal fp symSBVName symbol _ = show symbol- symSBVTerm _ name = sbvFresh name- withPrim _ r = r- parseSMTModelResult- _- ([], SBVD.CV (SBVD.KFP eb sb) (SBVD.CFP fp))- | eb == fromIntegral (natVal (Proxy @eb))- && sb == fromIntegral (natVal (Proxy @sb)) =- -- Assumes that in SBV, FloatingPoint is a newtype of FP as the- -- constructor isn't exposed- fromIntegral $ unsafeCoerce fp- parseSMTModelResult- _- ([([], SBVD.CV (SBVD.KFP eb sb) (SBVD.CFP fp))], _)- | eb == fromIntegral (natVal (Proxy @eb))- && sb == fromIntegral (natVal (Proxy @sb)) =- -- Assumes that in SBV, FloatingPoint is a newtype of FP as the- -- constructor isn't exposed- fromIntegral $ unsafeCoerce fp- parseSMTModelResult _ cv = parseSMTModelResultError (typeRep @(FP eb sb)) cv+ symSBVTerm name = sbvFresh name+ withPrim r = r+ parseSMTModelResult _ cv =+ withPrim @(FP eb sb) $+ parseScalarSMTModelResult (\(x :: SBV.FloatingPoint eb sb) -> coerce x) cv+ isFuncType = False+ funcDummyConstraint _ = SBV.sTrue -- Workaround for sbv#702.- sbvIte p = withPrim @(FP eb sb) p $ \c a b ->+ sbvIte = withPrim @(FP eb sb) $ \c a b -> case (SBV.unliteral a, SBV.unliteral b) of (Just a', Just b') | isInfinite a' && isInfinite b' -> let correspondingZero x = if x > 0 then 0 else -0 in 1 / sbvIte @(FP eb sb)- p c- (conSBVTerm @(FP eb sb) p $ correspondingZero a')- (conSBVTerm @(FP eb sb) p $ correspondingZero b')+ (conSBVTerm @(FP eb sb) $ correspondingZero a')+ (conSBVTerm @(FP eb sb) $ correspondingZero b') _ -> SBV.ite c a b+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd (FP eb sb) ->+ Maybe (TypedSymbol knd' (FP eb sb))+ castTypedSymbol (TypedSymbol s) =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ TypedSymbol s+ Right HRefl -> Just $ TypedSymbol s instance (ValidFP eb sb) => NonFuncSBVRep (FP eb sb) where- type NonFuncSBVBaseType _ (FP eb sb) = SBV.FloatingPoint eb sb+ type NonFuncSBVBaseType (FP eb sb) = SBV.FloatingPoint eb sb instance (ValidFP eb sb) => SupportedNonFuncPrim (FP eb sb) where conNonFuncSBVTerm = conSBVTerm symNonFuncSBVTerm = symSBVTerm @(FP eb sb)- withNonFuncPrim _ r = r+ withNonFuncPrim r = r -- FPRoundingMode instance SupportedPrimConstraint FPRoundingMode instance SBVRep FPRoundingMode where- type SBVType _ FPRoundingMode = SBV.SBV SBV.RoundingMode+ type SBVType FPRoundingMode = SBV.SBV SBV.RoundingMode instance SupportedPrim FPRoundingMode where defaultValue = RNE@@ -267,21 +301,83 @@ pevalEqTerm (ConTerm _ l) (ConTerm _ r) = conTerm $ l == r pevalEqTerm l@ConTerm {} r = pevalEqTerm r l pevalEqTerm l r = eqTerm l r- conSBVTerm _ RNE = SBV.sRNE- conSBVTerm _ RNA = SBV.sRNA- conSBVTerm _ RTP = SBV.sRTP- conSBVTerm _ RTN = SBV.sRTN- conSBVTerm _ RTZ = SBV.sRTZ+ pevalDistinctTerm = pevalGeneralDistinct+ conSBVTerm RNE = SBV.sRNE+ conSBVTerm RNA = SBV.sRNA+ conSBVTerm RTP = SBV.sRTP+ conSBVTerm RTN = SBV.sRTN+ conSBVTerm RTZ = SBV.sRTZ symSBVName symbol _ = show symbol- symSBVTerm _ name = sbvFresh name- withPrim _ r = r+ symSBVTerm name = sbvFresh name+ withPrim r = r parseSMTModelResult _ cv =- parseSMTModelResultError (typeRep @FPRoundingMode) cv+ withPrim @(FPRoundingMode) $+ parseScalarSMTModelResult+ ( \(x :: SBV.RoundingMode) -> case x of+ SBV.RoundNearestTiesToEven -> RNE+ SBV.RoundNearestTiesToAway -> RNA+ SBV.RoundTowardPositive -> RTP+ SBV.RoundTowardNegative -> RTN+ SBV.RoundTowardZero -> RTZ+ )+ cv+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd FPRoundingMode ->+ Maybe (TypedSymbol knd' FPRoundingMode)+ castTypedSymbol (TypedSymbol s) =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ TypedSymbol s+ Right HRefl -> Just $ TypedSymbol s+ isFuncType = False+ funcDummyConstraint _ = SBV.sTrue instance NonFuncSBVRep FPRoundingMode where- type NonFuncSBVBaseType _ FPRoundingMode = SBV.RoundingMode+ type NonFuncSBVBaseType FPRoundingMode = SBV.RoundingMode instance SupportedNonFuncPrim FPRoundingMode where conNonFuncSBVTerm = conSBVTerm symNonFuncSBVTerm = symSBVTerm @FPRoundingMode- withNonFuncPrim _ r = r+ withNonFuncPrim r = r++-- AlgReal++instance SupportedPrimConstraint AlgReal++instance SBVRep AlgReal where+ type SBVType AlgReal = SBV.SBV SBV.AlgReal++instance SupportedPrim AlgReal where+ defaultValue = 0+ pevalITETerm = pevalITEBasicTerm+ pevalEqTerm (ConTerm _ l) (ConTerm _ r) = conTerm $ l == r+ pevalEqTerm l@ConTerm {} r = pevalEqTerm r l+ pevalEqTerm l r = eqTerm l r+ pevalDistinctTerm = pevalGeneralDistinct+ conSBVTerm = SBV.literal . toSBVAlgReal+ symSBVName symbol _ = show symbol+ symSBVTerm name = sbvFresh name+ withPrim r = r+ parseSMTModelResult _ cv =+ withPrim @AlgReal $+ parseScalarSMTModelResult fromSBVAlgReal cv+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd AlgReal ->+ Maybe (TypedSymbol knd' AlgReal)+ castTypedSymbol (TypedSymbol s) =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ TypedSymbol s+ Right HRefl -> Just $ TypedSymbol s+ isFuncType = False+ funcDummyConstraint _ = SBV.sTrue++instance NonFuncSBVRep AlgReal where+ type NonFuncSBVBaseType AlgReal = SBV.AlgReal++instance SupportedNonFuncPrim AlgReal where+ conNonFuncSBVTerm = conSBVTerm+ symNonFuncSBVTerm = symSBVTerm @AlgReal+ withNonFuncPrim r = r
− src/Grisette/Internal/SymPrim/Prim/Internal/IsZero.hs
@@ -1,44 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE UndecidableInstances #-}--module Grisette.Internal.SymPrim.Prim.Internal.IsZero- ( IsZero,- KnownIsZero (..),- IsZeroCases (..),- )-where--import qualified Data.SBV as SBV-import GHC.TypeNats (KnownNat, Nat, type (<=))--type family IsZero (a :: Nat) :: Bool where- IsZero 0 = 'True- IsZero _ = 'False--data IsZeroCases (a :: Nat) where- IsZeroEvidence :: (IsZero a ~ 'True) => IsZeroCases a- NonZeroEvidence ::- (IsZero a ~ 'False, SBV.BVIsNonZero a, 1 <= a) =>- IsZeroCases a--instance Show (IsZeroCases a) where- show IsZeroEvidence = "IsZeroEvidence"- show NonZeroEvidence = "NonZeroEvidence"--class (KnownNat a) => KnownIsZero (a :: Nat) where- isZero :: proxy a -> IsZeroCases a--instance KnownIsZero 0 where- isZero _ = IsZeroEvidence--instance- {-# OVERLAPPABLE #-}- (KnownNat a, IsZero a ~ 'False, 1 <= a, SBV.BVIsNonZero a) =>- KnownIsZero a- where- isZero _ = NonZeroEvidence
src/Grisette/Internal/SymPrim/Prim/Internal/PartialEval.hs view
@@ -34,41 +34,52 @@ import Control.Monad.Except (MonadError (catchError)) import Grisette.Internal.SymPrim.Prim.Internal.Term (Term) +-- | A partial function from a to b. type PartialFun a b = a -> Maybe b +-- | A partial rule for unary operations. type PartialRuleUnary a b = PartialFun (Term a) (Term b) +-- | A total rule for unary operations. type TotalRuleUnary a b = Term a -> Term b +-- | A partial rule for binary operations. type PartialRuleBinary a b c = Term a -> PartialFun (Term b) (Term c) +-- | A total rule for binary operations. type TotalRuleBinary a b c = Term a -> Term b -> Term c +-- | Totalize a partial function with a fallback function. totalize :: PartialFun a b -> (a -> b) -> a -> b totalize partial fallback a = case partial a of Just b -> b Nothing -> fallback a +-- | Totalize a binary partial function with a fallback function. totalize2 :: (a -> PartialFun b c) -> (a -> b -> c) -> a -> b -> c totalize2 partial fallback a b = case partial a b of Just c -> c Nothing -> fallback a b +-- | A strategy for partially evaluating unary operations. class UnaryPartialStrategy tag a b | tag a -> b where extractor :: tag -> Term a -> Maybe a constantHandler :: tag -> a -> Maybe (Term b) nonConstantHandler :: tag -> Term a -> Maybe (Term b) +-- | Partially evaluate a unary operation. unaryPartial :: forall tag a b. (UnaryPartialStrategy tag a b) => tag -> PartialRuleUnary a b unaryPartial tag a = case extractor tag a of Nothing -> nonConstantHandler tag a Just a' -> constantHandler tag a' +-- | A strategy for partially evaluating commutative binary operations. class BinaryCommPartialStrategy tag a c | tag a -> c where singleConstantHandler :: tag -> a -> Term a -> Maybe (Term c) +-- | A strategy for partially evaluating operations. class BinaryPartialStrategy tag a b c | tag a b -> c where extractora :: tag -> Term a -> Maybe a extractorb :: tag -> Term b -> Maybe b@@ -81,6 +92,7 @@ rightConstantHandler tag = flip $ singleConstantHandler @tag @a tag nonBinaryConstantHandler :: tag -> Term a -> Term b -> Maybe (Term c) +-- | Partially evaluate a binary operation. binaryPartial :: forall tag a b c. (BinaryPartialStrategy tag a b c) => tag -> PartialRuleBinary a b c binaryPartial tag a b = case (extractora @tag @a @b @c tag a, extractorb @tag @a @b @c tag b) of (Nothing, Nothing) -> nonBinaryConstantHandler @tag @a @b @c tag a b
src/Grisette/Internal/SymPrim/Prim/Internal/Term.hs view
@@ -56,2709 +56,3128 @@ pevalGeOrdTerm, pevalNEqTerm, PEvalDivModIntegralTerm (..),- PEvalBVSignConversionTerm (..),- PEvalBVTerm (..),- PEvalFractionalTerm (..),- PEvalFloatingTerm (..),-- -- * Typed symbols- TypedSymbol (..),- SomeTypedSymbol (..),- showUntyped,- withSymbolSupported,- someTypedSymbol,-- -- * Terms- FPTrait (..),- FPUnaryOp (..),- FPBinaryOp (..),- FPRoundingUnaryOp (..),- FPRoundingBinaryOp (..),- Term (..),- identity,- identityWithTypeRep,- introSupportedPrimConstraint,- pformat,-- -- * Interning- UTerm (..),- prettyPrintTerm,- constructUnary,- constructBinary,- constructTernary,- conTerm,- symTerm,- ssymTerm,- isymTerm,- notTerm,- orTerm,- andTerm,- eqTerm,- iteTerm,- addNumTerm,- negNumTerm,- mulNumTerm,- absNumTerm,- signumNumTerm,- ltOrdTerm,- leOrdTerm,- andBitsTerm,- orBitsTerm,- xorBitsTerm,- complementBitsTerm,- shiftLeftTerm,- shiftRightTerm,- rotateLeftTerm,- rotateRightTerm,- toSignedTerm,- toUnsignedTerm,- bvconcatTerm,- bvselectTerm,- bvextendTerm,- bvsignExtendTerm,- bvzeroExtendTerm,- applyTerm,- divIntegralTerm,- modIntegralTerm,- quotIntegralTerm,- remIntegralTerm,- fpTraitTerm,- fdivTerm,- recipTerm,- sqrtTerm,- fpUnaryTerm,- fpBinaryTerm,- fpRoundingUnaryTerm,- fpRoundingBinaryTerm,- fpFMATerm,-- -- * Support for boolean type- trueTerm,- falseTerm,- pattern BoolConTerm,- pattern TrueTerm,- pattern FalseTerm,- pattern BoolTerm,- pevalNotTerm,- pevalOrTerm,- pevalAndTerm,- pevalImplyTerm,- pevalXorTerm,- pevalITEBasic,- pevalITEBasicTerm,- pevalDefaultEqTerm,- --- NonFuncSBVRep (..),- SupportedNonFuncPrim (..),- SBVRep (..),- SBVFreshMonad (..),- translateTypeError,- parseSMTModelResultError,- partitionCVArg,- )-where--import Control.DeepSeq (NFData (rnf))-import Control.Monad (msum)-import Control.Monad.IO.Class (MonadIO)-import Control.Monad.Reader (MonadTrans (lift), ReaderT)-import Control.Monad.State (StateT)-import Data.Array ((!))-import Data.Bits (Bits)-import Data.Function (on)-import qualified Data.HashMap.Strict as M-import Data.Hashable (Hashable (hash, hashWithSalt))-import Data.IORef (atomicModifyIORef')-import Data.Interned- ( Cache,- Id,- Interned (Description, Uninterned, cache, cacheWidth, describe, identify),- )-import Data.Interned.Internal- ( Cache (getCache),- CacheState (CacheState),- )-import Data.Kind (Constraint)-import Data.Maybe (fromMaybe)-import qualified Data.SBV as SBV-import qualified Data.SBV.Dynamic as SBVD-import qualified Data.SBV.Trans as SBVT-import qualified Data.SBV.Trans.Control as SBVTC-import Data.String (IsString (fromString))-import Data.Typeable (Proxy (Proxy), cast)-import GHC.Exts (sortWith)-import GHC.Generics (Generic)-import GHC.IO (unsafeDupablePerformIO)-import GHC.Stack (HasCallStack)-import GHC.TypeNats (KnownNat, Nat, type (+), type (<=))-import Grisette.Internal.Core.Data.Class.BitVector- ( SizedBV,- )-import Grisette.Internal.Core.Data.Class.SignConversion (SignConversion)-import Grisette.Internal.Core.Data.Class.SymRotate (SymRotate)-import Grisette.Internal.Core.Data.Class.SymShift (SymShift)-import Grisette.Internal.Core.Data.Symbol- ( Identifier,- Symbol (IndexedSymbol, SimpleSymbol),- )-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)-import Grisette.Internal.SymPrim.Prim.Internal.Caches- ( typeMemoizedCache,- )-import Grisette.Internal.SymPrim.Prim.Internal.IsZero (KnownIsZero)-import Grisette.Internal.SymPrim.Prim.Internal.Utils- ( eqHeteroRep,- eqTypeRepBool,- pattern Dyn,- )-import Grisette.Internal.SymPrim.Prim.ModelValue- ( ModelValue,- toModelValue,- )-import Language.Haskell.TH.Syntax (Lift (liftTyped))-import Type.Reflection- ( SomeTypeRep (SomeTypeRep),- TypeRep,- Typeable,- eqTypeRep,- someTypeRep,- typeRep,- type (:~~:) (HRefl),- )-import Unsafe.Coerce (unsafeCoerce)--#if MIN_VERSION_prettyprinter(1,7,0)-import Prettyprinter- ( column,- pageWidth,- Doc,- PageWidth(Unbounded, AvailablePerLine),- Pretty(pretty),- )-#else-import Data.Text.Prettyprint.Doc- ( column,- pageWidth,- Doc,- PageWidth(Unbounded, AvailablePerLine),- Pretty(pretty),- )-#endif--#if !MIN_VERSION_sbv(10, 0, 0)-#define SMTDefinable Uninterpreted-#endif---- $setup--- >>> import Grisette.Core--- >>> import Grisette.SymPrim---- SBV Translation-class (Monad m) => SBVFreshMonad m where- sbvFresh :: (SBV.SymVal a) => String -> m (SBV.SBV a)--instance (MonadIO m) => SBVFreshMonad (SBVT.SymbolicT m) where- sbvFresh = SBVT.free--instance (MonadIO m) => SBVFreshMonad (SBVTC.QueryT m) where- sbvFresh = SBVTC.freshVar--instance (SBVFreshMonad m) => SBVFreshMonad (ReaderT r m) where- sbvFresh = lift . sbvFresh--instance (SBVFreshMonad m) => SBVFreshMonad (StateT s m) where- sbvFresh = lift . sbvFresh--translateTypeError :: (HasCallStack) => Maybe String -> TypeRep a -> b-translateTypeError Nothing ta =- error $- "Don't know how to translate the type " ++ show ta ++ " to SMT"-translateTypeError (Just reason) ta =- error $- "Don't know how to translate the type " ++ show ta ++ " to SMT: " <> reason--class (SupportedPrim a, Ord a) => NonFuncSBVRep a where- type NonFuncSBVBaseType (n :: Nat) a--class (NonFuncSBVRep a) => SupportedNonFuncPrim a where- conNonFuncSBVTerm ::- (KnownIsZero n) =>- proxy n ->- a ->- SBV.SBV (NonFuncSBVBaseType n a)- symNonFuncSBVTerm ::- (SBVFreshMonad m, KnownIsZero n) =>- proxy n ->- String ->- m (SBV.SBV (NonFuncSBVBaseType n a))- withNonFuncPrim ::- (KnownIsZero n) =>- proxy n ->- ( ( SBV.SymVal (NonFuncSBVBaseType n a),- SBV.EqSymbolic (SBVType n a),- SBV.Mergeable (SBVType n a),- SBV.SMTDefinable (SBVType n a),- SBV.Mergeable (SBVType n a),- SBVType n a ~ SBV.SBV (NonFuncSBVBaseType n a),- PrimConstraint n a- ) =>- r- ) ->- r--partitionCVArg ::- forall a.- (SupportedNonFuncPrim a) =>- [([SBVD.CV], SBVD.CV)] ->- [(a, [([SBVD.CV], SBVD.CV)])]-partitionCVArg cv =- partitionOrdCVArg $- parseFirstCVArg cv- where- parseFirstCVArg ::- forall a.- (SupportedNonFuncPrim a) =>- [([SBVD.CV], SBVD.CV)] ->- [(a, [([SBVD.CV], SBVD.CV)])]- parseFirstCVArg =- fmap- ( \case- (x : xs, v) ->- (parseSMTModelResult 0 ([([], x)], x), [(xs, v)])- _ -> error "impossible"- )- partitionOrdCVArg ::- forall a.- (SupportedNonFuncPrim a) =>- [(a, [([SBVD.CV], SBVD.CV)])] ->- [(a, [([SBVD.CV], SBVD.CV)])]- partitionOrdCVArg v = go sorted- where- sorted = sortWith fst v :: [(a, [([SBVD.CV], SBVD.CV)])]- 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--class SBVRep t where- type SBVType (n :: Nat) t--class SupportedPrimConstraint t where- type PrimConstraint (n :: Nat) t :: Constraint- type PrimConstraint _ _ = ()---- | Indicates that a type is supported, can be represented as a symbolic term,--- and can be lowered to an SBV term.-class- ( Lift t,- Typeable t,- Hashable t,- Eq t,- Show t,- NFData t,- SupportedPrimConstraint t,- SBVRep t- ) =>- SupportedPrim t- where- termCache :: Cache (Term t)- termCache = typeMemoizedCache- pformatCon :: t -> String- default pformatCon :: (Show t) => t -> String- pformatCon = show- pformatSym :: TypedSymbol t -> String- pformatSym = showUntyped- defaultValue :: t- defaultValueDynamic :: proxy t -> ModelValue- defaultValueDynamic _ = toModelValue (defaultValue @t)- pevalITETerm :: Term Bool -> Term t -> Term t -> Term t- pevalEqTerm :: Term t -> Term t -> Term Bool- conSBVTerm :: (KnownIsZero n) => proxy n -> t -> SBVType n t- symSBVName :: TypedSymbol t -> Int -> String- symSBVTerm ::- (SBVFreshMonad m, KnownIsZero n) =>- proxy n ->- String ->- m (SBVType n t)- default withPrim ::- ( PrimConstraint n t,- SBV.SMTDefinable (SBVType n t),- SBV.Mergeable (SBVType n t),- Typeable (SBVType n t),- KnownIsZero n- ) =>- p n ->- ( ( PrimConstraint n t,- SBV.SMTDefinable (SBVType n t),- SBV.Mergeable (SBVType n t),- Typeable (SBVType n t)- ) =>- a- ) ->- a- withPrim ::- (KnownIsZero n) =>- p n ->- ( ( PrimConstraint n t,- SBV.SMTDefinable (SBVType n t),- SBV.Mergeable (SBVType n t),- Typeable (SBVType n t)- ) =>- a- ) ->- a- withPrim _ i = i- sbvIte ::- (KnownIsZero n) =>- proxy n ->- SBV.SBV Bool ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvIte p = withPrim @t p SBV.ite- sbvEq ::- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBV.SBV Bool- default sbvEq ::- (KnownIsZero n, SBVT.EqSymbolic (SBVType n t)) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBV.SBV Bool- sbvEq _ = (SBV..==)- parseSMTModelResult :: Int -> ([([SBVD.CV], SBVD.CV)], SBVD.CV) -> t--parseSMTModelResultError ::- (HasCallStack) => TypeRep a -> ([([SBVD.CV], SBVD.CV)], SBVD.CV) -> a-parseSMTModelResultError ty cv =- error $- "BUG: cannot parse SBV model value \""- <> show cv- <> "\" to Grisette model value with the type "- <> show ty--pevalNEqTerm :: (SupportedPrim a) => Term a -> Term a -> Term Bool-pevalNEqTerm l r = pevalNotTerm $ pevalEqTerm l r-{-# INLINE pevalNEqTerm #-}---- | 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---- Partial Evaluation for the terms-class- (SupportedPrim f, SupportedPrim a, SupportedPrim b) =>- PEvalApplyTerm f a b- | f -> a b- where- pevalApplyTerm :: Term f -> Term a -> Term b- sbvApplyTerm ::- (KnownIsZero n) => proxy n -> SBVType n f -> SBVType n a -> SBVType n b--class (SupportedPrim t, Bits t) => PEvalBitwiseTerm t where- pevalAndBitsTerm :: Term t -> Term t -> Term t- pevalOrBitsTerm :: Term t -> Term t -> Term t- pevalXorBitsTerm :: Term t -> Term t -> Term t- pevalComplementBitsTerm :: Term t -> Term t- withSbvBitwiseTermConstraint ::- (KnownIsZero n) =>- proxy n ->- (((Bits (SBVType n t)) => r)) ->- r- sbvAndBitsTerm ::- (KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t- sbvAndBitsTerm p = withSbvBitwiseTermConstraint @t p (SBV..&.)- sbvOrBitsTerm ::- (KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t- sbvOrBitsTerm p = withSbvBitwiseTermConstraint @t p (SBV..|.)- sbvXorBitsTerm ::- (KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t -> SBVType n t- sbvXorBitsTerm p = withSbvBitwiseTermConstraint @t p SBV.xor- sbvComplementBitsTerm ::- (KnownIsZero n) => proxy n -> SBVType n t -> SBVType n t- sbvComplementBitsTerm p = withSbvBitwiseTermConstraint @t p SBV.complement--class (SupportedNonFuncPrim t, SymShift t) => PEvalShiftTerm t where- pevalShiftLeftTerm :: Term t -> Term t -> Term t- pevalShiftRightTerm :: Term t -> Term t -> Term t- withSbvShiftTermConstraint ::- (KnownIsZero n) =>- proxy n ->- (((SBV.SIntegral (NonFuncSBVBaseType n t)) => r)) ->- r- sbvShiftLeftTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvShiftLeftTerm p l r =- withNonFuncPrim @t p $- withSbvShiftTermConstraint @t p $- SBV.sShiftLeft l r- sbvShiftRightTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvShiftRightTerm p l r =- withNonFuncPrim @t p $- withSbvShiftTermConstraint @t p $- SBV.sShiftRight l r--class (SupportedNonFuncPrim t, SymRotate t) => PEvalRotateTerm t where- pevalRotateLeftTerm :: Term t -> Term t -> Term t- pevalRotateRightTerm :: Term t -> Term t -> Term t- withSbvRotateTermConstraint ::- (KnownIsZero n) =>- proxy n ->- (((SBV.SIntegral (NonFuncSBVBaseType n t)) => r)) ->- r- sbvRotateLeftTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvRotateLeftTerm p l r =- withNonFuncPrim @t p $- withSbvRotateTermConstraint @t p $- SBV.sRotateLeft l r- sbvRotateRightTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvRotateRightTerm p l r =- withNonFuncPrim @t p $- withSbvRotateTermConstraint @t p $- SBV.sRotateRight l r--class (SupportedPrim t, Num t) => PEvalNumTerm t where- pevalAddNumTerm :: Term t -> Term t -> Term t- pevalNegNumTerm :: Term t -> Term t- pevalMulNumTerm :: Term t -> Term t -> Term t- pevalAbsNumTerm :: Term t -> Term t- pevalSignumNumTerm :: Term t -> Term t- withSbvNumTermConstraint ::- (KnownIsZero n) =>- proxy n ->- (((Num (SBVType n t)) => r)) ->- r- sbvAddNumTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvAddNumTerm p l r = withSbvNumTermConstraint @t p $ l + r- sbvNegNumTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t- sbvNegNumTerm p l = withSbvNumTermConstraint @t p $ -l- sbvMulNumTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvMulNumTerm p l r = withSbvNumTermConstraint @t p $ l * r- sbvAbsNumTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t- sbvAbsNumTerm p l = withSbvNumTermConstraint @t p $ abs l- sbvSignumNumTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t- sbvSignumNumTerm p l = withSbvNumTermConstraint @t p $ signum l--pevalSubNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a-pevalSubNumTerm l r = pevalAddNumTerm l (pevalNegNumTerm r)--class (SupportedPrim t, Ord t) => PEvalOrdTerm t where- pevalLtOrdTerm :: Term t -> Term t -> Term Bool- pevalLeOrdTerm :: Term t -> Term t -> Term Bool- withSbvOrdTermConstraint ::- (KnownIsZero n) =>- proxy n ->- (((SBV.OrdSymbolic (SBVType n t)) => r)) ->- r- sbvLtOrdTerm ::- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBV.SBV Bool- sbvLtOrdTerm p l r = withSbvOrdTermConstraint @t p $ l SBV..< r- sbvLeOrdTerm ::- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBV.SBV Bool- sbvLeOrdTerm p l r = withSbvOrdTermConstraint @t p $ l SBV..<= r--pevalGtOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool-pevalGtOrdTerm = flip pevalLtOrdTerm--pevalGeOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool-pevalGeOrdTerm = flip pevalLeOrdTerm--class (SupportedPrim t, Integral t) => PEvalDivModIntegralTerm t where- pevalDivIntegralTerm :: Term t -> Term t -> Term t- pevalModIntegralTerm :: Term t -> Term t -> Term t- pevalQuotIntegralTerm :: Term t -> Term t -> Term t- pevalRemIntegralTerm :: Term t -> Term t -> Term t- withSbvDivModIntegralTermConstraint ::- (KnownIsZero n) =>- proxy n ->- (((SBV.SDivisible (SBVType n t)) => r)) ->- r- sbvDivIntegralTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvDivIntegralTerm p l r =- withSbvDivModIntegralTermConstraint @t p $ l `SBV.sDiv` r- sbvModIntegralTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvModIntegralTerm p l r =- withSbvDivModIntegralTermConstraint @t p $ l `SBV.sMod` r- sbvQuotIntegralTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvQuotIntegralTerm p l r =- withSbvDivModIntegralTermConstraint @t p $ l `SBV.sQuot` r- sbvRemIntegralTerm ::- forall proxy n.- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvRemIntegralTerm p l r =- withSbvDivModIntegralTermConstraint @t p $ l `SBV.sRem` r--class- ( PEvalBVTerm s,- PEvalBVTerm u,- forall n. (KnownNat n, 1 <= n) => SupportedNonFuncPrim (u n),- forall n. (KnownNat n, 1 <= n) => SupportedNonFuncPrim (s n),- forall n. (KnownNat n, 1 <= n) => SignConversion (u n) (s n)- ) =>- PEvalBVSignConversionTerm u s- | u -> s,- s -> u- where- pevalBVToSignedTerm :: (KnownNat n, 1 <= n) => Term (u n) -> Term (s n)- pevalBVToUnsignedTerm :: (KnownNat n, 1 <= n) => Term (s n) -> Term (u n)- withSbvSignConversionTermConstraint ::- forall n integerBitwidth p q r.- (KnownIsZero integerBitwidth, KnownNat n, 1 <= n) =>- p n ->- q integerBitwidth ->- ( ( ( Integral (NonFuncSBVBaseType integerBitwidth (u n)),- Integral (NonFuncSBVBaseType integerBitwidth (s n))- ) =>- r- )- ) ->- r- sbvToSigned ::- forall n integerBitwidth o p q.- (KnownIsZero integerBitwidth, KnownNat n, 1 <= n) =>- o u ->- p n ->- q integerBitwidth ->- SBVType integerBitwidth (u n) ->- SBVType integerBitwidth (s n)- sbvToSigned _ _ qint u =- withNonFuncPrim @(u n) qint $- withNonFuncPrim @(s n) qint $- withSbvSignConversionTermConstraint @u @s (Proxy @n) qint $- SBV.sFromIntegral u- sbvToUnsigned ::- forall n integerBitwidth o p q.- (KnownIsZero integerBitwidth, KnownNat n, 1 <= n) =>- o s ->- p n ->- q integerBitwidth ->- SBVType integerBitwidth (s n) ->- SBVType integerBitwidth (u n)- sbvToUnsigned _ _ qint u =- withNonFuncPrim @(u n) qint $- withNonFuncPrim @(s n) qint $- withSbvSignConversionTermConstraint @u @s (Proxy @n) qint $- SBV.sFromIntegral u--class- ( forall n. (KnownNat n, 1 <= n) => SupportedPrim (bv n),- SizedBV bv,- Typeable bv- ) =>- PEvalBVTerm bv- where- pevalBVConcatTerm ::- (KnownNat l, KnownNat r, 1 <= l, 1 <= r) =>- Term (bv l) ->- Term (bv r) ->- Term (bv (l + r))- pevalBVExtendTerm ::- (KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>- Bool ->- proxy r ->- Term (bv l) ->- Term (bv r)- pevalBVSelectTerm ::- (KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, ix + w <= n) =>- p ix ->- q w ->- Term (bv n) ->- Term (bv w)- sbvBVConcatTerm ::- (KnownIsZero n, KnownNat l, KnownNat r, 1 <= l, 1 <= r) =>- p0 n ->- p1 l ->- p2 r ->- SBVType n (bv l) ->- SBVType n (bv r) ->- SBVType n (bv (l + r))- sbvBVExtendTerm ::- (KnownIsZero n, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>- p0 n ->- p1 l ->- p2 r ->- Bool ->- SBVType n (bv l) ->- SBVType n (bv r)- sbvBVSelectTerm ::- ( KnownIsZero int,- KnownNat ix,- KnownNat w,- KnownNat n,- 1 <= n,- 1 <= w,- ix + w <= n- ) =>- p0 int ->- p1 ix ->- p2 w ->- p3 n ->- SBVType int (bv n) ->- SBVType int (bv w)--class (SupportedPrim t, Fractional t) => PEvalFractionalTerm t where- pevalFdivTerm :: Term t -> Term t -> Term t- pevalRecipTerm :: Term t -> Term t- withSbvFractionalTermConstraint ::- (KnownIsZero n) =>- proxy n ->- (((Fractional (SBVType n t)) => r)) ->- r- sbvFdivTerm ::- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t ->- SBVType n t- sbvFdivTerm p l r = withSbvFractionalTermConstraint @t p $ l / r- sbvRecipTerm ::- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t- sbvRecipTerm p l = withSbvFractionalTermConstraint @t p $ recip l--class (SupportedPrim t, Floating t) => PEvalFloatingTerm t where- pevalSqrtTerm :: Term t -> Term t- withSbvFloatingTermConstraint ::- (KnownIsZero n) =>- proxy n ->- (((Floating (SBVType n t)) => r)) ->- r- sbvSqrtTerm ::- (KnownIsZero n) =>- proxy n ->- SBVType n t ->- SBVType n t- sbvSqrtTerm p l = withSbvFloatingTermConstraint @t p $ sqrt l--class- (SupportedPrim arg, SupportedPrim t, Lift tag, NFData tag, Show tag, Typeable tag, Eq tag, Hashable tag) =>- UnaryOp tag arg t- | tag arg -> t- where- pevalUnary :: (Typeable tag, Typeable t) => tag -> Term arg -> Term t- pformatUnary :: tag -> Term arg -> String--class- ( SupportedPrim arg1,- SupportedPrim arg2,- SupportedPrim t,- Lift tag,- NFData tag,- Show tag,- Typeable tag,- Eq tag,- Hashable tag- ) =>- BinaryOp tag arg1 arg2 t- | tag arg1 arg2 -> t- where- pevalBinary :: (Typeable tag, Typeable t) => tag -> Term arg1 -> Term arg2 -> Term t- pformatBinary :: tag -> Term arg1 -> Term arg2 -> String--class- ( SupportedPrim arg1,- SupportedPrim arg2,- SupportedPrim arg3,- SupportedPrim t,- Lift tag,- NFData tag,- Show tag,- Typeable tag,- Eq tag,- Hashable tag- ) =>- TernaryOp tag arg1 arg2 arg3 t- | tag arg1 arg2 arg3 -> t- where- pevalTernary :: (Typeable tag, Typeable t) => tag -> Term arg1 -> Term arg2 -> Term arg3 -> Term t- pformatTernary :: tag -> Term arg1 -> Term arg2 -> Term arg3 -> String---- Typed Symbols---- | A typed symbol is a symbol that is associated with a type. Note that the--- same symbol bodies with different types are considered different symbols--- and can coexist in a term.------ Simple symbols can be created with the @OverloadedStrings@ extension:------ >>> :set -XOverloadedStrings--- >>> "a" :: TypedSymbol Bool--- a :: Bool-data TypedSymbol t where- TypedSymbol :: (SupportedPrim t) => {unTypedSymbol :: Symbol} -> TypedSymbol t--instance Eq (TypedSymbol t) where- TypedSymbol x == TypedSymbol y = x == y--instance Ord (TypedSymbol t) where- TypedSymbol x <= TypedSymbol y = x <= y--instance Lift (TypedSymbol t) where- liftTyped (TypedSymbol x) = [||TypedSymbol x||]--instance Show (TypedSymbol t) where- show (TypedSymbol symbol) = show symbol ++ " :: " ++ show (typeRep @t)--showUntyped :: TypedSymbol t -> String-showUntyped (TypedSymbol symbol) = show symbol--instance Hashable (TypedSymbol t) where- s `hashWithSalt` TypedSymbol x = s `hashWithSalt` x--instance NFData (TypedSymbol t) where- rnf (TypedSymbol str) = rnf str--instance (SupportedPrim t) => IsString (TypedSymbol t) where- fromString = TypedSymbol . fromString--withSymbolSupported :: TypedSymbol t -> ((SupportedPrim t) => a) -> a-withSymbolSupported (TypedSymbol _) a = a---- | A non-index symbol. Type information are checked at runtime.-data SomeTypedSymbol where- SomeTypedSymbol :: forall t. TypeRep t -> TypedSymbol t -> SomeTypedSymbol--instance NFData SomeTypedSymbol where- rnf (SomeTypedSymbol p s) = rnf (SomeTypeRep p) `seq` rnf s--instance Eq SomeTypedSymbol where- (SomeTypedSymbol t1 s1) == (SomeTypedSymbol t2 s2) = case eqTypeRep t1 t2 of- Just HRefl -> s1 == s2- _ -> False--instance Ord SomeTypedSymbol where- (SomeTypedSymbol t1 s1) <= (SomeTypedSymbol t2 s2) =- SomeTypeRep t1 < SomeTypeRep t2- || ( case eqTypeRep t1 t2 of- Just HRefl -> s1 <= s2- _ -> False- )--instance Hashable SomeTypedSymbol where- hashWithSalt s (SomeTypedSymbol t1 s1) = s `hashWithSalt` s1 `hashWithSalt` t1--instance Show SomeTypedSymbol where- show (SomeTypedSymbol _ s) = show s--someTypedSymbol :: forall t. TypedSymbol t -> SomeTypedSymbol-someTypedSymbol s@(TypedSymbol _) = SomeTypedSymbol (typeRep @t) s---- Terms--data FPTrait- = FPIsNaN- | FPIsPositive- | FPIsNegative- | FPIsPositiveInfinite- | FPIsNegativeInfinite- | FPIsInfinite- | FPIsPositiveZero- | FPIsNegativeZero- | FPIsZero- | FPIsNormal- | FPIsSubnormal- | FPIsPoint- deriving (Eq, Ord, Generic, Hashable, Lift, NFData)--instance Show FPTrait where- show FPIsNaN = "is_nan"- show FPIsPositive = "is_pos"- show FPIsNegative = "is_neg"- show FPIsPositiveInfinite = "is_pos_inf"- show FPIsNegativeInfinite = "is_neg_inf"- show FPIsInfinite = "is_inf"- show FPIsPositiveZero = "is_pos_zero"- show FPIsNegativeZero = "is_neg_zero"- show FPIsZero = "is_zero"- show FPIsNormal = "is_normal"- show FPIsSubnormal = "is_subnormal"- show FPIsPoint = "is_point"--data FPUnaryOp = FPAbs | FPNeg- deriving (Eq, Ord, Generic, Hashable, Lift, NFData)--instance Show FPUnaryOp where- show FPAbs = "fp.abs"- show FPNeg = "fp.neg"--data FPBinaryOp = FPRem | FPMin | FPMax- deriving (Eq, Ord, Generic, Hashable, Lift, NFData)--instance Show FPBinaryOp where- show FPRem = "fp.rem"- show FPMin = "fp.min"- show FPMax = "fp.max"--data FPRoundingUnaryOp = FPSqrt | FPRoundToIntegral- deriving (Eq, Ord, Generic, Hashable, Lift, NFData)--instance Show FPRoundingUnaryOp where- show FPSqrt = "fp.sqrt"- show FPRoundToIntegral = "fp.roundToIntegral"--data FPRoundingBinaryOp = FPAdd | FPSub | FPMul | FPDiv- deriving (Eq, Ord, Generic, Hashable, Lift, NFData)--instance Show FPRoundingBinaryOp where- show FPAdd = "fp.add"- show FPSub = "fp.sub"- show FPMul = "fp.mul"- show FPDiv = "fp.div"--data Term t where- ConTerm :: (SupportedPrim t) => {-# UNPACK #-} !Id -> !t -> Term t- SymTerm :: (SupportedPrim t) => {-# UNPACK #-} !Id -> !(TypedSymbol t) -> Term t- UnaryTerm ::- (UnaryOp tag arg t) =>- {-# UNPACK #-} !Id ->- !tag ->- !(Term arg) ->- Term t- BinaryTerm ::- (BinaryOp tag arg1 arg2 t) =>- {-# UNPACK #-} !Id ->- !tag ->- !(Term arg1) ->- !(Term arg2) ->- Term t- TernaryTerm ::- (TernaryOp tag arg1 arg2 arg3 t) =>- {-# UNPACK #-} !Id ->- !tag ->- !(Term arg1) ->- !(Term arg2) ->- !(Term arg3) ->- Term t- NotTerm :: {-# UNPACK #-} !Id -> !(Term Bool) -> Term Bool- OrTerm :: {-# UNPACK #-} !Id -> !(Term Bool) -> !(Term Bool) -> Term Bool- AndTerm :: {-# UNPACK #-} !Id -> !(Term Bool) -> !(Term Bool) -> Term Bool- EqTerm ::- (SupportedPrim t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term Bool- ITETerm ::- (SupportedPrim t) =>- {-# UNPACK #-} !Id ->- !(Term Bool) ->- !(Term t) ->- !(Term t) ->- Term t- AddNumTerm ::- (PEvalNumTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- NegNumTerm ::- (PEvalNumTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- Term t- MulNumTerm ::- (PEvalNumTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- AbsNumTerm ::- (PEvalNumTerm t) => {-# UNPACK #-} !Id -> !(Term t) -> Term t- SignumNumTerm :: (PEvalNumTerm t) => {-# UNPACK #-} !Id -> !(Term t) -> Term t- LtOrdTerm ::- (PEvalOrdTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term Bool- LeOrdTerm ::- (PEvalOrdTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term Bool- AndBitsTerm ::- (PEvalBitwiseTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- OrBitsTerm ::- (PEvalBitwiseTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- XorBitsTerm ::- (PEvalBitwiseTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- ComplementBitsTerm ::- (PEvalBitwiseTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- Term t- ShiftLeftTerm ::- (PEvalShiftTerm t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t- ShiftRightTerm ::- (PEvalShiftTerm t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t- RotateLeftTerm ::- (PEvalRotateTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- RotateRightTerm ::- (PEvalRotateTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- ToSignedTerm ::- (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) =>- {-# UNPACK #-} !Id ->- !(Term (u n)) ->- Term (s n)- ToUnsignedTerm ::- (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) =>- {-# UNPACK #-} !Id ->- !(Term (s n)) ->- Term (u n)- BVConcatTerm ::- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- KnownNat (l + r),- 1 <= l,- 1 <= r,- 1 <= l + r- ) =>- {-# UNPACK #-} !Id ->- !(Term (bv l)) ->- !(Term (bv r)) ->- Term (bv (l + r))- BVSelectTerm ::- ( PEvalBVTerm bv,- KnownNat n,- KnownNat ix,- KnownNat w,- 1 <= n,- 1 <= w,- ix + w <= n- ) =>- {-# UNPACK #-} !Id ->- !(TypeRep ix) ->- !(TypeRep w) ->- !(Term (bv n)) ->- Term (bv w)- BVExtendTerm ::- (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>- {-# UNPACK #-} !Id ->- !Bool ->- !(TypeRep r) ->- !(Term (bv l)) ->- Term (bv r)- ApplyTerm ::- ( SupportedPrim a,- SupportedPrim b,- SupportedPrim f,- PEvalApplyTerm f a b- ) =>- {-# UNPACK #-} !Id ->- !(Term f) ->- !(Term a) ->- Term b- DivIntegralTerm ::- (PEvalDivModIntegralTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- ModIntegralTerm ::- (PEvalDivModIntegralTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- QuotIntegralTerm ::- (PEvalDivModIntegralTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- RemIntegralTerm ::- (PEvalDivModIntegralTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- FPTraitTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- {-# UNPACK #-} !Id ->- !FPTrait ->- !(Term (FP eb sb)) ->- Term Bool- FdivTerm ::- (PEvalFractionalTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- !(Term t) ->- Term t- RecipTerm ::- (PEvalFractionalTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- Term t- SqrtTerm ::- (PEvalFloatingTerm t) =>- {-# UNPACK #-} !Id ->- !(Term t) ->- Term t- FPUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- {-# UNPACK #-} !Id ->- !FPUnaryOp ->- !(Term (FP eb sb)) ->- Term (FP eb sb)- FPBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- {-# UNPACK #-} !Id ->- !FPBinaryOp ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- Term (FP eb sb)- FPRoundingUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>- {-# UNPACK #-} !Id ->- !FPRoundingUnaryOp ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- Term (FP eb sb)- FPRoundingBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>- {-# UNPACK #-} !Id ->- !FPRoundingBinaryOp ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- Term (FP eb sb)- FPFMATerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>- {-# UNPACK #-} !Id ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- Term (FP eb sb)--identity :: Term t -> Id-identity = snd . identityWithTypeRep-{-# INLINE identity #-}--identityWithTypeRep :: forall t. Term t -> (SomeTypeRep, Id)-identityWithTypeRep (ConTerm i _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (SymTerm i _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (UnaryTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (BinaryTerm i _ _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (TernaryTerm i _ _ _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (NotTerm i _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (OrTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (AndTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (EqTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (ITETerm i _ _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (AddNumTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (NegNumTerm i _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (MulNumTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (AbsNumTerm i _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (SignumNumTerm i _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (LtOrdTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (LeOrdTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (AndBitsTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (OrBitsTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (XorBitsTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (ComplementBitsTerm i _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (ShiftLeftTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (ShiftRightTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (RotateLeftTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (RotateRightTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (ToSignedTerm i _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (ToUnsignedTerm i _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (BVConcatTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (BVSelectTerm i _ _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (BVExtendTerm i _ _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (ApplyTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (DivIntegralTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (ModIntegralTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (QuotIntegralTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (RemIntegralTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (FPTraitTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (FdivTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (RecipTerm i _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (SqrtTerm i _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (FPUnaryTerm i _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (FPBinaryTerm i _ _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (FPRoundingUnaryTerm i _ _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (FPRoundingBinaryTerm i _ _ _ _) = (someTypeRep (Proxy @t), i)-identityWithTypeRep (FPFMATerm i _ _ _ _) = (someTypeRep (Proxy @t), i)-{-# INLINE identityWithTypeRep #-}--introSupportedPrimConstraint :: forall t a. Term t -> ((SupportedPrim t) => a) -> a-introSupportedPrimConstraint ConTerm {} x = x-introSupportedPrimConstraint SymTerm {} x = x-introSupportedPrimConstraint UnaryTerm {} x = x-introSupportedPrimConstraint BinaryTerm {} x = x-introSupportedPrimConstraint TernaryTerm {} x = x-introSupportedPrimConstraint NotTerm {} x = x-introSupportedPrimConstraint OrTerm {} x = x-introSupportedPrimConstraint AndTerm {} x = x-introSupportedPrimConstraint EqTerm {} x = x-introSupportedPrimConstraint ITETerm {} x = x-introSupportedPrimConstraint AddNumTerm {} x = x-introSupportedPrimConstraint NegNumTerm {} x = x-introSupportedPrimConstraint MulNumTerm {} x = x-introSupportedPrimConstraint AbsNumTerm {} x = x-introSupportedPrimConstraint SignumNumTerm {} x = x-introSupportedPrimConstraint LtOrdTerm {} x = x-introSupportedPrimConstraint LeOrdTerm {} x = x-introSupportedPrimConstraint AndBitsTerm {} x = x-introSupportedPrimConstraint OrBitsTerm {} x = x-introSupportedPrimConstraint XorBitsTerm {} x = x-introSupportedPrimConstraint ComplementBitsTerm {} x = x-introSupportedPrimConstraint ShiftLeftTerm {} x = x-introSupportedPrimConstraint RotateLeftTerm {} x = x-introSupportedPrimConstraint ShiftRightTerm {} x = x-introSupportedPrimConstraint RotateRightTerm {} x = x-introSupportedPrimConstraint ToSignedTerm {} x = x-introSupportedPrimConstraint ToUnsignedTerm {} x = x-introSupportedPrimConstraint BVConcatTerm {} x = x-introSupportedPrimConstraint BVSelectTerm {} x = x-introSupportedPrimConstraint BVExtendTerm {} x = x-introSupportedPrimConstraint ApplyTerm {} x = x-introSupportedPrimConstraint DivIntegralTerm {} x = x-introSupportedPrimConstraint ModIntegralTerm {} x = x-introSupportedPrimConstraint QuotIntegralTerm {} x = x-introSupportedPrimConstraint RemIntegralTerm {} x = x-introSupportedPrimConstraint FPTraitTerm {} x = x-introSupportedPrimConstraint FdivTerm {} x = x-introSupportedPrimConstraint RecipTerm {} x = x-introSupportedPrimConstraint SqrtTerm {} x = x-introSupportedPrimConstraint FPUnaryTerm {} x = x-introSupportedPrimConstraint FPBinaryTerm {} x = x-introSupportedPrimConstraint FPRoundingUnaryTerm {} x = x-introSupportedPrimConstraint FPRoundingBinaryTerm {} x = x-introSupportedPrimConstraint FPFMATerm {} x = x-{-# INLINE introSupportedPrimConstraint #-}--pformat :: forall t. (SupportedPrim t) => Term t -> String-pformat (ConTerm _ t) = pformatCon t-pformat (SymTerm _ sym) = pformatSym sym-pformat (UnaryTerm _ tag arg1) = pformatUnary tag arg1-pformat (BinaryTerm _ tag arg1 arg2) = pformatBinary tag arg1 arg2-pformat (TernaryTerm _ tag arg1 arg2 arg3) = pformatTernary tag arg1 arg2 arg3-pformat (NotTerm _ arg) = "(! " ++ pformat arg ++ ")"-pformat (OrTerm _ arg1 arg2) = "(|| " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (AndTerm _ arg1 arg2) = "(&& " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (EqTerm _ arg1 arg2) = "(= " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (ITETerm _ cond arg1 arg2) = "(ite " ++ pformat cond ++ " " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (AddNumTerm _ arg1 arg2) = "(+ " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (NegNumTerm _ arg) = "(- " ++ pformat arg ++ ")"-pformat (MulNumTerm _ arg1 arg2) = "(* " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (AbsNumTerm _ arg) = "(abs " ++ pformat arg ++ ")"-pformat (SignumNumTerm _ arg) = "(signum " ++ pformat arg ++ ")"-pformat (LtOrdTerm _ arg1 arg2) = "(< " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (LeOrdTerm _ arg1 arg2) = "(<= " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (AndBitsTerm _ arg1 arg2) = "(& " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (OrBitsTerm _ arg1 arg2) = "(| " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (XorBitsTerm _ arg1 arg2) = "(^ " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (ComplementBitsTerm _ arg) = "(~ " ++ pformat arg ++ ")"-pformat (ShiftLeftTerm _ arg n) = "(shl " ++ pformat arg ++ " " ++ pformat n ++ ")"-pformat (ShiftRightTerm _ arg n) = "(shr " ++ pformat arg ++ " " ++ pformat n ++ ")"-pformat (RotateLeftTerm _ arg n) = "(rotl " ++ pformat arg ++ " " ++ pformat n ++ ")"-pformat (RotateRightTerm _ arg n) = "(rotr " ++ pformat arg ++ " " ++ pformat n ++ ")"-pformat (ToSignedTerm _ arg) = "(u2s " ++ pformat arg ++ " " ++ ")"-pformat (ToUnsignedTerm _ arg) = "(s2u " ++ pformat arg ++ " " ++ ")"-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 ++ ")"-pformat (ApplyTerm _ func arg) = "(apply " ++ pformat func ++ " " ++ pformat arg ++ ")"-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 (FPTraitTerm _ trait arg) = "(" ++ show trait ++ " " ++ pformat arg ++ ")"-pformat (FdivTerm _ arg1 arg2) = "(fdiv " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (RecipTerm _ arg) = "(recip " ++ pformat arg ++ ")"-pformat (SqrtTerm _ arg) = "(sqrt " ++ pformat arg ++ ")"-pformat (FPUnaryTerm _ op arg) = "(" ++ show op ++ " " ++ pformat arg ++ ")"-pformat (FPBinaryTerm _ op arg1 arg2) = "(" ++ show op ++ " " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (FPRoundingUnaryTerm _ op mode arg) = "(" ++ show op ++ " " ++ pformat mode ++ " " ++ pformat arg ++ ")"-pformat (FPRoundingBinaryTerm _ op mode arg1 arg2) =- "(" ++ show op ++ " " ++ pformat mode ++ " " ++ pformat arg1 ++ " " ++ pformat arg2 ++ ")"-pformat (FPFMATerm _ mode arg1 arg2 arg3) =- "(fp.fma " ++ pformat mode ++ " " ++ pformat arg1 ++ " " ++ pformat arg2 ++ " " ++ pformat arg3 ++ ")"-{-# INLINE pformat #-}--instance NFData (Term a) where- rnf i = identity i `seq` ()--instance Lift (Term t) where- liftTyped (ConTerm _ i) = [||conTerm i||]- liftTyped (SymTerm _ sym) = [||symTerm (unTypedSymbol sym)||]- liftTyped (UnaryTerm _ tag arg) = [||constructUnary tag arg||]- liftTyped (BinaryTerm _ tag arg1 arg2) = [||constructBinary tag arg1 arg2||]- liftTyped (TernaryTerm _ tag arg1 arg2 arg3) = [||constructTernary tag arg1 arg2 arg3||]- liftTyped (NotTerm _ arg) = [||notTerm arg||]- liftTyped (OrTerm _ arg1 arg2) = [||orTerm arg1 arg2||]- liftTyped (AndTerm _ arg1 arg2) = [||andTerm arg1 arg2||]- liftTyped (EqTerm _ arg1 arg2) = [||eqTerm arg1 arg2||]- liftTyped (ITETerm _ cond arg1 arg2) = [||iteTerm cond arg1 arg2||]- liftTyped (AddNumTerm _ arg1 arg2) = [||addNumTerm arg1 arg2||]- liftTyped (NegNumTerm _ arg) = [||negNumTerm arg||]- liftTyped (MulNumTerm _ arg1 arg2) = [||mulNumTerm arg1 arg2||]- liftTyped (AbsNumTerm _ arg) = [||absNumTerm arg||]- liftTyped (SignumNumTerm _ arg) = [||signumNumTerm arg||]- liftTyped (LtOrdTerm _ arg1 arg2) = [||ltOrdTerm arg1 arg2||]- liftTyped (LeOrdTerm _ arg1 arg2) = [||leOrdTerm arg1 arg2||]- liftTyped (AndBitsTerm _ arg1 arg2) = [||andBitsTerm arg1 arg2||]- liftTyped (OrBitsTerm _ arg1 arg2) = [||orBitsTerm arg1 arg2||]- liftTyped (XorBitsTerm _ arg1 arg2) = [||xorBitsTerm arg1 arg2||]- liftTyped (ComplementBitsTerm _ arg) = [||complementBitsTerm arg||]- liftTyped (ShiftLeftTerm _ arg n) = [||shiftLeftTerm arg n||]- liftTyped (ShiftRightTerm _ arg n) = [||shiftRightTerm arg n||]- liftTyped (RotateLeftTerm _ arg n) = [||rotateLeftTerm arg n||]- liftTyped (RotateRightTerm _ arg n) = [||rotateRightTerm arg n||]- liftTyped (ToSignedTerm _ v) = [||toSignedTerm v||]- liftTyped (ToUnsignedTerm _ v) = [||toUnsignedTerm v||]- liftTyped (BVConcatTerm _ arg1 arg2) = [||bvconcatTerm arg1 arg2||]- liftTyped (BVSelectTerm _ (_ :: TypeRep ix) (_ :: TypeRep w) arg) = [||bvselectTerm (Proxy @ix) (Proxy @w) arg||]- liftTyped (BVExtendTerm _ signed (_ :: TypeRep n) arg) = [||bvextendTerm signed (Proxy @n) arg||]- liftTyped (ApplyTerm _ f arg) = [||applyTerm f arg||]- 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 (FPTraitTerm _ trait arg) = [||fpTraitTerm trait arg||]- liftTyped (FdivTerm _ arg1 arg2) = [||fdivTerm arg1 arg2||]- liftTyped (RecipTerm _ arg) = [||recipTerm arg||]- liftTyped (SqrtTerm _ arg) = [||sqrtTerm arg||]- liftTyped (FPUnaryTerm _ op arg) = [||fpUnaryTerm op arg||]- liftTyped (FPBinaryTerm _ op arg1 arg2) = [||fpBinaryTerm op arg1 arg2||]- liftTyped (FPRoundingUnaryTerm _ op mode arg) = [||fpRoundingUnaryTerm op mode arg||]- liftTyped (FPRoundingBinaryTerm _ op mode arg1 arg2) = [||fpRoundingBinaryTerm op mode arg1 arg2||]- liftTyped (FPFMATerm _ mode arg1 arg2 arg3) = [||fpFMATerm mode arg1 arg2 arg3||]--instance Show (Term ty) where- show (ConTerm i v) = "ConTerm{id=" ++ show i ++ ", v=" ++ show v ++ "}"- show (SymTerm i name) =- "SymTerm{id="- ++ show i- ++ ", name="- ++ show name- ++ ", type="- ++ show (typeRep @ty)- ++ "}"- show (UnaryTerm i tag arg) = "Unary{id=" ++ show i ++ ", tag=" ++ show tag ++ ", arg=" ++ show arg ++ "}"- show (BinaryTerm i tag arg1 arg2) =- "Binary{id="- ++ show i- ++ ", tag="- ++ show tag- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (TernaryTerm i tag arg1 arg2 arg3) =- "Ternary{id="- ++ show i- ++ ", tag="- ++ show tag- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ ", arg3="- ++ show arg3- ++ "}"- show (NotTerm i arg) = "Not{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"- show (OrTerm i arg1 arg2) = "Or{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (AndTerm i arg1 arg2) = "And{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (EqTerm i arg1 arg2) = "Eqv{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (ITETerm i cond l r) =- "ITE{id="- ++ show i- ++ ", cond="- ++ show cond- ++ ", then="- ++ show l- ++ ", else="- ++ show r- ++ "}"- show (AddNumTerm i arg1 arg2) = "AddNum{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (NegNumTerm i arg) = "NegNum{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"- show (MulNumTerm i arg1 arg2) = "MulNum{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (AbsNumTerm i arg) = "AbsNum{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"- show (SignumNumTerm i arg) = "SignumNum{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"- show (LtOrdTerm i arg1 arg2) = "LTNum{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (LeOrdTerm i arg1 arg2) = "LENum{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (AndBitsTerm i arg1 arg2) = "AndBits{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (OrBitsTerm i arg1 arg2) = "OrBits{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (XorBitsTerm i arg1 arg2) = "XorBits{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (ComplementBitsTerm i arg) = "ComplementBits{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"- show (ShiftLeftTerm i arg n) = "ShiftLeft{id=" ++ show i ++ ", arg=" ++ show arg ++ ", n=" ++ show n ++ "}"- show (ShiftRightTerm i arg n) = "ShiftRight{id=" ++ show i ++ ", arg=" ++ show arg ++ ", n=" ++ show n ++ "}"- show (RotateLeftTerm i arg n) = "RotateLeft{id=" ++ show i ++ ", arg=" ++ show arg ++ ", n=" ++ show n ++ "}"- show (RotateRightTerm i arg n) = "RotateRight{id=" ++ show i ++ ", arg=" ++ show arg ++ ", n=" ++ show n ++ "}"- show (ToSignedTerm i arg) = "ToSigned{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"- show (ToUnsignedTerm i arg) = "ToUnsigned{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"- show (BVConcatTerm i arg1 arg2) = "BVConcat{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (BVSelectTerm i ix w arg) =- "BVSelect{id=" ++ show i ++ ", ix=" ++ show ix ++ ", w=" ++ show w ++ ", arg=" ++ show arg ++ "}"- show (BVExtendTerm i signed n arg) =- "BVExtend{id=" ++ show i ++ ", signed=" ++ show signed ++ ", n=" ++ show n ++ ", arg=" ++ show arg ++ "}"- show (ApplyTerm i f arg) =- "Apply{id=" ++ show i ++ ", f=" ++ show f ++ ", arg=" ++ show arg ++ "}"- 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 (FPTraitTerm i trait arg) =- "FPTrait{id=" ++ show i ++ ", trait=" ++ show trait ++ ", arg=" ++ show arg ++ "}"- show (FdivTerm i arg1 arg2) = "Fdiv{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (RecipTerm i arg) = "Recip{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"- show (SqrtTerm i arg) = "Sqrt{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"- show (FPUnaryTerm i op arg) = "FPUnary{id=" ++ show i ++ ", op=" ++ show op ++ ", arg=" ++ show arg ++ "}"- show (FPBinaryTerm i op arg1 arg2) =- "FPBinary{id=" ++ show i ++ ", op=" ++ show op ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"- show (FPRoundingUnaryTerm i op mode arg) =- "FPRoundingUnary{id=" ++ show i ++ ", op=" ++ show op ++ ", mode=" ++ show mode ++ ", arg=" ++ show arg ++ "}"- show (FPRoundingBinaryTerm i op mode arg1 arg2) =- "FPRoundingBinary{id="- ++ show i- ++ ", op="- ++ show op- ++ ", mode="- ++ show mode- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ "}"- show (FPFMATerm i mode arg1 arg2 arg3) =- "FPFMA{id="- ++ show i- ++ ", mode="- ++ show mode- ++ ", arg1="- ++ show arg1- ++ ", arg2="- ++ show arg2- ++ ", arg3="- ++ show arg3- ++ "}"- {-# INLINE show #-}--prettyPrintTerm :: Term t -> Doc ann-prettyPrintTerm v =- column- ( \c ->- pageWidth $ \case- AvailablePerLine i r ->- if fromIntegral (c + len) > fromIntegral i * r- then "..."- else pretty formatted- Unbounded -> pretty formatted- )- where- formatted = introSupportedPrimConstraint v $ pformat v- len = length formatted--instance (SupportedPrim t) => Eq (Term t) where- (==) = (==) `on` identity--instance (SupportedPrim t) => Hashable (Term t) where- hashWithSalt s t = hashWithSalt s $ identity t---- Interning--data UTerm t where- UConTerm :: (SupportedPrim t) => !t -> UTerm t- USymTerm :: (SupportedPrim t) => !(TypedSymbol t) -> UTerm t- UUnaryTerm :: (UnaryOp tag arg t) => !tag -> !(Term arg) -> UTerm t- UBinaryTerm ::- (BinaryOp tag arg1 arg2 t) =>- !tag ->- !(Term arg1) ->- !(Term arg2) ->- UTerm t- UTernaryTerm ::- (TernaryOp tag arg1 arg2 arg3 t) =>- !tag ->- !(Term arg1) ->- !(Term arg2) ->- !(Term arg3) ->- UTerm t- UNotTerm :: !(Term Bool) -> UTerm Bool- UOrTerm :: !(Term Bool) -> !(Term Bool) -> UTerm Bool- UAndTerm :: !(Term Bool) -> !(Term Bool) -> UTerm Bool- UEqTerm :: (SupportedPrim t) => !(Term t) -> !(Term t) -> UTerm Bool- UITETerm ::- (SupportedPrim t) =>- !(Term Bool) ->- !(Term t) ->- !(Term t) ->- UTerm t- UAddNumTerm :: (PEvalNumTerm t) => !(Term t) -> !(Term t) -> UTerm t- UNegNumTerm :: (PEvalNumTerm t) => !(Term t) -> UTerm t- UMulNumTerm :: (PEvalNumTerm t) => !(Term t) -> !(Term t) -> UTerm t- UAbsNumTerm :: (PEvalNumTerm t) => !(Term t) -> UTerm t- USignumNumTerm :: (PEvalNumTerm t) => !(Term t) -> UTerm t- ULtOrdTerm :: (PEvalOrdTerm t) => !(Term t) -> !(Term t) -> UTerm Bool- ULeOrdTerm :: (PEvalOrdTerm t) => !(Term t) -> !(Term t) -> UTerm Bool- UAndBitsTerm :: (PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t- UOrBitsTerm :: (PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t- UXorBitsTerm :: (PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t- UComplementBitsTerm :: (PEvalBitwiseTerm t) => !(Term t) -> UTerm t- UShiftLeftTerm :: (PEvalShiftTerm t) => !(Term t) -> !(Term t) -> UTerm t- UShiftRightTerm :: (PEvalShiftTerm t) => !(Term t) -> !(Term t) -> UTerm t- URotateLeftTerm :: (PEvalRotateTerm t) => !(Term t) -> !(Term t) -> UTerm t- URotateRightTerm :: (PEvalRotateTerm t) => !(Term t) -> !(Term t) -> UTerm t- UToSignedTerm ::- (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) =>- !(Term (u n)) ->- UTerm (s n)- UToUnsignedTerm ::- (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) =>- !(Term (s n)) ->- UTerm (u n)- UBVConcatTerm ::- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- KnownNat (l + r),- 1 <= l,- 1 <= r,- 1 <= l + r- ) =>- !(Term (bv l)) ->- !(Term (bv r)) ->- UTerm (bv (l + r))- UBVSelectTerm ::- ( PEvalBVTerm bv,- KnownNat n,- KnownNat ix,- KnownNat w,- 1 <= n,- 1 <= w,- ix + w <= n- ) =>- !(TypeRep ix) ->- !(TypeRep w) ->- !(Term (bv n)) ->- UTerm (bv w)- UBVExtendTerm ::- (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>- !Bool ->- !(TypeRep r) ->- !(Term (bv l)) ->- UTerm (bv r)- UApplyTerm ::- ( SupportedPrim a,- SupportedPrim b,- SupportedPrim f,- PEvalApplyTerm f a b- ) =>- Term f ->- Term a ->- UTerm b- UDivIntegralTerm ::- (PEvalDivModIntegralTerm t) => !(Term t) -> !(Term t) -> UTerm t- UModIntegralTerm ::- (PEvalDivModIntegralTerm t) => !(Term t) -> !(Term t) -> UTerm t- UQuotIntegralTerm ::- (PEvalDivModIntegralTerm t) => !(Term t) -> !(Term t) -> UTerm t- URemIntegralTerm ::- (PEvalDivModIntegralTerm t) => !(Term t) -> !(Term t) -> UTerm t- UFPTraitTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- !FPTrait ->- !(Term (FP eb sb)) ->- UTerm Bool- UFdivTerm :: (PEvalFractionalTerm t) => !(Term t) -> !(Term t) -> UTerm t- URecipTerm :: (PEvalFractionalTerm t) => !(Term t) -> UTerm t- USqrtTerm :: (PEvalFloatingTerm t) => !(Term t) -> UTerm t- UFPUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- !FPUnaryOp ->- !(Term (FP eb sb)) ->- UTerm (FP eb sb)- UFPBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- !FPBinaryOp ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- UTerm (FP eb sb)- UFPRoundingUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>- !FPRoundingUnaryOp ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- UTerm (FP eb sb)- UFPRoundingBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>- !FPRoundingBinaryOp ->- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- UTerm (FP eb sb)- UFPFMATerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>- !(Term FPRoundingMode) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- !(Term (FP eb sb)) ->- UTerm (FP eb sb)--eqTypedId :: (TypeRep a, Id) -> (TypeRep b, Id) -> Bool-eqTypedId (a, i1) (b, i2) = i1 == i2 && eqTypeRepBool a b-{-# INLINE eqTypedId #-}--eqHeteroTag :: (Eq a) => (TypeRep a, a) -> (TypeRep b, b) -> Bool-eqHeteroTag (tpa, taga) (tpb, tagb) = eqHeteroRep tpa tpb taga tagb-{-# INLINE eqHeteroTag #-}--instance (SupportedPrim t) => Interned (Term t) where- type Uninterned (Term t) = UTerm t- data Description (Term t) where- DConTerm :: t -> Description (Term t)- DSymTerm :: TypedSymbol t -> Description (Term t)- DUnaryTerm ::- (Eq tag, Hashable tag) =>- {-# UNPACK #-} !(TypeRep tag, tag) ->- {-# UNPACK #-} !(TypeRep arg, Id) ->- Description (Term t)- DBinaryTerm ::- (Eq tag, Hashable tag) =>- {-# UNPACK #-} !(TypeRep tag, tag) ->- {-# UNPACK #-} !(TypeRep arg1, Id) ->- {-# UNPACK #-} !(TypeRep arg2, Id) ->- Description (Term t)- DTernaryTerm ::- (Eq tag, Hashable tag) =>- {-# UNPACK #-} !(TypeRep tag, tag) ->- {-# UNPACK #-} !(TypeRep arg1, Id) ->- {-# UNPACK #-} !(TypeRep arg2, Id) ->- {-# UNPACK #-} !(TypeRep arg3, Id) ->- Description (Term t)- DNotTerm :: {-# UNPACK #-} !Id -> Description (Term Bool)- DOrTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Bool)- DAndTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Bool)- DEqTerm :: TypeRep args -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Bool)- DITETerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)- DAddNumTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)- DNegNumTerm :: {-# UNPACK #-} !Id -> Description (Term t)- DMulNumTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)- DAbsNumTerm :: {-# UNPACK #-} !Id -> Description (Term t)- DSignumNumTerm :: {-# UNPACK #-} !Id -> Description (Term t)- DLtOrdTerm :: TypeRep args -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Bool)- DLeOrdTerm :: TypeRep args -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Bool)- DAndBitsTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)- DOrBitsTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)- DXorBitsTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)- DComplementBitsTerm :: {-# UNPACK #-} !Id -> Description (Term t)- DShiftLeftTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)- DShiftRightTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)- DRotateLeftTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)- DRotateRightTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)- DBVConcatTerm :: TypeRep bv1 -> TypeRep bv2 -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)- DToSignedTerm ::- !(TypeRep u, Id) ->- Description (Term s)- DToUnsignedTerm ::- !(TypeRep s, Id) ->- Description (Term u)- DBVSelectTerm ::- forall bv (n :: Nat) (w :: Nat) (ix :: Nat).- !(TypeRep ix) ->- !(TypeRep (bv n), Id) ->- Description (Term (bv w))- DBVExtendTerm ::- forall bv (l :: Nat) (r :: Nat).- !Bool ->- !(TypeRep r) ->- {-# UNPACK #-} !(TypeRep (bv l), Id) ->- Description (Term (bv r))- DApplyTerm ::- ( PEvalApplyTerm f a b- ) =>- {-# UNPACK #-} !(TypeRep f, Id) ->- {-# UNPACK #-} !(TypeRep a, Id) ->- Description (Term b)- 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)- DFPTraitTerm :: FPTrait -> {-# UNPACK #-} !Id -> Description (Term Bool)- DFdivTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term a)- DRecipTerm :: {-# UNPACK #-} !Id -> Description (Term a)- DSqrtTerm :: {-# UNPACK #-} !Id -> Description (Term a)- DFPUnaryTerm :: FPUnaryOp -> {-# UNPACK #-} !Id -> Description (Term (FP eb sb))- DFPBinaryTerm :: FPBinaryOp -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term (FP eb sb))- DFPRoundingUnaryTerm :: FPRoundingUnaryOp -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term (FP eb sb))- DFPRoundingBinaryTerm :: FPRoundingBinaryOp -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term (FP eb sb))- DFPFMATerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term (FP eb sb))-- describe (UConTerm v) = DConTerm v- describe ((USymTerm name) :: UTerm t) = DSymTerm @t name- describe ((UUnaryTerm (tag :: tagt) (tm :: Term arg)) :: UTerm t) =- DUnaryTerm (typeRep, tag) (typeRep :: TypeRep arg, identity tm)- describe ((UBinaryTerm (tag :: tagt) (tm1 :: Term arg1) (tm2 :: Term arg2)) :: UTerm t) =- DBinaryTerm @tagt @arg1 @arg2 @t (typeRep, tag) (typeRep, identity tm1) (typeRep, identity tm2)- describe ((UTernaryTerm (tag :: tagt) (tm1 :: Term arg1) (tm2 :: Term arg2) (tm3 :: Term arg3)) :: UTerm t) =- DTernaryTerm @tagt @arg1 @arg2 @arg3 @t- (typeRep, tag)- (typeRep, identity tm1)- (typeRep, identity tm2)- (typeRep, identity tm3)- describe (UNotTerm arg) = DNotTerm (identity arg)- describe (UOrTerm arg1 arg2) = DOrTerm (identity arg1) (identity arg2)- describe (UAndTerm arg1 arg2) = DAndTerm (identity arg1) (identity arg2)- describe (UEqTerm (arg1 :: Term arg) arg2) = DEqTerm (typeRep :: TypeRep arg) (identity arg1) (identity arg2)- describe (UITETerm cond (l :: Term arg) r) = DITETerm (identity cond) (identity l) (identity r)- describe (UAddNumTerm arg1 arg2) = DAddNumTerm (identity arg1) (identity arg2)- describe (UNegNumTerm arg) = DNegNumTerm (identity arg)- describe (UMulNumTerm arg1 arg2) = DMulNumTerm (identity arg1) (identity arg2)- describe (UAbsNumTerm arg) = DAbsNumTerm (identity arg)- describe (USignumNumTerm arg) = DSignumNumTerm (identity arg)- describe (ULtOrdTerm (arg1 :: arg) arg2) = DLtOrdTerm (typeRep :: TypeRep arg) (identity arg1) (identity arg2)- describe (ULeOrdTerm (arg1 :: arg) arg2) = DLeOrdTerm (typeRep :: TypeRep arg) (identity arg1) (identity arg2)- describe (UAndBitsTerm arg1 arg2) = DAndBitsTerm (identity arg1) (identity arg2)- describe (UOrBitsTerm arg1 arg2) = DOrBitsTerm (identity arg1) (identity arg2)- describe (UXorBitsTerm arg1 arg2) = DXorBitsTerm (identity arg1) (identity arg2)- describe (UComplementBitsTerm arg) = DComplementBitsTerm (identity arg)- describe (UShiftLeftTerm arg n) = DShiftLeftTerm (identity arg) (identity n)- describe (UShiftRightTerm arg n) = DShiftRightTerm (identity arg) (identity n)- describe (URotateLeftTerm arg n) = DRotateLeftTerm (identity arg) (identity n)- describe (URotateRightTerm arg n) = DRotateRightTerm (identity arg) (identity n)- describe (UToSignedTerm (arg :: Term bv)) = DToSignedTerm (typeRep :: TypeRep bv, identity arg)- describe (UToUnsignedTerm (arg :: Term bv)) = DToSignedTerm (typeRep :: TypeRep bv, identity arg)- describe (UBVConcatTerm (arg1 :: bv1) (arg2 :: bv2)) =- DBVConcatTerm (typeRep :: TypeRep bv1) (typeRep :: TypeRep bv2) (identity arg1) (identity arg2)- describe (UBVSelectTerm (ix :: TypeRep ix) _ (arg :: Term arg)) =- DBVSelectTerm ix (typeRep :: TypeRep arg, identity arg)- describe (UBVExtendTerm signed (n :: TypeRep n) (arg :: Term arg)) =- DBVExtendTerm signed n (typeRep :: TypeRep arg, identity arg)- describe (UApplyTerm (f :: Term f) (arg :: Term a)) =- DApplyTerm (typeRep :: TypeRep f, identity f) (typeRep :: TypeRep a, identity arg)- 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 (UFPTraitTerm trait arg) = DFPTraitTerm trait (identity arg)- describe (UFdivTerm arg1 arg2) = DFdivTerm (identity arg1) (identity arg2)- describe (URecipTerm arg) = DRecipTerm (identity arg)- describe (USqrtTerm arg) = DSqrtTerm (identity arg)- describe (UFPUnaryTerm op arg) = DFPUnaryTerm op (identity arg)- describe (UFPBinaryTerm op arg1 arg2) = DFPBinaryTerm op (identity arg1) (identity arg2)- describe (UFPRoundingUnaryTerm op mode arg) = DFPRoundingUnaryTerm op (identity mode) (identity arg)- describe (UFPRoundingBinaryTerm op mode arg1 arg2) = DFPRoundingBinaryTerm op (identity mode) (identity arg1) (identity arg2)- describe (UFPFMATerm mode arg1 arg2 arg3) = DFPFMATerm (identity mode) (identity arg1) (identity arg2) (identity arg3)-- identify i = go- where- go (UConTerm v) = ConTerm i v- go (USymTerm v) = SymTerm i v- go (UUnaryTerm tag tm) = UnaryTerm i tag tm- go (UBinaryTerm tag tm1 tm2) = BinaryTerm i tag tm1 tm2- go (UTernaryTerm tag tm1 tm2 tm3) = TernaryTerm i tag tm1 tm2 tm3- go (UNotTerm arg) = NotTerm i arg- go (UOrTerm arg1 arg2) = OrTerm i arg1 arg2- go (UAndTerm arg1 arg2) = AndTerm i arg1 arg2- go (UEqTerm arg1 arg2) = EqTerm i arg1 arg2- go (UITETerm cond l r) = ITETerm i cond l r- go (UAddNumTerm arg1 arg2) = AddNumTerm i arg1 arg2- go (UNegNumTerm arg) = NegNumTerm i arg- go (UMulNumTerm arg1 arg2) = MulNumTerm i arg1 arg2- go (UAbsNumTerm arg) = AbsNumTerm i arg- go (USignumNumTerm arg) = SignumNumTerm i arg- go (ULtOrdTerm arg1 arg2) = LtOrdTerm i arg1 arg2- go (ULeOrdTerm arg1 arg2) = LeOrdTerm i arg1 arg2- go (UAndBitsTerm arg1 arg2) = AndBitsTerm i arg1 arg2- go (UOrBitsTerm arg1 arg2) = OrBitsTerm i arg1 arg2- go (UXorBitsTerm arg1 arg2) = XorBitsTerm i arg1 arg2- go (UComplementBitsTerm arg) = ComplementBitsTerm i arg- go (UShiftLeftTerm arg n) = ShiftLeftTerm i arg n- go (UShiftRightTerm arg n) = ShiftRightTerm i arg n- go (URotateLeftTerm arg n) = RotateLeftTerm i arg n- go (URotateRightTerm arg n) = RotateRightTerm i arg n- go (UToSignedTerm arg) = ToSignedTerm i arg- go (UToUnsignedTerm arg) = ToUnsignedTerm i arg- go (UBVConcatTerm arg1 arg2) = BVConcatTerm i arg1 arg2- go (UBVSelectTerm ix w arg) = BVSelectTerm i ix w arg- go (UBVExtendTerm signed n arg) = BVExtendTerm i signed n arg- go (UApplyTerm f arg) = ApplyTerm i f arg- 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 (UFPTraitTerm trait arg) = FPTraitTerm i trait arg- go (UFdivTerm arg1 arg2) = FdivTerm i arg1 arg2- go (URecipTerm arg) = RecipTerm i arg- go (USqrtTerm arg) = SqrtTerm i arg- go (UFPUnaryTerm op arg) = FPUnaryTerm i op arg- go (UFPBinaryTerm op arg1 arg2) = FPBinaryTerm i op arg1 arg2- go (UFPRoundingUnaryTerm op mode arg) = FPRoundingUnaryTerm i op mode arg- go (UFPRoundingBinaryTerm op mode arg1 arg2) = FPRoundingBinaryTerm i op mode arg1 arg2- go (UFPFMATerm mode arg1 arg2 arg3) = FPFMATerm i mode arg1 arg2 arg3- cache = termCache--instance (SupportedPrim t) => Eq (Description (Term t)) where- DConTerm (l :: tyl) == DConTerm (r :: tyr) = cast @tyl @tyr l == Just r- DSymTerm ls == DSymTerm rs = ls == rs- DUnaryTerm (tagl :: tagl) li == DUnaryTerm (tagr :: tagr) ri = eqHeteroTag tagl tagr && eqTypedId li ri- DBinaryTerm (tagl :: tagl) li1 li2 == DBinaryTerm (tagr :: tagr) ri1 ri2 =- eqHeteroTag tagl tagr && eqTypedId li1 ri1 && eqTypedId li2 ri2- DTernaryTerm (tagl :: tagl) li1 li2 li3 == DTernaryTerm (tagr :: tagr) ri1 ri2 ri3 =- eqHeteroTag tagl tagr && eqTypedId li1 ri1 && eqTypedId li2 ri2 && eqTypedId li3 ri3- DNotTerm li == DNotTerm ri = li == ri- DOrTerm li1 li2 == DOrTerm ri1 ri2 = li1 == ri1 && li2 == ri2- DAndTerm li1 li2 == DAndTerm ri1 ri2 = li1 == ri1 && li2 == ri2- DEqTerm lrep li1 li2 == DEqTerm rrep ri1 ri2 = eqTypeRepBool lrep rrep && li1 == ri1 && li2 == ri2- DITETerm lc li1 li2 == DITETerm rc ri1 ri2 = lc == rc && li1 == ri1 && li2 == ri2- DAddNumTerm li1 li2 == DAddNumTerm ri1 ri2 = li1 == ri1 && li2 == ri2- DNegNumTerm li == DNegNumTerm ri = li == ri- DMulNumTerm li1 li2 == DMulNumTerm ri1 ri2 = li1 == ri1 && li2 == ri2- DAbsNumTerm li == DAbsNumTerm ri = li == ri- DSignumNumTerm li == DSignumNumTerm ri = li == ri- DLtOrdTerm lrep li1 li2 == DLtOrdTerm rrep ri1 ri2 = eqTypeRepBool lrep rrep && li1 == ri1 && li2 == ri2- DLeOrdTerm lrep li1 li2 == DLeOrdTerm rrep ri1 ri2 = eqTypeRepBool lrep rrep && li1 == ri1 && li2 == ri2- DAndBitsTerm li1 li2 == DAndBitsTerm ri1 ri2 = li1 == ri1 && li2 == ri2- DOrBitsTerm li1 li2 == DOrBitsTerm ri1 ri2 = li1 == ri1 && li2 == ri2- DXorBitsTerm li1 li2 == DXorBitsTerm ri1 ri2 = li1 == ri1 && li2 == ri2- DComplementBitsTerm li == DComplementBitsTerm ri = li == ri- DShiftLeftTerm li ln == DShiftLeftTerm ri rn = li == ri && ln == rn- DShiftRightTerm li ln == DShiftRightTerm ri rn = li == ri && ln == rn- DRotateLeftTerm li ln == DRotateLeftTerm ri rn = li == ri && ln == rn- DRotateRightTerm li ln == DRotateRightTerm ri rn = li == ri && ln == rn- DToSignedTerm li == DToSignedTerm ri = eqTypedId li ri- DToUnsignedTerm li == DToUnsignedTerm ri = eqTypedId li ri- DBVConcatTerm lrep1 lrep2 li1 li2 == DBVConcatTerm rrep1 rrep2 ri1 ri2 =- eqTypeRepBool lrep1 rrep1 && eqTypeRepBool lrep2 rrep2 && li1 == ri1 && li2 == ri2- DBVSelectTerm lix li == DBVSelectTerm rix ri =- eqTypeRepBool lix rix && eqTypedId li ri- DBVExtendTerm lIsSigned ln li == DBVExtendTerm rIsSigned rn ri =- lIsSigned == rIsSigned- && eqTypeRepBool ln rn- && eqTypedId li ri- DApplyTerm lf li == DApplyTerm rf ri = eqTypedId lf rf && eqTypedId li ri- 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- DFPTraitTerm lt li == DFPTraitTerm rt ri = lt == rt && li == ri- DFdivTerm li1 li2 == DFdivTerm ri1 ri2 = li1 == ri1 && li2 == ri2- DRecipTerm li == DRecipTerm ri = li == ri- DSqrtTerm li == DSqrtTerm ri = li == ri- DFPUnaryTerm lop li == DFPUnaryTerm rop ri = lop == rop && li == ri- DFPBinaryTerm lop li1 li2 == DFPBinaryTerm rop ri1 ri2 = lop == rop && li1 == ri1 && li2 == ri2- DFPRoundingUnaryTerm lop lmode li == DFPRoundingUnaryTerm rop rmode ri =- lop == rop && lmode == rmode && li == ri- DFPRoundingBinaryTerm lop lmode li1 li2 == DFPRoundingBinaryTerm rop rmode ri1 ri2 =- lop == rop && lmode == rmode && li1 == ri1 && li2 == ri2- DFPFMATerm lmode li1 li2 li3 == DFPFMATerm rmode ri1 ri2 ri3 =- lmode == rmode && li1 == ri1 && li2 == ri2 && li3 == ri3- _ == _ = False--instance (SupportedPrim t) => Hashable (Description (Term t)) where- hashWithSalt s (DConTerm c) = s `hashWithSalt` (0 :: Int) `hashWithSalt` c- hashWithSalt s (DSymTerm name) = s `hashWithSalt` (1 :: Int) `hashWithSalt` name- hashWithSalt s (DUnaryTerm tag id1) = s `hashWithSalt` (2 :: Int) `hashWithSalt` tag `hashWithSalt` id1- hashWithSalt s (DBinaryTerm tag id1 id2) =- s `hashWithSalt` (3 :: Int) `hashWithSalt` tag `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DTernaryTerm tag id1 id2 id3) =- s `hashWithSalt` (4 :: Int) `hashWithSalt` tag `hashWithSalt` id1 `hashWithSalt` id2 `hashWithSalt` id3- hashWithSalt s (DNotTerm id1) = s `hashWithSalt` (5 :: Int) `hashWithSalt` id1- hashWithSalt s (DOrTerm id1 id2) = s `hashWithSalt` (6 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DAndTerm id1 id2) = s `hashWithSalt` (7 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DEqTerm rep id1 id2) =- s- `hashWithSalt` (8 :: Int)- `hashWithSalt` rep- `hashWithSalt` id1- `hashWithSalt` id2- hashWithSalt s (DITETerm idc id1 id2) =- s- `hashWithSalt` (9 :: Int)- `hashWithSalt` idc- `hashWithSalt` id1- `hashWithSalt` id2- hashWithSalt s (DAddNumTerm id1 id2) = s `hashWithSalt` (10 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DNegNumTerm id1) = s `hashWithSalt` (11 :: Int) `hashWithSalt` id1- hashWithSalt s (DMulNumTerm id1 id2) = s `hashWithSalt` (12 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DAbsNumTerm id1) = s `hashWithSalt` (13 :: Int) `hashWithSalt` id1- hashWithSalt s (DSignumNumTerm id1) = s `hashWithSalt` (14 :: Int) `hashWithSalt` id1- hashWithSalt s (DLtOrdTerm rep id1 id2) =- s `hashWithSalt` (15 :: Int) `hashWithSalt` rep `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DLeOrdTerm rep id1 id2) =- s `hashWithSalt` (16 :: Int) `hashWithSalt` rep `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DAndBitsTerm id1 id2) = s `hashWithSalt` (17 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DOrBitsTerm id1 id2) = s `hashWithSalt` (18 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DXorBitsTerm id1 id2) = s `hashWithSalt` (19 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DComplementBitsTerm id1) = s `hashWithSalt` (20 :: Int) `hashWithSalt` id1- hashWithSalt s (DShiftLeftTerm id1 idn) = s `hashWithSalt` (38 :: Int) `hashWithSalt` id1 `hashWithSalt` idn- hashWithSalt s (DShiftRightTerm id1 idn) = s `hashWithSalt` (39 :: Int) `hashWithSalt` id1 `hashWithSalt` idn- hashWithSalt s (DRotateLeftTerm id1 idn) = s `hashWithSalt` (40 :: Int) `hashWithSalt` id1 `hashWithSalt` idn- hashWithSalt s (DRotateRightTerm id1 idn) = s `hashWithSalt` (41 :: Int) `hashWithSalt` id1 `hashWithSalt` idn- hashWithSalt s (DToSignedTerm id) = s `hashWithSalt` (23 :: Int) `hashWithSalt` id- hashWithSalt s (DToUnsignedTerm id) = s `hashWithSalt` (24 :: Int) `hashWithSalt` id- hashWithSalt s (DBVConcatTerm rep1 rep2 id1 id2) =- s `hashWithSalt` (25 :: Int) `hashWithSalt` rep1 `hashWithSalt` rep2 `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DBVSelectTerm ix id1) = s `hashWithSalt` (26 :: Int) `hashWithSalt` ix `hashWithSalt` id1- hashWithSalt s (DBVExtendTerm signed n id1) =- s- `hashWithSalt` (27 :: Int)- `hashWithSalt` signed- `hashWithSalt` n- `hashWithSalt` id1- hashWithSalt s (DDivIntegralTerm id1 id2) = s `hashWithSalt` (30 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DModIntegralTerm id1 id2) = s `hashWithSalt` (31 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DQuotIntegralTerm id1 id2) = s `hashWithSalt` (32 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DRemIntegralTerm id1 id2) = s `hashWithSalt` (33 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DApplyTerm id1 id2) = s `hashWithSalt` (38 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DFPTraitTerm trait id1) = s `hashWithSalt` (39 :: Int) `hashWithSalt` trait `hashWithSalt` id1- hashWithSalt s (DFdivTerm id1 id2) = s `hashWithSalt` (40 :: Int) `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DRecipTerm id1) = s `hashWithSalt` (41 :: Int) `hashWithSalt` id1- hashWithSalt s (DSqrtTerm id1) = s `hashWithSalt` (42 :: Int) `hashWithSalt` id1- hashWithSalt s (DFPUnaryTerm op id1) = s `hashWithSalt` (43 :: Int) `hashWithSalt` op `hashWithSalt` id1- hashWithSalt s (DFPBinaryTerm op id1 id2) = s `hashWithSalt` (44 :: Int) `hashWithSalt` op `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DFPRoundingUnaryTerm op mode id1) =- s `hashWithSalt` (45 :: Int) `hashWithSalt` op `hashWithSalt` mode `hashWithSalt` id1- hashWithSalt s (DFPRoundingBinaryTerm op mode id1 id2) =- s `hashWithSalt` (46 :: Int) `hashWithSalt` op `hashWithSalt` mode `hashWithSalt` id1 `hashWithSalt` id2- hashWithSalt s (DFPFMATerm mode id1 id2 id3) =- s `hashWithSalt` (47 :: Int) `hashWithSalt` mode `hashWithSalt` id1 `hashWithSalt` id2 `hashWithSalt` id3--internTerm :: forall t. (SupportedPrim t) => Uninterned (Term t) -> Term t-internTerm !bt = unsafeDupablePerformIO $ atomicModifyIORef' slot go- where- slot = getCache cache ! r- !dt = describe bt- !hdt = hash dt- !wid = cacheWidth dt- r = hdt `mod` wid- go (CacheState i m) = case M.lookup dt m of- Nothing -> let t = identify (wid * i + r) bt in (CacheState (i + 1) (M.insert dt t m), t)- Just t -> (CacheState i m, t)--constructUnary ::- forall tag arg t.- (SupportedPrim t, UnaryOp tag arg t, Typeable tag, Typeable t, Show tag) =>- tag ->- Term arg ->- Term t-constructUnary tag tm = let x = internTerm $ UUnaryTerm tag tm in x-{-# INLINE constructUnary #-}--constructBinary ::- forall tag arg1 arg2 t.- (SupportedPrim t, BinaryOp tag arg1 arg2 t, Typeable tag, Typeable t, Show tag) =>- tag ->- Term arg1 ->- Term arg2 ->- Term t-constructBinary tag tm1 tm2 = internTerm $ UBinaryTerm tag tm1 tm2-{-# INLINE constructBinary #-}--constructTernary ::- forall tag arg1 arg2 arg3 t.- (SupportedPrim t, TernaryOp tag arg1 arg2 arg3 t, Typeable tag, Typeable t, Show tag) =>- tag ->- Term arg1 ->- Term arg2 ->- Term arg3 ->- Term t-constructTernary tag tm1 tm2 tm3 = internTerm $ UTernaryTerm tag tm1 tm2 tm3-{-# INLINE constructTernary #-}--conTerm :: (SupportedPrim t, Typeable t, Hashable t, Eq t, Show t) => t -> Term t-conTerm t = internTerm $ UConTerm t-{-# INLINE conTerm #-}--symTerm :: forall t. (SupportedPrim t, Typeable t) => Symbol -> Term t-symTerm t = internTerm $ USymTerm $ TypedSymbol t-{-# INLINE symTerm #-}--ssymTerm :: (SupportedPrim t, Typeable t) => Identifier -> Term t-ssymTerm = symTerm . SimpleSymbol-{-# INLINE ssymTerm #-}--isymTerm :: (SupportedPrim t, Typeable t) => Identifier -> Int -> Term t-isymTerm str idx = symTerm $ IndexedSymbol str idx-{-# INLINE isymTerm #-}--notTerm :: Term Bool -> Term Bool-notTerm = internTerm . UNotTerm-{-# INLINE notTerm #-}--orTerm :: Term Bool -> Term Bool -> Term Bool-orTerm l r = internTerm $ UOrTerm l r-{-# INLINE orTerm #-}--andTerm :: Term Bool -> Term Bool -> Term Bool-andTerm l r = internTerm $ UAndTerm l r-{-# INLINE andTerm #-}--eqTerm :: (SupportedPrim a) => Term a -> Term a -> Term Bool-eqTerm l r = internTerm $ UEqTerm l r-{-# INLINE eqTerm #-}--iteTerm :: (SupportedPrim a) => Term Bool -> Term a -> Term a -> Term a-iteTerm c l r = internTerm $ UITETerm c l r-{-# INLINE iteTerm #-}--addNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a-addNumTerm l r = internTerm $ UAddNumTerm l r-{-# INLINE addNumTerm #-}--negNumTerm :: (PEvalNumTerm a) => Term a -> Term a-negNumTerm = internTerm . UNegNumTerm-{-# INLINE negNumTerm #-}--mulNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a-mulNumTerm l r = internTerm $ UMulNumTerm l r-{-# INLINE mulNumTerm #-}--absNumTerm :: (PEvalNumTerm a) => Term a -> Term a-absNumTerm = internTerm . UAbsNumTerm-{-# INLINE absNumTerm #-}--signumNumTerm :: (PEvalNumTerm a) => Term a -> Term a-signumNumTerm = internTerm . USignumNumTerm-{-# INLINE signumNumTerm #-}--ltOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool-ltOrdTerm l r = internTerm $ ULtOrdTerm l r-{-# INLINE ltOrdTerm #-}--leOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool-leOrdTerm l r = internTerm $ ULeOrdTerm l r-{-# INLINE leOrdTerm #-}--andBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a-andBitsTerm l r = internTerm $ UAndBitsTerm l r-{-# INLINE andBitsTerm #-}--orBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a-orBitsTerm l r = internTerm $ UOrBitsTerm l r-{-# INLINE orBitsTerm #-}--xorBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a-xorBitsTerm l r = internTerm $ UXorBitsTerm l r-{-# INLINE xorBitsTerm #-}--complementBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a-complementBitsTerm = internTerm . UComplementBitsTerm-{-# INLINE complementBitsTerm #-}--shiftLeftTerm :: (PEvalShiftTerm a) => Term a -> Term a -> Term a-shiftLeftTerm t n = internTerm $ UShiftLeftTerm t n-{-# INLINE shiftLeftTerm #-}--shiftRightTerm :: (PEvalShiftTerm a) => Term a -> Term a -> Term a-shiftRightTerm t n = internTerm $ UShiftRightTerm t n-{-# INLINE shiftRightTerm #-}--rotateLeftTerm :: (PEvalRotateTerm a) => Term a -> Term a -> Term a-rotateLeftTerm t n = internTerm $ URotateLeftTerm t n-{-# INLINE rotateLeftTerm #-}--rotateRightTerm :: (PEvalRotateTerm a) => Term a -> Term a -> Term a-rotateRightTerm t n = internTerm $ URotateRightTerm t n-{-# INLINE rotateRightTerm #-}--toSignedTerm ::- (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) =>- Term (u n) ->- Term (s n)-toSignedTerm = internTerm . UToSignedTerm--toUnsignedTerm ::- (PEvalBVSignConversionTerm u s, KnownNat n, 1 <= n) =>- Term (s n) ->- Term (u n)-toUnsignedTerm = internTerm . UToUnsignedTerm--bvconcatTerm ::- ( PEvalBVTerm bv,- KnownNat l,- KnownNat r,- KnownNat (l + r),- 1 <= l,- 1 <= r,- 1 <= l + r- ) =>- Term (bv l) ->- Term (bv r) ->- Term (bv (l + r))-bvconcatTerm l r = internTerm $ UBVConcatTerm l r-{-# INLINE bvconcatTerm #-}--bvselectTerm ::- forall bv n ix w p q.- ( PEvalBVTerm bv,- KnownNat n,- KnownNat ix,- KnownNat w,- 1 <= n,- 1 <= w,- ix + w <= n- ) =>- p ix ->- q w ->- Term (bv n) ->- Term (bv w)-bvselectTerm _ _ v = internTerm $ UBVSelectTerm (typeRep @ix) (typeRep @w) v-{-# INLINE bvselectTerm #-}--bvextendTerm ::- forall bv l r proxy.- (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>- Bool ->- proxy r ->- Term (bv l) ->- Term (bv r)-bvextendTerm signed _ v = internTerm $ UBVExtendTerm signed (typeRep @r) v-{-# INLINE bvextendTerm #-}--bvsignExtendTerm ::- forall bv l r proxy.- (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>- proxy r ->- Term (bv l) ->- Term (bv r)-bvsignExtendTerm _ v = internTerm $ UBVExtendTerm True (typeRep @r) v-{-# INLINE bvsignExtendTerm #-}--bvzeroExtendTerm ::- forall bv l r proxy.- (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>- proxy r ->- Term (bv l) ->- Term (bv r)-bvzeroExtendTerm _ v = internTerm $ UBVExtendTerm False (typeRep @r) v-{-# INLINE bvzeroExtendTerm #-}--applyTerm ::- (SupportedPrim a, SupportedPrim b, SupportedPrim f, PEvalApplyTerm f a b) =>- Term f ->- Term a ->- Term b-applyTerm f a = internTerm $ UApplyTerm f a-{-# INLINE applyTerm #-}--divIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a-divIntegralTerm l r = internTerm $ UDivIntegralTerm l r-{-# INLINE divIntegralTerm #-}--modIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a-modIntegralTerm l r = internTerm $ UModIntegralTerm l r-{-# INLINE modIntegralTerm #-}--quotIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a-quotIntegralTerm l r = internTerm $ UQuotIntegralTerm l r-{-# INLINE quotIntegralTerm #-}--remIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a-remIntegralTerm l r = internTerm $ URemIntegralTerm l r-{-# INLINE remIntegralTerm #-}--fpTraitTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPTrait ->- Term (FP eb sb) ->- Term Bool-fpTraitTerm trait v = internTerm $ UFPTraitTerm trait v--fdivTerm :: (PEvalFractionalTerm a) => Term a -> Term a -> Term a-fdivTerm l r = internTerm $ UFdivTerm l r-{-# INLINE fdivTerm #-}--recipTerm :: (PEvalFractionalTerm a) => Term a -> Term a-recipTerm = internTerm . URecipTerm-{-# INLINE recipTerm #-}--sqrtTerm :: (PEvalFloatingTerm a) => Term a -> Term a-sqrtTerm = internTerm . USqrtTerm-{-# INLINE sqrtTerm #-}--fpUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPUnaryOp ->- Term (FP eb sb) ->- Term (FP eb sb)-fpUnaryTerm op v = internTerm $ UFPUnaryTerm op v--fpBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb)) =>- FPBinaryOp ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-fpBinaryTerm op l r = internTerm $ UFPBinaryTerm op l r--fpRoundingUnaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>- FPRoundingUnaryOp ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb)-fpRoundingUnaryTerm op mode v = internTerm $ UFPRoundingUnaryTerm op mode v--fpRoundingBinaryTerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>- FPRoundingBinaryOp ->- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-fpRoundingBinaryTerm op mode l r = internTerm $ UFPRoundingBinaryTerm op mode l r--fpFMATerm ::- (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>- Term FPRoundingMode ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb) ->- Term (FP eb sb)-fpFMATerm mode l r s = internTerm $ UFPFMATerm mode l r s---- Support for boolean type-defaultValueForBool :: Bool-defaultValueForBool = False--defaultValueForBoolDyn :: ModelValue-defaultValueForBoolDyn = toModelValue defaultValueForBool--trueTerm :: Term Bool-trueTerm = conTerm True-{-# INLINE trueTerm #-}--falseTerm :: Term Bool-falseTerm = conTerm False-{-# INLINE falseTerm #-}--boolConTermView :: forall a. Term a -> Maybe Bool-boolConTermView (ConTerm _ b) = cast b-boolConTermView _ = Nothing-{-# INLINE boolConTermView #-}--pattern BoolConTerm :: Bool -> Term a-pattern BoolConTerm b <- (boolConTermView -> Just b)--pattern TrueTerm :: Term a-pattern TrueTerm <- BoolConTerm True--pattern FalseTerm :: Term a-pattern FalseTerm <- BoolConTerm False--boolTermView :: forall a. Term a -> Maybe (Term Bool)-boolTermView t = introSupportedPrimConstraint t $ cast t-{-# INLINE boolTermView #-}--pattern BoolTerm :: Term Bool -> Term a-pattern BoolTerm b <- (boolTermView -> Just b)---- Not-pevalNotTerm :: Term Bool -> Term Bool-pevalNotTerm (NotTerm _ tm) = tm-pevalNotTerm (ConTerm _ a) = if a then falseTerm else trueTerm-pevalNotTerm (OrTerm _ (NotTerm _ n1) n2) = pevalAndTerm n1 (pevalNotTerm n2)-pevalNotTerm (OrTerm _ n1 (NotTerm _ n2)) = pevalAndTerm (pevalNotTerm n1) n2-pevalNotTerm (AndTerm _ (NotTerm _ n1) n2) = pevalOrTerm n1 (pevalNotTerm n2)-pevalNotTerm (AndTerm _ n1 (NotTerm _ n2)) = pevalOrTerm (pevalNotTerm n1) n2-pevalNotTerm tm = notTerm tm-{-# INLINEABLE pevalNotTerm #-}--orEqFirst :: Term Bool -> Term Bool -> Bool-orEqFirst _ (ConTerm _ False) = True-orEqFirst- (NotTerm _ (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b)))- (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b)))- | e1 == e2 && ec1 /= ec2 = True-orEqFirst x y- | x == y = True- | otherwise = False-{-# INLINE orEqFirst #-}--orEqTrue :: Term Bool -> Term Bool -> Bool-orEqTrue (ConTerm _ True) _ = True-orEqTrue _ (ConTerm _ True) = True--- orEqTrue (NotTerm _ e1) (NotTerm _ e2) = andEqFalse e1 e2-orEqTrue- (NotTerm _ (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b)))- (NotTerm _ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b))))- | e1 == e2 && ec1 /= ec2 = True-orEqTrue (NotTerm _ l) r | l == r = True-orEqTrue l (NotTerm _ r) | l == r = True-orEqTrue _ _ = False-{-# INLINE orEqTrue #-}--andEqFirst :: Term Bool -> Term Bool -> Bool-andEqFirst _ (ConTerm _ True) = True--- andEqFirst x (NotTerm _ y) = andEqFalse x y-andEqFirst- (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b))- (NotTerm _ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b))))- | e1 == e2 && ec1 /= ec2 = True-andEqFirst x y- | x == y = True- | otherwise = False-{-# INLINE andEqFirst #-}--andEqFalse :: Term Bool -> Term Bool -> Bool-andEqFalse (ConTerm _ False) _ = True-andEqFalse _ (ConTerm _ False) = True--- andEqFalse (NotTerm _ e1) (NotTerm _ e2) = orEqTrue e1 e2-andEqFalse- (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b))- (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b)))- | e1 == e2 && ec1 /= ec2 = True-andEqFalse (NotTerm _ x) y | x == y = True-andEqFalse x (NotTerm _ y) | x == y = True-andEqFalse _ _ = False-{-# INLINE andEqFalse #-}---- Or-pevalOrTerm :: Term Bool -> Term Bool -> Term Bool-pevalOrTerm l r- | orEqTrue l r = trueTerm- | orEqFirst l r = l- | orEqFirst r l = r-pevalOrTerm l r@(OrTerm _ r1 r2)- | orEqTrue l r1 = trueTerm- | orEqTrue l r2 = trueTerm- | orEqFirst r1 l = r- | orEqFirst r2 l = r- | orEqFirst l r1 = pevalOrTerm l r2- | orEqFirst l r2 = pevalOrTerm l r1-pevalOrTerm l@(OrTerm _ l1 l2) r- | orEqTrue l1 r = trueTerm- | orEqTrue l2 r = trueTerm- | orEqFirst l1 r = l- | orEqFirst l2 r = l- | orEqFirst r l1 = pevalOrTerm l2 r- | orEqFirst r l2 = pevalOrTerm l1 r-pevalOrTerm l (AndTerm _ r1 r2)- | orEqFirst l r1 = l- | orEqFirst l r2 = l- | orEqTrue l r1 = pevalOrTerm l r2- | orEqTrue l r2 = pevalOrTerm l r1-pevalOrTerm (AndTerm _ l1 l2) r- | orEqFirst r l1 = r- | orEqFirst r l2 = r- | orEqTrue l1 r = pevalOrTerm l2 r- | orEqTrue l2 r = pevalOrTerm l1 r-pevalOrTerm- (AndTerm _ nl1@(NotTerm _ l1) l2)- (EqTerm _ (Dyn (e1 :: Term Bool)) (Dyn (e2 :: Term Bool)))- | l1 == e1 && l2 == e2 = pevalOrTerm nl1 l2-pevalOrTerm (NotTerm _ nl) (NotTerm _ nr) = pevalNotTerm $ pevalAndTerm nl nr-pevalOrTerm l r = orTerm l r-{-# INLINEABLE pevalOrTerm #-}--pevalAndTerm :: Term Bool -> Term Bool -> Term Bool-pevalAndTerm l r- | andEqFalse l r = falseTerm- | andEqFirst l r = l- | andEqFirst r l = r-pevalAndTerm l r@(AndTerm _ r1 r2)- | andEqFalse l r1 = falseTerm- | andEqFalse l r2 = falseTerm- | andEqFirst r1 l = r- | andEqFirst r2 l = r- | andEqFirst l r1 = pevalAndTerm l r2- | andEqFirst l r2 = pevalAndTerm l r1-pevalAndTerm l@(AndTerm _ l1 l2) r- | andEqFalse l1 r = falseTerm- | andEqFalse l2 r = falseTerm- | andEqFirst l1 r = l- | andEqFirst l2 r = l- | andEqFirst r l1 = pevalAndTerm l2 r- | andEqFirst r l2 = pevalAndTerm l1 r-pevalAndTerm l (OrTerm _ r1 r2)- | andEqFirst l r1 = l- | andEqFirst l r2 = l- | andEqFalse l r1 = pevalAndTerm l r2- | andEqFalse l r2 = pevalAndTerm l r1-pevalAndTerm (OrTerm _ l1 l2) r- | andEqFirst r l1 = r- | andEqFirst r l2 = r- | andEqFalse l1 r = pevalAndTerm l2 r- | andEqFalse l2 r = pevalAndTerm l1 r-pevalAndTerm- (OrTerm _ l1 nl2@(NotTerm _ l2))- (NotTerm _ (EqTerm _ (Dyn (e1 :: Term Bool)) (Dyn (e2 :: Term Bool))))- | l1 == e1 && l2 == e2 = pevalAndTerm l1 nl2-pevalAndTerm (NotTerm _ nl) (NotTerm _ nr) = pevalNotTerm $ pevalOrTerm nl nr-pevalAndTerm l r = andTerm l r-{-# INLINEABLE pevalAndTerm #-}--pevalImplyTerm :: Term Bool -> Term Bool -> Term Bool-pevalImplyTerm l = pevalOrTerm (pevalNotTerm l)--pevalXorTerm :: Term Bool -> Term Bool -> Term Bool-pevalXorTerm l r = pevalOrTerm (pevalAndTerm (pevalNotTerm l) r) (pevalAndTerm l (pevalNotTerm r))--pevalImpliesTerm :: Term Bool -> Term Bool -> Bool-pevalImpliesTerm (ConTerm _ False) _ = True-pevalImpliesTerm _ (ConTerm _ True) = True-pevalImpliesTerm- (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b))- (NotTerm _ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b))))- | e1 == e2 && ec1 /= ec2 = True-pevalImpliesTerm a b- | a == b = True- | otherwise = False-{-# INLINE pevalImpliesTerm #-}--pevalITEBoolLeftNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolLeftNot cond nIfTrue ifFalse- -- need test- | cond == nIfTrue = Just $ pevalAndTerm (pevalNotTerm cond) ifFalse- | otherwise = case nIfTrue of- AndTerm _ nt1 nt2 -> ra- where- ra- | pevalImpliesTerm cond nt1 =- Just $ pevalITETerm cond (pevalNotTerm nt2) ifFalse- | pevalImpliesTerm cond nt2 =- Just $ pevalITETerm cond (pevalNotTerm nt1) ifFalse- | pevalImpliesTerm cond (pevalNotTerm nt1)- || pevalImpliesTerm cond (pevalNotTerm nt2) =- Just $ pevalOrTerm cond ifFalse- | otherwise = Nothing- OrTerm _ nt1 nt2 -> ra- where- ra- | pevalImpliesTerm cond nt1 || pevalImpliesTerm cond nt2 =- Just $ pevalAndTerm (pevalNotTerm cond) ifFalse- | pevalImpliesTerm cond (pevalNotTerm nt1) =- Just $ pevalITETerm cond (pevalNotTerm nt2) ifFalse- | pevalImpliesTerm cond (pevalNotTerm nt2) =- Just $ pevalITETerm cond (pevalNotTerm nt1) ifFalse- | otherwise = Nothing- _ -> Nothing--pevalITEBoolBothNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolBothNot cond nIfTrue nIfFalse =- Just $ pevalNotTerm $ pevalITETerm cond nIfTrue nIfFalse--pevalITEBoolRightNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolRightNot cond ifTrue nIfFalse- -- need test- | cond == nIfFalse = Just $ pevalOrTerm (pevalNotTerm cond) ifTrue- | otherwise = Nothing -- need work--pevalInferImplies :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalInferImplies cond (NotTerm _ nt1) trueRes falseRes- | cond == nt1 = Just falseRes- | otherwise = case (cond, nt1) of- ( EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b),- EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b))- )- | e1 == e2 && ec1 /= ec2 -> Just trueRes- _ -> Nothing-pevalInferImplies- (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b))- (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b)))- _- falseRes- | e1 == e2 && ec1 /= ec2 = Just falseRes-pevalInferImplies _ _ _ _ = Nothing--pevalITEBoolLeftAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolLeftAnd cond t1 t2 ifFalse- | t1 == ifFalse = Just $ pevalAndTerm t1 $ pevalImplyTerm cond t2- | t2 == ifFalse = Just $ pevalAndTerm t2 $ pevalImplyTerm cond t1- | cond == t1 = Just $ pevalITETerm cond t2 ifFalse- | cond == t2 = Just $ pevalITETerm cond t1 ifFalse- | otherwise =- msum- [ pevalInferImplies cond t1 (pevalITETerm cond t2 ifFalse) (pevalAndTerm (pevalNotTerm cond) ifFalse),- pevalInferImplies cond t2 (pevalITETerm cond t1 ifFalse) (pevalAndTerm (pevalNotTerm cond) ifFalse)- ]--pevalITEBoolBothAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolBothAnd cond t1 t2 f1 f2- | t1 == f1 = Just $ pevalAndTerm t1 $ pevalITETerm cond t2 f2- | t1 == f2 = Just $ pevalAndTerm t1 $ pevalITETerm cond t2 f1- | t2 == f1 = Just $ pevalAndTerm t2 $ pevalITETerm cond t1 f2- | t2 == f2 = Just $ pevalAndTerm t2 $ pevalITETerm cond t1 f1- | otherwise = Nothing--pevalITEBoolRightAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolRightAnd cond ifTrue f1 f2- | f1 == ifTrue = Just $ pevalAndTerm f1 $ pevalOrTerm cond f2- | f2 == ifTrue = Just $ pevalAndTerm f2 $ pevalOrTerm cond f1- | otherwise = Nothing--pevalITEBoolLeftOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolLeftOr cond t1 t2 ifFalse- | t1 == ifFalse = Just $ pevalOrTerm t1 $ pevalAndTerm cond t2- | t2 == ifFalse = Just $ pevalOrTerm t2 $ pevalAndTerm cond t1- | cond == t1 = Just $ pevalOrTerm cond ifFalse- | cond == t2 = Just $ pevalOrTerm cond ifFalse- | otherwise =- msum- [ pevalInferImplies cond t1 (pevalOrTerm cond ifFalse) (pevalITETerm cond t2 ifFalse),- pevalInferImplies cond t2 (pevalOrTerm cond ifFalse) (pevalITETerm cond t1 ifFalse)- ]--pevalITEBoolBothOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolBothOr cond t1 t2 f1 f2- | t1 == f1 = Just $ pevalOrTerm t1 $ pevalITETerm cond t2 f2- | t1 == f2 = Just $ pevalOrTerm t1 $ pevalITETerm cond t2 f1- | t2 == f1 = Just $ pevalOrTerm t2 $ pevalITETerm cond t1 f2- | t2 == f2 = Just $ pevalOrTerm t2 $ pevalITETerm cond t1 f1- | otherwise = Nothing--pevalITEBoolRightOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolRightOr cond ifTrue f1 f2- | f1 == ifTrue = Just $ pevalOrTerm f1 $ pevalAndTerm (pevalNotTerm cond) f2- | f2 == ifTrue = Just $ pevalOrTerm f2 $ pevalAndTerm (pevalNotTerm cond) f1- | otherwise = Nothing--pevalITEBoolLeft :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolLeft cond (AndTerm _ t1 t2) ifFalse =- msum- [ pevalITEBoolLeftAnd cond t1 t2 ifFalse,- case ifFalse of- AndTerm _ f1 f2 -> pevalITEBoolBothAnd cond t1 t2 f1 f2- _ -> Nothing- ]-pevalITEBoolLeft cond (OrTerm _ t1 t2) ifFalse =- msum- [ pevalITEBoolLeftOr cond t1 t2 ifFalse,- case ifFalse of- OrTerm _ f1 f2 -> pevalITEBoolBothOr cond t1 t2 f1 f2- _ -> Nothing- ]-pevalITEBoolLeft cond (NotTerm _ nIfTrue) ifFalse =- msum- [ pevalITEBoolLeftNot cond nIfTrue ifFalse,- case ifFalse of- NotTerm _ nIfFalse ->- pevalITEBoolBothNot cond nIfTrue nIfFalse- _ -> Nothing- ]-pevalITEBoolLeft _ _ _ = Nothing--pevalITEBoolNoLeft :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolNoLeft cond ifTrue (AndTerm _ f1 f2) = pevalITEBoolRightAnd cond ifTrue f1 f2-pevalITEBoolNoLeft cond ifTrue (OrTerm _ f1 f2) = pevalITEBoolRightOr cond ifTrue f1 f2-pevalITEBoolNoLeft cond ifTrue (NotTerm _ nIfFalse) = pevalITEBoolRightNot cond ifTrue nIfFalse-pevalITEBoolNoLeft _ _ _ = Nothing--pevalITEBasic :: (SupportedPrim a) => Term Bool -> Term a -> Term a -> Maybe (Term a)-pevalITEBasic (ConTerm _ True) ifTrue _ = Just ifTrue-pevalITEBasic (ConTerm _ False) _ ifFalse = Just ifFalse-pevalITEBasic (NotTerm _ ncond) ifTrue ifFalse = Just $ pevalITETerm ncond ifFalse ifTrue-pevalITEBasic _ ifTrue ifFalse | ifTrue == ifFalse = Just ifTrue-pevalITEBasic (ITETerm _ cc ct cf) (ITETerm _ tc tt tf) (ITETerm _ fc ft ff) -- later- | cc == tc && cc == fc = Just $ pevalITETerm cc (pevalITETerm ct tt ft) (pevalITETerm cf tf ff)-pevalITEBasic cond (ITETerm _ tc tt tf) ifFalse -- later- | cond == tc = Just $ pevalITETerm cond tt ifFalse- | tt == ifFalse = Just $ pevalITETerm (pevalOrTerm (pevalNotTerm cond) tc) tt tf- | tf == ifFalse = Just $ pevalITETerm (pevalAndTerm cond tc) tt tf-pevalITEBasic cond ifTrue (ITETerm _ fc ft ff) -- later- | ifTrue == ft = Just $ pevalITETerm (pevalOrTerm cond fc) ifTrue ff- | ifTrue == ff = Just $ pevalITETerm (pevalOrTerm cond (pevalNotTerm fc)) ifTrue ft- | pevalImpliesTerm fc cond = Just $ pevalITETerm cond ifTrue ff-pevalITEBasic _ _ _ = Nothing--pevalITEBoolBasic :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBoolBasic cond ifTrue ifFalse- | cond == ifTrue = Just $ pevalOrTerm cond ifFalse- | cond == ifFalse = Just $ pevalAndTerm cond ifTrue-pevalITEBoolBasic cond (ConTerm _ v) ifFalse- | v = Just $ pevalOrTerm cond ifFalse- | otherwise = Just $ pevalAndTerm (pevalNotTerm cond) ifFalse-pevalITEBoolBasic cond ifTrue (ConTerm _ v)- | v = Just $ pevalOrTerm (pevalNotTerm cond) ifTrue- | otherwise = Just $ pevalAndTerm cond ifTrue-pevalITEBoolBasic _ _ _ = Nothing--pevalITEBool :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)-pevalITEBool cond ifTrue ifFalse =- msum- [ pevalITEBasic cond ifTrue ifFalse,- pevalITEBoolBasic cond ifTrue ifFalse,- pevalITEBoolLeft cond ifTrue ifFalse,- pevalITEBoolNoLeft cond ifTrue ifFalse- ]--pevalITEBasicTerm :: (SupportedPrim a) => Term Bool -> Term a -> Term a -> Term a-pevalITEBasicTerm cond ifTrue ifFalse =- fromMaybe (iteTerm cond ifTrue ifFalse) $- pevalITEBasic cond ifTrue ifFalse--pevalDefaultEqTerm :: (SupportedPrim a) => Term a -> Term a -> Term Bool-pevalDefaultEqTerm l@ConTerm {} r@ConTerm {} = conTerm $ l == r-pevalDefaultEqTerm l@ConTerm {} r = pevalDefaultEqTerm r l-pevalDefaultEqTerm l (BoolConTerm rv) =- if rv- then unsafeCoerce l- else pevalNotTerm (unsafeCoerce l)-pevalDefaultEqTerm (NotTerm _ lv) r- | lv == r = falseTerm-pevalDefaultEqTerm l (NotTerm _ rv)- | l == rv = falseTerm-pevalDefaultEqTerm (AddNumTerm _ (ConTerm _ c) v) (ConTerm _ c2) =- pevalDefaultEqTerm v (conTerm $ c2 - c)-pevalDefaultEqTerm l (ITETerm _ c t f)- | l == t = pevalOrTerm c (pevalDefaultEqTerm l f)- | l == f = pevalOrTerm (pevalNotTerm c) (pevalDefaultEqTerm l t)-pevalDefaultEqTerm (ITETerm _ c t f) r- | t == r = pevalOrTerm c (pevalDefaultEqTerm f r)- | f == r = pevalOrTerm (pevalNotTerm c) (pevalDefaultEqTerm t r)-pevalDefaultEqTerm l r- | l == r = trueTerm- | otherwise = eqTerm l r-{-# INLINEABLE pevalDefaultEqTerm #-}--instance SBVRep Bool where- type SBVType _ Bool = SBV.SBV Bool--instance SupportedPrimConstraint Bool--instance SupportedPrim Bool where- pformatCon True = "true"- pformatCon False = "false"- defaultValue = defaultValueForBool- defaultValueDynamic _ = defaultValueForBoolDyn- pevalITETerm cond ifTrue ifFalse =- fromMaybe (iteTerm cond ifTrue ifFalse) $- pevalITEBool cond ifTrue ifFalse- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm _ n = if n then SBV.sTrue else SBV.sFalse- symSBVName symbol _ = show symbol- symSBVTerm _ = sbvFresh- withPrim _ r = r- parseSMTModelResult _ ([], SBVD.CV SBVD.KBool (SBVD.CInteger n)) = n /= 0- parseSMTModelResult _ ([([], SBVD.CV SBVD.KBool (SBVD.CInteger n))], _) = n /= 0- parseSMTModelResult _ cv = parseSMTModelResultError (typeRep @Bool) cv--instance NonFuncSBVRep Bool where- type NonFuncSBVBaseType _ Bool = Bool--instance SupportedNonFuncPrim Bool where- conNonFuncSBVTerm = conSBVTerm- symNonFuncSBVTerm = symSBVTerm @Bool- withNonFuncPrim _ r = r+ PEvalBitCastTerm (..),+ PEvalBitCastOrTerm (..),+ PEvalBVTerm (..),+ PEvalFractionalTerm (..),+ PEvalFloatingTerm (..),+ PEvalFromIntegralTerm (..),+ PEvalIEEEFPConvertibleTerm (..),++ -- * Typed symbols+ SymbolKind (..),+ TypedSymbol (..),+ TypedConstantSymbol,+ TypedAnySymbol,+ SomeTypedSymbol (..),+ SomeTypedConstantSymbol,+ SomeTypedAnySymbol,+ IsSymbolKind (..),+ showUntyped,+ withSymbolSupported,+ someTypedSymbol,+ eqHeteroSymbol,+ castSomeTypedSymbol,+ withSymbolKind,++ -- * Terms+ FPTrait (..),+ FPUnaryOp (..),+ FPBinaryOp (..),+ FPRoundingUnaryOp (..),+ FPRoundingBinaryOp (..),+ FloatingUnaryOp (..),+ Term (..),+ identity,+ identityWithTypeRep,+ introSupportedPrimConstraint,+ pformatTerm,++ -- * Interning+ UTerm (..),+ prettyPrintTerm,+ forallTerm,+ existsTerm,+ constructUnary,+ constructBinary,+ constructTernary,+ conTerm,+ symTerm,+ ssymTerm,+ isymTerm,+ notTerm,+ orTerm,+ andTerm,+ eqTerm,+ distinctTerm,+ iteTerm,+ addNumTerm,+ negNumTerm,+ mulNumTerm,+ absNumTerm,+ signumNumTerm,+ ltOrdTerm,+ leOrdTerm,+ andBitsTerm,+ orBitsTerm,+ xorBitsTerm,+ complementBitsTerm,+ shiftLeftTerm,+ shiftRightTerm,+ rotateLeftTerm,+ rotateRightTerm,+ bitCastTerm,+ bitCastOrTerm,+ bvconcatTerm,+ bvselectTerm,+ bvextendTerm,+ bvsignExtendTerm,+ bvzeroExtendTerm,+ applyTerm,+ divIntegralTerm,+ modIntegralTerm,+ quotIntegralTerm,+ remIntegralTerm,+ fpTraitTerm,+ fdivTerm,+ recipTerm,+ floatingUnaryTerm,+ powerTerm,+ fpUnaryTerm,+ fpBinaryTerm,+ fpRoundingUnaryTerm,+ fpRoundingBinaryTerm,+ fpFMATerm,+ fromIntegralTerm,+ fromFPOrTerm,+ toFPTerm,++ -- * Support for boolean type+ trueTerm,+ falseTerm,+ pattern BoolConTerm,+ pattern TrueTerm,+ pattern FalseTerm,+ pattern BoolTerm,+ pevalNotTerm,+ pevalOrTerm,+ pevalAndTerm,+ pevalImplyTerm,+ pevalXorTerm,+ pevalITEBasic,+ pevalITEBasicTerm,+ pevalDefaultEqTerm,+ NonFuncPrimConstraint,+ NonFuncSBVRep (..),+ SupportedNonFuncPrim (..),+ SBVRep (..),+ SBVFreshMonad (..),+ translateTypeError,+ parseSMTModelResultError,+ partitionCVArg,+ parseScalarSMTModelResult,+ )+where++#if MIN_VERSION_prettyprinter(1,7,0)+import Prettyprinter+ ( column,+ pageWidth,+ Doc,+ PageWidth(Unbounded, AvailablePerLine),+ Pretty(pretty),+ )+#else+import Data.Text.Prettyprint.Doc+ ( column,+ pageWidth,+ Doc,+ PageWidth(Unbounded, AvailablePerLine),+ Pretty(pretty),+ )+#endif++#if !MIN_VERSION_sbv(10, 0, 0)+#define SMTDefinable Uninterpreted+#endif++import Control.DeepSeq (NFData (rnf))+import Control.Monad (msum)+import Control.Monad.IO.Class (MonadIO)+import Control.Monad.RWS (RWST)+import Control.Monad.Reader (MonadTrans (lift), ReaderT)+import Control.Monad.State (StateT)+import Control.Monad.Trans.Writer (WriterT)+import Data.Array ((!))+import Data.Bits (Bits)+import Data.Function (on)+import qualified Data.HashMap.Strict as M+import Data.Hashable (Hashable (hash, hashWithSalt))+import Data.IORef (atomicModifyIORef')+import Data.Interned+ ( Cache,+ Id,+ Interned (Description, Uninterned, cache, cacheWidth, describe, identify),+ )+import Data.Interned.Internal+ ( Cache (getCache),+ CacheState (CacheState),+ )+import Data.Kind (Constraint, Type)+import Data.List.NonEmpty (NonEmpty ((:|)), toList)+import Data.Maybe (fromMaybe)+import qualified Data.SBV as SBV+import qualified Data.SBV.Dynamic as SBVD+import qualified Data.SBV.Trans as SBVT+import qualified Data.SBV.Trans.Control as SBVTC+import Data.String (IsString (fromString))+import Data.Typeable (Proxy (Proxy), cast)+import GHC.Exts (sortWith)+import GHC.Generics (Generic)+import GHC.IO (unsafeDupablePerformIO)+import GHC.Stack (HasCallStack)+import GHC.TypeNats (KnownNat, Nat, type (+), type (<=))+import Grisette.Internal.Core.Data.Class.BitCast (BitCast, BitCastOr)+import Grisette.Internal.Core.Data.Class.BitVector+ ( SizedBV,+ )+import Grisette.Internal.Core.Data.Class.SymRotate (SymRotate)+import Grisette.Internal.Core.Data.Class.SymShift (SymShift)+import Grisette.Internal.Core.Data.Symbol+ ( Identifier,+ Symbol (IndexedSymbol, SimpleSymbol),+ )+import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)+import Grisette.Internal.SymPrim.Prim.Internal.Caches+ ( typeMemoizedCache,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Utils+ ( eqHeteroRep,+ eqTypeRepBool,+ pattern Dyn,+ )+import Grisette.Internal.SymPrim.Prim.ModelValue+ ( ModelValue,+ toModelValue,+ )+import Language.Haskell.TH.Syntax (Lift (liftTyped))+import Type.Reflection+ ( SomeTypeRep (SomeTypeRep),+ TypeRep,+ Typeable,+ eqTypeRep,+ someTypeRep,+ typeRep,+ type (:~~:) (HRefl),+ )+import Unsafe.Coerce (unsafeCoerce)++-- $setup+-- >>> import Grisette.Core+-- >>> import Grisette.SymPrim++-- | Monads that supports generating sbv fresh variables.+class (Monad m) => SBVFreshMonad m where+ sbvFresh :: (SBV.SymVal a) => String -> m (SBV.SBV a)++instance (MonadIO m) => SBVFreshMonad (SBVT.SymbolicT m) where+ sbvFresh = SBVT.free++instance (MonadIO m) => SBVFreshMonad (SBVTC.QueryT m) where+ sbvFresh = SBVTC.freshVar++instance (SBVFreshMonad m) => SBVFreshMonad (ReaderT r m) where+ sbvFresh = lift . sbvFresh++instance (SBVFreshMonad m, Monoid w) => SBVFreshMonad (WriterT w m) where+ sbvFresh = lift . sbvFresh++instance (SBVFreshMonad m, Monoid w) => SBVFreshMonad (RWST r w s m) where+ sbvFresh = lift . sbvFresh++instance (SBVFreshMonad m) => SBVFreshMonad (StateT s m) where+ sbvFresh = lift . sbvFresh++-- | Error message for unsupported types.+translateTypeError :: (HasCallStack) => Maybe String -> TypeRep a -> b+translateTypeError Nothing ta =+ error $+ "Don't know how to translate the type " ++ show ta ++ " to SMT"+translateTypeError (Just reason) ta =+ error $+ "Don't know how to translate the type " ++ show ta ++ " to SMT: " <> reason++-- | Type class for resolving the base type for the SBV type for the primitive+-- type.+class (SupportedPrim a, Ord a) => NonFuncSBVRep a where+ type NonFuncSBVBaseType a++-- | Type class for resolving the constraint for a supported non-function+-- primitive type.+type NonFuncPrimConstraint a =+ ( SBV.SymVal (NonFuncSBVBaseType a),+ SBV.EqSymbolic (SBVType a),+ SBV.Mergeable (SBVType a),+ SBV.SMTDefinable (SBVType a),+ SBV.Mergeable (SBVType a),+ SBVType a ~ SBV.SBV (NonFuncSBVBaseType a),+ PrimConstraint a+ )++-- | Indicates that a type is supported, can be represented as a symbolic term,+-- is not a function type, and can be lowered to an SBV term.+class (NonFuncSBVRep a) => SupportedNonFuncPrim a where+ conNonFuncSBVTerm :: a -> SBV.SBV (NonFuncSBVBaseType a)+ symNonFuncSBVTerm ::+ (SBVFreshMonad m) => String -> m (SBV.SBV (NonFuncSBVBaseType a))+ withNonFuncPrim :: ((NonFuncPrimConstraint a) => r) -> r++-- | Partition the list of CVs for models for functions.+partitionCVArg ::+ forall a.+ (SupportedNonFuncPrim a) =>+ [([SBVD.CV], SBVD.CV)] ->+ [(a, [([SBVD.CV], SBVD.CV)])]+partitionCVArg cv =+ partitionOrdCVArg $+ parseFirstCVArg cv+ where+ parseFirstCVArg ::+ forall a.+ (SupportedNonFuncPrim a) =>+ [([SBVD.CV], SBVD.CV)] ->+ [(a, [([SBVD.CV], SBVD.CV)])]+ parseFirstCVArg =+ fmap+ ( \case+ (x : xs, v) ->+ (parseSMTModelResult 0 ([], x), [(xs, v)])+ _ -> error "impossible"+ )+ partitionOrdCVArg ::+ forall a.+ (SupportedNonFuncPrim a) =>+ [(a, [([SBVD.CV], SBVD.CV)])] ->+ [(a, [([SBVD.CV], SBVD.CV)])]+ partitionOrdCVArg v = go sorted+ where+ sorted = sortWith fst v :: [(a, [([SBVD.CV], SBVD.CV)])]+ 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++-- | Parse the scalar model result.+parseScalarSMTModelResult ::+ forall v r.+ (SBV.SatModel r, Typeable v) =>+ (r -> v) ->+ ([([SBVD.CV], SBVD.CV)], SBVD.CV) ->+ v+parseScalarSMTModelResult convert cvs@([], v) = case SBV.parseCVs [v] of+ Just (x, _) -> convert x+ Nothing -> parseSMTModelResultError (typeRep @v) cvs+parseScalarSMTModelResult _ cv = parseSMTModelResultError (typeRep @v) cv++-- | Type class for resolving the SBV type for the primitive type.+class SBVRep t where+ type SBVType t++-- | Type class for resolving the constraint for a supported primitive type.+class SupportedPrimConstraint t where+ type PrimConstraint t :: Constraint+ type PrimConstraint _ = ()++-- | Indicates that a type is supported, can be represented as a symbolic term,+-- and can be lowered to an SBV term.+class+ ( Lift t,+ Typeable t,+ Hashable t,+ Eq t,+ Show t,+ NFData t,+ SupportedPrimConstraint t,+ SBVRep t+ ) =>+ SupportedPrim t+ where+ termCache :: Cache (Term t)+ termCache = typeMemoizedCache+ pformatCon :: t -> String+ default pformatCon :: (Show t) => t -> String+ pformatCon = show+ pformatSym :: TypedSymbol 'AnyKind t -> String+ pformatSym = showUntyped+ defaultValue :: t+ defaultValueDynamic :: proxy t -> ModelValue+ defaultValueDynamic _ = toModelValue (defaultValue @t)+ pevalITETerm :: Term Bool -> Term t -> Term t -> Term t+ pevalEqTerm :: Term t -> Term t -> Term Bool+ pevalDistinctTerm :: NonEmpty (Term t) -> Term Bool+ conSBVTerm :: t -> SBVType t+ symSBVName :: TypedSymbol 'AnyKind t -> Int -> String+ symSBVTerm :: (SBVFreshMonad m) => String -> m (SBVType t)+ default withPrim ::+ ( PrimConstraint t,+ SBV.SMTDefinable (SBVType t),+ SBV.Mergeable (SBVType t),+ Typeable (SBVType t)+ ) =>+ ( ( PrimConstraint t,+ SBV.SMTDefinable (SBVType t),+ SBV.Mergeable (SBVType t),+ Typeable (SBVType t)+ ) =>+ a+ ) ->+ a+ withPrim ::+ ( ( PrimConstraint t,+ SBV.SMTDefinable (SBVType t),+ SBV.Mergeable (SBVType t),+ Typeable (SBVType t)+ ) =>+ a+ ) ->+ a+ withPrim i = i+ sbvIte :: SBV.SBV Bool -> SBVType t -> SBVType t -> SBVType t+ sbvIte = withPrim @t SBV.ite+ sbvEq :: SBVType t -> SBVType t -> SBV.SBV Bool+ default sbvEq ::+ (SBVT.EqSymbolic (SBVType t)) => SBVType t -> SBVType t -> SBV.SBV Bool+ sbvEq = (SBV..==)+ sbvDistinct :: NonEmpty (SBVType t) -> SBV.SBV Bool+ default sbvDistinct ::+ (SBVT.EqSymbolic (SBVType t)) => NonEmpty (SBVType t) -> SBV.SBV Bool+ sbvDistinct = SBV.distinct . toList+ parseSMTModelResult :: Int -> ([([SBVD.CV], SBVD.CV)], SBVD.CV) -> t+ castTypedSymbol ::+ (IsSymbolKind knd') => TypedSymbol knd t -> Maybe (TypedSymbol knd' t)+ isFuncType :: Bool+ funcDummyConstraint :: SBVType t -> SBV.SBV Bool++-- | Cast a typed symbol to a different kind. Check if the kind is compatible.+castSomeTypedSymbol ::+ (IsSymbolKind knd') => SomeTypedSymbol knd -> Maybe (SomeTypedSymbol knd')+castSomeTypedSymbol (SomeTypedSymbol ty s@TypedSymbol {}) =+ SomeTypedSymbol ty <$> castTypedSymbol s++-- | Error message for failure to parse the SBV model result.+parseSMTModelResultError ::+ (HasCallStack) => TypeRep a -> ([([SBVD.CV], SBVD.CV)], SBVD.CV) -> a+parseSMTModelResultError ty cv =+ error $+ "BUG: cannot parse SBV model value \""+ <> show cv+ <> "\" to Grisette model value with the type "+ <> show ty++-- | Partial evaluation for inequality terms.+pevalNEqTerm :: (SupportedPrim a) => Term a -> Term a -> Term Bool+pevalNEqTerm l r = pevalNotTerm $ pevalEqTerm l r+{-# INLINE pevalNEqTerm #-}++-- | 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++-- | Partial evaluation and lowering for function application terms.+class+ (SupportedPrim f, SupportedPrim a, SupportedPrim b) =>+ PEvalApplyTerm f a b+ | f -> a b+ where+ pevalApplyTerm :: Term f -> Term a -> Term b+ sbvApplyTerm :: SBVType f -> SBVType a -> SBVType b++-- | Partial evaluation and lowering for bitwise operation terms.+class (SupportedNonFuncPrim t, Bits t) => PEvalBitwiseTerm t where+ pevalAndBitsTerm :: Term t -> Term t -> Term t+ pevalOrBitsTerm :: Term t -> Term t -> Term t+ pevalXorBitsTerm :: Term t -> Term t -> Term t+ pevalComplementBitsTerm :: Term t -> Term t+ withSbvBitwiseTermConstraint :: (((Bits (SBVType t)) => r)) -> r+ sbvAndBitsTerm :: SBVType t -> SBVType t -> SBVType t+ sbvAndBitsTerm = withSbvBitwiseTermConstraint @t (SBV..&.)+ sbvOrBitsTerm :: SBVType t -> SBVType t -> SBVType t+ sbvOrBitsTerm = withSbvBitwiseTermConstraint @t (SBV..|.)+ sbvXorBitsTerm :: SBVType t -> SBVType t -> SBVType t+ sbvXorBitsTerm = withSbvBitwiseTermConstraint @t SBV.xor+ sbvComplementBitsTerm :: SBVType t -> SBVType t+ sbvComplementBitsTerm = withSbvBitwiseTermConstraint @t SBV.complement++-- | Partial evaluation and lowering for symbolic shifting terms.+class (SupportedNonFuncPrim t, SymShift t) => PEvalShiftTerm t where+ pevalShiftLeftTerm :: Term t -> Term t -> Term t+ pevalShiftRightTerm :: Term t -> Term t -> Term t+ withSbvShiftTermConstraint ::+ (((SBV.SIntegral (NonFuncSBVBaseType t)) => r)) -> r+ sbvShiftLeftTerm :: SBVType t -> SBVType t -> SBVType t+ sbvShiftLeftTerm l r =+ withNonFuncPrim @t $ withSbvShiftTermConstraint @t $ SBV.sShiftLeft l r+ sbvShiftRightTerm :: SBVType t -> SBVType t -> SBVType t+ sbvShiftRightTerm l r =+ withNonFuncPrim @t $ withSbvShiftTermConstraint @t $ SBV.sShiftRight l r++-- | Partial evaluation and lowering for symbolic rotate terms.+class (SupportedNonFuncPrim t, SymRotate t) => PEvalRotateTerm t where+ pevalRotateLeftTerm :: Term t -> Term t -> Term t+ pevalRotateRightTerm :: Term t -> Term t -> Term t+ withSbvRotateTermConstraint ::+ (((SBV.SIntegral (NonFuncSBVBaseType t)) => r)) -> r+ sbvRotateLeftTerm :: SBVType t -> SBVType t -> SBVType t+ sbvRotateLeftTerm l r =+ withNonFuncPrim @t $ withSbvRotateTermConstraint @t $ SBV.sRotateLeft l r+ sbvRotateRightTerm :: SBVType t -> SBVType t -> SBVType t+ sbvRotateRightTerm l r =+ withNonFuncPrim @t $ withSbvRotateTermConstraint @t $ SBV.sRotateRight l r++-- | Partial evaluation and lowering for number terms.+class (SupportedNonFuncPrim t, Num t) => PEvalNumTerm t where+ pevalAddNumTerm :: Term t -> Term t -> Term t+ pevalNegNumTerm :: Term t -> Term t+ pevalMulNumTerm :: Term t -> Term t -> Term t+ pevalAbsNumTerm :: Term t -> Term t+ pevalSignumNumTerm :: Term t -> Term t+ withSbvNumTermConstraint :: (((Num (SBVType t)) => r)) -> r+ sbvAddNumTerm ::+ SBVType t ->+ SBVType t ->+ SBVType t+ sbvAddNumTerm l r = withSbvNumTermConstraint @t $ l + r+ sbvNegNumTerm ::+ SBVType t ->+ SBVType t+ sbvNegNumTerm l = withSbvNumTermConstraint @t $ -l+ sbvMulNumTerm ::+ SBVType t ->+ SBVType t ->+ SBVType t+ sbvMulNumTerm l r = withSbvNumTermConstraint @t $ l * r+ sbvAbsNumTerm ::+ SBVType t ->+ SBVType t+ sbvAbsNumTerm l = withSbvNumTermConstraint @t $ abs l+ sbvSignumNumTerm ::+ SBVType t ->+ SBVType t+ sbvSignumNumTerm l = withSbvNumTermConstraint @t $ signum l++-- | Partial evaluation for subtraction terms.+pevalSubNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a+pevalSubNumTerm l r = pevalAddNumTerm l (pevalNegNumTerm r)++-- | Partial evaluation and lowering for comparison terms.+class (SupportedNonFuncPrim t, Ord t) => PEvalOrdTerm t where+ pevalLtOrdTerm :: Term t -> Term t -> Term Bool+ pevalLeOrdTerm :: Term t -> Term t -> Term Bool+ withSbvOrdTermConstraint :: (((SBV.OrdSymbolic (SBVType t)) => r)) -> r+ sbvLtOrdTerm ::+ SBVType t ->+ SBVType t ->+ SBV.SBV Bool+ sbvLtOrdTerm l r = withSbvOrdTermConstraint @t $ l SBV..< r+ sbvLeOrdTerm :: SBVType t -> SBVType t -> SBV.SBV Bool+ sbvLeOrdTerm l r = withSbvOrdTermConstraint @t $ l SBV..<= r++-- | Partial evaluation for greater than terms.+pevalGtOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool+pevalGtOrdTerm = flip pevalLtOrdTerm++-- | Partial evaluation for greater than or equal to terms.+pevalGeOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool+pevalGeOrdTerm = flip pevalLeOrdTerm++-- | Partial evaluation and lowering for integer division and modulo terms.+class (SupportedNonFuncPrim t, Integral t) => PEvalDivModIntegralTerm t where+ pevalDivIntegralTerm :: Term t -> Term t -> Term t+ pevalModIntegralTerm :: Term t -> Term t -> Term t+ pevalQuotIntegralTerm :: Term t -> Term t -> Term t+ pevalRemIntegralTerm :: Term t -> Term t -> Term t+ withSbvDivModIntegralTermConstraint ::+ (((SBV.SDivisible (SBVType t)) => r)) -> r+ sbvDivIntegralTerm :: SBVType t -> SBVType t -> SBVType t+ sbvDivIntegralTerm l r =+ withSbvDivModIntegralTermConstraint @t $ l `SBV.sDiv` r+ sbvModIntegralTerm :: SBVType t -> SBVType t -> SBVType t+ sbvModIntegralTerm l r =+ withSbvDivModIntegralTermConstraint @t $ l `SBV.sMod` r+ sbvQuotIntegralTerm :: SBVType t -> SBVType t -> SBVType t+ sbvQuotIntegralTerm l r =+ withSbvDivModIntegralTermConstraint @t $ l `SBV.sQuot` r+ sbvRemIntegralTerm :: SBVType t -> SBVType t -> SBVType t+ sbvRemIntegralTerm l r =+ withSbvDivModIntegralTermConstraint @t $ l `SBV.sRem` r++-- | Partial evaluation and lowering for bitcast terms.+class+ (SupportedNonFuncPrim a, SupportedNonFuncPrim b, BitCast a b) =>+ PEvalBitCastTerm a b+ where+ pevalBitCastTerm :: Term a -> Term b+ sbvBitCast :: SBVType a -> SBVType b++-- | Partial evaluation and lowering for bitcast or default value terms.+class+ (SupportedNonFuncPrim a, SupportedNonFuncPrim b, BitCastOr a b) =>+ PEvalBitCastOrTerm a b+ where+ pevalBitCastOrTerm :: Term b -> Term a -> Term b+ sbvBitCastOr :: SBVType b -> SBVType a -> SBVType b++-- | Partial evaluation and lowering for bit-vector terms.+class+ ( forall n. (KnownNat n, 1 <= n) => SupportedNonFuncPrim (bv n),+ SizedBV bv,+ Typeable bv+ ) =>+ PEvalBVTerm bv+ where+ pevalBVConcatTerm ::+ (KnownNat l, KnownNat r, 1 <= l, 1 <= r) =>+ Term (bv l) ->+ Term (bv r) ->+ Term (bv (l + r))+ pevalBVExtendTerm ::+ (KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>+ Bool ->+ proxy r ->+ Term (bv l) ->+ Term (bv r)+ pevalBVSelectTerm ::+ (KnownNat n, KnownNat ix, KnownNat w, 1 <= n, 1 <= w, ix + w <= n) =>+ p ix ->+ q w ->+ Term (bv n) ->+ Term (bv w)+ sbvBVConcatTerm ::+ (KnownNat l, KnownNat r, 1 <= l, 1 <= r) =>+ p1 l ->+ p2 r ->+ SBVType (bv l) ->+ SBVType (bv r) ->+ SBVType (bv (l + r))+ sbvBVExtendTerm ::+ (KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>+ p1 l ->+ p2 r ->+ Bool ->+ SBVType (bv l) ->+ SBVType (bv r)+ sbvBVSelectTerm ::+ ( KnownNat ix,+ KnownNat w,+ KnownNat n,+ 1 <= n,+ 1 <= w,+ ix + w <= n+ ) =>+ p1 ix ->+ p2 w ->+ p3 n ->+ SBVType (bv n) ->+ SBVType (bv w)++-- | Partial evaluation and lowering for fractional terms.+class (SupportedNonFuncPrim t, Fractional t) => PEvalFractionalTerm t where+ pevalFdivTerm :: Term t -> Term t -> Term t+ pevalRecipTerm :: Term t -> Term t+ withSbvFractionalTermConstraint ::+ (((Fractional (SBVType t)) => r)) ->+ r+ sbvFdivTerm ::+ SBVType t ->+ SBVType t ->+ SBVType t+ sbvFdivTerm l r = withSbvFractionalTermConstraint @t $ l / r+ sbvRecipTerm ::+ SBVType t ->+ SBVType t+ sbvRecipTerm l = withSbvFractionalTermConstraint @t $ recip l++-- | Unary floating point operations.+data FloatingUnaryOp+ = FloatingExp+ | FloatingLog+ | FloatingSqrt+ | FloatingSin+ | FloatingCos+ | FloatingTan+ | FloatingAsin+ | FloatingAcos+ | FloatingAtan+ | FloatingSinh+ | FloatingCosh+ | FloatingTanh+ | FloatingAsinh+ | FloatingAcosh+ | FloatingAtanh+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData)++instance Show FloatingUnaryOp where+ show FloatingExp = "exp"+ show FloatingLog = "log"+ show FloatingSqrt = "sqrt"+ show FloatingSin = "sin"+ show FloatingCos = "cos"+ show FloatingTan = "tan"+ show FloatingAsin = "asin"+ show FloatingAcos = "acos"+ show FloatingAtan = "atan"+ show FloatingSinh = "sinh"+ show FloatingCosh = "cosh"+ show FloatingTanh = "tanh"+ show FloatingAsinh = "asinh"+ show FloatingAcosh = "acosh"+ show FloatingAtanh = "atanh"++-- | Partial evaluation and lowering for floating point terms.+class (SupportedNonFuncPrim t) => PEvalFloatingTerm t where+ pevalFloatingUnaryTerm :: FloatingUnaryOp -> Term t -> Term t+ pevalPowerTerm :: Term t -> Term t -> Term t+ withSbvFloatingTermConstraint ::+ (((Floating (SBVType t)) => r)) ->+ r+ sbvPowerTerm ::+ SBVType t ->+ SBVType t ->+ SBVType t+ sbvPowerTerm = withSbvFloatingTermConstraint @t (**)+ sbvFloatingUnaryTerm ::+ FloatingUnaryOp ->+ SBVType t ->+ SBVType t+ sbvFloatingUnaryTerm op l =+ withSbvFloatingTermConstraint @t $+ case op of+ FloatingExp -> exp l+ FloatingLog -> log l+ FloatingSqrt -> sqrt l+ FloatingSin -> sin l+ FloatingCos -> cos l+ FloatingTan -> tan l+ FloatingAsin -> asin l+ FloatingAcos -> acos l+ FloatingAtan -> atan l+ FloatingSinh -> sinh l+ FloatingCosh -> cosh l+ FloatingTanh -> tanh l+ FloatingAsinh -> asinh l+ FloatingAcosh -> acosh l+ FloatingAtanh -> atanh l++-- | Partial evaluation and lowering for integral terms.+class+ ( SupportedNonFuncPrim a,+ SupportedNonFuncPrim b,+ Integral a,+ Num b+ ) =>+ PEvalFromIntegralTerm a b+ where+ pevalFromIntegralTerm :: Term a -> Term b+ sbvFromIntegralTerm :: SBVType a -> SBVType b++-- | Partial evaluation and lowering for converting from and to IEEE floating+-- point terms.+class (SupportedNonFuncPrim a) => PEvalIEEEFPConvertibleTerm a where+ pevalFromFPOrTerm ::+ (ValidFP eb sb) =>+ Term a ->+ Term FPRoundingMode ->+ Term (FP eb sb) ->+ Term a+ pevalToFPTerm ::+ (ValidFP eb sb) => Term FPRoundingMode -> Term a -> Term (FP eb sb)+ sbvFromFPOrTerm ::+ (ValidFP eb sb) =>+ SBVType a ->+ SBVType FPRoundingMode ->+ SBVType (FP eb sb) ->+ SBVType a+ sbvToFPTerm ::+ (ValidFP eb sb) =>+ SBVType FPRoundingMode ->+ SBVType a ->+ SBVType (FP eb sb)++-- | Custom unary operator. Not used by Grisette at this time and do not use it.+class+ (SupportedPrim arg, SupportedPrim t, Lift tag, NFData tag, Show tag, Typeable tag, Eq tag, Hashable tag) =>+ UnaryOp tag arg t+ | tag arg -> t+ where+ pevalUnary :: (Typeable tag, Typeable t) => tag -> Term arg -> Term t+ pformatUnary :: tag -> Term arg -> String++-- | Custom binary operator. Not used by Grisette at this time and do not use it.+class+ ( SupportedPrim arg1,+ SupportedPrim arg2,+ SupportedPrim t,+ Lift tag,+ NFData tag,+ Show tag,+ Typeable tag,+ Eq tag,+ Hashable tag+ ) =>+ BinaryOp tag arg1 arg2 t+ | tag arg1 arg2 -> t+ where+ pevalBinary :: (Typeable tag, Typeable t) => tag -> Term arg1 -> Term arg2 -> Term t+ pformatBinary :: tag -> Term arg1 -> Term arg2 -> String++-- | Custom ternary operator. Not used by Grisette at this time and do not use it.+class+ ( SupportedPrim arg1,+ SupportedPrim arg2,+ SupportedPrim arg3,+ SupportedPrim t,+ Lift tag,+ NFData tag,+ Show tag,+ Typeable tag,+ Eq tag,+ Hashable tag+ ) =>+ TernaryOp tag arg1 arg2 arg3 t+ | tag arg1 arg2 arg3 -> t+ where+ pevalTernary :: (Typeable tag, Typeable t) => tag -> Term arg1 -> Term arg2 -> Term arg3 -> Term t+ pformatTernary :: tag -> Term arg1 -> Term arg2 -> Term arg3 -> String++-- Typed Symbols++-- | The kind of a symbol.+--+-- All symbols are 'AnyKind', and all symbols other than general/tabular+-- functions are 'ConstantKind'.+data SymbolKind = ConstantKind | AnyKind++-- | Decision procedure for symbol kinds.+class IsSymbolKind (ty :: SymbolKind) where+ type SymbolKindConstraint ty :: Type -> Constraint+ decideSymbolKind :: Either (ty :~~: 'ConstantKind) (ty :~~: 'AnyKind)++instance IsSymbolKind 'ConstantKind where+ type SymbolKindConstraint 'ConstantKind = SupportedNonFuncPrim+ decideSymbolKind = Left HRefl++instance IsSymbolKind 'AnyKind where+ type SymbolKindConstraint 'AnyKind = SupportedPrim+ decideSymbolKind = Right HRefl++-- | A typed symbol is a symbol that is associated with a type. Note that the+-- same symbol bodies with different types are considered different symbols+-- and can coexist in a term.+--+-- Simple symbols can be created with the @OverloadedStrings@ extension:+--+-- >>> "a" :: TypedSymbol 'AnyKind Bool+-- a :: Bool+data TypedSymbol (knd :: SymbolKind) t where+ TypedSymbol ::+ ( SupportedPrim t,+ SymbolKindConstraint knd t,+ IsSymbolKind knd+ ) =>+ {unTypedSymbol :: Symbol} ->+ TypedSymbol knd t++-- | Constant symbol+type TypedConstantSymbol = TypedSymbol 'ConstantKind++-- | Any symbol+type TypedAnySymbol = TypedSymbol 'AnyKind++instance Eq (TypedSymbol knd t) where+ TypedSymbol x == TypedSymbol y = x == y++instance Ord (TypedSymbol knd t) where+ TypedSymbol x <= TypedSymbol y = x <= y++instance Lift (TypedSymbol knd t) where+ liftTyped (TypedSymbol x) = [||TypedSymbol x||]++instance Show (TypedSymbol knd t) where+ show (TypedSymbol symbol) = show symbol ++ " :: " ++ show (typeRep @t)++-- | Show a typed symbol without the type information.+showUntyped :: TypedSymbol knd t -> String+showUntyped (TypedSymbol symbol) = show symbol++instance Hashable (TypedSymbol knd t) where+ s `hashWithSalt` TypedSymbol x = s `hashWithSalt` x++instance NFData (TypedSymbol knd t) where+ rnf (TypedSymbol str) = rnf str++instance+ ( SupportedPrim t,+ SymbolKindConstraint knd t,+ IsSymbolKind knd+ ) =>+ IsString (TypedSymbol knd t)+ where+ fromString = TypedSymbol . fromString++-- | Introduce the 'SupportedPrim' constraint from the t'TypedSymbol'.+withSymbolSupported :: TypedSymbol knd t -> ((SupportedPrim t) => a) -> a+withSymbolSupported (TypedSymbol _) a = a++-- | Introduce the 'IsSymbolKind' constraint from the t'TypedSymbol'.+withSymbolKind :: TypedSymbol knd t -> ((IsSymbolKind knd) => a) -> a+withSymbolKind (TypedSymbol _) a = a++-- | A non-indexed symbol. Type information are checked at runtime.+data SomeTypedSymbol knd where+ SomeTypedSymbol ::+ forall knd t.+ TypeRep t ->+ TypedSymbol knd t ->+ SomeTypedSymbol knd++-- | Non-indexed constant symbol+type SomeTypedConstantSymbol = SomeTypedSymbol 'ConstantKind++-- | Non-indexed any symbol+type SomeTypedAnySymbol = SomeTypedSymbol 'AnyKind++instance NFData (SomeTypedSymbol knd) where+ rnf (SomeTypedSymbol p s) = rnf (SomeTypeRep p) `seq` rnf s++instance Eq (SomeTypedSymbol knd) where+ (SomeTypedSymbol t1 s1) == (SomeTypedSymbol t2 s2) = case eqTypeRep t1 t2 of+ Just HRefl -> s1 == s2+ _ -> False++instance Ord (SomeTypedSymbol knd) where+ (SomeTypedSymbol t1 s1) <= (SomeTypedSymbol t2 s2) =+ SomeTypeRep t1 < SomeTypeRep t2+ || ( case eqTypeRep t1 t2 of+ Just HRefl -> s1 <= s2+ _ -> False+ )++instance Hashable (SomeTypedSymbol knd) where+ hashWithSalt s (SomeTypedSymbol t1 s1) = s `hashWithSalt` s1 `hashWithSalt` t1++instance Show (SomeTypedSymbol knd) where+ show (SomeTypedSymbol _ s) = show s++-- | Construct a t'SomeTypedSymbol' from a t'TypedSymbol'.+someTypedSymbol :: forall knd t. TypedSymbol knd t -> SomeTypedSymbol knd+someTypedSymbol s@(TypedSymbol _) = SomeTypedSymbol (typeRep @t) s++-- Terms++-- | Traits for IEEE floating point numbers.+data FPTrait+ = FPIsNaN+ | FPIsPositive+ | FPIsNegative+ | FPIsPositiveInfinite+ | FPIsNegativeInfinite+ | FPIsInfinite+ | FPIsPositiveZero+ | FPIsNegativeZero+ | FPIsZero+ | FPIsNormal+ | FPIsSubnormal+ | FPIsPoint+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData)++instance Show FPTrait where+ show FPIsNaN = "is_nan"+ show FPIsPositive = "is_pos"+ show FPIsNegative = "is_neg"+ show FPIsPositiveInfinite = "is_pos_inf"+ show FPIsNegativeInfinite = "is_neg_inf"+ show FPIsInfinite = "is_inf"+ show FPIsPositiveZero = "is_pos_zero"+ show FPIsNegativeZero = "is_neg_zero"+ show FPIsZero = "is_zero"+ show FPIsNormal = "is_normal"+ show FPIsSubnormal = "is_subnormal"+ show FPIsPoint = "is_point"++-- | Unary floating point operations.+data FPUnaryOp = FPAbs | FPNeg+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData)++instance Show FPUnaryOp where+ show FPAbs = "fp.abs"+ show FPNeg = "fp.neg"++-- | Binary floating point operations.+data FPBinaryOp+ = FPRem+ | FPMinimum+ | FPMinimumNumber+ | FPMaximum+ | FPMaximumNumber+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData)++instance Show FPBinaryOp where+ show FPRem = "fp.rem"+ show FPMinimum = "fp.minimum"+ show FPMinimumNumber = "fp.minimumNumber"+ show FPMaximum = "fp.maximum"+ show FPMaximumNumber = "fp.maximumNumber"++-- | Unary floating point operations with rounding modes.+data FPRoundingUnaryOp = FPSqrt | FPRoundToIntegral+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData)++instance Show FPRoundingUnaryOp where+ show FPSqrt = "fp.sqrt"+ show FPRoundToIntegral = "fp.roundToIntegral"++-- | Binary floating point operations with rounding modes.+data FPRoundingBinaryOp = FPAdd | FPSub | FPMul | FPDiv+ deriving (Eq, Ord, Generic, Hashable, Lift, NFData)++instance Show FPRoundingBinaryOp where+ show FPAdd = "fp.add"+ show FPSub = "fp.sub"+ show FPMul = "fp.mul"+ show FPDiv = "fp.div"++-- | Internal representation for Grisette symbolic terms.+data Term t where+ ConTerm :: (SupportedPrim t) => {-# UNPACK #-} !Id -> !t -> Term t+ SymTerm :: (SupportedPrim t) => {-# UNPACK #-} !Id -> !(TypedSymbol 'AnyKind t) -> Term t+ ForallTerm :: (SupportedNonFuncPrim t) => {-# UNPACK #-} !Id -> !(TypedSymbol 'ConstantKind t) -> !(Term Bool) -> Term Bool+ ExistsTerm :: (SupportedNonFuncPrim t) => {-# UNPACK #-} !Id -> !(TypedSymbol 'ConstantKind t) -> !(Term Bool) -> Term Bool+ UnaryTerm ::+ (UnaryOp tag arg t) =>+ {-# UNPACK #-} !Id ->+ !tag ->+ !(Term arg) ->+ Term t+ BinaryTerm ::+ (BinaryOp tag arg1 arg2 t) =>+ {-# UNPACK #-} !Id ->+ !tag ->+ !(Term arg1) ->+ !(Term arg2) ->+ Term t+ TernaryTerm ::+ (TernaryOp tag arg1 arg2 arg3 t) =>+ {-# UNPACK #-} !Id ->+ !tag ->+ !(Term arg1) ->+ !(Term arg2) ->+ !(Term arg3) ->+ Term t+ NotTerm :: {-# UNPACK #-} !Id -> !(Term Bool) -> Term Bool+ OrTerm :: {-# UNPACK #-} !Id -> !(Term Bool) -> !(Term Bool) -> Term Bool+ AndTerm :: {-# UNPACK #-} !Id -> !(Term Bool) -> !(Term Bool) -> Term Bool+ EqTerm ::+ (SupportedNonFuncPrim t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term Bool+ DistinctTerm ::+ (SupportedNonFuncPrim t) =>+ {-# UNPACK #-} !Id ->+ !(NonEmpty (Term t)) ->+ Term Bool+ ITETerm ::+ (SupportedPrim t) =>+ {-# UNPACK #-} !Id ->+ !(Term Bool) ->+ !(Term t) ->+ !(Term t) ->+ Term t+ AddNumTerm ::+ (PEvalNumTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ NegNumTerm ::+ (PEvalNumTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ Term t+ MulNumTerm ::+ (PEvalNumTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ AbsNumTerm ::+ (PEvalNumTerm t) => {-# UNPACK #-} !Id -> !(Term t) -> Term t+ SignumNumTerm :: (PEvalNumTerm t) => {-# UNPACK #-} !Id -> !(Term t) -> Term t+ LtOrdTerm ::+ (PEvalOrdTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term Bool+ LeOrdTerm ::+ (PEvalOrdTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term Bool+ AndBitsTerm ::+ (PEvalBitwiseTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ OrBitsTerm ::+ (PEvalBitwiseTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ XorBitsTerm ::+ (PEvalBitwiseTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ ComplementBitsTerm ::+ (PEvalBitwiseTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ Term t+ ShiftLeftTerm ::+ (PEvalShiftTerm t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+ ShiftRightTerm ::+ (PEvalShiftTerm t) => {-# UNPACK #-} !Id -> !(Term t) -> !(Term t) -> Term t+ RotateLeftTerm ::+ (PEvalRotateTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ RotateRightTerm ::+ (PEvalRotateTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ BitCastTerm ::+ (PEvalBitCastTerm a b) =>+ {-# UNPACK #-} !Id ->+ !(Term a) ->+ Term b+ BitCastOrTerm ::+ (PEvalBitCastOrTerm a b) =>+ {-# UNPACK #-} !Id ->+ !(Term b) ->+ !(Term a) ->+ Term b+ BVConcatTerm ::+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ KnownNat (l + r),+ 1 <= l,+ 1 <= r,+ 1 <= l + r+ ) =>+ {-# UNPACK #-} !Id ->+ !(Term (bv l)) ->+ !(Term (bv r)) ->+ Term (bv (l + r))+ BVSelectTerm ::+ ( PEvalBVTerm bv,+ KnownNat n,+ KnownNat ix,+ KnownNat w,+ 1 <= n,+ 1 <= w,+ ix + w <= n+ ) =>+ {-# UNPACK #-} !Id ->+ !(TypeRep ix) ->+ !(TypeRep w) ->+ !(Term (bv n)) ->+ Term (bv w)+ BVExtendTerm ::+ (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>+ {-# UNPACK #-} !Id ->+ !Bool ->+ !(TypeRep r) ->+ !(Term (bv l)) ->+ Term (bv r)+ ApplyTerm ::+ ( SupportedPrim a,+ SupportedPrim b,+ SupportedPrim f,+ PEvalApplyTerm f a b+ ) =>+ {-# UNPACK #-} !Id ->+ !(Term f) ->+ !(Term a) ->+ Term b+ DivIntegralTerm ::+ (PEvalDivModIntegralTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ ModIntegralTerm ::+ (PEvalDivModIntegralTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ QuotIntegralTerm ::+ (PEvalDivModIntegralTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ RemIntegralTerm ::+ (PEvalDivModIntegralTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ FPTraitTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb)) =>+ {-# UNPACK #-} !Id ->+ !FPTrait ->+ !(Term (FP eb sb)) ->+ Term Bool+ FdivTerm ::+ (PEvalFractionalTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ RecipTerm ::+ (PEvalFractionalTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ Term t+ FloatingUnaryTerm ::+ (PEvalFloatingTerm t) =>+ {-# UNPACK #-} !Id ->+ !FloatingUnaryOp ->+ !(Term t) ->+ Term t+ PowerTerm ::+ (PEvalFloatingTerm t) =>+ {-# UNPACK #-} !Id ->+ !(Term t) ->+ !(Term t) ->+ Term t+ FPUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb)) =>+ {-# UNPACK #-} !Id ->+ !FPUnaryOp ->+ !(Term (FP eb sb)) ->+ Term (FP eb sb)+ FPBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb)) =>+ {-# UNPACK #-} !Id ->+ !FPBinaryOp ->+ !(Term (FP eb sb)) ->+ !(Term (FP eb sb)) ->+ Term (FP eb sb)+ FPRoundingUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>+ {-# UNPACK #-} !Id ->+ !FPRoundingUnaryOp ->+ !(Term FPRoundingMode) ->+ !(Term (FP eb sb)) ->+ Term (FP eb sb)+ FPRoundingBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>+ {-# UNPACK #-} !Id ->+ !FPRoundingBinaryOp ->+ !(Term FPRoundingMode) ->+ !(Term (FP eb sb)) ->+ !(Term (FP eb sb)) ->+ Term (FP eb sb)+ FPFMATerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>+ {-# UNPACK #-} !Id ->+ !(Term FPRoundingMode) ->+ !(Term (FP eb sb)) ->+ !(Term (FP eb sb)) ->+ !(Term (FP eb sb)) ->+ Term (FP eb sb)+ FromIntegralTerm ::+ (PEvalFromIntegralTerm a b) =>+ {-# UNPACK #-} !Id ->+ !(Term a) ->+ Term b+ FromFPOrTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim (FP eb sb),+ SupportedPrim FPRoundingMode+ ) =>+ {-# UNPACK #-} !Id ->+ !(Term a) ->+ !(Term FPRoundingMode) ->+ !(Term (FP eb sb)) ->+ Term a+ ToFPTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim (FP eb sb),+ SupportedPrim FPRoundingMode+ ) =>+ {-# UNPACK #-} !Id ->+ !(Term FPRoundingMode) ->+ !(Term a) ->+ Proxy eb ->+ Proxy sb ->+ Term (FP eb sb)++-- | Return the ID of a term.+identity :: Term t -> Id+identity = snd . identityWithTypeRep+{-# INLINE identity #-}++-- | Return the ID and the type representation of a term.+identityWithTypeRep :: forall t. Term t -> (SomeTypeRep, Id)+identityWithTypeRep (ConTerm i _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (SymTerm i _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (ForallTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (ExistsTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (UnaryTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (BinaryTerm i _ _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (TernaryTerm i _ _ _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (NotTerm i _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (OrTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (AndTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (EqTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (DistinctTerm i _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (ITETerm i _ _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (AddNumTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (NegNumTerm i _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (MulNumTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (AbsNumTerm i _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (SignumNumTerm i _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (LtOrdTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (LeOrdTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (AndBitsTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (OrBitsTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (XorBitsTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (ComplementBitsTerm i _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (ShiftLeftTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (ShiftRightTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (RotateLeftTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (RotateRightTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (BitCastTerm i _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (BitCastOrTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (BVConcatTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (BVSelectTerm i _ _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (BVExtendTerm i _ _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (ApplyTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (DivIntegralTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (ModIntegralTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (QuotIntegralTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (RemIntegralTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (FPTraitTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (FdivTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (RecipTerm i _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (FloatingUnaryTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (PowerTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (FPUnaryTerm i _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (FPBinaryTerm i _ _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (FPRoundingUnaryTerm i _ _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (FPRoundingBinaryTerm i _ _ _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (FPFMATerm i _ _ _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (FromIntegralTerm i _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (FromFPOrTerm i _ _ _) = (someTypeRep (Proxy @t), i)+identityWithTypeRep (ToFPTerm i _ _ _ _) = (someTypeRep (Proxy @t), i)+{-# INLINE identityWithTypeRep #-}++-- | Introduce the 'SupportedPrim' constraint from a term.+introSupportedPrimConstraint :: forall t a. Term t -> ((SupportedPrim t) => a) -> a+introSupportedPrimConstraint ConTerm {} x = x+introSupportedPrimConstraint SymTerm {} x = x+introSupportedPrimConstraint ForallTerm {} x = x+introSupportedPrimConstraint ExistsTerm {} x = x+introSupportedPrimConstraint UnaryTerm {} x = x+introSupportedPrimConstraint BinaryTerm {} x = x+introSupportedPrimConstraint TernaryTerm {} x = x+introSupportedPrimConstraint NotTerm {} x = x+introSupportedPrimConstraint OrTerm {} x = x+introSupportedPrimConstraint AndTerm {} x = x+introSupportedPrimConstraint EqTerm {} x = x+introSupportedPrimConstraint DistinctTerm {} x = x+introSupportedPrimConstraint ITETerm {} x = x+introSupportedPrimConstraint AddNumTerm {} x = x+introSupportedPrimConstraint NegNumTerm {} x = x+introSupportedPrimConstraint MulNumTerm {} x = x+introSupportedPrimConstraint AbsNumTerm {} x = x+introSupportedPrimConstraint SignumNumTerm {} x = x+introSupportedPrimConstraint LtOrdTerm {} x = x+introSupportedPrimConstraint LeOrdTerm {} x = x+introSupportedPrimConstraint AndBitsTerm {} x = x+introSupportedPrimConstraint OrBitsTerm {} x = x+introSupportedPrimConstraint XorBitsTerm {} x = x+introSupportedPrimConstraint ComplementBitsTerm {} x = x+introSupportedPrimConstraint ShiftLeftTerm {} x = x+introSupportedPrimConstraint RotateLeftTerm {} x = x+introSupportedPrimConstraint ShiftRightTerm {} x = x+introSupportedPrimConstraint RotateRightTerm {} x = x+introSupportedPrimConstraint BitCastTerm {} x = x+introSupportedPrimConstraint BitCastOrTerm {} x = x+introSupportedPrimConstraint BVConcatTerm {} x = x+introSupportedPrimConstraint BVSelectTerm {} x = x+introSupportedPrimConstraint BVExtendTerm {} x = x+introSupportedPrimConstraint ApplyTerm {} x = x+introSupportedPrimConstraint DivIntegralTerm {} x = x+introSupportedPrimConstraint ModIntegralTerm {} x = x+introSupportedPrimConstraint QuotIntegralTerm {} x = x+introSupportedPrimConstraint RemIntegralTerm {} x = x+introSupportedPrimConstraint FPTraitTerm {} x = x+introSupportedPrimConstraint FdivTerm {} x = x+introSupportedPrimConstraint RecipTerm {} x = x+introSupportedPrimConstraint FloatingUnaryTerm {} x = x+introSupportedPrimConstraint PowerTerm {} x = x+introSupportedPrimConstraint FPUnaryTerm {} x = x+introSupportedPrimConstraint FPBinaryTerm {} x = x+introSupportedPrimConstraint FPRoundingUnaryTerm {} x = x+introSupportedPrimConstraint FPRoundingBinaryTerm {} x = x+introSupportedPrimConstraint FPFMATerm {} x = x+introSupportedPrimConstraint FromIntegralTerm {} x = x+introSupportedPrimConstraint FromFPOrTerm {} x = x+introSupportedPrimConstraint ToFPTerm {} x = x+{-# INLINE introSupportedPrimConstraint #-}++-- | Pretty-print a term.+pformatTerm :: forall t. (SupportedPrim t) => Term t -> String+pformatTerm (ConTerm _ t) = pformatCon t+pformatTerm (SymTerm _ sym) = pformatSym sym+pformatTerm (ForallTerm _ sym arg) = "(forall " ++ show sym ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (ExistsTerm _ sym arg) = "(exists " ++ show sym ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (UnaryTerm _ tag arg1) = pformatUnary tag arg1+pformatTerm (BinaryTerm _ tag arg1 arg2) = pformatBinary tag arg1 arg2+pformatTerm (TernaryTerm _ tag arg1 arg2 arg3) = pformatTernary tag arg1 arg2 arg3+pformatTerm (NotTerm _ arg) = "(! " ++ pformatTerm arg ++ ")"+pformatTerm (OrTerm _ arg1 arg2) = "(|| " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (AndTerm _ arg1 arg2) = "(&& " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (EqTerm _ arg1 arg2) = "(= " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (DistinctTerm _ args) = "(distinct " ++ unwords (map pformatTerm $ toList args) ++ ")"+pformatTerm (ITETerm _ cond arg1 arg2) = "(ite " ++ pformatTerm cond ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (AddNumTerm _ arg1 arg2) = "(+ " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (NegNumTerm _ arg) = "(- " ++ pformatTerm arg ++ ")"+pformatTerm (MulNumTerm _ arg1 arg2) = "(* " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (AbsNumTerm _ arg) = "(abs " ++ pformatTerm arg ++ ")"+pformatTerm (SignumNumTerm _ arg) = "(signum " ++ pformatTerm arg ++ ")"+pformatTerm (LtOrdTerm _ arg1 arg2) = "(< " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (LeOrdTerm _ arg1 arg2) = "(<= " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (AndBitsTerm _ arg1 arg2) = "(& " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (OrBitsTerm _ arg1 arg2) = "(| " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (XorBitsTerm _ arg1 arg2) = "(^ " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (ComplementBitsTerm _ arg) = "(~ " ++ pformatTerm arg ++ ")"+pformatTerm (ShiftLeftTerm _ arg n) = "(shl " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"+pformatTerm (ShiftRightTerm _ arg n) = "(shr " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"+pformatTerm (RotateLeftTerm _ arg n) = "(rotl " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"+pformatTerm (RotateRightTerm _ arg n) = "(rotr " ++ pformatTerm arg ++ " " ++ pformatTerm n ++ ")"+pformatTerm (BitCastTerm _ arg) = "(bitcast " ++ pformatTerm arg ++ ")"+pformatTerm (BitCastOrTerm _ d arg) = "(bitcast_or " ++ pformatTerm d ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (BVConcatTerm _ arg1 arg2) = "(bvconcat " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (BVSelectTerm _ ix w arg) = "(bvselect " ++ show ix ++ " " ++ show w ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (BVExtendTerm _ signed n arg) =+ (if signed then "(bvsext " else "(bvzext ") ++ show n ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (ApplyTerm _ func arg) = "(apply " ++ pformatTerm func ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (DivIntegralTerm _ arg1 arg2) = "(div " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (ModIntegralTerm _ arg1 arg2) = "(mod " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (QuotIntegralTerm _ arg1 arg2) = "(quot " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (RemIntegralTerm _ arg1 arg2) = "(rem " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (FPTraitTerm _ trait arg) = "(" ++ show trait ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (FdivTerm _ arg1 arg2) = "(fdiv " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (RecipTerm _ arg) = "(recip " ++ pformatTerm arg ++ ")"+pformatTerm (FloatingUnaryTerm _ op arg) = "(" ++ show op ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (PowerTerm _ arg1 arg2) = "(** " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (FPUnaryTerm _ op arg) = "(" ++ show op ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (FPBinaryTerm _ op arg1 arg2) = "(" ++ show op ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (FPRoundingUnaryTerm _ op mode arg) = "(" ++ show op ++ " " ++ pformatTerm mode ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (FPRoundingBinaryTerm _ op mode arg1 arg2) =+ "(" ++ show op ++ " " ++ pformatTerm mode ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ ")"+pformatTerm (FPFMATerm _ mode arg1 arg2 arg3) =+ "(fp.fma " ++ pformatTerm mode ++ " " ++ pformatTerm arg1 ++ " " ++ pformatTerm arg2 ++ " " ++ pformatTerm arg3 ++ ")"+pformatTerm (FromIntegralTerm _ arg) = "(from_integral " ++ pformatTerm arg ++ ")"+pformatTerm (FromFPOrTerm _ d r arg) = "(from_fp_or " ++ pformatTerm d ++ " " ++ pformatTerm r ++ " " ++ pformatTerm arg ++ ")"+pformatTerm (ToFPTerm _ r arg _ _) = "(to_fp " ++ pformatTerm r ++ " " ++ pformatTerm arg ++ ")"+{-# INLINE pformatTerm #-}++instance NFData (Term a) where+ rnf i = identity i `seq` ()++instance Lift (Term t) where+ liftTyped (ConTerm _ i) = [||conTerm i||]+ liftTyped (SymTerm _ sym) = [||symTerm (unTypedSymbol sym)||]+ liftTyped (ForallTerm _ sym arg) = [||forallTerm sym arg||]+ liftTyped (ExistsTerm _ sym arg) = [||existsTerm sym arg||]+ liftTyped (UnaryTerm _ tag arg) = [||constructUnary tag arg||]+ liftTyped (BinaryTerm _ tag arg1 arg2) = [||constructBinary tag arg1 arg2||]+ liftTyped (TernaryTerm _ tag arg1 arg2 arg3) =+ [||constructTernary tag arg1 arg2 arg3||]+ liftTyped (NotTerm _ arg) = [||notTerm arg||]+ liftTyped (OrTerm _ arg1 arg2) = [||orTerm arg1 arg2||]+ liftTyped (AndTerm _ arg1 arg2) = [||andTerm arg1 arg2||]+ liftTyped (EqTerm _ arg1 arg2) = [||eqTerm arg1 arg2||]+ liftTyped (DistinctTerm _ args) = [||distinctTerm args||]+ liftTyped (ITETerm _ cond arg1 arg2) = [||iteTerm cond arg1 arg2||]+ liftTyped (AddNumTerm _ arg1 arg2) = [||addNumTerm arg1 arg2||]+ liftTyped (NegNumTerm _ arg) = [||negNumTerm arg||]+ liftTyped (MulNumTerm _ arg1 arg2) = [||mulNumTerm arg1 arg2||]+ liftTyped (AbsNumTerm _ arg) = [||absNumTerm arg||]+ liftTyped (SignumNumTerm _ arg) = [||signumNumTerm arg||]+ liftTyped (LtOrdTerm _ arg1 arg2) = [||ltOrdTerm arg1 arg2||]+ liftTyped (LeOrdTerm _ arg1 arg2) = [||leOrdTerm arg1 arg2||]+ liftTyped (AndBitsTerm _ arg1 arg2) = [||andBitsTerm arg1 arg2||]+ liftTyped (OrBitsTerm _ arg1 arg2) = [||orBitsTerm arg1 arg2||]+ liftTyped (XorBitsTerm _ arg1 arg2) = [||xorBitsTerm arg1 arg2||]+ liftTyped (ComplementBitsTerm _ arg) = [||complementBitsTerm arg||]+ liftTyped (ShiftLeftTerm _ arg n) = [||shiftLeftTerm arg n||]+ liftTyped (ShiftRightTerm _ arg n) = [||shiftRightTerm arg n||]+ liftTyped (RotateLeftTerm _ arg n) = [||rotateLeftTerm arg n||]+ liftTyped (RotateRightTerm _ arg n) = [||rotateRightTerm arg n||]+ liftTyped (BitCastTerm _ v) = [||bitCastTerm v||]+ liftTyped (BitCastOrTerm _ d v) = [||bitCastOrTerm d v||]+ liftTyped (BVConcatTerm _ arg1 arg2) = [||bvconcatTerm arg1 arg2||]+ liftTyped (BVSelectTerm _ (_ :: TypeRep ix) (_ :: TypeRep w) arg) =+ [||bvselectTerm (Proxy @ix) (Proxy @w) arg||]+ liftTyped (BVExtendTerm _ signed (_ :: TypeRep n) arg) =+ [||bvextendTerm signed (Proxy @n) arg||]+ liftTyped (ApplyTerm _ f arg) = [||applyTerm f arg||]+ 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 (FPTraitTerm _ trait arg) = [||fpTraitTerm trait arg||]+ liftTyped (FdivTerm _ arg1 arg2) = [||fdivTerm arg1 arg2||]+ liftTyped (RecipTerm _ arg) = [||recipTerm arg||]+ liftTyped (FloatingUnaryTerm _ op arg) = [||floatingUnaryTerm op arg||]+ liftTyped (PowerTerm _ arg1 arg2) = [||powerTerm arg1 arg2||]+ liftTyped (FPUnaryTerm _ op arg) = [||fpUnaryTerm op arg||]+ liftTyped (FPBinaryTerm _ op arg1 arg2) = [||fpBinaryTerm op arg1 arg2||]+ liftTyped (FPRoundingUnaryTerm _ op mode arg) = [||fpRoundingUnaryTerm op mode arg||]+ liftTyped (FPRoundingBinaryTerm _ op mode arg1 arg2) = [||fpRoundingBinaryTerm op mode arg1 arg2||]+ liftTyped (FPFMATerm _ mode arg1 arg2 arg3) = [||fpFMATerm mode arg1 arg2 arg3||]+ liftTyped (FromIntegralTerm _ arg) = [||fromIntegralTerm arg||]+ liftTyped (FromFPOrTerm _ d r arg) = [||fromFPOrTerm d r arg||]+ liftTyped (ToFPTerm _ r arg _ _) = [||toFPTerm r arg||]++instance Show (Term ty) where+ show (ConTerm i v) = "ConTerm{id=" ++ show i ++ ", v=" ++ show v ++ "}"+ show (SymTerm i name) =+ "SymTerm{id="+ ++ show i+ ++ ", name="+ ++ show name+ ++ ", type="+ ++ show (typeRep @ty)+ ++ "}"+ show (ForallTerm i sym arg) = "Forall{id=" ++ show i ++ ", sym=" ++ show sym ++ ", arg=" ++ show arg ++ "}"+ show (ExistsTerm i sym arg) = "Exists{id=" ++ show i ++ ", sym=" ++ show sym ++ ", arg=" ++ show arg ++ "}"+ show (UnaryTerm i tag arg) = "Unary{id=" ++ show i ++ ", tag=" ++ show tag ++ ", arg=" ++ show arg ++ "}"+ show (BinaryTerm i tag arg1 arg2) =+ "Binary{id="+ ++ show i+ ++ ", tag="+ ++ show tag+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show (TernaryTerm i tag arg1 arg2 arg3) =+ "Ternary{id="+ ++ show i+ ++ ", tag="+ ++ show tag+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ ", arg3="+ ++ show arg3+ ++ "}"+ show (NotTerm i arg) = "Not{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"+ show (OrTerm i arg1 arg2) = "Or{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (AndTerm i arg1 arg2) = "And{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (EqTerm i arg1 arg2) = "Eqv{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (DistinctTerm i args) = "Distinct{id=" ++ show i ++ ", args=" ++ show args ++ "}"+ show (ITETerm i cond l r) =+ "ITE{id="+ ++ show i+ ++ ", cond="+ ++ show cond+ ++ ", then="+ ++ show l+ ++ ", else="+ ++ show r+ ++ "}"+ show (AddNumTerm i arg1 arg2) = "AddNum{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (NegNumTerm i arg) = "NegNum{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"+ show (MulNumTerm i arg1 arg2) = "MulNum{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (AbsNumTerm i arg) = "AbsNum{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"+ show (SignumNumTerm i arg) = "SignumNum{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"+ show (LtOrdTerm i arg1 arg2) = "LTNum{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (LeOrdTerm i arg1 arg2) = "LENum{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (AndBitsTerm i arg1 arg2) = "AndBits{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (OrBitsTerm i arg1 arg2) = "OrBits{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (XorBitsTerm i arg1 arg2) = "XorBits{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (ComplementBitsTerm i arg) = "ComplementBits{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"+ show (ShiftLeftTerm i arg n) = "ShiftLeft{id=" ++ show i ++ ", arg=" ++ show arg ++ ", n=" ++ show n ++ "}"+ show (ShiftRightTerm i arg n) = "ShiftRight{id=" ++ show i ++ ", arg=" ++ show arg ++ ", n=" ++ show n ++ "}"+ show (RotateLeftTerm i arg n) = "RotateLeft{id=" ++ show i ++ ", arg=" ++ show arg ++ ", n=" ++ show n ++ "}"+ show (RotateRightTerm i arg n) = "RotateRight{id=" ++ show i ++ ", arg=" ++ show arg ++ ", n=" ++ show n ++ "}"+ show (BitCastTerm i arg) = "BitCast{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"+ show (BitCastOrTerm i d arg) = "BitCastOr{id=" ++ show i ++ ", default=" ++ show d ++ ", arg=" ++ show arg ++ "}"+ show (BVConcatTerm i arg1 arg2) = "BVConcat{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (BVSelectTerm i ix w arg) =+ "BVSelect{id=" ++ show i ++ ", ix=" ++ show ix ++ ", w=" ++ show w ++ ", arg=" ++ show arg ++ "}"+ show (BVExtendTerm i signed n arg) =+ "BVExtend{id=" ++ show i ++ ", signed=" ++ show signed ++ ", n=" ++ show n ++ ", arg=" ++ show arg ++ "}"+ show (ApplyTerm i f arg) =+ "Apply{id=" ++ show i ++ ", f=" ++ show f ++ ", arg=" ++ show arg ++ "}"+ 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 (FPTraitTerm i trait arg) =+ "FPTrait{id=" ++ show i ++ ", trait=" ++ show trait ++ ", arg=" ++ show arg ++ "}"+ show (FdivTerm i arg1 arg2) = "Fdiv{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (RecipTerm i arg) = "Recip{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"+ show (FloatingUnaryTerm i op arg) = "FloatingUnary{id=" ++ show i ++ ", op=" ++ show op ++ ", arg=" ++ show arg ++ "}"+ show (PowerTerm i arg1 arg2) = "Power{id=" ++ show i ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (FPUnaryTerm i op arg) = "FPUnary{id=" ++ show i ++ ", op=" ++ show op ++ ", arg=" ++ show arg ++ "}"+ show (FPBinaryTerm i op arg1 arg2) =+ "FPBinary{id=" ++ show i ++ ", op=" ++ show op ++ ", arg1=" ++ show arg1 ++ ", arg2=" ++ show arg2 ++ "}"+ show (FPRoundingUnaryTerm i op mode arg) =+ "FPRoundingUnary{id=" ++ show i ++ ", op=" ++ show op ++ ", mode=" ++ show mode ++ ", arg=" ++ show arg ++ "}"+ show (FPRoundingBinaryTerm i op mode arg1 arg2) =+ "FPRoundingBinary{id="+ ++ show i+ ++ ", op="+ ++ show op+ ++ ", mode="+ ++ show mode+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ "}"+ show (FPFMATerm i mode arg1 arg2 arg3) =+ "FPFMA{id="+ ++ show i+ ++ ", mode="+ ++ show mode+ ++ ", arg1="+ ++ show arg1+ ++ ", arg2="+ ++ show arg2+ ++ ", arg3="+ ++ show arg3+ ++ "}"+ show (FromIntegralTerm i arg) =+ "FromIntegral{id=" ++ show i ++ ", arg=" ++ show arg ++ "}"+ show (FromFPOrTerm i d mode arg) =+ "FromFPTerm{id="+ ++ show i+ ++ ", default="+ ++ show d+ ++ ", mode="+ ++ show mode+ ++ ", arg="+ ++ show arg+ ++ "}"+ show (ToFPTerm i mode arg _ _) =+ "ToFPTerm{id="+ ++ show i+ ++ ", mode="+ ++ show mode+ ++ ", arg="+ ++ show arg+ ++ "}"+ {-# INLINE show #-}++-- | Pretty-print a term, possibly eliding parts of it.+prettyPrintTerm :: Term t -> Doc ann+prettyPrintTerm v =+ column+ ( \c ->+ pageWidth $ \case+ AvailablePerLine i r ->+ if fromIntegral (c + len) > fromIntegral i * r+ then "..."+ else pretty formatted+ Unbounded -> pretty formatted+ )+ where+ formatted = introSupportedPrimConstraint v $ pformatTerm v+ len = length formatted++instance (SupportedPrim t) => Eq (Term t) where+ (==) = (==) `on` identity++instance (SupportedPrim t) => Hashable (Term t) where+ hashWithSalt s t = hashWithSalt s $ identity t++-- | Term without identity (before internalizing).+data UTerm t where+ UConTerm :: (SupportedPrim t) => !t -> UTerm t+ USymTerm :: (SupportedPrim t) => !(TypedSymbol 'AnyKind t) -> UTerm t+ UForallTerm :: (SupportedNonFuncPrim t) => !(TypedSymbol 'ConstantKind t) -> !(Term Bool) -> UTerm Bool+ UExistsTerm :: (SupportedNonFuncPrim t) => !(TypedSymbol 'ConstantKind t) -> !(Term Bool) -> UTerm Bool+ UUnaryTerm :: (UnaryOp tag arg t) => !tag -> !(Term arg) -> UTerm t+ UBinaryTerm ::+ (BinaryOp tag arg1 arg2 t) =>+ !tag ->+ !(Term arg1) ->+ !(Term arg2) ->+ UTerm t+ UTernaryTerm ::+ (TernaryOp tag arg1 arg2 arg3 t) =>+ !tag ->+ !(Term arg1) ->+ !(Term arg2) ->+ !(Term arg3) ->+ UTerm t+ UNotTerm :: !(Term Bool) -> UTerm Bool+ UOrTerm :: !(Term Bool) -> !(Term Bool) -> UTerm Bool+ UAndTerm :: !(Term Bool) -> !(Term Bool) -> UTerm Bool+ UEqTerm :: (SupportedNonFuncPrim t) => !(Term t) -> !(Term t) -> UTerm Bool+ UDistinctTerm :: (SupportedNonFuncPrim t) => !(NonEmpty (Term t)) -> UTerm Bool+ UITETerm ::+ (SupportedPrim t) =>+ !(Term Bool) ->+ !(Term t) ->+ !(Term t) ->+ UTerm t+ UAddNumTerm :: (PEvalNumTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UNegNumTerm :: (PEvalNumTerm t) => !(Term t) -> UTerm t+ UMulNumTerm :: (PEvalNumTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UAbsNumTerm :: (PEvalNumTerm t) => !(Term t) -> UTerm t+ USignumNumTerm :: (PEvalNumTerm t) => !(Term t) -> UTerm t+ ULtOrdTerm :: (PEvalOrdTerm t) => !(Term t) -> !(Term t) -> UTerm Bool+ ULeOrdTerm :: (PEvalOrdTerm t) => !(Term t) -> !(Term t) -> UTerm Bool+ UAndBitsTerm :: (PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UOrBitsTerm :: (PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UXorBitsTerm :: (PEvalBitwiseTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UComplementBitsTerm :: (PEvalBitwiseTerm t) => !(Term t) -> UTerm t+ UShiftLeftTerm :: (PEvalShiftTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UShiftRightTerm :: (PEvalShiftTerm t) => !(Term t) -> !(Term t) -> UTerm t+ URotateLeftTerm :: (PEvalRotateTerm t) => !(Term t) -> !(Term t) -> UTerm t+ URotateRightTerm :: (PEvalRotateTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UBitCastTerm ::+ (PEvalBitCastTerm a b) =>+ !(Term a) ->+ UTerm b+ UBitCastOrTerm ::+ (PEvalBitCastOrTerm a b) =>+ !(Term b) ->+ !(Term a) ->+ UTerm b+ UBVConcatTerm ::+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ KnownNat (l + r),+ 1 <= l,+ 1 <= r,+ 1 <= l + r+ ) =>+ !(Term (bv l)) ->+ !(Term (bv r)) ->+ UTerm (bv (l + r))+ UBVSelectTerm ::+ ( PEvalBVTerm bv,+ KnownNat n,+ KnownNat ix,+ KnownNat w,+ 1 <= n,+ 1 <= w,+ ix + w <= n+ ) =>+ !(TypeRep ix) ->+ !(TypeRep w) ->+ !(Term (bv n)) ->+ UTerm (bv w)+ UBVExtendTerm ::+ (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>+ !Bool ->+ !(TypeRep r) ->+ !(Term (bv l)) ->+ UTerm (bv r)+ UApplyTerm ::+ ( SupportedPrim a,+ SupportedPrim b,+ SupportedPrim f,+ PEvalApplyTerm f a b+ ) =>+ Term f ->+ Term a ->+ UTerm b+ UDivIntegralTerm ::+ (PEvalDivModIntegralTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UModIntegralTerm ::+ (PEvalDivModIntegralTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UQuotIntegralTerm ::+ (PEvalDivModIntegralTerm t) => !(Term t) -> !(Term t) -> UTerm t+ URemIntegralTerm ::+ (PEvalDivModIntegralTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UFPTraitTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb)) =>+ !FPTrait ->+ !(Term (FP eb sb)) ->+ UTerm Bool+ UFdivTerm :: (PEvalFractionalTerm t) => !(Term t) -> !(Term t) -> UTerm t+ URecipTerm :: (PEvalFractionalTerm t) => !(Term t) -> UTerm t+ UFloatingUnaryTerm :: (PEvalFloatingTerm t) => !FloatingUnaryOp -> !(Term t) -> UTerm t+ UPowerTerm :: (PEvalFloatingTerm t) => !(Term t) -> !(Term t) -> UTerm t+ UFPUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb)) =>+ !FPUnaryOp ->+ !(Term (FP eb sb)) ->+ UTerm (FP eb sb)+ UFPBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb)) =>+ !FPBinaryOp ->+ !(Term (FP eb sb)) ->+ !(Term (FP eb sb)) ->+ UTerm (FP eb sb)+ UFPRoundingUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>+ !FPRoundingUnaryOp ->+ !(Term FPRoundingMode) ->+ !(Term (FP eb sb)) ->+ UTerm (FP eb sb)+ UFPRoundingBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>+ !FPRoundingBinaryOp ->+ !(Term FPRoundingMode) ->+ !(Term (FP eb sb)) ->+ !(Term (FP eb sb)) ->+ UTerm (FP eb sb)+ UFPFMATerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>+ !(Term FPRoundingMode) ->+ !(Term (FP eb sb)) ->+ !(Term (FP eb sb)) ->+ !(Term (FP eb sb)) ->+ UTerm (FP eb sb)+ UFromIntegralTerm ::+ (PEvalFromIntegralTerm a b) =>+ !(Term a) ->+ UTerm b+ UFromFPOrTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim FPRoundingMode,+ SupportedPrim (FP eb sb)+ ) =>+ Term a ->+ !(Term FPRoundingMode) ->+ !(Term (FP eb sb)) ->+ UTerm a+ UToFPTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim FPRoundingMode,+ SupportedPrim (FP eb sb)+ ) =>+ !(Term FPRoundingMode) ->+ !(Term a) ->+ Proxy eb ->+ Proxy sb ->+ UTerm (FP eb sb)++eqTypedId :: (TypeRep a, Id) -> (TypeRep b, Id) -> Bool+eqTypedId (a, i1) (b, i2) = i1 == i2 && eqTypeRepBool a b+{-# INLINE eqTypedId #-}++eqHeteroTag :: (Eq a) => (TypeRep a, a) -> (TypeRep b, b) -> Bool+eqHeteroTag (tpa, taga) (tpb, tagb) = eqHeteroRep tpa tpb taga tagb+{-# INLINE eqHeteroTag #-}++-- | Compare two t'TypedSymbol's for equality.+eqHeteroSymbol :: forall ta a tb b. TypedSymbol ta a -> TypedSymbol tb b -> Bool+eqHeteroSymbol (TypedSymbol taga) (TypedSymbol tagb) =+ case eqTypeRep (typeRep @a) (typeRep @b) of+ Just HRefl -> taga == tagb+ Nothing -> False+{-# INLINE eqHeteroSymbol #-}++eqHeteroSymbol0 :: (TypeRep a, TypedSymbol ta a) -> (TypeRep b, TypedSymbol tb b) -> Bool+eqHeteroSymbol0 (tpa, taga) (tpb, tagb) = case eqTypeRep tpb tpa of+ Just HRefl -> unTypedSymbol taga == unTypedSymbol tagb+ Nothing -> False+{-# INLINE eqHeteroSymbol0 #-}++instance (SupportedPrim t) => Interned (Term t) where+ type Uninterned (Term t) = UTerm t+ data Description (Term t) where+ DConTerm :: t -> Description (Term t)+ DSymTerm :: TypedSymbol 'AnyKind t -> Description (Term t)+ DForallTerm :: {-# UNPACK #-} !(TypeRep t, TypedSymbol 'ConstantKind t) -> {-# UNPACK #-} !Id -> Description (Term Bool)+ DExistsTerm :: {-# UNPACK #-} !(TypeRep t, TypedSymbol 'ConstantKind t) -> {-# UNPACK #-} !Id -> Description (Term Bool)+ DUnaryTerm ::+ (Eq tag, Hashable tag) =>+ {-# UNPACK #-} !(TypeRep tag, tag) ->+ {-# UNPACK #-} !(TypeRep arg, Id) ->+ Description (Term t)+ DBinaryTerm ::+ (Eq tag, Hashable tag) =>+ {-# UNPACK #-} !(TypeRep tag, tag) ->+ {-# UNPACK #-} !(TypeRep arg1, Id) ->+ {-# UNPACK #-} !(TypeRep arg2, Id) ->+ Description (Term t)+ DTernaryTerm ::+ (Eq tag, Hashable tag) =>+ {-# UNPACK #-} !(TypeRep tag, tag) ->+ {-# UNPACK #-} !(TypeRep arg1, Id) ->+ {-# UNPACK #-} !(TypeRep arg2, Id) ->+ {-# UNPACK #-} !(TypeRep arg3, Id) ->+ Description (Term t)+ DNotTerm :: {-# UNPACK #-} !Id -> Description (Term Bool)+ DOrTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Bool)+ DAndTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Bool)+ DEqTerm :: TypeRep args -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Bool)+ DDistinctTerm :: TypeRep args -> !(NonEmpty Id) -> Description (Term Bool)+ DITETerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)+ DAddNumTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)+ DNegNumTerm :: {-# UNPACK #-} !Id -> Description (Term t)+ DMulNumTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)+ DAbsNumTerm :: {-# UNPACK #-} !Id -> Description (Term t)+ DSignumNumTerm :: {-# UNPACK #-} !Id -> Description (Term t)+ DLtOrdTerm :: TypeRep args -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Bool)+ DLeOrdTerm :: TypeRep args -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term Bool)+ DAndBitsTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)+ DOrBitsTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)+ DXorBitsTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)+ DComplementBitsTerm :: {-# UNPACK #-} !Id -> Description (Term t)+ DShiftLeftTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)+ DShiftRightTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)+ DRotateLeftTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)+ DRotateRightTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)+ DBVConcatTerm :: TypeRep bv1 -> TypeRep bv2 -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term t)+ DBitCastTerm ::+ !(TypeRep a, Id) ->+ Description (Term b)+ DBitCastOrTerm ::+ Id ->+ !(TypeRep a, Id) ->+ Description (Term b)+ DBVSelectTerm ::+ forall bv (n :: Nat) (w :: Nat) (ix :: Nat).+ !(TypeRep ix) ->+ !(TypeRep (bv n), Id) ->+ Description (Term (bv w))+ DBVExtendTerm ::+ forall bv (l :: Nat) (r :: Nat).+ !Bool ->+ !(TypeRep r) ->+ {-# UNPACK #-} !(TypeRep (bv l), Id) ->+ Description (Term (bv r))+ DApplyTerm ::+ ( PEvalApplyTerm f a b+ ) =>+ {-# UNPACK #-} !(TypeRep f, Id) ->+ {-# UNPACK #-} !(TypeRep a, Id) ->+ Description (Term b)+ 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)+ DFPTraitTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb)) =>+ FPTrait ->+ {-# UNPACK #-} !(TypeRep (FP eb sb), Id) ->+ Description (Term Bool)+ DFdivTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term a)+ DRecipTerm :: {-# UNPACK #-} !Id -> Description (Term a)+ DFloatingUnaryTerm :: FloatingUnaryOp -> {-# UNPACK #-} !Id -> Description (Term a)+ DPowerTerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term a)+ DFPUnaryTerm :: FPUnaryOp -> {-# UNPACK #-} !Id -> Description (Term (FP eb sb))+ DFPBinaryTerm :: FPBinaryOp -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term (FP eb sb))+ DFPRoundingUnaryTerm :: FPRoundingUnaryOp -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term (FP eb sb))+ DFPRoundingBinaryTerm :: FPRoundingBinaryOp -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term (FP eb sb))+ DFPFMATerm :: {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> {-# UNPACK #-} !Id -> Description (Term (FP eb sb))+ DFromIntegralTerm ::+ (PEvalFromIntegralTerm a b) =>+ !(TypeRep a, Id) ->+ Description (Term b)+ DFromFPOrTerm ::+ (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb) =>+ {-# UNPACK #-} !Id ->+ {-# UNPACK #-} !Id ->+ !(TypeRep (FP eb sb), Id) ->+ Description (Term a)+ DToFPTerm ::+ (PEvalIEEEFPConvertibleTerm a, ValidFP eb sb) =>+ {-# UNPACK #-} !Id ->+ !(TypeRep a, Id) ->+ Description (Term (FP eb sb))++ describe (UConTerm v) = DConTerm v+ describe ((USymTerm name) :: UTerm t) = DSymTerm @t name+ describe (UForallTerm (sym :: TypedSymbol 'ConstantKind arg) arg) =+ DForallTerm (typeRep :: TypeRep arg, sym) (identity arg)+ describe (UExistsTerm (sym :: TypedSymbol 'ConstantKind arg) arg) =+ DExistsTerm (typeRep :: TypeRep arg, sym) (identity arg)+ describe ((UUnaryTerm (tag :: tagt) (tm :: Term arg)) :: UTerm t) =+ DUnaryTerm (typeRep, tag) (typeRep :: TypeRep arg, identity tm)+ describe ((UBinaryTerm (tag :: tagt) (tm1 :: Term arg1) (tm2 :: Term arg2)) :: UTerm t) =+ DBinaryTerm @tagt @arg1 @arg2 @t (typeRep, tag) (typeRep, identity tm1) (typeRep, identity tm2)+ describe ((UTernaryTerm (tag :: tagt) (tm1 :: Term arg1) (tm2 :: Term arg2) (tm3 :: Term arg3)) :: UTerm t) =+ DTernaryTerm @tagt @arg1 @arg2 @arg3 @t+ (typeRep, tag)+ (typeRep, identity tm1)+ (typeRep, identity tm2)+ (typeRep, identity tm3)+ describe (UNotTerm arg) = DNotTerm (identity arg)+ describe (UOrTerm arg1 arg2) = DOrTerm (identity arg1) (identity arg2)+ describe (UAndTerm arg1 arg2) = DAndTerm (identity arg1) (identity arg2)+ describe (UEqTerm (arg1 :: Term arg) arg2) = DEqTerm (typeRep :: TypeRep arg) (identity arg1) (identity arg2)+ describe (UDistinctTerm args@((_ :: Term arg) :| _)) =+ DDistinctTerm (typeRep :: TypeRep arg) (identity <$> args)+ describe (UITETerm cond (l :: Term arg) r) = DITETerm (identity cond) (identity l) (identity r)+ describe (UAddNumTerm arg1 arg2) = DAddNumTerm (identity arg1) (identity arg2)+ describe (UNegNumTerm arg) = DNegNumTerm (identity arg)+ describe (UMulNumTerm arg1 arg2) = DMulNumTerm (identity arg1) (identity arg2)+ describe (UAbsNumTerm arg) = DAbsNumTerm (identity arg)+ describe (USignumNumTerm arg) = DSignumNumTerm (identity arg)+ describe (ULtOrdTerm (arg1 :: arg) arg2) = DLtOrdTerm (typeRep :: TypeRep arg) (identity arg1) (identity arg2)+ describe (ULeOrdTerm (arg1 :: arg) arg2) = DLeOrdTerm (typeRep :: TypeRep arg) (identity arg1) (identity arg2)+ describe (UAndBitsTerm arg1 arg2) = DAndBitsTerm (identity arg1) (identity arg2)+ describe (UOrBitsTerm arg1 arg2) = DOrBitsTerm (identity arg1) (identity arg2)+ describe (UXorBitsTerm arg1 arg2) = DXorBitsTerm (identity arg1) (identity arg2)+ describe (UComplementBitsTerm arg) = DComplementBitsTerm (identity arg)+ describe (UShiftLeftTerm arg n) = DShiftLeftTerm (identity arg) (identity n)+ describe (UShiftRightTerm arg n) = DShiftRightTerm (identity arg) (identity n)+ describe (URotateLeftTerm arg n) = DRotateLeftTerm (identity arg) (identity n)+ describe (URotateRightTerm arg n) = DRotateRightTerm (identity arg) (identity n)+ describe (UBitCastTerm (arg :: Term a)) = DBitCastTerm (typeRep :: TypeRep a, identity arg)+ describe (UBitCastOrTerm d (arg :: Term a)) = DBitCastOrTerm (identity d) (typeRep :: TypeRep a, identity arg)+ describe (UBVConcatTerm (arg1 :: bv1) (arg2 :: bv2)) =+ DBVConcatTerm (typeRep :: TypeRep bv1) (typeRep :: TypeRep bv2) (identity arg1) (identity arg2)+ describe (UBVSelectTerm (ix :: TypeRep ix) _ (arg :: Term arg)) =+ DBVSelectTerm ix (typeRep :: TypeRep arg, identity arg)+ describe (UBVExtendTerm signed (n :: TypeRep n) (arg :: Term arg)) =+ DBVExtendTerm signed n (typeRep :: TypeRep arg, identity arg)+ describe (UApplyTerm (f :: Term f) (arg :: Term a)) =+ DApplyTerm (typeRep :: TypeRep f, identity f) (typeRep :: TypeRep a, identity arg)+ 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 (UFPTraitTerm trait (arg :: Term arg)) =+ DFPTraitTerm trait (typeRep :: TypeRep arg, identity arg)+ describe (UFdivTerm arg1 arg2) = DFdivTerm (identity arg1) (identity arg2)+ describe (URecipTerm arg) = DRecipTerm (identity arg)+ describe (UFloatingUnaryTerm op arg) = DFloatingUnaryTerm op (identity arg)+ describe (UPowerTerm arg1 arg2) = DPowerTerm (identity arg1) (identity arg2)+ describe (UFPUnaryTerm op arg) = DFPUnaryTerm op (identity arg)+ describe (UFPBinaryTerm op arg1 arg2) = DFPBinaryTerm op (identity arg1) (identity arg2)+ describe (UFPRoundingUnaryTerm op mode arg) = DFPRoundingUnaryTerm op (identity mode) (identity arg)+ describe (UFPRoundingBinaryTerm op mode arg1 arg2) = DFPRoundingBinaryTerm op (identity mode) (identity arg1) (identity arg2)+ describe (UFPFMATerm mode arg1 arg2 arg3) = DFPFMATerm (identity mode) (identity arg1) (identity arg2) (identity arg3)+ describe (UFromIntegralTerm (arg :: Term a)) = DFromIntegralTerm (typeRep :: TypeRep a, identity arg)+ describe (UFromFPOrTerm d mode (arg :: Term a)) =+ DFromFPOrTerm (identity d) (identity mode) (typeRep :: TypeRep a, identity arg)+ describe (UToFPTerm mode (arg :: Term a) _ _) =+ DToFPTerm (identity mode) (typeRep :: TypeRep a, identity arg)++ identify i = go+ where+ go (UConTerm v) = ConTerm i v+ go (USymTerm v) = SymTerm i v+ go (UForallTerm sym arg) = ForallTerm i sym arg+ go (UExistsTerm sym arg) = ExistsTerm i sym arg+ go (UUnaryTerm tag tm) = UnaryTerm i tag tm+ go (UBinaryTerm tag tm1 tm2) = BinaryTerm i tag tm1 tm2+ go (UTernaryTerm tag tm1 tm2 tm3) = TernaryTerm i tag tm1 tm2 tm3+ go (UNotTerm arg) = NotTerm i arg+ go (UOrTerm arg1 arg2) = OrTerm i arg1 arg2+ go (UAndTerm arg1 arg2) = AndTerm i arg1 arg2+ go (UEqTerm arg1 arg2) = EqTerm i arg1 arg2+ go (UDistinctTerm args) = DistinctTerm i args+ go (UITETerm cond l r) = ITETerm i cond l r+ go (UAddNumTerm arg1 arg2) = AddNumTerm i arg1 arg2+ go (UNegNumTerm arg) = NegNumTerm i arg+ go (UMulNumTerm arg1 arg2) = MulNumTerm i arg1 arg2+ go (UAbsNumTerm arg) = AbsNumTerm i arg+ go (USignumNumTerm arg) = SignumNumTerm i arg+ go (ULtOrdTerm arg1 arg2) = LtOrdTerm i arg1 arg2+ go (ULeOrdTerm arg1 arg2) = LeOrdTerm i arg1 arg2+ go (UAndBitsTerm arg1 arg2) = AndBitsTerm i arg1 arg2+ go (UOrBitsTerm arg1 arg2) = OrBitsTerm i arg1 arg2+ go (UXorBitsTerm arg1 arg2) = XorBitsTerm i arg1 arg2+ go (UComplementBitsTerm arg) = ComplementBitsTerm i arg+ go (UShiftLeftTerm arg n) = ShiftLeftTerm i arg n+ go (UShiftRightTerm arg n) = ShiftRightTerm i arg n+ go (URotateLeftTerm arg n) = RotateLeftTerm i arg n+ go (URotateRightTerm arg n) = RotateRightTerm i arg n+ go (UBitCastTerm arg) = BitCastTerm i arg+ go (UBitCastOrTerm d arg) = BitCastOrTerm i d arg+ go (UBVConcatTerm arg1 arg2) = BVConcatTerm i arg1 arg2+ go (UBVSelectTerm ix w arg) = BVSelectTerm i ix w arg+ go (UBVExtendTerm signed n arg) = BVExtendTerm i signed n arg+ go (UApplyTerm f arg) = ApplyTerm i f arg+ 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 (UFPTraitTerm trait arg) = FPTraitTerm i trait arg+ go (UFdivTerm arg1 arg2) = FdivTerm i arg1 arg2+ go (URecipTerm arg) = RecipTerm i arg+ go (UFloatingUnaryTerm op arg) = FloatingUnaryTerm i op arg+ go (UPowerTerm arg1 arg2) = PowerTerm i arg1 arg2+ go (UFPUnaryTerm op arg) = FPUnaryTerm i op arg+ go (UFPBinaryTerm op arg1 arg2) = FPBinaryTerm i op arg1 arg2+ go (UFPRoundingUnaryTerm op mode arg) = FPRoundingUnaryTerm i op mode arg+ go (UFPRoundingBinaryTerm op mode arg1 arg2) = FPRoundingBinaryTerm i op mode arg1 arg2+ go (UFPFMATerm mode arg1 arg2 arg3) = FPFMATerm i mode arg1 arg2 arg3+ go (UFromIntegralTerm arg) = FromIntegralTerm i arg+ go (UFromFPOrTerm d mode arg) = FromFPOrTerm i d mode arg+ go (UToFPTerm mode arg eb sb) = ToFPTerm i mode arg eb sb+ cache = termCache++instance (SupportedPrim t) => Eq (Description (Term t)) where+ DConTerm (l :: tyl) == DConTerm (r :: tyr) = cast @tyl @tyr l == Just r+ DSymTerm ls == DSymTerm rs = ls == rs+ DForallTerm ls li == DForallTerm rs ri = eqHeteroSymbol0 ls rs && li == ri+ DExistsTerm ls li == DExistsTerm rs ri = eqHeteroSymbol0 ls rs && li == ri+ DUnaryTerm (tagl :: tagl) li == DUnaryTerm (tagr :: tagr) ri = eqHeteroTag tagl tagr && eqTypedId li ri+ DBinaryTerm (tagl :: tagl) li1 li2 == DBinaryTerm (tagr :: tagr) ri1 ri2 =+ eqHeteroTag tagl tagr && eqTypedId li1 ri1 && eqTypedId li2 ri2+ DTernaryTerm (tagl :: tagl) li1 li2 li3 == DTernaryTerm (tagr :: tagr) ri1 ri2 ri3 =+ eqHeteroTag tagl tagr && eqTypedId li1 ri1 && eqTypedId li2 ri2 && eqTypedId li3 ri3+ DNotTerm li == DNotTerm ri = li == ri+ DOrTerm li1 li2 == DOrTerm ri1 ri2 = li1 == ri1 && li2 == ri2+ DAndTerm li1 li2 == DAndTerm ri1 ri2 = li1 == ri1 && li2 == ri2+ DEqTerm lrep li1 li2 == DEqTerm rrep ri1 ri2 = eqTypeRepBool lrep rrep && li1 == ri1 && li2 == ri2+ DDistinctTerm lrep li == DDistinctTerm rrep ri = eqTypeRepBool lrep rrep && li == ri+ DITETerm lc li1 li2 == DITETerm rc ri1 ri2 = lc == rc && li1 == ri1 && li2 == ri2+ DAddNumTerm li1 li2 == DAddNumTerm ri1 ri2 = li1 == ri1 && li2 == ri2+ DNegNumTerm li == DNegNumTerm ri = li == ri+ DMulNumTerm li1 li2 == DMulNumTerm ri1 ri2 = li1 == ri1 && li2 == ri2+ DAbsNumTerm li == DAbsNumTerm ri = li == ri+ DSignumNumTerm li == DSignumNumTerm ri = li == ri+ DLtOrdTerm lrep li1 li2 == DLtOrdTerm rrep ri1 ri2 = eqTypeRepBool lrep rrep && li1 == ri1 && li2 == ri2+ DLeOrdTerm lrep li1 li2 == DLeOrdTerm rrep ri1 ri2 = eqTypeRepBool lrep rrep && li1 == ri1 && li2 == ri2+ DAndBitsTerm li1 li2 == DAndBitsTerm ri1 ri2 = li1 == ri1 && li2 == ri2+ DOrBitsTerm li1 li2 == DOrBitsTerm ri1 ri2 = li1 == ri1 && li2 == ri2+ DXorBitsTerm li1 li2 == DXorBitsTerm ri1 ri2 = li1 == ri1 && li2 == ri2+ DComplementBitsTerm li == DComplementBitsTerm ri = li == ri+ DShiftLeftTerm li ln == DShiftLeftTerm ri rn = li == ri && ln == rn+ DShiftRightTerm li ln == DShiftRightTerm ri rn = li == ri && ln == rn+ DRotateLeftTerm li ln == DRotateLeftTerm ri rn = li == ri && ln == rn+ DRotateRightTerm li ln == DRotateRightTerm ri rn = li == ri && ln == rn+ DBitCastTerm li == DBitCastTerm ri = eqTypedId li ri+ DBitCastOrTerm ld li == DBitCastOrTerm rd ri = ld == rd && eqTypedId li ri+ DBVConcatTerm lrep1 lrep2 li1 li2 == DBVConcatTerm rrep1 rrep2 ri1 ri2 =+ eqTypeRepBool lrep1 rrep1 && eqTypeRepBool lrep2 rrep2 && li1 == ri1 && li2 == ri2+ DBVSelectTerm lix li == DBVSelectTerm rix ri =+ eqTypeRepBool lix rix && eqTypedId li ri+ DBVExtendTerm lIsSigned ln li == DBVExtendTerm rIsSigned rn ri =+ lIsSigned == rIsSigned+ && eqTypeRepBool ln rn+ && eqTypedId li ri+ DApplyTerm lf li == DApplyTerm rf ri = eqTypedId lf rf && eqTypedId li ri+ 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+ DFPTraitTerm lt li == DFPTraitTerm rt ri = lt == rt && eqTypedId li ri+ DFdivTerm li1 li2 == DFdivTerm ri1 ri2 = li1 == ri1 && li2 == ri2+ DRecipTerm li == DRecipTerm ri = li == ri+ DFloatingUnaryTerm lop li == DFloatingUnaryTerm rop ri = lop == rop && li == ri+ DPowerTerm li1 li2 == DPowerTerm ri1 ri2 = li1 == ri1 && li2 == ri2+ DFPUnaryTerm lop li == DFPUnaryTerm rop ri = lop == rop && li == ri+ DFPBinaryTerm lop li1 li2 == DFPBinaryTerm rop ri1 ri2 = lop == rop && li1 == ri1 && li2 == ri2+ DFPRoundingUnaryTerm lop lmode li == DFPRoundingUnaryTerm rop rmode ri =+ lop == rop && lmode == rmode && li == ri+ DFPRoundingBinaryTerm lop lmode li1 li2 == DFPRoundingBinaryTerm rop rmode ri1 ri2 =+ lop == rop && lmode == rmode && li1 == ri1 && li2 == ri2+ DFPFMATerm lmode li1 li2 li3 == DFPFMATerm rmode ri1 ri2 ri3 =+ lmode == rmode && li1 == ri1 && li2 == ri2 && li3 == ri3+ DFromIntegralTerm li == DFromIntegralTerm ri = eqTypedId li ri+ DFromFPOrTerm ld li lai == DFromFPOrTerm rd ri rai = ld == rd && li == ri && eqTypedId lai rai+ DToFPTerm li lai == DToFPTerm ri rai = li == ri && eqTypedId lai rai+ _ == _ = False++instance (SupportedPrim t) => Hashable (Description (Term t)) where+ hashWithSalt s (DConTerm c) = s `hashWithSalt` (0 :: Int) `hashWithSalt` c+ hashWithSalt s (DSymTerm name) = s `hashWithSalt` (1 :: Int) `hashWithSalt` name+ hashWithSalt s (DForallTerm sym id) = s `hashWithSalt` (48 :: Int) `hashWithSalt` sym `hashWithSalt` id+ hashWithSalt s (DExistsTerm sym id) = s `hashWithSalt` (49 :: Int) `hashWithSalt` sym `hashWithSalt` id+ hashWithSalt s (DUnaryTerm tag id1) = s `hashWithSalt` (2 :: Int) `hashWithSalt` tag `hashWithSalt` id1+ hashWithSalt s (DBinaryTerm tag id1 id2) =+ s `hashWithSalt` (3 :: Int) `hashWithSalt` tag `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DTernaryTerm tag id1 id2 id3) =+ s `hashWithSalt` (4 :: Int) `hashWithSalt` tag `hashWithSalt` id1 `hashWithSalt` id2 `hashWithSalt` id3+ hashWithSalt s (DNotTerm id1) = s `hashWithSalt` (5 :: Int) `hashWithSalt` id1+ hashWithSalt s (DOrTerm id1 id2) = s `hashWithSalt` (6 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DAndTerm id1 id2) = s `hashWithSalt` (7 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DEqTerm rep id1 id2) =+ s+ `hashWithSalt` (8 :: Int)+ `hashWithSalt` rep+ `hashWithSalt` id1+ `hashWithSalt` id2+ hashWithSalt s (DDistinctTerm rep ids) = s `hashWithSalt` (54 :: Int) `hashWithSalt` rep `hashWithSalt` ids+ hashWithSalt s (DITETerm idc id1 id2) =+ s+ `hashWithSalt` (9 :: Int)+ `hashWithSalt` idc+ `hashWithSalt` id1+ `hashWithSalt` id2+ hashWithSalt s (DAddNumTerm id1 id2) = s `hashWithSalt` (10 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DNegNumTerm id1) = s `hashWithSalt` (11 :: Int) `hashWithSalt` id1+ hashWithSalt s (DMulNumTerm id1 id2) = s `hashWithSalt` (12 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DAbsNumTerm id1) = s `hashWithSalt` (13 :: Int) `hashWithSalt` id1+ hashWithSalt s (DSignumNumTerm id1) = s `hashWithSalt` (14 :: Int) `hashWithSalt` id1+ hashWithSalt s (DLtOrdTerm rep id1 id2) =+ s `hashWithSalt` (15 :: Int) `hashWithSalt` rep `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DLeOrdTerm rep id1 id2) =+ s `hashWithSalt` (16 :: Int) `hashWithSalt` rep `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DAndBitsTerm id1 id2) = s `hashWithSalt` (17 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DOrBitsTerm id1 id2) = s `hashWithSalt` (18 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DXorBitsTerm id1 id2) = s `hashWithSalt` (19 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DComplementBitsTerm id1) = s `hashWithSalt` (20 :: Int) `hashWithSalt` id1+ hashWithSalt s (DShiftLeftTerm id1 idn) = s `hashWithSalt` (38 :: Int) `hashWithSalt` id1 `hashWithSalt` idn+ hashWithSalt s (DShiftRightTerm id1 idn) = s `hashWithSalt` (39 :: Int) `hashWithSalt` id1 `hashWithSalt` idn+ hashWithSalt s (DRotateLeftTerm id1 idn) = s `hashWithSalt` (40 :: Int) `hashWithSalt` id1 `hashWithSalt` idn+ hashWithSalt s (DRotateRightTerm id1 idn) = s `hashWithSalt` (41 :: Int) `hashWithSalt` id1 `hashWithSalt` idn+ hashWithSalt s (DBitCastTerm id) = s `hashWithSalt` (49 :: Int) `hashWithSalt` id+ hashWithSalt s (DBitCastOrTerm did id) = s `hashWithSalt` (50 :: Int) `hashWithSalt` did `hashWithSalt` id+ hashWithSalt s (DBVConcatTerm rep1 rep2 id1 id2) =+ s `hashWithSalt` (25 :: Int) `hashWithSalt` rep1 `hashWithSalt` rep2 `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DBVSelectTerm ix id1) = s `hashWithSalt` (26 :: Int) `hashWithSalt` ix `hashWithSalt` id1+ hashWithSalt s (DBVExtendTerm signed n id1) =+ s+ `hashWithSalt` (27 :: Int)+ `hashWithSalt` signed+ `hashWithSalt` n+ `hashWithSalt` id1+ hashWithSalt s (DDivIntegralTerm id1 id2) = s `hashWithSalt` (30 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DModIntegralTerm id1 id2) = s `hashWithSalt` (31 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DQuotIntegralTerm id1 id2) = s `hashWithSalt` (32 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DRemIntegralTerm id1 id2) = s `hashWithSalt` (33 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DApplyTerm id1 id2) = s `hashWithSalt` (38 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DFPTraitTerm trait id1) = s `hashWithSalt` (39 :: Int) `hashWithSalt` trait `hashWithSalt` id1+ hashWithSalt s (DFdivTerm id1 id2) = s `hashWithSalt` (40 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DRecipTerm id1) = s `hashWithSalt` (41 :: Int) `hashWithSalt` id1+ hashWithSalt s (DFloatingUnaryTerm op id1) = s `hashWithSalt` (42 :: Int) `hashWithSalt` op `hashWithSalt` id1+ hashWithSalt s (DPowerTerm id1 id2) = s `hashWithSalt` (48 :: Int) `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DFPUnaryTerm op id1) = s `hashWithSalt` (43 :: Int) `hashWithSalt` op `hashWithSalt` id1+ hashWithSalt s (DFPBinaryTerm op id1 id2) = s `hashWithSalt` (44 :: Int) `hashWithSalt` op `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DFPRoundingUnaryTerm op mode id1) =+ s `hashWithSalt` (45 :: Int) `hashWithSalt` op `hashWithSalt` mode `hashWithSalt` id1+ hashWithSalt s (DFPRoundingBinaryTerm op mode id1 id2) =+ s `hashWithSalt` (46 :: Int) `hashWithSalt` op `hashWithSalt` mode `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DFPFMATerm mode id1 id2 id3) =+ s `hashWithSalt` (47 :: Int) `hashWithSalt` mode `hashWithSalt` id1 `hashWithSalt` id2 `hashWithSalt` id3+ hashWithSalt s (DFromIntegralTerm id0) = s `hashWithSalt` (51 :: Int) `hashWithSalt` id0+ hashWithSalt s (DFromFPOrTerm id0 id1 id2) = s `hashWithSalt` (52 :: Int) `hashWithSalt` id0 `hashWithSalt` id1 `hashWithSalt` id2+ hashWithSalt s (DToFPTerm id0 id1) = s `hashWithSalt` (53 :: Int) `hashWithSalt` id0 `hashWithSalt` id1++internTerm :: forall t. (SupportedPrim t) => Uninterned (Term t) -> Term t+internTerm !bt = unsafeDupablePerformIO $ atomicModifyIORef' slot go+ where+ slot = getCache cache ! r+ !dt = describe bt+ !hdt = hash dt+ !wid = cacheWidth dt+ r = hdt `mod` wid+ go (CacheState i m) = case M.lookup dt m of+ Nothing -> let t = identify (wid * i + r) bt in (CacheState (i + 1) (M.insert dt t m), t)+ Just t -> (CacheState i m, t)++-- | Construct and internalizing a 'UnaryTerm'.+constructUnary ::+ forall tag arg t.+ (SupportedPrim t, UnaryOp tag arg t, Typeable tag, Typeable t, Show tag) =>+ tag ->+ Term arg ->+ Term t+constructUnary tag tm = let x = internTerm $ UUnaryTerm tag tm in x+{-# INLINE constructUnary #-}++-- | Construct and internalizing a 'BinaryTerm'.+constructBinary ::+ forall tag arg1 arg2 t.+ (SupportedPrim t, BinaryOp tag arg1 arg2 t, Typeable tag, Typeable t, Show tag) =>+ tag ->+ Term arg1 ->+ Term arg2 ->+ Term t+constructBinary tag tm1 tm2 = internTerm $ UBinaryTerm tag tm1 tm2+{-# INLINE constructBinary #-}++-- | Construct and internalizing a 'TernaryTerm'.+constructTernary ::+ forall tag arg1 arg2 arg3 t.+ (SupportedPrim t, TernaryOp tag arg1 arg2 arg3 t, Typeable tag, Typeable t, Show tag) =>+ tag ->+ Term arg1 ->+ Term arg2 ->+ Term arg3 ->+ Term t+constructTernary tag tm1 tm2 tm3 = internTerm $ UTernaryTerm tag tm1 tm2 tm3+{-# INLINE constructTernary #-}++-- | Construct and internalizing a 'ConTerm'.+conTerm :: (SupportedPrim t, Typeable t, Hashable t, Eq t, Show t) => t -> Term t+conTerm t = internTerm $ UConTerm t+{-# INLINE conTerm #-}++-- | Construct and internalizing a 'SymTerm'.+symTerm :: forall t. (SupportedPrim t, Typeable t) => Symbol -> Term t+symTerm t = internTerm $ USymTerm $ TypedSymbol t+{-# INLINE symTerm #-}++-- | Construct and internalizing a 'ForallTerm'.+forallTerm :: (SupportedNonFuncPrim t, Typeable t) => TypedSymbol 'ConstantKind t -> Term Bool -> Term Bool+forallTerm sym arg = internTerm $ UForallTerm sym arg+{-# INLINE forallTerm #-}++-- | Construct and internalizing a 'ExistsTerm'.+existsTerm :: (SupportedNonFuncPrim t, Typeable t) => TypedSymbol 'ConstantKind t -> Term Bool -> Term Bool+existsTerm sym arg = internTerm $ UExistsTerm sym arg+{-# INLINE existsTerm #-}++-- | Construct and internalizing a 'SymTerm' with an identifier, using simple+-- symbols.+ssymTerm :: (SupportedPrim t, Typeable t) => Identifier -> Term t+ssymTerm = symTerm . SimpleSymbol+{-# INLINE ssymTerm #-}++-- | Construct and internalizing a 'SymTerm' with an identifier and an index,+-- using indexed symbols.+isymTerm :: (SupportedPrim t, Typeable t) => Identifier -> Int -> Term t+isymTerm str idx = symTerm $ IndexedSymbol str idx+{-# INLINE isymTerm #-}++-- | Construct and internalizing a 'NotTerm'.+notTerm :: Term Bool -> Term Bool+notTerm = internTerm . UNotTerm+{-# INLINE notTerm #-}++-- | Construct and internalizing a 'OrTerm'.+orTerm :: Term Bool -> Term Bool -> Term Bool+orTerm l r = internTerm $ UOrTerm l r+{-# INLINE orTerm #-}++-- | Construct and internalizing a 'AndTerm'.+andTerm :: Term Bool -> Term Bool -> Term Bool+andTerm l r = internTerm $ UAndTerm l r+{-# INLINE andTerm #-}++-- | Construct and internalizing a 'EqTerm'.+eqTerm :: (SupportedNonFuncPrim a) => Term a -> Term a -> Term Bool+eqTerm l r = internTerm $ UEqTerm l r+{-# INLINE eqTerm #-}++-- | Construct and internalizing a 'DistinctTerm'.+distinctTerm :: (SupportedNonFuncPrim a) => NonEmpty (Term a) -> Term Bool+distinctTerm args = internTerm $ UDistinctTerm args+{-# INLINE distinctTerm #-}++-- | Construct and internalizing a 'ITETerm'.+iteTerm :: (SupportedPrim a) => Term Bool -> Term a -> Term a -> Term a+iteTerm c l r = internTerm $ UITETerm c l r+{-# INLINE iteTerm #-}++-- | Construct and internalizing a 'AddNumTerm'.+addNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a+addNumTerm l r = internTerm $ UAddNumTerm l r+{-# INLINE addNumTerm #-}++-- | Construct and internalizing a 'NegNumTerm'.+negNumTerm :: (PEvalNumTerm a) => Term a -> Term a+negNumTerm = internTerm . UNegNumTerm+{-# INLINE negNumTerm #-}++-- | Construct and internalizing a 'MulNumTerm'.+mulNumTerm :: (PEvalNumTerm a) => Term a -> Term a -> Term a+mulNumTerm l r = internTerm $ UMulNumTerm l r+{-# INLINE mulNumTerm #-}++-- | Construct and internalizing a 'AbsNumTerm'.+absNumTerm :: (PEvalNumTerm a) => Term a -> Term a+absNumTerm = internTerm . UAbsNumTerm+{-# INLINE absNumTerm #-}++-- | Construct and internalizing a 'SignumNumTerm'.+signumNumTerm :: (PEvalNumTerm a) => Term a -> Term a+signumNumTerm = internTerm . USignumNumTerm+{-# INLINE signumNumTerm #-}++-- | Construct and internalizing a 'LtOrdTerm'.+ltOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool+ltOrdTerm l r = internTerm $ ULtOrdTerm l r+{-# INLINE ltOrdTerm #-}++-- | Construct and internalizing a 'LeOrdTerm'.+leOrdTerm :: (PEvalOrdTerm a) => Term a -> Term a -> Term Bool+leOrdTerm l r = internTerm $ ULeOrdTerm l r+{-# INLINE leOrdTerm #-}++-- | Construct and internalizing a 'AndBitsTerm'.+andBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a+andBitsTerm l r = internTerm $ UAndBitsTerm l r+{-# INLINE andBitsTerm #-}++-- | Construct and internalizing a 'OrBitsTerm'.+orBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a+orBitsTerm l r = internTerm $ UOrBitsTerm l r+{-# INLINE orBitsTerm #-}++-- | Construct and internalizing a 'XorBitsTerm'.+xorBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a -> Term a+xorBitsTerm l r = internTerm $ UXorBitsTerm l r+{-# INLINE xorBitsTerm #-}++-- | Construct and internalizing a 'ComplementBitsTerm'.+complementBitsTerm :: (PEvalBitwiseTerm a) => Term a -> Term a+complementBitsTerm = internTerm . UComplementBitsTerm+{-# INLINE complementBitsTerm #-}++-- | Construct and internalizing a 'ShiftLeftTerm'.+shiftLeftTerm :: (PEvalShiftTerm a) => Term a -> Term a -> Term a+shiftLeftTerm t n = internTerm $ UShiftLeftTerm t n+{-# INLINE shiftLeftTerm #-}++-- | Construct and internalizing a 'ShiftRightTerm'.+shiftRightTerm :: (PEvalShiftTerm a) => Term a -> Term a -> Term a+shiftRightTerm t n = internTerm $ UShiftRightTerm t n+{-# INLINE shiftRightTerm #-}++-- | Construct and internalizing a 'RotateLeftTerm'.+rotateLeftTerm :: (PEvalRotateTerm a) => Term a -> Term a -> Term a+rotateLeftTerm t n = internTerm $ URotateLeftTerm t n+{-# INLINE rotateLeftTerm #-}++-- | Construct and internalizing a 'RotateRightTerm'.+rotateRightTerm :: (PEvalRotateTerm a) => Term a -> Term a -> Term a+rotateRightTerm t n = internTerm $ URotateRightTerm t n+{-# INLINE rotateRightTerm #-}++-- | Construct and internalizing a 'BitCastTerm'.+bitCastTerm ::+ (PEvalBitCastTerm a b) =>+ Term a ->+ Term b+bitCastTerm = internTerm . UBitCastTerm++-- | Construct and internalizing a 'BitCastOrTerm'.+bitCastOrTerm ::+ (PEvalBitCastOrTerm a b) =>+ Term b ->+ Term a ->+ Term b+bitCastOrTerm d = internTerm . UBitCastOrTerm d++-- | Construct and internalizing a 'BVConcatTerm'.+bvconcatTerm ::+ ( PEvalBVTerm bv,+ KnownNat l,+ KnownNat r,+ KnownNat (l + r),+ 1 <= l,+ 1 <= r,+ 1 <= l + r+ ) =>+ Term (bv l) ->+ Term (bv r) ->+ Term (bv (l + r))+bvconcatTerm l r = internTerm $ UBVConcatTerm l r+{-# INLINE bvconcatTerm #-}++-- | Construct and internalizing a 'BVSelectTerm'.+bvselectTerm ::+ forall bv n ix w p q.+ ( PEvalBVTerm bv,+ KnownNat n,+ KnownNat ix,+ KnownNat w,+ 1 <= n,+ 1 <= w,+ ix + w <= n+ ) =>+ p ix ->+ q w ->+ Term (bv n) ->+ Term (bv w)+bvselectTerm _ _ v = internTerm $ UBVSelectTerm (typeRep @ix) (typeRep @w) v+{-# INLINE bvselectTerm #-}++-- | Construct and internalizing a 'BVExtendTerm'.+bvextendTerm ::+ forall bv l r proxy.+ (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>+ Bool ->+ proxy r ->+ Term (bv l) ->+ Term (bv r)+bvextendTerm signed _ v = internTerm $ UBVExtendTerm signed (typeRep @r) v+{-# INLINE bvextendTerm #-}++-- | Construct and internalizing a 'BVExtendTerm' with sign extension.+bvsignExtendTerm ::+ forall bv l r proxy.+ (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>+ proxy r ->+ Term (bv l) ->+ Term (bv r)+bvsignExtendTerm _ v = internTerm $ UBVExtendTerm True (typeRep @r) v+{-# INLINE bvsignExtendTerm #-}++-- | Construct and internalizing a 'BVExtendTerm' with zero extension.+bvzeroExtendTerm ::+ forall bv l r proxy.+ (PEvalBVTerm bv, KnownNat l, KnownNat r, 1 <= l, 1 <= r, l <= r) =>+ proxy r ->+ Term (bv l) ->+ Term (bv r)+bvzeroExtendTerm _ v = internTerm $ UBVExtendTerm False (typeRep @r) v+{-# INLINE bvzeroExtendTerm #-}++-- | Construct and internalizing a 'ApplyTerm'.+applyTerm ::+ (SupportedPrim a, SupportedPrim b, SupportedPrim f, PEvalApplyTerm f a b) =>+ Term f ->+ Term a ->+ Term b+applyTerm f a = internTerm $ UApplyTerm f a+{-# INLINE applyTerm #-}++-- | Construct and internalizing a 'DivIntegralTerm'.+divIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a+divIntegralTerm l r = internTerm $ UDivIntegralTerm l r+{-# INLINE divIntegralTerm #-}++-- | Construct and internalizing a 'ModIntegralTerm'.+modIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a+modIntegralTerm l r = internTerm $ UModIntegralTerm l r+{-# INLINE modIntegralTerm #-}++-- | Construct and internalizing a 'QuotIntegralTerm'.+quotIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a+quotIntegralTerm l r = internTerm $ UQuotIntegralTerm l r+{-# INLINE quotIntegralTerm #-}++-- | Construct and internalizing a 'RemIntegralTerm'.+remIntegralTerm :: (PEvalDivModIntegralTerm a) => Term a -> Term a -> Term a+remIntegralTerm l r = internTerm $ URemIntegralTerm l r+{-# INLINE remIntegralTerm #-}++-- | Construct and internalizing a 'FPTraitTerm'.+fpTraitTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb)) =>+ FPTrait ->+ Term (FP eb sb) ->+ Term Bool+fpTraitTerm trait v = internTerm $ UFPTraitTerm trait v++-- | Construct and internalizing a 'FdivTerm'.+fdivTerm :: (PEvalFractionalTerm a) => Term a -> Term a -> Term a+fdivTerm l r = internTerm $ UFdivTerm l r+{-# INLINE fdivTerm #-}++-- | Construct and internalizing a 'RecipTerm'.+recipTerm :: (PEvalFractionalTerm a) => Term a -> Term a+recipTerm = internTerm . URecipTerm+{-# INLINE recipTerm #-}++-- | Construct and internalizing a 'FloatingUnaryTerm'.+floatingUnaryTerm :: (PEvalFloatingTerm a) => FloatingUnaryOp -> Term a -> Term a+floatingUnaryTerm op = internTerm . UFloatingUnaryTerm op+{-# INLINE floatingUnaryTerm #-}++-- | Construct and internalizing a 'PowerTerm'.+powerTerm :: (PEvalFloatingTerm a) => Term a -> Term a -> Term a+powerTerm l r = internTerm $ UPowerTerm l r+{-# INLINE powerTerm #-}++-- | Construct and internalizing a 'FPUnaryTerm'.+fpUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb)) =>+ FPUnaryOp ->+ Term (FP eb sb) ->+ Term (FP eb sb)+fpUnaryTerm op v = internTerm $ UFPUnaryTerm op v++-- | Construct and internalizing a 'FPBinaryTerm'.+fpBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb)) =>+ FPBinaryOp ->+ Term (FP eb sb) ->+ Term (FP eb sb) ->+ Term (FP eb sb)+fpBinaryTerm op l r = internTerm $ UFPBinaryTerm op l r++-- | Construct and internalizing a 'FPRoundingUnaryTerm'.+fpRoundingUnaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>+ FPRoundingUnaryOp ->+ Term FPRoundingMode ->+ Term (FP eb sb) ->+ Term (FP eb sb)+fpRoundingUnaryTerm op mode v = internTerm $ UFPRoundingUnaryTerm op mode v++-- | Construct and internalizing a 'FPRoundingBinaryTerm'.+fpRoundingBinaryTerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>+ FPRoundingBinaryOp ->+ Term FPRoundingMode ->+ Term (FP eb sb) ->+ Term (FP eb sb) ->+ Term (FP eb sb)+fpRoundingBinaryTerm op mode l r = internTerm $ UFPRoundingBinaryTerm op mode l r++-- | Construct and internalizing a 'FPFMATerm'.+fpFMATerm ::+ (ValidFP eb sb, SupportedPrim (FP eb sb), SupportedPrim FPRoundingMode) =>+ Term FPRoundingMode ->+ Term (FP eb sb) ->+ Term (FP eb sb) ->+ Term (FP eb sb) ->+ Term (FP eb sb)+fpFMATerm mode l r s = internTerm $ UFPFMATerm mode l r s++-- | Construct and internalizing a 'FromIntegralTerm'.+fromIntegralTerm :: (PEvalFromIntegralTerm a b) => Term a -> Term b+fromIntegralTerm = internTerm . UFromIntegralTerm++-- | Construct and internalizing a 'FromFPOrTerm'.+fromFPOrTerm ::+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim FPRoundingMode,+ SupportedPrim (FP eb sb)+ ) =>+ Term a ->+ Term FPRoundingMode ->+ Term (FP eb sb) ->+ Term a+fromFPOrTerm d r f = internTerm $ UFromFPOrTerm d r f++-- | Construct and internalizing a 'ToFPTerm'.+toFPTerm ::+ forall a eb sb.+ ( PEvalIEEEFPConvertibleTerm a,+ ValidFP eb sb,+ SupportedPrim FPRoundingMode,+ SupportedPrim (FP eb sb)+ ) =>+ Term FPRoundingMode ->+ Term a ->+ Term (FP eb sb)+toFPTerm r f = internTerm $ UToFPTerm r f (Proxy @eb) (Proxy @sb)++-- Support for boolean type+defaultValueForBool :: Bool+defaultValueForBool = False++defaultValueForBoolDyn :: ModelValue+defaultValueForBoolDyn = toModelValue defaultValueForBool++-- | Construct and internalizing 'True' term.+trueTerm :: Term Bool+trueTerm = conTerm True+{-# INLINE trueTerm #-}++-- | Construct and internalizing 'False' term.+falseTerm :: Term Bool+falseTerm = conTerm False+{-# INLINE falseTerm #-}++boolConTermView :: forall a. Term a -> Maybe Bool+boolConTermView (ConTerm _ b) = cast b+boolConTermView _ = Nothing+{-# INLINE boolConTermView #-}++-- | Pattern matcher for concrete 'Bool' terms.+pattern BoolConTerm :: Bool -> Term a+pattern BoolConTerm b <- (boolConTermView -> Just b)++-- | Pattern matcher for 'True' term.+pattern TrueTerm :: Term a+pattern TrueTerm <- BoolConTerm True++-- | Pattern matcher for 'False' term.+pattern FalseTerm :: Term a+pattern FalseTerm <- BoolConTerm False++boolTermView :: forall a. Term a -> Maybe (Term Bool)+boolTermView t = introSupportedPrimConstraint t $ cast t+{-# INLINE boolTermView #-}++-- | Pattern matcher for 'Bool' terms.+pattern BoolTerm :: Term Bool -> Term a+pattern BoolTerm b <- (boolTermView -> Just b)++-- | Partial evaluation for not terms.+pevalNotTerm :: Term Bool -> Term Bool+pevalNotTerm (NotTerm _ tm) = tm+pevalNotTerm (ConTerm _ a) = if a then falseTerm else trueTerm+pevalNotTerm (OrTerm _ (NotTerm _ n1) n2) = pevalAndTerm n1 (pevalNotTerm n2)+pevalNotTerm (OrTerm _ (DistinctTerm _ (n1 :| [n2])) n3) =+ pevalAndTerm (pevalEqTerm n1 n2) (pevalNotTerm n3)+pevalNotTerm (OrTerm _ n1 (NotTerm _ n2)) = pevalAndTerm (pevalNotTerm n1) n2+pevalNotTerm (OrTerm _ n1 (DistinctTerm _ (n2 :| [n3]))) =+ pevalAndTerm (pevalNotTerm n1) (pevalEqTerm n2 n3)+pevalNotTerm (AndTerm _ (NotTerm _ n1) n2) = pevalOrTerm n1 (pevalNotTerm n2)+pevalNotTerm (AndTerm _ (DistinctTerm _ (n1 :| [n2])) n3) =+ pevalOrTerm (pevalEqTerm n1 n2) (pevalNotTerm n3)+pevalNotTerm (AndTerm _ n1 (NotTerm _ n2)) = pevalOrTerm (pevalNotTerm n1) n2+pevalNotTerm (AndTerm _ n1 (DistinctTerm _ (n2 :| [n3]))) =+ pevalOrTerm (pevalNotTerm n1) $ pevalEqTerm n2 n3+pevalNotTerm (EqTerm _ a b) = distinctTerm $ a :| [b]+pevalNotTerm (DistinctTerm _ (a :| [b])) = eqTerm a b+pevalNotTerm tm = notTerm tm+{-# INLINEABLE pevalNotTerm #-}++orEqFirst :: Term Bool -> Term Bool -> Bool+orEqFirst _ (ConTerm _ False) = True+orEqFirst+ (DistinctTerm _ ((e1 :: Term a) :| [ec1@(ConTerm _ _) :: Term b]))+ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b)))+ | e1 == e2 && ec1 /= ec2 = True+-- orEqFirst+-- (NotTerm _ (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b)))+-- (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b)))+-- | e1 == e2 && ec1 /= ec2 = True+orEqFirst x y+ | x == y = True+ | otherwise = False+{-# INLINE orEqFirst #-}++orEqTrue :: Term Bool -> Term Bool -> Bool+orEqTrue (ConTerm _ True) _ = True+orEqTrue _ (ConTerm _ True) = True+-- orEqTrue (NotTerm _ e1) (NotTerm _ e2) = andEqFalse e1 e2+orEqTrue+ (DistinctTerm _ ((e1 :: Term a) :| [ec1@(ConTerm _ _) :: Term b]))+ (DistinctTerm _ ((Dyn (e2 :: Term a)) :| [Dyn (ec2@(ConTerm _ _) :: Term b)]))+ | e1 == e2 && ec1 /= ec2 = True+-- orEqTrue+-- (NotTerm _ (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b)))+-- (NotTerm _ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b))))+-- | e1 == e2 && ec1 /= ec2 = True+orEqTrue (NotTerm _ l) r | l == r = True+orEqTrue l (NotTerm _ r) | l == r = True+orEqTrue _ _ = False+{-# INLINE orEqTrue #-}++andEqFirst :: Term Bool -> Term Bool -> Bool+andEqFirst _ (ConTerm _ True) = True+-- andEqFirst x (NotTerm _ y) = andEqFalse x y+andEqFirst+ (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b))+ (DistinctTerm _ ((Dyn (e2 :: Term a)) :| [Dyn (ec2@(ConTerm _ _) :: Term b)]))+ | e1 == e2 && ec1 /= ec2 = True+-- andEqFirst+-- (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b))+-- (NotTerm _ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b))))+-- | e1 == e2 && ec1 /= ec2 = True+andEqFirst x y+ | x == y = True+ | otherwise = False+{-# INLINE andEqFirst #-}++andEqFalse :: Term Bool -> Term Bool -> Bool+andEqFalse (ConTerm _ False) _ = True+andEqFalse _ (ConTerm _ False) = True+-- andEqFalse (NotTerm _ e1) (NotTerm _ e2) = orEqTrue e1 e2+andEqFalse+ (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b))+ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b)))+ | e1 == e2 && ec1 /= ec2 = True+andEqFalse (NotTerm _ x) y | x == y = True+andEqFalse x (NotTerm _ y) | x == y = True+andEqFalse _ _ = False+{-# INLINE andEqFalse #-}++-- | Partial evaluation for or terms.+pevalOrTerm :: Term Bool -> Term Bool -> Term Bool+pevalOrTerm l r+ | orEqTrue l r = trueTerm+ | orEqFirst l r = l+ | orEqFirst r l = r+pevalOrTerm l r@(OrTerm _ r1 r2)+ | orEqTrue l r1 = trueTerm+ | orEqTrue l r2 = trueTerm+ | orEqFirst r1 l = r+ | orEqFirst r2 l = r+ | orEqFirst l r1 = pevalOrTerm l r2+ | orEqFirst l r2 = pevalOrTerm l r1+pevalOrTerm l@(OrTerm _ l1 l2) r+ | orEqTrue l1 r = trueTerm+ | orEqTrue l2 r = trueTerm+ | orEqFirst l1 r = l+ | orEqFirst l2 r = l+ | orEqFirst r l1 = pevalOrTerm l2 r+ | orEqFirst r l2 = pevalOrTerm l1 r+pevalOrTerm l (AndTerm _ r1 r2)+ | orEqFirst l r1 = l+ | orEqFirst l r2 = l+ | orEqTrue l r1 = pevalOrTerm l r2+ | orEqTrue l r2 = pevalOrTerm l r1+pevalOrTerm (AndTerm _ l1 l2) r+ | orEqFirst r l1 = r+ | orEqFirst r l2 = r+ | orEqTrue l1 r = pevalOrTerm l2 r+ | orEqTrue l2 r = pevalOrTerm l1 r+pevalOrTerm+ (AndTerm _ nl1@(NotTerm _ l1) l2)+ (EqTerm _ (Dyn (e1 :: Term Bool)) (Dyn (e2 :: Term Bool)))+ | l1 == e1 && l2 == e2 = pevalOrTerm nl1 l2+pevalOrTerm (NotTerm _ nl) (NotTerm _ nr) = pevalNotTerm $ pevalAndTerm nl nr+pevalOrTerm l r = orTerm l r+{-# INLINEABLE pevalOrTerm #-}++-- | Partial evaluation for and terms.+pevalAndTerm :: Term Bool -> Term Bool -> Term Bool+pevalAndTerm l r+ | andEqFalse l r = falseTerm+ | andEqFirst l r = l+ | andEqFirst r l = r+pevalAndTerm l r@(AndTerm _ r1 r2)+ | andEqFalse l r1 = falseTerm+ | andEqFalse l r2 = falseTerm+ | andEqFirst r1 l = r+ | andEqFirst r2 l = r+ | andEqFirst l r1 = pevalAndTerm l r2+ | andEqFirst l r2 = pevalAndTerm l r1+pevalAndTerm l@(AndTerm _ l1 l2) r+ | andEqFalse l1 r = falseTerm+ | andEqFalse l2 r = falseTerm+ | andEqFirst l1 r = l+ | andEqFirst l2 r = l+ | andEqFirst r l1 = pevalAndTerm l2 r+ | andEqFirst r l2 = pevalAndTerm l1 r+pevalAndTerm l (OrTerm _ r1 r2)+ | andEqFirst l r1 = l+ | andEqFirst l r2 = l+ | andEqFalse l r1 = pevalAndTerm l r2+ | andEqFalse l r2 = pevalAndTerm l r1+pevalAndTerm (OrTerm _ l1 l2) r+ | andEqFirst r l1 = r+ | andEqFirst r l2 = r+ | andEqFalse l1 r = pevalAndTerm l2 r+ | andEqFalse l2 r = pevalAndTerm l1 r+pevalAndTerm+ (OrTerm _ l1 nl2@(NotTerm _ l2))+ (NotTerm _ (EqTerm _ (Dyn (e1 :: Term Bool)) (Dyn (e2 :: Term Bool))))+ | l1 == e1 && l2 == e2 = pevalAndTerm l1 nl2+pevalAndTerm (NotTerm _ nl) (NotTerm _ nr) = pevalNotTerm $ pevalOrTerm nl nr+pevalAndTerm l r = andTerm l r+{-# INLINEABLE pevalAndTerm #-}++-- | Partial evaluation for imply terms.+pevalImplyTerm :: Term Bool -> Term Bool -> Term Bool+pevalImplyTerm l = pevalOrTerm (pevalNotTerm l)++-- | Partial evaluation for xor terms.+pevalXorTerm :: Term Bool -> Term Bool -> Term Bool+pevalXorTerm l r = pevalOrTerm (pevalAndTerm (pevalNotTerm l) r) (pevalAndTerm l (pevalNotTerm r))++pevalImpliesTerm :: Term Bool -> Term Bool -> Bool+pevalImpliesTerm (ConTerm _ False) _ = True+pevalImpliesTerm _ (ConTerm _ True) = True+pevalImpliesTerm+ (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b))+ (DistinctTerm _ ((Dyn (e2 :: Term a)) :| [(Dyn (ec2@(ConTerm _ _) :: Term b))]))+ | e1 == e2 && ec1 /= ec2 = True+-- pevalImpliesTerm+-- (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b))+-- (NotTerm _ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b))))+-- | e1 == e2 && ec1 /= ec2 = True+pevalImpliesTerm a b+ | a == b = True+ | otherwise = False+{-# INLINE pevalImpliesTerm #-}++pevalITEBoolLeftNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolLeftNot cond nIfTrue ifFalse+ -- need test+ | cond == nIfTrue = Just $ pevalAndTerm (pevalNotTerm cond) ifFalse+ | otherwise = case nIfTrue of+ AndTerm _ nt1 nt2 -> ra+ where+ ra+ | pevalImpliesTerm cond nt1 =+ Just $ pevalITETerm cond (pevalNotTerm nt2) ifFalse+ | pevalImpliesTerm cond nt2 =+ Just $ pevalITETerm cond (pevalNotTerm nt1) ifFalse+ | pevalImpliesTerm cond (pevalNotTerm nt1)+ || pevalImpliesTerm cond (pevalNotTerm nt2) =+ Just $ pevalOrTerm cond ifFalse+ | otherwise = Nothing+ OrTerm _ nt1 nt2 -> ra+ where+ ra+ | pevalImpliesTerm cond nt1 || pevalImpliesTerm cond nt2 =+ Just $ pevalAndTerm (pevalNotTerm cond) ifFalse+ | pevalImpliesTerm cond (pevalNotTerm nt1) =+ Just $ pevalITETerm cond (pevalNotTerm nt2) ifFalse+ | pevalImpliesTerm cond (pevalNotTerm nt2) =+ Just $ pevalITETerm cond (pevalNotTerm nt1) ifFalse+ | otherwise = Nothing+ _ -> Nothing++pevalITEBoolBothNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolBothNot cond nIfTrue nIfFalse =+ Just $ pevalNotTerm $ pevalITETerm cond nIfTrue nIfFalse++pevalITEBoolRightNot :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolRightNot cond ifTrue nIfFalse+ -- need test+ | cond == nIfFalse = Just $ pevalOrTerm (pevalNotTerm cond) ifTrue+ | otherwise = Nothing -- need work++pevalInferImplies :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalInferImplies cond (NotTerm _ nt1) _ falseRes+ | cond == nt1 = Just falseRes+ | otherwise = Nothing+-- \| otherwise = case (cond, nt1) of+-- ( EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b),+-- EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b))+-- )+-- | e1 == e2 && ec1 /= ec2 -> Just trueRes+-- _ -> Nothing+pevalInferImplies+ (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b))+ (DistinctTerm _ ((Dyn (e2 :: Term a)) :| [Dyn (ec2@(ConTerm _ _) :: Term b)]))+ trueRes+ _+ | e1 == e2 && ec1 /= ec2 = Just trueRes+pevalInferImplies+ (EqTerm _ (e1 :: Term a) (ec1@(ConTerm _ _) :: Term b))+ (EqTerm _ (Dyn (e2 :: Term a)) (Dyn (ec2@(ConTerm _ _) :: Term b)))+ _+ falseRes+ | e1 == e2 && ec1 /= ec2 = Just falseRes+pevalInferImplies _ _ _ _ = Nothing++pevalITEBoolLeftAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolLeftAnd cond t1 t2 ifFalse+ | t1 == ifFalse = Just $ pevalAndTerm t1 $ pevalImplyTerm cond t2+ | t2 == ifFalse = Just $ pevalAndTerm t2 $ pevalImplyTerm cond t1+ | cond == t1 = Just $ pevalITETerm cond t2 ifFalse+ | cond == t2 = Just $ pevalITETerm cond t1 ifFalse+ | otherwise =+ msum+ [ pevalInferImplies cond t1 (pevalITETerm cond t2 ifFalse) (pevalAndTerm (pevalNotTerm cond) ifFalse),+ pevalInferImplies cond t2 (pevalITETerm cond t1 ifFalse) (pevalAndTerm (pevalNotTerm cond) ifFalse)+ ]++pevalITEBoolBothAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolBothAnd cond t1 t2 f1 f2+ | t1 == f1 = Just $ pevalAndTerm t1 $ pevalITETerm cond t2 f2+ | t1 == f2 = Just $ pevalAndTerm t1 $ pevalITETerm cond t2 f1+ | t2 == f1 = Just $ pevalAndTerm t2 $ pevalITETerm cond t1 f2+ | t2 == f2 = Just $ pevalAndTerm t2 $ pevalITETerm cond t1 f1+ | otherwise = Nothing++pevalITEBoolRightAnd :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolRightAnd cond ifTrue f1 f2+ | f1 == ifTrue = Just $ pevalAndTerm f1 $ pevalOrTerm cond f2+ | f2 == ifTrue = Just $ pevalAndTerm f2 $ pevalOrTerm cond f1+ | otherwise = Nothing++pevalITEBoolLeftOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolLeftOr cond t1 t2 ifFalse+ | t1 == ifFalse = Just $ pevalOrTerm t1 $ pevalAndTerm cond t2+ | t2 == ifFalse = Just $ pevalOrTerm t2 $ pevalAndTerm cond t1+ | cond == t1 = Just $ pevalOrTerm cond ifFalse+ | cond == t2 = Just $ pevalOrTerm cond ifFalse+ | otherwise =+ msum+ [ pevalInferImplies cond t1 (pevalOrTerm cond ifFalse) (pevalITETerm cond t2 ifFalse),+ pevalInferImplies cond t2 (pevalOrTerm cond ifFalse) (pevalITETerm cond t1 ifFalse)+ ]++pevalITEBoolBothOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolBothOr cond t1 t2 f1 f2+ | t1 == f1 = Just $ pevalOrTerm t1 $ pevalITETerm cond t2 f2+ | t1 == f2 = Just $ pevalOrTerm t1 $ pevalITETerm cond t2 f1+ | t2 == f1 = Just $ pevalOrTerm t2 $ pevalITETerm cond t1 f2+ | t2 == f2 = Just $ pevalOrTerm t2 $ pevalITETerm cond t1 f1+ | otherwise = Nothing++pevalITEBoolRightOr :: Term Bool -> Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolRightOr cond ifTrue f1 f2+ | f1 == ifTrue = Just $ pevalOrTerm f1 $ pevalAndTerm (pevalNotTerm cond) f2+ | f2 == ifTrue = Just $ pevalOrTerm f2 $ pevalAndTerm (pevalNotTerm cond) f1+ | otherwise = Nothing++pevalITEBoolLeft :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolLeft cond (AndTerm _ t1 t2) ifFalse =+ msum+ [ pevalITEBoolLeftAnd cond t1 t2 ifFalse,+ case ifFalse of+ AndTerm _ f1 f2 -> pevalITEBoolBothAnd cond t1 t2 f1 f2+ _ -> Nothing+ ]+pevalITEBoolLeft cond (OrTerm _ t1 t2) ifFalse =+ msum+ [ pevalITEBoolLeftOr cond t1 t2 ifFalse,+ case ifFalse of+ OrTerm _ f1 f2 -> pevalITEBoolBothOr cond t1 t2 f1 f2+ _ -> Nothing+ ]+pevalITEBoolLeft cond (NotTerm _ nIfTrue) ifFalse =+ msum+ [ pevalITEBoolLeftNot cond nIfTrue ifFalse,+ case ifFalse of+ NotTerm _ nIfFalse ->+ pevalITEBoolBothNot cond nIfTrue nIfFalse+ _ -> Nothing+ ]+pevalITEBoolLeft _ _ _ = Nothing++pevalITEBoolNoLeft :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolNoLeft cond ifTrue (AndTerm _ f1 f2) = pevalITEBoolRightAnd cond ifTrue f1 f2+pevalITEBoolNoLeft cond ifTrue (OrTerm _ f1 f2) = pevalITEBoolRightOr cond ifTrue f1 f2+pevalITEBoolNoLeft cond ifTrue (NotTerm _ nIfFalse) = pevalITEBoolRightNot cond ifTrue nIfFalse+pevalITEBoolNoLeft _ _ _ = Nothing++-- | Basic partial evaluation for ITE terms.+pevalITEBasic :: (SupportedPrim a) => Term Bool -> Term a -> Term a -> Maybe (Term a)+pevalITEBasic (ConTerm _ True) ifTrue _ = Just ifTrue+pevalITEBasic (ConTerm _ False) _ ifFalse = Just ifFalse+pevalITEBasic (NotTerm _ ncond) ifTrue ifFalse = Just $ pevalITETerm ncond ifFalse ifTrue+pevalITEBasic _ ifTrue ifFalse | ifTrue == ifFalse = Just ifTrue+pevalITEBasic (ITETerm _ cc ct cf) (ITETerm _ tc tt tf) (ITETerm _ fc ft ff) -- later+ | cc == tc && cc == fc = Just $ pevalITETerm cc (pevalITETerm ct tt ft) (pevalITETerm cf tf ff)+pevalITEBasic cond (ITETerm _ tc tt tf) ifFalse -- later+ | cond == tc = Just $ pevalITETerm cond tt ifFalse+ | tt == ifFalse = Just $ pevalITETerm (pevalOrTerm (pevalNotTerm cond) tc) tt tf+ | tf == ifFalse = Just $ pevalITETerm (pevalAndTerm cond tc) tt tf+pevalITEBasic cond ifTrue (ITETerm _ fc ft ff) -- later+ | ifTrue == ft = Just $ pevalITETerm (pevalOrTerm cond fc) ifTrue ff+ | ifTrue == ff = Just $ pevalITETerm (pevalOrTerm cond (pevalNotTerm fc)) ifTrue ft+ | pevalImpliesTerm fc cond = Just $ pevalITETerm cond ifTrue ff+pevalITEBasic _ _ _ = Nothing++pevalITEBoolBasic :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBoolBasic cond ifTrue ifFalse+ | cond == ifTrue = Just $ pevalOrTerm cond ifFalse+ | cond == ifFalse = Just $ pevalAndTerm cond ifTrue+pevalITEBoolBasic cond (ConTerm _ v) ifFalse+ | v = Just $ pevalOrTerm cond ifFalse+ | otherwise = Just $ pevalAndTerm (pevalNotTerm cond) ifFalse+pevalITEBoolBasic cond ifTrue (ConTerm _ v)+ | v = Just $ pevalOrTerm (pevalNotTerm cond) ifTrue+ | otherwise = Just $ pevalAndTerm cond ifTrue+pevalITEBoolBasic _ _ _ = Nothing++pevalITEBool :: Term Bool -> Term Bool -> Term Bool -> Maybe (Term Bool)+pevalITEBool cond ifTrue ifFalse =+ msum+ [ pevalITEBasic cond ifTrue ifFalse,+ pevalITEBoolBasic cond ifTrue ifFalse,+ pevalITEBoolLeft cond ifTrue ifFalse,+ pevalITEBoolNoLeft cond ifTrue ifFalse+ ]++-- | Basic partial evaluation for ITE terms.+pevalITEBasicTerm :: (SupportedPrim a) => Term Bool -> Term a -> Term a -> Term a+pevalITEBasicTerm cond ifTrue ifFalse =+ fromMaybe (iteTerm cond ifTrue ifFalse) $+ pevalITEBasic cond ifTrue ifFalse++-- | Default partial evaluation for equality terms.+pevalDefaultEqTerm :: (SupportedNonFuncPrim a) => Term a -> Term a -> Term Bool+pevalDefaultEqTerm l@ConTerm {} r@ConTerm {} = conTerm $ l == r+pevalDefaultEqTerm l@ConTerm {} r = pevalDefaultEqTerm r l+pevalDefaultEqTerm l (BoolConTerm rv) =+ if rv+ then unsafeCoerce l+ else pevalNotTerm (unsafeCoerce l)+pevalDefaultEqTerm (NotTerm _ lv) r+ | lv == r = falseTerm+pevalDefaultEqTerm l (NotTerm _ rv)+ | l == rv = falseTerm+pevalDefaultEqTerm (AddNumTerm _ (ConTerm _ c) v) (ConTerm _ c2) =+ pevalDefaultEqTerm v (conTerm $ c2 - c)+pevalDefaultEqTerm l (ITETerm _ c t f)+ | l == t = pevalOrTerm c (pevalDefaultEqTerm l f)+ | l == f = pevalOrTerm (pevalNotTerm c) (pevalDefaultEqTerm l t)+pevalDefaultEqTerm (ITETerm _ c t f) r+ | t == r = pevalOrTerm c (pevalDefaultEqTerm f r)+ | f == r = pevalOrTerm (pevalNotTerm c) (pevalDefaultEqTerm t r)+pevalDefaultEqTerm l r+ | l == r = trueTerm+ | otherwise = eqTerm l r+{-# INLINEABLE pevalDefaultEqTerm #-}++instance SBVRep Bool where+ type SBVType Bool = SBV.SBV Bool++instance SupportedPrimConstraint Bool++instance SupportedPrim Bool where+ pformatCon True = "true"+ pformatCon False = "false"+ defaultValue = defaultValueForBool+ defaultValueDynamic _ = defaultValueForBoolDyn+ pevalITETerm cond ifTrue ifFalse =+ fromMaybe (iteTerm cond ifTrue ifFalse) $+ pevalITEBool cond ifTrue ifFalse+ pevalEqTerm = pevalDefaultEqTerm+ pevalDistinctTerm (_ :| []) = conTerm True+ pevalDistinctTerm (a :| [b]) = pevalNotTerm $ pevalEqTerm a b+ pevalDistinctTerm _ = conTerm False+ conSBVTerm n = if n then SBV.sTrue else SBV.sFalse+ symSBVName symbol _ = show symbol+ symSBVTerm = sbvFresh+ withPrim r = r+ parseSMTModelResult _ = parseScalarSMTModelResult id+ castTypedSymbol ::+ forall knd knd'.+ (IsSymbolKind knd') =>+ TypedSymbol knd Bool ->+ Maybe (TypedSymbol knd' Bool)+ castTypedSymbol (TypedSymbol s) =+ case decideSymbolKind @knd' of+ Left HRefl -> Just $ TypedSymbol s+ Right HRefl -> Just $ TypedSymbol s+ isFuncType = False+ funcDummyConstraint _ = SBV.sTrue++instance NonFuncSBVRep Bool where+ type NonFuncSBVBaseType Bool = Bool++instance SupportedNonFuncPrim Bool where+ conNonFuncSBVTerm = conSBVTerm+ symNonFuncSBVTerm = symSBVTerm @Bool+ withNonFuncPrim r = r
src/Grisette/Internal/SymPrim/Prim/Internal/Unfold.hs view
@@ -58,6 +58,7 @@ ret :: PartialRuleUnary a b ret = oneLevel (totalize @(Term a) @(Term b) partial fallback) +-- | Unfold a unary operation once. unaryUnfoldOnce :: forall a b. (SupportedPrim b) =>@@ -79,15 +80,16 @@ catchError (partial' x y) ( \_ ->- catchError- ( case x of- ITETerm _ cond vt vf -> left cond vt vf y partial' fallback'- _ -> Nothing- )- ( \_ -> case y of- ITETerm _ cond vt vf -> left cond vt vf x (flip partial') (flip fallback')- _ -> Nothing- )+ case (x, y) of+ (ITETerm _ _ ITETerm {} _, ITETerm {}) -> Nothing+ (ITETerm _ _ _ ITETerm {}, ITETerm {}) -> Nothing+ (ITETerm {}, ITETerm _ _ ITETerm {} _) -> Nothing+ (ITETerm {}, ITETerm _ _ _ ITETerm {}) -> Nothing+ (ITETerm _ cond vt vf, _) ->+ left cond vt vf y partial' fallback'+ (_, ITETerm _ cond vt vf) ->+ left cond vt vf x (flip partial') (flip fallback')+ _ -> Nothing ) left :: Term Bool ->@@ -109,6 +111,7 @@ ret :: PartialRuleBinary a b c ret = oneLevel partial (totalize2 @(Term a) @(Term b) @(Term c) partial fallback) +-- | Unfold a binary operation once. binaryUnfoldOnce :: forall a b c. (Typeable a, Typeable b, SupportedPrim c) =>@@ -117,6 +120,7 @@ TotalRuleBinary a b c binaryUnfoldOnce partial fallback = totalize2 (binaryPartialUnfoldOnce partial fallback) fallback +-- | Unfold a unary operation once. generalUnaryUnfolded :: forall a b. (Typeable a, SupportedPrim b) =>@@ -131,6 +135,7 @@ _ -> Nothing ) +-- | Unfold a binary operation once. generalBinaryUnfolded :: forall a b c. (Typeable a, Typeable b, SupportedPrim c) =>
src/Grisette/Internal/SymPrim/Prim/Internal/Utils.hs view
@@ -34,27 +34,35 @@ type (:~~:) (HRefl), ) +-- | Pattern synonym for dynamic type casting. pattern Dyn :: (Typeable a, Typeable b) => a -> b pattern Dyn x <- (cast -> Just x) +-- | Compare two values of different types, resolve the type equality using the+-- type representation. cmpHeteroRep :: forall a b. TypeRep a -> TypeRep b -> (a -> a -> Bool) -> a -> b -> Bool cmpHeteroRep ta tb f a b = case eqTypeRep ta tb of Just HRefl -> f a b _ -> False {-# INLINE cmpHeteroRep #-} +-- | Compare two values of different types. cmpHetero :: forall a b. (Typeable a, Typeable b) => (a -> a -> Bool) -> a -> b -> Bool cmpHetero = cmpHeteroRep (typeRep @a) (typeRep @b) {-# INLINE cmpHetero #-} +-- | Compare two values of different types for equality. eqHetero :: forall a b. (Typeable a, Typeable b, Eq a) => a -> b -> Bool eqHetero = cmpHetero (==) {-# INLINE eqHetero #-} +-- | Compare two values of different types for equality, resolve the type+-- equality using the type representation. eqHeteroRep :: forall a b. (Eq a) => TypeRep a -> TypeRep b -> a -> b -> Bool eqHeteroRep ta tb = cmpHeteroRep ta tb (==) {-# INLINE eqHeteroRep #-} +-- | Compare two type representations for equality. eqTypeRepBool :: forall ka kb (a :: ka) (b :: kb). TypeRep a -> TypeRep b -> Bool eqTypeRepBool a b = case eqTypeRep a b of Just HRefl -> True
src/Grisette/Internal/SymPrim/Prim/Model.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}@@ -5,7 +6,6 @@ {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}@@ -21,10 +21,12 @@ -- Portability : GHC only module Grisette.Internal.SymPrim.Prim.Model ( SymbolSet (..),+ ConstantSymbolSet,+ AnySymbolSet, Model (..), ModelValuePair (..), equation,- evaluateTerm,+ evalTerm, ) where @@ -58,147 +60,58 @@ ), SymbolSetRep (buildSymbolSet), )-import Grisette.Internal.Core.Data.MemoUtils (htmemo)-import Grisette.Internal.SymPrim.GeneralFun (type (-->) (GeneralFun))-import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP- ( pevalFPBinaryTerm,- pevalFPFMATerm,- pevalFPRoundingBinaryTerm,- pevalFPRoundingUnaryTerm,- pevalFPTraitTerm,- pevalFPUnaryTerm,+import Grisette.Internal.SymPrim.GeneralFun (generalSubstSomeTerm)+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( SomeTypedAnySymbol,+ SomeTypedConstantSymbol,+ SupportedPrim,+ SymbolKind (AnyKind, ConstantKind),+ Term,+ TypedAnySymbol, )-import Grisette.Internal.SymPrim.Prim.Internal.Term (Term (FPFMATerm)) import Grisette.Internal.SymPrim.Prim.ModelValue ( ModelValue, toModelValue, unsafeFromModelValue, )-import Grisette.Internal.SymPrim.Prim.SomeTerm- ( SomeTerm (SomeTerm),- ) import Grisette.Internal.SymPrim.Prim.Term- ( BinaryOp (pevalBinary),- PEvalApplyTerm (pevalApplyTerm),- PEvalBVSignConversionTerm (pevalBVToSignedTerm, pevalBVToUnsignedTerm),- PEvalBVTerm (pevalBVConcatTerm, pevalBVExtendTerm, pevalBVSelectTerm),- PEvalBitwiseTerm- ( pevalAndBitsTerm,- pevalComplementBitsTerm,- pevalOrBitsTerm,- pevalXorBitsTerm- ),- PEvalDivModIntegralTerm- ( pevalDivIntegralTerm,- pevalModIntegralTerm,- pevalQuotIntegralTerm,- pevalRemIntegralTerm- ),- PEvalFloatingTerm (pevalSqrtTerm),- PEvalFractionalTerm (pevalFdivTerm, pevalRecipTerm),- PEvalNumTerm- ( pevalAbsNumTerm,- pevalAddNumTerm,- pevalMulNumTerm,- pevalNegNumTerm,- pevalSignumNumTerm- ),- PEvalOrdTerm (pevalLeOrdTerm, pevalLtOrdTerm),- PEvalRotateTerm- ( pevalRotateLeftTerm,- pevalRotateRightTerm- ),- PEvalShiftTerm (pevalShiftLeftTerm, pevalShiftRightTerm),- SomeTypedSymbol (SomeTypedSymbol),- SupportedPrim (defaultValue, defaultValueDynamic, pevalITETerm),- Term- ( AbsNumTerm,- AddNumTerm,- AndBitsTerm,- AndTerm,- ApplyTerm,- BVConcatTerm,- BVExtendTerm,- BVSelectTerm,- BinaryTerm,- ComplementBitsTerm,- ConTerm,- DivIntegralTerm,- EqTerm,- FPBinaryTerm,- FPRoundingBinaryTerm,- FPRoundingUnaryTerm,- FPTraitTerm,- FPUnaryTerm,- FdivTerm,- ITETerm,- LeOrdTerm,- LtOrdTerm,- ModIntegralTerm,- MulNumTerm,- NegNumTerm,- NotTerm,- OrBitsTerm,- OrTerm,- QuotIntegralTerm,- RecipTerm,- RemIntegralTerm,- RotateLeftTerm,- RotateRightTerm,- ShiftLeftTerm,- ShiftRightTerm,- SignumNumTerm,- SqrtTerm,- SymTerm,- TernaryTerm,- ToSignedTerm,- ToUnsignedTerm,- UnaryTerm,- XorBitsTerm- ),- TernaryOp (pevalTernary),+ ( SomeTypedSymbol (SomeTypedSymbol),+ SupportedPrim (defaultValue, defaultValueDynamic), TypedSymbol (TypedSymbol, unTypedSymbol),- UnaryOp (pevalUnary), conTerm,- pevalAndTerm, pevalEqTerm,- pevalNotTerm,- pevalOrTerm, showUntyped, someTypedSymbol, symTerm, withSymbolSupported, )-import Grisette.Internal.Utils.Parameterized (unsafeAxiom)-import Type.Reflection- ( TypeRep,- eqTypeRep,- typeRep,- pattern App,- type (:~:) (Refl),- type (:~~:) (HRefl),- )-import Unsafe.Coerce (unsafeCoerce) -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim--- >>> :set -XFlexibleContexts -- | Set of symbols. -- -- Check 'Grisette.Core.SymbolSetOps' for operations, and -- 'Grisette.Core.SymbolSetRep' for manual constructions.-newtype SymbolSet = SymbolSet {unSymbolSet :: S.HashSet SomeTypedSymbol}+newtype SymbolSet knd = SymbolSet+ { unSymbolSet :: S.HashSet (SomeTypedSymbol knd)+ } deriving (Eq, Generic, Hashable) -instance Semigroup SymbolSet where+-- | Set of constant symbols. Excluding unintepreted functions.+type ConstantSymbolSet = SymbolSet 'ConstantKind++-- | Set of any symbols.+type AnySymbolSet = SymbolSet 'AnyKind++instance Semigroup (SymbolSet knd) where SymbolSet s1 <> SymbolSet s2 = SymbolSet $ S.union s1 s2 -instance Monoid SymbolSet where+instance Monoid (SymbolSet knd) where mempty = emptySet -instance Show SymbolSet where+instance Show (SymbolSet knd) where showsPrec prec (SymbolSet s) = showParen (prec >= 10) $ \x -> "SymbolSet {" ++ go0 (sort $ show <$> S.toList s)@@ -213,7 +126,9 @@ -- -- Check 'Grisette.Core.ModelOps' for operations, and 'Grisette.Core.ModelRep' -- for manual constructions.-newtype Model = Model {unModel :: M.HashMap SomeTypedSymbol ModelValue}+newtype Model = Model+ { unModel :: M.HashMap SomeTypedAnySymbol ModelValue+ } deriving (Eq, Generic, Hashable) instance Semigroup Model where@@ -235,13 +150,13 @@ -- | Given a typed symbol and a model, return the equation (symbol = value) -- encoded in the model.-equation :: TypedSymbol a -> Model -> Maybe (Term Bool)+equation :: TypedAnySymbol a -> Model -> Maybe (Term Bool) equation tsym@(TypedSymbol {}) m = withSymbolSupported tsym $ case valueOf tsym m of Just v -> Just $ pevalEqTerm (symTerm $ unTypedSymbol tsym) (conTerm v) Nothing -> Nothing -instance SymbolSetOps SymbolSet TypedSymbol where+instance SymbolSetOps (SymbolSet knd) (TypedSymbol knd) where emptySet = SymbolSet S.empty isEmptySet (SymbolSet s) = S.null s containsSymbol s =@@ -251,16 +166,45 @@ unionSet (SymbolSet s1) (SymbolSet s2) = SymbolSet $ S.union s1 s2 differenceSet (SymbolSet s1) (SymbolSet s2) = SymbolSet $ S.difference s1 s2 -instance SymbolSetRep (TypedSymbol t) SymbolSet TypedSymbol where+instance+ SymbolSetRep+ (SomeTypedSymbol knd)+ (SymbolSet knd)+ (TypedSymbol knd)+ where+ buildSymbolSet sym = SymbolSet $ S.singleton sym++instance+ SymbolSetRep+ [SomeTypedSymbol knd]+ (SymbolSet knd)+ (TypedSymbol knd)+ where+ buildSymbolSet = SymbolSet . S.fromList++instance+ SymbolSetRep+ [TypedSymbol knd t]+ (SymbolSet knd)+ (TypedSymbol knd)+ where+ buildSymbolSet sym = buildSymbolSet $ someTypedSymbol <$> sym++instance+ SymbolSetRep+ (TypedSymbol knd t)+ (SymbolSet knd)+ (TypedSymbol knd)+ where buildSymbolSet sym = insertSymbol sym emptySet instance SymbolSetRep- ( TypedSymbol a,- TypedSymbol b+ ( TypedSymbol knd a,+ TypedSymbol knd b )- SymbolSet- TypedSymbol+ (SymbolSet knd)+ (TypedSymbol knd) where buildSymbolSet (sym1, sym2) = insertSymbol sym2@@ -269,12 +213,12 @@ instance SymbolSetRep- ( TypedSymbol a,- TypedSymbol b,- TypedSymbol c+ ( TypedSymbol knd a,+ TypedSymbol knd b,+ TypedSymbol knd c )- SymbolSet- TypedSymbol+ (SymbolSet knd)+ (TypedSymbol knd) where buildSymbolSet (sym1, sym2, sym3) = insertSymbol sym3@@ -284,13 +228,13 @@ instance SymbolSetRep- ( TypedSymbol a,- TypedSymbol b,- TypedSymbol c,- TypedSymbol d+ ( TypedSymbol knd a,+ TypedSymbol knd b,+ TypedSymbol knd c,+ TypedSymbol knd d )- SymbolSet- TypedSymbol+ (SymbolSet knd)+ (TypedSymbol knd) where buildSymbolSet (sym1, sym2, sym3, sym4) = insertSymbol sym4@@ -301,14 +245,14 @@ instance SymbolSetRep- ( TypedSymbol a,- TypedSymbol b,- TypedSymbol c,- TypedSymbol d,- TypedSymbol e+ ( TypedSymbol knd a,+ TypedSymbol knd b,+ TypedSymbol knd c,+ TypedSymbol knd d,+ TypedSymbol knd e )- SymbolSet- TypedSymbol+ (SymbolSet knd)+ (TypedSymbol knd) where buildSymbolSet (sym1, sym2, sym3, sym4, sym5) = insertSymbol sym5@@ -320,15 +264,15 @@ instance SymbolSetRep- ( TypedSymbol a,- TypedSymbol b,- TypedSymbol c,- TypedSymbol d,- TypedSymbol e,- TypedSymbol f+ ( TypedSymbol knd a,+ TypedSymbol knd b,+ TypedSymbol knd c,+ TypedSymbol knd d,+ TypedSymbol knd e,+ TypedSymbol knd f )- SymbolSet- TypedSymbol+ (SymbolSet knd)+ (TypedSymbol knd) where buildSymbolSet (sym1, sym2, sym3, sym4, sym5, sym6) = insertSymbol sym6@@ -341,16 +285,16 @@ instance SymbolSetRep- ( TypedSymbol a,- TypedSymbol b,- TypedSymbol c,- TypedSymbol d,- TypedSymbol e,- TypedSymbol f,- TypedSymbol g+ ( TypedSymbol knd a,+ TypedSymbol knd b,+ TypedSymbol knd c,+ TypedSymbol knd d,+ TypedSymbol knd e,+ TypedSymbol knd f,+ TypedSymbol knd g )- SymbolSet- TypedSymbol+ (SymbolSet knd)+ (TypedSymbol knd) where buildSymbolSet (sym1, sym2, sym3, sym4, sym5, sym6, sym7) = insertSymbol sym7@@ -364,17 +308,17 @@ instance SymbolSetRep- ( TypedSymbol a,- TypedSymbol b,- TypedSymbol c,- TypedSymbol d,- TypedSymbol e,- TypedSymbol f,- TypedSymbol g,- TypedSymbol h+ ( TypedSymbol knd a,+ TypedSymbol knd b,+ TypedSymbol knd c,+ TypedSymbol knd d,+ TypedSymbol knd e,+ TypedSymbol knd f,+ TypedSymbol knd g,+ TypedSymbol knd h )- SymbolSet- TypedSymbol+ (SymbolSet knd)+ (TypedSymbol knd) where buildSymbolSet (sym1, sym2, sym3, sym4, sym5, sym6, sym7, sym8) = insertSymbol sym8@@ -387,10 +331,10 @@ . insertSymbol sym1 $ emptySet -instance ModelOps Model SymbolSet TypedSymbol where+instance ModelOps Model AnySymbolSet TypedAnySymbol where emptyModel = Model M.empty isEmptyModel (Model m) = M.null m- valueOf :: forall t. TypedSymbol t -> Model -> Maybe t+ valueOf :: forall t. TypedAnySymbol t -> Model -> Maybe t valueOf sym (Model m) = withSymbolSupported sym $ (unsafeFromModelValue @t)@@ -410,7 +354,7 @@ extendTo (SymbolSet s) (Model m) = Model $ S.foldl'- ( \acc sym@(SomeTypedSymbol _ (tsym :: TypedSymbol t)) -> case M.lookup sym acc of+ ( \acc sym@(SomeTypedSymbol _ (tsym :: TypedAnySymbol t)) -> case M.lookup sym acc of Just _ -> acc Nothing -> withSymbolSupported tsym $ M.insert sym (defaultValueDynamic (Proxy @t)) acc )@@ -421,130 +365,31 @@ Model $ M.insert (someTypedSymbol sym) (toModelValue v) m -evaluateSomeTerm :: Bool -> Model -> SomeTerm -> SomeTerm-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 _ cv :: Term v)) =- case (typeRep :: TypeRep v) of- App (App gf _) _ ->- case eqTypeRep gf (typeRep @(-->)) of- Just HRefl -> case cv of- GeneralFun sym (tm :: Term r) ->- if modelContains sym m -- someTypedSymbol sym1 == someTypedSymbol sym- then case evaluateSomeTerm fillDefault (exceptFor' sym m) (SomeTerm tm) of- SomeTerm (tm' :: Term r1) ->- case unsafeAxiom @r @r1 of- Refl -> 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- Just dy -> SomeTerm $ conTerm (unsafeFromModelValue @a dy)- go (SomeTerm (UnaryTerm _ tag (arg :: Term a))) = goUnary (pevalUnary tag) arg- go (SomeTerm (BinaryTerm _ tag (arg1 :: Term a1) (arg2 :: Term a2))) =- goBinary (pevalBinary tag) arg1 arg2- go (SomeTerm (TernaryTerm _ tag (arg1 :: Term a1) (arg2 :: Term a2) (arg3 :: Term a3))) = do- goTernary (pevalTernary tag) arg1 arg2 arg3- go (SomeTerm (NotTerm _ arg)) = goUnary pevalNotTerm arg- go (SomeTerm (OrTerm _ arg1 arg2)) =- goBinary pevalOrTerm arg1 arg2- go (SomeTerm (AndTerm _ arg1 arg2)) =- goBinary pevalAndTerm arg1 arg2- go (SomeTerm (EqTerm _ arg1 arg2)) =- goBinary pevalEqTerm arg1 arg2- go (SomeTerm (ITETerm _ cond arg1 arg2)) =- goTernary pevalITETerm cond arg1 arg2- go (SomeTerm (AddNumTerm _ arg1 arg2)) =- goBinary pevalAddNumTerm arg1 arg2- go (SomeTerm (NegNumTerm _ arg)) = goUnary pevalNegNumTerm arg- go (SomeTerm (MulNumTerm _ arg1 arg2)) =- goBinary pevalMulNumTerm arg1 arg2- go (SomeTerm (AbsNumTerm _ arg)) = goUnary pevalAbsNumTerm arg- go (SomeTerm (SignumNumTerm _ arg)) = goUnary pevalSignumNumTerm arg- go (SomeTerm (LtOrdTerm _ arg1 arg2)) =- goBinary pevalLtOrdTerm arg1 arg2- go (SomeTerm (LeOrdTerm _ arg1 arg2)) =- goBinary pevalLeOrdTerm arg1 arg2- go (SomeTerm (AndBitsTerm _ arg1 arg2)) =- goBinary pevalAndBitsTerm arg1 arg2- go (SomeTerm (OrBitsTerm _ arg1 arg2)) =- goBinary pevalOrBitsTerm arg1 arg2- go (SomeTerm (XorBitsTerm _ arg1 arg2)) =- goBinary pevalXorBitsTerm arg1 arg2- go (SomeTerm (ComplementBitsTerm _ arg)) = goUnary pevalComplementBitsTerm arg- go (SomeTerm (ShiftLeftTerm _ arg n)) = goBinary pevalShiftLeftTerm arg n- go (SomeTerm (RotateLeftTerm _ arg n)) = goBinary pevalRotateLeftTerm arg n- go (SomeTerm (ShiftRightTerm _ arg n)) = goBinary pevalShiftRightTerm arg n- go (SomeTerm (RotateRightTerm _ arg n)) = goBinary pevalRotateRightTerm arg n- go (SomeTerm (ToSignedTerm _ arg)) =- goUnary pevalBVToSignedTerm arg- go (SomeTerm (ToUnsignedTerm _ arg)) =- goUnary pevalBVToUnsignedTerm arg- go (SomeTerm (BVConcatTerm _ arg1 arg2)) =- goBinary pevalBVConcatTerm arg1 arg2- go (SomeTerm (BVSelectTerm _ ix w arg)) =- goUnary (pevalBVSelectTerm ix w) arg- go (SomeTerm (BVExtendTerm _ n signed arg)) =- goUnary (pevalBVExtendTerm n signed) arg- go (SomeTerm (ApplyTerm _ f arg)) =- goBinary pevalApplyTerm f arg- 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 (FPTraitTerm _ trait arg)) =- goUnary (pevalFPTraitTerm trait) arg- go (SomeTerm (FdivTerm _ arg1 arg2)) = goBinary pevalFdivTerm arg1 arg2- go (SomeTerm (RecipTerm _ arg)) = goUnary pevalRecipTerm arg- go (SomeTerm (SqrtTerm _ arg)) = goUnary pevalSqrtTerm arg- go (SomeTerm (FPUnaryTerm _ op arg)) = goUnary (pevalFPUnaryTerm op) arg- go (SomeTerm (FPBinaryTerm _ op arg1 arg2)) =- goBinary (pevalFPBinaryTerm op) arg1 arg2- go (SomeTerm (FPRoundingUnaryTerm _ op mode arg)) =- goUnary (pevalFPRoundingUnaryTerm op mode) arg- go (SomeTerm (FPRoundingBinaryTerm _ op mode arg1 arg2)) =- goBinary (pevalFPRoundingBinaryTerm op mode) arg1 arg2- go (SomeTerm (FPFMATerm _ mode arg1 arg2 arg3)) =- SomeTerm $ pevalFPFMATerm (gotyped mode) (gotyped arg1) (gotyped arg2) (gotyped arg3)- goUnary :: (SupportedPrim a, SupportedPrim b) => (Term a -> Term b) -> Term a -> SomeTerm- goUnary f a = SomeTerm $ f (gotyped a)- goBinary ::- (SupportedPrim a, SupportedPrim b, SupportedPrim c) =>- (Term a -> Term b -> Term c) ->- Term a ->- Term b ->- SomeTerm- goBinary f a b = SomeTerm $ f (gotyped a) (gotyped b)- goTernary ::- (SupportedPrim a, SupportedPrim b, SupportedPrim c, SupportedPrim d) =>- (Term a -> Term b -> Term c -> Term d) ->- Term a ->- Term b ->- Term c ->- SomeTerm- goTernary f a b c = SomeTerm $ f (gotyped a) (gotyped b) (gotyped c)- -- | Evaluate a term in the given model.-evaluateTerm :: forall a. (SupportedPrim a) => Bool -> Model -> Term a -> Term a-evaluateTerm fillDefault m t = case evaluateSomeTerm fillDefault m $ SomeTerm t of- SomeTerm (t1 :: Term b) -> unsafeCoerce @(Term b) @(Term a) t1+evalTerm ::+ (SupportedPrim a) =>+ Bool ->+ Model ->+ S.HashSet SomeTypedConstantSymbol ->+ Term a ->+ Term a+evalTerm fillDefault (Model ma) =+ generalSubstSomeTerm+ ( \(sym@(TypedSymbol sym') :: TypedSymbol 'AnyKind a) ->+ case (M.lookup (someTypedSymbol sym) ma) of+ Nothing ->+ if fillDefault+ then conTerm (defaultValue @a)+ else symTerm sym'+ Just dy -> conTerm (unsafeFromModelValue @a dy)+ ) -- | -- A type used for building a model by hand. -- -- >>> buildModel ("x" ::= (1 :: Integer), "y" ::= True) :: Model -- Model {x -> 1 :: Integer, y -> True :: Bool}-data ModelValuePair t = (TypedSymbol t) ::= t deriving (Show)+data ModelValuePair t = (TypedAnySymbol t) ::= t deriving (Show) instance ModelRep (ModelValuePair t) Model where buildModel (sym ::= val) = insertValue sym val emptyModel@@ -643,188 +488,3 @@ <> buildModel f <> buildModel g <> buildModel h--{--instance- ModelRep- ( ModelValuePair a,- ModelValuePair b- )- Model- SymbolSet- TypedSymbol- where- buildModel- ( sym1 ::= val1,- sym2 ::= val2- ) =- insertValue sym2 val2- . insertValue sym1 val1- $ emptyModel--instance- ModelRep- ( ModelValuePair a,- ModelValuePair b,- ModelValuePair c- )- Model- SymbolSet- TypedSymbol- where- buildModel- ( sym1 ::= val1,- sym2 ::= val2,- sym3 ::= val3- ) =- insertValue sym3 val3- . insertValue sym2 val2- . insertValue sym1 val1- $ emptyModel--instance- ModelRep- ( ModelValuePair a,- ModelValuePair b,- ModelValuePair c,- ModelValuePair d- )- Model- SymbolSet- TypedSymbol- where- buildModel- ( sym1 ::= val1,- sym2 ::= val2,- sym3 ::= val3,- sym4 ::= val4- ) =- insertValue sym4 val4- . insertValue sym3 val3- . insertValue sym2 val2- . insertValue sym1 val1- $ emptyModel--instance- ModelRep- ( ModelValuePair a,- ModelValuePair b,- ModelValuePair c,- ModelValuePair d,- ModelValuePair e- )- Model- SymbolSet- TypedSymbol- where- buildModel- ( sym1 ::= val1,- sym2 ::= val2,- sym3 ::= val3,- sym4 ::= val4,- sym5 ::= val5- ) =- insertValue sym5 val5- . insertValue sym4 val4- . insertValue sym3 val3- . insertValue sym2 val2- . insertValue sym1 val1- $ emptyModel--instance- ModelRep- ( ModelValuePair a,- ModelValuePair b,- ModelValuePair c,- ModelValuePair d,- ModelValuePair e,- ModelValuePair f- )- Model- SymbolSet- TypedSymbol- where- buildModel- ( sym1 ::= val1,- sym2 ::= val2,- sym3 ::= val3,- sym4 ::= val4,- sym5 ::= val5,- sym6 ::= val6- ) =- insertValue sym6 val6- . insertValue sym5 val5- . insertValue sym4 val4- . insertValue sym3 val3- . insertValue sym2 val2- . insertValue sym1 val1- $ emptyModel--instance- ModelRep- ( ModelValuePair a,- ModelValuePair b,- ModelValuePair c,- ModelValuePair d,- ModelValuePair e,- ModelValuePair f,- ModelValuePair g- )- Model- SymbolSet- TypedSymbol- where- buildModel- ( sym1 ::= val1,- sym2 ::= val2,- sym3 ::= val3,- sym4 ::= val4,- sym5 ::= val5,- sym6 ::= val6,- sym7 ::= val7- ) =- insertValue sym7 val7- . insertValue sym6 val6- . insertValue sym5 val5- . insertValue sym4 val4- . insertValue sym3 val3- . insertValue sym2 val2- . insertValue sym1 val1- $ emptyModel--instance- ModelRep- ( ModelValuePair a,- ModelValuePair b,- ModelValuePair c,- ModelValuePair d,- ModelValuePair e,- ModelValuePair f,- ModelValuePair g,- ModelValuePair h- )- Model- SymbolSet- TypedSymbol- where- buildModel- ( sym1 ::= val1,- sym2 ::= val2,- sym3 ::= val3,- sym4 ::= val4,- sym5 ::= val5,- sym6 ::= val6,- sym7 ::= val7,- sym8 ::= val8- ) =- insertValue sym8 val8- . insertValue sym7 val7- . insertValue sym6 val6- . insertValue sym5 val5- . insertValue sym4 val4- . insertValue sym3 val3- . insertValue sym2 val2- . insertValue sym1 val1- $ emptyModel---}
src/Grisette/Internal/SymPrim/Prim/SomeTerm.hs view
@@ -11,7 +11,7 @@ -- Maintainer : siruilu@cs.washington.edu -- Stability : Experimental -- Portability : GHC only-module Grisette.Internal.SymPrim.Prim.SomeTerm (SomeTerm (..)) where+module Grisette.Internal.SymPrim.Prim.SomeTerm (SomeTerm (..), someTerm) where import Data.Hashable (Hashable (hashWithSalt)) import Data.Typeable (Proxy (Proxy), typeRep)@@ -19,6 +19,7 @@ ( SupportedPrim, Term, identityWithTypeRep,+ introSupportedPrimConstraint, ) -- | Existential wrapper for symbolic Grisette terms.@@ -35,3 +36,8 @@ instance Show SomeTerm where show (SomeTerm (t :: Term a)) = "<<" ++ show t ++ " :: " ++ show (typeRep (Proxy @a)) ++ ">>"++-- | Wrap a symbolic term into t'SomeTerm'.+someTerm :: Term a -> SomeTerm+someTerm v = introSupportedPrimConstraint v $ SomeTerm v+{-# INLINE someTerm #-}
src/Grisette/Internal/SymPrim/Prim/Term.hs view
@@ -16,15 +16,19 @@ module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm, module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalOrdTerm, module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalDivModIntegralTerm,+ module Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm, ) where import Grisette.Internal.SymPrim.Prim.Internal.Instances.BVPEval ()+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitCastTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalBitwiseTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalDivModIntegralTerm import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFloatingTerm () import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFractionalTerm ()+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFromIntegralTerm ()+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalNumTerm import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalOrdTerm import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalRotateTerm
src/Grisette/Internal/SymPrim/Prim/TermUtils.hs view
@@ -1,5 +1,9 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE ExplicitNamespaces #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GADTs #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE PolyKinds #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}@@ -23,22 +27,21 @@ where import Control.Monad.State- ( MonadState (get, put),- State,- evalState,+ ( State, execState, gets, modify', )-import qualified Data.HashMap.Strict as M-import qualified Data.HashSet as S-import Data.Typeable- ( Typeable,- cast,- )+import Data.Data (cast)+import Data.Foldable (Foldable (toList), traverse_)+import qualified Data.HashSet as HS+import Grisette.Internal.Core.Data.MemoUtils (htmemo2)+import Grisette.Internal.SymPrim.GeneralFun (type (-->) (GeneralFun)) import Grisette.Internal.SymPrim.Prim.Internal.Term- ( SomeTypedSymbol (SomeTypedSymbol),- SupportedPrim,+ ( IsSymbolKind (SymbolKindConstraint),+ SomeTypedConstantSymbol,+ SomeTypedSymbol (SomeTypedSymbol),+ SupportedPrim (castTypedSymbol), Term ( AbsNumTerm, AddNumTerm,@@ -49,10 +52,14 @@ BVExtendTerm, BVSelectTerm, BinaryTerm,+ BitCastOrTerm,+ BitCastTerm, ComplementBitsTerm, ConTerm,+ DistinctTerm, DivIntegralTerm, EqTerm,+ ExistsTerm, FPBinaryTerm, FPFMATerm, FPRoundingBinaryTerm,@@ -60,6 +67,10 @@ FPTraitTerm, FPUnaryTerm, FdivTerm,+ FloatingUnaryTerm,+ ForallTerm,+ FromFPOrTerm,+ FromIntegralTerm, ITETerm, LeOrdTerm, LtOrdTerm,@@ -69,6 +80,7 @@ NotTerm, OrBitsTerm, OrTerm,+ PowerTerm, QuotIntegralTerm, RecipTerm, RemIntegralTerm,@@ -77,161 +89,218 @@ ShiftLeftTerm, ShiftRightTerm, SignumNumTerm,- SqrtTerm, SymTerm, TernaryTerm,- ToSignedTerm,- ToUnsignedTerm,+ ToFPTerm, UnaryTerm, XorBitsTerm ),- TypedSymbol,+ TypedAnySymbol, introSupportedPrimConstraint,+ someTypedSymbol, ) import Grisette.Internal.SymPrim.Prim.SomeTerm ( SomeTerm (SomeTerm), )+import Type.Reflection+ ( TypeRep,+ Typeable,+ eqTypeRep,+ typeRep,+ pattern App,+ type (:~~:) (HRefl),+ ) import qualified Type.Reflection as R -extractSymSomeTerm :: SomeTerm -> S.HashSet SomeTypedSymbol-extractSymSomeTerm t1 = evalState (gocached t1) M.empty+extractSymSomeTerm ::+ forall knd.+ (IsSymbolKind knd) =>+ HS.HashSet (SomeTypedConstantSymbol) ->+ SomeTerm ->+ Maybe (HS.HashSet (SomeTypedSymbol knd))+extractSymSomeTerm = go initialMemo where- gocached :: SomeTerm -> State (M.HashMap SomeTerm (S.HashSet SomeTypedSymbol)) (S.HashSet SomeTypedSymbol)- gocached t = do- v <- gets (M.lookup t)- case v of- Just x -> return x- Nothing -> do- res <- go t- st <- get- put $ M.insert t res st- return res- go :: SomeTerm -> State (M.HashMap SomeTerm (S.HashSet SomeTypedSymbol)) (S.HashSet SomeTypedSymbol)- go (SomeTerm ConTerm {}) = return S.empty- go (SomeTerm (SymTerm _ (sym :: TypedSymbol a))) = return $ S.singleton $ SomeTypedSymbol (R.typeRep @a) sym- go (SomeTerm (UnaryTerm _ _ arg)) = goUnary arg- go (SomeTerm (BinaryTerm _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (TernaryTerm _ _ arg1 arg2 arg3)) = goTernary arg1 arg2 arg3- go (SomeTerm (NotTerm _ arg)) = goUnary arg- go (SomeTerm (OrTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (AndTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (EqTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (ITETerm _ cond arg1 arg2)) = goTernary cond arg1 arg2- go (SomeTerm (AddNumTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (NegNumTerm _ arg)) = goUnary arg- go (SomeTerm (MulNumTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (AbsNumTerm _ arg)) = goUnary arg- go (SomeTerm (SignumNumTerm _ arg)) = goUnary arg- go (SomeTerm (LtOrdTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (LeOrdTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (AndBitsTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (OrBitsTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (XorBitsTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (ComplementBitsTerm _ arg)) = goUnary arg- go (SomeTerm (ShiftLeftTerm _ arg n1)) = goBinary arg n1- go (SomeTerm (ShiftRightTerm _ arg n1)) = goBinary arg n1- go (SomeTerm (RotateLeftTerm _ arg n1)) = goBinary arg n1- go (SomeTerm (RotateRightTerm _ arg n1)) = goBinary arg n1- go (SomeTerm (ToSignedTerm _ arg)) = goUnary arg- go (SomeTerm (ToUnsignedTerm _ arg)) = goUnary arg- go (SomeTerm (BVConcatTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (BVSelectTerm _ _ _ arg)) = goUnary arg- go (SomeTerm (BVExtendTerm _ _ _ arg)) = goUnary arg- go (SomeTerm (ApplyTerm _ func arg)) = goBinary func arg- 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 (FPTraitTerm _ _ arg)) = goUnary arg- go (SomeTerm (FdivTerm _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (RecipTerm _ arg)) = goUnary arg- go (SomeTerm (SqrtTerm _ arg)) = goUnary arg- go (SomeTerm (FPUnaryTerm _ _ arg)) = goUnary arg- go (SomeTerm (FPBinaryTerm _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (FPRoundingUnaryTerm _ _ _ arg)) = goUnary arg- go (SomeTerm (FPRoundingBinaryTerm _ _ _ arg1 arg2)) = goBinary arg1 arg2- go (SomeTerm (FPFMATerm _ mode arg1 arg2 arg3)) = do- m <- gocached (SomeTerm mode)- r1 <- gocached (SomeTerm arg1)- r2 <- gocached (SomeTerm arg2)- r3 <- gocached (SomeTerm arg3)- return $ m <> r1 <> r2 <> r3- goUnary arg = gocached (SomeTerm arg)- goBinary arg1 arg2 = do- r1 <- gocached (SomeTerm arg1)- r2 <- gocached (SomeTerm arg2)- return $ r1 <> r2- goTernary arg1 arg2 arg3 = do- r1 <- gocached (SomeTerm arg1)- r2 <- gocached (SomeTerm arg2)- r3 <- gocached (SomeTerm arg3)- return $ r1 <> r2 <> r3+ gotyped ::+ (SupportedPrim a) =>+ ( HS.HashSet (SomeTypedConstantSymbol) ->+ SomeTerm ->+ Maybe (HS.HashSet (SomeTypedSymbol knd))+ ) ->+ HS.HashSet (SomeTypedConstantSymbol) ->+ Term a ->+ Maybe (HS.HashSet (SomeTypedSymbol knd))+ gotyped memo boundedSymbols a = memo boundedSymbols (SomeTerm a)+ initialMemo ::+ HS.HashSet (SomeTypedConstantSymbol) ->+ SomeTerm ->+ Maybe (HS.HashSet (SomeTypedSymbol knd))+ initialMemo = htmemo2 (go initialMemo)+ {-# NOINLINE initialMemo #-}++ go ::+ ( HS.HashSet (SomeTypedConstantSymbol) ->+ SomeTerm ->+ Maybe (HS.HashSet (SomeTypedSymbol knd))+ ) ->+ HS.HashSet (SomeTypedConstantSymbol) ->+ SomeTerm ->+ Maybe (HS.HashSet (SomeTypedSymbol knd))+ go _ bs (SomeTerm (SymTerm _ (sym :: TypedAnySymbol a))) =+ case (castTypedSymbol sym, castTypedSymbol sym) of+ (Just sym', _) | HS.member (someTypedSymbol sym') bs -> return HS.empty+ (_, Just sym') ->+ return $ HS.singleton $ SomeTypedSymbol (R.typeRep @a) sym'+ _ -> Nothing+ go _ bs (SomeTerm (ConTerm _ cv :: Term v)) =+ case (typeRep :: TypeRep v) of+ App (App gf _) _ ->+ case eqTypeRep (typeRep @(-->)) gf of+ Just HRefl -> case cv of+ GeneralFun sym (tm :: Term r) ->+ let newmemo = htmemo2 (go newmemo)+ {-# NOINLINE newmemo #-}+ in gotyped+ newmemo+ (HS.union (HS.singleton (someTypedSymbol sym)) bs)+ tm+ Nothing -> return HS.empty+ _ -> return HS.empty+ go _ bs (SomeTerm (ForallTerm _ sym arg)) =+ let newmemo = htmemo2 (go newmemo)+ {-# NOINLINE newmemo #-}+ in goUnary newmemo (HS.insert (someTypedSymbol sym) bs) arg+ go _ bs (SomeTerm (ExistsTerm _ sym arg)) =+ let newmemo = htmemo2 (go newmemo)+ {-# NOINLINE newmemo #-}+ in goUnary newmemo (HS.insert (someTypedSymbol sym) bs) arg+ go memo bs (SomeTerm (UnaryTerm _ _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (BinaryTerm _ _ arg1 arg2)) =+ goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (TernaryTerm _ _ arg1 arg2 arg3)) =+ goTernary memo bs arg1 arg2 arg3+ go memo bs (SomeTerm (NotTerm _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (OrTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (AndTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (EqTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (DistinctTerm _ args)) =+ combineAllSets $ map (gotyped memo bs) $ toList args+ go memo bs (SomeTerm (ITETerm _ cond arg1 arg2)) =+ goTernary memo bs cond arg1 arg2+ go memo bs (SomeTerm (AddNumTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (NegNumTerm _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (MulNumTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (AbsNumTerm _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (SignumNumTerm _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (LtOrdTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (LeOrdTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (AndBitsTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (OrBitsTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (XorBitsTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (ComplementBitsTerm _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (ShiftLeftTerm _ arg n1)) = goBinary memo bs arg n1+ go memo bs (SomeTerm (ShiftRightTerm _ arg n1)) = goBinary memo bs arg n1+ go memo bs (SomeTerm (RotateLeftTerm _ arg n1)) = goBinary memo bs arg n1+ go memo bs (SomeTerm (RotateRightTerm _ arg n1)) = goBinary memo bs arg n1+ go memo bs (SomeTerm (BitCastTerm _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (BitCastOrTerm _ d arg)) = goBinary memo bs d arg+ go memo bs (SomeTerm (BVConcatTerm _ arg1 arg2)) =+ goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (BVSelectTerm _ _ _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (BVExtendTerm _ _ _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (ApplyTerm _ func arg)) = goBinary memo bs func arg+ go memo bs (SomeTerm (DivIntegralTerm _ arg1 arg2)) =+ goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (ModIntegralTerm _ arg1 arg2)) =+ goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (QuotIntegralTerm _ arg1 arg2)) =+ goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (RemIntegralTerm _ arg1 arg2)) =+ goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (FPTraitTerm _ _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (FdivTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (RecipTerm _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (FloatingUnaryTerm _ _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (PowerTerm _ arg1 arg2)) = goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (FPUnaryTerm _ _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (FPBinaryTerm _ _ arg1 arg2)) =+ goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (FPRoundingUnaryTerm _ _ _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (FPRoundingBinaryTerm _ _ _ arg1 arg2)) =+ goBinary memo bs arg1 arg2+ go memo bs (SomeTerm (FPFMATerm _ mode arg1 arg2 arg3)) =+ combineAllSets+ [ gotyped memo bs mode,+ gotyped memo bs arg1,+ gotyped memo bs arg2,+ gotyped memo bs arg3+ ]+ go memo bs (SomeTerm (FromIntegralTerm _ arg)) = goUnary memo bs arg+ go memo bs (SomeTerm (FromFPOrTerm _ d mode arg)) =+ goTernary memo bs d mode arg+ go memo bs (SomeTerm (ToFPTerm _ mode arg _ _)) = goBinary memo bs mode arg+ goUnary ::+ (SupportedPrim a) =>+ (HS.HashSet (SomeTypedConstantSymbol) -> SomeTerm -> Maybe (HS.HashSet (SomeTypedSymbol knd))) ->+ HS.HashSet (SomeTypedConstantSymbol) ->+ Term a ->+ Maybe (HS.HashSet (SomeTypedSymbol knd))+ goUnary = gotyped+ goBinary ::+ (SupportedPrim a, SupportedPrim b) =>+ (HS.HashSet (SomeTypedConstantSymbol) -> SomeTerm -> Maybe (HS.HashSet (SomeTypedSymbol knd))) ->+ HS.HashSet (SomeTypedConstantSymbol) ->+ Term a ->+ Term b ->+ Maybe (HS.HashSet (SomeTypedSymbol knd))+ goBinary memo bs arg1 arg2 =+ combineSet (gotyped memo bs arg1) (gotyped memo bs arg2)+ goTernary ::+ (SupportedPrim a, SupportedPrim b, SupportedPrim c) =>+ (HS.HashSet (SomeTypedConstantSymbol) -> SomeTerm -> Maybe (HS.HashSet (SomeTypedSymbol knd))) ->+ HS.HashSet (SomeTypedConstantSymbol) ->+ Term a ->+ Term b ->+ Term c ->+ Maybe (HS.HashSet (SomeTypedSymbol knd))+ goTernary memo bs arg1 arg2 arg3 =+ combineAllSets+ [ gotyped memo bs arg1,+ gotyped memo bs arg2,+ gotyped memo bs arg3+ ]+ combineSet (Just a) (Just b) = Just $ HS.union a b+ combineSet _ _ = Nothing+ combineAllSets = foldl1 combineSet {-# INLINEABLE extractSymSomeTerm #-} -- | Extract all the symbols in a term.-extractTerm :: (SupportedPrim a) => Term a -> S.HashSet SomeTypedSymbol-extractTerm t = extractSymSomeTerm (SomeTerm t)+extractTerm ::+ (IsSymbolKind knd, SymbolKindConstraint knd a, SupportedPrim a) =>+ HS.HashSet (SomeTypedConstantSymbol) ->+ Term a ->+ Maybe (HS.HashSet (SomeTypedSymbol knd))+extractTerm initialBoundedSymbols t =+ extractSymSomeTerm initialBoundedSymbols (SomeTerm t) {-# INLINE extractTerm #-} -- | Cast a term to another type. castTerm :: forall a b. (Typeable b) => Term a -> Maybe (Term b)-castTerm t@ConTerm {} = cast t-castTerm t@SymTerm {} = cast t-castTerm t@UnaryTerm {} = cast t-castTerm t@BinaryTerm {} = cast t-castTerm t@TernaryTerm {} = cast t-castTerm t@NotTerm {} = cast t-castTerm t@OrTerm {} = cast t-castTerm t@AndTerm {} = cast t-castTerm t@EqTerm {} = cast t-castTerm t@ITETerm {} = cast t-castTerm t@AddNumTerm {} = cast t-castTerm t@NegNumTerm {} = cast t-castTerm t@MulNumTerm {} = cast t-castTerm t@AbsNumTerm {} = cast t-castTerm t@SignumNumTerm {} = cast t-castTerm t@LtOrdTerm {} = cast t-castTerm t@LeOrdTerm {} = cast t-castTerm t@AndBitsTerm {} = cast t-castTerm t@OrBitsTerm {} = cast t-castTerm t@XorBitsTerm {} = cast t-castTerm t@ComplementBitsTerm {} = cast t-castTerm t@ShiftLeftTerm {} = cast t-castTerm t@ShiftRightTerm {} = cast t-castTerm t@RotateLeftTerm {} = cast t-castTerm t@RotateRightTerm {} = cast t-castTerm t@ToSignedTerm {} = cast t-castTerm t@ToUnsignedTerm {} = cast t-castTerm t@BVConcatTerm {} = cast t-castTerm t@BVSelectTerm {} = cast t-castTerm t@BVExtendTerm {} = cast t-castTerm t@ApplyTerm {} = cast t-castTerm t@DivIntegralTerm {} = cast t-castTerm t@ModIntegralTerm {} = cast t-castTerm t@QuotIntegralTerm {} = cast t-castTerm t@RemIntegralTerm {} = cast t-castTerm t@FPTraitTerm {} = cast t-castTerm t@FdivTerm {} = cast t-castTerm t@RecipTerm {} = cast t-castTerm t@SqrtTerm {} = cast t-castTerm t@FPUnaryTerm {} = cast t-castTerm t@FPBinaryTerm {} = cast t-castTerm t@FPRoundingUnaryTerm {} = cast t-castTerm t@FPRoundingBinaryTerm {} = cast t-castTerm t@FPFMATerm {} = cast t+castTerm t = introSupportedPrimConstraint t $ cast t {-# INLINE castTerm #-} -- | Compute the size of a list of terms. Do not count the same term twice. someTermsSize :: [SomeTerm] -> Int-someTermsSize terms = S.size $ execState (traverse goSome terms) S.empty+someTermsSize terms = HS.size $ execState (traverse goSome terms) HS.empty where- exists t = gets (S.member (SomeTerm t))- add t = modify' (S.insert (SomeTerm t))- goSome :: SomeTerm -> State (S.HashSet SomeTerm) ()+ exists t = gets (HS.member (SomeTerm t))+ add t = modify' (HS.insert (SomeTerm t))+ goSome :: SomeTerm -> State (HS.HashSet SomeTerm) () goSome (SomeTerm b) = go b- go :: forall b. Term b -> State (S.HashSet SomeTerm) ()+ go :: forall b. Term b -> State (HS.HashSet SomeTerm) () go t@ConTerm {} = add t go t@SymTerm {} = add t+ go t@(ForallTerm _ _ arg) = goUnary t arg+ go t@(ExistsTerm _ _ arg) = goUnary t arg go t@(UnaryTerm _ _ arg) = goUnary t arg go t@(BinaryTerm _ _ arg1 arg2) = goBinary t arg1 arg2 go t@(TernaryTerm _ _ arg1 arg2 arg3) = goTernary t arg1 arg2 arg3@@ -239,6 +308,13 @@ go t@(OrTerm _ arg1 arg2) = goBinary t arg1 arg2 go t@(AndTerm _ arg1 arg2) = goBinary t arg1 arg2 go t@(EqTerm _ arg1 arg2) = goBinary t arg1 arg2+ go t@(DistinctTerm _ args) = do+ b <- exists t+ if b+ then return ()+ else do+ add t+ traverse_ go args go t@(ITETerm _ cond arg1 arg2) = goTernary t cond arg1 arg2 go t@(AddNumTerm _ arg1 arg2) = goBinary t arg1 arg2 go t@(NegNumTerm _ arg) = goUnary t arg@@ -255,8 +331,8 @@ go t@(ShiftRightTerm _ arg n) = goBinary t arg n go t@(RotateLeftTerm _ arg n) = goBinary t arg n go t@(RotateRightTerm _ arg n) = goBinary t arg n- go t@(ToSignedTerm _ arg) = goUnary t arg- go t@(ToUnsignedTerm _ arg) = goUnary t arg+ go t@(BitCastTerm _ arg) = goUnary t arg+ go t@(BitCastOrTerm _ d arg) = goBinary t d arg go t@(BVConcatTerm _ arg1 arg2) = goBinary t arg1 arg2 go t@(BVSelectTerm _ _ _ arg) = goUnary t arg go t@(BVExtendTerm _ _ _ arg) = goUnary t arg@@ -268,13 +344,18 @@ go t@(FPTraitTerm _ _ arg) = goUnary t arg go t@(FdivTerm _ arg1 arg2) = goBinary t arg1 arg2 go t@(RecipTerm _ arg) = goUnary t arg- go t@(SqrtTerm _ arg) = goUnary t arg+ go t@(FloatingUnaryTerm _ _ arg) = goUnary t arg+ go t@(PowerTerm _ arg1 arg2) = goBinary t arg1 arg2 go t@(FPUnaryTerm _ _ arg) = goUnary t arg go t@(FPBinaryTerm _ _ arg1 arg2) = goBinary t arg1 arg2 go t@(FPRoundingUnaryTerm _ _ _ arg) = goUnary t arg go t@(FPRoundingBinaryTerm _ _ _ arg1 arg2) = goBinary t arg1 arg2 go t@(FPFMATerm _ _ arg1 arg2 arg3) = goTernary t arg1 arg2 arg3- goUnary :: forall a b. (SupportedPrim a) => Term a -> Term b -> State (S.HashSet SomeTerm) ()+ go t@(FromIntegralTerm _ arg) = goUnary t arg+ go t@(FromFPOrTerm _ d mode arg) =+ goTernary t d mode arg+ go t@(ToFPTerm _ mode arg _ _) = goBinary t mode arg+ goUnary :: forall a b. (SupportedPrim a) => Term a -> Term b -> State (HS.HashSet SomeTerm) () goUnary t arg = do b <- exists t if b@@ -288,7 +369,7 @@ Term a -> Term b -> Term c ->- State (S.HashSet SomeTerm) ()+ State (HS.HashSet SomeTerm) () goBinary t arg1 arg2 = do b <- exists t if b@@ -304,7 +385,7 @@ Term b -> Term c -> Term d ->- State (S.HashSet SomeTerm) ()+ State (HS.HashSet SomeTerm) () goTernary t arg1 arg2 arg3 = do b <- exists t if b@@ -323,7 +404,9 @@ -- | Compute the size of a list of terms. Do not count the same term twice. termsSize :: [Term a] -> Int-termsSize terms = someTermsSize $ (\x -> introSupportedPrimConstraint x $ SomeTerm x) <$> terms+termsSize terms =+ someTermsSize $+ (\x -> introSupportedPrimConstraint x $ SomeTerm x) <$> terms {-# INLINEABLE termsSize #-} -- | Compute the size of a term.
+ src/Grisette/Internal/SymPrim/Quantifier.hs view
@@ -0,0 +1,199 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}++-- |+-- Module : Grisette.Internal.SymPrim.Quantifier+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.SymPrim.Quantifier+ ( forallSet,+ forallSym,+ existsSet,+ existsSym,+ forallFresh,+ existsFresh,+ )+where++import Data.Bifunctor (Bifunctor (first))+import qualified Data.HashSet as HS+import Data.List (sort)+import GHC.Stack (HasCallStack)+import Grisette.Internal.Core.Control.Monad.Union (Union, liftUnion)+import Grisette.Internal.Core.Data.Class.ExtractSym+ ( ExtractSym (extractSymMaybe),+ )+import Grisette.Internal.Core.Data.Class.GenSym+ ( Fresh,+ FreshT (FreshT),+ GenSym (fresh),+ MonadFresh,+ liftFresh,+ )+import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)+import Grisette.Internal.Core.Data.Class.PlainUnion (simpleMerge)+import Grisette.Internal.Core.Data.Class.TryMerge (TryMerge, mrgSingle)+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( SomeTypedSymbol (SomeTypedSymbol),+ TypedSymbol (TypedSymbol),+ existsTerm,+ forallTerm,+ )+import Grisette.Internal.SymPrim.Prim.Model+ ( ConstantSymbolSet,+ SymbolSet (SymbolSet),+ )+import Grisette.Internal.SymPrim.SymBool (SymBool (SymBool))++-- $setup+-- >>> import Grisette.Core+-- >>> import Grisette.SymPrim+-- >>> import Grisette.Backend+-- >>> import Grisette.Lib.Base++-- | Forall quantifier over a set of constant symbols. Quantifier over functions+-- is not supported.+--+-- >>> let xsym = "x" :: TypedConstantSymbol Integer+-- >>> let ysym = "y" :: TypedConstantSymbol Integer+-- >>> let x = "x" :: SymInteger+-- >>> let y = "y" :: SymInteger+-- >>> forallSet (buildSymbolSet [xsym, ysym]) (x .== y)+-- (forall x :: Integer (forall y :: Integer (= x y)))+--+-- Only available with SBV 10.1.0 or later.+forallSet :: ConstantSymbolSet -> SymBool -> SymBool+forallSet (SymbolSet set) b =+ foldr+ ( \(SomeTypedSymbol _ s@TypedSymbol {}) (SymBool b') ->+ SymBool $ forallTerm s b'+ )+ b+ (sort $ HS.toList set)++-- | Forall quantifier over all symbolic constants in a value. Quantifier over+-- functions is not supported.+--+-- >>> let a = ["x", "y"] :: [SymInteger]+-- >>> forallSym a $ sum a .== 0+-- (forall x :: Integer (forall y :: Integer (= (+ x y) 0)))+--+-- Only available with sbv 10.1.0 or later.+forallSym :: (HasCallStack, ExtractSym a) => a -> SymBool -> SymBool+forallSym s b =+ case extractSymMaybe s of+ Just s' -> forallSet s' b+ Nothing ->+ error+ "Cannot use forall here. Only non-function symbols can be quantified."++-- | Exists quantifier over a set of constant symbols. Quantifier over functions+-- is not supported.+--+-- >>> let xsym = "x" :: TypedConstantSymbol Integer+-- >>> let ysym = "y" :: TypedConstantSymbol Integer+-- >>> let x = "x" :: SymInteger+-- >>> let y = "y" :: SymInteger+-- >>> existsSet (buildSymbolSet [xsym, ysym]) (x .== y)+-- (exists x :: Integer (exists y :: Integer (= x y)))+--+-- Only available with SBV 10.1.0 or later.+existsSet :: ConstantSymbolSet -> SymBool -> SymBool+existsSet (SymbolSet set) b =+ foldr+ ( \(SomeTypedSymbol _ s@TypedSymbol {}) (SymBool b') ->+ SymBool $ existsTerm s b'+ )+ b+ (sort $ HS.toList set)++-- | Exists quantifier over all symbolic constants in a value. Quantifier over+-- functions is not supported.+--+-- >>> let a = ["x", "y"] :: [SymInteger]+-- >>> existsSym a $ sum a .== 0+-- (exists x :: Integer (exists y :: Integer (= (+ x y) 0)))+--+-- Only available with sbv 10.1.0 or later.+existsSym :: (HasCallStack, ExtractSym a) => a -> SymBool -> SymBool+existsSym s b =+ case extractSymMaybe s of+ Just s' -> existsSet s' b+ Nothing ->+ error+ "Cannot use exists here. Only non-function symbols can be quantified."++freshTUnionToFreshUnion ::+ forall a.+ (Mergeable a) =>+ FreshT Union a ->+ Fresh (Union a)+freshTUnionToFreshUnion (FreshT v) =+ FreshT $ \ident index ->+ return $ simpleMerge $ first mrgSingle <$> v ident index++-- | Forall quantifier over symbolic constants in a freshly generated value.+-- Quantifier over functions is not supported.+--+-- >>> :{+-- x :: Fresh SymBool+-- x = forallFresh () $ \(a :: SymBool) ->+-- existsFresh () $ \(b :: SymBool) ->+-- mrgReturn $ a .== b+-- :}+--+-- >>> runFresh x "x"+-- (forall x@0 :: Bool (exists x@1 :: Bool (= x@0 x@1)))+--+-- Only available with sbv 10.1.0 or later.+forallFresh ::+ ( HasCallStack,+ ExtractSym v,+ MonadFresh m,+ GenSym spec v,+ TryMerge m+ ) =>+ spec ->+ (v -> FreshT Union SymBool) ->+ m SymBool+forallFresh spec f = do+ u <- fresh spec+ p <- liftFresh . fmap simpleMerge . freshTUnionToFreshUnion $ do+ liftUnion u >>= f+ mrgSingle $ forallSym u p++-- | Exists quantifier over symbolic constants in a freshly generated value.+-- Quantifier over functions is not supported.+--+-- >>> :{+-- x :: Fresh SymBool+-- x = forallFresh () $ \(a :: SymBool) ->+-- existsFresh () $ \(b :: SymBool) ->+-- mrgReturn $ a .== b+-- :}+--+-- >>> runFresh x "x"+-- (forall x@0 :: Bool (exists x@1 :: Bool (= x@0 x@1)))+--+-- Only available with sbv 10.1.0 or later.+existsFresh ::+ ( HasCallStack,+ ExtractSym v,+ MonadFresh m,+ GenSym spec v,+ TryMerge m+ ) =>+ spec ->+ (v -> FreshT Union SymBool) ->+ m SymBool+existsFresh spec f = do+ u <- fresh spec+ p <- liftFresh . fmap simpleMerge . freshTUnionToFreshUnion $ do+ liftUnion u >>= f+ mrgSingle $ existsSym u p
src/Grisette/Internal/SymPrim/SomeBV.hs view
@@ -1,9 +1,13 @@ {-# LANGUAGE DataKinds #-}+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE RankNTypes #-}@@ -24,6 +28,7 @@ -- Portability : GHC only module Grisette.Internal.SymPrim.SomeBV ( SomeBV (..),+ SomeBVException (..), -- * Constructing and pattern matching on SomeBV unsafeSomeBV,@@ -58,7 +63,7 @@ where import Control.DeepSeq (NFData (rnf))-import Control.Exception (throw)+import Control.Exception (Exception, throw) import Control.Monad.Except (ExceptT, MonadError (throwError), runExceptT) import Data.Bifunctor (Bifunctor (bimap)) import Data.Bits@@ -90,8 +95,11 @@ ) import Data.Data (Proxy (Proxy)) import Data.Hashable (Hashable (hashWithSalt))-import Data.Maybe (fromJust)+import Data.Maybe (catMaybes, fromJust, isJust)+import qualified Data.Text as T import Data.Type.Equality (type (:~:) (Refl))+import GHC.Exception (Exception (displayException))+import GHC.Generics (Generic) import GHC.TypeNats ( KnownNat, Nat,@@ -100,6 +108,7 @@ type (+), type (<=), )+import Generics.Deriving (Default (Default)) import Grisette.Internal.Core.Control.Monad.Union (Union) import Grisette.Internal.Core.Data.Class.BitVector ( BV (bv, bvConcat, bvExt, bvSelect, bvSext, bvZext),@@ -116,7 +125,7 @@ ( EvalSym (evalSym), ) import Grisette.Internal.Core.Data.Class.ExtractSym- ( ExtractSym (extractSym),+ ( ExtractSym (extractSymMaybe), ) import Grisette.Internal.Core.Data.Class.GenSym ( GenSym (fresh),@@ -131,8 +140,9 @@ import Grisette.Internal.Core.Data.Class.PPrint ( PPrint (pformat), )-import Grisette.Internal.Core.Data.Class.SafeDivision- ( SafeDivision (safeDiv, safeDivMod, safeMod, safeQuot, safeQuotRem, safeRem),+import Grisette.Internal.Core.Data.Class.SafeDiv+ ( DivOr (divModOr, divOr, modOr, quotOr, quotRemOr, remOr),+ SafeDiv (safeDiv, safeDivMod, safeMod, safeQuot, safeQuotRem, safeRem), ) import Grisette.Internal.Core.Data.Class.SafeLinearArith ( SafeLinearArith (safeAdd, safeNeg, safeSub),@@ -157,7 +167,9 @@ import Grisette.Internal.Core.Data.Class.SubstSym ( SubstSym (substSym), )-import Grisette.Internal.Core.Data.Class.SymEq (SymEq ((./=), (.==)))+import Grisette.Internal.Core.Data.Class.SymEq+ ( SymEq (symDistinct, (./=), (.==)),+ ) import Grisette.Internal.Core.Data.Class.SymOrd ( SymOrd (symCompare, (.<), (.<=), (.>), (.>=)), )@@ -173,8 +185,7 @@ import Grisette.Internal.Core.Data.Symbol (Identifier, Symbol) import Grisette.Internal.SymPrim.AllSyms (AllSyms (allSyms, allSymsS)) import Grisette.Internal.SymPrim.BV- ( BitwidthMismatch (BitwidthMismatch),- IntN,+ ( IntN, WordN, ) import Grisette.Internal.SymPrim.SymBV@@ -197,24 +208,101 @@ import Test.QuickCheck (Arbitrary (arbitrary), Gen) import Unsafe.Coerce (unsafeCoerce) +-- | An exception that would be thrown when operations are performed on+-- incompatible bit widths.+data SomeBVException = BitwidthMismatch | UndeterminedBitwidth T.Text+ deriving (Show, Eq, Ord, Generic)+ deriving anyclass (Hashable, NFData)+ deriving+ ( Mergeable,+ ExtractSym,+ PPrint,+ SubstSym,+ EvalSym,+ SymEq,+ SymOrd,+ ToCon SomeBVException,+ ToSym SomeBVException+ )+ via (Default (SomeBVException))++instance Exception SomeBVException where+ displayException BitwidthMismatch = "Bit width does not match"+ displayException (UndeterminedBitwidth msg) =+ "Cannot determine bit-width for literals: " <> T.unpack msg++assignBitWidthList ::+ forall bv.+ (forall n. (KnownNat n, 1 <= n) => Num (bv n)) =>+ T.Text ->+ [SomeBV bv] ->+ Either SomeBVException [SomeBV bv]+assignBitWidthList msg bvs = case allNonMaybeBitWidth of+ [] -> Left $ UndeterminedBitwidth msg+ (x : xs) ->+ if all (== x) xs+ then case allHasBitWidth of+ (SomeBV (i :: bv i) : _) -> Right $ fmap (assignSingleBitWidth i) bvs+ _ -> error "Should not happen"+ else Left BitwidthMismatch+ where+ maybeBitWidth :: SomeBV bv -> Maybe Int+ maybeBitWidth (SomeBV (_ :: bv n)) = Just $ fromIntegral $ natVal (Proxy @n)+ maybeBitWidth (SomeBVLit _) = Nothing+ allMaybeBitWidth = map maybeBitWidth bvs+ allNonMaybeBitWidth = catMaybes allMaybeBitWidth+ allHasBitWidth = filter (isJust . maybeBitWidth) bvs+ assignSingleBitWidth ::+ forall i. (KnownNat i, 1 <= i) => bv i -> SomeBV bv -> SomeBV bv+ assignSingleBitWidth _ s@(SomeBV _) = s+ assignSingleBitWidth _ (SomeBVLit i) = SomeBV (fromIntegral i :: bv i)++class AssignBitWidth a where+ assignBitWidth :: T.Text -> a -> Either SomeBVException a++instance+ (forall n. (KnownNat n, 1 <= n) => Num (bv n)) =>+ AssignBitWidth (SomeBV bv, SomeBV bv)+ where+ assignBitWidth msg (a, b) = do+ l <- assignBitWidthList msg [a, b]+ case l of+ [a', b'] -> Right (a', b')+ _ -> error "Should not happen"++instance+ (forall n. (KnownNat n, 1 <= n) => Num (bv n)) =>+ AssignBitWidth (SomeBV bv, SomeBV bv, SomeBV bv)+ where+ assignBitWidth msg (a, b, c) = do+ l <- assignBitWidthList msg [a, b, c]+ case l of+ [a', b', c'] -> Right (a', b', c')+ _ -> error "Should not happen"++instance+ (forall n. (KnownNat n, 1 <= n) => Num (bv n)) =>+ AssignBitWidth (SomeBV bv, SomeBV bv, SomeBV bv, SomeBV bv)+ where+ assignBitWidth msg (a, b, c, d) = do+ l <- assignBitWidthList msg [a, b, c, d]+ case l of+ [a', b', c', d'] -> Right (a', b', c', d')+ _ -> error "Should not happen"+ -- $setup -- >>> import Grisette.Core -- >>> import Grisette.SymPrim--- >>> :set -XDataKinds--- >>> :set -XBinaryLiterals--- >>> :set -XFlexibleContexts--- >>> :set -XFlexibleInstances--- >>> :set -XFunctionalDependencies -- | Non-indexed bitvectors. ----- The creation of 'SomeBV' can be done with the `bv` function with a positive+-- The creation of t'SomeBV' can be done with the `bv` function with a positive -- bit width and a value: -- -- >>> bv 4 0xf :: SomeBV IntN -- 0xf ----- Operations on two 'SomeBV' values require the bitwidths to be the same. So+-- Operations on two t'SomeBV' values require the bitwidths to be the same. So -- you should check for the bit width (via `finiteBitSize`) before performing -- operations: --@@ -229,15 +317,43 @@ -- -- >>> (bv 4 0x3 :: SomeBV IntN) == (bv 8 0x3) -- False+--+-- __Note__: t'SomeBV' can be constructed out of integer literals without the+-- bit width provided. Further binary operations will usually require at least+-- one operand has the bit-width, and will use that as the bit-width for the+-- result.+--+-- For example:+--+-- 3 :: SomeBV IntN+-- bvlit(3)+-- >>> bv 4 0x1 + 3 :: SomeBV IntN+-- 0x4+-- >>> 3 * bv 4 0x1 :: SomeBV IntN+-- 0x3+-- >>> 3 * 3 :: SomeBV IntN+-- *** Exception: UndeterminedBitwidth "(*)"+--+-- Some operations allows the literals to be used without the bit-width, such as+-- '(+)', '(-)', 'negate', 'toUnsigned', 'toSigned', '.&.', '.|.', 'xor',+-- 'complement', 'setBit', 'clearBit', 'complementBit', 'shiftL', and+-- 'unsafeShiftL'.+--+-- >>> 3 + 3 :: SomeBV IntN+-- bvlit(6) data SomeBV bv where SomeBV :: (KnownNat n, 1 <= n) => bv n -> SomeBV bv+ SomeBVLit :: Integer -> SomeBV bv instance- (forall n. (KnownNat n, 1 <= n) => Hashable (bv n)) =>+ ( forall n. (KnownNat n, 1 <= n) => Hashable (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) => Hashable (SomeBV bv) where hashWithSalt s (SomeBV (bv :: bv n)) = s `hashWithSalt` (natVal (Proxy @n)) `hashWithSalt` bv+ hashWithSalt s (SomeBVLit i) = s `hashWithSalt` i {-# INLINE hashWithSalt #-} instance@@ -245,12 +361,15 @@ Lift (SomeBV bv) where liftTyped (SomeBV bv) = [||SomeBV bv||]+ liftTyped (SomeBVLit i) = [||SomeBVLit i||]+ {-# INLINE liftTyped #-} instance (forall n. (KnownNat n, 1 <= n) => Show (bv n)) => Show (SomeBV bv) where show (SomeBV bv) = show bv+ show (SomeBVLit i) = "bvlit(" <> show i <> ")" {-# INLINE show #-} instance@@ -258,65 +377,84 @@ NFData (SomeBV bv) where rnf (SomeBV bv) = rnf bv+ rnf (SomeBVLit i) = rnf i {-# INLINE rnf #-} -instance (forall n. (KnownNat n, 1 <= n) => Eq (bv n)) => Eq (SomeBV bv) where+instance+ ( forall n. (KnownNat n, 1 <= n) => Eq (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) =>+ Eq (SomeBV bv)+ where SomeBV (l :: bv l) == SomeBV (r :: bv r) = case sameNat (Proxy @l) (Proxy @r) of Just Refl -> l == r Nothing -> False+ SomeBV (l :: bv l) == SomeBVLit r = l == fromIntegral r+ SomeBVLit l == SomeBV r = fromIntegral l == r+ SomeBVLit _ == SomeBVLit _ = throw $ UndeterminedBitwidth "==" {-# INLINE (==) #-} SomeBV (l :: bv l) /= SomeBV (r :: bv r) = case sameNat (Proxy @l) (Proxy @r) of Just Refl -> l /= r Nothing -> True+ SomeBV (l :: bv l) /= SomeBVLit r = l /= fromIntegral r+ SomeBVLit l /= SomeBV r = fromIntegral l /= r+ SomeBVLit _ /= SomeBVLit _ = throw $ UndeterminedBitwidth "/=" {-# INLINE (/=) #-} -instance (forall n. (KnownNat n, 1 <= n) => Ord (bv n)) => Ord (SomeBV bv) where- (<) = binSomeBV (<)+instance+ ( forall n. (KnownNat n, 1 <= n) => Ord (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) =>+ Ord (SomeBV bv)+ where+ (<) = binSomeBV (<) (const $ const $ throw $ UndeterminedBitwidth "<") {-# INLINE (<) #-}- (<=) = binSomeBV (<=)+ (<=) = binSomeBV (<=) (const $ const $ throw $ UndeterminedBitwidth "(<=)") {-# INLINE (<=) #-}- (>) = binSomeBV (>)+ (>) = binSomeBV (>) (const $ const $ throw $ UndeterminedBitwidth ">") {-# INLINE (>) #-}- (>=) = binSomeBV (>=)+ (>=) = binSomeBV (>=) (const $ const $ throw $ UndeterminedBitwidth "(>=)") {-# INLINE (>=) #-}- max = binSomeBVR1 max+ max = binSomeBVR1 max (const $ const $ throw $ UndeterminedBitwidth "max") {-# INLINE max #-}- min = binSomeBVR1 min+ min = binSomeBVR1 min (const $ const $ throw $ UndeterminedBitwidth "min") {-# INLINE min #-}- compare = binSomeBV compare+ compare =+ binSomeBV compare (const $ const $ throw $ UndeterminedBitwidth "compare") {-# INLINE compare #-} instance (forall n. (KnownNat n, 1 <= n) => Num (bv n)) => Num (SomeBV bv) where- (+) = binSomeBVR1 (+)+ (+) = binSomeBVR1 (+) (+) {-# INLINE (+) #-}- (-) = binSomeBVR1 (-)+ (-) = binSomeBVR1 (-) (-) {-# INLINE (-) #-}- (*) = binSomeBVR1 (*)+ (*) = binSomeBVR1 (*) (const $ const $ throw $ UndeterminedBitwidth "(*)") {-# INLINE (*) #-}- negate = unarySomeBVR1 negate+ negate = unarySomeBVR1 negate negate {-# INLINE negate #-}- abs = unarySomeBVR1 abs+ abs = unarySomeBVR1 abs (const $ throw $ UndeterminedBitwidth "abs") {-# INLINE abs #-}- signum = unarySomeBVR1 signum+ signum = unarySomeBVR1 signum (const $ throw $ UndeterminedBitwidth "signum") {-# INLINE signum #-}- fromInteger =- error $- "fromInteger is not defined for SomeBV as no bitwidth is known, use "- <> "(bv <bitwidth> <value>) instead"+ fromInteger = SomeBVLit {-# INLINE fromInteger #-} instance- (forall n. (KnownNat n, 1 <= n) => Bits (bv n)) =>+ ( forall n. (KnownNat n, 1 <= n) => Bits (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) => Bits (SomeBV bv) where- (.&.) = binSomeBVR1 (.&.)- (.|.) = binSomeBVR1 (.|.)- xor = binSomeBVR1 xor- complement = unarySomeBVR1 complement- shift s i = unarySomeBVR1 (`shift` i) s- rotate s i = unarySomeBVR1 (`rotate` i) s+ (.&.) = binSomeBVR1 (.&.) (.&.)+ (.|.) = binSomeBVR1 (.|.) (.|.)+ xor = binSomeBVR1 xor xor+ complement = unarySomeBVR1 complement complement+ shift s i =+ unarySomeBVR1 (`shift` i) (const $ throw $ UndeterminedBitwidth "shift") s+ rotate s i =+ unarySomeBVR1 (`rotate` i) (const $ throw $ UndeterminedBitwidth "rotate") s zeroBits = error $ "zeroBits is not defined for SomeBV as no bitwidth is known, use "@@ -325,30 +463,63 @@ error $ "bit is not defined for SomeBV as no bitwidth is known, use " <> "(SomeBV (bit <bit> :: bv <bitwidth>)) instead"- setBit s i = unarySomeBVR1 (`setBit` i) s- clearBit s i = unarySomeBVR1 (`clearBit` i) s- complementBit s i = unarySomeBVR1 (`complementBit` i) s- testBit s i = unarySomeBV (`testBit` i) s- bitSizeMaybe = unarySomeBV bitSizeMaybe- bitSize = fromJust . unarySomeBV bitSizeMaybe+ setBit s i = unarySomeBVR1 (`setBit` i) (`setBit` i) s+ clearBit s i = unarySomeBVR1 (`clearBit` i) (`clearBit` i) s+ complementBit s i = unarySomeBVR1 (`complementBit` i) (`complementBit` i) s+ testBit s i =+ unarySomeBV (`testBit` i) (const $ throw $ UndeterminedBitwidth "testBit") s+ bitSizeMaybe =+ unarySomeBV+ bitSizeMaybe+ (const $ throw $ UndeterminedBitwidth "bitSizeMaybe")+ bitSize =+ fromJust+ . unarySomeBV+ bitSizeMaybe+ (const $ throw $ UndeterminedBitwidth "bitSize") isSigned _ = False- shiftL s i = unarySomeBVR1 (`shiftL` i) s- unsafeShiftL s i = unarySomeBVR1 (`unsafeShiftL` i) s- shiftR s i = unarySomeBVR1 (`shiftR` i) s- unsafeShiftR s i = unarySomeBVR1 (`unsafeShiftR` i) s- rotateL s i = unarySomeBVR1 (`rotateL` i) s- rotateR s i = unarySomeBVR1 (`rotateR` i) s- popCount = unarySomeBV popCount+ shiftL s i = unarySomeBVR1 (`shiftL` i) (`shiftL` i) s+ unsafeShiftL s i = unarySomeBVR1 (`unsafeShiftL` i) (`unsafeShiftL` i) s+ shiftR s i =+ unarySomeBVR1 (`shiftR` i) (const $ throw $ UndeterminedBitwidth "shiftR") s+ unsafeShiftR s i =+ unarySomeBVR1+ (`unsafeShiftR` i)+ (const $ throw $ UndeterminedBitwidth "unsafeShiftR")+ s+ rotateL s i =+ unarySomeBVR1+ (`rotateL` i)+ (const $ throw $ UndeterminedBitwidth "rotateL")+ s+ rotateR s i =+ unarySomeBVR1+ (`rotateR` i)+ (const $ throw $ UndeterminedBitwidth "rotateR")+ s+ popCount =+ unarySomeBV popCount (const $ throw $ UndeterminedBitwidth "popCount") instance- (forall n. (KnownNat n, 1 <= n) => FiniteBits (bv n)) =>+ ( forall n. (KnownNat n, 1 <= n) => FiniteBits (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) => FiniteBits (SomeBV bv) where- finiteBitSize = unarySomeBV finiteBitSize+ finiteBitSize =+ unarySomeBV+ finiteBitSize+ (const $ throw $ UndeterminedBitwidth "finiteBitSize") {-# INLINE finiteBitSize #-}- countLeadingZeros = unarySomeBV countLeadingZeros+ countLeadingZeros =+ unarySomeBV+ countLeadingZeros+ (const $ throw $ UndeterminedBitwidth "countLeadingZeros") {-# INLINE countLeadingZeros #-}- countTrailingZeros = unarySomeBV countTrailingZeros+ countTrailingZeros =+ unarySomeBV+ countTrailingZeros+ (const $ throw $ UndeterminedBitwidth "countTrailingZeros") {-# INLINE countTrailingZeros #-} instance@@ -360,33 +531,38 @@ "toEnum is not defined for SomeBV, use " <> "(SomeBV (toEnum <value> :: bv <bitwidth>)) instead" {-# INLINE toEnum #-}- fromEnum = unarySomeBV fromEnum+ fromEnum =+ unarySomeBV fromEnum (const $ throw $ UndeterminedBitwidth "fromEnum") {-# INLINE fromEnum #-} instance (forall n. (KnownNat n, 1 <= n) => Real (bv n)) => Real (SomeBV bv) where- toRational = unarySomeBV toRational+ toRational =+ unarySomeBV toRational (const $ throw $ UndeterminedBitwidth "toRational") {-# INLINE toRational #-} instance (forall n. (KnownNat n, 1 <= n) => Integral (bv n)) => Integral (SomeBV bv) where- toInteger = unarySomeBV toInteger+ toInteger =+ unarySomeBV+ toInteger+ (const $ throw $ UndeterminedBitwidth "toInteger") {-# INLINE toInteger #-}- quot = binSomeBVR1 quot+ quot = binSomeBVR1 quot (const $ throw $ UndeterminedBitwidth "quot") {-# INLINE quot #-}- rem = binSomeBVR1 rem+ rem = binSomeBVR1 rem (const $ throw $ UndeterminedBitwidth "rem") {-# INLINE rem #-}- div = binSomeBVR1 div+ div = binSomeBVR1 div (const $ throw $ UndeterminedBitwidth "div") {-# INLINE div #-}- mod = binSomeBVR1 mod+ mod = binSomeBVR1 mod (const $ throw $ UndeterminedBitwidth "mod") {-# INLINE mod #-}- quotRem = binSomeBVR2 quotRem+ quotRem = binSomeBVR2 quotRem (const $ throw $ UndeterminedBitwidth "quotRem") {-# INLINE quotRem #-}- divMod = binSomeBVR2 divMod+ divMod = binSomeBVR2 divMod (const $ throw $ UndeterminedBitwidth "divMod") {-# INLINE divMod #-} instance (SizedBV bv) => BV (SomeBV bv) where@@ -396,6 +572,7 @@ ) of (LeqProof, KnownProof) -> SomeBV $ sizedBVConcat a b+ bvConcat _ _ = throw $ UndeterminedBitwidth "bvConcat" {-# INLINE bvConcat #-} bvZext l (SomeBV (a :: bv n)) | l < n = error "bvZext: trying to zero extend a value to a smaller size"@@ -409,6 +586,7 @@ unsafeLeqProof @n @l ) of (KnownProof, LeqProof, LeqProof) -> SomeBV $ sizedBVZext p a+ bvZext _ _ = throw $ UndeterminedBitwidth "bvZext" {-# INLINE bvZext #-} bvSext l (SomeBV (a :: bv n)) | l < n = error "bvSext: trying to zero extend a value to a smaller size"@@ -422,6 +600,7 @@ unsafeLeqProof @n @l ) of (KnownProof, LeqProof, LeqProof) -> SomeBV $ sizedBVSext p a+ bvSext _ _ = throw $ UndeterminedBitwidth "bvSext" {-# INLINE bvSext #-} bvExt l (SomeBV (a :: bv n)) | l < n = error "bvExt: trying to zero extend a value to a smaller size"@@ -435,6 +614,7 @@ unsafeLeqProof @n @l ) of (KnownProof, LeqProof, LeqProof) -> SomeBV $ sizedBVExt p a+ bvExt _ _ = throw $ UndeterminedBitwidth "bvExt" {-# INLINE bvExt #-} bvSelect ix w (SomeBV (a :: bv n)) | ix + w > n =@@ -454,6 +634,7 @@ ) of (KnownProof, KnownProof, LeqProof, LeqProof) -> SomeBV $ sizedBVSelect (Proxy @ix) (Proxy @w) a+ bvSelect _ _ _ = throw $ UndeterminedBitwidth "bvSelect" bv n i = unsafeSomeBV n $ \_ -> sizedBVFromIntegral i {-# INLINE bv #-} @@ -461,21 +642,22 @@ (forall n. (KnownNat n, 1 <= n) => EvalSym (bv n)) => EvalSym (SomeBV bv) where- evalSym fillDefault model = unarySomeBVR1 (evalSym fillDefault model)+ evalSym fillDefault model = unarySomeBVR1 (evalSym fillDefault model) id {-# INLINE evalSym #-} instance (forall n. (KnownNat n, 1 <= n) => ExtractSym (bv n)) => ExtractSym (SomeBV bv) where- extractSym = unarySomeBV extractSym- {-# INLINE extractSym #-}+ extractSymMaybe = unarySomeBV extractSymMaybe extractSymMaybe+ {-# INLINE extractSymMaybe #-} instance (forall n. (KnownNat n, 1 <= n) => PPrint (bv n)) => PPrint (SomeBV bv) where pformat (SomeBV bv) = pformat bv+ pformat (SomeBVLit i) = "bvlit(" <> pformat i <> ")" {-# INLINE pformat #-} data CompileTimeNat where@@ -513,38 +695,79 @@ (\(SomeBV x) -> unsafeCoerce x) ) -instance (forall n. (KnownNat n, 1 <= n) => SymEq (bv n)) => SymEq (SomeBV bv) where+-- | The 'symDistinct' instance for t'SomeBV' will have the following behavior:+--+-- * If the list is empty or has only one element, it will return 'True'.+-- * If none of the elements have a bit-width, it will throw+-- 'UndeterminedBitwidth' exception.+-- * If the elements have different bit-widths, it will throw a+-- 'BitwidthMismatch' exception.+-- * If there are at least one element have a bit-width, and all elements with+-- known bit-width have the same bit-width, it will generate a single symbolic+-- formula using @distinct@.+instance+ ( forall n. (KnownNat n, 1 <= n) => SymEq (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) =>+ SymEq (SomeBV bv)+ where SomeBV (l :: bv l) .== SomeBV (r :: bv r) = case sameNat (Proxy @l) (Proxy @r) of Just Refl -> l .== r Nothing -> con False+ SomeBV (l :: bv l) .== SomeBVLit r = l .== fromIntegral r+ SomeBVLit l .== SomeBV (r :: bv r) = fromIntegral l .== r+ SomeBVLit _ .== SomeBVLit _ = throw $ UndeterminedBitwidth ".==" {-# INLINE (.==) #-} SomeBV (l :: bv l) ./= SomeBV (r :: bv r) = case sameNat (Proxy @l) (Proxy @r) of Just Refl -> l ./= r Nothing -> con True+ SomeBV (l :: bv l) ./= SomeBVLit r = l ./= fromIntegral r+ SomeBVLit l ./= SomeBV (r :: bv r) = fromIntegral l ./= r+ SomeBVLit _ ./= SomeBVLit _ = throw $ UndeterminedBitwidth "./="+ symDistinct l = case l of+ [] -> con True+ [_] -> con True+ _ -> case assignBitWidthList "symDistinct" l of+ Right (SomeBV (a :: bv a) : l) -> symDistinct $ a : go l+ where+ go :: [SomeBV bv] -> [bv a]+ go [] = []+ go (SomeBV (x :: bv x) : xs) = case sameNat (Proxy @x) (Proxy @a) of+ Just Refl -> x : go xs+ Nothing -> error "Should not happen"+ go (SomeBVLit _ : _) = error "Should not happen"+ Right _ -> error "Should not happen"+ Left UndeterminedBitwidth {} -> throw $ UndeterminedBitwidth "symDistinct"+ Left BitwidthMismatch -> throw BitwidthMismatch {-# INLINE (./=) #-} instance- (forall n. (KnownNat n, 1 <= n) => SymOrd (bv n)) =>+ ( forall n. (KnownNat n, 1 <= n) => SymOrd (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) => SymOrd (SomeBV bv) where- (.<) = binSomeBV (.<)+ (.<) = binSomeBV (.<) (const $ const $ throw $ UndeterminedBitwidth "(.<)") {-# INLINE (.<) #-}- (.<=) = binSomeBV (.<=)+ (.<=) = binSomeBV (.<=) (const $ const $ throw $ UndeterminedBitwidth "(.<=)") {-# INLINE (.<=) #-}- (.>) = binSomeBV (.>)+ (.>) = binSomeBV (.>) (const $ const $ throw $ UndeterminedBitwidth "(.>)") {-# INLINE (.>) #-}- (.>=) = binSomeBV (.>=)+ (.>=) = binSomeBV (.>=) (const $ const $ throw $ UndeterminedBitwidth "(.>=)") {-# INLINE (.>=) #-}- symCompare = binSomeBV symCompare+ symCompare =+ binSomeBV+ symCompare+ (const $ const $ throw $ UndeterminedBitwidth "symCompare") {-# INLINE symCompare #-} instance (forall n. (KnownNat n, 1 <= n) => SubstSym (bv n)) => SubstSym (SomeBV bv) where- substSym c s = unarySomeBVR1 (substSym c s)+ substSym c s = unarySomeBVR1 (substSym c s) id {-# INLINE substSym #-} instance@@ -577,6 +800,7 @@ GenSym (SomeBV bv) (SomeBV bv) where fresh (SomeBV (_ :: bv x)) = fresh (Proxy @x)+ fresh (SomeBVLit _) = throw $ UndeterminedBitwidth "fresh" {-# INLINE fresh #-} instance@@ -586,6 +810,7 @@ GenSymSimple (SomeBV bv) (SomeBV bv) where simpleFresh (SomeBV (_ :: bv x)) = simpleFresh (Proxy @x)+ simpleFresh (SomeBVLit _) = throw $ UndeterminedBitwidth "simpleFresh" {-# INLINE simpleFresh #-} instance@@ -620,8 +845,10 @@ SignConversion (SomeBV ubv) (SomeBV sbv) where toSigned (SomeBV (n :: ubv n)) = SomeBV (toSigned n :: sbv n)+ toSigned (SomeBVLit i) = SomeBVLit i {-# INLINE toSigned #-} toUnsigned (SomeBV (n :: sbv n)) = SomeBV (toUnsigned n :: ubv n)+ toUnsigned (SomeBVLit i) = SomeBVLit i {-# INLINE toUnsigned #-} instance@@ -629,6 +856,7 @@ ToCon (SomeBV sbv) (SomeBV cbv) where toCon (SomeBV (n :: sbv n)) = SomeBV <$> (toCon n :: Maybe (cbv n))+ toCon (SomeBVLit i) = Just $ SomeBVLit i {-# INLINE toCon #-} instance@@ -636,44 +864,134 @@ ToSym (SomeBV cbv) (SomeBV sbv) where toSym (SomeBV (n :: cbv n)) = SomeBV (toSym n :: sbv n)+ toSym (SomeBVLit i) = SomeBVLit i {-# INLINE toSym #-} +divRemOrBase0 ::+ ( forall n.+ (KnownNat n, 1 <= n) =>+ (bv n, bv n) ->+ bv n ->+ bv n ->+ (bv n, bv n)+ ) ->+ (SomeBV bv, SomeBV bv) ->+ SomeBV bv ->+ SomeBV bv ->+ (SomeBV bv, SomeBV bv)+divRemOrBase0+ f+ (SomeBV (dd :: bv dd), SomeBV (dm :: bv dm))+ (SomeBV (a :: bv a))+ (SomeBV (b :: bv b)) =+ case ( sameNat (Proxy @a) (Proxy @b),+ sameNat (Proxy @a) (Proxy @dd),+ sameNat (Proxy @a) (Proxy @dm)+ ) of+ (Just Refl, Just Refl, Just Refl) -> bimap SomeBV SomeBV $ f (dd, dm) a b+ _ -> error "Should not happen"+divRemOrBase0 _ _ _ _ = error "Should not happen"+{-# INLINE divRemOrBase0 #-}++divRemOrBase ::+ (forall n. (KnownNat n, 1 <= n) => Num (bv n)) =>+ ( forall n.+ (KnownNat n, 1 <= n) =>+ (bv n, bv n) ->+ bv n ->+ bv n ->+ (bv n, bv n)+ ) ->+ (SomeBV bv, SomeBV bv) ->+ SomeBV bv ->+ SomeBV bv ->+ (SomeBV bv, SomeBV bv)+divRemOrBase f (a, b) c d =+ case assignBitWidth "divRemOrBase" (a, b, c, d) of+ Right (a', b', c', d') -> divRemOrBase0 f (a', b') c' d'+ Left e -> throw e+ instance+ ( forall n. (KnownNat n, 1 <= n) => DivOr (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) =>+ DivOr (SomeBV bv)+ where+ divOr = ternSomeBVR1 divOr+ {-# INLINE divOr #-}+ modOr = ternSomeBVR1 modOr+ {-# INLINE modOr #-}+ quotOr = ternSomeBVR1 quotOr+ {-# INLINE quotOr #-}+ remOr = ternSomeBVR1 remOr+ {-# INLINE remOr #-}+ divModOr = divRemOrBase divModOr+ {-# INLINE divModOr #-}+ quotRemOr = divRemOrBase quotRemOr+ {-# INLINE quotRemOr #-}++instance ( forall n. (KnownNat n, 1 <= n) =>- SafeDivision e (bv n) (ExceptT e m),- MonadError (Either BitwidthMismatch e) m,+ SafeDiv e (bv n) (ExceptT e m),+ MonadError (Either SomeBVException e) m, TryMerge m,- Mergeable e+ Mergeable e,+ forall n. (KnownNat n, 1 <= n) => Num (bv n) ) =>- SafeDivision (Either BitwidthMismatch e) (SomeBV bv) m+ SafeDiv (Either SomeBVException e) (SomeBV bv) m where- safeDiv = binSomeBVSafeR1 (safeDiv @e)+ safeDiv =+ binSomeBVSafeR1+ (safeDiv @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeDiv") {-# INLINE safeDiv #-}- safeMod = binSomeBVSafeR1 (safeMod @e)+ safeMod =+ binSomeBVSafeR1+ (safeMod @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeMod") {-# INLINE safeMod #-}- safeQuot = binSomeBVSafeR1 (safeQuot @e)+ safeQuot =+ binSomeBVSafeR1+ (safeQuot @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeQuot") {-# INLINE safeQuot #-}- safeRem = binSomeBVSafeR1 (safeRem @e)+ safeRem =+ binSomeBVSafeR1+ (safeRem @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeRem") {-# INLINE safeRem #-}- safeDivMod = binSomeBVSafeR2 (safeDivMod @e)+ safeDivMod =+ binSomeBVSafeR2+ (safeDivMod @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeDivMod") {-# INLINE safeDivMod #-}- safeQuotRem = binSomeBVSafeR2 (safeQuotRem @e)+ safeQuotRem =+ binSomeBVSafeR2+ (safeQuotRem @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeQuotRem") {-# INLINE safeQuotRem #-} instance ( forall n. (KnownNat n, 1 <= n) => SafeLinearArith e (bv n) (ExceptT e m),- MonadError (Either BitwidthMismatch e) m,+ MonadError (Either SomeBVException e) m, TryMerge m,- Mergeable e+ Mergeable e,+ forall n. (KnownNat n, 1 <= n) => Num (bv n) ) =>- SafeLinearArith (Either BitwidthMismatch e) (SomeBV bv) m+ SafeLinearArith (Either SomeBVException e) (SomeBV bv) m where- safeAdd = binSomeBVSafeR1 (safeAdd @e)+ safeAdd =+ binSomeBVSafeR1+ (safeAdd @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeAdd") {-# INLINE safeAdd #-}- safeSub = binSomeBVSafeR1 (safeSub @e)+ safeSub =+ binSomeBVSafeR1+ (safeSub @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeSub") {-# INLINE safeSub #-} safeNeg = unarySomeBV@@ -681,108 +999,150 @@ mrgFmap SomeBV $ runExceptT (safeNeg @e v) >>= either (throwError . Right) pure )+ (const $ throwError $ Left $ UndeterminedBitwidth "safeNeg") {-# INLINE safeNeg #-} instance- (forall n. (KnownNat n, 1 <= n) => SymShift (bv n)) =>+ ( forall n. (KnownNat n, 1 <= n) => SymShift (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) => SymShift (SomeBV bv) where- symShift = binSomeBVR1 symShift+ symShift =+ binSomeBVR1+ symShift+ (const $ const $ throw $ UndeterminedBitwidth "safeShift") {-# INLINE symShift #-}- symShiftNegated = binSomeBVR1 symShiftNegated+ symShiftNegated =+ binSomeBVR1+ symShiftNegated+ (const $ const $ throw $ UndeterminedBitwidth "safeShiftNegated") {-# INLINE symShiftNegated #-} instance- (forall n. (KnownNat n, 1 <= n) => SymRotate (bv n)) =>+ ( forall n. (KnownNat n, 1 <= n) => SymRotate (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) => SymRotate (SomeBV bv) where- symRotate = binSomeBVR1 symRotate+ symRotate =+ binSomeBVR1+ symRotate+ (const $ const $ throw $ UndeterminedBitwidth "safeRotate") {-# INLINE symRotate #-}- symRotateNegated = binSomeBVR1 symRotateNegated+ symRotateNegated =+ binSomeBVR1+ symRotateNegated+ (const $ const $ throw $ UndeterminedBitwidth "safeRotateNegated") {-# INLINE symRotateNegated #-} instance ( forall n. (KnownNat n, 1 <= n) => SafeSymShift e (bv n) (ExceptT e m),- MonadError (Either BitwidthMismatch e) m,+ MonadError (Either SomeBVException e) m, TryMerge m,- Mergeable e+ Mergeable e,+ forall n. (KnownNat n, 1 <= n) => Num (bv n) ) =>- SafeSymShift (Either BitwidthMismatch e) (SomeBV bv) m+ SafeSymShift (Either SomeBVException e) (SomeBV bv) m where- safeSymShiftL = binSomeBVSafeR1 (safeSymShiftL @e)+ safeSymShiftL =+ binSomeBVSafeR1+ (safeSymShiftL @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeSymShiftL") {-# INLINE safeSymShiftL #-}- safeSymShiftR = binSomeBVSafeR1 (safeSymShiftR @e)+ safeSymShiftR =+ binSomeBVSafeR1+ (safeSymShiftR @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeSymShiftR") {-# INLINE safeSymShiftR #-}- safeSymStrictShiftL = binSomeBVSafeR1 (safeSymStrictShiftL @e)+ safeSymStrictShiftL =+ binSomeBVSafeR1+ (safeSymStrictShiftL @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeSymStrictShiftL") {-# INLINE safeSymStrictShiftL #-}- safeSymStrictShiftR = binSomeBVSafeR1 (safeSymStrictShiftR @e)+ safeSymStrictShiftR =+ binSomeBVSafeR1+ (safeSymStrictShiftR @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeSymStrictShiftR") {-# INLINE safeSymStrictShiftR #-} instance ( forall n. (KnownNat n, 1 <= n) => SafeSymRotate e (bv n) (ExceptT e m),- MonadError (Either BitwidthMismatch e) m,+ MonadError (Either SomeBVException e) m, TryMerge m,- Mergeable e+ Mergeable e,+ forall n. (KnownNat n, 1 <= n) => Num (bv n) ) =>- SafeSymRotate (Either BitwidthMismatch e) (SomeBV bv) m+ SafeSymRotate (Either SomeBVException e) (SomeBV bv) m where- safeSymRotateL = binSomeBVSafeR1 (safeSymRotateL @e)+ safeSymRotateL =+ binSomeBVSafeR1+ (safeSymRotateL @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeSymRotateL") {-# INLINE safeSymRotateL #-}- safeSymRotateR = binSomeBVSafeR1 (safeSymRotateR @e)+ safeSymRotateR =+ binSomeBVSafeR1+ (safeSymRotateR @e)+ (const $ const $ throwError $ Left $ UndeterminedBitwidth "safeSymRotateR") {-# INLINE safeSymRotateR #-} instance- (forall n. (KnownNat n, 1 <= n) => ITEOp (bv n)) =>+ ( forall n. (KnownNat n, 1 <= n) => ITEOp (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n)+ ) => ITEOp (SomeBV bv) where- symIte cond = binSomeBVR1 (symIte cond)+ symIte cond =+ binSomeBVR1+ (symIte cond)+ (const $ const $ throw $ UndeterminedBitwidth "symIte") instance (forall n. (KnownNat n, 1 <= n) => AllSyms (bv n)) => AllSyms (SomeBV bv) where- allSyms = unarySomeBV allSyms+ allSyms = unarySomeBV allSyms allSyms {-# INLINE allSyms #-}- allSymsS = unarySomeBV allSymsS+ allSymsS = unarySomeBV allSymsS allSymsS {-# INLINE allSymsS #-} -- Synonyms --- | Type synonym for 'SomeBV' for concrete signed bitvectors.+-- | Type synonym for t'SomeBV' for concrete signed bitvectors. type SomeIntN = SomeBV IntN --- | Pattern synonym for 'SomeBV' for concrete signed bitvectors.+-- | Pattern synonym for t'SomeBV' for concrete signed bitvectors. pattern SomeIntN :: () => (KnownNat n, 1 <= n) => IntN n -> SomeIntN pattern SomeIntN a = SomeBV a --- | Type synonym for 'SomeBV' for concrete unsigned bitvectors.+-- | Type synonym for t'SomeBV' for concrete unsigned bitvectors. type SomeWordN = SomeBV WordN --- | Pattern synonym for 'SomeBV' for concrete unsigned bitvectors.+-- | Pattern synonym for t'SomeBV' for concrete unsigned bitvectors. pattern SomeWordN :: () => (KnownNat n, 1 <= n) => WordN n -> SomeWordN pattern SomeWordN a = SomeBV a --- | Type synonym for 'SomeBV' for symbolic signed bitvectors.+-- | Type synonym for t'SomeBV' for symbolic signed bitvectors. type SomeSymIntN = SomeBV SymIntN --- | Pattern synonym for 'SomeBV' for symbolic signed bitvectors.+-- | Pattern synonym for t'SomeBV' for symbolic signed bitvectors. pattern SomeSymIntN :: () => (KnownNat n, 1 <= n) => SymIntN n -> SomeSymIntN pattern SomeSymIntN a = SomeBV a --- | Type synonym for 'SomeBV' for symbolic unsigned bitvectors.+-- | Type synonym for t'SomeBV' for symbolic unsigned bitvectors. type SomeSymWordN = SomeBV SymWordN --- | Pattern synonym for 'SomeBV' for symbolic unsigned bitvectors.+-- | Pattern synonym for t'SomeBV' for symbolic unsigned bitvectors. pattern SomeSymWordN :: () => (KnownNat n, 1 <= n) => SymWordN n -> SomeSymWordN pattern SomeSymWordN a = SomeBV a -- Construction --- | Construct a 'SomeBV' with a given run-time bitwidth and a polymorphic+-- | Construct a t'SomeBV' with a given run-time bitwidth and a polymorphic -- value for the underlying bitvector. unsafeSomeBV :: forall bv.@@ -794,8 +1154,8 @@ | otherwise = case mkPositiveNatRepr (fromIntegral n) of SomePositiveNatRepr (_ :: NatRepr x) -> SomeBV (i (Proxy @x)) --- | Construct a symbolic 'SomeBV' with a given concrete 'SomeBV'. Similar to--- 'con' but for 'SomeBV'.+-- | Construct a symbolic t'SomeBV' with a given concrete t'SomeBV'. Similar to+-- 'con' but for t'SomeBV'. -- -- >>> a = bv 8 0x12 :: SomeIntN -- >>> conBV a :: SomeSymIntN@@ -808,9 +1168,10 @@ SomeBV cbv -> SomeBV bv conBV (SomeBV (v :: cbv n)) = SomeBV $ con @(cbv n) @(bv n) v+conBV (SomeBVLit i) = SomeBVLit i --- | View pattern for symbolic 'SomeBV' to see if it contains a concrete value--- and extract it. Similar to 'conView' but for 'SomeBV'.+-- | View pattern for symbolic t'SomeBV' to see if it contains a concrete value+-- and extract it. Similar to 'conView' but for t'SomeBV'. -- -- >>> conBVView (bv 8 0x12 :: SomeSymIntN) -- Just 0x12@@ -826,9 +1187,10 @@ conBVView (SomeBV (bv :: bv n)) = case conView @(cbv n) bv of Just c -> Just $ SomeBV c Nothing -> Nothing+conBVView (SomeBVLit i) = Just $ SomeBVLit i --- | Pattern synonym for symbolic 'SomeBV' to see if it contains a concrete--- value and extract it. Similar to 'Grisette.Core.Con' but for 'SomeBV'.+-- | Pattern synonym for symbolic t'SomeBV' to see if it contains a concrete+-- value and extract it. Similar to 'Grisette.Core.Con' but for t'SomeBV'. -- -- >>> case (bv 8 0x12 :: SomeSymIntN) of { ConBV c -> c; _ -> error "impossible" } -- 0x12@@ -843,8 +1205,8 @@ where ConBV c = conBV c --- | Construct a symbolic 'SomeBV' with a given run-time bitwidth and a symbol.--- Similar to 'sym' but for 'SomeBV'.+-- | Construct a symbolic t'SomeBV' with a given run-time bitwidth and a symbol.+-- Similar to 'sym' but for t'SomeBV'. -- -- >>> symBV 8 "a" :: SomeSymIntN -- a@@ -858,8 +1220,8 @@ SomeBV bv symBV n s = unsafeSomeBV n $ \(_ :: proxy n) -> sym @(cbv n) s --- | Construct a symbolic 'SomeBV' with a given run-time bitwidth and an--- identifier. Similar to 'ssym' but for 'SomeBV'.+-- | Construct a symbolic t'SomeBV' with a given run-time bitwidth and an+-- identifier. Similar to 'ssym' but for t'SomeBV'. -- -- >>> ssymBV 8 "a" :: SomeSymIntN -- a@@ -873,8 +1235,8 @@ SomeBV bv ssymBV n s = unsafeSomeBV n $ \(_ :: proxy n) -> ssym @(cbv n) s --- | Construct a symbolic 'SomeBV' with a given run-time bitwidth, an identifier--- and an index. Similar to 'isym' but for 'SomeBV'.+-- | Construct a symbolic t'SomeBV' with a given run-time bitwidth, an identifier+-- and an index. Similar to 'isym' but for t'SomeBV'. -- -- >>> isymBV 8 "a" 1 :: SomeSymIntN -- a@1@@ -889,7 +1251,7 @@ SomeBV bv isymBV n s i = unsafeSomeBV n $ \(_ :: proxy n) -> isym @(cbv n) s i --- | Generate an arbitrary 'SomeBV' with a given run-time bitwidth.+-- | Generate an arbitrary t'SomeBV' with a given run-time bitwidth. arbitraryBV :: forall bv. (forall n. (KnownNat n, 1 <= n) => Arbitrary (bv n)) =>@@ -906,103 +1268,170 @@ -- Helpers -- | Lift a unary operation on sized bitvectors that returns anything to--- 'SomeBV'.-unarySomeBV :: forall bv r. (forall n. (KnownNat n, 1 <= n) => bv n -> r) -> SomeBV bv -> r-unarySomeBV f (SomeBV bv) = f bv+-- t'SomeBV'.+unarySomeBV ::+ forall bv r.+ (forall n. (KnownNat n, 1 <= n) => bv n -> r) ->+ (Integer -> r) ->+ SomeBV bv ->+ r+unarySomeBV f _ (SomeBV bv) = f bv+unarySomeBV _ g (SomeBVLit i) = g i {-# INLINE unarySomeBV #-} -- | Lift a unary operation on sized bitvectors that returns a bitvector to--- 'SomeBV'. The result will also be wrapped with 'SomeBV'.+-- t'SomeBV'. The result will also be wrapped with t'SomeBV'. unarySomeBVR1 ::- (forall n. (KnownNat n, 1 <= n) => bv n -> bv n) -> SomeBV bv -> SomeBV bv-unarySomeBVR1 f = unarySomeBV (SomeBV . f)+ (forall n. (KnownNat n, 1 <= n) => bv n -> bv n) ->+ (Integer -> Integer) ->+ SomeBV bv ->+ SomeBV bv+unarySomeBVR1 f g = unarySomeBV (SomeBV . f) (SomeBVLit . g) {-# INLINE unarySomeBVR1 #-} -- | Lift a binary operation on sized bitvectors that returns anything to--- 'SomeBV'. Crash if the bitwidths do not match.+-- t'SomeBV'. Crash if the bitwidths do not match. binSomeBV ::+ (forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> r) ->+ (Integer -> Integer -> r) -> SomeBV bv -> SomeBV bv -> r-binSomeBV f (SomeBV (l :: bv l)) (SomeBV (r :: bv r)) =+binSomeBV f _ (SomeBV (l :: bv l)) (SomeBV (r :: bv r)) = case sameNat (Proxy @l) (Proxy @r) of Just Refl -> f l r Nothing -> throw BitwidthMismatch+binSomeBV f _ (SomeBV (l :: bv l)) (SomeBVLit r) = f l $ fromIntegral r+binSomeBV f _ (SomeBVLit l) (SomeBV (r :: bv r)) = f (fromIntegral l) r+binSomeBV _ g (SomeBVLit l) (SomeBVLit r) = g l r {-# INLINE binSomeBV #-} +-- | Lift a ternary operation on sized bitvectors that returns anything to+-- t'SomeBV'. Crash if the bitwidths do not match.+ternSomeBV ::+ (forall n. (KnownNat n, 1 <= n) => Num (bv n)) =>+ (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> bv n -> r) ->+ SomeBV bv ->+ SomeBV bv ->+ SomeBV bv ->+ r+ternSomeBV f (SomeBV (a :: bv a)) (SomeBV (b :: bv b)) (SomeBV (c :: bv c)) =+ case (sameNat (Proxy @a) (Proxy @b), sameNat (Proxy @a) (Proxy @c)) of+ (Just Refl, Just Refl) -> f a b c+ _ -> throw BitwidthMismatch+ternSomeBV f a b c =+ case assignBitWidth "ternSomeBV" (a, b, c) of+ Right (a', b', c') -> ternSomeBV f a' b' c'+ Left e -> throw e+{-# INLINE ternSomeBV #-}+ -- | Lift a binary operation on sized bitvectors that returns a bitvector to--- 'SomeBV'. The result will also be wrapped with 'SomeBV'. Crash if the+-- t'SomeBV'. The result will also be wrapped with t'SomeBV'. Crash if the -- bitwidths do not match. binSomeBVR1 ::+ (forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> bv n) ->+ (Integer -> Integer -> Integer) -> SomeBV bv -> SomeBV bv -> SomeBV bv-binSomeBVR1 f = binSomeBV (\a b -> SomeBV $ f a b)+binSomeBVR1 f g = binSomeBV (\a b -> SomeBV $ f a b) (\a b -> SomeBVLit $ g a b) {-# INLINE binSomeBVR1 #-} -- | Lift a binary operation on sized bitvectors that returns two bitvectors to--- 'SomeBV'. The results will also be wrapped with 'SomeBV'. Crash if the+-- t'SomeBV'. The results will also be wrapped with t'SomeBV'. Crash if the -- bitwidths do not match. binSomeBVR2 ::+ (forall n. (KnownNat n, 1 <= n) => Num (bv n)) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> (bv n, bv n)) ->+ (Integer -> Integer -> (Integer, Integer)) -> SomeBV bv -> SomeBV bv -> (SomeBV bv, SomeBV bv)-binSomeBVR2 f = binSomeBV (\a b -> let (x, y) = f a b in (SomeBV x, SomeBV y))+binSomeBVR2 f g =+ binSomeBV+ (\a b -> let (x, y) = f a b in (SomeBV x, SomeBV y))+ (\a b -> let (x, y) = g a b in (SomeBVLit x, SomeBVLit y)) {-# INLINE binSomeBVR2 #-} +-- | Lift a ternary operation on sized bitvectors that returns a bitvector to+-- t'SomeBV'. The result will also be wrapped with t'SomeBV'. Crash if the+-- bitwidths do not match.+ternSomeBVR1 ::+ (forall n. (KnownNat n, 1 <= n) => Num (bv n)) =>+ (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> bv n -> bv n) ->+ SomeBV bv ->+ SomeBV bv ->+ SomeBV bv ->+ SomeBV bv+ternSomeBVR1 f = ternSomeBV (\a b c -> SomeBV $ f a b c)+{-# INLINE ternSomeBVR1 #-}+ -- | Lift a binary operation on sized bitvectors that returns anything wrapped--- with 'ExceptT' to 'SomeBV'. If the bitwidths do not match, throw an--- `BitwidthMismatch` error to the monadic context.+-- with 'ExceptT' to t'SomeBV'. If the bitwidths do not match, throw an+-- 'BitwidthMismatch' error to the monadic context. binSomeBVSafe ::- ( MonadError (Either BitwidthMismatch e) m,+ ( MonadError (Either SomeBVException e) m, TryMerge m, Mergeable e,- Mergeable r+ Mergeable r,+ forall n. (KnownNat n, 1 <= n) => Num (bv n) ) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m r) ->+ (Integer -> Integer -> ExceptT (Either SomeBVException e) m r) -> SomeBV bv -> SomeBV bv -> m r-binSomeBVSafe f (SomeBV (l :: bv l)) (SomeBV (r :: bv r)) =+binSomeBVSafe f _ (SomeBV (l :: bv l)) (SomeBV (r :: bv r)) = case sameNat (Proxy @l) (Proxy @r) of Just Refl -> tryMerge $ runExceptT (f l r) >>= either (throwError . Right) pure Nothing -> tryMerge $ throwError $ Left BitwidthMismatch+binSomeBVSafe _ g (SomeBVLit l) (SomeBVLit r) =+ tryMerge $ runExceptT (g l r) >>= either throwError pure+binSomeBVSafe f g l r =+ case assignBitWidth "binSomeBVSafe" (l, r) of+ Right (l', r') -> binSomeBVSafe f g l' r'+ Left e -> tryMerge $ throwError $ Left e {-# INLINE binSomeBVSafe #-} -- | Lift a binary operation on sized bitvectors that returns a bitvector--- wrapped with 'ExceptT' to 'SomeBV'. The result will also be wrapped with--- 'SomeBV'.+-- wrapped with 'ExceptT' to t'SomeBV'. The result will also be wrapped with+-- t'SomeBV'. ----- If the bitwidths do not match, throw an `BitwidthMismatch` error to the+-- If the bitwidths do not match, throw an 'BitwidthMismatch' error to the -- monadic context. binSomeBVSafeR1 ::- ( MonadError (Either BitwidthMismatch e) m,+ ( MonadError (Either SomeBVException e) m, TryMerge m, Mergeable e,- forall n. (KnownNat n, 1 <= n) => Mergeable (bv n)+ forall n. (KnownNat n, 1 <= n) => Mergeable (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n) ) => (forall n. (KnownNat n, 1 <= n) => bv n -> bv n -> ExceptT e m (bv n)) ->+ (Integer -> Integer -> ExceptT (Either SomeBVException e) m Integer) -> SomeBV bv -> SomeBV bv -> m (SomeBV bv)-binSomeBVSafeR1 f = binSomeBVSafe (\l r -> mrgFmap SomeBV $ f l r)+binSomeBVSafeR1 f g =+ binSomeBVSafe+ (\l r -> mrgFmap SomeBV $ f l r)+ (\l r -> mrgFmap SomeBVLit $ g l r) {-# INLINE binSomeBVSafeR1 #-} -- | Lift a binary operation on sized bitvectors that returns two bitvectors--- wrapped with 'ExceptT' to 'SomeBV'. The results will also be wrapped with--- 'SomeBV'.+-- wrapped with 'ExceptT' to t'SomeBV'. The results will also be wrapped with+-- t'SomeBV'. ----- If the bitwidths do not match, throw an `BitwidthMismatch` error to the+-- If the bitwidths do not match, throw an 'BitwidthMismatch' error to the -- monadic context. binSomeBVSafeR2 ::- ( MonadError (Either BitwidthMismatch e) m,+ ( MonadError (Either SomeBVException e) m, TryMerge m, Mergeable e,- forall n. (KnownNat n, 1 <= n) => Mergeable (bv n)+ forall n. (KnownNat n, 1 <= n) => Mergeable (bv n),+ forall n. (KnownNat n, 1 <= n) => Num (bv n) ) => ( forall n. (KnownNat n, 1 <= n) =>@@ -1010,9 +1439,15 @@ bv n -> ExceptT e m (bv n, bv n) ) ->+ ( Integer ->+ Integer ->+ ExceptT (Either SomeBVException e) m (Integer, Integer)+ ) -> SomeBV bv -> SomeBV bv -> m (SomeBV bv, SomeBV bv)-binSomeBVSafeR2 f =- binSomeBVSafe (\l r -> mrgFmap (bimap SomeBV SomeBV) $ f l r)+binSomeBVSafeR2 f g =+ binSomeBVSafe+ (\l r -> mrgFmap (bimap SomeBV SomeBV) $ f l r)+ (\l r -> mrgFmap (bimap SomeBVLit SomeBVLit) $ g l r) {-# INLINE binSomeBVSafeR2 #-}
+ src/Grisette/Internal/SymPrim/SymAlgReal.hs view
@@ -0,0 +1,136 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TypeFamilies #-}++-- |+-- Module : Grisette.Internal.SymPrim.SymAlgReal+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal)) where++import Control.DeepSeq (NFData)+import Data.Hashable (Hashable (hashWithSalt))+import Data.String (IsString (fromString))+import GHC.Generics (Generic)+import Grisette.Internal.Core.Data.Class.Function (Apply (FunType, apply))+import Grisette.Internal.Core.Data.Class.Solvable+ ( Solvable (con, conView, ssym, sym),+ )+import Grisette.Internal.SymPrim.AlgReal (AlgReal)+import Grisette.Internal.SymPrim.AllSyms (AllSyms (allSymsS), SomeSym (SomeSym))+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( FloatingUnaryOp+ ( FloatingAcos,+ FloatingAsin,+ FloatingAtan,+ FloatingCos,+ FloatingCosh,+ FloatingExp,+ FloatingLog,+ FloatingSin,+ FloatingSinh,+ FloatingSqrt,+ FloatingTan,+ FloatingTanh+ ),+ PEvalFloatingTerm (pevalFloatingUnaryTerm, pevalPowerTerm),+ PEvalNumTerm+ ( pevalAbsNumTerm,+ pevalMulNumTerm,+ pevalNegNumTerm,+ pevalSignumNumTerm+ ),+ pevalSubNumTerm,+ )+import Grisette.Internal.SymPrim.Prim.Term+ ( ConRep (ConType),+ LinkedRep (underlyingTerm, wrapTerm),+ PEvalNumTerm (pevalAddNumTerm),+ SymRep (SymType),+ Term (ConTerm),+ conTerm,+ pformatTerm,+ symTerm,+ )+import Language.Haskell.TH.Syntax (Lift)++-- | Symbolic representation of algebraic real numbers.+newtype SymAlgReal = SymAlgReal {underlyingAlgRealTerm :: Term AlgReal}+ deriving (Lift, Generic)+ deriving anyclass (NFData)++instance ConRep SymAlgReal where+ type ConType SymAlgReal = AlgReal++instance SymRep AlgReal where+ type SymType AlgReal = SymAlgReal++instance LinkedRep AlgReal SymAlgReal where+ underlyingTerm = underlyingAlgRealTerm+ wrapTerm = SymAlgReal++instance Apply SymAlgReal where+ type FunType SymAlgReal = SymAlgReal+ apply = id++instance Eq SymAlgReal where+ SymAlgReal a == SymAlgReal b = a == b++instance Hashable SymAlgReal where+ hashWithSalt s (SymAlgReal a) = hashWithSalt s a++instance IsString SymAlgReal where+ fromString = ssym . fromString++instance Solvable AlgReal SymAlgReal where+ con = SymAlgReal . conTerm+ sym = SymAlgReal . symTerm+ conView (SymAlgReal (ConTerm _ t)) = Just t+ conView _ = Nothing++instance Show SymAlgReal where+ show (SymAlgReal t) = pformatTerm t++instance AllSyms SymAlgReal where+ allSymsS v = (SomeSym v :)++instance Num SymAlgReal where+ (SymAlgReal l) + (SymAlgReal r) = SymAlgReal $ pevalAddNumTerm l r+ (SymAlgReal l) - (SymAlgReal r) = SymAlgReal $ pevalSubNumTerm l r+ (SymAlgReal l) * (SymAlgReal r) = SymAlgReal $ pevalMulNumTerm l r+ negate (SymAlgReal v) = SymAlgReal $ pevalNegNumTerm v+ abs (SymAlgReal v) = SymAlgReal $ pevalAbsNumTerm v+ signum (SymAlgReal v) = SymAlgReal $ pevalSignumNumTerm v+ fromInteger = con . fromInteger++instance Fractional SymAlgReal where+ fromRational = con . fromRational+ (/) = error "consider using safeFdiv instead of (/) for SymAlgReal"+ recip = error "consider using safeRecip instead of recip for SymAlgReal"++instance Floating SymAlgReal where+ pi = fromRational $ toRational pi+ exp (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingExp v+ log (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingLog v+ sqrt (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingSqrt v+ sin (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingSin v+ cos (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingCos v+ tan (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingTan v+ sinh (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingSinh v+ cosh (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingCosh v+ tanh (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingTanh v+ asin (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingAsin v+ acos (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingAcos v+ atan (SymAlgReal v) = SymAlgReal $ pevalFloatingUnaryTerm FloatingAtan v+ asinh = error "asinh isn't supported by the underlying sbv library"+ acosh = error "acosh isn't supported by the underlying sbv library"+ atanh = error "atanh isn't supported by the underlying sbv library"+ SymAlgReal l ** SymAlgReal r = SymAlgReal $ pevalPowerTerm l r+ logBase = error "consider using safeLogBase instead of logBase for AlgReal"
src/Grisette/Internal/SymPrim/SymBV.hs view
@@ -69,6 +69,7 @@ type (+), type (<=), )+import Grisette.Internal.Core.Data.Class.BitCast (BitCast (bitCast)) import Grisette.Internal.Core.Data.Class.BitVector ( SizedBV ( sizedBVConcat,@@ -91,7 +92,9 @@ import Grisette.Internal.Core.Data.Class.SymRotate ( SymRotate (symRotate, symRotateNegated), )-import Grisette.Internal.Core.Data.Class.SymShift (SymShift (symShift, symShiftNegated))+import Grisette.Internal.Core.Data.Class.SymShift+ ( SymShift (symShift, symShiftNegated),+ ) import Grisette.Internal.SymPrim.AllSyms (AllSyms (allSymsS), SomeSym (SomeSym)) import Grisette.Internal.SymPrim.BV ( IntN,@@ -100,8 +103,8 @@ import Grisette.Internal.SymPrim.Prim.Term ( ConRep (ConType), LinkedRep (underlyingTerm, wrapTerm),- PEvalBVSignConversionTerm (pevalBVToSignedTerm, pevalBVToUnsignedTerm), PEvalBVTerm (pevalBVConcatTerm, pevalBVExtendTerm, pevalBVSelectTerm),+ PEvalBitCastTerm (pevalBitCastTerm), PEvalBitwiseTerm ( pevalAndBitsTerm, pevalComplementBitsTerm,@@ -130,9 +133,10 @@ pevalModIntegralTerm, pevalOrTerm, pevalSubNumTerm,- pformat,+ pformatTerm, symTerm, )+import Grisette.Internal.SymPrim.SymBool (SymBool (SymBool)) import Grisette.Internal.Utils.Parameterized ( KnownProof (KnownProof), LeqProof (LeqProof),@@ -152,7 +156,6 @@ -- 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)@@ -183,7 +186,6 @@ -- 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)@@ -325,7 +327,7 @@ #define SHOW_BV(symtype) \ instance (KnownNat n, 1 <= n) => Show (symtype n) where \- show (symtype t) = pformat t+ show (symtype t) = pformatTerm t #if 1 SHOW_BV(SymIntN)@@ -467,8 +469,8 @@ -- BVSignConversion instance (KnownNat n, 1 <= n) => SignConversion (SymWordN n) (SymIntN n) where- toSigned (SymWordN n) = SymIntN $ pevalBVToSignedTerm n- toUnsigned (SymIntN n) = SymWordN $ pevalBVToUnsignedTerm n+ toSigned (SymWordN n) = SymIntN $ pevalBitCastTerm n+ toUnsigned (SymIntN n) = SymWordN $ pevalBitCastTerm n -- SymShift instance (KnownNat n, 1 <= n) => SymShift (SymWordN n) where@@ -571,3 +573,21 @@ ALLSYMS_BV(SymIntN) ALLSYMS_BV(SymWordN) #endif++instance (KnownNat n, 1 <= n) => BitCast (SymIntN n) (SymWordN n) where+ bitCast (SymIntN n) = SymWordN $ pevalBitCastTerm n++instance (KnownNat n, 1 <= n) => BitCast (SymWordN n) (SymIntN n) where+ bitCast (SymWordN n) = SymIntN $ pevalBitCastTerm n++instance BitCast (SymIntN 1) SymBool where+ bitCast (SymIntN v) = SymBool $ pevalBitCastTerm v++instance BitCast (SymWordN 1) SymBool where+ bitCast (SymWordN v) = SymBool $ pevalBitCastTerm v++instance BitCast SymBool (SymIntN 1) where+ bitCast (SymBool v) = SymIntN $ pevalBitCastTerm v++instance BitCast SymBool (SymWordN 1) where+ bitCast (SymBool v) = SymWordN $ pevalBitCastTerm v
src/Grisette/Internal/SymPrim/SymBool.hs view
@@ -19,7 +19,9 @@ import Data.String (IsString (fromString)) import GHC.Generics (Generic) import Grisette.Internal.Core.Data.Class.Function (Apply (FunType, apply))-import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con, conView, ssym, sym))+import Grisette.Internal.Core.Data.Class.Solvable+ ( Solvable (con, conView, ssym, sym),+ ) import Grisette.Internal.SymPrim.AllSyms (AllSyms (allSymsS), SomeSym (SomeSym)) import Grisette.Internal.SymPrim.Prim.Term ( ConRep (ConType),@@ -27,7 +29,7 @@ SymRep (SymType), Term (ConTerm), conTerm,- pformat,+ pformatTerm, symTerm, ) import Language.Haskell.TH.Syntax (Lift)@@ -40,7 +42,6 @@ -- | Symbolic Boolean type. ----- >>> :set -XOverloadedStrings -- >>> "a" :: SymBool -- a -- >>> "a" .&& "b" :: SymBool@@ -81,7 +82,7 @@ fromString = ssym . fromString instance Show SymBool where- show (SymBool t) = pformat t+ show (SymBool t) = pformatTerm t instance AllSyms SymBool where allSymsS v = (SomeSym v :)
src/Grisette/Internal/SymPrim/SymFP.hs view
@@ -1,10 +1,14 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveLift #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} -- |@@ -26,19 +30,112 @@ import Control.DeepSeq (NFData) import Data.Hashable (Hashable (hashWithSalt))+import Data.Proxy (Proxy (Proxy)) import Data.String (IsString (fromString)) import GHC.Generics (Generic)+import GHC.TypeLits (KnownNat, type (+), type (<=))+import Grisette.Internal.Core.Data.Class.BitCast+ ( BitCast (bitCast),+ BitCastCanonical (bitCastCanonicalValue),+ BitCastOr (bitCastOr),+ ) import Grisette.Internal.Core.Data.Class.Function (Apply (FunType, apply))+import Grisette.Internal.Core.Data.Class.IEEEFP+ ( IEEEFPConstants+ ( fpMaxNormalized,+ fpMaxSubnormal,+ fpMinNormalized,+ fpMinSubnormal,+ fpNaN,+ fpNegativeInfinite,+ fpNegativeZero,+ fpPositiveInfinite,+ fpPositiveZero+ ),+ IEEEFPConvertible (fromFPOr, toFP),+ IEEEFPOp+ ( fpAbs,+ fpMaximum,+ fpMaximumNumber,+ fpMinimum,+ fpMinimumNumber,+ fpNeg,+ fpRem+ ),+ IEEEFPRoundingMode (rna, rne, rtn, rtp, rtz),+ IEEEFPRoundingOp+ ( fpAdd,+ fpDiv,+ fpFMA,+ fpMul,+ fpRoundToIntegral,+ fpSqrt,+ fpSub+ ),+ IEEEFPToAlgReal,+ ) import Grisette.Internal.Core.Data.Class.Solvable ( Solvable (con, conView, ssym, sym), )+import Grisette.Internal.Core.Data.Class.SymIEEEFP+ ( SymIEEEFPTraits+ ( symFpIsInfinite,+ symFpIsNaN,+ symFpIsNegative,+ symFpIsNegativeInfinite,+ symFpIsNegativeZero,+ symFpIsNormal,+ symFpIsPoint,+ symFpIsPositive,+ symFpIsPositiveInfinite,+ symFpIsPositiveZero,+ symFpIsSubnormal,+ symFpIsZero+ ),+ ) import Grisette.Internal.SymPrim.AllSyms (AllSyms (allSymsS), SomeSym (SomeSym))-import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.FP+ ( FP,+ FPRoundingMode (RNA, RNE, RTN, RTP, RTZ),+ ValidFP,+ withValidFPProofs,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalFP+ ( pevalFPBinaryTerm,+ pevalFPFMATerm,+ pevalFPRoundingBinaryTerm,+ pevalFPRoundingUnaryTerm,+ pevalFPTraitTerm,+ pevalFPUnaryTerm,+ ) import Grisette.Internal.SymPrim.Prim.Internal.Term ( ConRep (ConType),+ FPBinaryOp (FPMaximum, FPMaximumNumber, FPMinimum, FPMinimumNumber, FPRem),+ FPRoundingBinaryOp (FPAdd, FPDiv, FPMul, FPSub),+ FPRoundingUnaryOp (FPRoundToIntegral, FPSqrt),+ FPTrait+ ( FPIsInfinite,+ FPIsNaN,+ FPIsNegative,+ FPIsNegativeInfinite,+ FPIsNegativeZero,+ FPIsNormal,+ FPIsPoint,+ FPIsPositive,+ FPIsPositiveInfinite,+ FPIsPositiveZero,+ FPIsSubnormal,+ FPIsZero+ ),+ FPUnaryOp (FPAbs, FPNeg),+ FloatingUnaryOp (FloatingSqrt), LinkedRep (underlyingTerm, wrapTerm),- PEvalFloatingTerm (pevalSqrtTerm),+ PEvalBitCastOrTerm (pevalBitCastOrTerm),+ PEvalBitCastTerm (pevalBitCastTerm),+ PEvalFloatingTerm (pevalFloatingUnaryTerm), PEvalFractionalTerm (pevalFdivTerm, pevalRecipTerm),+ PEvalIEEEFPConvertibleTerm (pevalFromFPOrTerm, pevalToFPTerm), PEvalNumTerm ( pevalAbsNumTerm, pevalAddNumTerm,@@ -50,9 +147,13 @@ Term (ConTerm), conTerm, pevalSubNumTerm,- pformat,+ pformatTerm, symTerm, )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (SymAlgReal))+import Grisette.Internal.SymPrim.SymBV (SymIntN (SymIntN), SymWordN (SymWordN))+import Grisette.Internal.SymPrim.SymBool (SymBool (SymBool))+import Grisette.Internal.SymPrim.SymInteger (SymInteger (SymInteger)) import Language.Haskell.TH.Syntax (Lift) -- $setup@@ -64,10 +165,9 @@ -- | Symbolic IEEE 754 floating-point number with @eb@ exponent bits and @sb@ -- significand bits. ----- >>> :set -XOverloadedStrings -XDataKinds -- >>> "a" + 2.0 :: SymFP 11 53 -- (+ a 2.0)--- >>> symFpAdd rne "a" 2.0 :: SymFP 11 53+-- >>> fpAdd rne "a" 2.0 :: SymFP 11 53 -- (fp.add rne a 2.0) -- -- More operations are available. Please refer to "Grisette.Core#g:symops" for@@ -115,7 +215,7 @@ conView _ = Nothing instance (ValidFP eb sb) => Show (SymFP eb sb) where- show (SymFP a) = pformat a+ show (SymFP a) = pformatTerm a instance (ValidFP eb sb) => AllSyms (SymFP eb sb) where allSymsS v = (SomeSym v :)@@ -138,7 +238,7 @@ pi = error "pi isn't supported by the underlying sbv library" exp = error "exp isn't supported by the underlying sbv library" log = error "log isn't supported by the underlying sbv library"- sqrt (SymFP v) = SymFP $ pevalSqrtTerm v+ sqrt (SymFP v) = SymFP $ pevalFloatingUnaryTerm FloatingSqrt v (**) = error "(**) isn't supported by the underlying sbv library" logBase = error "logBase isn't supported by the underlying sbv library" sin = error "sin isn't supported by the underlying sbv library"@@ -187,7 +287,200 @@ conView _ = Nothing instance Show SymFPRoundingMode where- show (SymFPRoundingMode a) = pformat a+ show (SymFPRoundingMode a) = pformatTerm a instance AllSyms SymFPRoundingMode where allSymsS v = (SomeSym v :)++instance+ (ValidFP eb sb, r ~ (eb + sb)) =>+ BitCastCanonical (SymFP eb sb) (SymWordN r)+ where+ bitCastCanonicalValue _ =+ withValidFPProofs @eb @sb $+ con (bitCastCanonicalValue (Proxy @(FP eb sb)) :: WordN r)++instance+ (ValidFP eb sb, r ~ (eb + sb)) =>+ BitCastCanonical (SymFP eb sb) (SymIntN r)+ where+ bitCastCanonicalValue _ =+ withValidFPProofs @eb @sb $+ con (bitCastCanonicalValue (Proxy @(FP eb sb)) :: IntN r)++instance+ (ValidFP eb sb, r ~ (eb + sb)) =>+ BitCastOr (SymFP eb sb) (SymWordN r)+ where+ bitCastOr (SymWordN d) (SymFP a) =+ withValidFPProofs @eb @sb $ SymWordN (pevalBitCastOrTerm d a)++instance+ (ValidFP eb sb, r ~ (eb + sb)) =>+ BitCastOr (SymFP eb sb) (SymIntN r)+ where+ bitCastOr (SymIntN d) (SymFP a) =+ withValidFPProofs @eb @sb $ SymIntN (pevalBitCastOrTerm d a)++#define BIT_CAST_CANONICAL_VIA_INTERMEDIATE(from, to, intermediate) \+ instance BitCastCanonical (from) (to) where \+ bitCastCanonicalValue x = bitCast (bitCastCanonicalValue x :: intermediate)++instance+ (ValidFP eb sb, r ~ (eb + sb)) =>+ BitCast (SymIntN r) (SymFP eb sb)+ where+ bitCast (SymIntN a) =+ withValidFPProofs @eb @sb $ SymFP $ pevalBitCastTerm a++instance+ (ValidFP eb sb, r ~ (eb + sb)) =>+ BitCast (SymWordN r) (SymFP eb sb)+ where+ bitCast (SymWordN a) =+ withValidFPProofs @eb @sb $ SymFP $ pevalBitCastTerm a++instance (ValidFP eb sb) => IEEEFPConstants (SymFP eb sb) where+ fpPositiveInfinite = con fpPositiveInfinite+ {-# INLINE fpPositiveInfinite #-}+ fpNegativeInfinite = con fpNegativeInfinite+ {-# INLINE fpNegativeInfinite #-}+ fpNaN = con fpNaN+ {-# INLINE fpNaN #-}+ fpNegativeZero = con fpNegativeZero+ {-# INLINE fpNegativeZero #-}+ fpPositiveZero = con fpPositiveZero+ {-# INLINE fpPositiveZero #-}+ fpMinNormalized = con fpMinNormalized+ {-# INLINE fpMinNormalized #-}+ fpMinSubnormal = con fpMinSubnormal+ {-# INLINE fpMinSubnormal #-}+ fpMaxNormalized = con fpMaxNormalized+ {-# INLINE fpMaxNormalized #-}+ fpMaxSubnormal = con fpMaxSubnormal+ {-# INLINE fpMaxSubnormal #-}++instance (ValidFP eb sb) => SymIEEEFPTraits (SymFP eb sb) where+ symFpIsNaN (SymFP x) = SymBool $ pevalFPTraitTerm FPIsNaN x+ {-# INLINE symFpIsNaN #-}+ symFpIsPositive (SymFP x) = SymBool $ pevalFPTraitTerm FPIsPositive x+ {-# INLINE symFpIsPositive #-}+ symFpIsNegative (SymFP x) = SymBool $ pevalFPTraitTerm FPIsNegative x+ {-# INLINE symFpIsNegative #-}+ symFpIsInfinite (SymFP x) = SymBool $ pevalFPTraitTerm FPIsInfinite x+ {-# INLINE symFpIsInfinite #-}+ symFpIsPositiveInfinite (SymFP x) =+ SymBool $ pevalFPTraitTerm FPIsPositiveInfinite x+ {-# INLINE symFpIsPositiveInfinite #-}+ symFpIsNegativeInfinite (SymFP x) =+ SymBool $ pevalFPTraitTerm FPIsNegativeInfinite x+ {-# INLINE symFpIsNegativeInfinite #-}+ symFpIsPositiveZero (SymFP x) = SymBool $ pevalFPTraitTerm FPIsPositiveZero x+ {-# INLINE symFpIsPositiveZero #-}+ symFpIsNegativeZero (SymFP x) = SymBool $ pevalFPTraitTerm FPIsNegativeZero x+ {-# INLINE symFpIsNegativeZero #-}+ symFpIsZero (SymFP x) = SymBool $ pevalFPTraitTerm FPIsZero x+ {-# INLINE symFpIsZero #-}+ symFpIsNormal (SymFP x) = SymBool $ pevalFPTraitTerm FPIsNormal x+ {-# INLINE symFpIsNormal #-}+ symFpIsSubnormal (SymFP x) = SymBool $ pevalFPTraitTerm FPIsSubnormal x+ {-# INLINE symFpIsSubnormal #-}+ symFpIsPoint (SymFP x) = SymBool $ pevalFPTraitTerm FPIsPoint x+ {-# INLINE symFpIsPoint #-}++instance (ValidFP eb sb) => IEEEFPOp (SymFP eb sb) where+ fpAbs (SymFP l) = SymFP $ pevalFPUnaryTerm FPAbs l+ {-# INLINE fpAbs #-}+ fpNeg (SymFP l) = SymFP $ pevalFPUnaryTerm FPNeg l+ {-# INLINE fpNeg #-}+ fpRem (SymFP l) (SymFP r) = SymFP $ pevalFPBinaryTerm FPRem l r+ {-# INLINE fpRem #-}+ fpMinimum (SymFP l) (SymFP r) = SymFP $ pevalFPBinaryTerm FPMinimum l r+ {-# INLINE fpMinimum #-}+ fpMinimumNumber (SymFP l) (SymFP r) =+ SymFP $ pevalFPBinaryTerm FPMinimumNumber l r+ {-# INLINE fpMinimumNumber #-}+ fpMaximum (SymFP l) (SymFP r) = SymFP $ pevalFPBinaryTerm FPMaximum l r+ {-# INLINE fpMaximum #-}+ fpMaximumNumber (SymFP l) (SymFP r) =+ SymFP $ pevalFPBinaryTerm FPMaximumNumber l r+ {-# INLINE fpMaximumNumber #-}++instance IEEEFPRoundingMode SymFPRoundingMode where+ rne = con RNE+ {-# INLINE rne #-}+ rna = con RNA+ {-# INLINE rna #-}+ rtp = con RTP+ {-# INLINE rtp #-}+ rtn = con RTN+ {-# INLINE rtn #-}+ rtz = con RTZ+ {-# INLINE rtz #-}++instance (ValidFP eb sb) => IEEEFPRoundingOp (SymFP eb sb) SymFPRoundingMode where+ fpAdd (SymFPRoundingMode mode) (SymFP l) (SymFP r) =+ SymFP $ pevalFPRoundingBinaryTerm FPAdd mode l r+ {-# INLINE fpAdd #-}+ fpSub (SymFPRoundingMode mode) (SymFP l) (SymFP r) =+ SymFP $ pevalFPRoundingBinaryTerm FPSub mode l r+ {-# INLINE fpSub #-}+ fpMul (SymFPRoundingMode mode) (SymFP l) (SymFP r) =+ SymFP $ pevalFPRoundingBinaryTerm FPMul mode l r+ {-# INLINE fpMul #-}+ fpDiv (SymFPRoundingMode mode) (SymFP l) (SymFP r) =+ SymFP $ pevalFPRoundingBinaryTerm FPDiv mode l r+ {-# INLINE fpDiv #-}+ fpFMA (SymFPRoundingMode mode) (SymFP l) (SymFP m) (SymFP r) =+ SymFP $ pevalFPFMATerm mode l m r+ {-# INLINE fpFMA #-}+ fpSqrt (SymFPRoundingMode mode) (SymFP v) =+ SymFP $ pevalFPRoundingUnaryTerm FPSqrt mode v+ {-# INLINE fpSqrt #-}+ fpRoundToIntegral (SymFPRoundingMode mode) (SymFP v) =+ SymFP $ pevalFPRoundingUnaryTerm FPRoundToIntegral mode v+ {-# INLINE fpRoundToIntegral #-}++instance+ (ValidFP eb sb) =>+ IEEEFPConvertible SymInteger (SymFP eb sb) SymFPRoundingMode+ where+ fromFPOr (SymInteger d) (SymFPRoundingMode mode) (SymFP fp) =+ SymInteger $ pevalFromFPOrTerm d mode fp+ toFP (SymFPRoundingMode mode) (SymInteger v) = SymFP $ pevalToFPTerm mode v++instance+ (ValidFP eb sb) =>+ IEEEFPConvertible SymAlgReal (SymFP eb sb) SymFPRoundingMode+ where+ fromFPOr (SymAlgReal d) (SymFPRoundingMode mode) (SymFP fp) =+ SymAlgReal $ pevalFromFPOrTerm d mode fp+ toFP (SymFPRoundingMode mode) (SymAlgReal v) = SymFP $ pevalToFPTerm mode v++instance+ (ValidFP eb sb) =>+ IEEEFPToAlgReal SymAlgReal (SymFP eb sb) SymFPRoundingMode++instance+ (ValidFP eb sb, KnownNat n, 1 <= n) =>+ IEEEFPConvertible (SymWordN n) (SymFP eb sb) SymFPRoundingMode+ where+ fromFPOr (SymWordN d) (SymFPRoundingMode mode) (SymFP fp) =+ SymWordN $ pevalFromFPOrTerm d mode fp+ toFP (SymFPRoundingMode mode) (SymWordN v) = SymFP $ pevalToFPTerm mode v++instance+ (ValidFP eb sb, KnownNat n, 1 <= n) =>+ IEEEFPConvertible (SymIntN n) (SymFP eb sb) SymFPRoundingMode+ where+ fromFPOr (SymIntN d) (SymFPRoundingMode mode) (SymFP fp) =+ SymIntN $ pevalFromFPOrTerm d mode fp+ toFP (SymFPRoundingMode mode) (SymIntN v) = SymFP $ pevalToFPTerm mode v++instance+ (ValidFP eb sb, ValidFP eb' sb') =>+ IEEEFPConvertible (SymFP eb' sb') (SymFP eb sb) SymFPRoundingMode+ where+ fromFPOr (SymFP d) (SymFPRoundingMode mode) (SymFP fp) =+ SymFP $ pevalFromFPOrTerm d mode fp+ toFP (SymFPRoundingMode mode) (SymFP v) = SymFP $ pevalToFPTerm mode v
src/Grisette/Internal/SymPrim/SymGeneralFun.hs view
@@ -1,3 +1,5 @@+{-# HLINT ignore "Unused LANGUAGE pragma" #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveLift #-} {-# LANGUAGE FlexibleContexts #-}@@ -11,8 +13,6 @@ {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} -{-# HLINT ignore "Unused LANGUAGE pragma" #-}- -- | -- Module : Grisette.Internal.SymPrim.SymGeneralFun -- Copyright : (c) Sirui Lu 2024@@ -48,9 +48,9 @@ SupportedPrim, SymRep (SymType), Term (ConTerm),- TypedSymbol,+ TypedConstantSymbol, conTerm,- pformat,+ pformatTerm, symTerm, ) import Language.Haskell.TH.Syntax (Lift (liftTyped))@@ -64,7 +64,6 @@ -- | -- Symbolic general function type. ----- >>> :set -XTypeOperators -XOverloadedStrings -- >>> f' = "f" :: SymInteger -~> SymInteger -- >>> f = (f' #) -- >>> f 1@@ -100,8 +99,8 @@ -- >>> f # (2 :: SymInteger) -- 3 (-->) ::- (SupportedPrim ca, SupportedPrim cb, LinkedRep cb sb) =>- TypedSymbol ca ->+ (SupportedNonFuncPrim ca, SupportedPrim cb, LinkedRep cb sb) =>+ TypedConstantSymbol ca -> sb -> ca --> cb (-->) arg = buildGeneralFun arg . underlyingTerm@@ -198,7 +197,7 @@ (SupportedPrim (ca --> cb), LinkedRep ca sa, LinkedRep cb sb) => Show (sa -~> sb) where- show (SymGeneralFun t) = pformat t+ show (SymGeneralFun t) = pformatTerm t instance (SupportedPrim (ca --> cb), LinkedRep ca sa, LinkedRep cb sb) =>
src/Grisette/Internal/SymPrim/SymInteger.hs view
@@ -35,7 +35,7 @@ Term (ConTerm), conTerm, pevalSubNumTerm,- pformat,+ pformatTerm, symTerm, ) import Language.Haskell.TH.Syntax (Lift)@@ -95,7 +95,7 @@ fromString = ssym . fromString instance Show SymInteger where- show (SymInteger t) = pformat t+ show (SymInteger t) = pformatTerm t instance AllSyms SymInteger where allSymsS v = (SomeSym v :)
src/Grisette/Internal/SymPrim/SymTabularFun.hs view
@@ -42,7 +42,7 @@ SymRep (SymType), Term (ConTerm), conTerm,- pformat,+ pformatTerm, symTerm, ) import Grisette.Internal.SymPrim.TabularFun (type (=->))@@ -56,7 +56,6 @@ -- | Symbolic tabular function type. ----- >>> :set -XTypeOperators -XOverloadedStrings -- >>> f' = "f" :: SymInteger =~> SymInteger -- >>> f = (f' #) -- >>> f 1@@ -150,7 +149,7 @@ (SupportedPrim (ca =-> cb), LinkedRep ca sa, LinkedRep cb sb) => Show (sa =~> sb) where- show (SymTabularFun t) = pformat t+ show (SymTabularFun t) = pformatTerm t instance (SupportedPrim (ca =-> cb), LinkedRep ca sa, LinkedRep cb sb) =>
src/Grisette/Internal/SymPrim/TabularFun.hs view
@@ -3,20 +3,23 @@ {-# LANGUAGE DeriveLift #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# HLINT ignore "Eta reduce" #-}+{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} -{-# HLINT ignore "Eta reduce" #-}+{-# HLINT ignore "Avoid lambda" #-} -- | -- Module : Grisette.Internal.SymPrim.TabularFun--- Copyright : (c) Sirui Lu 2021-2023+-- Copyright : (c) Sirui Lu 2021-2024 -- License : BSD-3-Clause (see the LICENSE file) -- -- Maintainer : siruilu@cs.washington.edu@@ -34,10 +37,11 @@ import qualified Data.SBV.Dynamic as SBVD import GHC.Generics (Generic, Generic1) import Grisette.Internal.Core.Data.Class.Function (Function ((#)))-import Grisette.Internal.SymPrim.Prim.Internal.IsZero (KnownIsZero)+import Grisette.Internal.SymPrim.FunInstanceGen (supportedPrimFunUpTo) import Grisette.Internal.SymPrim.Prim.Internal.PartialEval (totalize2) import Grisette.Internal.SymPrim.Prim.Internal.Term- ( NonFuncSBVRep (NonFuncSBVBaseType),+ ( NonFuncPrimConstraint,+ NonFuncSBVRep (NonFuncSBVBaseType), PEvalApplyTerm (pevalApplyTerm, sbvApplyTerm), SBVRep (SBVType), SupportedNonFuncPrim (conNonFuncSBVTerm, withNonFuncPrim),@@ -46,10 +50,6 @@ defaultValue, parseSMTModelResult, pevalITETerm,- sbvEq,- sbvIte,- symSBVName,- symSBVTerm, withPrim ), SupportedPrimConstraint (PrimConstraint),@@ -57,13 +57,9 @@ applyTerm, conTerm, partitionCVArg,- pevalDefaultEqTerm, pevalEqTerm,- pevalITEBasicTerm,- translateTypeError, ) import Language.Haskell.TH.Syntax (Lift)-import Type.Reflection (typeRep) -- $setup -- >>> import Grisette.Core@@ -72,7 +68,6 @@ -- | -- Functions as a table. Use the `#` operator to apply the function. ----- >>> :set -XTypeOperators -- >>> let f = TabularFun [(1, 2), (3, 4)] 0 :: Int =-> Int -- >>> f # 1 -- 2@@ -100,345 +95,15 @@ SupportedPrimConstraint (a =-> b) where type- PrimConstraint n (a =-> b) =+ PrimConstraint (a =-> b) = ( SupportedNonFuncPrim a, SupportedPrim b,- PrimConstraint n b+ NonFuncPrimConstraint a,+ PrimConstraint b ) instance (SupportedNonFuncPrim a, SupportedPrim b) => SBVRep (a =-> b) where- type SBVType n (a =-> b) = SBV.SBV (NonFuncSBVBaseType n a) -> SBVType n b--parseTabularFunSMTModelResult ::- forall a b.- (SupportedNonFuncPrim a, SupportedPrim b) =>- Int ->- ([([SBVD.CV], SBVD.CV)], SBVD.CV) ->- a =-> b-parseTabularFunSMTModelResult level (l, s) =- TabularFun- ( second- (\r -> parseSMTModelResult (level + 1) (r, s))- <$> partitionCVArg @a l- )- (parseSMTModelResult (level + 1) ([], s))--instance- (SupportedNonFuncPrim a, SupportedNonFuncPrim b) =>- SupportedPrim (a =-> b)- where- defaultValue = TabularFun [] defaultValue- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm p f =- withNonFuncPrim @b p $- lowerTFunCon p f- symSBVName _ num = "tfunc2" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- return $- SBV.uninterpret name- withPrim p r = withNonFuncPrim @a p $ withNonFuncPrim @b p r- sbvIte p = withNonFuncPrim @b p SBV.ite- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. TabularFun is not supported for "- <> "equality comparison."- )- (typeRep @(a =-> b))- parseSMTModelResult = parseTabularFunSMTModelResult--instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c- ) =>- SupportedPrim (a =-> b =-> c)- where- defaultValue = TabularFun [] defaultValue- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm p f =- withNonFuncPrim @c p $- lowerTFunCon p f- symSBVName _ num = "tfunc3" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p r- sbvIte p = withNonFuncPrim @c p SBV.ite- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. TabularFun is not supported for "- <> "equality comparison."- )- (typeRep @(a =-> b =-> c))- parseSMTModelResult = parseTabularFunSMTModelResult--instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedNonFuncPrim d,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c,- SupportedPrim d- ) =>- SupportedPrim (a =-> b =-> c =-> d)- where- defaultValue = TabularFun [] defaultValue- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm p f =- withNonFuncPrim @d p $- lowerTFunCon p f- symSBVName _ num = "tfunc4" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p r- sbvIte p = withNonFuncPrim @d p SBV.ite- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. TabularFun is not supported for "- <> "equality comparison."- )- (typeRep @(a =-> b =-> c =-> d))- parseSMTModelResult = parseTabularFunSMTModelResult--instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedNonFuncPrim d,- SupportedNonFuncPrim e,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c,- SupportedPrim d,- SupportedPrim e- ) =>- SupportedPrim (a =-> b =-> c =-> d =-> e)- where- defaultValue = TabularFun [] defaultValue- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm p f =- withNonFuncPrim @e p $- lowerTFunCon p f- symSBVName _ num = "tfunc5" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p r- sbvIte p = withNonFuncPrim @e p SBV.ite- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. TabularFun is not supported for "- <> "equality comparison."- )- (typeRep @(a =-> b =-> c =-> d =-> e))- parseSMTModelResult = parseTabularFunSMTModelResult--instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedNonFuncPrim d,- SupportedNonFuncPrim e,- SupportedNonFuncPrim f,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c,- SupportedPrim d,- SupportedPrim e,- SupportedPrim f- ) =>- SupportedPrim (a =-> b =-> c =-> d =-> e =-> f)- where- defaultValue = TabularFun [] defaultValue- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm p f =- withNonFuncPrim @f p $- lowerTFunCon p f- symSBVName _ num = "tfunc6" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p r- sbvIte p = withNonFuncPrim @f p SBV.ite- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. TabularFun is not supported for "- <> "equality comparison."- )- (typeRep @(a =-> b =-> c =-> d =-> e =-> f))- parseSMTModelResult = parseTabularFunSMTModelResult---- 7 arguments-instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedNonFuncPrim d,- SupportedNonFuncPrim e,- SupportedNonFuncPrim f,- SupportedNonFuncPrim g,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c,- SupportedPrim d,- SupportedPrim e,- SupportedPrim f,- SupportedPrim g- ) =>- SupportedPrim (a =-> b =-> c =-> d =-> e =-> f =-> g)- where- defaultValue = TabularFun [] defaultValue- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm p f =- withNonFuncPrim @g p $- lowerTFunCon p f- symSBVName _ num = "tfunc7" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p $- withNonFuncPrim @g p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p $- withNonFuncPrim @g p r- sbvIte p = withNonFuncPrim @g p SBV.ite- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. TabularFun is not supported for "- <> "equality comparison."- )- (typeRep @(a =-> b =-> c =-> d =-> e =-> f =-> g))- parseSMTModelResult = parseTabularFunSMTModelResult---- 8 arguments-instance- {-# OVERLAPPING #-}- ( SupportedNonFuncPrim a,- SupportedNonFuncPrim b,- SupportedNonFuncPrim c,- SupportedNonFuncPrim d,- SupportedNonFuncPrim e,- SupportedNonFuncPrim f,- SupportedNonFuncPrim g,- SupportedNonFuncPrim h,- SupportedPrim a,- SupportedPrim b,- SupportedPrim c,- SupportedPrim d,- SupportedPrim e,- SupportedPrim f,- SupportedPrim g,- SupportedPrim h- ) =>- SupportedPrim (a =-> b =-> c =-> d =-> e =-> f =-> g =-> h)- where- defaultValue = TabularFun [] defaultValue- pevalITETerm = pevalITEBasicTerm- pevalEqTerm = pevalDefaultEqTerm- conSBVTerm p f =- withNonFuncPrim @h p $- lowerTFunCon p f- symSBVName _ num = "tfunc8" <> show num- symSBVTerm (p :: proxy n) name =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p $- withNonFuncPrim @g p $- withNonFuncPrim @h p $- return $- SBV.uninterpret name- withPrim p r =- withNonFuncPrim @a p $- withNonFuncPrim @b p $- withNonFuncPrim @c p $- withNonFuncPrim @d p $- withNonFuncPrim @e p $- withNonFuncPrim @f p $- withNonFuncPrim @g p $- withNonFuncPrim @h p r- sbvIte p = withNonFuncPrim @h p SBV.ite- sbvEq _ _ =- translateTypeError- ( Just $- "BUG. Please send a bug report. TabularFun is not supported for "- <> "equality comparison."- )- (typeRep @(a =-> b =-> c =-> d =-> e =-> f =-> g =-> h))- parseSMTModelResult = parseTabularFunSMTModelResult+ type SBVType (a =-> b) = SBV.SBV (NonFuncSBVBaseType a) -> SBVType b instance (SupportedPrim a, SupportedPrim b, SupportedPrim (a =-> b)) =>@@ -458,26 +123,54 @@ go ((x, y) : xs) = pevalITETerm (pevalEqTerm a (conTerm x)) (conTerm y) (go xs) doPevalApplyTerm _ _ = Nothing- sbvApplyTerm p f a =- withPrim @(a =-> b) p $ withNonFuncPrim @a p $ f a+ sbvApplyTerm f a =+ withPrim @(a =-> b) $ withNonFuncPrim @a $ f a lowerTFunCon ::- forall proxy integerBitWidth a b.+ forall a b. ( SupportedNonFuncPrim a, SupportedPrim b,- SBV.Mergeable (SBVType integerBitWidth b),- KnownIsZero integerBitWidth+ SBV.Mergeable (SBVType b) ) =>- proxy integerBitWidth -> (a =-> b) ->- ( SBV.SBV (NonFuncSBVBaseType integerBitWidth a) ->- SBVType integerBitWidth b+ ( SBV.SBV (NonFuncSBVBaseType a) ->+ SBVType b )-lowerTFunCon proxy (TabularFun l d) = go l d+lowerTFunCon (TabularFun l d) = go l d where- go [] d _ = conSBVTerm proxy d+ go [] d _ = conSBVTerm d go ((x, r) : xs) d v =- SBV.ite- (conNonFuncSBVTerm proxy x SBV..== v)- (conSBVTerm proxy r)- (go xs d v)+ SBV.ite (conNonFuncSBVTerm x SBV..== v) (conSBVTerm r) (go xs d v)++parseTabularFunSMTModelResult ::+ forall a b.+ (SupportedNonFuncPrim a, SupportedPrim b) =>+ Int ->+ ([([SBVD.CV], SBVD.CV)], SBVD.CV) ->+ a =-> b+parseTabularFunSMTModelResult level (l, s) =+ TabularFun+ ( second+ ( \r ->+ case r of+ [([], v)] -> parseSMTModelResult (level + 1) ([], v)+ _ -> parseSMTModelResult (level + 1) (r, s)+ )+ <$> partitionCVArg @a l+ )+ (parseSMTModelResult (level + 1) ([], s))++supportedPrimFunUpTo+ [|TabularFun [] defaultValue|]+ [|parseTabularFunSMTModelResult|]+ ( \tyVars ->+ [|+ \f ->+ withNonFuncPrim @($(last tyVars)) $+ lowerTFunCon f+ |]+ )+ "TabularFun"+ "tfunc"+ ''(=->)+ 8
src/Grisette/Internal/TH/DeriveBuiltin.hs view
@@ -34,9 +34,16 @@ -- | Derive a builtin class for a type, with extra handlers. deriveBuiltinExtra ::- [SomeDeriveTypeParamHandler] -> Bool -> Strategy -> [Name] -> Name -> Q [Dec]+ [SomeDeriveTypeParamHandler] ->+ Maybe [SomeDeriveTypeParamHandler] ->+ Bool ->+ Strategy ->+ [Name] ->+ Name ->+ Q [Dec] deriveBuiltinExtra extraHandlers+ replacedHandlers ignoreBodyConstraints strategy constraints@@ -61,11 +68,13 @@ <> "parameters as the results" numDrop <- kindNumParam k deriveWithHandlers- ( SomeDeriveTypeParamHandler NatShouldBePositive- : extraHandlers- <> ( (SomeDeriveTypeParamHandler . flip PrimaryConstraint False)- <$> constraints- )+ ( extraHandlers ++ case replacedHandlers of+ Just handlers -> handlers+ Nothing ->+ SomeDeriveTypeParamHandler NatShouldBePositive+ : ( (SomeDeriveTypeParamHandler . flip PrimaryConstraint False)+ <$> constraints+ ) ) strategy ignoreBodyConstraints@@ -74,7 +83,7 @@ -- | Derive a builtin class for a type. deriveBuiltin :: Strategy -> [Name] -> Name -> Q [Dec]-deriveBuiltin = deriveBuiltinExtra [] True+deriveBuiltin = deriveBuiltinExtra [] Nothing True -- | Derive builtin classes for a list of types. deriveBuiltins :: Strategy -> [Name] -> [Name] -> Q [Dec]
src/Grisette/Internal/TH/DerivePredefined.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TemplateHaskell #-}@@ -19,10 +20,18 @@ ) where +#if MIN_VERSION_template_haskell(2,17,0)+import Language.Haskell.TH (Type (MulArrowT))+#endif+#if MIN_VERSION_template_haskell(2,19,0)+import Language.Haskell.TH (Type (PromotedInfixT, PromotedUInfixT))+#endif+ import Control.DeepSeq (NFData, NFData1) import Data.Functor.Classes (Eq1, Ord1, Show1) import Data.Hashable (Hashable) import Data.Hashable.Lifted (Hashable1)+import Data.List (nub) import GHC.Generics (Generic) import Grisette.Internal.Core.Data.Class.EvalSym (EvalSym, EvalSym1) import Grisette.Internal.Core.Data.Class.ExtractSym@@ -45,7 +54,6 @@ ) import Grisette.Internal.TH.DeriveTypeParamHandler ( DeriveTypeParamHandler (handleBody, handleTypeParams),- PrimaryConstraint (PrimaryConstraint), SomeDeriveTypeParamHandler (SomeDeriveTypeParamHandler), ) import Grisette.Internal.TH.DeriveUnifiedInterface@@ -71,9 +79,29 @@ Name, Pred, Q,- Type (ConT, PromotedT),+ Type+ ( AppT,+ ArrowT,+ ConT,+ EqualityT,+ InfixT,+ ListT,+ LitT,+ ParensT,+ PromotedConsT,+ PromotedNilT,+ PromotedT,+ PromotedTupleT,+ TupleT,+ UInfixT,+ UnboxedSumT,+ UnboxedTupleT,+ VarT,+ WildCardT+ ), appT, conT,+ pprint, varT, ) import Language.Haskell.TH.Datatype@@ -162,11 +190,39 @@ newtype FixInnerConstraints = FixInnerConstraints {cls :: Name} +needFix :: Type -> Bool+needFix (AppT a b) = needFix a || needFix b+needFix VarT {} = True+needFix ConT {} = False+needFix PromotedT {} = False+needFix (InfixT a _ b) = needFix a || needFix b+needFix (UInfixT a _ b) = needFix a || needFix b+needFix (ParensT a) = needFix a+needFix TupleT {} = False+needFix UnboxedTupleT {} = False+needFix UnboxedSumT {} = False+needFix ArrowT = False+needFix EqualityT = False+needFix ListT = False+needFix PromotedTupleT {} = False+needFix PromotedNilT = False+needFix PromotedConsT = False+needFix LitT {} = False+needFix WildCardT = False+#if MIN_VERSION_template_haskell(2,17,0)+needFix MulArrowT = False+#endif+#if MIN_VERSION_template_haskell(2,19,0)+needFix (PromotedInfixT a _ b) = needFix a || needFix b+needFix (PromotedUInfixT a _ b) = needFix a || needFix b+#endif+needFix t = error $ "Unsupported type in derivation: " <> pprint t+ instance DeriveTypeParamHandler FixInnerConstraints where handleTypeParams _ _ = return handleBody FixInnerConstraints {..} types = do kinds <- classParamKinds cls- concat <$> mapM (handle kinds) types+ concat <$> mapM (handle kinds) (filter (any needFix) $ nub types) where handle :: [Kind] -> [Type] -> Q [Pred] handle k tys@@ -178,33 +234,35 @@ -- | Derive instances for a type with the given name, with the predefined -- strategy.-derivePredefined :: Maybe EvalModeTag -> Name -> Name -> Q [Dec]-derivePredefined _ cls name+derivePredefined :: Name -> Name -> Q [Dec]+derivePredefined cls name | cls == ''Generic = deriveWithHandlers [] (Stock ''Generic) True 0 [name]-derivePredefined _ cls name+derivePredefined cls name | cls == ''UnifiedSymEq = deriveFunctorArgUnifiedInterfaceExtra- [ SomeDeriveTypeParamHandler $ PrimaryConstraint ''Mergeable False,- SomeDeriveTypeParamHandler $ PrimaryConstraint ''Mergeable1 False- ]+ []+ -- SomeDeriveTypeParamHandler $ PrimaryConstraint ''Mergeable False,+ -- SomeDeriveTypeParamHandler $ PrimaryConstraint ''Mergeable1 False+ ''UnifiedSymEq 'withBaseSymEq ''UnifiedSymEq1 'withBaseSymEq1 name-derivePredefined _ cls name+derivePredefined cls name | cls == ''UnifiedSymOrd = deriveFunctorArgUnifiedInterfaceExtra- [ SomeDeriveTypeParamHandler $ PrimaryConstraint ''Mergeable False,- SomeDeriveTypeParamHandler $ PrimaryConstraint ''Mergeable1 False- ]+ []+ -- SomeDeriveTypeParamHandler $ PrimaryConstraint ''Mergeable False,+ -- SomeDeriveTypeParamHandler $ PrimaryConstraint ''Mergeable1 False+ ''UnifiedSymOrd 'withBaseSymOrd ''UnifiedSymOrd1 'withBaseSymOrd1 name-derivePredefined evmode cls name = do+derivePredefined cls name = do d <- reifyDatatype name strategy <- if@@ -213,9 +271,12 @@ | otherwise -> fail "Currently only non-GADTs data or newtype are supported." deriveBuiltinExtra- [ SomeDeriveTypeParamHandler $ ModeTypeParamHandler evmode,- SomeDeriveTypeParamHandler $ FixInnerConstraints cls- ]+ []+ ( Just+ [ -- SomeDeriveTypeParamHandler $ ModeTypeParamHandler evmode,+ SomeDeriveTypeParamHandler $ FixInnerConstraints cls+ ]+ ) False strategy (allNeededConstraints cls)@@ -226,9 +287,9 @@ -- -- Multiple classes can be derived at once. derivePredefinedMultipleClasses ::- Maybe EvalModeTag -> [Name] -> Name -> Q [Dec]-derivePredefinedMultipleClasses evmode clss name =- concat <$> traverse (\cls -> derivePredefined evmode cls name) clss+ [Name] -> Name -> Q [Dec]+derivePredefinedMultipleClasses clss name =+ concat <$> traverse (`derivePredefined` name) clss allGrisetteClasses :: [Name] allGrisetteClasses =@@ -257,7 +318,7 @@ -- -- Support the same set of classes as 'deriveAll'. derive :: Name -> [Name] -> Q [Dec]-derive = flip (derivePredefinedMultipleClasses Nothing)+derive = flip derivePredefinedMultipleClasses -- | Derive all classes related to Grisette for a type with the given name. --@@ -315,7 +376,7 @@ -- You may get strange errors if you only import -- v'Generics.Deriving.Default.Default' type but not the data constructor. deriveAll :: Name -> Q [Dec]-deriveAll = derivePredefinedMultipleClasses Nothing allGrisetteClasses+deriveAll = derivePredefinedMultipleClasses allGrisetteClasses -- | Derive all classes related to Grisette for a type with the given name, -- except for the given classes.@@ -325,7 +386,6 @@ deriveAllExcept :: Name -> [Name] -> Q [Dec] deriveAllExcept nm clss = derivePredefinedMultipleClasses- Nothing (filter (`notElem` allExcluded) allGrisetteClasses) nm where
src/Grisette/Internal/TH/UnifiedConstructor.hs view
@@ -15,15 +15,14 @@ where import Control.Monad (join, replicateM, when, zipWithM)-import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable) import Grisette.Internal.TH.Util (constructorInfoToType, occName, putHaddock)-import Grisette.Unified.Internal.EvalMode (EvalMode) import Grisette.Unified.Internal.EvalModeTag (EvalModeTag) import Grisette.Unified.Internal.UnifiedData ( GetData, UnifiedData, wrapData, )+import Language.Haskell.TH (pprint) import Language.Haskell.TH.Datatype ( ConstructorInfo (constructorFields, constructorName), DatatypeInfo (datatypeCons, datatypeVars),@@ -31,6 +30,7 @@ tvKind, tvName, )+import Language.Haskell.TH.Datatype.TyVarBndr (TyVarBndrSpec, kindedTVSpecified) import Language.Haskell.TH.Lib (appE, appTypeE, lamE, varE, varP) import Language.Haskell.TH.Syntax ( Body (NormalB),@@ -83,13 +83,26 @@ when (length names /= length constructors) $ fail "Number of names does not match the number of constructors" let modeVars = filter ((== ConT ''EvalModeTag) . tvKind) (datatypeVars d)- when (length modeVars /= 1) $- fail "Expected exactly one EvalModeTag variable in the datatype."+ -- when (length modeVars /= 1) $+ -- fail "Expected exactly one EvalModeTag variable in the datatype." case modeVars of [mode] -> do- ds <- zipWithM (mkSingleWrapper d $ VarT $ tvName mode) names constructors+ ds <-+ zipWithM+ (mkSingleWrapper d Nothing $ VarT $ tvName mode)+ names+ constructors return $ join ds- _ -> fail "Expected exactly one EvalModeTag variable in the datatype."+ [] -> do+ n <- newName "mode"+ let newBndr = kindedTVSpecified n (ConT ''EvalModeTag)+ ds <-+ zipWithM+ (mkSingleWrapper d (Just newBndr) (VarT n))+ names+ constructors+ return $ join ds+ _ -> fail "Expected one or zero EvalModeTag variable in the datatype." augmentFinalType :: Type -> Type -> Q ([Pred], Type) augmentFinalType mode (AppT a@(AppT ArrowT _) t) = do@@ -97,18 +110,22 @@ return (pred, AppT a ret) augmentFinalType mode t = do r <- [t|GetData $(return mode) $(return t)|]- pred <- [t|Mergeable $(return t)|] predu <- [t|UnifiedData $(return mode) $(return t)|]- return ([pred, predu], r)+ return ([predu], r) -augmentConstructorType :: Type -> Type -> Q Type-augmentConstructorType mode (ForallT tybinders ctx ty1) = do+augmentConstructorType :: Maybe TyVarBndrSpec -> Type -> Type -> Q Type+augmentConstructorType modeBndr mode (ForallT tybinders ctx ty1) = do (preds, augmentedTyp) <- augmentFinalType mode ty1- ismode <- [t|EvalMode $(return mode)|]- return $ ForallT tybinders (ismode : preds ++ ctx) augmentedTyp-augmentConstructorType _ _ =- fail- "augmentConstructorType: unsupported constructor, must be a forall type."+ case modeBndr of+ Just bndr -> return $ ForallT (bndr : tybinders) (preds ++ ctx) augmentedTyp+ Nothing -> return $ ForallT tybinders (preds ++ ctx) augmentedTyp+augmentConstructorType modeBndr mode ty = do+ (preds, augmentedTyp) <- augmentFinalType mode ty+ case modeBndr of+ Just bndr -> return $ ForallT [bndr] preds augmentedTyp+ Nothing ->+ fail $+ "augmentConstructorType: unsupported constructor type: " ++ pprint ty augmentExpr :: Type -> Int -> Exp -> Q Exp augmentExpr mode n f = do@@ -122,10 +139,10 @@ ) ) -mkSingleWrapper :: DatatypeInfo -> Type -> String -> ConstructorInfo -> Q [Dec]-mkSingleWrapper dataType mode name info = do+mkSingleWrapper :: DatatypeInfo -> Maybe TyVarBndrSpec -> Type -> String -> ConstructorInfo -> Q [Dec]+mkSingleWrapper dataType modeBndr mode name info = do constructorTyp <- constructorInfoToType dataType info- augmentedTyp <- augmentConstructorType mode constructorTyp+ augmentedTyp <- augmentConstructorType modeBndr mode constructorTyp let oriName = constructorName info let retName = mkName name expr <- augmentExpr mode (length $ constructorFields info) (ConE oriName)
src/Grisette/Internal/TH/Util.hs view
@@ -74,7 +74,7 @@ ) import Language.Haskell.TH.Syntax (Name (Name), OccName (OccName)) --- | Get the unqualified name of a 'Name'.+-- | Get the unqualified name of a t'Name'. occName :: Name -> String occName (Name (OccName name) _) = name
src/Grisette/Internal/Utils/Parameterized.hs view
@@ -133,7 +133,7 @@ data SomeNatReprHelper where SomeNatReprHelper :: NatRepr n -> SomeNatReprHelper --- | Existential wrapper for 'NatRepr'.+-- | Existential wrapper for t'NatRepr'. data SomeNatRepr where SomeNatRepr :: (KnownNat n) => NatRepr n -> SomeNatRepr @@ -143,7 +143,7 @@ mkNatRepr n = case SomeNatReprHelper (NatRepr n) of SomeNatReprHelper natRepr -> withKnownNat natRepr $ SomeNatRepr natRepr --- | Existential wrapper for 'NatRepr' with the constraint that the natural+-- | Existential wrapper for t'NatRepr' with the constraint that the natural -- number is greater than 0. data SomePositiveNatRepr where SomePositiveNatRepr ::@@ -162,31 +162,31 @@ natRepr :: forall n. (KnownNat n) => NatRepr n natRepr = NatRepr (natVal (Proxy @n)) --- | Decrement a 'NatRepr' by 1.+-- | Decrement a t'NatRepr' by 1. decNat :: (1 <= n) => NatRepr n -> NatRepr (n - 1) decNat (NatRepr n) = NatRepr (n - 1) --- | Predecessor of a 'NatRepr'+-- | Predecessor of a t'NatRepr' predNat :: NatRepr (n + 1) -> NatRepr n predNat (NatRepr n) = NatRepr (n - 1) --- | Increment a 'NatRepr' by 1.+-- | Increment a t'NatRepr' by 1. incNat :: NatRepr n -> NatRepr (n + 1) incNat (NatRepr n) = NatRepr (n + 1) --- | Addition of two 'NatRepr's.+-- | Addition of two t'NatRepr's. addNat :: NatRepr m -> NatRepr n -> NatRepr (m + n) addNat (NatRepr m) (NatRepr n) = NatRepr (m + n) --- | Subtraction of two 'NatRepr's.+-- | Subtraction of two t'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.+-- | Division of two t'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'.+-- | Half of a t'NatRepr'. halfNat :: NatRepr (n + n) -> NatRepr n halfNat (NatRepr n) = NatRepr (n `div` 2) @@ -199,7 +199,7 @@ withKnownProof :: KnownProof n -> ((KnownNat n) => r) -> r withKnownProof p r = case p of KnownProof -> r --- | Construct a 'KnownProof' given the runtime value.+-- | Construct a t'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.@@ -208,7 +208,7 @@ unsafeKnownProof :: Natural -> KnownProof n unsafeKnownProof nVal = hasRepr (NatRepr nVal) --- | Construct a 'KnownProof' given the runtime representation.+-- | Construct a t'KnownProof' given the runtime representation. hasRepr :: forall n. NatRepr n -> KnownProof n hasRepr (NatRepr nVal) = case someNatVal nVal of@@ -229,7 +229,7 @@ withLeqProof :: LeqProof m n -> ((m <= n) => r) -> r withLeqProof p r = case p of LeqProof -> r --- | Construct a 'LeqProof'.+-- | Construct a t'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.@@ -238,7 +238,7 @@ unsafeLeqProof :: forall m n. LeqProof m n unsafeLeqProof = unsafeCoerce (LeqProof @0 @0) --- | Checks if a 'NatRepr' is less than or equal to another 'NatRepr'.+-- | Checks if a t'NatRepr' is less than or equal to another t'NatRepr'. testLeq :: NatRepr m -> NatRepr n -> Maybe (LeqProof m n) testLeq (NatRepr m) (NatRepr n) = case compare m n of@@ -246,7 +246,7 @@ EQ -> Just unsafeLeqProof GT -> Just unsafeLeqProof --- | Apply reflexivity to 'LeqProof'.+-- | Apply reflexivity to t'LeqProof'. leqRefl :: f n -> LeqProof n n leqRefl _ = LeqProof @@ -254,7 +254,7 @@ leqSucc :: f n -> LeqProof n (n + 1) leqSucc _ = unsafeLeqProof --- | Apply transitivity to 'LeqProof'.+-- | Apply transitivity to t'LeqProof'. leqTrans :: LeqProof a b -> LeqProof b c -> LeqProof a c leqTrans _ _ = unsafeLeqProof @@ -266,7 +266,7 @@ 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'+-- | Produce proof that adding a value to the larger element in an t'LeqProof' -- is larger. leqAdd :: LeqProof m n -> f o -> LeqProof m (n + o) leqAdd _ _ = unsafeLeqProof
src/Grisette/SymPrim.hs view
@@ -18,35 +18,41 @@ -- * @'WordN' n@: unsigned bit vectors of bit width @n@. -- * @'FP' eb sb@: IEEE-754 floating point numbers with @eb@ exponent bits -- and @sb@ significand bits.- -- * @'Bool' t'=->' 'Bool'@: functions represented as a table for the- -- input-output relations.- -- * @'Bool' t'-->' 'Bool'@: functions represented as a formula over some- -- bound variables.+ -- * 'AlgReal': algebraic real numbers. Can represent rational numbers.+ -- If come from solver's response, it may also represented by roots of+ -- polynomials or intervals.+ -- * @'Bool' t'Grisette.SymPrim.=->' 'Bool'@: functions represented as a+ -- table for the input-output relations.+ -- * @'Bool' t'Grisette.SymPrim.-->' 'Bool'@: functions represented as a+ -- formula over some bound variables. -- -- We also provide symbolic counterparts for these types, along with the -- basic types 'Bool' and 'Integer'. These symbolic types can be directly -- translated to constraints in the SMT solver. --- -- * 'SymBool' ('Bool', symbolic Booleans)- -- * 'SymInteger' ('Integer', symbolic unbounded integers)- -- * @'SymIntN' n@ (@'IntN' n@, symbolic signed bit vectors of bit width+ -- * t'SymBool' ('Bool', symbolic Booleans)+ -- * t'SymInteger' ('Integer', symbolic unbounded integers)+ -- * @t'SymIntN' n@ (@'IntN' n@, symbolic signed bit vectors of bit width -- @n@)- -- * @'SymWordN' n@ (@'WordN' n@, symbolic unsigned bit vectors of bit width+ -- * @t'SymWordN' n@ (@'WordN' n@, symbolic unsigned bit vectors of bit width -- @n@)- -- * @'SymFP' eb sb@ (@'FP' eb sb@, symbolic IEEE-754 floating point numbers+ -- * @t'SymFP' eb sb@ (@'FP' eb sb@, symbolic IEEE-754 floating point numbers -- with @eb@ exponent bits and @sb@ significand bits)- -- * @'SymBool' t'=~>' 'SymBool'@ (@'Bool' t'=->' 'Bool'@, symbolic+ -- * t'SymAlgReal': symbolic algebraic real numbers.+ -- * @t'SymBool' t'Grisette.SymPrim.=~>' t'SymBool'@+ -- (@'Bool' t'Grisette.SymPrim.=->' 'Bool'@, symbolic -- functions, uninterpreted or represented as a table for the -- input-output relations).- -- * @'SymBool' t'-~>' 'SymBool'@ (@'Bool' t'-->' 'Bool'@, symbolic+ -- * @t'SymBool' t'Grisette.SymPrim.-~>' t'SymBool'@+ -- (@'Bool' t'Grisette.SymPrim.-->' 'Bool'@, symbolic -- functions, uninterpreted or represented as a formula over some -- bound variables). -- -- This module provides an operation to extract all primitive values from a -- symbolic value, with 'AllSyms'. The module also provides the- -- representation for symbols ('TypedSymbol'), symbol sets ('SymbolSet'),- -- and models ('Model'). They are useful when working with- -- t'Grisette.Core.EvalSym', t'Grisette.Core.ExtractSym', and+ -- representation for symbols (@t'TypedSymbol'@), symbol sets+ -- (@t'SymbolSet'@), and models (@t'Model'@). They are useful when working+ -- with t'Grisette.Core.EvalSym', t'Grisette.Core.ExtractSym', and -- t'Grisette.Core.SubstSym'. -- * Extended types@@ -65,7 +71,7 @@ -- ** Runtime-sized bit-vector types SomeBV (..),- BitwidthMismatch (..),+ SomeBVException (..), pattern SomeIntN, type SomeIntN, pattern SomeWordN,@@ -78,10 +84,10 @@ isymBV, arbitraryBV, - -- *** Some low-level helpers for writing instances for 'SomeBV'+ -- *** Some low-level helpers for writing instances for t'SomeBV' -- | The functions here will check the bitwidths of the input bit-vectors- -- and raise 'BitwidthMismatch' if they do not match.+ -- and raise v'BitwidthMismatch' if they do not match. unsafeSomeBV, unarySomeBV, unarySomeBVR1,@@ -102,6 +108,12 @@ FPRoundingMode (..), allFPRoundingMode, + -- ** Algebraic real numbers+ AlgReal (..),+ AlgRealPoly (..),+ RealPoint (..),+ UnsupportedAlgRealOperation (..),+ -- ** Functions type (=->) (..), type (-->),@@ -136,10 +148,21 @@ SymFP32, SymFP64, + -- ** Symbolic algebraic real numbers+ SymAlgReal (..),+ -- ** Symbolic function, possibly uninterpreted type (=~>) (..), type (-~>) (..), + -- ** Quantifiers+ forallSet,+ forallSym,+ forallFresh,+ existsSet,+ existsSym,+ existsFresh,+ -- ** Basic constraints SupportedPrim, SymRep (SymType),@@ -164,14 +187,29 @@ genericLiftAllSymsS, -- * Symbolic constant sets and models+ SymbolKind (..),+ IsSymbolKind (..), TypedSymbol (..),+ TypedAnySymbol,+ TypedConstantSymbol,+ SomeTypedSymbol (..),+ SomeTypedAnySymbol,+ SomeTypedConstantSymbol, SymbolSet,+ AnySymbolSet,+ ConstantSymbolSet, Model, ModelValuePair (..), ModelSymPair (..), ) where +import Grisette.Internal.SymPrim.AlgReal+ ( AlgReal (..),+ AlgRealPoly (..),+ RealPoint (..),+ UnsupportedAlgRealOperation (..),+ ) import Grisette.Internal.SymPrim.AllSyms ( AllSyms (..), AllSyms1 (..),@@ -188,8 +226,7 @@ symsSize, ) import Grisette.Internal.SymPrim.BV- ( BitwidthMismatch (..),- IntN,+ ( IntN, IntN16, IntN32, IntN64,@@ -213,19 +250,37 @@ import Grisette.Internal.SymPrim.GeneralFun (type (-->)) import Grisette.Internal.SymPrim.ModelRep (ModelSymPair (..)) import Grisette.Internal.SymPrim.Prim.Model- ( Model (..),+ ( AnySymbolSet,+ ConstantSymbolSet,+ Model (..), ModelValuePair (..), SymbolSet (..), ) import Grisette.Internal.SymPrim.Prim.Term ( ConRep (..),+ IsSymbolKind (..), LinkedRep,+ SomeTypedAnySymbol,+ SomeTypedConstantSymbol,+ SomeTypedSymbol (..), SupportedPrim, SymRep (..),+ SymbolKind (..),+ TypedAnySymbol,+ TypedConstantSymbol, TypedSymbol (..), )+import Grisette.Internal.SymPrim.Quantifier+ ( existsFresh,+ existsSet,+ existsSym,+ forallFresh,+ forallSet,+ forallSym,+ ) import Grisette.Internal.SymPrim.SomeBV ( SomeBV (..),+ SomeBVException (..), arbitraryBV, binSomeBV, binSomeBVR1,@@ -251,6 +306,7 @@ type SomeSymWordN, type SomeWordN, )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal (..)) import Grisette.Internal.SymPrim.SymBV ( SymIntN (..), SymIntN16,
src/Grisette/Unified.hs view
@@ -32,6 +32,7 @@ liftMrgIte, mrgIte2, liftMrgIte2,+ simpleMerge, -- ** Unified ITE operator UnifiedITEOp (..),@@ -42,6 +43,7 @@ UnifiedSymEq (..), (.==), (./=),+ symDistinct, liftSymEq, symEq1, liftSymEq2,@@ -63,8 +65,28 @@ mrgMax, mrgMin, + -- ** Unified finite bits+ UnifiedFiniteBits (..),+ symTestBit,+ symSetBitTo,+ symFromBits,+ symBitBlast,+ symLsb,+ symMsb,+ symPopCount,+ symCountLeadingZeros,+ symCountTrailingZeros,++ -- ** Unified conversions+ UnifiedFromIntegral (..),+ symFromIntegral,+ UnifiedSafeBitCast (..),+ safeBitCast,+ UnifiedSafeFromFP (..),+ safeFromFP,+ -- ** Unified safe ops- UnifiedSafeDivision (..),+ UnifiedSafeDiv (..), safeDiv, safeMod, safeDivMod,@@ -83,6 +105,8 @@ safeSymShiftR, safeSymStrictShiftL, safeSymStrictShiftR,+ UnifiedSafeFdiv (..),+ safeFdiv, -- * Unified types @@ -102,22 +126,65 @@ GetInteger, UnifiedInteger, + -- ** FP+ GetFP,+ GetFPRoundingMode,+ UnifiedFP,+ SafeUnifiedFP,++ -- ** AlgReal+ GetAlgReal,+ UnifiedAlgReal,+ -- ** Data GetData, UnifiedData, extractData, wrapData,++ -- ** Supplemental conversions+ UnifiedBVBVConversion,+ UnifiedBVFPConversion,+ SafeUnifiedBVFPConversion,+ UnifiedFPFPConversion, ) where +import Grisette.Unified.Internal.BVBVConversion+ ( UnifiedBVBVConversion,+ )+import Grisette.Unified.Internal.BVFPConversion+ ( SafeUnifiedBVFPConversion,+ UnifiedBVFPConversion,+ ) import Grisette.Unified.Internal.BaseMonad (BaseMonad)+import Grisette.Unified.Internal.Class.UnifiedFiniteBits+ ( UnifiedFiniteBits (..),+ symBitBlast,+ symCountLeadingZeros,+ symCountTrailingZeros,+ symFromBits,+ symLsb,+ symMsb,+ symPopCount,+ symSetBitTo,+ symTestBit,+ )+import Grisette.Unified.Internal.Class.UnifiedFromIntegral+ ( UnifiedFromIntegral (..),+ symFromIntegral,+ ) import Grisette.Unified.Internal.Class.UnifiedITEOp ( UnifiedITEOp (..), symIte, symIteMerge, )-import Grisette.Unified.Internal.Class.UnifiedSafeDivision- ( UnifiedSafeDivision (..),+import Grisette.Unified.Internal.Class.UnifiedSafeBitCast+ ( UnifiedSafeBitCast (..),+ safeBitCast,+ )+import Grisette.Unified.Internal.Class.UnifiedSafeDiv+ ( UnifiedSafeDiv (..), safeDiv, safeDivMod, safeMod,@@ -125,6 +192,14 @@ safeQuotRem, safeRem, )+import Grisette.Unified.Internal.Class.UnifiedSafeFdiv+ ( UnifiedSafeFdiv (..),+ safeFdiv,+ )+import Grisette.Unified.Internal.Class.UnifiedSafeFromFP+ ( UnifiedSafeFromFP (..),+ safeFromFP,+ ) import Grisette.Unified.Internal.Class.UnifiedSafeLinearArith ( UnifiedSafeLinearArith (..), safeAdd,@@ -155,11 +230,13 @@ mrgIte, mrgIte1, mrgIte2,+ simpleMerge, ) import Grisette.Unified.Internal.Class.UnifiedSymEq ( UnifiedSymEq (..), liftSymEq, liftSymEq2,+ symDistinct, symEq1, symEq2, (./=),@@ -186,7 +263,14 @@ ( EvalModeTag (..), IsConMode, )+import Grisette.Unified.Internal.FPFPConversion+ ( UnifiedFPFPConversion,+ ) import Grisette.Unified.Internal.MonadWithMode (MonadWithMode)+import Grisette.Unified.Internal.UnifiedAlgReal+ ( GetAlgReal,+ UnifiedAlgReal,+ ) import Grisette.Unified.Internal.UnifiedBV ( GetIntN, GetSomeIntN,@@ -202,6 +286,12 @@ UnifiedData, extractData, wrapData,+ )+import Grisette.Unified.Internal.UnifiedFP+ ( GetFP,+ GetFPRoundingMode,+ SafeUnifiedFP,+ UnifiedFP, ) import Grisette.Unified.Internal.UnifiedInteger ( GetInteger,
+ src/Grisette/Unified/Internal/BVBVConversion.hs view
@@ -0,0 +1,161 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Unified.Internal.BVBVConversion+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Unified.Internal.BVBVConversion+ ( UnifiedBVBVConversion,+ AllUnifiedBVBVConversion,+ )+where++import GHC.TypeNats (KnownNat, Nat, type (<=))+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)+import Grisette.Unified.Internal.Class.UnifiedFromIntegral (UnifiedFromIntegral)+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Con, Sym))+import Grisette.Unified.Internal.UnifiedBV (UnifiedBVImpl (GetIntN, GetWordN))++class+ ( bv0 ~ bvn0 n0,+ bv1 ~ bvn1 n1,+ UnifiedFromIntegral mode bv0 bv1+ ) =>+ UnifiedBVBVConversionImpl+ (mode :: EvalModeTag)+ bvn0+ bvn1+ (n0 :: Nat)+ (n1 :: Nat)+ bv0+ bv1+ | bvn0 n0 -> bv0,+ bvn1 n1 -> bv1,+ bv0 -> bvn0 n0,+ bv1 -> bvn1 n1++#define QUOTE() '++#define CONINSTANCE(ty0, ty1) \+instance \+ (KnownNat n0, 1 <= n0, KnownNat n1, 1 <= n1) => \+ UnifiedBVBVConversionImpl QUOTE()Con ty0 ty1 n0 n1 (ty0 n0) (ty1 n1)++#define SYMINSTANCE(ty0, ty1) \+instance \+ (KnownNat n0, 1 <= n0, KnownNat n1, 1 <= n1) => \+ UnifiedBVBVConversionImpl QUOTE()Sym ty0 ty1 n0 n1 (ty0 n0) (ty1 n1)++#if 1+CONINSTANCE(WordN, WordN)+CONINSTANCE(WordN, IntN)+CONINSTANCE(IntN, WordN)+CONINSTANCE(IntN, IntN)+SYMINSTANCE(SymWordN, SymWordN)+SYMINSTANCE(SymWordN, SymIntN)+SYMINSTANCE(SymIntN, SymWordN)+SYMINSTANCE(SymIntN, SymIntN)+#endif++-- | Unified constraints for conversion between bit-vectors.+class+ ( UnifiedBVBVConversionImpl+ mode+ (GetWordN mode)+ (GetWordN mode)+ n0+ n1+ (GetWordN mode n0)+ (GetWordN mode n1),+ UnifiedBVBVConversionImpl+ mode+ (GetWordN mode)+ (GetIntN mode)+ n0+ n1+ (GetWordN mode n0)+ (GetIntN mode n1),+ UnifiedBVBVConversionImpl+ mode+ (GetIntN mode)+ (GetWordN mode)+ n0+ n1+ (GetIntN mode n0)+ (GetWordN mode n1),+ UnifiedBVBVConversionImpl+ mode+ (GetIntN mode)+ (GetIntN mode)+ n0+ n1+ (GetIntN mode n0)+ (GetIntN mode n1)+ ) =>+ UnifiedBVBVConversion (mode :: EvalModeTag) n0 n1++instance+ ( UnifiedBVBVConversionImpl+ mode+ (GetWordN mode)+ (GetWordN mode)+ n0+ n1+ (GetWordN mode n0)+ (GetWordN mode n1),+ UnifiedBVBVConversionImpl+ mode+ (GetWordN mode)+ (GetIntN mode)+ n0+ n1+ (GetWordN mode n0)+ (GetIntN mode n1),+ UnifiedBVBVConversionImpl+ mode+ (GetIntN mode)+ (GetWordN mode)+ n0+ n1+ (GetIntN mode n0)+ (GetWordN mode n1),+ UnifiedBVBVConversionImpl+ mode+ (GetIntN mode)+ (GetIntN mode)+ n0+ n1+ (GetIntN mode n0)+ (GetIntN mode n1)+ ) =>+ UnifiedBVBVConversion (mode :: EvalModeTag) n0 n1++-- | Evaluation mode with unified conversion from bit-vectors to bit-vectors.+class+ ( forall n0 n1.+ (KnownNat n0, KnownNat n1, 1 <= n0, 1 <= n1) =>+ UnifiedBVBVConversion mode n0 n1+ ) =>+ AllUnifiedBVBVConversion mode++instance+ ( forall n0 n1.+ (KnownNat n0, KnownNat n1, 1 <= n0, 1 <= n1) =>+ UnifiedBVBVConversion mode n0 n1+ ) =>+ AllUnifiedBVBVConversion mode
+ src/Grisette/Unified/Internal/BVFPConversion.hs view
@@ -0,0 +1,231 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Unified.Internal.BVFPConversion+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Unified.Internal.BVFPConversion+ ( UnifiedBVFPConversion,+ SafeUnifiedBVFPConversion,+ AllUnifiedBVFPConversion,+ )+where++import Control.Monad.Error.Class (MonadError)+import GHC.TypeLits (KnownNat, type (+), type (<=))+import Grisette.Internal.Core.Data.Class.BitCast+ ( BitCast,+ BitCastCanonical,+ BitCastOr,+ )+import Grisette.Internal.Core.Data.Class.IEEEFP+ ( IEEEFPConvertible,+ )+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.FP+ ( FP,+ FPRoundingMode,+ NotRepresentableFPError,+ ValidFP,+ )+import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)+import Grisette.Internal.SymPrim.SymFP (SymFP, SymFPRoundingMode)+import Grisette.Unified.Internal.Class.UnifiedFromIntegral (UnifiedFromIntegral)+import Grisette.Unified.Internal.Class.UnifiedSafeBitCast (UnifiedSafeBitCast)+import Grisette.Unified.Internal.Class.UnifiedSafeFromFP (UnifiedSafeFromFP)+import Grisette.Unified.Internal.Class.UnifiedSimpleMergeable (UnifiedBranching)+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Con, Sym))+import Grisette.Unified.Internal.UnifiedBV (UnifiedBVImpl (GetIntN, GetWordN))+import Grisette.Unified.Internal.UnifiedFP+ ( UnifiedFPImpl (GetFP, GetFPRoundingMode),+ )++class+ ( UnifiedBVImpl mode wordn intn n word int,+ UnifiedFPImpl mode fpn eb sb fp fprd,+ BitCast word fp,+ BitCast int fp,+ BitCastOr fp word,+ BitCastOr fp int,+ BitCastCanonical fp word,+ BitCastCanonical fp int,+ UnifiedFromIntegral mode word fp,+ UnifiedFromIntegral mode int fp,+ IEEEFPConvertible int fp fprd,+ IEEEFPConvertible word fp fprd+ ) =>+ UnifiedBVFPConversionImpl+ (mode :: EvalModeTag)+ wordn+ intn+ fpn+ n+ eb+ sb+ word+ int+ fp+ fprd++instance+ (ValidFP eb sb, KnownNat n, 1 <= n, n ~ (eb + sb)) =>+ UnifiedBVFPConversionImpl+ 'Con+ WordN+ IntN+ FP+ n+ eb+ sb+ (WordN n)+ (IntN n)+ (FP eb sb)+ FPRoundingMode++instance+ (ValidFP eb sb, KnownNat n, 1 <= n, n ~ (eb + sb)) =>+ UnifiedBVFPConversionImpl+ 'Sym+ SymWordN+ SymIntN+ SymFP+ n+ eb+ sb+ (SymWordN n)+ (SymIntN n)+ (SymFP eb sb)+ SymFPRoundingMode++class+ ( UnifiedBVFPConversionImpl mode wordn intn fpn n eb sb word int fp fprd,+ UnifiedSafeBitCast mode NotRepresentableFPError fp int m,+ UnifiedSafeBitCast mode NotRepresentableFPError fp word m,+ UnifiedSafeFromFP mode NotRepresentableFPError word fp fprd m+ ) =>+ SafeUnifiedBVFPConversionImpl mode wordn intn fpn n eb sb word int fp fprd m++instance+ ( UnifiedBVFPConversionImpl mode wordn intn fpn n eb sb word int fp fprd,+ UnifiedSafeBitCast mode NotRepresentableFPError fp int m,+ UnifiedSafeBitCast mode NotRepresentableFPError fp word m,+ UnifiedSafeFromFP mode NotRepresentableFPError word fp fprd m+ ) =>+ SafeUnifiedBVFPConversionImpl mode wordn intn fpn n eb sb word int fp fprd m++-- | Unified constraints for safe conversion from bit-vectors to floating point+-- numbers.+class+ ( SafeUnifiedBVFPConversionImpl+ mode+ (GetWordN mode)+ (GetIntN mode)+ (GetFP mode)+ n+ eb+ sb+ (GetWordN mode n)+ (GetIntN mode n)+ (GetFP mode eb sb)+ (GetFPRoundingMode mode)+ m+ ) =>+ SafeUnifiedBVFPConversion mode n eb sb m++instance+ ( SafeUnifiedBVFPConversionImpl+ mode+ (GetWordN mode)+ (GetIntN mode)+ (GetFP mode)+ n+ eb+ sb+ (GetWordN mode n)+ (GetIntN mode n)+ (GetFP mode eb sb)+ (GetFPRoundingMode mode)+ m+ ) =>+ SafeUnifiedBVFPConversion mode n eb sb m++-- | Unified constraints for conversion from bit-vectors to floating point+-- numbers.+class+ ( UnifiedBVFPConversionImpl+ (mode :: EvalModeTag)+ (GetWordN mode)+ (GetIntN mode)+ (GetFP mode)+ n+ eb+ sb+ (GetWordN mode n)+ (GetIntN mode n)+ (GetFP mode eb sb)+ (GetFPRoundingMode mode)+ ) =>+ UnifiedBVFPConversion mode n eb sb++instance+ ( UnifiedBVFPConversionImpl+ (mode :: EvalModeTag)+ (GetWordN mode)+ (GetIntN mode)+ (GetFP mode)+ n+ eb+ sb+ (GetWordN mode n)+ (GetIntN mode n)+ (GetFP mode eb sb)+ (GetFPRoundingMode mode)+ ) =>+ UnifiedBVFPConversion mode n eb sb++-- | Evaluation mode with unified conversion from bit-vectors to+-- floating-points.+class+ ( forall n eb sb.+ (ValidFP eb sb, KnownNat n, 1 <= n, n ~ (eb + sb)) =>+ UnifiedBVFPConversion mode n eb sb,+ forall n eb sb m.+ ( UnifiedBranching mode m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n,+ n ~ (eb + sb),+ MonadError NotRepresentableFPError m+ ) =>+ SafeUnifiedBVFPConversion mode n eb sb m+ ) =>+ AllUnifiedBVFPConversion mode++instance+ ( forall n eb sb.+ (ValidFP eb sb, KnownNat n, 1 <= n, n ~ (eb + sb)) =>+ UnifiedBVFPConversion mode n eb sb,+ forall n eb sb m.+ ( UnifiedBranching mode m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n,+ n ~ (eb + sb),+ MonadError NotRepresentableFPError m+ ) =>+ SafeUnifiedBVFPConversion mode n eb sb m+ ) =>+ AllUnifiedBVFPConversion mode
+ src/Grisette/Unified/Internal/Class/UnifiedFiniteBits.hs view
@@ -0,0 +1,203 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Unified.Internal.Class.UnifiedFiniteBits+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Unified.Internal.Class.UnifiedFiniteBits+ ( UnifiedFiniteBits (..),+ symTestBit,+ symSetBitTo,+ symFromBits,+ symBitBlast,+ symLsb,+ symMsb,+ symPopCount,+ symCountLeadingZeros,+ symCountTrailingZeros,+ )+where++import Data.Bits+ ( Bits (popCount, testBit),+ FiniteBits (countLeadingZeros, countTrailingZeros),+ )+import Data.Data (Typeable)+import Data.Type.Bool (If)+import GHC.TypeLits (KnownNat, type (<=))+import Grisette.Internal.Core.Data.Class.SymFiniteBits+ ( FromBits,+ SymFiniteBits,+ setBitTo,+ )+import qualified Grisette.Internal.Core.Data.Class.SymFiniteBits as SymFiniteBits+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.SomeBV+ ( SomeIntN,+ SomeSymIntN,+ SomeSymWordN,+ SomeWordN,+ )+import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)+import Grisette.Unified.Internal.Class.UnifiedITEOp+ ( UnifiedITEOp (withBaseITEOp),+ )+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Con, Sym), IsConMode)+import Grisette.Unified.Internal.UnifiedBool (UnifiedBool (GetBool))+import Grisette.Unified.Internal.Util (withMode)++-- | Unified `Grisette.Internal.Core.Data.Class.SymFiniteBits.symTestBit`.+symTestBit ::+ forall mode a.+ (Typeable mode, UnifiedFiniteBits mode a) =>+ a ->+ Int ->+ GetBool mode+symTestBit a i =+ withMode @mode+ (withBaseFiniteBits @mode @a (testBit a i))+ (withBaseFiniteBits @mode @a (SymFiniteBits.symTestBit a i))++-- | Unified `Grisette.Internal.Core.Data.Class.SymFiniteBits.symSetBitTo`.+symSetBitTo ::+ forall mode a.+ (Typeable mode, UnifiedFiniteBits mode a) =>+ a ->+ Int ->+ GetBool mode ->+ a+symSetBitTo a i b =+ withMode @mode+ (withBaseFiniteBits @mode @a (setBitTo a i b))+ (withBaseFiniteBits @mode @a (SymFiniteBits.symSetBitTo a i b))++-- | Unified `Grisette.Internal.Core.Data.Class.SymFiniteBits.symFromBits`.+symFromBits ::+ forall mode a.+ (Typeable mode, UnifiedFiniteBits mode a) =>+ [GetBool mode] ->+ a+symFromBits bits =+ withMode @mode+ (withBaseFiniteBits @mode @a (SymFiniteBits.fromBits bits))+ (withBaseFiniteBits @mode @a (SymFiniteBits.symFromBits bits))++-- | Unified `Grisette.Internal.Core.Data.Class.SymFiniteBits.symBitBlast`.+symBitBlast ::+ forall mode a.+ (Typeable mode, UnifiedFiniteBits mode a) =>+ a ->+ [GetBool mode]+symBitBlast a =+ withMode @mode+ (withBaseFiniteBits @mode @a (SymFiniteBits.bitBlast a))+ (withBaseFiniteBits @mode @a (SymFiniteBits.symBitBlast a))++-- | Unified `Grisette.Internal.Core.Data.Class.SymFiniteBits.symLsb`.+symLsb ::+ forall mode a.+ (Typeable mode, UnifiedFiniteBits mode a) =>+ a ->+ GetBool mode+symLsb a =+ withMode @mode+ (withBaseFiniteBits @mode @a (SymFiniteBits.lsb a))+ (withBaseFiniteBits @mode @a (SymFiniteBits.symLsb a))++-- | Unified `Grisette.Internal.Core.Data.Class.SymFiniteBits.symMsb`.+symMsb ::+ forall mode a.+ (Typeable mode, UnifiedFiniteBits mode a) =>+ a ->+ GetBool mode+symMsb a =+ withMode @mode+ (withBaseFiniteBits @mode @a (SymFiniteBits.msb a))+ (withBaseFiniteBits @mode @a (SymFiniteBits.symMsb a))++-- | Unified `Grisette.Internal.Core.Data.Class.SymFiniteBits.symPopCount`.+symPopCount ::+ forall mode a b.+ (Typeable mode, UnifiedFiniteBits mode a, Num b, UnifiedITEOp mode b) =>+ a ->+ b+symPopCount a =+ withMode @mode+ (withBaseFiniteBits @mode @a (fromIntegral $ popCount a))+ ( withBaseFiniteBits @mode @a $+ withBaseITEOp @mode @b (SymFiniteBits.symPopCount a)+ )++-- | Unified+-- `Grisette.Internal.Core.Data.Class.SymFiniteBits.symCountLeadingZeros`.+symCountLeadingZeros ::+ forall mode a b.+ (Typeable mode, UnifiedFiniteBits mode a, Num b, UnifiedITEOp mode b) =>+ a ->+ b+symCountLeadingZeros a =+ withMode @mode+ (withBaseFiniteBits @mode @a (fromIntegral $ countLeadingZeros a))+ ( withBaseFiniteBits @mode @a $+ withBaseITEOp @mode @b (SymFiniteBits.symCountLeadingZeros a)+ )++-- | Unified+-- `Grisette.Internal.Core.Data.Class.SymFiniteBits.symCountTrailingZeros`.+symCountTrailingZeros ::+ forall mode a b.+ (Typeable mode, UnifiedFiniteBits mode a, Num b, UnifiedITEOp mode b) =>+ a ->+ b+symCountTrailingZeros a =+ withMode @mode+ (withBaseFiniteBits @mode @a (fromIntegral $ countTrailingZeros a))+ ( withBaseFiniteBits @mode @a $+ withBaseITEOp @mode @b (SymFiniteBits.symCountTrailingZeros a)+ )++-- | A class that provides unified equality comparison.+--+-- We use this type class to help resolve the constraints for `FiniteBits`,+-- `FromBits` and `SymFiniteBits`.+class UnifiedFiniteBits mode a where+ withBaseFiniteBits ::+ ((If (IsConMode mode) (FiniteBits a, FromBits a) (SymFiniteBits a)) => r) ->+ r++instance (KnownNat n, 1 <= n) => UnifiedFiniteBits 'Con (WordN n) where+ withBaseFiniteBits r = r++instance (KnownNat n, 1 <= n) => UnifiedFiniteBits 'Con (IntN n) where+ withBaseFiniteBits r = r++instance UnifiedFiniteBits 'Con SomeWordN where+ withBaseFiniteBits r = r++instance UnifiedFiniteBits 'Con SomeIntN where+ withBaseFiniteBits r = r++instance (KnownNat n, 1 <= n) => UnifiedFiniteBits 'Sym (SymWordN n) where+ withBaseFiniteBits r = r++instance (KnownNat n, 1 <= n) => UnifiedFiniteBits 'Sym (SymIntN n) where+ withBaseFiniteBits r = r++instance UnifiedFiniteBits 'Sym SomeSymWordN where+ withBaseFiniteBits r = r++instance UnifiedFiniteBits 'Sym SomeSymIntN where+ withBaseFiniteBits r = r
+ src/Grisette/Unified/Internal/Class/UnifiedFromIntegral.hs view
@@ -0,0 +1,226 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Unified.Internal.Class.UnifiedFromIntegral+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Unified.Internal.Class.UnifiedFromIntegral+ ( UnifiedFromIntegral (..),+ symFromIntegral,+ )+where++import Data.Type.Bool (If)+import Data.Typeable (Typeable)+import GHC.TypeNats (KnownNat, type (<=))+import Grisette.Internal.Core.Data.Class.SymFromIntegral (SymFromIntegral)+import qualified Grisette.Internal.Core.Data.Class.SymFromIntegral as SymFromIntegral+import Grisette.Internal.SymPrim.AlgReal (AlgReal)+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.FP (FP, ValidFP)+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal)+import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)+import Grisette.Internal.SymPrim.SymFP (SymFP)+import Grisette.Internal.SymPrim.SymInteger (SymInteger)+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Con, Sym), IsConMode)+import Grisette.Unified.Internal.Util (withMode)++-- | Unified `Grisette.Internal.Core.Data.Class.SymFromIntegral.symFromIntegral`+-- operation.+--+-- This function isn't able to infer the mode, so you need to provide the mode+-- explicitly. For example:+--+-- > symFromIntegral @mode a+symFromIntegral ::+ forall mode a b. (Typeable mode, UnifiedFromIntegral mode a b) => a -> b+symFromIntegral a =+ withMode @mode+ (withBaseFromIntegral @mode @a @b $ fromIntegral a)+ (withBaseFromIntegral @mode @a @b $ SymFromIntegral.symFromIntegral a)++-- | A class that provides unified conversion from integral types.+--+-- We use this type class to help resolve the constraints for `SymFromIntegral`.+class UnifiedFromIntegral (mode :: EvalModeTag) a b where+ withBaseFromIntegral ::+ ((If (IsConMode mode) (Integral a, Num b) (SymFromIntegral a b)) => r) -> r++instance+ {-# INCOHERENT #-}+ ( Typeable mode,+ (If (IsConMode mode) (Integral a, Num b) (SymFromIntegral a b))+ ) =>+ UnifiedFromIntegral mode a b+ where+ withBaseFromIntegral r = r++instance UnifiedFromIntegral 'Con Integer AlgReal where+ withBaseFromIntegral r = r++instance UnifiedFromIntegral 'Con Integer Integer where+ withBaseFromIntegral r = r++instance (KnownNat n, 1 <= n) => UnifiedFromIntegral 'Con Integer (IntN n) where+ withBaseFromIntegral r = r++instance+ (KnownNat n, 1 <= n) =>+ UnifiedFromIntegral 'Con Integer (WordN n)+ where+ withBaseFromIntegral r = r++instance (ValidFP eb sb) => UnifiedFromIntegral 'Con Integer (FP eb sb) where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n') =>+ UnifiedFromIntegral 'Con (IntN n') AlgReal+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n') =>+ UnifiedFromIntegral 'Con (IntN n') Integer+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', KnownNat n, 1 <= n) =>+ UnifiedFromIntegral 'Con (IntN n') (IntN n)+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', KnownNat n, 1 <= n) =>+ UnifiedFromIntegral 'Con (IntN n') (WordN n)+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', ValidFP eb sb) =>+ UnifiedFromIntegral 'Con (IntN n') (FP eb sb)+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n') =>+ UnifiedFromIntegral 'Con (WordN n') AlgReal+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n') =>+ UnifiedFromIntegral 'Con (WordN n') Integer+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', KnownNat n, 1 <= n) =>+ UnifiedFromIntegral 'Con (WordN n') (IntN n)+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', KnownNat n, 1 <= n) =>+ UnifiedFromIntegral 'Con (WordN n') (WordN n)+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', ValidFP eb sb) =>+ UnifiedFromIntegral 'Con (WordN n') (FP eb sb)+ where+ withBaseFromIntegral r = r++instance UnifiedFromIntegral 'Sym SymInteger SymAlgReal where+ withBaseFromIntegral r = r++instance UnifiedFromIntegral 'Sym SymInteger SymInteger where+ withBaseFromIntegral r = r++instance (KnownNat n, 1 <= n) => UnifiedFromIntegral 'Sym SymInteger (SymIntN n) where+ withBaseFromIntegral r = r++instance+ (KnownNat n, 1 <= n) =>+ UnifiedFromIntegral 'Sym SymInteger (SymWordN n)+ where+ withBaseFromIntegral r = r++instance (ValidFP eb sb) => UnifiedFromIntegral 'Sym SymInteger (SymFP eb sb) where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n') =>+ UnifiedFromIntegral 'Sym (SymIntN n') SymAlgReal+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n') =>+ UnifiedFromIntegral 'Sym (SymIntN n') SymInteger+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', KnownNat n, 1 <= n) =>+ UnifiedFromIntegral 'Sym (SymIntN n') (SymIntN n)+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', KnownNat n, 1 <= n) =>+ UnifiedFromIntegral 'Sym (SymIntN n') (SymWordN n)+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', ValidFP eb sb) =>+ UnifiedFromIntegral 'Sym (SymIntN n') (SymFP eb sb)+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n') =>+ UnifiedFromIntegral 'Sym (SymWordN n') SymAlgReal+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n') =>+ UnifiedFromIntegral 'Sym (SymWordN n') SymInteger+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', KnownNat n, 1 <= n) =>+ UnifiedFromIntegral 'Sym (SymWordN n') (SymIntN n)+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', KnownNat n, 1 <= n) =>+ UnifiedFromIntegral 'Sym (SymWordN n') (SymWordN n)+ where+ withBaseFromIntegral r = r++instance+ (KnownNat n', 1 <= n', ValidFP eb sb) =>+ UnifiedFromIntegral 'Sym (SymWordN n') (SymFP eb sb)+ where+ withBaseFromIntegral r = r
src/Grisette/Unified/Internal/Class/UnifiedITEOp.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE KindSignatures #-}@@ -8,7 +9,10 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# HLINT ignore "Eta reduce" #-}+ -- | -- Module : Grisette.Unified.Internal.Class.UnifiedITEOp -- Copyright : (c) Sirui Lu 2024@@ -28,12 +32,13 @@ import Data.Kind (Constraint) import Data.Type.Bool (If) import Data.Typeable (Typeable)+import Grisette.Internal.Core.Control.Monad.Union (Union) import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp) import qualified Grisette.Internal.Core.Data.Class.ITEOp import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable) import qualified Grisette.Internal.Core.Data.Class.PlainUnion import Grisette.Unified.Internal.BaseMonad (BaseMonad)-import Grisette.Unified.Internal.EvalModeTag (IsConMode)+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Sym), IsConMode) import Grisette.Unified.Internal.UnifiedBool (UnifiedBool (GetBool)) import Grisette.Unified.Internal.Util (withMode) @@ -87,10 +92,15 @@ ((If (IsConMode mode) (() :: Constraint) (ITEOp v)) => r) -> r instance+ {-# INCOHERENT #-} ( Typeable mode, If (IsConMode mode) (() :: Constraint) (ITEOp a) ) => UnifiedITEOp mode a where withBaseITEOp r = withMode @mode r r+ {-# INLINE withBaseITEOp #-}++instance (Mergeable v, UnifiedITEOp 'Sym v) => UnifiedITEOp 'Sym (Union v) where+ withBaseITEOp r = withBaseITEOp @'Sym @v r {-# INLINE withBaseITEOp #-}
+ src/Grisette/Unified/Internal/Class/UnifiedSafeBitCast.hs view
@@ -0,0 +1,128 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Eta reduce" #-}++-- |+-- Module : Grisette.Unified.Internal.Class.UnifiedSafeBitCast+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Unified.Internal.Class.UnifiedSafeBitCast+ ( safeBitCast,+ UnifiedSafeBitCast (..),+ )+where++import Control.Monad.Error.Class (MonadError)+import Data.Typeable (Typeable)+import GHC.TypeLits (KnownNat, type (+), type (<=))+import Grisette.Internal.Core.Data.Class.SafeBitCast (SafeBitCast)+import qualified Grisette.Internal.Core.Data.Class.SafeBitCast+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.FP (FP, NotRepresentableFPError, ValidFP)+import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)+import Grisette.Internal.SymPrim.SymFP (SymFP)+import Grisette.Unified.Internal.Class.UnifiedSimpleMergeable+ ( UnifiedBranching (withBaseBranching),+ )+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Sym))+import Grisette.Unified.Internal.Util (withMode)++-- | Unified `Grisette.Internal.Core.Data.Class.SafeLinearArith.safeSub`+-- operation.+--+-- This function isn't able to infer the mode, so you need to provide the mode+-- explicitly. For example:+--+-- > safeSub @mode a b+safeBitCast ::+ forall mode e a b m.+ ( MonadError e m,+ UnifiedSafeBitCast mode e a b m+ ) =>+ a ->+ m b+safeBitCast a =+ withBaseSafeBitCast @mode @e @a @b @m $+ Grisette.Internal.Core.Data.Class.SafeBitCast.safeBitCast a+{-# INLINE safeBitCast #-}++-- | A class that provides unified safe bitcast operations.+--+-- We use this type class to help resolve the constraints for `SafeBitCast`.+class UnifiedSafeBitCast (mode :: EvalModeTag) e a b m where+ withBaseSafeBitCast :: ((SafeBitCast e a b m) => r) -> r++instance+ {-# INCOHERENT #-}+ (UnifiedBranching mode m, SafeBitCast e a b m) =>+ UnifiedSafeBitCast mode e a b m+ where+ withBaseSafeBitCast r = r++instance+ ( Typeable mode,+ MonadError NotRepresentableFPError m,+ UnifiedBranching mode m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n,+ n ~ (eb + sb)+ ) =>+ UnifiedSafeBitCast mode NotRepresentableFPError (FP eb sb) (WordN n) m+ where+ withBaseSafeBitCast r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ ( Typeable mode,+ MonadError NotRepresentableFPError m,+ UnifiedBranching mode m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n,+ n ~ (eb + sb)+ ) =>+ UnifiedSafeBitCast mode NotRepresentableFPError (FP eb sb) (IntN n) m+ where+ withBaseSafeBitCast r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ ( MonadError NotRepresentableFPError m,+ UnifiedBranching 'Sym m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n,+ n ~ (eb + sb)+ ) =>+ UnifiedSafeBitCast 'Sym NotRepresentableFPError (SymFP eb sb) (SymWordN n) m+ where+ withBaseSafeBitCast r = withBaseBranching @'Sym @m r++instance+ ( MonadError NotRepresentableFPError m,+ UnifiedBranching 'Sym m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n,+ n ~ (eb + sb)+ ) =>+ UnifiedSafeBitCast 'Sym NotRepresentableFPError (SymFP eb sb) (SymIntN n) m+ where+ withBaseSafeBitCast r = withBaseBranching @'Sym @m r
+ src/Grisette/Unified/Internal/Class/UnifiedSafeDiv.hs view
@@ -0,0 +1,265 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# HLINT ignore "Eta reduce" #-}+{-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++-- |+-- Module : Grisette.Unified.Internal.Class.UnifiedSafeDiv+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Unified.Internal.Class.UnifiedSafeDiv+ ( safeDiv,+ safeMod,+ safeDivMod,+ safeQuot,+ safeRem,+ safeQuotRem,+ UnifiedSafeDiv (..),+ )+where++import Control.Monad.Error.Class (MonadError)+import GHC.TypeLits (KnownNat, type (<=))+import Grisette.Internal.Core.Data.Class.SafeDiv+ ( ArithException,+ SafeDiv,+ )+import qualified Grisette.Internal.Core.Data.Class.SafeDiv+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.SomeBV+ ( SomeBVException,+ SomeIntN,+ SomeSymIntN,+ SomeSymWordN,+ SomeWordN,+ )+import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)+import Grisette.Internal.SymPrim.SymInteger (SymInteger)+import Grisette.Unified.Internal.Class.UnifiedSimpleMergeable+ ( UnifiedBranching (withBaseBranching),+ )+import Grisette.Unified.Internal.EvalModeTag+ ( EvalModeTag (Sym),+ )+import Grisette.Unified.Internal.Util (withMode)++-- | Unified `Grisette.Internal.Core.Data.Class.SafeDiv.safeDiv` operation.+--+-- This function isn't able to infer the mode, so you need to provide the mode+-- explicitly. For example:+--+-- > safeDiv @mode a b+safeDiv ::+ forall mode e a m.+ (MonadError e m, UnifiedSafeDiv mode e a m) =>+ a ->+ a ->+ m a+safeDiv a b =+ withBaseSafeDiv @mode @e @a @m $+ Grisette.Internal.Core.Data.Class.SafeDiv.safeDiv a b+{-# INLINE safeDiv #-}++-- | Unified `Grisette.Internal.Core.Data.Class.SafeDiv.safeMod` operation.+--+-- This function isn't able to infer the mode, so you need to provide the mode+-- explicitly. For example:+--+-- > safeMod @mode a b+safeMod ::+ forall mode e a m.+ (MonadError e m, UnifiedSafeDiv mode e a m) =>+ a ->+ a ->+ m a+safeMod a b =+ withBaseSafeDiv @mode @e @a @m $+ Grisette.Internal.Core.Data.Class.SafeDiv.safeMod a b+{-# INLINE safeMod #-}++-- | Unified `Grisette.Internal.Core.Data.Class.SafeDiv.safeDivMod`+-- operation.+--+-- This function isn't able to infer the mode, so you need to provide the mode+-- explicitly. For example:+--+-- > safeDivMod @mode a b+safeDivMod ::+ forall mode e a m.+ (MonadError e m, UnifiedSafeDiv mode e a m) =>+ a ->+ a ->+ m (a, a)+safeDivMod a b =+ withBaseSafeDiv @mode @e @a @m $+ Grisette.Internal.Core.Data.Class.SafeDiv.safeDivMod a b+{-# INLINE safeDivMod #-}++-- | Unified `Grisette.Internal.Core.Data.Class.SafeDiv.safeQuot`+-- operation.+--+-- This function isn't able to infer the mode, so you need to provide the mode+-- explicitly. For example:+--+-- > safeQuot @mode a b+safeQuot ::+ forall mode e a m.+ (MonadError e m, UnifiedSafeDiv mode e a m) =>+ a ->+ a ->+ m a+safeQuot a b =+ withBaseSafeDiv @mode @e @a @m $+ Grisette.Internal.Core.Data.Class.SafeDiv.safeQuot a b+{-# INLINE safeQuot #-}++-- | Unified `Grisette.Internal.Core.Data.Class.SafeDiv.safeRem` operation.+--+-- This function isn't able to infer the mode, so you need to provide the mode+-- explicitly. For example:+--+-- > safeRem @mode a b+safeRem ::+ forall mode e a m.+ (MonadError e m, UnifiedSafeDiv mode e a m) =>+ a ->+ a ->+ m a+safeRem a b =+ withBaseSafeDiv @mode @e @a @m $+ Grisette.Internal.Core.Data.Class.SafeDiv.safeRem a b+{-# INLINE safeRem #-}++-- | Unified `Grisette.Internal.Core.Data.Class.SafeDiv.safeQuotRem`+-- operation.+--+-- This function isn't able to infer the mode, so you need to provide the mode+-- explicitly. For example:+--+-- > safeQuotRem @mode a b+safeQuotRem ::+ forall mode e a m.+ (MonadError e m, UnifiedSafeDiv mode e a m) =>+ a ->+ a ->+ m (a, a)+safeQuotRem a b =+ withBaseSafeDiv @mode @e @a @m $+ Grisette.Internal.Core.Data.Class.SafeDiv.safeQuotRem a b+{-# INLINE safeQuotRem #-}++-- | A class that provides unified division operations.+--+-- We use this type class to help resolve the constraints for `SafeDiv`.+class UnifiedSafeDiv (mode :: EvalModeTag) e a m where+ withBaseSafeDiv :: ((SafeDiv e a m) => r) -> r++instance+ {-# INCOHERENT #-}+ (UnifiedBranching mode m, SafeDiv e a m) =>+ UnifiedSafeDiv mode e a m+ where+ withBaseSafeDiv r = r++instance+ (MonadError ArithException m, UnifiedBranching mode m) =>+ UnifiedSafeDiv mode ArithException Integer m+ where+ withBaseSafeDiv r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ (MonadError ArithException m, UnifiedBranching 'Sym m) =>+ UnifiedSafeDiv 'Sym ArithException SymInteger m+ where+ withBaseSafeDiv r = withBaseBranching @'Sym @m r++instance+ (MonadError ArithException m, UnifiedBranching mode m, KnownNat n, 1 <= n) =>+ UnifiedSafeDiv mode ArithException (IntN n) m+ where+ withBaseSafeDiv r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ (MonadError ArithException m, UnifiedBranching 'Sym m, KnownNat n, 1 <= n) =>+ UnifiedSafeDiv 'Sym ArithException (SymIntN n) m+ where+ withBaseSafeDiv r = withBaseBranching @'Sym @m r++instance+ (MonadError ArithException m, UnifiedBranching mode m, KnownNat n, 1 <= n) =>+ UnifiedSafeDiv mode ArithException (WordN n) m+ where+ withBaseSafeDiv r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ (MonadError ArithException m, UnifiedBranching 'Sym m, KnownNat n, 1 <= n) =>+ UnifiedSafeDiv 'Sym ArithException (SymWordN n) m+ where+ withBaseSafeDiv r = withBaseBranching @'Sym @m r++instance+ ( MonadError (Either SomeBVException ArithException) m,+ UnifiedBranching mode m+ ) =>+ UnifiedSafeDiv+ mode+ (Either SomeBVException ArithException)+ SomeIntN+ m+ where+ withBaseSafeDiv r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ ( MonadError (Either SomeBVException ArithException) m,+ UnifiedBranching 'Sym m+ ) =>+ UnifiedSafeDiv+ 'Sym+ (Either SomeBVException ArithException)+ SomeSymIntN+ m+ where+ withBaseSafeDiv r = withBaseBranching @'Sym @m r++instance+ ( MonadError (Either SomeBVException ArithException) m,+ UnifiedBranching mode m+ ) =>+ UnifiedSafeDiv+ mode+ (Either SomeBVException ArithException)+ SomeWordN+ m+ where+ withBaseSafeDiv r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ ( MonadError (Either SomeBVException ArithException) m,+ UnifiedBranching 'Sym m+ ) =>+ UnifiedSafeDiv+ 'Sym+ (Either SomeBVException ArithException)+ SomeSymWordN+ m+ where+ withBaseSafeDiv r = withBaseBranching @'Sym @m r
− src/Grisette/Unified/Internal/Class/UnifiedSafeDivision.hs
@@ -1,264 +0,0 @@-{-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE KindSignatures #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeOperators #-}-{-# HLINT ignore "Eta reduce" #-}-{-# LANGUAGE UndecidableInstances #-}-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}---- |--- Module : Grisette.Unified.Internal.Class.UnifiedSafeDivision--- Copyright : (c) Sirui Lu 2024--- License : BSD-3-Clause (see the LICENSE file)------ Maintainer : siruilu@cs.washington.edu--- Stability : Experimental--- Portability : GHC only-module Grisette.Unified.Internal.Class.UnifiedSafeDivision- ( safeDiv,- safeMod,- safeDivMod,- safeQuot,- safeRem,- safeQuotRem,- UnifiedSafeDivision (..),- )-where--import Control.Monad.Error.Class (MonadError)-import GHC.TypeLits (KnownNat, type (<=))-import Grisette.Internal.Core.Data.Class.SafeDivision- ( ArithException,- SafeDivision,- )-import qualified Grisette.Internal.Core.Data.Class.SafeDivision-import Grisette.Internal.SymPrim.BV (BitwidthMismatch, IntN, WordN)-import Grisette.Internal.SymPrim.SomeBV- ( SomeIntN,- SomeSymIntN,- SomeSymWordN,- SomeWordN,- )-import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)-import Grisette.Internal.SymPrim.SymInteger (SymInteger)-import Grisette.Unified.Internal.Class.UnifiedSimpleMergeable- ( UnifiedBranching (withBaseBranching),- )-import Grisette.Unified.Internal.EvalModeTag- ( EvalModeTag (Sym),- )-import Grisette.Unified.Internal.Util (withMode)---- | Unified `Grisette.Internal.Core.Data.Class.SafeDivision.safeDiv` operation.------ This function isn't able to infer the mode, so you need to provide the mode--- explicitly. For example:------ > safeDiv @mode a b-safeDiv ::- forall mode e a m.- (MonadError e m, UnifiedSafeDivision mode e a m) =>- a ->- a ->- m a-safeDiv a b =- withBaseSafeDivision @mode @e @a @m $- Grisette.Internal.Core.Data.Class.SafeDivision.safeDiv a b-{-# INLINE safeDiv #-}---- | Unified `Grisette.Internal.Core.Data.Class.SafeDivision.safeMod` operation.------ This function isn't able to infer the mode, so you need to provide the mode--- explicitly. For example:------ > safeMod @mode a b-safeMod ::- forall mode e a m.- (MonadError e m, UnifiedSafeDivision mode e a m) =>- a ->- a ->- m a-safeMod a b =- withBaseSafeDivision @mode @e @a @m $- Grisette.Internal.Core.Data.Class.SafeDivision.safeMod a b-{-# INLINE safeMod #-}---- | Unified `Grisette.Internal.Core.Data.Class.SafeDivision.safeDivMod`--- operation.------ This function isn't able to infer the mode, so you need to provide the mode--- explicitly. For example:------ > safeDivMod @mode a b-safeDivMod ::- forall mode e a m.- (MonadError e m, UnifiedSafeDivision mode e a m) =>- a ->- a ->- m (a, a)-safeDivMod a b =- withBaseSafeDivision @mode @e @a @m $- Grisette.Internal.Core.Data.Class.SafeDivision.safeDivMod a b-{-# INLINE safeDivMod #-}---- | Unified `Grisette.Internal.Core.Data.Class.SafeDivision.safeQuot`--- operation.------ This function isn't able to infer the mode, so you need to provide the mode--- explicitly. For example:------ > safeQuot @mode a b-safeQuot ::- forall mode e a m.- (MonadError e m, UnifiedSafeDivision mode e a m) =>- a ->- a ->- m a-safeQuot a b =- withBaseSafeDivision @mode @e @a @m $- Grisette.Internal.Core.Data.Class.SafeDivision.safeQuot a b-{-# INLINE safeQuot #-}---- | Unified `Grisette.Internal.Core.Data.Class.SafeDivision.safeRem` operation.------ This function isn't able to infer the mode, so you need to provide the mode--- explicitly. For example:------ > safeRem @mode a b-safeRem ::- forall mode e a m.- (MonadError e m, UnifiedSafeDivision mode e a m) =>- a ->- a ->- m a-safeRem a b =- withBaseSafeDivision @mode @e @a @m $- Grisette.Internal.Core.Data.Class.SafeDivision.safeRem a b-{-# INLINE safeRem #-}---- | Unified `Grisette.Internal.Core.Data.Class.SafeDivision.safeQuotRem`--- operation.------ This function isn't able to infer the mode, so you need to provide the mode--- explicitly. For example:------ > safeQuotRem @mode a b-safeQuotRem ::- forall mode e a m.- (MonadError e m, UnifiedSafeDivision mode e a m) =>- a ->- a ->- m (a, a)-safeQuotRem a b =- withBaseSafeDivision @mode @e @a @m $- Grisette.Internal.Core.Data.Class.SafeDivision.safeQuotRem a b-{-# INLINE safeQuotRem #-}---- | A class that provides unified division operations.------ We use this type class to help resolve the constraints for `SafeDivision`.-class UnifiedSafeDivision (mode :: EvalModeTag) e a m where- withBaseSafeDivision :: ((SafeDivision e a m) => r) -> r--instance- {-# INCOHERENT #-}- (UnifiedBranching mode m, SafeDivision e a m) =>- UnifiedSafeDivision mode e a m- where- withBaseSafeDivision r = r--instance- (MonadError ArithException m, UnifiedBranching mode m) =>- UnifiedSafeDivision mode ArithException Integer m- where- withBaseSafeDivision r =- withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)--instance- (MonadError ArithException m, UnifiedBranching 'Sym m) =>- UnifiedSafeDivision 'Sym ArithException SymInteger m- where- withBaseSafeDivision r = withBaseBranching @'Sym @m r--instance- (MonadError ArithException m, UnifiedBranching mode m, KnownNat n, 1 <= n) =>- UnifiedSafeDivision mode ArithException (IntN n) m- where- withBaseSafeDivision r =- withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)--instance- (MonadError ArithException m, UnifiedBranching 'Sym m, KnownNat n, 1 <= n) =>- UnifiedSafeDivision 'Sym ArithException (SymIntN n) m- where- withBaseSafeDivision r = withBaseBranching @'Sym @m r--instance- (MonadError ArithException m, UnifiedBranching mode m, KnownNat n, 1 <= n) =>- UnifiedSafeDivision mode ArithException (WordN n) m- where- withBaseSafeDivision r =- withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)--instance- (MonadError ArithException m, UnifiedBranching 'Sym m, KnownNat n, 1 <= n) =>- UnifiedSafeDivision 'Sym ArithException (SymWordN n) m- where- withBaseSafeDivision r = withBaseBranching @'Sym @m r--instance- ( MonadError (Either BitwidthMismatch ArithException) m,- UnifiedBranching mode m- ) =>- UnifiedSafeDivision- mode- (Either BitwidthMismatch ArithException)- SomeIntN- m- where- withBaseSafeDivision r =- withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)--instance- ( MonadError (Either BitwidthMismatch ArithException) m,- UnifiedBranching 'Sym m- ) =>- UnifiedSafeDivision- 'Sym- (Either BitwidthMismatch ArithException)- SomeSymIntN- m- where- withBaseSafeDivision r = withBaseBranching @'Sym @m r--instance- ( MonadError (Either BitwidthMismatch ArithException) m,- UnifiedBranching mode m- ) =>- UnifiedSafeDivision- mode- (Either BitwidthMismatch ArithException)- SomeWordN- m- where- withBaseSafeDivision r =- withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)--instance- ( MonadError (Either BitwidthMismatch ArithException) m,- UnifiedBranching 'Sym m- ) =>- UnifiedSafeDivision- 'Sym- (Either BitwidthMismatch ArithException)- SomeSymWordN- m- where- withBaseSafeDivision r = withBaseBranching @'Sym @m r
+ src/Grisette/Unified/Internal/Class/UnifiedSafeFdiv.hs view
@@ -0,0 +1,83 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE MonoLocalBinds #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Eta reduce" #-}++-- |+-- Module : Grisette.Unified.Internal.Class.UnifiedSafeFdiv+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Unified.Internal.Class.UnifiedSafeFdiv+ ( safeFdiv,+ UnifiedSafeFdiv (..),+ )+where++import Control.Exception (ArithException)+import Control.Monad.Error.Class (MonadError)+import Data.Typeable (Typeable)+import Grisette.Internal.Core.Data.Class.SafeFdiv (SafeFdiv)+import qualified Grisette.Internal.Core.Data.Class.SafeFdiv+import Grisette.Internal.SymPrim.AlgReal (AlgReal)+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal)+import Grisette.Unified.Internal.Class.UnifiedSimpleMergeable+ ( UnifiedBranching (withBaseBranching),+ )+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Sym))+import Grisette.Unified.Internal.Util (withMode)++-- | Unified `Grisette.Internal.Core.Data.Class.SafeFdiv.safeFdiv` operation.+--+-- This function isn't able to infer the mode, so you need to provide the mode+-- explicitly. For example:+--+-- > safeFdiv @mode a b+safeFdiv ::+ forall mode e a m.+ (MonadError e m, UnifiedSafeFdiv mode e a m) =>+ a ->+ a ->+ m a+safeFdiv a b =+ withBaseUnifiedSafeFdiv @mode @e @a @m $+ Grisette.Internal.Core.Data.Class.SafeFdiv.safeFdiv a b+{-# INLINE safeFdiv #-}++-- | A class that provides unified floating division operations.+--+-- We use this type class to help resolve the constraints for `SafeFdiv`.+class UnifiedSafeFdiv (mode :: EvalModeTag) e a m where+ withBaseUnifiedSafeFdiv :: ((SafeFdiv e a m) => r) -> r++instance+ {-# INCOHERENT #-}+ (UnifiedBranching mode m, SafeFdiv e a m) =>+ UnifiedSafeFdiv mode e a m+ where+ withBaseUnifiedSafeFdiv r = r++instance+ (Typeable mode, MonadError ArithException m, UnifiedBranching mode m) =>+ UnifiedSafeFdiv mode ArithException AlgReal m+ where+ withBaseUnifiedSafeFdiv r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ (MonadError ArithException m, UnifiedBranching 'Sym m) =>+ UnifiedSafeFdiv 'Sym ArithException SymAlgReal m+ where+ withBaseUnifiedSafeFdiv r = withBaseBranching @'Sym @m r
+ src/Grisette/Unified/Internal/Class/UnifiedSafeFromFP.hs view
@@ -0,0 +1,213 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++{-# HLINT ignore "Eta reduce" #-}++-- |+-- Module : Grisette.Unified.Internal.Class.UnifiedSafeFromFP+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Unified.Internal.Class.UnifiedSafeFromFP+ ( UnifiedSafeFromFP (..),+ safeFromFP,+ )+where++import Control.Monad.Error.Class (MonadError)+import GHC.TypeNats (KnownNat, type (<=))+import Grisette.Internal.Core.Data.Class.SafeFromFP (SafeFromFP)+import qualified Grisette.Internal.Core.Data.Class.SafeFromFP as SafeFromFP+import Grisette.Internal.SymPrim.AlgReal (AlgReal)+import Grisette.Internal.SymPrim.BV (IntN, WordN)+import Grisette.Internal.SymPrim.FP+ ( FP,+ FPRoundingMode,+ NotRepresentableFPError,+ ValidFP,+ )+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal)+import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)+import Grisette.Internal.SymPrim.SymFP (SymFP, SymFPRoundingMode)+import Grisette.Internal.SymPrim.SymInteger (SymInteger)+import Grisette.Unified.Internal.Class.UnifiedSimpleMergeable+ ( UnifiedBranching (withBaseBranching),+ )+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Sym))+import Grisette.Unified.Internal.Util (withMode)++-- | Unified `Grisette.Internal.Core.Data.Class.SafeFromFP.safeFromFP`+-- operation.+--+-- This function isn't able to infer the mode, so you need to provide the mode+-- explicitly. For example:+--+-- > safeFromFP @mode mode fp+safeFromFP ::+ forall mode e a fp fprd m.+ (UnifiedSafeFromFP mode e a fp fprd m, MonadError e m) =>+ fprd ->+ fp ->+ m a+safeFromFP rd fp =+ withBaseSafeFromFP @mode @e @a @fp @fprd @m $+ SafeFromFP.safeFromFP rd fp++-- | A class that provides unified safe conversion from floating points.+--+-- We use this type class to help resolve the constraints for `SafeFromFP`.+class UnifiedSafeFromFP (mode :: EvalModeTag) e a fp fprd m where+ withBaseSafeFromFP :: ((SafeFromFP e a fp fprd m) => r) -> r++instance+ {-# INCOHERENT #-}+ (UnifiedBranching mode m, SafeFromFP e a fp fprd m) =>+ UnifiedSafeFromFP mode e a fp fprd m+ where+ withBaseSafeFromFP r = r++instance+ ( MonadError NotRepresentableFPError m,+ UnifiedBranching mode m,+ ValidFP eb sb+ ) =>+ UnifiedSafeFromFP+ mode+ NotRepresentableFPError+ Integer+ (FP eb sb)+ FPRoundingMode+ m+ where+ withBaseSafeFromFP r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ ( MonadError NotRepresentableFPError m,+ UnifiedBranching mode m,+ ValidFP eb sb+ ) =>+ UnifiedSafeFromFP+ mode+ NotRepresentableFPError+ AlgReal+ (FP eb sb)+ FPRoundingMode+ m+ where+ withBaseSafeFromFP r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ ( MonadError NotRepresentableFPError m,+ UnifiedBranching mode m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n+ ) =>+ UnifiedSafeFromFP+ mode+ NotRepresentableFPError+ (IntN n)+ (FP eb sb)+ FPRoundingMode+ m+ where+ withBaseSafeFromFP r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ ( MonadError NotRepresentableFPError m,+ UnifiedBranching mode m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n+ ) =>+ UnifiedSafeFromFP+ mode+ NotRepresentableFPError+ (WordN n)+ (FP eb sb)+ FPRoundingMode+ m+ where+ withBaseSafeFromFP r =+ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r)++instance+ ( MonadError NotRepresentableFPError m,+ UnifiedBranching 'Sym m,+ ValidFP eb sb+ ) =>+ UnifiedSafeFromFP+ 'Sym+ NotRepresentableFPError+ SymInteger+ (SymFP eb sb)+ SymFPRoundingMode+ m+ where+ withBaseSafeFromFP r = withBaseBranching @'Sym @m r++instance+ ( MonadError NotRepresentableFPError m,+ UnifiedBranching 'Sym m,+ ValidFP eb sb+ ) =>+ UnifiedSafeFromFP+ 'Sym+ NotRepresentableFPError+ SymAlgReal+ (SymFP eb sb)+ SymFPRoundingMode+ m+ where+ withBaseSafeFromFP r = withBaseBranching @'Sym @m r++instance+ ( MonadError NotRepresentableFPError m,+ UnifiedBranching 'Sym m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n+ ) =>+ UnifiedSafeFromFP+ 'Sym+ NotRepresentableFPError+ (SymIntN n)+ (SymFP eb sb)+ SymFPRoundingMode+ m+ where+ withBaseSafeFromFP r = withBaseBranching @'Sym @m r++instance+ ( MonadError NotRepresentableFPError m,+ UnifiedBranching 'Sym m,+ ValidFP eb sb,+ KnownNat n,+ 1 <= n+ ) =>+ UnifiedSafeFromFP+ 'Sym+ NotRepresentableFPError+ (SymWordN n)+ (SymFP eb sb)+ SymFPRoundingMode+ m+ where+ withBaseSafeFromFP r = withBaseBranching @'Sym @m r
src/Grisette/Unified/Internal/Class/UnifiedSafeLinearArith.hs view
@@ -37,9 +37,10 @@ SafeLinearArith, ) import qualified Grisette.Internal.Core.Data.Class.SafeLinearArith-import Grisette.Internal.SymPrim.BV (BitwidthMismatch, IntN, WordN)+import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.SomeBV- ( SomeIntN,+ ( SomeBVException,+ SomeIntN, SomeSymIntN, SomeSymWordN, SomeWordN,@@ -166,12 +167,12 @@ withBaseSafeLinearArith r = withBaseBranching @'Sym @m r instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching mode m ) => UnifiedSafeLinearArith mode- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeIntN m where@@ -179,24 +180,24 @@ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r) instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching 'Sym m ) => UnifiedSafeLinearArith 'Sym- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeSymIntN m where withBaseSafeLinearArith r = withBaseBranching @'Sym @m r instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching mode m ) => UnifiedSafeLinearArith mode- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeWordN m where@@ -204,12 +205,12 @@ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r) instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching 'Sym m ) => UnifiedSafeLinearArith 'Sym- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeSymWordN m where
src/Grisette/Unified/Internal/Class/UnifiedSafeSymRotate.hs view
@@ -28,16 +28,15 @@ ) where +import Control.Exception (ArithException) import Control.Monad.Error.Class (MonadError) import GHC.TypeLits (KnownNat, type (<=))-import Grisette.Internal.Core.Data.Class.SafeDivision- ( ArithException,- ) import Grisette.Internal.Core.Data.Class.SafeSymRotate (SafeSymRotate) import qualified Grisette.Internal.Core.Data.Class.SafeSymRotate-import Grisette.Internal.SymPrim.BV (BitwidthMismatch, IntN, WordN)+import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.SomeBV- ( SomeIntN,+ ( SomeBVException,+ SomeIntN, SomeSymIntN, SomeSymWordN, SomeWordN,@@ -131,12 +130,12 @@ withBaseSafeSymRotate r = withBaseBranching @'Sym @m r instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching mode m ) => UnifiedSafeSymRotate mode- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeIntN m where@@ -144,24 +143,24 @@ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r) instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching 'Sym m ) => UnifiedSafeSymRotate 'Sym- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeSymIntN m where withBaseSafeSymRotate r = withBaseBranching @'Sym @m r instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching mode m ) => UnifiedSafeSymRotate mode- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeWordN m where@@ -169,12 +168,12 @@ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r) instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching 'Sym m ) => UnifiedSafeSymRotate 'Sym- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeSymWordN m where
src/Grisette/Unified/Internal/Class/UnifiedSafeSymShift.hs view
@@ -30,16 +30,15 @@ ) where +import Control.Exception (ArithException) import Control.Monad.Error.Class (MonadError) import GHC.TypeLits (KnownNat, type (<=))-import Grisette.Internal.Core.Data.Class.SafeDivision- ( ArithException,- ) import Grisette.Internal.Core.Data.Class.SafeSymShift (SafeSymShift) import qualified Grisette.Internal.Core.Data.Class.SafeSymShift-import Grisette.Internal.SymPrim.BV (BitwidthMismatch, IntN, WordN)+import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.SomeBV- ( SomeIntN,+ ( SomeBVException,+ SomeIntN, SomeSymIntN, SomeSymWordN, SomeWordN,@@ -175,12 +174,12 @@ withBaseSafeSymShift r = withBaseBranching @'Sym @m r instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching mode m ) => UnifiedSafeSymShift mode- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeIntN m where@@ -188,24 +187,24 @@ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r) instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching 'Sym m ) => UnifiedSafeSymShift 'Sym- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeSymIntN m where withBaseSafeSymShift r = withBaseBranching @'Sym @m r instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching mode m ) => UnifiedSafeSymShift mode- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeWordN m where@@ -213,12 +212,12 @@ withMode @mode (withBaseBranching @mode @m r) (withBaseBranching @mode @m r) instance- ( MonadError (Either BitwidthMismatch ArithException) m,+ ( MonadError (Either SomeBVException ArithException) m, UnifiedBranching 'Sym m ) => UnifiedSafeSymShift 'Sym- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) SomeSymWordN m where
src/Grisette/Unified/Internal/Class/UnifiedSimpleMergeable.hs view
@@ -33,6 +33,7 @@ liftMrgIte, mrgIte2, liftMrgIte2,+ simpleMerge, ) where @@ -54,6 +55,7 @@ import Grisette.Internal.Core.Control.Monad.Union (liftUnion) import Grisette.Internal.Core.Data.Class.GenSym (FreshT) import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)+import qualified Grisette.Internal.Core.Data.Class.PlainUnion as Grisette import Grisette.Internal.Core.Data.Class.SimpleMergeable ( SimpleMergeable, SimpleMergeable1,@@ -113,6 +115,17 @@ (withBaseBranching @mode @m $ mrgSingle . runIdentity $ b) (withBaseBranching @mode @m $ liftUnion b) {-# INLINE liftBaseMonad #-}++-- | Unified merge of simply mergeable values in the base monad.+simpleMerge ::+ forall mode a.+ (Typeable mode, UnifiedSimpleMergeable mode a) =>+ BaseMonad mode a ->+ a+simpleMerge =+ withMode @mode+ runIdentity+ (withBaseSimpleMergeable @mode @a Grisette.simpleMerge) -- | Unified `Grisette.mrgIte`. mrgIte ::
src/Grisette/Unified/Internal/Class/UnifiedSymEq.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-}@@ -11,7 +12,10 @@ {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# HLINT ignore "Eta reduce" #-}+ -- | -- Module : Grisette.Unified.Internal.Class.UnifiedSymEq -- Copyright : (c) Sirui Lu 2024@@ -26,6 +30,7 @@ UnifiedSymEq2 (..), (.==), (./=),+ symDistinct, liftSymEq, symEq1, liftSymEq2,@@ -50,6 +55,7 @@ ( AssertionError, VerificationConditions, )+import Grisette.Internal.Core.Control.Monad.Union (Union) import Grisette.Internal.Core.Data.Class.SymEq (SymEq, SymEq1, SymEq2) import qualified Grisette.Internal.Core.Data.Class.SymEq import Grisette.Internal.SymPrim.BV (IntN, WordN)@@ -58,7 +64,7 @@ ( deriveFunctorArgUnifiedInterfaces, deriveUnifiedInterface1s, )-import Grisette.Unified.Internal.EvalModeTag (IsConMode)+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Sym), IsConMode) import Grisette.Unified.Internal.UnifiedBool (UnifiedBool (GetBool)) import Grisette.Unified.Internal.Util (withMode) @@ -94,6 +100,26 @@ (withBaseSymEq @mode @a $ a /= b) (withBaseSymEq @mode @a $ a Grisette.Internal.Core.Data.Class.SymEq../= b) +-- | Unified `Grisette.Internal.Core.Data.Class.SymEq.symDistinct`.+--+-- Note that you may sometimes need to write type annotations for the result+-- when the mode isn't clear:+--+-- > symDistinct l :: GetBool mode+--+-- One example when it isn't clear is when this is used in unified+-- `Grisette.Unified.Internal.Class.UnifiedBranching.mrgIf`.+symDistinct ::+ forall mode a. (Typeable mode, UnifiedSymEq mode a) => [a] -> GetBool mode+symDistinct l =+ withMode @mode+ ( withBaseSymEq @mode @a $+ Grisette.Internal.Core.Data.Class.SymEq.distinct l+ )+ ( withBaseSymEq @mode @a $+ Grisette.Internal.Core.Data.Class.SymEq.symDistinct l+ )+ -- | Unified `Grisette.Internal.Core.Data.Class.SymEq.liftSymEq`. liftSymEq :: forall mode f a b.@@ -218,6 +244,10 @@ where withBaseSymEq2 r = r {-# INLINE withBaseSymEq2 #-}++instance (UnifiedSymEq 'Sym v) => UnifiedSymEq 'Sym (Union v) where+ withBaseSymEq r = withBaseSymEq @'Sym @v r+ {-# INLINE withBaseSymEq #-} deriveFunctorArgUnifiedInterfaces ''UnifiedSymEq
src/Grisette/Unified/Internal/Class/UnifiedSymOrd.hs view
@@ -12,7 +12,10 @@ {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# HLINT ignore "Eta reduce" #-}+ -- | -- Module : Grisette.Unified.Internal.Class.UnifiedSymOrd -- Copyright : (c) Sirui Lu 2024@@ -63,6 +66,7 @@ ( AssertionError, VerificationConditions, )+import Grisette.Internal.Core.Control.Monad.Union (Union) import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable) import Grisette.Internal.Core.Data.Class.SymOrd (SymOrd, SymOrd1, SymOrd2) import qualified Grisette.Internal.Core.Data.Class.SymOrd@@ -81,7 +85,8 @@ ( UnifiedBranching (withBaseBranching), ) import Grisette.Unified.Internal.EvalModeTag- ( IsConMode,+ ( EvalModeTag (Sym),+ IsConMode, ) import Grisette.Unified.Internal.UnifiedBool (UnifiedBool (GetBool)) import Grisette.Unified.Internal.Util (withMode)@@ -368,6 +373,10 @@ where withBaseSymOrd2 r = r {-# INLINE withBaseSymOrd2 #-}++instance (UnifiedSymOrd 'Sym v) => UnifiedSymOrd 'Sym (Union v) where+ withBaseSymOrd r = withBaseSymOrd @'Sym @v r+ {-# INLINE withBaseSymOrd #-} deriveFunctorArgUnifiedInterfaces ''UnifiedSymOrd
src/Grisette/Unified/Internal/EvalMode.hs view
@@ -21,16 +21,19 @@ -- SafeUnifiedInteger', import Grisette.Internal.Core.Data.Class.TryMerge (TryMerge)+import Grisette.Unified.Internal.BVBVConversion (AllUnifiedBVBVConversion)+import Grisette.Unified.Internal.BVFPConversion (AllUnifiedBVFPConversion) import Grisette.Unified.Internal.BaseMonad (BaseMonad) import Grisette.Unified.Internal.Class.UnifiedSimpleMergeable (UnifiedBranching) import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Con, Sym))+import Grisette.Unified.Internal.FPFPConversion (AllUnifiedFPFPConversion)+import Grisette.Unified.Internal.UnifiedAlgReal (UnifiedAlgReal) import Grisette.Unified.Internal.UnifiedBV (AllUnifiedBV) import Grisette.Unified.Internal.UnifiedBool (UnifiedBool (GetBool)) import Grisette.Unified.Internal.UnifiedConstraint (UnifiedPrimitive) import Grisette.Unified.Internal.UnifiedData (AllUnifiedData)-import Grisette.Unified.Internal.UnifiedInteger- ( UnifiedInteger,- )+import Grisette.Unified.Internal.UnifiedFP (AllUnifiedFP)+import Grisette.Unified.Internal.UnifiedInteger (UnifiedInteger) -- | A constraint that specifies that the mode is valid, and provide all the -- corresponding constraints for the operaions for the types.@@ -74,8 +77,13 @@ UnifiedBool mode, UnifiedPrimitive mode (GetBool mode), UnifiedInteger mode,+ UnifiedAlgReal mode, AllUnifiedBV mode, AllUnifiedData mode,+ AllUnifiedFP mode,+ AllUnifiedBVFPConversion mode,+ AllUnifiedBVBVConversion mode,+ AllUnifiedFPFPConversion mode, Monad (BaseMonad mode), TryMerge (BaseMonad mode), UnifiedBranching mode (BaseMonad mode)
+ src/Grisette/Unified/Internal/FPFPConversion.hs view
@@ -0,0 +1,127 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE MonoLocalBinds #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Unified.Internal.FPFPConversion+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Unified.Internal.FPFPConversion+ ( UnifiedFPFPConversion,+ AllUnifiedFPFPConversion,+ )+where++import Grisette.Internal.Core.Data.Class.IEEEFP (IEEEFPConvertible)+import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, ValidFP)+import Grisette.Internal.SymPrim.SymFP (SymFP, SymFPRoundingMode)+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Con, Sym))+import Grisette.Unified.Internal.UnifiedFP (UnifiedFPImpl (GetFP, GetFPRoundingMode))++class+ ( UnifiedFPImpl mode fpn eb0 sb0 fp0 fprd,+ UnifiedFPImpl mode fpn eb1 sb1 fp1 fprd,+ IEEEFPConvertible fp0 fp1 fprd+ ) =>+ UnifiedFPFPConversionImpl+ (mode :: EvalModeTag)+ fpn+ eb0+ sb0+ eb1+ sb1+ fp0+ fp1+ fprd++instance+ (ValidFP eb0 sb0, ValidFP eb1 sb1) =>+ UnifiedFPFPConversionImpl+ 'Con+ FP+ eb0+ sb0+ eb1+ sb1+ (FP eb0 sb0)+ (FP eb1 sb1)+ FPRoundingMode++instance+ (ValidFP eb0 sb0, ValidFP eb1 sb1) =>+ UnifiedFPFPConversionImpl+ 'Sym+ SymFP+ eb0+ sb0+ eb1+ sb1+ (SymFP eb0 sb0)+ (SymFP eb1 sb1)+ SymFPRoundingMode++-- | Unified constraints for conversion from floating point numbers to floating+-- point numbers.+class+ ( UnifiedFPFPConversionImpl+ (mode :: EvalModeTag)+ (GetFP mode)+ eb0+ sb0+ eb1+ sb1+ (GetFP mode eb0 sb0)+ (GetFP mode eb1 sb1)+ (GetFPRoundingMode mode)+ ) =>+ UnifiedFPFPConversion mode eb0 sb0 eb1 sb1++instance+ ( UnifiedFPFPConversionImpl+ (mode :: EvalModeTag)+ (GetFP mode)+ eb0+ sb0+ eb1+ sb1+ (GetFP mode eb0 sb0)+ (GetFP mode eb1 sb1)+ (GetFPRoundingMode mode)+ ) =>+ UnifiedFPFPConversion mode eb0 sb0 eb1 sb1++-- | Evaluation mode with unified conversion from floating-points to+-- floating-points.+class+ ( forall eb0 sb0 eb1 sb1.+ (ValidFP eb0 sb0, ValidFP eb1 sb1) =>+ UnifiedFPFPConversion+ mode+ eb0+ sb0+ eb1+ sb1+ ) =>+ AllUnifiedFPFPConversion mode++instance+ ( forall eb0 sb0 eb1 sb1.+ (ValidFP eb0 sb0, ValidFP eb1 sb1) =>+ UnifiedFPFPConversion+ mode+ eb0+ sb0+ eb1+ sb1+ ) =>+ AllUnifiedFPFPConversion mode
+ src/Grisette/Unified/Internal/UnifiedAlgReal.hs view
@@ -0,0 +1,76 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeFamilyDependencies #-}+{-# LANGUAGE TypeOperators #-}++-- |+-- Module : Grisette.Unified.Internal.UnifiedAlgReal+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Unified.Internal.UnifiedAlgReal+ ( UnifiedAlgReal,+ GetAlgReal,+ )+where++import Control.Exception (ArithException)+import Control.Monad.Error.Class (MonadError)+import Grisette.Internal.Core.Data.Class.SafeFdiv (FdivOr)+import Grisette.Internal.SymPrim.AlgReal (AlgReal)+import Grisette.Internal.SymPrim.SymAlgReal (SymAlgReal)+import Grisette.Unified.Internal.BaseConstraint+ ( BasicGrisetteType,+ ConSymConversion,+ )+import Grisette.Unified.Internal.Class.UnifiedFromIntegral (UnifiedFromIntegral)+import Grisette.Unified.Internal.Class.UnifiedSafeFdiv (UnifiedSafeFdiv)+import Grisette.Unified.Internal.Class.UnifiedSimpleMergeable (UnifiedBranching)+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Con, Sym))+import Grisette.Unified.Internal.UnifiedConstraint (UnifiedPrimitive)+import Grisette.Unified.Internal.UnifiedInteger (GetInteger)++class+ ( BasicGrisetteType (GetAlgReal mode),+ ConSymConversion AlgReal SymAlgReal (GetAlgReal mode),+ Num (GetAlgReal mode),+ Fractional (GetAlgReal mode),+ UnifiedPrimitive mode (GetAlgReal mode),+ FdivOr (GetAlgReal mode),+ forall m.+ (UnifiedBranching mode m, MonadError ArithException m) =>+ UnifiedSafeFdiv mode ArithException r m,+ UnifiedFromIntegral mode (GetInteger mode) r,+ r ~ GetAlgReal mode+ ) =>+ UnifiedAlgRealImpl (mode :: EvalModeTag) r+ | mode -> r+ where+ -- | Get a unified algebraic real type. Resolves to 'AlgReal' in 'Con' mode,+ -- and 'SymAlgReal' in 'Sym' mode.+ --+ -- 'Floating', 'Grisette.LogBaseOr' and 'Grisette.SafeLogBase' for+ -- 'SymAlgReal' are not provided as they are not available for 'AlgReal'.+ type GetAlgReal mode = real | real -> mode++instance UnifiedAlgRealImpl 'Con AlgReal where+ type GetAlgReal 'Con = AlgReal++instance UnifiedAlgRealImpl 'Sym SymAlgReal where+ type GetAlgReal 'Sym = SymAlgReal++-- | Evaluation mode with unified 'AlgReal' type.+class+ (UnifiedAlgRealImpl mode (GetAlgReal mode)) =>+ UnifiedAlgReal (mode :: EvalModeTag)++instance UnifiedAlgReal 'Con++instance UnifiedAlgReal 'Sym
src/Grisette/Unified/Internal/UnifiedBV.hs view
@@ -22,6 +22,7 @@ module Grisette.Unified.Internal.UnifiedBV ( GetWordN, GetIntN,+ UnifiedBVImpl, UnifiedBV, GetSomeWordN, GetSomeIntN,@@ -36,17 +37,19 @@ import Data.Bits (Bits, FiniteBits) import Data.Kind (Constraint, Type) import GHC.TypeNats (KnownNat, Nat, type (<=))+import Grisette.Internal.Core.Data.Class.BitCast (BitCast) import Grisette.Internal.Core.Data.Class.BitVector (BV, SizedBV)+import Grisette.Internal.Core.Data.Class.SafeDiv (DivOr) import Grisette.Internal.Core.Data.Class.SignConversion (SignConversion) import Grisette.Internal.Core.Data.Class.SymRotate (SymRotate) import Grisette.Internal.Core.Data.Class.SymShift (SymShift) import Grisette.Internal.SymPrim.BV- ( BitwidthMismatch,- IntN,+ ( IntN, WordN, ) import Grisette.Internal.SymPrim.SomeBV ( SomeBV,+ SomeBVException, SomeIntN, SomeSymIntN, SomeSymWordN,@@ -57,8 +60,12 @@ ( BasicGrisetteType, ConSymConversion, )+import Grisette.Unified.Internal.Class.UnifiedFiniteBits+ ( UnifiedFiniteBits,+ )+import Grisette.Unified.Internal.Class.UnifiedFromIntegral (UnifiedFromIntegral) import Grisette.Unified.Internal.Class.UnifiedITEOp (UnifiedITEOp)-import Grisette.Unified.Internal.Class.UnifiedSafeDivision (UnifiedSafeDivision)+import Grisette.Unified.Internal.Class.UnifiedSafeDiv (UnifiedSafeDiv) import Grisette.Unified.Internal.Class.UnifiedSafeLinearArith ( UnifiedSafeLinearArith, )@@ -73,6 +80,8 @@ import Grisette.Unified.Internal.Class.UnifiedSymEq (UnifiedSymEq) import Grisette.Unified.Internal.Class.UnifiedSymOrd (UnifiedSymOrd) import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Con, Sym))+import Grisette.Unified.Internal.UnifiedAlgReal (GetAlgReal)+import Grisette.Unified.Internal.UnifiedInteger (GetInteger) type BVConstraint mode word int = ( BasicGrisetteType word,@@ -93,7 +102,9 @@ UnifiedSymOrd mode int, UnifiedITEOp mode word, UnifiedITEOp mode int,- SignConversion word int+ SignConversion word int,+ UnifiedFiniteBits mode word,+ UnifiedFiniteBits mode int ) :: Constraint @@ -101,29 +112,42 @@ ( BVConstraint mode word int, BV word, BV int,+ DivOr word,+ DivOr int, ConSymConversion SomeWordN SomeSymWordN word, ConSymConversion SomeIntN SomeSymIntN int ) :: Constraint +-- | Implementation for 'UnifiedBV'. class ( BVConstraint mode (GetWordN mode n) (GetIntN mode n), ConSymConversion (WordN n) (SymWordN n) (GetWordN mode n), UnifiedSimpleMergeable mode (GetWordN mode n), ConSymConversion (IntN n) (SymIntN n) (GetIntN mode n), UnifiedSimpleMergeable mode (GetIntN mode n),- SizedBV wordn,- SizedBV intn, wordn ~ GetWordN mode, intn ~ GetIntN mode, word ~ wordn n,- int ~ intn n+ int ~ intn n,+ BitCast word int,+ BitCast int word,+ DivOr word,+ DivOr int,+ UnifiedFromIntegral mode (GetInteger mode) word,+ UnifiedFromIntegral mode (GetInteger mode) int,+ UnifiedFromIntegral mode word (GetInteger mode),+ UnifiedFromIntegral mode word (GetAlgReal mode),+ UnifiedFromIntegral mode int (GetInteger mode),+ UnifiedFromIntegral mode int (GetAlgReal mode) ) => UnifiedBVImpl (mode :: EvalModeTag) wordn intn n word int- | wordn n -> word intn int,- word -> wordn intn n int,- intn n -> int wordn word,- int -> intn wordn n word+ | wordn -> intn,+ intn -> wordn,+ wordn n -> word,+ word -> wordn n,+ intn n -> int,+ int -> intn n where -- | Get a unified unsigned size-tagged bit vector type. Resolves to 'WordN' -- in 'Con' mode, and 'SymWordN' in 'Sym' mode.@@ -182,11 +206,11 @@ UnifiedBV mode n class- ( UnifiedSafeDivision mode ArithException word m,+ ( UnifiedSafeDiv mode ArithException word m, UnifiedSafeLinearArith mode ArithException word m, UnifiedSafeSymShift mode ArithException word m, UnifiedSafeSymRotate mode ArithException word m,- UnifiedSafeDivision mode ArithException int m,+ UnifiedSafeDiv mode ArithException int m, UnifiedSafeLinearArith mode ArithException int m, UnifiedSafeSymShift mode ArithException int m, UnifiedSafeSymRotate mode ArithException int m,@@ -195,11 +219,11 @@ SafeUnifiedBVImpl (mode :: EvalModeTag) wordn intn n word int m instance- ( UnifiedSafeDivision mode ArithException word m,+ ( UnifiedSafeDiv mode ArithException word m, UnifiedSafeLinearArith mode ArithException word m, UnifiedSafeSymShift mode ArithException word m, UnifiedSafeSymRotate mode ArithException word m,- UnifiedSafeDivision mode ArithException int m,+ UnifiedSafeDiv mode ArithException int m, UnifiedSafeLinearArith mode ArithException int m, UnifiedSafeSymShift mode ArithException int m, UnifiedSafeSymRotate mode ArithException int m,@@ -235,27 +259,27 @@ class ( SomeBVPair mode word int,- UnifiedSafeDivision mode (Either BitwidthMismatch ArithException) word m,- UnifiedSafeLinearArith mode (Either BitwidthMismatch ArithException) word m,- UnifiedSafeSymRotate mode (Either BitwidthMismatch ArithException) word m,- UnifiedSafeSymShift mode (Either BitwidthMismatch ArithException) word m,- UnifiedSafeDivision mode (Either BitwidthMismatch ArithException) int m,- UnifiedSafeLinearArith mode (Either BitwidthMismatch ArithException) int m,- UnifiedSafeSymRotate mode (Either BitwidthMismatch ArithException) int m,- UnifiedSafeSymShift mode (Either BitwidthMismatch ArithException) int m+ UnifiedSafeDiv mode (Either SomeBVException ArithException) word m,+ UnifiedSafeLinearArith mode (Either SomeBVException ArithException) word m,+ UnifiedSafeSymRotate mode (Either SomeBVException ArithException) word m,+ UnifiedSafeSymShift mode (Either SomeBVException ArithException) word m,+ UnifiedSafeDiv mode (Either SomeBVException ArithException) int m,+ UnifiedSafeLinearArith mode (Either SomeBVException ArithException) int m,+ UnifiedSafeSymRotate mode (Either SomeBVException ArithException) int m,+ UnifiedSafeSymShift mode (Either SomeBVException ArithException) int m ) => SafeUnifiedSomeBVImpl (mode :: EvalModeTag) word int m instance ( SomeBVPair mode word int,- UnifiedSafeDivision mode (Either BitwidthMismatch ArithException) word m,- UnifiedSafeLinearArith mode (Either BitwidthMismatch ArithException) word m,- UnifiedSafeSymRotate mode (Either BitwidthMismatch ArithException) word m,- UnifiedSafeSymShift mode (Either BitwidthMismatch ArithException) word m,- UnifiedSafeDivision mode (Either BitwidthMismatch ArithException) int m,- UnifiedSafeLinearArith mode (Either BitwidthMismatch ArithException) int m,- UnifiedSafeSymRotate mode (Either BitwidthMismatch ArithException) int m,- UnifiedSafeSymShift mode (Either BitwidthMismatch ArithException) int m+ UnifiedSafeDiv mode (Either SomeBVException ArithException) word m,+ UnifiedSafeLinearArith mode (Either SomeBVException ArithException) word m,+ UnifiedSafeSymRotate mode (Either SomeBVException ArithException) word m,+ UnifiedSafeSymShift mode (Either SomeBVException ArithException) word m,+ UnifiedSafeDiv mode (Either SomeBVException ArithException) int m,+ UnifiedSafeLinearArith mode (Either SomeBVException ArithException) int m,+ UnifiedSafeSymRotate mode (Either SomeBVException ArithException) int m,+ UnifiedSafeSymShift mode (Either SomeBVException ArithException) int m ) => SafeUnifiedSomeBVImpl (mode :: EvalModeTag) word int m @@ -290,11 +314,13 @@ SafeUnifiedBV mode n m, forall m. ( UnifiedBranching mode m,- MonadError (Either BitwidthMismatch ArithException) m+ MonadError (Either SomeBVException ArithException) m ) => SafeUnifiedSomeBV mode m, forall n. (KnownNat n, 1 <= n) => UnifiedBV mode n,- SomeBVPair mode (GetSomeWordN mode) (GetSomeIntN mode)+ SomeBVPair mode (GetSomeWordN mode) (GetSomeIntN mode),+ SizedBV (GetWordN mode),+ SizedBV (GetIntN mode) ) => AllUnifiedBV mode @@ -308,10 +334,12 @@ SafeUnifiedBV mode n m, forall m. ( UnifiedBranching mode m,- MonadError (Either BitwidthMismatch ArithException) m+ MonadError (Either SomeBVException ArithException) m ) => SafeUnifiedSomeBV mode m, forall n. (KnownNat n, 1 <= n) => UnifiedBV mode n,- SomeBVPair mode (GetSomeWordN mode) (GetSomeIntN mode)+ SomeBVPair mode (GetSomeWordN mode) (GetSomeIntN mode),+ SizedBV (GetWordN mode),+ SizedBV (GetIntN mode) ) => AllUnifiedBV mode
src/Grisette/Unified/Internal/UnifiedData.hs view
@@ -7,7 +7,7 @@ {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeFamilyDependencies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} @@ -29,6 +29,7 @@ where import Control.DeepSeq (NFData)+import Control.Monad.Identity (Identity (Identity, runIdentity)) import Data.Hashable (Hashable) import Grisette.Internal.Core.Control.Monad.Union (Union) import Grisette.Internal.Core.Data.Class.EvalSym (EvalSym)@@ -44,11 +45,16 @@ import Grisette.Internal.Core.Data.Class.ToSym (ToSym) import Grisette.Internal.Core.Data.Class.TryMerge (mrgSingle) import Grisette.Internal.SymPrim.AllSyms (AllSyms)+import Grisette.Unified.Internal.Class.UnifiedITEOp (UnifiedITEOp) import Grisette.Unified.Internal.Class.UnifiedSimpleMergeable ( UnifiedBranching (withBaseBranching),+ UnifiedSimpleMergeable, liftBaseMonad, )+import Grisette.Unified.Internal.Class.UnifiedSymEq (UnifiedSymEq)+import Grisette.Unified.Internal.Class.UnifiedSymOrd (UnifiedSymOrd) import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Con, Sym))+import Instances.TH.Lift () import Language.Haskell.TH.Syntax (Lift) class@@ -69,16 +75,19 @@ (Show v) => Show u, (SymOrd v) => SymOrd u, (SubstSym v) => SubstSym u,+ (UnifiedITEOp mode v) => UnifiedITEOp mode u,+ (UnifiedSimpleMergeable mode v) => UnifiedSimpleMergeable mode u,+ (UnifiedSymEq mode v) => UnifiedSymEq mode u,+ (UnifiedSymOrd mode v) => UnifiedSymOrd mode u, forall b. (ToCon v b) => ToCon u b, forall a. (ToSym a v) => ToSym a u ) => UnifiedDataImpl (mode :: EvalModeTag) v u- | u mode -> v,- u v -> mode+ | u -> mode v where -- | Get a unified data type. Resolves to @v@ in 'Con' mode, and @'Union' v@ -- in 'Sym' mode.- type GetData mode v+ type GetData mode v = r | r -> mode v -- | Wraps a value into the unified data type. wrapData :: v -> u@@ -86,12 +95,12 @@ -- | Extracts a value from the unified data type. extractData :: (Monad m, UnifiedBranching mode m) => u -> m v -instance (Mergeable v) => UnifiedDataImpl 'Con v v where- type GetData 'Con v = v- wrapData = id+instance (Mergeable v) => UnifiedDataImpl 'Con v (Identity v) where+ type GetData 'Con v = Identity v+ wrapData = Identity extractData ::- forall m. (Mergeable v, Monad m, UnifiedBranching Con m) => v -> m v- extractData = withBaseBranching @'Con @m mrgSingle+ forall m. (Mergeable v, Monad m, UnifiedBranching Con m) => Identity v -> m v+ extractData = withBaseBranching @'Con @m $ mrgSingle . runIdentity instance (Mergeable v) => UnifiedDataImpl 'Sym v (Union v) where type GetData 'Sym v = Union v@@ -106,7 +115,21 @@ instance (UnifiedDataImpl bool v (GetData bool v)) => UnifiedData bool v +class+ (UnifiedSimpleMergeable 'Sym (GetData 'Sym v)) =>+ UnifiedDataSimpleMergeable v++instance (Mergeable v) => UnifiedDataSimpleMergeable v+ -- | Evaluation mode with unified data types.-class (forall v. (Mergeable v) => UnifiedData bool v) => AllUnifiedData bool+class+ ( forall v. (Mergeable v) => UnifiedData bool v,+ forall v. (Mergeable v) => UnifiedDataSimpleMergeable v+ ) =>+ AllUnifiedData bool -instance (forall v. (Mergeable v) => UnifiedData bool v) => AllUnifiedData bool+instance+ ( forall v. (Mergeable v) => UnifiedData bool v,+ forall v. (Mergeable v) => UnifiedDataSimpleMergeable v+ ) =>+ AllUnifiedData bool
+ src/Grisette/Unified/Internal/UnifiedFP.hs view
@@ -0,0 +1,191 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeFamilyDependencies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++-- |+-- Module : Grisette.Unified.Internal.UnifiedFP+-- Copyright : (c) Sirui Lu 2024+-- License : BSD-3-Clause (see the LICENSE file)+--+-- Maintainer : siruilu@cs.washington.edu+-- Stability : Experimental+-- Portability : GHC only+module Grisette.Unified.Internal.UnifiedFP+ ( GetFP,+ GetFPRoundingMode,+ UnifiedFP,+ SafeUnifiedFP,+ AllUnifiedFP,+ UnifiedFPImpl,+ )+where++import Control.Monad.Error.Class (MonadError)+import Data.Kind (Type)+import GHC.TypeNats (Nat)+import Grisette.Internal.Core.Data.Class.IEEEFP+ ( IEEEFPConstants,+ IEEEFPConvertible,+ IEEEFPOp,+ IEEEFPRoundingOp,+ IEEEFPToAlgReal,+ )+import Grisette.Internal.Core.Data.Class.SymIEEEFP (SymIEEEFPTraits)+import Grisette.Internal.SymPrim.FP (FP, FPRoundingMode, NotRepresentableFPError, ValidFP)+import Grisette.Internal.SymPrim.SymFP (SymFP, SymFPRoundingMode)+import Grisette.Unified.Internal.BaseConstraint+ ( BasicGrisetteType,+ ConSymConversion,+ )+import Grisette.Unified.Internal.Class.UnifiedFromIntegral (UnifiedFromIntegral)+import Grisette.Unified.Internal.Class.UnifiedSafeFromFP (UnifiedSafeFromFP)+import Grisette.Unified.Internal.Class.UnifiedSimpleMergeable (UnifiedBranching)+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Con, Sym))+import Grisette.Unified.Internal.UnifiedAlgReal (GetAlgReal)+import Grisette.Unified.Internal.UnifiedConstraint (UnifiedPrimitive)+import Grisette.Unified.Internal.UnifiedInteger (GetInteger)++-- | Implementation for 'UnifiedFP'.+class+ ( BasicGrisetteType fp,+ ConSymConversion (FP eb sb) (SymFP eb sb) fp,+ UnifiedPrimitive mode fp,+ Floating fp,+ SymIEEEFPTraits fp,+ IEEEFPConstants fp,+ IEEEFPOp fp,+ IEEEFPRoundingOp fp rd,+ UnifiedFromIntegral mode (GetInteger mode) fp,+ IEEEFPToAlgReal (GetAlgReal mode) fp rd,+ IEEEFPConvertible (GetInteger mode) fp rd,+ fpn ~ GetFP mode,+ fp ~ fpn eb sb,+ rd ~ GetFPRoundingMode mode+ ) =>+ UnifiedFPImpl (mode :: EvalModeTag) fpn eb sb fp rd+ | fpn eb sb -> fp rd,+ fp -> fpn eb sb rd,+ rd -> fpn,+ rd eb sb -> fp+ where+ -- | Get a unified floating point type. Resolves to 'FP' in 'Con' mode, and+ -- 'SymFP' in 'Sym' mode.+ type GetFP mode = (f :: Nat -> Nat -> Type) | f -> mode++ -- | Get a unified floating point rounding mode type. Resolves to+ -- 'FPRoundingMode' in 'Con' mode, and 'SymFPRoundingMode' in 'Sym' mode.+ type GetFPRoundingMode mode = r | r -> mode++instance+ (ValidFP eb sb) =>+ UnifiedFPImpl 'Con FP eb sb (FP eb sb) FPRoundingMode+ where+ type GetFP 'Con = FP+ type GetFPRoundingMode 'Con = FPRoundingMode++instance+ (ValidFP eb sb) =>+ UnifiedFPImpl 'Sym SymFP eb sb (SymFP eb sb) SymFPRoundingMode+ where+ type GetFP 'Sym = SymFP+ type GetFPRoundingMode 'Sym = SymFPRoundingMode++-- | Evaluation mode with unified 'FP' type.+class+ ( UnifiedFPImpl+ mode+ (GetFP mode)+ eb+ sb+ (GetFP mode eb sb)+ (GetFPRoundingMode mode)+ ) =>+ UnifiedFP mode eb sb++instance+ ( UnifiedFPImpl+ mode+ (GetFP mode)+ eb+ sb+ (GetFP mode eb sb)+ (GetFPRoundingMode mode)+ ) =>+ UnifiedFP mode eb sb++class+ (UnifiedFPImpl mode fpn eb sb fp rd) =>+ SafeUnifiedFPImpl mode fpn eb sb fp rd (m :: Type -> Type)++instance+ (UnifiedFPImpl mode fpn eb sb fp rd) =>+ SafeUnifiedFPImpl mode fpn eb sb fp rd m++-- | This class is needed as constraint in user code prior to GHC 9.2.1.+-- See the notes in 'Grisette.Unified.Internal.EvalMode.EvalMode'.+class+ ( SafeUnifiedFPImpl+ mode+ (GetFP mode)+ eb+ sb+ (GetFP mode eb sb)+ (GetFPRoundingMode mode)+ m,+ UnifiedSafeFromFP+ mode+ NotRepresentableFPError+ (GetInteger mode)+ (GetFP mode eb sb)+ (GetFPRoundingMode mode)+ m+ ) =>+ SafeUnifiedFP mode eb sb m++instance+ ( SafeUnifiedFPImpl+ mode+ (GetFP mode)+ eb+ sb+ (GetFP mode eb sb)+ (GetFPRoundingMode mode)+ m,+ UnifiedSafeFromFP+ mode+ NotRepresentableFPError+ (GetInteger mode)+ (GetFP mode eb sb)+ (GetFPRoundingMode mode)+ m+ ) =>+ SafeUnifiedFP mode eb sb m++-- | Evaluation mode with unified floating point type.+class+ ( forall eb sb. (ValidFP eb sb) => UnifiedFP mode eb sb,+ forall eb sb m.+ ( ValidFP eb sb,+ UnifiedBranching mode m,+ MonadError NotRepresentableFPError m+ ) =>+ SafeUnifiedFP mode eb sb m+ ) =>+ AllUnifiedFP mode++instance+ ( forall eb sb. (ValidFP eb sb) => UnifiedFP mode eb sb,+ forall eb sb m.+ ( ValidFP eb sb,+ UnifiedBranching mode m,+ MonadError NotRepresentableFPError m+ ) =>+ SafeUnifiedFP mode eb sb m+ ) =>+ AllUnifiedFP mode
src/Grisette/Unified/Internal/UnifiedInteger.hs view
@@ -31,7 +31,8 @@ ( BasicGrisetteType, ConSymConversion, )-import Grisette.Unified.Internal.Class.UnifiedSafeDivision (UnifiedSafeDivision)+import Grisette.Unified.Internal.Class.UnifiedFromIntegral (UnifiedFromIntegral)+import Grisette.Unified.Internal.Class.UnifiedSafeDiv (UnifiedSafeDiv) import Grisette.Unified.Internal.Class.UnifiedSafeLinearArith ( UnifiedSafeLinearArith, )@@ -46,10 +47,11 @@ UnifiedPrimitive mode (GetInteger mode), forall m. (UnifiedBranching mode m, MonadError ArithException m) =>- UnifiedSafeDivision mode ArithException i m,+ UnifiedSafeDiv mode ArithException i m, forall m. (UnifiedBranching mode m, MonadError ArithException m) => UnifiedSafeLinearArith mode ArithException i m,+ UnifiedFromIntegral mode i i, i ~ GetInteger mode ) => UnifiedIntegerImpl (mode :: EvalModeTag) i
test/Grisette/Backend/CEGISTests.hs view
@@ -53,8 +53,8 @@ import Test.HUnit (Assertion, assertFailure, (@=?), (@?=)) testCegis ::- (HasCallStack, ExtractSym a, EvalSym a, Show a, SymEq a) =>- GrisetteSMTConfig i ->+ (HasCallStack, ExtractSym a, EvalSym a, SymEq a) =>+ GrisetteSMTConfig -> Bool -> a -> (a -> [SymBool]) ->
test/Grisette/Backend/LoweringTests.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GADTs #-}@@ -10,7 +11,7 @@ module Grisette.Backend.LoweringTests (loweringTests) where -import Control.Monad.Trans (MonadTrans (lift))+import Control.Monad.Trans (MonadIO (liftIO), MonadTrans (lift)) import Data.Bits ( Bits (complement, xor, (.&.), (.|.)), )@@ -23,20 +24,25 @@ import GHC.Stack (HasCallStack) import Grisette ( EvalSym (evalSym),+ FP,+ FPRoundingMode, Function ((#)), IntN, LogicalOp ((.&&)), Solvable (con), SymEq ((.==)), SymInteger,+ SymRep (SymType), WordN, solve, type (-~>), type (=~>), )+import Grisette.Internal.Backend.QuantifiedStack+ ( emptyQuantifiedStack,+ ) import Grisette.Internal.Backend.Solving ( GrisetteSMTConfig (sbvConfig),- approximate, lowerSinglePrim, lowerSinglePrimCached, z3,@@ -44,6 +50,7 @@ import Grisette.Internal.Backend.SymBiMap ( SymBiMap (biMapToSBV), )+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.FP (FP32) import Grisette.Internal.SymPrim.Prim.SomeTerm ( SomeTerm (SomeTerm),@@ -63,13 +70,27 @@ FPIsSubnormal, FPIsZero ),+ FloatingUnaryOp+ ( FloatingAcos,+ FloatingAsin,+ FloatingAtan,+ FloatingCos,+ FloatingCosh,+ FloatingSin,+ FloatingSinh,+ FloatingTan,+ FloatingTanh+ ), SBVRep (SBVType), SupportedPrim, Term,+ TypedConstantSymbol, absNumTerm, addNumTerm, andBitsTerm, andTerm,+ bitCastOrTerm,+ bitCastTerm, bvconcatTerm, bvselectTerm, bvsignExtendTerm,@@ -78,6 +99,10 @@ conTerm, divIntegralTerm, eqTerm,+ existsTerm,+ fdivTerm,+ floatingUnaryTerm,+ forallTerm, fpTraitTerm, iteTerm, leOrdTerm,@@ -92,6 +117,7 @@ pevalFPTraitTerm, pevalNotTerm, quotIntegralTerm,+ recipTerm, remIntegralTerm, rotateLeftTerm, rotateRightTerm,@@ -99,50 +125,76 @@ shiftRightTerm, signumNumTerm, ssymTerm,- toSignedTerm,- toUnsignedTerm, xorBitsTerm, ) import Test.Framework (Test, testGroup) import Test.Framework.Providers.HUnit (testCase)+import Test.Framework.Providers.QuickCheck2 (testProperty) import Test.HUnit (Assertion, assertFailure, (@?=))+import Test.QuickCheck (Arbitrary, ioProperty)+import Type.Reflection (typeRep) testUnaryOpLowering ::- forall a b as n.+ forall a b as. ( HasCallStack, SupportedPrim a,- SBV.EqSymbolic (SBVType n b),- Typeable (SBVType n a),+ SBV.EqSymbolic (SBVType b),+ Typeable (SBVType a), SBV.SymVal as,- SBVType n a ~ SBV.SBV as,+ SBVType a ~ SBV.SBV as, Show as ) =>- GrisetteSMTConfig n ->+ GrisetteSMTConfig -> (Term a -> Term b) -> String ->- (SBVType n a -> SBVType n b) ->+ (SBVType a -> SBVType b) -> Assertion-testUnaryOpLowering config f name sbvfun = do+testUnaryOpLowering = testUnaryOpLowering' Nothing++testUnaryOpLowering' ::+ forall a b as.+ ( HasCallStack,+ SupportedPrim a,+ SBV.EqSymbolic (SBVType b),+ Typeable (SBVType a),+ SBV.SymVal as,+ SBVType a ~ SBV.SBV as,+ Show as+ ) =>+ (Maybe (SBVType a -> SBVType Bool)) ->+ GrisetteSMTConfig ->+ (Term a -> Term b) ->+ String ->+ (SBVType a -> SBVType b) ->+ Assertion+testUnaryOpLowering' precond config f name sbvfun = do let a :: Term a = ssymTerm "a" let fa :: Term b = f a SBV.runSMTWith (sbvConfig config) $ do- (m, lt) <- lowerSinglePrim config fa- let sbva :: Maybe (SBVType n a) = M.lookup (SomeTerm a) (biMapToSBV m) >>= fromDynamic+ (m, lt, _) <- lowerSinglePrim config fa+ let sbva :: Maybe (SBVType a) =+ M.lookup (SomeTerm a) (biMapToSBV m)+ >>= \f -> fromDynamic (f emptyQuantifiedStack) case sbva of Nothing -> lift $ assertFailure "Failed to extract the term" Just sbvav -> SBV.query $ do- SBV.constrain $ lt SBV..== sbvfun sbvav+ SBV.constrain $ lt emptyQuantifiedStack SBV..== sbvfun sbvav satres <- SBV.checkSat case satres of SBV.Sat -> return () _ -> lift $ assertFailure $ "Lowering for " ++ name ++ " generated unsolvable formula" SBV.runSMTWith (sbvConfig config) $ do- (m, lt) <- lowerSinglePrim config fa- let sbvv :: Maybe (SBVType n a) = M.lookup (SomeTerm a) (biMapToSBV m) >>= fromDynamic+ (m, lt, _) <- lowerSinglePrim config fa+ let sbvv :: Maybe (SBVType a) =+ M.lookup (SomeTerm a) (biMapToSBV m)+ >>= \f -> fromDynamic (f emptyQuantifiedStack) case sbvv of Nothing -> lift $ assertFailure "Failed to extract the term" Just sbvvv -> SBV.query $ do- SBV.constrain $ lt SBV../= sbvfun sbvvv+ case precond of+ Just p -> SBV.constrain $ p sbvvv+ Nothing -> return ()+ SBV.constrain $ lt emptyQuantifiedStack SBV../= sbvfun sbvvv r <- SBV.checkSat case r of SBV.Sat -> do@@ -152,48 +204,56 @@ _ -> lift $ assertFailure $ "Lowering for " ++ name ++ " generated unknown formula" testBinaryOpLowering ::- forall a b c as bs n.+ forall a b c as bs. ( HasCallStack, SupportedPrim a, SupportedPrim b,- SBV.EqSymbolic (SBVType n c),- Typeable (SBVType n a),- Typeable (SBVType n b),+ SBV.EqSymbolic (SBVType c),+ Typeable (SBVType a),+ Typeable (SBVType b), SBV.SymVal as, SBV.SymVal bs, Show as, Show bs,- SBVType n a ~ SBV.SBV as,- SBVType n b ~ SBV.SBV bs+ SBVType a ~ SBV.SBV as,+ SBVType b ~ SBV.SBV bs ) =>- GrisetteSMTConfig n ->+ GrisetteSMTConfig -> (Term a -> Term b -> Term c) -> String ->- (SBVType n a -> SBVType n b -> SBVType n c) ->+ (SBVType a -> SBVType b -> SBVType c) -> Assertion testBinaryOpLowering config f name sbvfun = do let a :: Term a = ssymTerm "a" let b :: Term b = ssymTerm "b" let fab :: Term c = f a b SBV.runSMTWith (sbvConfig config) $ do- (m, lt) <- lowerSinglePrim config fab- let sbva :: Maybe (SBVType n a) = M.lookup (SomeTerm a) (biMapToSBV m) >>= fromDynamic- let sbvb :: Maybe (SBVType n b) = M.lookup (SomeTerm b) (biMapToSBV m) >>= fromDynamic+ (m, lt, _) <- lowerSinglePrim config fab+ let sbva :: Maybe (SBVType a) =+ M.lookup (SomeTerm a) (biMapToSBV m)+ >>= \f -> fromDynamic (f emptyQuantifiedStack)+ let sbvb :: Maybe (SBVType b) =+ M.lookup (SomeTerm b) (biMapToSBV m)+ >>= \f -> fromDynamic (f emptyQuantifiedStack) case (sbva, sbvb) of (Just sbvav, Just sbvbv) -> SBV.query $ do- SBV.constrain $ lt SBV..== sbvfun sbvav sbvbv+ SBV.constrain $ lt emptyQuantifiedStack SBV..== sbvfun sbvav sbvbv satres <- SBV.checkSat case satres of SBV.Sat -> return () _ -> lift $ assertFailure $ "Lowering for " ++ name ++ " generated unsolvable formula" _ -> lift $ assertFailure "Failed to extract the term" SBV.runSMTWith (sbvConfig config) $ do- (m, lt) <- lowerSinglePrim config fab- let sbva :: Maybe (SBVType n a) = M.lookup (SomeTerm a) (biMapToSBV m) >>= fromDynamic- let sbvb :: Maybe (SBVType n b) = M.lookup (SomeTerm b) (biMapToSBV m) >>= fromDynamic+ (m, lt, _) <- lowerSinglePrim config fab+ let sbva :: Maybe (SBVType a) =+ M.lookup (SomeTerm a) (biMapToSBV m)+ >>= \f -> fromDynamic (f emptyQuantifiedStack)+ let sbvb :: Maybe (SBVType b) =+ M.lookup (SomeTerm b) (biMapToSBV m)+ >>= \f -> fromDynamic (f emptyQuantifiedStack) case (sbva, sbvb) of (Just sbvav, Just sbvbv) -> SBV.query $ do- SBV.constrain $ lt SBV../= sbvfun sbvav sbvbv+ SBV.constrain $ lt emptyQuantifiedStack SBV../= sbvfun sbvav sbvbv r <- SBV.checkSat case r of SBV.Sat -> do@@ -205,30 +265,30 @@ _ -> lift $ assertFailure "Failed to extract the term" testTernaryOpLowering ::- forall a b c d as bs cs n.+ forall a b c d as bs cs. ( HasCallStack, SupportedPrim a, SupportedPrim b, SupportedPrim c,- SBV.EqSymbolic (SBVType n d),- Typeable (SBVType n a),- Typeable (SBVType n b),- Typeable (SBVType n c),+ SBV.EqSymbolic (SBVType d),+ Typeable (SBVType a),+ Typeable (SBVType b),+ Typeable (SBVType c), SBV.SymVal as, SBV.SymVal bs, SBV.SymVal cs, Show as, Show bs, Show cs,- SBVType n a ~ SBV.SBV as,- SBVType n b ~ SBV.SBV bs,- SBVType n c ~ SBV.SBV cs+ SBVType a ~ SBV.SBV as,+ SBVType b ~ SBV.SBV bs,+ SBVType c ~ SBV.SBV cs ) =>- GrisetteSMTConfig n ->+ GrisetteSMTConfig -> (Term a -> Term b -> Term c -> Term Bool) -> (Term a -> Term b -> Term c -> Term d) -> T.Text ->- (SBVType n a -> SBVType n b -> SBVType n c -> SBVType n d) ->+ (SBVType a -> SBVType b -> SBVType c -> SBVType d) -> Assertion testTernaryOpLowering config precond f name sbvfun = do let a :: Term a = ssymTerm "a"@@ -236,27 +296,41 @@ let c :: Term c = ssymTerm "c" let fabc :: Term d = f a b c SBV.runSMTWith (sbvConfig config) $ do- (m, lt) <- lowerSinglePrim config fabc- let sbva :: Maybe (SBVType n a) = M.lookup (SomeTerm a) (biMapToSBV m) >>= fromDynamic- let sbvb :: Maybe (SBVType n b) = M.lookup (SomeTerm b) (biMapToSBV m) >>= fromDynamic- let sbvc :: Maybe (SBVType n c) = M.lookup (SomeTerm c) (biMapToSBV m) >>= fromDynamic+ (m, lt, _) <- lowerSinglePrim config fabc+ let sbva :: Maybe (SBVType a) =+ M.lookup (SomeTerm a) (biMapToSBV m)+ >>= \f -> fromDynamic (f emptyQuantifiedStack)+ let sbvb :: Maybe (SBVType b) =+ M.lookup (SomeTerm b) (biMapToSBV m)+ >>= \f -> fromDynamic (f emptyQuantifiedStack)+ let sbvc :: Maybe (SBVType c) =+ M.lookup (SomeTerm c) (biMapToSBV m)+ >>= \f -> fromDynamic (f emptyQuantifiedStack) case (sbva, sbvb, sbvc) of (Just sbvav, Just sbvbv, Just sbvcv) -> SBV.query $ do- SBV.constrain $ lt SBV..== sbvfun sbvav sbvbv sbvcv+ SBV.constrain $ lt emptyQuantifiedStack SBV..== sbvfun sbvav sbvbv sbvcv satres <- SBV.checkSat case satres of SBV.Sat -> return () _ -> lift $ assertFailure $ T.unpack $ "Lowering for " <> name <> " generated unsolvable formula" _ -> lift $ assertFailure "Failed to extract the term" SBV.runSMTWith (sbvConfig config) $ do- (m, lt) <- lowerSinglePrim config fabc- (m2, p) <- lowerSinglePrimCached config (precond a b c) m- let sbva :: Maybe (SBVType n a) = M.lookup (SomeTerm a) (biMapToSBV m2) >>= fromDynamic- let sbvb :: Maybe (SBVType n b) = M.lookup (SomeTerm b) (biMapToSBV m2) >>= fromDynamic- let sbvc :: Maybe (SBVType n c) = M.lookup (SomeTerm c) (biMapToSBV m2) >>= fromDynamic+ (m, lt, _) <- lowerSinglePrim config fabc+ (m2, p, _) <- lowerSinglePrimCached config (precond a b c) m+ let sbva :: Maybe (SBVType a) =+ M.lookup (SomeTerm a) (biMapToSBV m2)+ >>= \f -> fromDynamic (f emptyQuantifiedStack)+ let sbvb :: Maybe (SBVType b) =+ M.lookup (SomeTerm b) (biMapToSBV m2)+ >>= \f -> fromDynamic (f emptyQuantifiedStack)+ let sbvc :: Maybe (SBVType c) =+ M.lookup (SomeTerm c) (biMapToSBV m2)+ >>= \f -> fromDynamic (f emptyQuantifiedStack) case (sbva, sbvb, sbvc) of (Just sbvav, Just sbvbv, Just sbvcv) -> SBV.query $ do- SBV.constrain $ (lt SBV../= sbvfun sbvav sbvbv sbvcv) SBV..&& p+ SBV.constrain $+ (lt emptyQuantifiedStack SBV../= sbvfun sbvav sbvbv sbvcv)+ SBV..&& p emptyQuantifiedStack r <- SBV.checkSat case r of SBV.Sat -> do@@ -271,15 +345,47 @@ _ -> lift $ assertFailure $ T.unpack $ "Lowering for " <> name <> " generated unknown formula" _ -> lift $ assertFailure "Failed to extract the term" +modelParseTestBody ::+ forall t.+ ( Solvable t (SymType t),+ SymEq (SymType t),+ EvalSym (SymType t),+ Eq (SymType t),+ Show (SymType t)+ ) =>+ t ->+ Assertion+modelParseTestBody v = do+ let a = "a" :: SymType t+ r <- solve z3 $ a .== con v+ case r of+ Left err -> assertFailure $ "Failed to solve: " ++ show err+ Right m -> evalSym False m a @?= con v++testModelParse ::+ forall t.+ ( Show t,+ Arbitrary t,+ Solvable t (SymType t),+ SymEq (SymType t),+ EvalSym (SymType t),+ Eq (SymType t),+ Show (SymType t),+ Typeable t+ ) =>+ Test+testModelParse = testProperty ("Model parse(" ++ show (typeRep @t) ++ ")") $+ \(v :: t) -> ioProperty $ modelParseTestBody v+ loweringTests :: Test loweringTests =- let unboundedConfig = z3- boundedConfig = approximate (Proxy @5) z3+ let unboundedConfig = z3 {sbvConfig = SBV.z3 {SBV.solverSetOptions = [SBV.SetLogic SBV.Logic_ALL]}} in testGroup "Lowering" [ testGroup "Bool Lowering"- [ testCase "Not" $ do+ [ testModelParse @Bool,+ testCase "Not" $ do testUnaryOpLowering @Bool @Bool unboundedConfig notTerm "not" SBV.sNot, testCase "And" $ do testBinaryOpLowering @Bool @Bool @Bool unboundedConfig andTerm "and" (SBV..&&)@@ -319,18 +425,13 @@ ], testGroup "Integer Lowering"- [ testCase "Add" $ do+ [ testModelParse @Integer,+ testCase "Add" $ do testBinaryOpLowering @Integer @Integer @Integer unboundedConfig addNumTerm "(+)" (+) testBinaryOpLowering @Integer @Integer @Integer unboundedConfig addNumTerm "(+)"- (\x y -> (x + 1) * (y + 1) - x * y - 1)- testBinaryOpLowering @Integer @Integer @Integer boundedConfig addNumTerm "(+)" (+)- testBinaryOpLowering @Integer @Integer @Integer- boundedConfig- addNumTerm- "(+)" (\x y -> (x + 1) * (y + 1) - x * y - 1), testCase "Uminus" $ do testUnaryOpLowering @Integer @Integer unboundedConfig negNumTerm "negate" negate@@ -338,31 +439,17 @@ unboundedConfig negNumTerm "negate"- (\x -> (x + 1) * (x + 1) - 3 * x - x * x - 1)- testUnaryOpLowering @Integer @Integer boundedConfig negNumTerm "negate" negate- testUnaryOpLowering @Integer @Integer- boundedConfig- negNumTerm- "negate" (\x -> (x + 1) * (x + 1) - 3 * x - x * x - 1), testCase "Abs" $ do- testUnaryOpLowering @Integer @Integer unboundedConfig absNumTerm "abs" abs- testUnaryOpLowering @Integer @Integer boundedConfig absNumTerm "abs" abs,+ testUnaryOpLowering @Integer @Integer unboundedConfig absNumTerm "abs" abs, testCase "Signum" $ do- testUnaryOpLowering @Integer @Integer unboundedConfig signumNumTerm "signum" signum- testUnaryOpLowering @Integer @Integer boundedConfig signumNumTerm "signum" signum,+ testUnaryOpLowering @Integer @Integer unboundedConfig signumNumTerm "signum" signum, testCase "Times" $ do testBinaryOpLowering @Integer @Integer @Integer unboundedConfig mulNumTerm "(*)" (*) testBinaryOpLowering @Integer @Integer @Integer unboundedConfig mulNumTerm "(*)"- (\x y -> (x + 1) * (y + 1) - x - y - 1)- testBinaryOpLowering @Integer @Integer @Integer boundedConfig mulNumTerm "(*)" (*)- testBinaryOpLowering @Integer @Integer @Integer- boundedConfig- mulNumTerm- "(*)" (\x y -> (x + 1) * (y + 1) - x - y - 1), testCase "Lt" $ do testBinaryOpLowering @Integer @Integer @Bool unboundedConfig ltOrdTerm "(<)" (SBV..<)@@ -370,12 +457,6 @@ unboundedConfig ltOrdTerm "(<)"- (\x y -> x * 2 - x SBV..< y * 2 - y)- testBinaryOpLowering @Integer @Integer @Bool boundedConfig ltOrdTerm "(<)" (SBV..<)- testBinaryOpLowering @Integer @Integer @Bool- boundedConfig- ltOrdTerm- "(<=)" (\x y -> x * 2 - x SBV..< y * 2 - y), testCase "Le" $ do testBinaryOpLowering @Integer @Integer @Bool unboundedConfig leOrdTerm "(<=)" (SBV..<=)@@ -383,29 +464,20 @@ unboundedConfig leOrdTerm "(<=)"- (\x y -> x * 2 - x SBV..<= y * 2 - y)- testBinaryOpLowering @Integer @Integer @Bool boundedConfig leOrdTerm "(<=)" (SBV..<=)- testBinaryOpLowering @Integer @Integer @Bool- boundedConfig- leOrdTerm- "(<=)" (\x y -> x * 2 - x SBV..<= y * 2 - y), testCase "Div" $ do- testBinaryOpLowering @Integer @Integer @Integer unboundedConfig divIntegralTerm "div" SBV.sDiv- testBinaryOpLowering @Integer @Integer @Integer boundedConfig divIntegralTerm "div" SBV.sDiv,+ testBinaryOpLowering @Integer @Integer @Integer unboundedConfig 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,+ testBinaryOpLowering @Integer @Integer @Integer unboundedConfig 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,+ testBinaryOpLowering @Integer @Integer @Integer unboundedConfig 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"- [ testCase "Add" $ do+ [ testModelParse @(IntN 4),+ testCase "Add" $ do testBinaryOpLowering @(IntN 5) @(IntN 5) unboundedConfig addNumTerm "(+)" (+) testBinaryOpLowering @(IntN 5) @(IntN 5) unboundedConfig@@ -582,24 +654,22 @@ (SBV.sFromIntegral b :: SBV.SWord 5) ), testCase "Div - bounded" $ do- testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig divIntegralTerm "div" SBV.sDiv- testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) boundedConfig divIntegralTerm "div" SBV.sDiv,+ testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig divIntegralTerm "div" SBV.sDiv, testCase "Mod - bounded" $ do- testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig modIntegralTerm "mod" SBV.sMod- testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) boundedConfig modIntegralTerm "mod" SBV.sMod,+ testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig modIntegralTerm "mod" SBV.sMod, testCase "Quot - bounded" $ do- testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig quotIntegralTerm "quot" SBV.sQuot- testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) boundedConfig quotIntegralTerm "quot" SBV.sQuot,+ testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig quotIntegralTerm "quot" SBV.sQuot, testCase "Rem - bounded" $ do- testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig remIntegralTerm "rem" SBV.sRem- testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) boundedConfig remIntegralTerm "rem" SBV.sRem,- testCase "ToUnsigned" $ do- testUnaryOpLowering @(IntN 5) @(WordN 5) unboundedConfig toUnsignedTerm "toUnsigned" SBV.sFromIntegral- testUnaryOpLowering @(IntN 5) @(WordN 5) boundedConfig toUnsignedTerm "toUnsigned" SBV.sFromIntegral+ testBinaryOpLowering @(IntN 5) @(IntN 5) @(IntN 5) unboundedConfig remIntegralTerm "rem" SBV.sRem,+ testCase "BitCast" $ do+ testUnaryOpLowering @(IntN 5) @(WordN 5) unboundedConfig bitCastTerm "bitCast" SBV.sFromIntegral+ testUnaryOpLowering @(IntN 1) @Bool unboundedConfig bitCastTerm "bitCast" (`SBV.sTestBit` 0)+ testUnaryOpLowering @Bool @(IntN 1) unboundedConfig bitCastTerm "bitCast" (\x -> SBV.ite x 1 0) ], testGroup "WordN"- [ testCase "Add" $ do+ [ testModelParse @(WordN 4),+ testCase "Add" $ do testBinaryOpLowering @(WordN 5) @(WordN 5) unboundedConfig addNumTerm "(+)" (+) testBinaryOpLowering @(WordN 5) @(WordN 5) unboundedConfig@@ -758,24 +828,23 @@ testCase "RotateRight" $ do testBinaryOpLowering @(WordN 5) unboundedConfig rotateRightTerm "rotateRight" SBV.sRotateRight, 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,+ testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) unboundedConfig 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,+ testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) unboundedConfig 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,+ testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) unboundedConfig 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,- testCase "ToSigned" $ do- testUnaryOpLowering @(WordN 5) @(IntN 5) unboundedConfig toSignedTerm "toSigned" SBV.sFromIntegral- testUnaryOpLowering @(WordN 5) @(IntN 5) boundedConfig toSignedTerm "toSigned" SBV.sFromIntegral+ testBinaryOpLowering @(WordN 5) @(WordN 5) @(WordN 5) unboundedConfig remIntegralTerm "rem" SBV.sRem,+ testCase "BitCast" $ do+ testUnaryOpLowering @(WordN 5) @(IntN 5) unboundedConfig bitCastTerm "bitCast" SBV.sFromIntegral+ testUnaryOpLowering @(WordN 1) @Bool unboundedConfig bitCastTerm "bitCast" (`SBV.sTestBit` 0)+ testUnaryOpLowering @Bool @(WordN 1) unboundedConfig bitCastTerm "bitCast" (\x -> SBV.ite x 1 0) ], testGroup "FP"- [ testCase "Eqv" $+ [ testCase "Model parse (float)" $ modelParseTestBody (10.012 :: FP32),+ testModelParse @FPRoundingMode,+ testCase "Eqv" $ testBinaryOpLowering @FP32 @FP32 @Bool unboundedConfig eqTerm "eqv" (SBV..==), testCase "ITE" $ do let precond _ l r =@@ -818,8 +887,152 @@ unboundedConfig (fpTraitTerm trait) "isNaN"- op+ op,+ testCase "BitCastOr" $ do+ testBinaryOpLowering @(WordN 8) @(FP 3 5)+ unboundedConfig+ bitCastOrTerm+ "bitCastOr"+ ( \d v ->+ SBV.ite+ (SBV.fpIsNaN v)+ d+ (SBV.sFloatingPointAsSWord v)+ )+ testBinaryOpLowering @(IntN 8) @(FP 3 5)+ unboundedConfig+ bitCastOrTerm+ "bitCastOr"+ ( \d v ->+ SBV.ite+ (SBV.fpIsNaN v)+ d+ (SBV.sFromIntegral $ SBV.sFloatingPointAsSWord v)+ ),+ testCase "BitCast" $ do+ testUnaryOpLowering' @(WordN 8) @(FP 3 5)+ ( Just $ \x ->+ SBV.sNot $+ SBV.fpIsNaN+ ( SBV.sWordAsSFloatingPoint x ::+ SBV.SFloatingPoint 3 5+ )+ )+ unboundedConfig+ bitCastTerm+ "bitCast"+ SBV.sWordAsSFloatingPoint+ testUnaryOpLowering' @(IntN 8) @(FP 3 5)+ ( Just $ \x ->+ SBV.sNot $+ SBV.fpIsNaN+ ( SBV.sWordAsSFloatingPoint . SBV.sFromIntegral $ x ::+ SBV.SFloatingPoint 3 5+ )+ )+ unboundedConfig+ bitCastTerm+ "bitCast"+ (SBV.sWordAsSFloatingPoint . SBV.sFromIntegral) ],+ testGroup+ "AlgReal"+ [ testModelParse @AlgReal,+ testCase "Eqv" $+ testBinaryOpLowering @AlgReal @AlgReal @Bool+ unboundedConfig+ eqTerm+ "eqv"+ (SBV..==),+ testCase "ITE" $ do+ let truePrecond _ _ _ = conTerm True+ testTernaryOpLowering @Bool @AlgReal @AlgReal @AlgReal+ unboundedConfig+ truePrecond+ iteTerm+ "ite"+ SBV.ite,+ testCase "Add" $ do+ testBinaryOpLowering @AlgReal @AlgReal @AlgReal unboundedConfig addNumTerm "(+)" (+)+ testBinaryOpLowering @AlgReal @AlgReal @AlgReal+ unboundedConfig+ addNumTerm+ "(+)"+ (\x y -> (x + 1) * (y + 1) - x * y - 1),+ testCase "Uminus" $ do+ testUnaryOpLowering @AlgReal @AlgReal unboundedConfig negNumTerm "negate" negate+ testUnaryOpLowering @AlgReal @AlgReal+ unboundedConfig+ negNumTerm+ "negate"+ (\x -> (x + 1) * (x + 1) - 3 * x - x * x - 1),+ testCase "Abs" $+ testUnaryOpLowering @AlgReal @AlgReal unboundedConfig absNumTerm "abs" abs,+ testCase "Signum" $+ testUnaryOpLowering @AlgReal @AlgReal unboundedConfig signumNumTerm "signum" signum,+ testCase "Times" $ do+ testBinaryOpLowering @AlgReal @AlgReal @AlgReal unboundedConfig mulNumTerm "(*)" (*)+ testBinaryOpLowering @AlgReal @AlgReal @AlgReal+ unboundedConfig+ mulNumTerm+ "(*)"+ (\x y -> (x + 1) * (y + 1) - x - y - 1),+ testCase "Lt" $ do+ testBinaryOpLowering @Integer @Integer @Bool unboundedConfig ltOrdTerm "(<)" (SBV..<)+ testBinaryOpLowering @Integer @Integer @Bool+ unboundedConfig+ ltOrdTerm+ "(<)"+ (\x y -> x * 2 - x SBV..< y * 2 - y),+ testCase "Le" $ do+ testBinaryOpLowering @Integer @Integer @Bool unboundedConfig leOrdTerm "(<=)" (SBV..<=)+ testBinaryOpLowering @Integer @Integer @Bool+ unboundedConfig+ leOrdTerm+ "(<=)"+ (\x y -> x * 2 - x SBV..<= y * 2 - y),+ testCase "fdiv" $ do+ testBinaryOpLowering @AlgReal @AlgReal @AlgReal+ unboundedConfig+ fdivTerm+ "fdiv"+ (/),+ testCase "recip" $ do+ testUnaryOpLowering @AlgReal @AlgReal+ unboundedConfig+ recipTerm+ "recip"+ recip,+ testGroup "Floating unary" $ do+ (name, f, op) <-+ -- Those unsupported by z3 are commented out+ [ -- ("exp", exp, FloatingExp),+ -- ("log", log, FloatingLog),+ -- ("sqrt", sqrt, FloatingSqrt),+ ("sin", sin, FloatingSin),+ ("cos", cos, FloatingCos),+ ("tan", tan, FloatingTan),+ ("asin", asin, FloatingAsin),+ ("acos", acos, FloatingAcos),+ ("atan", atan, FloatingAtan),+ ("sinh", sinh, FloatingSinh),+ ("cosh", cosh, FloatingCosh),+ ("tanh", tanh, FloatingTanh)+ ]+ return $+ testCase name $+ testUnaryOpLowering @AlgReal @AlgReal+ unboundedConfig+ (floatingUnaryTerm op)+ name+ f {-,+ testCase "**" $ do+ testBinaryOpLowering @AlgReal @AlgReal @AlgReal+ unboundedConfig+ powerTerm+ "(**)"+ (**)-}+ ], testCase "TabularFun" $ do let f = "f" :: SymInteger =~> SymInteger =~> SymInteger let a = "a" :: SymInteger@@ -828,24 +1041,121 @@ let d = "d" :: SymInteger Right m <- solve unboundedConfig $- (f # a # b .== a + b .&& a .== 10 .&& b .== 20)- .&& (f # a # c .== a + c .&& a .== 10 .&& c .== 30)- .&& (f # a # d .== a + d .&& a .== 10 .&& d .== 40)+ (f # a # b .== a + b)+ .&& (f # a # c .== a + c)+ .&& (f # a # d .== a + d)+ .&& (f # b # d .== b + d)+ .&& (a .== 10 .&& b .== 20 .&& c .== 30 .&& d .== 40) evalSym False m (f # a # b .== a + b) @?= con True evalSym False m (f # a # c .== a + c) @?= con True- evalSym False m (f # a # d .== a + d) @?= con True,+ evalSym False m (f # a # d .== a + d) @?= con True+ evalSym False m (f # b # d .== b + d) @?= con True, testCase "GeneralFun" $ do let f = "f" :: SymInteger -~> SymInteger -~> SymInteger let a = "a" :: SymInteger let b = "b" :: SymInteger let c = "c" :: SymInteger let d = "d" :: SymInteger- Right m <-+ r <- solve unboundedConfig $- (f # a # b .== a + b .&& a .== 10 .&& b .== 20)- .&& (f # a # c .== a + c .&& a .== 10 .&& c .== 30)- .&& (f # a # d .== a + d .&& a .== 10 .&& d .== 40)- evalSym False m (f # a # b .== a + b) @?= con True- evalSym False m (f # a # c .== a + c) @?= con True- evalSym False m (f # a # d .== a + d) @?= con True+ (f # a # b .== a + b)+ .&& (f # a # c .== a + c)+ .&& (f # a # d .== a + d)+ .&& (f # b # d .== b + d)+ .&& (a .== 10 .&& b .== 20 .&& c .== 30 .&& d .== 40)+ case r of+ Left err -> fail $ show err+ Right m -> do+ evalSym False m (f # a # b .== a + b) @?= con True+ evalSym False m (f # a # c .== a + c) @?= con True+ evalSym False m (f # a # d .== a + d) @?= con True+ evalSym False m (f # b # d .== b + d) @?= con True,+ sbvVersionCheck $+ testGroup+ "Quantifiers"+ [ testCase "Forall" $ do+ let asym :: TypedConstantSymbol Integer = "a"+ let a :: Term Integer = ssymTerm "a"+ let xsym :: TypedConstantSymbol Integer = "x"+ let x :: Term Integer = ssymTerm "x"+ let xterm =+ forallTerm+ xsym+ (eqTerm (addNumTerm a x) (addNumTerm x $ conTerm 10))+ let yterm =+ forallTerm+ asym+ (eqTerm (addNumTerm a x) (addNumTerm a $ conTerm 20))+ SBV.runSMTWith SBV.z3 $ do+ (m, v, _) <- lowerSinglePrim z3 (andTerm xterm yterm)+ let sbva =+ M.lookup (SomeTerm a) (biMapToSBV m)+ >>= \f -> fromDynamic (f emptyQuantifiedStack)+ let sbvx =+ M.lookup (SomeTerm x) (biMapToSBV m)+ >>= \f -> fromDynamic (f emptyQuantifiedStack)+ case (sbva, sbvx) of+ (Just (sbvav :: SBV.SInteger), Just (sbvxv :: SBV.SInteger)) ->+ SBV.query $ do+ SBV.constrain $ v emptyQuantifiedStack+ satres <- SBV.checkSat+ case satres of+ SBV.Sat -> do+ av <- SBV.getValue sbvav+ liftIO $ av @?= 10+ xv <- SBV.getValue sbvxv+ liftIO $ xv @?= 20+ _ -> liftIO $ assertFailure "Unsat"+ _ -> liftIO $ assertFailure "Failed to find a",+ testCase "Forall failed" $ do+ let xsym :: TypedConstantSymbol Integer = "x"+ let x :: Term Integer = ssymTerm "x"+ let xterm = forallTerm xsym (eqTerm x (conTerm 10))+ SBV.runSMTWith SBV.z3 $ do+ (_, v, _) <- lowerSinglePrim z3 xterm+ SBV.query $ do+ SBV.constrain $ v emptyQuantifiedStack+ satres <- SBV.checkSat+ case satres of+ SBV.Unsat -> return ()+ _ -> liftIO $ assertFailure "Should be unsat",+ testCase "Forall-Exists" $ do+ let asym :: TypedConstantSymbol Integer = "a"+ let a :: Term Integer = ssymTerm "a"+ let xsym :: TypedConstantSymbol Integer = "x"+ let x :: Term Integer = ssymTerm "x"+ let xterm =+ forallTerm xsym $ existsTerm asym (ltOrdTerm x a)+ SBV.runSMTWith SBV.z3 $ do+ (_, v, _) <- lowerSinglePrim z3 xterm+ SBV.query $ do+ SBV.constrain $ v emptyQuantifiedStack+ satres <- SBV.checkSat+ case satres of+ SBV.Sat -> return ()+ _ -> liftIO $ assertFailure "Unsat",+ testCase "Exists-Forall" $ do+ let asym :: TypedConstantSymbol Integer = "a"+ let a :: Term Integer = ssymTerm "a"+ let xsym :: TypedConstantSymbol Integer = "x"+ let x :: Term Integer = ssymTerm "x"+ let xterm =+ existsTerm asym $ forallTerm xsym (ltOrdTerm x a)+ SBV.runSMTWith SBV.z3 $ do+ (_, v, _) <- lowerSinglePrim z3 xterm+ SBV.query $ do+ SBV.constrain $ v emptyQuantifiedStack+ satres <- SBV.checkSat+ case satres of+ SBV.Unsat -> return ()+ _ -> liftIO $ assertFailure "should be unsat"+ ] ]++#if MIN_VERSION_sbv(10,1,0)+sbvVersionCheck :: Test -> Test+sbvVersionCheck = id+#else+sbvVersionCheck :: Test -> Test+sbvVersionCheck _ = testGroup "Quantifiers" []+#endif
test/Grisette/Backend/TermRewritingGen.hs view
@@ -22,6 +22,8 @@ FixedSizedBVWithBoolSpec (..), BoolWithLIASpec (..), LIAWithBoolSpec (..),+ BoolWithNRASpec (..),+ NRAWithBoolSpec (..), BoolOnlySpec (..), constructUnarySpec, constructUnarySpec',@@ -42,6 +44,7 @@ leOrdSpec, iteSpec, eqvSpec,+ distinctSpec, notSpec, andSpec, orSpec,@@ -53,14 +56,19 @@ fpTraitSpec, fdivSpec, recipSpec,- sqrtSpec,+ floatingUnarySpec,+ powerSpec, fpUnaryOpSpec, fpBinaryOpSpec, fpRoundingUnaryOpSpec, fpRoundingBinarySpec, fpFMASpec,- IEEEFP32Spec (..),- IEEEFP32BoolOpSpec (..),+ bitCastSpec,+ bitCastOrSpec,+ fromFPOrSpec,+ toFPSpec,+ IEEEFPSpec (..),+ IEEEFPBoolOpSpec (..), FPRoundingModeSpec (..), FPRoundingModeBoolOpSpec (..), )@@ -70,29 +78,40 @@ import Data.Data (Proxy (Proxy), Typeable) import Data.Functor ((<&>)) import Data.Kind (Type)+import Data.List.NonEmpty (NonEmpty ((:|))) import qualified Data.Text as T import GHC.TypeLits (KnownNat, Nat, type (+), type (<=)) import Grisette (Identifier, SizedBV, SymRotate, SymShift, withInfo)+import Grisette.Internal.SymPrim.AlgReal (AlgReal) import Grisette.Internal.SymPrim.FP ( FP,- FP32, FPRoundingMode (RNA, RNE, RTN, RTP, RTZ), ValidFP, ) import Grisette.Internal.SymPrim.Prim.Internal.Term- ( FPBinaryOp (FPMax, FPMin, FPRem),+ ( FPBinaryOp (FPMaximum, FPMaximumNumber, FPMinimum, FPMinimumNumber, FPRem), FPRoundingBinaryOp (FPAdd, FPDiv, FPMul, FPSub), FPRoundingUnaryOp (FPRoundToIntegral, FPSqrt), FPUnaryOp (FPAbs, FPNeg),- PEvalFloatingTerm (pevalSqrtTerm),+ FloatingUnaryOp (FloatingSqrt),+ PEvalBitCastOrTerm (pevalBitCastOrTerm),+ PEvalBitCastTerm (pevalBitCastTerm),+ PEvalFloatingTerm (pevalFloatingUnaryTerm, pevalPowerTerm), PEvalFractionalTerm (pevalRecipTerm),+ PEvalIEEEFPConvertibleTerm (pevalFromFPOrTerm, pevalToFPTerm),+ SupportedPrim (pevalDistinctTerm),+ bitCastOrTerm,+ bitCastTerm, fdivTerm,+ floatingUnaryTerm, fpBinaryTerm, fpFMATerm, fpRoundingBinaryTerm, fpRoundingUnaryTerm, fpUnaryTerm,- sqrtTerm,+ fromFPOrTerm,+ powerTerm,+ toFPTerm, ) import Grisette.Internal.SymPrim.Prim.Term ( BinaryOp (pevalBinary),@@ -144,6 +163,7 @@ ( pevalShiftLeftTerm, pevalShiftRightTerm ),+ SupportedNonFuncPrim, SupportedPrim (pevalITETerm), Term, TernaryOp (pevalTernary),@@ -160,6 +180,7 @@ constructBinary, constructTernary, constructUnary,+ distinctTerm, divIntegralTerm, eqTerm, fpTraitTerm,@@ -182,7 +203,7 @@ pevalFPUnaryTerm, pevalNotTerm, pevalOrTerm,- pformat,+ pformatTerm, quotIntegralTerm, recipTerm, remIntegralTerm,@@ -198,7 +219,7 @@ -- import Grisette.Internal.SymPrim.FP (FPRoundingMode(RNE)) -class (SupportedPrim b) => TermRewritingSpec a b | a -> b where+class (SupportedNonFuncPrim b) => TermRewritingSpec a b | a -> b where norewriteVer :: a -> Term b rewriteVer :: a -> Term b wrap :: Term b -> Term b -> a@@ -310,6 +331,13 @@ eqvSpec :: (TermRewritingSpec a av, TermRewritingSpec b Bool) => a -> a -> b eqvSpec = constructBinarySpec eqTerm pevalEqTerm +distinctSpec ::+ (TermRewritingSpec a av, TermRewritingSpec b Bool) => NonEmpty a -> b+distinctSpec l =+ wrap+ (distinctTerm (norewriteVer <$> l))+ (pevalDistinctTerm (rewriteVer <$> l))+ iteSpec :: (TermRewritingSpec a Bool, TermRewritingSpec b bv) => a -> b -> b -> b iteSpec = constructTernarySpec iteTerm pevalITETerm @@ -328,6 +356,25 @@ signumNumSpec :: (TermRewritingSpec a av, PEvalNumTerm av) => a -> a signumNumSpec = constructUnarySpec signumNumTerm pevalSignumNumTerm +bitCastSpec ::+ ( TermRewritingSpec a av,+ TermRewritingSpec b bv,+ PEvalBitCastTerm av bv+ ) =>+ a ->+ b+bitCastSpec = constructUnarySpec bitCastTerm pevalBitCastTerm++bitCastOrSpec ::+ ( TermRewritingSpec a av,+ TermRewritingSpec b bv,+ PEvalBitCastOrTerm av bv+ ) =>+ b ->+ a ->+ b+bitCastOrSpec = constructBinarySpec bitCastOrTerm pevalBitCastOrTerm+ ltOrdSpec :: (TermRewritingSpec a av, PEvalOrdTerm av, TermRewritingSpec b Bool) => a ->@@ -392,7 +439,6 @@ KnownNat bn, 1 <= an, 1 <= bn,- 0 <= ix, ix + bn <= an ) => proxy ix ->@@ -445,9 +491,17 @@ recipSpec :: (TermRewritingSpec a av, PEvalFractionalTerm av) => a -> a recipSpec = constructUnarySpec recipTerm pevalRecipTerm -sqrtSpec :: (TermRewritingSpec a av, PEvalFloatingTerm av) => a -> a-sqrtSpec = constructUnarySpec sqrtTerm pevalSqrtTerm+floatingUnarySpec ::+ (TermRewritingSpec a av, PEvalFloatingTerm av) => FloatingUnaryOp -> a -> a+floatingUnarySpec op =+ constructUnarySpec+ (floatingUnaryTerm op)+ (pevalFloatingUnaryTerm op) +powerSpec ::+ (TermRewritingSpec a av, PEvalFloatingTerm av) => a -> a -> a+powerSpec = constructBinarySpec powerTerm pevalPowerTerm+ fpUnaryOpSpec :: ( ValidFP eb fb, TermRewritingSpec a (FP eb fb)@@ -507,10 +561,35 @@ (fpFMATerm (norewriteVer a) (norewriteVer b) (norewriteVer c) (norewriteVer d)) (pevalFPFMATerm (rewriteVer a) (rewriteVer b) (rewriteVer c) (norewriteVer d)) +fromFPOrSpec ::+ ( ValidFP eb fb,+ TermRewritingSpec a (FP eb fb),+ TermRewritingSpec rd FPRoundingMode,+ TermRewritingSpec b i,+ PEvalIEEEFPConvertibleTerm i+ ) =>+ b ->+ rd ->+ a ->+ b+fromFPOrSpec = constructTernarySpec fromFPOrTerm pevalFromFPOrTerm++toFPSpec ::+ ( ValidFP eb fb,+ TermRewritingSpec a (FP eb fb),+ TermRewritingSpec rd FPRoundingMode,+ TermRewritingSpec b i,+ PEvalIEEEFPConvertibleTerm i+ ) =>+ rd ->+ b ->+ a+toFPSpec = constructBinarySpec toFPTerm pevalToFPTerm+ data BoolOnlySpec = BoolOnlySpec (Term Bool) (Term Bool) instance Show BoolOnlySpec where- show (BoolOnlySpec n r) = "BoolOnlySpec { no: " ++ pformat n ++ ", re: " ++ pformat r ++ " }"+ show (BoolOnlySpec n r) = "BoolOnlySpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }" instance TermRewritingSpec BoolOnlySpec Bool where norewriteVer (BoolOnlySpec n _) = n@@ -535,6 +614,9 @@ return $ andSpec v1 v2, return $ orSpec v1 v2, return $ eqvSpec v1 v2,+ return $ distinctSpec $ v1 :| [],+ return $ distinctSpec $ v1 :| [v2],+ return $ distinctSpec $ v1 :| [v2, v3], return $ iteSpec v1 v2 v3 ] boolonly _ = error "Should never be called"@@ -545,7 +627,7 @@ data BoolWithLIASpec = BoolWithLIASpec (Term Bool) (Term Bool) instance Show BoolWithLIASpec where- show (BoolWithLIASpec n r) = "BoolWithLIASpec { no: " ++ pformat n ++ ", re: " ++ pformat r ++ " }"+ show (BoolWithLIASpec n r) = "BoolWithLIASpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }" instance TermRewritingSpec BoolWithLIASpec Bool where norewriteVer (BoolWithLIASpec n _) = n@@ -557,7 +639,7 @@ instance Show LIAWithBoolSpec where show (LIAWithBoolSpec n r) =- "LIAWithBoolSpec { no: " ++ pformat n ++ ", re: " ++ pformat r ++ " }"+ "LIAWithBoolSpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }" instance TermRewritingSpec LIAWithBoolSpec Integer where norewriteVer (LIAWithBoolSpec n _) = n@@ -579,12 +661,19 @@ v3 <- boolWithLIA (n - 1) v1i <- liaWithBool (n - 1) v2i <- liaWithBool (n - 1)+ v3i <- liaWithBool (n - 1) frequency [ (1, return $ notSpec v1), (1, return $ andSpec v1 v2), (1, return $ orSpec v1 v2), (1, return $ eqvSpec v1 v2),- (5, return $ eqvSpec v1i v2i),+ (4, return $ eqvSpec v1i v2i),+ (1, return $ distinctSpec $ v1 :| []),+ (1, return $ distinctSpec $ v1 :| [v2]),+ (1, return $ distinctSpec $ v1 :| [v2, v3]),+ (2, return $ distinctSpec $ v1i :| []),+ (2, return $ distinctSpec $ v1i :| [v2i]),+ (2, return $ distinctSpec $ v1i :| [v2i, v3i]), (5, return $ ltOrdSpec v1i v2i), (5, return $ leOrdSpec v1i v2i), (1, return $ iteSpec v1 v2 v3)@@ -620,10 +709,10 @@ data FixedSizedBVWithBoolSpec (bv :: Nat -> Type) (n :: Nat) = FixedSizedBVWithBoolSpec (Term (bv n)) (Term (bv n)) -instance (SupportedPrim (bv n)) => Show (FixedSizedBVWithBoolSpec bv n) where- show (FixedSizedBVWithBoolSpec n r) = "FixedSizedBVWithBoolSpec { no: " ++ pformat n ++ ", re: " ++ pformat r ++ " }"+instance (SupportedNonFuncPrim (bv n)) => Show (FixedSizedBVWithBoolSpec bv n) where+ show (FixedSizedBVWithBoolSpec n r) = "FixedSizedBVWithBoolSpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }" -instance (SupportedPrim (bv n)) => TermRewritingSpec (FixedSizedBVWithBoolSpec bv n) (bv n) where+instance (SupportedNonFuncPrim (bv n)) => TermRewritingSpec (FixedSizedBVWithBoolSpec bv n) (bv n) where norewriteVer (FixedSizedBVWithBoolSpec n _) = n rewriteVer (FixedSizedBVWithBoolSpec _ r) = r wrap = FixedSizedBVWithBoolSpec@@ -633,7 +722,7 @@ instance Show (BoolWithFixedSizedBVSpec bv n) where show (BoolWithFixedSizedBVSpec n r) =- "BoolWithFixedSizedBVSpec { no: " ++ pformat n ++ ", re: " ++ pformat r ++ " }"+ "BoolWithFixedSizedBVSpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }" instance TermRewritingSpec (BoolWithFixedSizedBVSpec bv n) Bool where norewriteVer (BoolWithFixedSizedBVSpec n _) = n@@ -661,12 +750,19 @@ v3 <- boolWithFSBV pbv pn (n - 1) v1i <- fsbvWithBool pbv pn (n - 1) v2i <- fsbvWithBool pbv pn (n - 1)+ v3i <- fsbvWithBool pbv pn (n - 1) frequency [ (1, return $ notSpec v1), (1, return $ andSpec v1 v2), (1, return $ orSpec v1 v2), (1, return $ eqvSpec v1 v2), (5, return $ eqvSpec v1i v2i),+ (1, return $ distinctSpec $ v1 :| []),+ (1, return $ distinctSpec $ v1 :| [v2]),+ (1, return $ distinctSpec $ v1 :| [v2, v3]),+ (2, return $ distinctSpec $ v1i :| []),+ (2, return $ distinctSpec $ v1i :| [v2i]),+ (2, return $ distinctSpec $ v1i :| [v2i, v3i]), (5, return $ ltOrdSpec v1i v2i), (5, return $ leOrdSpec v1i v2i), (1, return $ iteSpec v1 v2 v3)@@ -723,10 +819,10 @@ data DifferentSizeBVSpec bv (n :: Nat) = DifferentSizeBVSpec (Term (bv n)) (Term (bv n)) -instance (SupportedPrim (bv n)) => Show (DifferentSizeBVSpec bv n) where- show (DifferentSizeBVSpec n r) = "DSizeBVSpec { no: " ++ pformat n ++ ", re: " ++ pformat r ++ " }"+instance (SupportedNonFuncPrim (bv n)) => Show (DifferentSizeBVSpec bv n) where+ show (DifferentSizeBVSpec n r) = "DSizeBVSpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }" -instance (SupportedPrim (bv n)) => TermRewritingSpec (DifferentSizeBVSpec bv n) (bv n) where+instance (SupportedNonFuncPrim (bv n)) => TermRewritingSpec (DifferentSizeBVSpec bv n) (bv n) where norewriteVer (DifferentSizeBVSpec n _) = n rewriteVer (DifferentSizeBVSpec _ r) = r wrap = DifferentSizeBVSpec@@ -746,6 +842,7 @@ PEvalNumTerm (bv n), PEvalOrdTerm (bv n), PEvalBitwiseTerm (bv n),+ KnownNat n, PEvalBVTerm bv ) @@ -754,9 +851,7 @@ ( SupportedBV bv 1, SupportedBV bv 2, SupportedBV bv 3,- SupportedBV bv 4,- Typeable bv,- SizedBV bv+ SupportedBV bv 4 ) => proxy bv -> Int ->@@ -806,9 +901,7 @@ ( SupportedBV bv 1, SupportedBV bv 2, SupportedBV bv 3,- SupportedBV bv 4,- Typeable bv,- SizedBV bv+ SupportedBV bv 4 ) => proxy bv -> Int ->@@ -858,9 +951,7 @@ ( SupportedBV bv 1, SupportedBV bv 2, SupportedBV bv 3,- SupportedBV bv 4,- Typeable bv,- SizedBV bv+ SupportedBV bv 4 ) => proxy bv -> Int ->@@ -909,9 +1000,7 @@ ( SupportedBV bv 1, SupportedBV bv 2, SupportedBV bv 3,- SupportedBV bv 4,- Typeable bv,- SizedBV bv+ SupportedBV bv 4 ) => proxy bv -> Int ->@@ -972,27 +1061,33 @@ data GeneralSpec s = GeneralSpec (Term s) (Term s) instance (SupportedPrim s) => Show (GeneralSpec s) where- show (GeneralSpec n r) = "GeneralSpec { no: " ++ pformat n ++ ", re: " ++ pformat r ++ " }"+ show (GeneralSpec n r) = "GeneralSpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }" -instance (SupportedPrim s) => TermRewritingSpec (GeneralSpec s) s where+instance (SupportedNonFuncPrim s) => TermRewritingSpec (GeneralSpec s) s where norewriteVer (GeneralSpec n _) = n rewriteVer (GeneralSpec _ r) = r wrap = GeneralSpec same s = eqTerm (norewriteVer s) (rewriteVer s) -data IEEEFP32Spec = IEEEFP32Spec (Term FP32) (Term FP32)+data IEEEFPSpec eb sb = IEEEFPSpec (Term (FP eb sb)) (Term (FP eb sb)) -instance Show IEEEFP32Spec where- show (IEEEFP32Spec n r) =- "IEEEFP32Spec { no: " ++ pformat n ++ ", re: " ++ pformat r ++ " }"+instance (ValidFP eb sb) => Show (IEEEFPSpec eb sb) where+ show (IEEEFPSpec n r) =+ "IEEEFPSpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }" -instance TermRewritingSpec IEEEFP32Spec FP32 where- norewriteVer (IEEEFP32Spec n _) = n- rewriteVer (IEEEFP32Spec _ r) = r- wrap = IEEEFP32Spec- same s = eqTerm (norewriteVer s) (rewriteVer s)+instance (ValidFP eb sb) => TermRewritingSpec (IEEEFPSpec eb sb) (FP eb sb) where+ norewriteVer (IEEEFPSpec n _) = n+ rewriteVer (IEEEFPSpec _ r) = r+ wrap = IEEEFPSpec+ same s =+ orTerm+ ( andTerm+ (fpTraitTerm FPIsNaN (norewriteVer s))+ (fpTraitTerm FPIsNaN (rewriteVer s))+ )+ (eqTerm (norewriteVer s) (rewriteVer s)) -instance Arbitrary IEEEFP32Spec where+instance (ValidFP eb sb) => Arbitrary (IEEEFPSpec eb sb) where arbitrary = do bool :: BoolOnlySpec <- oneof [conSpec <$> arbitrary, return $ symSpec "bool"]@@ -1013,10 +1108,19 @@ signumNumSpec a, fdivSpec a b, recipSpec a,- sqrtSpec a+ floatingUnarySpec FloatingSqrt a ] let uop = fpUnaryOpSpec <$> [FPAbs, FPNeg] <*> return a- let bop = fpBinaryOpSpec <$> [FPRem, FPMin, FPMax] <*> [a] <*> [b]+ let bop =+ fpBinaryOpSpec+ <$> [ FPRem,+ FPMinimum,+ FPMaximum,+ FPMaximumNumber,+ FPMinimumNumber+ ]+ <*> [a]+ <*> [b] let ruop = fpRoundingUnaryOpSpec <$> [FPSqrt, FPRoundToIntegral]@@ -1037,22 +1141,25 @@ ++ rbop ++ [fpFMASpec rounding a b c] -data IEEEFP32BoolOpSpec = IEEEFP32BoolOpSpec (Term Bool) (Term Bool)+data IEEEFPBoolOpSpec (eb :: Nat) (sb :: Nat)+ = IEEEFPBoolOpSpec (Term Bool) (Term Bool) -instance Show IEEEFP32BoolOpSpec where- show (IEEEFP32BoolOpSpec n r) =- "IEEEFP32BoolOpSpec { no: " ++ pformat n ++ ", re: " ++ pformat r ++ " }"+instance Show (IEEEFPBoolOpSpec eb sb) where+ show (IEEEFPBoolOpSpec n r) =+ "IEEEFPBoolOpSpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }" -instance TermRewritingSpec IEEEFP32BoolOpSpec Bool where- norewriteVer (IEEEFP32BoolOpSpec n _) = n- rewriteVer (IEEEFP32BoolOpSpec _ r) = r- wrap = IEEEFP32BoolOpSpec+instance TermRewritingSpec (IEEEFPBoolOpSpec eb sb) Bool where+ norewriteVer (IEEEFPBoolOpSpec n _) = n+ rewriteVer (IEEEFPBoolOpSpec _ r) = r+ wrap = IEEEFPBoolOpSpec same s = eqTerm (norewriteVer s) (rewriteVer s) -singleFP32BoolOpSpecGen :: Gen IEEEFP32BoolOpSpec-singleFP32BoolOpSpecGen = do- s0 :: IEEEFP32Spec <- arbitrary- s1 :: IEEEFP32Spec <- arbitrary+singleFPBoolOpSpecGen ::+ forall eb sb. (ValidFP eb sb) => Gen (IEEEFPBoolOpSpec eb sb)+singleFPBoolOpSpecGen = do+ s0 :: IEEEFPSpec eb sb <- arbitrary+ s1 :: IEEEFPSpec eb sb <- arbitrary+ s2 :: IEEEFPSpec eb sb <- arbitrary let traitGens = [ FPIsNaN, FPIsPositive,@@ -1068,18 +1175,26 @@ FPIsPoint ] <&> (\trait -> return $ fpTraitSpec trait s0)- let cmpGens = return <$> [eqvSpec s0 s1, ltOrdSpec s0 s1, leOrdSpec s0 s1]+ let cmpGens =+ return+ <$> [ eqvSpec s0 s1,+ distinctSpec $ s0 :| [],+ distinctSpec $ s0 :| [s1],+ distinctSpec $ s0 :| [s1, s2],+ ltOrdSpec s0 s1,+ leOrdSpec s0 s1+ ] oneof $ traitGens ++ cmpGens -instance Arbitrary IEEEFP32BoolOpSpec where- arbitrary = singleFP32BoolOpSpecGen+instance (ValidFP eb sb) => Arbitrary (IEEEFPBoolOpSpec eb sb) where+ arbitrary = singleFPBoolOpSpecGen data FPRoundingModeSpec = FPRoundingModeSpec (Term FPRoundingMode) (Term FPRoundingMode) instance Show FPRoundingModeSpec where show (FPRoundingModeSpec n r) =- "FPRoundingModeSpec { no: " ++ pformat n ++ ", re: " ++ pformat r ++ " }"+ "FPRoundingModeSpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }" instance TermRewritingSpec FPRoundingModeSpec FPRoundingMode where norewriteVer (FPRoundingModeSpec n _) = n@@ -1103,7 +1218,7 @@ instance Show FPRoundingModeBoolOpSpec where show (FPRoundingModeBoolOpSpec n r) =- "FPRoundingModeBoolOpSpec { no: " ++ pformat n ++ ", re: " ++ pformat r ++ " }"+ "FPRoundingModeBoolOpSpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }" instance TermRewritingSpec FPRoundingModeBoolOpSpec Bool where norewriteVer (FPRoundingModeBoolOpSpec n _) = n@@ -1115,4 +1230,99 @@ arbitrary = do l :: FPRoundingModeSpec <- arbitrary r <- arbitrary- elements [eqvSpec l r, ltOrdSpec l r, leOrdSpec l r]+ x <- arbitrary+ elements+ [ eqvSpec l r,+ distinctSpec $ l :| [],+ distinctSpec $ l :| [r],+ distinctSpec $ l :| [r, x],+ ltOrdSpec l r,+ leOrdSpec l r+ ]++data BoolWithNRASpec = BoolWithNRASpec (Term Bool) (Term Bool)++instance Show BoolWithNRASpec where+ show (BoolWithNRASpec n r) =+ "BoolWithNRASpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }"++instance TermRewritingSpec BoolWithNRASpec Bool where+ norewriteVer (BoolWithNRASpec n _) = n+ rewriteVer (BoolWithNRASpec _ r) = r+ wrap = BoolWithNRASpec+ same s = eqTerm (norewriteVer s) (rewriteVer s)++data NRAWithBoolSpec = NRAWithBoolSpec (Term AlgReal) (Term AlgReal)++instance Show NRAWithBoolSpec where+ show (NRAWithBoolSpec n r) =+ "NRAWithBoolSpec { no: " ++ pformatTerm n ++ ", re: " ++ pformatTerm r ++ " }"++instance TermRewritingSpec NRAWithBoolSpec AlgReal where+ norewriteVer (NRAWithBoolSpec n _) = n+ rewriteVer (NRAWithBoolSpec _ r) = r+ wrap = NRAWithBoolSpec+ same s = eqTerm (norewriteVer s) (rewriteVer s)++boolWithNRA :: Int -> Gen BoolWithNRASpec+boolWithNRA 0 =+ let s =+ oneof $+ return . symSpec . (`withInfo` ("bool" :: T.Text))+ <$> ["a", "b", "c", "d", "e", "f", "g"]+ r = oneof $ return . conSpec <$> [True, False]+ in oneof [r, s]+boolWithNRA n | n > 0 = do+ v1 <- boolWithNRA (n - 1)+ v2 <- boolWithNRA (n - 1)+ v3 <- boolWithNRA (n - 1)+ v1i <- nraWithBool (n - 1)+ v2i <- nraWithBool (n - 1)+ v3i <- nraWithBool (n - 1)+ frequency+ [ (1, return $ notSpec v1),+ (1, return $ andSpec v1 v2),+ (1, return $ orSpec v1 v2),+ (1, return $ eqvSpec v1 v2),+ (5, return $ eqvSpec v1i v2i),+ (1, return $ distinctSpec $ v1 :| []),+ (1, return $ distinctSpec $ v1 :| [v2]),+ (1, return $ distinctSpec $ v1 :| [v2, v3]),+ (2, return $ distinctSpec $ v1i :| []),+ (2, return $ distinctSpec $ v1i :| [v2i]),+ (2, return $ distinctSpec $ v1i :| [v2i, v3i]),+ (5, return $ ltOrdSpec v1i v2i),+ (5, return $ leOrdSpec v1i v2i),+ (1, return $ iteSpec v1 v2 v3)+ ]+boolWithNRA _ = error "Should never be called"++nraWithBool :: Int -> Gen NRAWithBoolSpec+nraWithBool 0 =+ let s =+ oneof $+ return . symSpec . (`withInfo` ("real" :: T.Text))+ <$> ["a", "b", "c", "d", "e", "f", "g"]+ r = conSpec <$> arbitrary+ in oneof [r, s]+nraWithBool n | n > 0 = do+ v1b <- boolWithNRA (n - 1)+ v1i <- nraWithBool (n - 1)+ v2i <- nraWithBool (n - 1)+ oneof+ [ return $ negNumSpec v1i,+ return $ absNumSpec v1i,+ return $ signumNumSpec v1i,+ return $ addNumSpec v1i v2i,+ return $ mulNumSpec v1i v2i,+ return $ fdivSpec v1i v2i,+ return $ recipSpec v1i,+ return $ iteSpec v1b v1i v2i+ ]+nraWithBool _ = error "Should never be called"++instance Arbitrary BoolWithNRASpec where+ arbitrary = sized boolWithNRA++instance Arbitrary NRAWithBoolSpec where+ arbitrary = sized nraWithBool
test/Grisette/Backend/TermRewritingTests.hs view
@@ -1,9 +1,11 @@ {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} module Grisette.Backend.TermRewritingTests@@ -14,15 +16,35 @@ where import Data.Foldable (traverse_)+import GHC.TypeLits (KnownNat, type (<=)) import Grisette- ( GrisetteSMTConfig,+ ( AlgReal,+ BitCast (bitCast),+ GrisetteSMTConfig,+ IEEEFPConstants+ ( fpMaxNormalized,+ fpMaxSubnormal,+ fpMinNormalized,+ fpMinSubnormal,+ fpNaN,+ fpNegativeInfinite,+ fpNegativeZero,+ fpPositiveInfinite,+ fpPositiveZero+ ),+ IEEEFPRoundingMode (rna, rne, rtn, rtp, rtz), ITEOp (symIte), IntN,- LogicalOp (symNot),+ LinkedRep,+ LogicalOp (symNot, true), Solvable (con), SymBool (SymBool),+ SymFP,+ SymIEEEFPTraits (symFpIsNaN),+ SymRep (SymType), WordN, bitwuzla,+ fpIsNaN, solve, z3, )@@ -31,25 +53,35 @@ BoolWithLIASpec, DifferentSizeBVSpec, FPRoundingModeBoolOpSpec,+ FPRoundingModeSpec, FixedSizedBVWithBoolSpec, GeneralSpec,- IEEEFP32BoolOpSpec (IEEEFP32BoolOpSpec),- IEEEFP32Spec,+ IEEEFPBoolOpSpec (IEEEFPBoolOpSpec),+ IEEEFPSpec, LIAWithBoolSpec,+ NRAWithBoolSpec, TermRewritingSpec ( conSpec, counterExample, norewriteVer, rewriteVer, same,- symSpec+ symSpec,+ wrap ), absNumSpec, addNumSpec, andSpec,+ bitCastOrSpec,+ bitCastSpec, divIntegralSpec, eqvSpec,+ fpBinaryOpSpec,+ fpFMASpec,+ fpRoundingBinarySpec,+ fpRoundingUnaryOpSpec, fpTraitSpec,+ fromFPOrSpec, iteSpec, leOrdSpec, modIntegralSpec,@@ -61,23 +93,36 @@ remIntegralSpec, shiftRightSpec, signumNumSpec,- )-import Grisette.Internal.Core.Data.Class.IEEEFP- ( IEEEConstants (fpNaN, fpNegativeInfinite, fpPositiveInfinite),- SymIEEEFPTraits (symFpIsPositiveInfinite),+ toFPSpec, ) import Grisette.Internal.Core.Data.Class.LogicalOp (LogicalOp ((.&&))) import Grisette.Internal.Core.Data.Class.SymEq (SymEq ((./=), (.==)))-import Grisette.Internal.SymPrim.FP (FP32)+import Grisette.Internal.Core.Data.Class.SymIEEEFP+ ( SymIEEEFPTraits (symFpIsPositiveInfinite),+ )+import Grisette.Internal.SymPrim.FP+ ( ConvertibleBound (convertibleLowerBound, convertibleUpperBound),+ FP,+ FP32,+ FPRoundingMode,+ ValidFP,+ nextFP,+ prevFP,+ ) import Grisette.Internal.SymPrim.Prim.Term- ( FPTrait (FPIsPositive),- SupportedPrim,+ ( FPBinaryOp (FPMaximum, FPMaximumNumber, FPMinimum, FPMinimumNumber, FPRem),+ FPRoundingBinaryOp (FPAdd, FPDiv, FPMul, FPSub),+ FPRoundingUnaryOp (FPRoundToIntegral, FPSqrt),+ FPTrait (FPIsPositive),+ PEvalBitCastOrTerm,+ PEvalBitCastTerm,+ PEvalIEEEFPConvertibleTerm, Term, conTerm, fpTraitTerm, iteTerm, notTerm,- pformat,+ pformatTerm, ssymTerm, ) import Grisette.Internal.SymPrim.SymFP (SymFP32)@@ -85,22 +130,68 @@ import Test.Framework.Providers.HUnit (testCase) import Test.Framework.Providers.QuickCheck2 (testProperty) import Test.HUnit (Assertion, assertFailure)-import Test.QuickCheck (ioProperty, mapSize, withMaxSuccess)+import Test.QuickCheck+ ( Arbitrary,+ elements,+ forAll,+ ioProperty,+ mapSize,+ vectorOf,+ withMaxSuccess,+ (==>),+ )+import Type.Reflection (Typeable, typeRep) -validateSpec :: (TermRewritingSpec a av, Show a, SupportedPrim av) => GrisetteSMTConfig n -> a -> Assertion-validateSpec config a = do- r <- solve config (SymBool $ counterExample a)- rs <- solve config (SymBool $ same a)+validateSpec' ::+ (TermRewritingSpec a av) =>+ GrisetteSMTConfig ->+ SymBool ->+ a ->+ Assertion+validateSpec' config precond a = do+ r <- solve config (precond .&& SymBool (counterExample a))+ rs <- solve config (precond .&& SymBool (same a)) case (r, rs) of (Left _, Right _) -> do return () (Left _, Left err) -> do print err- assertFailure $ "Bad rewriting with unsolvable formula: " ++ pformat (norewriteVer a) ++ " was rewritten to " ++ pformat (rewriteVer a)+ assertFailure $+ "Bad rewriting with unsolvable formula: "+ ++ pformatTerm (norewriteVer a)+ ++ " was rewritten to "+ ++ pformatTerm (rewriteVer a)+ ++ " under precondition"+ ++ show precond+ ++ " corresponding same formula:"+ ++ pformatTerm (same a) (Right m, _) -> do- assertFailure $ "With model" ++ show m ++ "Bad rewriting: " ++ pformat (norewriteVer a) ++ " was rewritten to " ++ pformat (rewriteVer a)+ assertFailure $+ "With model"+ ++ show m+ ++ "Bad rewriting: "+ ++ pformatTerm (norewriteVer a)+ ++ " was rewritten to "+ ++ pformatTerm (rewriteVer a)+ ++ " under precondition"+ ++ show precond+ ++ " corresponding cex formula:"+ ++ pformatTerm (counterExample a)+ ++ "\n"+ ++ show (norewriteVer a)+ ++ "\n"+ ++ show (rewriteVer a)+ ++ "\n"+ ++ show (counterExample a) -bitwuzlaConfig :: IO (Maybe (GrisetteSMTConfig 0))+validateSpec ::+ (TermRewritingSpec a av) =>+ GrisetteSMTConfig ->+ a ->+ Assertion+validateSpec config = validateSpec' config true++bitwuzlaConfig :: IO (Maybe GrisetteSMTConfig) bitwuzlaConfig = do v <- solve bitwuzla $@@ -116,7 +207,7 @@ Left _ -> return Nothing Right _ -> return $ Just bitwuzla -onlyWhenBitwuzlaIsAvailable :: (GrisetteSMTConfig 0 -> IO ()) -> IO ()+onlyWhenBitwuzlaIsAvailable :: (GrisetteSMTConfig -> IO ()) -> IO () onlyWhenBitwuzlaIsAvailable action = do config <- bitwuzlaConfig case config of@@ -131,7 +222,7 @@ divisionTest :: forall a b.- (TermRewritingSpec a b, Show a, Enum b, Num b, SupportedPrim b) =>+ (TermRewritingSpec a b, Enum b, Num b) => TestName -> (a -> a -> a) -> Test@@ -209,6 +300,13 @@ ) ], testGroup+ "NRA"+ [ testProperty "NRA random test" $+ mapSize (`min` 5) $+ ioProperty . \(x :: NRAWithBoolSpec) ->+ validateSpec unboundedConfig x+ ],+ testGroup "Different sized signed BV" [ testProperty "Random test" $ withMaxSuccess 1000 . mapSize (`min` 5) $@@ -383,25 +481,27 @@ onlyWhenBitwuzlaIsAvailable ( `validateSpec` ( eqvSpec- (conSpec 0.0 :: IEEEFP32Spec)+ (conSpec 0.0 :: IEEEFPSpec 5 11) (conSpec $ -0.0) ::- IEEEFP32BoolOpSpec+ IEEEFPBoolOpSpec 5 11 ) ), testCase "-0.0 <= -0.0" $ onlyWhenBitwuzlaIsAvailable ( `validateSpec` ( leOrdSpec- (conSpec 0.0 :: IEEEFP32Spec)+ (conSpec 0.0 :: IEEEFPSpec 5 11) (conSpec $ -0.0) ::- IEEEFP32BoolOpSpec+ IEEEFPBoolOpSpec 5 11 ) ), testCase "is_pos(nan)" $ onlyWhenBitwuzlaIsAvailable ( `validateSpec`- ( fpTraitSpec FPIsPositive (conSpec fpNaN :: IEEEFP32Spec) ::- IEEEFP32BoolOpSpec+ ( fpTraitSpec+ FPIsPositive+ (conSpec fpNaN :: IEEEFPSpec 5 11) ::+ IEEEFPBoolOpSpec 5 11 ) ), testCase "is_pos(+inf)" $@@ -413,24 +513,24 @@ (symSpec "bool" :: BoolOnlySpec) (conSpec fpNegativeInfinite) (conSpec fpPositiveInfinite) ::- IEEEFP32Spec+ IEEEFPSpec 5 11 ) ::- IEEEFP32BoolOpSpec+ IEEEFPBoolOpSpec 5 11 ) ), testCase "regression 2" $ onlyWhenBitwuzlaIsAvailable ( `validateSpec` ( eqvSpec- (signumNumSpec (conSpec (1.175e-38) :: IEEEFP32Spec))+ (signumNumSpec (conSpec (1.175e-38) :: IEEEFPSpec 5 11)) (symSpec "b") ::- IEEEFP32BoolOpSpec+ IEEEFPBoolOpSpec 5 11 ) ), testCase "test sbv bug mitigation sbv#702" $ onlyWhenBitwuzlaIsAvailable ( flip validateSpec $- IEEEFP32BoolOpSpec+ IEEEFPBoolOpSpec ( fpTraitTerm FPIsPositive ( iteTerm@@ -443,11 +543,411 @@ ), testProperty "FP32BoolOp" $ withMaxSuccess 1000 . mapSize (`min` 10) $- ioProperty . \(x :: IEEEFP32BoolOpSpec) ->+ ioProperty . \(x :: IEEEFPBoolOpSpec 5 11) -> onlyWhenBitwuzlaIsAvailable (`validateSpec` x), testProperty "FPRoundingModeBoolOpSpec" $ mapSize (`min` 10) $ ioProperty . \(x :: FPRoundingModeBoolOpSpec) ->- onlyWhenBitwuzlaIsAvailable (`validateSpec` x)- ]+ onlyWhenBitwuzlaIsAvailable (`validateSpec` x),+ testGroup "fpBinaryOp" $ do+ op <-+ [FPMaximum, FPMinimum, FPMaximumNumber, FPMinimumNumber, FPRem]+ return $ testCase (show op) $ do+ let lst =+ [ conSpec fpNegativeInfinite,+ conSpec fpPositiveInfinite,+ conSpec fpNaN,+ conSpec fpPositiveZero,+ conSpec fpNegativeZero,+ conSpec 1,+ conSpec (-1),+ symSpec "a",+ symSpec "b"+ ]+ let ps =+ [ fpBinaryOpSpec op l r :: IEEEFPSpec 4 4+ | l <- lst,+ r <- lst+ ]+ traverse_ (validateSpec z3) ps,+ testGroup "RoundingOp" $ do+ let rdgen =+ elements+ [ conSpec rna :: FPRoundingModeSpec,+ conSpec rne,+ conSpec rtz,+ conSpec rtp,+ conSpec rtn+ ]+ let vgen =+ elements+ [ conSpec fpNegativeInfinite :: IEEEFPSpec 4 4,+ conSpec fpPositiveInfinite,+ conSpec fpNaN,+ conSpec fpPositiveZero,+ conSpec fpNegativeZero,+ conSpec 120,+ conSpec 60,+ conSpec 1,+ conSpec 2,+ conSpec 3,+ conSpec 4,+ conSpec (-1),+ conSpec (-2),+ conSpec (-3),+ conSpec (-4),+ conSpec 1.5625e-2,+ conSpec 2.4e2,+ conSpec 1.953125e-3,+ conSpec 1.3671875e-2,+ symSpec "a",+ symSpec "b"+ ]+ [ testGroup "fpRoundingUnaryOp" $ do+ op <- [FPSqrt, FPRoundToIntegral]+ return $+ testProperty (show op) $+ forAll rdgen $ \rd ->+ forAll vgen $ \v ->+ ioProperty $+ validateSpec z3 $+ fpRoundingUnaryOpSpec op rd v,+ testGroup "fpRoundingBinaryOp" $ do+ op <- [FPAdd, FPSub, FPMul, FPDiv]+ return $+ testProperty (show op) $+ forAll rdgen $ \rd ->+ forAll (vectorOf 2 vgen) $ \[l, r] ->+ ioProperty $+ validateSpec z3 $+ fpRoundingBinarySpec op rd l r,+ testProperty "fma" $+ forAll rdgen $ \rd ->+ forAll (vectorOf 3 vgen) $ \[x, y, z] ->+ ioProperty $+ validateSpec z3 $+ fpFMASpec rd x y z+ ]+ ],+ testGroup "bitCast" $ do+ let bitCastCase ::+ forall a b. (Arbitrary a, PEvalBitCastTerm a b) => Test+ bitCastCase = testProperty+ (show (typeRep @a) <> " -> " <> show (typeRep @b))+ $ \x ->+ withMaxSuccess 10 . ioProperty $+ validateSpec+ z3+ ( bitCastSpec (conSpec x :: GeneralSpec a) ::+ GeneralSpec b+ )+ let fromFPCase ::+ forall a b.+ (Arbitrary a, Arbitrary b, PEvalBitCastOrTerm a b, RealFloat a) =>+ Test+ fromFPCase = testProperty+ (show (typeRep @a) <> " -> " <> show (typeRep @b))+ $ \d x ->+ withMaxSuccess 10 . (not (isNaN x) ==>) . ioProperty $+ validateSpec+ z3+ ( bitCastOrSpec+ (conSpec d :: GeneralSpec b)+ (conSpec x :: GeneralSpec a)+ )+ let toFPCase ::+ forall a b.+ ( Arbitrary a,+ PEvalBitCastTerm a b,+ RealFloat b+ ) =>+ Test+ toFPCase = testProperty+ (show (typeRep @a) <> " -> " <> show (typeRep @b))+ $ \x ->+ withMaxSuccess 10+ . (not (isNaN (bitCast x :: b)) ==>)+ . ioProperty+ $ validateSpec+ z3+ ( bitCastSpec (conSpec x :: GeneralSpec a) ::+ GeneralSpec b+ )+ [ bitCastCase @(IntN 4) @(WordN 4),+ bitCastCase @(WordN 4) @(IntN 4),+ bitCastCase @(IntN 1) @Bool,+ bitCastCase @(WordN 1) @Bool,+ bitCastCase @Bool @(IntN 1),+ bitCastCase @Bool @(WordN 1),+ fromFPCase @(FP 3 5) @(IntN 8),+ fromFPCase @(FP 3 5) @(WordN 8),+ toFPCase @(IntN 8) @(FP 3 5),+ toFPCase @(WordN 8) @(FP 3 5)+ ],+ testGroup "FPConvertible" $ do+ let fromFPAssertion ::+ forall eb sb spec b.+ ( ValidFP eb sb,+ PEvalIEEEFPConvertibleTerm b,+ TermRewritingSpec spec b+ ) =>+ b ->+ FPRoundingMode ->+ FP eb sb ->+ IO ()+ fromFPAssertion d rd x+ | fpIsNaN x = return ()+ | otherwise =+ validateSpec'+ z3+ ( con x+ .== p+ .&& symNot (symFpIsNaN p)+ )+ ( fromFPOrSpec+ (conSpec d :: spec)+ (conSpec rd :: GeneralSpec FPRoundingMode)+ ( wrap (ssymTerm "p") (conTerm x) ::+ GeneralSpec (FP eb sb)+ ) ::+ spec+ )+ where+ p = "p" :: SymFP eb sb+ fromFPAssertionDirect ::+ forall eb sb spec b.+ ( ValidFP eb sb,+ PEvalIEEEFPConvertibleTerm b,+ TermRewritingSpec spec b+ ) =>+ b ->+ FPRoundingMode ->+ FP eb sb ->+ IO ()+ fromFPAssertionDirect d rd x =+ validateSpec+ z3+ ( fromFPOrSpec+ (conSpec d :: spec)+ (conSpec rd :: GeneralSpec FPRoundingMode)+ (conSpec x :: GeneralSpec (FP eb sb))+ )+ fromFPCase ::+ forall eb sb spec b.+ ( ValidFP eb sb,+ Arbitrary b,+ PEvalIEEEFPConvertibleTerm b,+ TermRewritingSpec spec b+ ) =>+ Bool ->+ Test+ fromFPCase direct = testProperty+ (show (typeRep @(FP eb sb)) <> " -> " <> show (typeRep @b))+ $ \(d :: b) rd (x :: FP eb sb) ->+ withMaxSuccess 10 . ioProperty $+ ( if direct+ then fromFPAssertionDirect @eb @sb @spec+ else fromFPAssertion @eb @sb @spec+ )+ d+ rd+ x+ toFPAssertion ::+ forall eb sb b bs.+ ( ValidFP eb sb,+ PEvalIEEEFPConvertibleTerm b,+ LinkedRep b bs,+ Solvable b bs,+ SymEq bs+ ) =>+ FPRoundingMode ->+ b ->+ IO ()+ toFPAssertion rd x =+ validateSpec'+ z3+ ((con x :: SymType b) .== "p")+ ( toFPSpec+ (conSpec rd :: GeneralSpec FPRoundingMode)+ (wrap (ssymTerm "p") (conTerm x) :: GeneralSpec b) ::+ IEEEFPSpec eb sb+ )+ toFPAssertionFP ::+ forall eb sb eb0 sb0.+ ( ValidFP eb sb,+ ValidFP eb0 sb0+ ) =>+ FPRoundingMode ->+ FP eb0 sb0 ->+ IO ()+ toFPAssertionFP _ x | fpIsNaN x = return ()+ toFPAssertionFP rd x =+ validateSpec'+ z3+ ( con x+ .== p+ .&& symNot (symFpIsNaN p)+ )+ ( toFPSpec+ (conSpec rd :: GeneralSpec FPRoundingMode)+ ( wrap (ssymTerm "p") (conTerm x) ::+ GeneralSpec (FP eb0 sb0)+ ) ::+ IEEEFPSpec eb sb+ )+ where+ p = "p" :: SymFP eb0 sb0+ toFPCase ::+ forall eb sb b bs.+ ( ValidFP eb sb,+ Arbitrary b,+ PEvalIEEEFPConvertibleTerm b,+ LinkedRep b bs,+ Solvable b bs,+ SymEq bs+ ) =>+ Test+ toFPCase = testProperty+ (show (typeRep @b) <> " -> " <> show (typeRep @(FP eb sb)))+ $ \rd (x :: b) ->+ withMaxSuccess 10 . ioProperty $+ toFPAssertion @eb @sb rd x+ toFPCaseFP ::+ forall eb sb eb0 sb0.+ ( ValidFP eb sb,+ ValidFP eb0 sb0+ ) =>+ Test+ toFPCaseFP = testProperty+ ( show (typeRep @(FP eb0 sb0))+ <> " -> "+ <> show (typeRep @(FP eb sb))+ )+ $ \rd (x :: b) ->+ withMaxSuccess 10 . ioProperty $+ toFPAssertionFP @eb @sb @eb0 @sb0 rd x+ specialFps :: (ValidFP eb sb) => [FP eb sb]+ specialFps =+ [ fpPositiveZero,+ fpNegativeZero,+ fpPositiveInfinite,+ fpNegativeInfinite,+ fpNaN,+ fpMaxNormalized,+ fpMinNormalized,+ fpMaxSubnormal,+ fpMinSubnormal+ ]+ boundFps ::+ (ConvertibleBound bv, KnownNat n, 1 <= n, ValidFP eb sb) =>+ bv n ->+ FPRoundingMode ->+ [FP eb sb]+ boundFps n mode =+ [ convertibleLowerBound n mode,+ convertibleUpperBound n mode+ ]+ fps ::+ (ConvertibleBound bv, KnownNat n, 1 <= n, ValidFP eb sb) =>+ bv n ->+ FPRoundingMode ->+ [FP eb sb]+ fps n mode =+ specialFps+ ++ boundFps n mode+ ++ (nextFP <$> boundFps n mode)+ ++ (prevFP <$> boundFps n mode)+ boundedFromFPCase ::+ forall bv n eb sb.+ ( ConvertibleBound bv,+ KnownNat n,+ 1 <= n,+ ValidFP eb sb,+ PEvalIEEEFPConvertibleTerm (bv n),+ Num (bv n),+ Typeable bv+ ) =>+ FPRoundingMode ->+ Test+ boundedFromFPCase mode =+ testCase (show (typeRep @bv) ++ "/" ++ show mode) $+ mapM_+ ( fromFPAssertion @eb @sb @(GeneralSpec (bv n))+ 123+ mode+ )+ (fps (undefined :: (bv n)) mode)+ boundedFromFPTestGroup ::+ forall n eb sb.+ ( KnownNat n,+ 1 <= n,+ ValidFP eb sb+ ) =>+ Test+ boundedFromFPTestGroup =+ testGroup+ ( show (typeRep @(FP eb sb))+ ++ " -> "+ ++ show (typeRep @(IntN n))+ ++ "/"+ ++ show (typeRep @(WordN n))+ )+ $ do+ mode <- [rna, rne, rtz, rtp, rtn]+ [ boundedFromFPCase @IntN @n @eb @sb mode,+ boundedFromFPCase @WordN @n @eb @sb mode+ ]+ [ -- z3 is buggy with the indirect encoding+ -- https://github.com/Z3Prover/z3/issues/7321+ fromFPCase @4 @4 @(GeneralSpec AlgReal) True,+ toFPCase @4 @4 @AlgReal,+ testCase "FP 4 4 -> Integer" $ do+ sequence_ $+ (fromFPAssertionDirect @4 @4 @(GeneralSpec Integer) 0)+ <$> [rna, rne, rtz, rtp, rtn]+ <*> (specialFps ++ ((/ 4) . fromIntegral <$> [-7 .. 7])),+ toFPCase @4 @4 @Integer,+ fromFPCase @4 @4 @(IEEEFPSpec 3 3) False,+ toFPCaseFP @4 @4 @3 @3,+ fromFPCase @4 @4 @(IEEEFPSpec 5 5) False,+ toFPCaseFP @4 @4 @5 @5,+ toFPCase @4 @4 @(WordN 8),+ toFPCase @4 @4 @(IntN 8),+ boundedFromFPTestGroup @32 @4 @4,+ boundedFromFPTestGroup @12 @4 @16,+ boundedFromFPTestGroup @12 @4 @12,+ boundedFromFPTestGroup @12 @4 @11,+ boundedFromFPTestGroup @12 @4 @10,+ boundedFromFPTestGroup @12 @4 @9,+ boundedFromFPTestGroup @12 @4 @2,+ boundedFromFPTestGroup @10 @4 @16,+ boundedFromFPTestGroup @10 @4 @10,+ boundedFromFPTestGroup @10 @4 @9,+ boundedFromFPTestGroup @10 @4 @8,+ boundedFromFPTestGroup @10 @4 @7,+ boundedFromFPTestGroup @10 @4 @2,+ boundedFromFPTestGroup @9 @4 @16,+ boundedFromFPTestGroup @9 @4 @9,+ boundedFromFPTestGroup @9 @4 @8,+ boundedFromFPTestGroup @9 @4 @7,+ boundedFromFPTestGroup @9 @4 @6,+ boundedFromFPTestGroup @9 @4 @2,+ boundedFromFPTestGroup @8 @4 @16,+ boundedFromFPTestGroup @8 @4 @8,+ boundedFromFPTestGroup @8 @4 @7,+ boundedFromFPTestGroup @8 @4 @6,+ boundedFromFPTestGroup @8 @4 @5,+ boundedFromFPTestGroup @8 @4 @2,+ boundedFromFPTestGroup @7 @4 @16,+ boundedFromFPTestGroup @7 @4 @7,+ boundedFromFPTestGroup @7 @4 @6,+ boundedFromFPTestGroup @7 @4 @5,+ boundedFromFPTestGroup @7 @4 @4,+ boundedFromFPTestGroup @7 @4 @2,+ boundedFromFPTestGroup @5 @4 @16,+ boundedFromFPTestGroup @5 @4 @5,+ boundedFromFPTestGroup @5 @4 @4,+ boundedFromFPTestGroup @5 @4 @3,+ boundedFromFPTestGroup @5 @4 @2+ ] ]
test/Grisette/Core/Control/Monad/UnionTests.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}@@ -33,7 +34,8 @@ ToCon (toCon), ToSym (toSym), TryMerge (tryMergeWithStrategy),- TypedSymbol,+ TypedAnySymbol,+ TypedConstantSymbol, mrgIf, mrgIte1, mrgSingle,@@ -250,7 +252,7 @@ actual @?= expected, testCase "ToSym (Union a) (Union b)" $ do let actual = toSym (mrgSingle True :: Union Bool) :: Union SymBool- let expected = return (con True)+ let expected = mrgSingle (con True) actual @?= expected, testCase "ToSym (Union Integer) SymInteger" $ do let actual = toSym (mrgIf "a" 1 2 :: Union Integer)@@ -321,7 +323,7 @@ testCase "SubstSym" $ do let actual = substSym- ("a" :: TypedSymbol Bool)+ ("a" :: TypedConstantSymbol Bool) "b" ( mrgIf "a" (return $ Left "a") (return $ Right "c") :: Union (Either SymBool SymBool)@@ -332,9 +334,9 @@ let actual = extractSym union1 let expected = buildSymbolSet- ( "u1c" :: TypedSymbol Bool,- "u1a" :: TypedSymbol Bool,- "u1b" :: TypedSymbol Integer+ ( "u1c" :: TypedAnySymbol Bool,+ "u1a" :: TypedAnySymbol Bool,+ "u1b" :: TypedAnySymbol Integer ) actual @?= expected, testGroup
+ test/Grisette/Core/Data/Class/BitCastTests.hs view
@@ -0,0 +1,93 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}++module Grisette.Core.Data.Class.BitCastTests (bitCastTests) where++import Data.Typeable (Proxy (Proxy), Typeable, typeRep)+import Grisette+ ( BitCast (bitCast),+ FP32,+ IntN,+ IntN32,+ LogicalOp (false, true),+ SymBool,+ SymFP32,+ SymIntN,+ SymIntN32,+ SymWordN,+ SymWordN32,+ WordN,+ WordN32,+ bitCastOrCanonical,+ fpNaN,+ )+import Test.Framework (Test, testGroup)+import Test.Framework.Providers.HUnit (testCase)+import Test.HUnit ((@?=))++bitCastBit1Tests ::+ forall b r.+ ( BitCast b r,+ BitCast r b,+ LogicalOp b,+ Num r,+ Typeable b,+ Typeable r,+ Eq b,+ Eq r,+ Show b,+ Show r+ ) =>+ [Test]+bitCastBit1Tests =+ [ testCase (bname <> " to " <> rname) $ do+ bitCast (true :: b) @?= (1 :: r)+ bitCast (false :: b) @?= (0 :: r),+ testCase (rname <> " to " <> bname) $ do+ bitCast (1 :: r) @?= (true :: b)+ bitCast (0 :: r) @?= (false :: b)+ ]+ where+ bname = show $ typeRep (Proxy :: Proxy b)+ rname = show $ typeRep (Proxy :: Proxy r)++bitCastTests :: Test+bitCastTests =+ testGroup+ "BitCast"+ [ testGroup "1 bit" $+ concat+ [ bitCastBit1Tests @Bool @(IntN 1),+ bitCastBit1Tests @Bool @(WordN 1),+ bitCastBit1Tests @SymBool @(SymIntN 1),+ bitCastBit1Tests @SymBool @(SymWordN 1)+ ],+ testGroup+ "FP"+ [ testCase "FP32" $ do+ bitCastOrCanonical (-512.625 :: FP32) @?= (0xc4002800 :: WordN32)+ bitCastOrCanonical (fpNaN :: FP32) @?= (0x7fc00000 :: WordN32)+ bitCast (0xc4002800 :: WordN32) @?= (-512.625 :: FP32)+ bitCastOrCanonical (-512.625 :: FP32) @?= (0xc4002800 :: IntN32)+ bitCastOrCanonical (fpNaN :: FP32) @?= (0x7fc00000 :: IntN32)+ bitCast (0xc4002800 :: IntN32) @?= (-512.625 :: FP32),+ testCase "SymFP32" $ do+ bitCastOrCanonical (-512.625 :: SymFP32)+ @?= (0xc4002800 :: SymWordN32)+ bitCastOrCanonical (fpNaN :: SymFP32) @?= (0x7fc00000 :: SymWordN32)+ bitCast (0xc4002800 :: SymWordN32) @?= (-512.625 :: SymFP32)+ bitCastOrCanonical (-512.625 :: SymFP32)+ @?= (0xc4002800 :: SymIntN32)+ bitCastOrCanonical (fpNaN :: SymFP32) @?= (0x7fc00000 :: SymIntN32)+ bitCast (0xc4002800 :: SymIntN32) @?= (-512.625 :: SymFP32)+ ],+ testCase "Nested" $ do+ let int32 = "x" :: SymIntN32+ let word32 = bitCast int32 :: SymWordN32+ let final = bitCast word32 :: SymIntN32+ final @?= int32+ ]
test/Grisette/Core/Data/Class/EvalSymTests.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-}
test/Grisette/Core/Data/Class/ExtractSymTests.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-}
test/Grisette/Core/Data/Class/PPrintTests.hs view
@@ -11,7 +11,7 @@ module Grisette.Core.Data.Class.PPrintTests (pprintTests) where import Control.Monad.Except (ExceptT (ExceptT))-import Control.Monad.Identity (Identity, IdentityT (IdentityT))+import Control.Monad.Identity (Identity (Identity), IdentityT (IdentityT)) import Control.Monad.Trans.Maybe (MaybeT (MaybeT)) import qualified Control.Monad.Trans.Writer.Lazy as WriterLazy import qualified Data.HashMap.Lazy as HM@@ -89,7 +89,7 @@ propertyPFormatShow :: forall a.- (HasCallStack, PPrint a, Show a) =>+ (PPrint a, Show a) => String -> Gen a -> Test@@ -100,7 +100,7 @@ propertyPFormatRead :: forall a.- (HasCallStack, PPrint a, Read a, Show a, Eq a) =>+ (PPrint a, Read a, Show a, Eq a) => String -> Gen a -> Test@@ -695,35 +695,119 @@ "Record Record" ( arbitrary :: Gen (Record (Record Int Int) (Record Int Int)) ),+ testPPrint1+ "Identity"+ 0+ (Identity $ Just $ Just 1 :: Identity (Maybe (Maybe Int)))+ "Just (Just 1)", propertyPFormatRead- "Maybe (MaybeT Identity Int)"- (Just . MaybeT <$> arbitrary :: Gen (Maybe (MaybeT Identity Int))),+ "Maybe (MaybeT Maybe Int)"+ (Just . MaybeT <$> arbitrary :: Gen (Maybe (MaybeT Maybe Int))), propertyPFormatRead- "Maybe (ExceptT Int Identity Int)"+ "Maybe (ExceptT Int Maybe Int)" ( Just . ExceptT <$> arbitrary ::- Gen (Maybe (ExceptT Int Identity Int))+ Gen (Maybe (ExceptT Int Maybe Int)) ), propertyPFormatRead- "Maybe (LazyWriterT Int Identity Int)"+ "Maybe (LazyWriterT Int Maybe Int)" ( Just . WriterLazy.WriterT <$> arbitrary ::- Gen (Maybe (WriterLazy.WriterT Int Identity Int))+ Gen (Maybe (WriterLazy.WriterT Int Maybe Int)) ), propertyPFormatRead- "Maybe (StrictWriterT Int Identity Int)"+ "Maybe (StrictWriterT Int Maybe Int)" ( Just . WriterLazy.WriterT <$> arbitrary ::- Gen (Maybe (WriterLazy.WriterT Int Identity Int))+ Gen (Maybe (WriterLazy.WriterT Int Maybe Int)) ), propertyPFormatRead- "Maybe (IdentityT Identity Int)"+ "Maybe (IdentityT Maybe Int)" ( Just . IdentityT <$> arbitrary ::- Gen (Maybe (IdentityT Identity Int))+ Gen (Maybe (IdentityT Maybe Int)) ),- propertyPFormatRead- "HS.HashSet Int"- (HS.fromList <$> arbitrary :: Gen (HS.HashSet Int)),- propertyPFormatRead- "HM.HashMap Int Int"- (HM.fromList <$> arbitrary :: Gen (HM.HashMap Int Int))+ testGroup+ "HashSet"+ [ testPPrint1+ "Unbounded empty"+ 0+ (HS.fromList [] :: HS.HashSet Int)+ "HashSet []",+ testPPrint1+ "Unbounded singleton"+ 0+ (HS.fromList [1] :: HS.HashSet Int)+ "HashSet [1]",+ testPPrint1+ "Unbounded two elem"+ 0+ (HS.fromList [1, 2] :: HS.HashSet Int)+ "HashSet [1, 2]",+ testPPrint1+ "Compact empty"+ 1+ (HS.fromList [] :: HS.HashSet Int)+ "HashSet\n []",+ testPPrint1+ "Compact singleton"+ 1+ (HS.fromList [1] :: HS.HashSet Int)+ "HashSet\n [ 1\n ]",+ testPPrint1+ "Unbounded two elem"+ 1+ (HS.fromList [1, 2] :: HS.HashSet Int)+ "HashSet\n [ 1,\n 2\n ]"+ ],+ testGroup+ "HashMap"+ [ testPPrint1+ "Unbounded empty"+ 0+ (HM.fromList [] :: HM.HashMap Int Int)+ "HashMap []",+ testPPrint1+ "Unbounded singleton"+ 0+ (HM.fromList [(1, 2)] :: HM.HashMap Int Int)+ "HashMap [(1, 2)]",+ testPPrint1+ "Unbounded two elem"+ 0+ (HM.fromList [(1, 2), (3, 4)] :: HM.HashMap Int Int)+ "HashMap [(1, 2), (3, 4)]",+ testPPrint1+ "Compact empty"+ 1+ (HM.fromList [] :: HM.HashMap Int Int)+ "HashMap\n []",+ testPPrint1+ "Compact singleton"+ 1+ (HM.fromList [(1, 2)] :: HM.HashMap Int Int)+ ( T.intercalate+ "\n"+ [ "HashMap",+ " [ ( 1,",+ " 2",+ " )",+ " ]"+ ]+ ),+ testPPrint1+ "Unbounded two elem"+ 1+ (HM.fromList [(1, 2), (3, 4)] :: HM.HashMap Int Int)+ ( T.intercalate+ "\n"+ [ "HashMap",+ " [ ( 1,",+ " 2",+ " ),",+ " ( 3,",+ " 4",+ " )",+ " ]"+ ]+ )+ ] ], testGroup "Symbolic types"
+ test/Grisette/Core/Data/Class/SafeDivTests.hs view
@@ -0,0 +1,400 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}++module Grisette.Core.Data.Class.SafeDivTests (safeDivTests) where++import Control.DeepSeq (NFData, force)+import Control.Exception (ArithException, catch)+import Control.Monad.Except (ExceptT, runExceptT)+import Data.Bifunctor (Bifunctor (bimap))+import Data.Data (Typeable, typeRep)+import Data.Proxy (Proxy (Proxy))+import GHC.IO (evaluate)+import GHC.Int (Int16, Int32, Int64, Int8)+import GHC.Word (Word16, Word32, Word64, Word8)+import Grisette+ ( BV (bv),+ IntN,+ Mergeable,+ SafeDiv (safeDiv, safeDivMod, safeMod, safeQuot, safeQuotRem, safeRem),+ SomeBVException (BitwidthMismatch),+ SomeIntN,+ SomeWordN,+ Union,+ WordN,+ mrgPure,+ pattern SomeIntN,+ pattern SomeWordN,+ )+import Grisette.Internal.Core.Control.Monad.Union (isMerged)+import Grisette.Internal.Core.Data.Class.SafeDiv+ ( DivOr (divModOr, divOr, modOr, quotOr, quotRemOr, remOr),+ )+import Grisette.Lib.Control.Monad.Except (mrgThrowError)+import Test.Framework (Test, testGroup)+import Test.Framework.Providers.HUnit (testCase)+import Test.Framework.Providers.QuickCheck2 (testProperty)+import Test.HUnit (assertBool, (@?=))+import Test.QuickCheck (Arbitrary, ioProperty)++divOrMatches ::+ (NFData r, Eq r', Show r') =>+ (t -> t') ->+ (r -> r') ->+ (r' -> t' -> t' -> r') ->+ (t -> t -> r) ->+ r ->+ t ->+ t ->+ IO ()+divOrMatches wrapInput wrapOutput f fref d x y = do+ rref <-+ (wrapOutput <$> evaluate (force (fref x y)))+ `catch` \(_ :: ArithException) -> return $ wrapOutput d+ let r = f (wrapOutput d) (wrapInput x) (wrapInput y)+ r @?= rref++generalOpDivOrTestBase ::+ ( NFData r,+ Arbitrary t,+ Show t,+ Arbitrary r,+ Show r,+ Eq r',+ Show r',+ Num t+ ) =>+ (t -> t') ->+ (r -> r') ->+ String ->+ (r' -> t' -> t' -> r') ->+ (t -> t -> r) ->+ Test+generalOpDivOrTestBase wrapInput wrapOutput name f fref =+ testGroup+ name+ [ testProperty "random" $ \d x y ->+ ioProperty $ divOrMatches wrapInput wrapOutput f fref d x y,+ testProperty "divided by zero" $ \d ->+ ioProperty $ divOrMatches wrapInput wrapOutput f fref d 1 0+ ]++generalOpDivOrTest ::+ ( NFData r,+ Arbitrary t,+ Show t,+ Arbitrary r,+ Show r,+ Eq r,+ Num t+ ) =>+ String ->+ (r -> t -> t -> r) ->+ (t -> t -> r) ->+ Test+generalOpDivOrTest = generalOpDivOrTestBase id id++opBoundedDivOrTestBase ::+ ( NFData r,+ Arbitrary t,+ Show t,+ Arbitrary r,+ Show r,+ Eq r',+ Show r',+ Bounded t,+ Num t+ ) =>+ (t -> t') ->+ (r -> r') ->+ String ->+ (r' -> t' -> t' -> r') ->+ (t -> t -> r) ->+ Test+opBoundedDivOrTestBase wrapInput wrapOutput name f fref =+ testGroup+ name+ [ testProperty "random" $ \d x y ->+ ioProperty $ divOrMatches wrapInput wrapOutput f fref d x y,+ testProperty "divided by zero" $ \d ->+ ioProperty $ divOrMatches wrapInput wrapOutput f fref d 1 0,+ testProperty "minBound/-1" $ \d ->+ ioProperty $ divOrMatches wrapInput wrapOutput f fref d minBound (-1)+ ]++opBoundedDivOrTest ::+ ( NFData r,+ Arbitrary t,+ Show t,+ Arbitrary r,+ Show r,+ Eq r,+ Bounded t,+ Num t+ ) =>+ String ->+ (r -> t -> t -> r) ->+ (t -> t -> r) ->+ Test+opBoundedDivOrTest = opBoundedDivOrTestBase id id++safeDivMatches ::+ (NFData r, Eq r', Show r', Mergeable r', Mergeable e, Eq e, Show e) =>+ (t -> t') ->+ (r -> r') ->+ (ArithException -> e) ->+ (t' -> t' -> ExceptT e Union r') ->+ (t -> t -> r) ->+ t ->+ t ->+ IO ()+safeDivMatches wrapInput wrapOutput wrapError f fref x y = do+ rref <-+ (mrgPure . wrapOutput <$> evaluate (force (fref x y)))+ `catch` \(e :: ArithException) -> return $ mrgThrowError $ wrapError e+ let r = f (wrapInput x) (wrapInput y)+ assertBool "Is merged" $ isMerged $ runExceptT r+ r @?= rref++generalOpSafeDivTestBase ::+ ( NFData r,+ Arbitrary t,+ Show t,+ Eq r',+ Show r',+ Num t,+ Mergeable r',+ Mergeable e,+ Show e,+ Eq e+ ) =>+ (t -> t') ->+ (r -> r') ->+ (ArithException -> e) ->+ String ->+ (t' -> t' -> ExceptT e Union r') ->+ (t -> t -> r) ->+ Test+generalOpSafeDivTestBase wrapInput wrapOutput wrapError name f fref =+ testGroup+ name+ [ testProperty "random" $ \x y ->+ ioProperty $ safeDivMatches wrapInput wrapOutput wrapError f fref x y,+ testCase "divided by zero" $+ safeDivMatches wrapInput wrapOutput wrapError f fref 1 0+ ]++generalOpSafeDivTest ::+ (NFData r, Arbitrary t, Show t, Show r, Eq r, Num t, Mergeable r) =>+ String ->+ (t -> t -> ExceptT ArithException Union r) ->+ (t -> t -> r) ->+ Test+generalOpSafeDivTest = generalOpSafeDivTestBase id id id++opBoundedSafeDivTestBase ::+ ( NFData r,+ Arbitrary t,+ Show t,+ Show r',+ Eq r',+ Num t,+ Bounded t,+ Mergeable r',+ Mergeable e,+ Show e,+ Eq e+ ) =>+ (t -> t') ->+ (r -> r') ->+ (ArithException -> e) ->+ String ->+ (t' -> t' -> ExceptT e Union r') ->+ (t -> t -> r) ->+ Test+opBoundedSafeDivTestBase wrapInput wrapOutput wrapError name f fref =+ testGroup+ name+ [ testProperty "random" $ \x y ->+ ioProperty $ safeDivMatches wrapInput wrapOutput wrapError f fref x y,+ testCase "divided by zero" $+ safeDivMatches wrapInput wrapOutput wrapError f fref 1 0,+ testCase "minBound/-1" $+ safeDivMatches wrapInput wrapOutput wrapError f fref minBound (-1)+ ]++opBoundedSafeDivTest ::+ ( NFData r,+ Arbitrary t,+ Show t,+ Show r,+ Eq r,+ Num t,+ Bounded t,+ Mergeable r+ ) =>+ String ->+ (t -> t -> ExceptT ArithException Union r) ->+ (t -> t -> r) ->+ Test+opBoundedSafeDivTest = opBoundedSafeDivTestBase id id id++type OpSafeDivTestFunc t =+ forall r.+ (Eq r, Show r, Eq r, NFData r, Mergeable r) =>+ String ->+ (t -> t -> ExceptT ArithException Union r) ->+ (t -> t -> r) ->+ Test++type OpDivOrTestFunc t =+ forall r.+ (Eq r, Show r, Eq r, NFData r, Mergeable r, Arbitrary r) =>+ String ->+ (r -> t -> t -> r) ->+ (t -> t -> r) ->+ Test++testType ::+ forall t.+ ( NFData t,+ Show t,+ SafeDiv ArithException t (ExceptT ArithException Union),+ Integral t,+ Typeable t,+ Arbitrary t+ ) =>+ OpSafeDivTestFunc t ->+ OpDivOrTestFunc t ->+ Proxy t ->+ Test+testType safeDivTestFunc divOrTestFunc p =+ testGroup+ (show $ typeRep p)+ [ divOrTestFunc "divOr" divOr (div @t),+ divOrTestFunc "modOr" modOr (mod @t),+ divOrTestFunc "divModOr" divModOr (divMod @t),+ divOrTestFunc "quotOr" quotOr (quot @t),+ divOrTestFunc "remOr" remOr (rem @t),+ divOrTestFunc "quotRemOr" quotRemOr (quotRem @t),+ safeDivTestFunc "safeDiv" safeDiv (div @t),+ safeDivTestFunc "safeMod" safeMod (mod @t),+ safeDivTestFunc "safeDivMod" safeDivMod (divMod @t),+ safeDivTestFunc "safeQuot" safeQuot (quot @t),+ safeDivTestFunc "safeRem" safeRem (rem @t),+ safeDivTestFunc "safeQuotRem" safeQuotRem (quotRem @t)+ ]++safeDivTests :: Test+safeDivTests =+ testGroup+ "SafeDiv"+ [ testType generalOpSafeDivTest generalOpDivOrTest (Proxy :: Proxy Integer),+ testType opBoundedSafeDivTest opBoundedDivOrTest (Proxy :: Proxy Int8),+ testType opBoundedSafeDivTest opBoundedDivOrTest (Proxy :: Proxy Int16),+ testType opBoundedSafeDivTest opBoundedDivOrTest (Proxy :: Proxy Int32),+ testType opBoundedSafeDivTest opBoundedDivOrTest (Proxy :: Proxy Int64),+ testType opBoundedSafeDivTest opBoundedDivOrTest (Proxy :: Proxy Int),+ testType+ opBoundedSafeDivTest+ opBoundedDivOrTest+ (Proxy :: Proxy (IntN 8)),+ testType opBoundedSafeDivTest opBoundedDivOrTest (Proxy :: Proxy Word),+ testType opBoundedSafeDivTest opBoundedDivOrTest (Proxy :: Proxy Word8),+ testType opBoundedSafeDivTest opBoundedDivOrTest (Proxy :: Proxy Word16),+ testType opBoundedSafeDivTest opBoundedDivOrTest (Proxy :: Proxy Word32),+ testType opBoundedSafeDivTest opBoundedDivOrTest (Proxy :: Proxy Word64),+ testType+ opBoundedSafeDivTest+ opBoundedDivOrTest+ (Proxy :: Proxy (WordN 8)),+ testGroup "SomeWordN" $ do+ let singleOutputDivOrTest =+ opBoundedDivOrTestBase+ SomeWordN+ SomeWordN+ let doubleOutputDivOrTest =+ opBoundedDivOrTestBase+ SomeWordN+ (bimap SomeWordN SomeWordN)+ let singleOutputSafeDivTest =+ opBoundedSafeDivTestBase+ SomeWordN+ SomeWordN+ (\e -> Right e :: Either SomeBVException ArithException)+ let doubleOutputSafeDivTest =+ opBoundedSafeDivTestBase+ SomeWordN+ (bimap SomeWordN SomeWordN)+ (\e -> Right e :: Either SomeBVException ArithException)+ [ singleOutputDivOrTest "divOr" divOr (div @(WordN 8)),+ singleOutputDivOrTest "modOr" modOr (mod @(WordN 8)),+ doubleOutputDivOrTest "divModOr" divModOr (divMod @(WordN 8)),+ singleOutputDivOrTest "quotOr" quotOr (quot @(WordN 8)),+ singleOutputDivOrTest "remOr" remOr (rem @(WordN 8)),+ doubleOutputDivOrTest "quotRemOr" quotRemOr (quotRem @(WordN 8)),+ singleOutputSafeDivTest "safeDiv" safeDiv (div @(WordN 8)),+ singleOutputSafeDivTest "safeMod" safeMod (mod @(WordN 8)),+ doubleOutputSafeDivTest "safeDivMod" safeDivMod (divMod @(WordN 8)),+ singleOutputSafeDivTest "safeQuot" safeQuot (quot @(WordN 8)),+ singleOutputSafeDivTest "safeRem" safeRem (rem @(WordN 8)),+ doubleOutputSafeDivTest+ "safeQuotRem"+ safeQuotRem+ (quotRem @(WordN 8)),+ testCase "Bitwidth mismatch" $ do+ let actual =+ safeDiv (bv 10 2) (bv 11 3) ::+ ExceptT+ (Either SomeBVException ArithException)+ Union+ SomeWordN+ let expected = mrgThrowError $ Left BitwidthMismatch+ actual @?= expected+ ],+ testGroup "SomeIntN" $ do+ let singleOutputDivOrTest =+ opBoundedDivOrTestBase+ SomeIntN+ SomeIntN+ let doubleOutputDivOrTest =+ opBoundedDivOrTestBase+ SomeIntN+ (bimap SomeIntN SomeIntN)+ let singleOutputSafeDivTest =+ opBoundedSafeDivTestBase+ SomeIntN+ SomeIntN+ (\e -> Right e :: Either SomeBVException ArithException)+ let doubleOutputSafeDivTest =+ opBoundedSafeDivTestBase+ SomeIntN+ (bimap SomeIntN SomeIntN)+ (\e -> Right e :: Either SomeBVException ArithException)+ [ singleOutputDivOrTest "divOr" divOr (div @(IntN 8)),+ singleOutputDivOrTest "modOr" modOr (mod @(IntN 8)),+ doubleOutputDivOrTest "divModOr" divModOr (divMod @(IntN 8)),+ singleOutputDivOrTest "quotOr" quotOr (quot @(IntN 8)),+ singleOutputDivOrTest "remOr" remOr (rem @(IntN 8)),+ doubleOutputDivOrTest "quotRemOr" quotRemOr (quotRem @(IntN 8)),+ singleOutputSafeDivTest "div" safeDiv (div @(IntN 8)),+ singleOutputSafeDivTest "mod" safeMod (mod @(IntN 8)),+ doubleOutputSafeDivTest "divMod" safeDivMod (divMod @(IntN 8)),+ singleOutputSafeDivTest "quot" safeQuot (quot @(IntN 8)),+ singleOutputSafeDivTest "rem" safeRem (rem @(IntN 8)),+ doubleOutputSafeDivTest "quotRem" safeQuotRem (quotRem @(IntN 8)),+ testCase "Bitwidth mismatch" $ do+ let actual =+ safeDiv (bv 10 2) (bv 11 3) ::+ ExceptT+ (Either SomeBVException ArithException)+ Union+ SomeIntN+ let expected = mrgThrowError $ Left BitwidthMismatch+ actual @?= expected+ ]+ ]
− test/Grisette/Core/Data/Class/SafeDivisionTests.hs
@@ -1,278 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications #-}--module Grisette.Core.Data.Class.SafeDivisionTests (safeDivisionTests) where--import Control.DeepSeq (NFData, force)-import Control.Exception (ArithException, catch)-import Control.Monad.Except (ExceptT, runExceptT)-import Data.Bifunctor (Bifunctor (bimap))-import Data.Data (Typeable, typeRep)-import Data.Proxy (Proxy (Proxy))-import GHC.IO (evaluate)-import GHC.Int (Int16, Int32, Int64, Int8)-import GHC.Word (Word16, Word32, Word64, Word8)-import Grisette- ( BV (bv),- BitwidthMismatch (BitwidthMismatch),- IntN,- Mergeable,- SafeDivision (safeDiv, safeDivMod, safeMod, safeQuot, safeQuotRem, safeRem),- SomeIntN,- SomeWordN,- Union,- WordN,- mrgPure,- pattern SomeIntN,- pattern SomeWordN,- )-import Grisette.Internal.Core.Control.Monad.Union (isMerged)-import Grisette.Lib.Control.Monad.Except (mrgThrowError)-import Test.Framework (Test, testGroup)-import Test.Framework.Providers.HUnit (testCase)-import Test.Framework.Providers.QuickCheck2 (testProperty)-import Test.HUnit (assertBool, (@?=))-import Test.QuickCheck (Arbitrary, ioProperty)--matches ::- (NFData r, Eq r', Show r', Mergeable r', Mergeable e, Eq e, Show e) =>- (t -> t') ->- (r -> r') ->- (ArithException -> e) ->- (t' -> t' -> ExceptT e Union r') ->- (t -> t -> r) ->- t ->- t ->- IO ()-matches wrapInput wrapOutput wrapError f fref x y = do- rref <-- (mrgPure . wrapOutput <$> evaluate (force (fref x y)))- `catch` \(e :: ArithException) -> return $ mrgThrowError $ wrapError e- let r = f (wrapInput x) (wrapInput y)- assertBool "Is merged" $ isMerged $ runExceptT r- r @?= rref--generalOpTestBase ::- ( NFData r,- Arbitrary t,- Show t,- Eq r',- Show r',- Eq r,- Num t,- Mergeable r',- Mergeable e,- Show e,- Eq e- ) =>- (t -> t') ->- (r -> r') ->- (ArithException -> e) ->- String ->- (t' -> t' -> ExceptT e Union r') ->- (t -> t -> r) ->- Test-generalOpTestBase wrapInput wrapOutput wrapError name f fref =- testGroup- name- [ testProperty "random" $ \x y ->- ioProperty $ matches wrapInput wrapOutput wrapError f fref x y,- testCase "divided by zero" $- matches wrapInput wrapOutput wrapError f fref 1 0- ]--generalOpTest ::- (NFData r, Arbitrary t, Show t, Eq r, Show r, Eq r, Num t, Mergeable r) =>- String ->- (t -> t -> ExceptT ArithException Union r) ->- (t -> t -> r) ->- Test-generalOpTest = generalOpTestBase id id id--opBoundedTestBase ::- ( NFData r,- Arbitrary t,- Show t,- Show r',- Eq r',- Num t,- Bounded t,- Mergeable r',- Mergeable e,- Show e,- Eq e- ) =>- (t -> t') ->- (r -> r') ->- (ArithException -> e) ->- String ->- (t' -> t' -> ExceptT e Union r') ->- (t -> t -> r) ->- Test-opBoundedTestBase wrapInput wrapOutput wrapError name f fref =- testGroup- name- [ testProperty "random" $ \x y ->- ioProperty $ matches wrapInput wrapOutput wrapError f fref x y,- testCase "divided by zero" $- matches wrapInput wrapOutput wrapError f fref 1 0,- testCase "minBound/-1" $- matches wrapInput wrapOutput wrapError f fref minBound (-1)- ]--opBoundedTest ::- ( NFData r,- Arbitrary t,- Show t,- Show r,- Eq r,- Num t,- Bounded t,- Mergeable r- ) =>- String ->- (t -> t -> ExceptT ArithException Union r) ->- (t -> t -> r) ->- Test-opBoundedTest = opBoundedTestBase id id id--type OpTestFunc t =- forall r.- (Eq r, Show r, Eq r, NFData r, Mergeable r) =>- String ->- (t -> t -> ExceptT ArithException Union r) ->- (t -> t -> r) ->- Test--testType ::- forall t.- ( NFData t,- Show t,- SafeDivision ArithException t (ExceptT ArithException Union),- Mergeable t,- Integral t,- Typeable t- ) =>- OpTestFunc t ->- Proxy t ->- Test-testType testFunc p =- testGroup- (show $ typeRep p)- [ testFunc "div" safeDiv (div @t),- testFunc "mod" safeMod (mod @t),- testFunc "divMod" safeDivMod (divMod @t),- testFunc "quot" safeQuot (quot @t),- testFunc "rem" safeRem (rem @t),- testFunc "quotRem" safeQuotRem (quotRem @t)- ]---- type SomeOpTestFunc t t' =--- forall r r'.--- (Eq r, Show r, Eq r, NFData r, Mergeable r) =>--- String ->--- (t' -> t' -> ExceptT ArithException Union r') ->--- (t -> t -> r) ->--- Test------ testSomeType ::--- forall t t'.--- ( NFData t,--- Show t,--- SafeDivision ArithException t' (ExceptT ArithException Union),--- Mergeable t,--- Integral t,--- Typeable t'--- ) =>--- SomeDivTestFunc t t' ->--- SomeDivTestFunc t t' ->--- Proxy t ->--- Proxy t' ->--- Test--- testSomeType divQuotTest modRemTest _ p =--- testGroup--- (show $ typeRep p)--- [ divQuotTest "div" safeDiv (div @t),--- modRemTest "mod" safeMod (mod @t),--- divQuotTest "divMod" safeDivMod (divMod @t),--- divQuotTest "quot" safeQuot (quot @t),--- modRemTest "rem" safeRem (rem @t),--- modRemTest "quotRem" safeQuotRem (quotRem @t)--- ]--safeDivisionTests :: Test-safeDivisionTests =- testGroup- "SafeDivision"- [ testType generalOpTest (Proxy :: Proxy Integer),- testType opBoundedTest (Proxy :: Proxy Int8),- testType opBoundedTest (Proxy :: Proxy Int16),- testType opBoundedTest (Proxy :: Proxy Int32),- testType opBoundedTest (Proxy :: Proxy Int64),- testType opBoundedTest (Proxy :: Proxy Int),- testType opBoundedTest (Proxy :: Proxy (IntN 8)),- testType opBoundedTest (Proxy :: Proxy Word),- testType opBoundedTest (Proxy :: Proxy Word8),- testType opBoundedTest (Proxy :: Proxy Word16),- testType opBoundedTest (Proxy :: Proxy Word32),- testType opBoundedTest (Proxy :: Proxy Word64),- testType opBoundedTest (Proxy :: Proxy (WordN 8)),- testGroup "SomeWordN" $ do- let singleOutputTest =- opBoundedTestBase- SomeWordN- SomeWordN- (\e -> Right e :: Either BitwidthMismatch ArithException)- let doubleOutputTest =- opBoundedTestBase- SomeWordN- (bimap SomeWordN SomeWordN)- (\e -> Right e :: Either BitwidthMismatch ArithException)- [ singleOutputTest "div" safeDiv (div @(WordN 8)),- singleOutputTest "mod" safeMod (mod @(WordN 8)),- doubleOutputTest "divMod" safeDivMod (divMod @(WordN 8)),- singleOutputTest "quot" safeQuot (quot @(WordN 8)),- singleOutputTest "rem" safeRem (rem @(WordN 8)),- doubleOutputTest "quotRem" safeQuotRem (quotRem @(WordN 8)),- testCase "Bitwidth mismatch" $ do- let actual =- safeDiv (bv 10 2) (bv 11 3) ::- ExceptT- (Either BitwidthMismatch ArithException)- Union- SomeWordN- let expected = mrgThrowError $ Left BitwidthMismatch- actual @?= expected- ],- testGroup "SomeIntN" $ do- let singleOutputTest =- opBoundedTestBase- SomeIntN- SomeIntN- (\e -> Right e :: Either BitwidthMismatch ArithException)- let doubleOutputTest =- opBoundedTestBase- SomeIntN- (bimap SomeIntN SomeIntN)- (\e -> Right e :: Either BitwidthMismatch ArithException)- [ singleOutputTest "div" safeDiv (div @(IntN 8)),- singleOutputTest "mod" safeMod (mod @(IntN 8)),- doubleOutputTest "divMod" safeDivMod (divMod @(IntN 8)),- singleOutputTest "quot" safeQuot (quot @(IntN 8)),- singleOutputTest "rem" safeRem (rem @(IntN 8)),- doubleOutputTest "quotRem" safeQuotRem (quotRem @(IntN 8)),- testCase "Bitwidth mismatch" $ do- let actual =- safeDiv (bv 10 2) (bv 11 3) ::- ExceptT- (Either BitwidthMismatch ArithException)- Union- SomeIntN- let expected = mrgThrowError $ Left BitwidthMismatch- actual @?= expected- ]- ]
test/Grisette/Core/Data/Class/SafeLinearArithTests.hs view
@@ -17,10 +17,10 @@ import Data.Word (Word16, Word32, Word64, Word8) import Grisette ( BV (bv),- BitwidthMismatch (BitwidthMismatch), IntN, Mergeable, SafeLinearArith (safeAdd, safeNeg, safeSub),+ SomeBVException (BitwidthMismatch), SomeIntN, SomeWordN, TryMerge,@@ -121,7 +121,6 @@ Bounded a, Arbitrary a, Show a,- Show a, Typeable a ) => Test@@ -142,12 +141,12 @@ safeLinearArithTestSimple @(IntN 128), safeLinearArithTest @(IntN 2) @SomeIntN- @(Either BitwidthMismatch ArithException)+ @(Either SomeBVException ArithException) SomeIntN Right, safeLinearArithTest @(IntN 128) @SomeIntN- @(Either BitwidthMismatch ArithException)+ @(Either SomeBVException ArithException) SomeIntN Right, testCase "SomeIntN different bit width" $ do@@ -155,7 +154,7 @@ let r = bv 3 1 :: SomeIntN let actual = safeAdd l r ::- ExceptT (Either BitwidthMismatch ArithException) Union SomeIntN+ ExceptT (Either SomeBVException ArithException) Union SomeIntN let expected = mrgThrowError $ Left BitwidthMismatch actual @?= expected, safeLinearArithTestSimple @Word,@@ -169,12 +168,12 @@ safeLinearArithTestSimple @(WordN 128), safeLinearArithTest @(WordN 2) @SomeWordN- @(Either BitwidthMismatch ArithException)+ @(Either SomeBVException ArithException) SomeWordN Right, safeLinearArithTest @(WordN 128) @SomeWordN- @(Either BitwidthMismatch ArithException)+ @(Either SomeBVException ArithException) SomeWordN Right, testCase "SomeWordN different bit width" $ do@@ -183,7 +182,7 @@ let actual = safeAdd l r :: ExceptT- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) Union SomeWordN let expected = mrgThrowError $ Left BitwidthMismatch
test/Grisette/Core/Data/Class/SafeSymRotateTests.hs view
@@ -13,7 +13,7 @@ import Control.Monad.Except (ExceptT) import Data.Bits (Bits (rotateL, rotateR), FiniteBits (finiteBitSize)) import Data.Int (Int16, Int32, Int64, Int8)-import Data.Typeable (Proxy (Proxy), Typeable)+import Data.Typeable (Proxy (Proxy)) import Data.Word (Word16, Word32, Word64, Word8) import Grisette ( IntN,@@ -45,14 +45,10 @@ forall proxy a. ( Arbitrary a, Show a,- Num a,- Eq a, SafeSymRotate ArithException a EM, FiniteBits a, Bounded a,- Typeable a,- Integral a,- Mergeable a+ Integral a ) => proxy a -> [Test]@@ -75,14 +71,10 @@ forall proxy a. ( Arbitrary a, Show a,- Num a,- Eq a, SafeSymRotate ArithException a EM, FiniteBits a, Bounded a,- Typeable a,- Integral a,- Mergeable a+ Integral a ) => proxy a -> [Test]@@ -105,13 +97,10 @@ Eq s, SafeSymRotate ArithException s EM, FiniteBits c,- FiniteBits s, Bounded c,- Typeable s, Integral c, LinkedRep c s,- Solvable c s,- Mergeable s+ Solvable c s ) => proxy s -> [Test]@@ -138,13 +127,10 @@ Eq s, SafeSymRotate ArithException s EM, FiniteBits c,- FiniteBits s, Bounded c,- Typeable s, Integral c, LinkedRep c s,- Solvable c s,- Mergeable s+ Solvable c s ) => proxy s -> [Test]
test/Grisette/Core/Data/Class/SafeSymShiftTests.hs view
@@ -10,7 +10,7 @@ import Control.Monad.Except (ExceptT) import Data.Bits (Bits (shiftL, shiftR), FiniteBits (finiteBitSize)) import Data.Int (Int16, Int32, Int64, Int8)-import Data.Typeable (Proxy (Proxy), Typeable)+import Data.Typeable (Proxy (Proxy)) import Data.Word (Word16, Word32, Word64, Word8) import Grisette ( IntN,@@ -48,13 +48,9 @@ ( Arbitrary a, Show a, Num a,- Eq a, SafeSymShift ArithException a EM, FiniteBits a,- Bounded a,- Typeable a,- Integral a,- Mergeable a+ Bounded a ) => proxy a -> [Test]@@ -91,13 +87,9 @@ ( Arbitrary a, Show a, Num a,- Eq a, SafeSymShift ArithException a EM, FiniteBits a,- Bounded a,- Typeable a,- Integral a,- Mergeable a+ Bounded a ) => proxy a -> [Test]@@ -119,16 +111,12 @@ ( Arbitrary c, Show s, Num s,- Eq s, SafeSymShift ArithException s EM, FiniteBits c, FiniteBits s, Bounded c,- Typeable s,- Integral c, LinkedRep c s,- Solvable c s,- Mergeable s+ Solvable c s ) => proxy s -> [Test]@@ -165,16 +153,13 @@ ( Arbitrary c, Show s, Num s,- Eq s, SafeSymShift ArithException s EM, FiniteBits c, FiniteBits s, Bounded c,- Typeable s, Integral c, LinkedRep c s,- Solvable c s,- Mergeable s+ Solvable c s ) => proxy s -> [Test]
+ test/Grisette/Core/Data/Class/SymFiniteBitsTests.hs view
@@ -0,0 +1,162 @@+{-# LANGUAGE BinaryLiterals #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}++module Grisette.Core.Data.Class.SymFiniteBitsTests (symFiniteBitsTests) where++import Data.Proxy (Proxy (Proxy))+import Grisette+ ( BV (bv),+ EvalSym,+ ITEOp (symIte),+ LogicalOp (false, true),+ SomeSymIntN,+ SomeSymWordN,+ SymEq,+ SymIntN,+ SymInteger,+ SymWordN,+ )+import Grisette.Internal.Core.Data.Class.SymFiniteBits+ ( SymFiniteBits (symFromBits, symSetBitTo, symTestBit),+ symBitBlast,+ symCountLeadingZeros,+ symCountTrailingZeros,+ symLsb,+ symMsb,+ symPopCount,+ )+import Grisette.TestUtil.SymbolicAssertion ((.@?=))+import Test.Framework (Test, testGroup)+import Test.Framework.Providers.HUnit (testCase)+import Test.HUnit ((@?=))+import Type.Reflection (Typeable, typeRep)++someBVSymFiniteBitsTest ::+ forall p bv.+ ( Typeable bv,+ BV bv,+ SymFiniteBits bv,+ Show bv,+ SymEq bv,+ EvalSym bv+ ) =>+ p bv ->+ Test+someBVSymFiniteBitsTest _ =+ testGroup+ (show $ typeRep @bv)+ [ testCase "symTestBit" $ do+ let a = bv 4 0b0101 :: bv+ symTestBit a 0 @?= true+ symTestBit a 1 @?= false+ symTestBit a 2 @?= true+ symTestBit a 3 @?= false,+ testCase "symSetBitTo" $ do+ let a = bv 4 0b0101 :: bv+ symSetBitTo a 0 "b" .@?= symIte "b" (bv 4 0b0101) (bv 4 0b0100)+ symSetBitTo a 1 "b" .@?= symIte "b" (bv 4 0b0111) (bv 4 0b0101),+ testCase "symFromBits" $ do+ let actual = symFromBits ["a", "b", true, false] :: bv+ let expected =+ symIte+ "a"+ (symIte "b" (bv 4 0b0111) (bv 4 0b0101))+ (symIte "b" (bv 4 0b0110) (bv 4 0b0100))+ actual .@?= expected,+ testCase "symBitBlast" $ do+ symBitBlast (bv 4 0b0101 :: bv) @?= [true, false, true, false],+ testCase "symLsb" $ do+ symLsb (bv 4 0b0101 :: bv) @?= true+ symLsb (bv 4 0b0100 :: bv) @?= false,+ testCase "symMsb" $ do+ symMsb (bv 4 0b0101 :: bv) @?= false+ symMsb (bv 4 0b1101 :: bv) @?= true,+ testCase "symPopCount" $ do+ symPopCount (bv 4 0 :: bv) @?= (0 :: SymInteger)+ symPopCount (bv 4 0b0101 :: bv) @?= (2 :: SymInteger)+ symPopCount (bv 4 0b1101 :: bv) @?= (3 :: SymInteger)+ symPopCount (bv 4 0b1111 :: bv) @?= (4 :: SymInteger),+ testCase "symCountLeadingZeros" $ do+ symCountLeadingZeros (bv 4 0 :: bv) @?= (4 :: SymInteger)+ symCountLeadingZeros (bv 4 0b0101 :: bv) @?= (1 :: SymInteger)+ symCountLeadingZeros (bv 4 0b1101 :: bv) @?= (0 :: SymInteger)+ symCountLeadingZeros (bv 4 0b0011 :: bv) @?= (2 :: SymInteger),+ testCase "symCountTrailingZeros" $ do+ symCountTrailingZeros (bv 4 0 :: bv) @?= (4 :: SymInteger)+ symCountTrailingZeros (bv 4 0b1010 :: bv) @?= (1 :: SymInteger)+ symCountTrailingZeros (bv 4 0b1011 :: bv) @?= (0 :: SymInteger)+ symCountTrailingZeros (bv 4 0b1100 :: bv) @?= (2 :: SymInteger)+ ]++bvSymFiniteBitsTest ::+ forall p bv.+ ( Num (bv 4),+ Typeable bv,+ SymFiniteBits (bv 4),+ Show (bv 4),+ SymEq (bv 4),+ EvalSym (bv 4)+ ) =>+ p bv ->+ Test+bvSymFiniteBitsTest _ =+ testGroup+ (show $ typeRep @bv)+ [ testCase "symTestBit" $ do+ let a = 5 :: bv 4+ symTestBit a 0 @?= true+ symTestBit a 1 @?= false+ symTestBit a 2 @?= true+ symTestBit a 3 @?= false,+ testCase "symSetBitTo" $ do+ let a = 5 :: bv 4+ symSetBitTo a 0 "b" .@?= symIte "b" 0b0101 0b0100+ symSetBitTo a 1 "b" .@?= symIte "b" 0b0111 0b0101,+ testCase "symFromBits" $ do+ let actual = symFromBits ["a", "b", true, false] :: bv 4+ let expected =+ symIte+ "a"+ (symIte "b" 0b0111 0b0101)+ (symIte "b" 0b0110 0b0100)+ actual .@?= expected,+ testCase "symBitBlast" $ do+ symBitBlast (0b0101 :: bv 4) @?= [true, false, true, false],+ testCase "symLsb" $ do+ symLsb (0b0101 :: bv 4) @?= true+ symLsb (0b0100 :: bv 4) @?= false,+ testCase "symMsb" $ do+ symMsb (0b0101 :: bv 4) @?= false+ symMsb (0b1101 :: bv 4) @?= true,+ testCase "symPopCount" $ do+ symPopCount (0 :: bv 4) @?= (0 :: SymInteger)+ symPopCount (0b0101 :: bv 4) @?= (2 :: SymInteger)+ symPopCount (0b1101 :: bv 4) @?= (3 :: SymInteger)+ symPopCount (0b1111 :: bv 4) @?= (4 :: SymInteger),+ testCase "symCountLeadingZeros" $ do+ symCountLeadingZeros (0 :: bv 4) @?= (4 :: SymInteger)+ symCountLeadingZeros (0b0101 :: bv 4) @?= (1 :: SymInteger)+ symCountLeadingZeros (0b1101 :: bv 4) @?= (0 :: SymInteger)+ symCountLeadingZeros (0b0011 :: bv 4) @?= (2 :: SymInteger),+ testCase "symCountTrailingZeros" $ do+ symCountTrailingZeros (0 :: bv 4) @?= (4 :: SymInteger)+ symCountTrailingZeros (0b1010 :: bv 4) @?= (1 :: SymInteger)+ symCountTrailingZeros (0b1011 :: bv 4) @?= (0 :: SymInteger)+ symCountTrailingZeros (0b1100 :: bv 4) @?= (2 :: SymInteger)+ ]++symFiniteBitsTests :: Test+symFiniteBitsTests =+ testGroup+ "SymFiniteBits"+ [ testGroup+ "SymFiniteBits"+ [ someBVSymFiniteBitsTest (Proxy @SomeSymWordN),+ someBVSymFiniteBitsTest (Proxy @SomeSymIntN),+ bvSymFiniteBitsTest (Proxy @SymWordN),+ bvSymFiniteBitsTest (Proxy @SymIntN)+ ]+ ]
test/Grisette/Core/Data/Class/SymOrdTests.hs view
@@ -56,7 +56,7 @@ symCompare i j @?= (mrgReturn $ compare i j :: Union Ordering) symbolicProdOrdOkProp ::- (HasCallStack, Show v, Show vl, Show vr, SymOrd v, SymOrd vl, SymOrd vr) =>+ (HasCallStack, SymOrd v, SymOrd vl, SymOrd vr) => v -> v -> vl ->
test/Grisette/Core/Data/Class/SymRotateTests.hs view
@@ -51,8 +51,6 @@ forall proxy a. ( Arbitrary a, Show a,- Num a,- Eq a, SymRotate a, FiniteBits a, Bounded a,@@ -85,8 +83,6 @@ forall proxy a. ( Arbitrary a, Show a,- Num a,- Eq a, SymRotate a, FiniteBits a, Bounded a,@@ -124,11 +120,9 @@ ( Arbitrary c, Show s, Num s,- Eq s, SymRotate c, SymRotate s, FiniteBits c,- FiniteBits s, Bounded c, Typeable s, Integral c,
test/Grisette/Core/Data/Class/SymShiftTests.hs view
@@ -26,12 +26,10 @@ ( Arbitrary a, Show a, Num a,- Eq a, SymShift a, FiniteBits a, Bounded a,- Typeable a,- Integral a+ Typeable a ) => proxy a -> Test@@ -61,8 +59,6 @@ forall proxy a. ( Arbitrary a, Show a,- Num a,- Eq a, SymShift a, FiniteBits a, Bounded a,@@ -114,11 +110,9 @@ ( Arbitrary c, Show s, Num s,- Eq s, SymShift c, SymShift s, FiniteBits c,- FiniteBits s, Bounded c, Typeable s, Integral c,
test/Grisette/Core/Data/Class/TestValues.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE DataKinds #-}+ module Grisette.Core.Data.Class.TestValues ( conBool, symTrue,@@ -14,6 +16,7 @@ Solvable (con, isym, ssym), SymBool, Symbol (IndexedSymbol, SimpleSymbol),+ TypedAnySymbol, TypedSymbol (TypedSymbol), ) @@ -32,8 +35,8 @@ isymBool :: Identifier -> Int -> SymBool isymBool = isym -ssymbolBool :: Identifier -> TypedSymbol Bool+ssymbolBool :: Identifier -> TypedAnySymbol Bool ssymbolBool = TypedSymbol . SimpleSymbol -isymbolBool :: Identifier -> Int -> TypedSymbol Bool+isymbolBool :: Identifier -> Int -> TypedAnySymbol Bool isymbolBool i idx = TypedSymbol $ IndexedSymbol i idx
test/Grisette/Core/Data/Class/ToSymTests.hs view
@@ -24,6 +24,7 @@ import Grisette ( ITEOp (symIte), LogicalOp (symNot, (.&&), (.||)),+ Mergeable, Solvable (con, isym, ssym), SymBool, SymEq ((.==)),@@ -35,7 +36,8 @@ import Test.HUnit (Assertion, (@?=)) import Test.QuickCheck (ioProperty) -toSymForConcreteOkProp :: (HasCallStack, Show v, Eq v) => v -> Assertion+toSymForConcreteOkProp ::+ (HasCallStack, Show v, Eq v, Mergeable v) => v -> Assertion toSymForConcreteOkProp v = toSym v @?= v toSymTests :: Test
test/Grisette/Core/TH/DerivationTest.hs view
@@ -17,6 +17,7 @@ module Grisette.Core.TH.DerivationTest (concreteT, symbolicT) where +import Control.Monad.Identity (Identity (Identity)) import Data.Maybe (fromJust) import Grisette ( Default (Default),@@ -34,7 +35,8 @@ deriveAll ''T concreteT :: T 'Con 10 Integer-concreteT = toSym (T True [10] [10 :: Integer] TNil :: T 'Con 10 Integer)+concreteT =+ toSym (T True [10] [10 :: Integer] (Identity TNil) :: T 'Con 10 Integer) symbolicT :: T 'Sym 10 SymInteger symbolicT = fromJust $ toCon (toSym concreteT :: T 'Sym 10 SymInteger)@@ -42,3 +44,12 @@ newtype X mode = X [GetBool mode] deriveAll ''X++data IdenticalFields mode n = IdenticalFields+ { a :: n,+ b :: n,+ c :: Maybe Int,+ d :: Maybe Int+ }++deriveAll ''IdenticalFields
test/Grisette/Lib/Control/Monad/Trans/State/Common.hs view
@@ -209,7 +209,7 @@ actual @?=~ expected mrgGetTest ::- (MonadUnion (stateT SymBool Union), Monad (stateT SymBool Union)) =>+ (MonadUnion (stateT SymBool Union)) => StateConstructor stateT SymBool SymBool -> RunStateFunc stateT SymBool SymBool -> GetFunc stateT SymBool SymBool ->@@ -233,7 +233,7 @@ actual @?=~ expected mrgPutTest ::- (MonadUnion (stateT SymBool Union), Monad (stateT SymBool Union)) =>+ (MonadUnion (stateT SymBool Union)) => StateConstructor stateT SymBool SymBool -> RunStateFunc stateT SymBool () -> PutFunc stateT SymBool SymBool ->@@ -250,7 +250,7 @@ actual @?=~ expected mrgModifyTest ::- (MonadUnion (stateT SymBool Union), Monad (stateT SymBool Union)) =>+ (MonadUnion (stateT SymBool Union)) => StateConstructor stateT SymBool SymBool -> RunStateFunc stateT SymBool () -> ModifyFunc stateT SymBool SymBool ->@@ -274,7 +274,7 @@ actual @?=~ expected mrgGetsTest ::- (MonadUnion (stateT SymBool Union), Monad (stateT SymBool Union)) =>+ (MonadUnion (stateT SymBool Union)) => StateConstructor stateT SymBool SymBool -> RunStateFunc stateT SymBool SymBool -> GetsFunc stateT SymBool SymBool ->
test/Grisette/Lib/Control/MonadTests.hs view
@@ -260,7 +260,7 @@ mrgIf (a .== 0 .&& b .== 0) (return []) $ mrgIf (a .== 0 .|| b .== 0)- (return [symIte (a .== 0) b a])+ (return [symIte (a ./= 0) a b]) (return [a, b]) :: Union [SymInteger] actual @?= expected
test/Grisette/Lib/Data/ListTests.hs view
@@ -271,7 +271,7 @@ Union (Maybe [SymInteger]) let expected = mrgIf- (symNot ((aint .== cint) .&& (bint .== dint)))+ ((aint ./= cint) .|| (bint ./= dint)) (return Nothing) (return $ Just [eint]) actual @?= expected@@ -405,9 +405,9 @@ let actual = mrgFilter (.== 0) [aint, bint] :: Union [SymInteger] let expected =- mrgIf (symNot $ aint .== 0 .|| bint .== 0) (return []) $+ mrgIf (aint ./= 0 .&& bint ./= 0) (return []) $ mrgIf- (symNot $ aint .== 0 .&& bint .== 0)+ (aint ./= 0 .|| bint ./= 0) (return [symIte (aint .== 0) aint bint]) (return [aint, bint]) actual @?= expected@@ -427,10 +427,10 @@ Union ([SymInteger], [SymInteger]) let expected = mrgIf- (symNot $ aint .== 0 .|| bint .== 0)+ (aint ./= 0 .&& bint ./= 0) (return ([], [aint, bint])) $ mrgIf- (symNot $ aint .== 0 .&& bint .== 0)+ (aint ./= 0 .|| bint ./= 0) ( return ( [symIte (aint .== 0) aint bint], [symIte (aint .== 0) bint aint]@@ -453,7 +453,7 @@ [aint, bint, cint] .!? dint :: Union (Maybe SymInteger) let expected = mrgIf- (symNot (dint .== 0 .|| dint .== 1 .|| dint .== 2))+ (dint ./= 0 .&& dint ./= 1 .&& dint ./= 2) (return Nothing) ( return $ Just $@@ -475,7 +475,7 @@ Union (Maybe SymInteger) let expected = mrgIf- (symNot $ aint .== bint .|| aint .== cint .|| aint .== dint)+ (aint ./= bint .&& aint ./= cint .&& aint ./= dint) (mrgPure Nothing) ( mrgPure $ Just $@@ -504,7 +504,7 @@ Union (Maybe SymInteger) let expected = mrgIf- (symNot $ aint .== 0 .|| bint .== 0 .|| cint .== 0)+ (aint ./= 0 .&& bint ./= 0 .&& cint ./= 0) (mrgPure Nothing) ( mrgPure $ Just $@@ -638,12 +638,11 @@ Union [SymInteger] let expected = mrgIf- ( symNot $- aint .== bint .&& aint .== cint .&& aint .== dint+ ( aint ./= bint .|| aint ./= cint .|| aint ./= dint ) ( return- [ symIte (aint .== bint) bint cint,- symIte (aint .== bint .&& aint .== cint) cint dint+ [ symIte (aint ./= bint) cint bint,+ symIte (aint ./= bint .|| aint ./= cint) dint cint ] ) (return [bint, cint, dint])
+ test/Grisette/SymPrim/AlgRealTests.hs view
@@ -0,0 +1,105 @@+{-# HLINT ignore "Unused LANGUAGE pragma" #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++module Grisette.SymPrim.AlgRealTests (algRealTests) where++import Control.DeepSeq (NFData, force)+import Control.Exception (ArithException, evaluate, try)+import Grisette.Internal.SymPrim.AlgReal (AlgReal)+import Test.Framework (Test, testGroup)+import Test.Framework.Providers.HUnit (testCase)+import Test.Framework.Providers.QuickCheck2 (testProperty)+import Test.HUnit (assertBool, (@?=))+import Test.QuickCheck (ioProperty)++unaryOpComplianceWithRational ::+ (NFData a, NFData b) =>+ String ->+ (AlgReal -> a) ->+ (Rational -> b) ->+ (a -> b -> Bool) ->+ Test+unaryOpComplianceWithRational name algRealOp rationalOp cmp =+ testProperty name $ \x -> ioProperty $ do+ actual <- try $ evaluate $ force $ algRealOp (fromRational x)+ expected <- try $ evaluate $ force $ rationalOp x+ case (actual, expected) of+ (Left (ea :: ArithException), Left ee) -> ea @?= ee+ (Right a, Right e) -> assertBool "Not compliant" $ cmp a e+ _ -> assertBool "Not compliant" False++binOpComplianceWithRational ::+ (NFData a, NFData b) =>+ String ->+ (AlgReal -> AlgReal -> a) ->+ (Rational -> Rational -> b) ->+ (a -> b -> Bool) ->+ Test+binOpComplianceWithRational name algRealOp rationalOp cmp =+ testProperty name $ \x y -> ioProperty $ do+ actual <-+ try $ evaluate $ force $ algRealOp (fromRational x) (fromRational y)+ expected <- try $ evaluate $ force $ rationalOp x y+ case (actual, expected) of+ (Left (ea :: ArithException), Left ee) -> ea @?= ee+ (Right a, Right e) -> assertBool "Not compliant" $ cmp a e+ _ -> assertBool "Not compliant" False++eqAlgRealRational :: AlgReal -> Rational -> Bool+eqAlgRealRational l r = l == fromRational r++algRealTests :: Test+algRealTests =+ testGroup+ "AlgReal"+ [ testGroup+ "Eq"+ [ binOpComplianceWithRational "==" (==) (==) (==),+ binOpComplianceWithRational "/=" (/=) (/=) (==)+ ],+ testGroup+ "Ord"+ [ binOpComplianceWithRational "<" (<) (<) (==),+ binOpComplianceWithRational "<=" (<=) (<=) (==),+ binOpComplianceWithRational ">" (>) (>) (==),+ binOpComplianceWithRational ">=" (>=) (>=) (==)+ ],+ testGroup+ "Num"+ [ binOpComplianceWithRational "+" (+) (+) eqAlgRealRational,+ binOpComplianceWithRational "*" (*) (*) eqAlgRealRational,+ binOpComplianceWithRational "-" (-) (-) eqAlgRealRational,+ unaryOpComplianceWithRational+ "negate"+ negate+ negate+ eqAlgRealRational,+ unaryOpComplianceWithRational "abs" abs abs eqAlgRealRational,+ unaryOpComplianceWithRational+ "signum"+ signum+ signum+ eqAlgRealRational,+ testProperty "fromInteger" $ \x ->+ let actual = fromInteger x+ expected = fromRational $ toRational x+ in eqAlgRealRational actual expected+ ],+ testCase "Lift" $ do+ let x = 1 :: AlgReal+ $$([||x||]) @?= x,+ testGroup+ "Fractional"+ [ binOpComplianceWithRational "/" (/) (/) eqAlgRealRational,+ unaryOpComplianceWithRational+ "recip"+ recip+ recip+ eqAlgRealRational,+ testProperty "fromRational" $ \x ->+ let actual = fromRational x+ in eqAlgRealRational actual x+ ]+ ]
test/Grisette/SymPrim/BVTests.hs view
@@ -124,7 +124,15 @@ 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) =>+ ( Arbitrary ref,+ Typeable ref,+ Typeable typ,+ Show ref,+ FiniteBits ref,+ FiniteBits typ,+ Integral ref,+ Integral typ+ ) => Proxy ref -> Proxy typ -> Int ->@@ -180,8 +188,6 @@ ( Arbitrary ref, Typeable ref, Typeable typ,- Eq ref,- Eq typ, Show ref, Show typ, NFData typ,@@ -246,7 +252,7 @@ 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) =>+ (Arbitrary a, Eq b, Num a, Show a, Bounded a, Show b, NFData b, NFData a) => TestName -> (a -> b) -> (a -> a -> a) ->@@ -268,7 +274,7 @@ 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) =>+ (Arbitrary a, Eq b, Num a, NFData a, Show a, Bounded a, Show b, NFData b) => TestName -> (a -> b) -> (a -> a -> (a, a)) ->@@ -290,7 +296,7 @@ realConformTest :: forall proxy ref typ.- (Typeable ref, Typeable typ, Integral ref, Num typ, Arbitrary ref, Real typ, Show ref) =>+ (Typeable ref, Typeable typ, Integral ref, Arbitrary ref, Real typ, Show ref) => proxy ref -> proxy typ -> Test@@ -305,18 +311,11 @@ ( 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 ) =>
test/Grisette/SymPrim/FPTests.hs view
@@ -1,26 +1,77 @@+{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE DataKinds #-}+{-# HLINT ignore "Unused LANGUAGE pragma" #-}+{-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE KindSignatures #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} -{-# HLINT ignore "Unused LANGUAGE pragma" #-}- module Grisette.SymPrim.FPTests (fpTests) where +import Data.Foldable (traverse_)+import Data.Kind (Type)+import Data.Ratio ((%))+import Data.SBV (SMTResult (Satisfiable, Unsatisfiable))+import qualified Data.SBV as SBV import Data.Word (Word32, Word64)-import Grisette (WordN)+import GHC.TypeLits (KnownNat, Nat, type (<=))+import Grisette+ ( AlgReal (AlgExactRational),+ FP,+ FPRoundingMode (RTP),+ IEEEFPConstants+ ( fpMaxNormalized,+ fpMaxSubnormal,+ fpMinNormalized,+ fpMinSubnormal+ ),+ IEEEFPOp+ ( fpAbs,+ fpMaximum,+ fpMaximumNumber,+ fpMinimum,+ fpMinimumNumber,+ fpNeg,+ fpRem+ ),+ IEEEFPRoundingMode (rna, rne, rtn, rtp, rtz),+ IEEEFPRoundingOp+ ( fpAdd,+ fpDiv,+ fpFMA,+ fpMul,+ fpRoundToIntegral,+ fpSqrt,+ fpSub+ ),+ WordN,+ bitCastOrCanonical,+ ) import Grisette.Internal.Core.Data.Class.BitCast (BitCast (bitCast)) import Grisette.Internal.Core.Data.Class.IEEEFP- ( IEEEConstants+ ( IEEEFPConstants ( fpNaN, fpNegativeInfinite, fpNegativeZero, fpPositiveInfinite, fpPositiveZero ),- SymIEEEFPTraits+ IEEEFPConvertible (fromFPOr, toFP),+ fpIsNaN,+ fpIsNegativeInfinite,+ fpIsNegativeZero,+ fpIsPositiveInfinite,+ fpIsPositiveZero,+ )+import Grisette.Internal.Core.Data.Class.SafeFromFP (SafeFromFP (safeFromFP))+import Grisette.Internal.Core.Data.Class.SymIEEEFP+ ( SymIEEEFPTraits ( symFpIsInfinite, symFpIsNaN, symFpIsNegative,@@ -34,26 +85,36 @@ symFpIsSubnormal, symFpIsZero ),- fpIsNaN,- fpIsNegativeInfinite,- fpIsNegativeZero,- fpIsPositiveInfinite,- fpIsPositiveZero, )-import Grisette.Internal.SymPrim.FP (FP32)+import Grisette.Internal.SymPrim.BV (IntN)+import Grisette.Internal.SymPrim.FP+ ( ConvertibleBound (convertibleLowerBound, convertibleUpperBound),+ FP32,+ NotRepresentableFPError,+ ValidFP,+ nextFP,+ prevFP,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Instances.PEvalIEEEFPConvertibleTerm+ ( genericFPCast,+ )+import Grisette.Internal.SymPrim.Prim.Internal.Term+ ( SupportedPrim (conSBVTerm),+ ) import Test.Framework (Test, testGroup) import Test.Framework.Providers.HUnit (testCase) import Test.Framework.Providers.QuickCheck2 (testProperty) import Test.HUnit (assertBool, (@?=))-import Test.QuickCheck (ioProperty)+import Test.QuickCheck (Arbitrary, ioProperty)+import Type.Reflection (Typeable, typeRep) sameFP :: forall a b. (RealFloat a, RealFloat b) => a -> b -> Bool sameFP x y | isNaN x && isNaN y = True | isInfinite x && isInfinite y = (x < 0 && y < 0) || (x > 0 && y > 0)- | otherwise =- (uncurry encodeFloat (decodeFloat x) :: b) == y+ -- \| GHC's floating point support doesn't conform to IEEE754.+ | otherwise = (uncurry encodeFloat (decodeFloat x) :: b) == y fp32ConversionTest :: (Word32 -> IO ()) -> [Test] fp32ConversionTest testFun =@@ -83,7 +144,7 @@ Test unaryOpComplianceWithFloat name fpOp floatOp cmp = testProperty name $ \x ->- let x' = bitCast x+ let x' = bitCastOrCanonical x actual = fpOp x expected = floatOp x' in cmp actual expected@@ -96,8 +157,8 @@ Test binOpComplianceWithFloat name fpOp floatOp cmp = testProperty name $ \x y ->- let x' = bitCast x- y' = bitCast y+ let x' = bitCastOrCanonical x+ y' = bitCastOrCanonical y actual = fpOp x y expected = floatOp x' y' in cmp actual expected@@ -119,8 +180,8 @@ let regulated = if isNaN fp then 0x7fc00000- else bitCast fp :: WordN 32- let actual = bitCast (bitCast regulated :: FP32)+ else bitCastOrCanonical fp :: WordN 32+ let actual = bitCastOrCanonical (bitCast regulated :: FP32) actual @?= regulated ], testGroup@@ -196,12 +257,12 @@ -- significand is not compliant with Float -- unaryOpComplianceWithFloat "significand" significand significand sameFP testProperty "scaleFloat" $ \i (x :: FP32) ->- let x' = bitCast x :: Float+ let x' = bitCastOrCanonical x :: Float actual = scaleFloat i x expected = scaleFloat i x' in sameFP actual expected, testProperty "isNaN" $ \(x :: FP32) ->- let x' = bitCast x :: Float+ let x' = bitCastOrCanonical x :: Float in isNaN x == isNaN x', unaryOpComplianceWithFloat "isInfinite" isInfinite isInfinite (==), unaryOpComplianceWithFloat@@ -274,7 +335,7 @@ (==) ], testGroup- "IEEEConstants"+ "IEEEFPConstants" [ testCase "fpPositiveInfinite" $ fpIsPositiveInfinite (fpPositiveInfinite :: FP32) @?= True, testCase "fpNegativeInfinite" $@@ -284,6 +345,814 @@ testCase "fpPositiveZero" $ fpIsPositiveZero (fpPositiveZero :: FP32) @?= True, testCase "fpNegativeZero" $- fpIsNegativeZero (fpNegativeZero :: FP32) @?= True- ]+ fpIsNegativeZero (fpNegativeZero :: FP32) @?= True,+ testCase "fpMinNormalized" $+ fpMinNormalized @?= (1.5625e-2 :: FP 4 4),+ testCase "fpMaxNormalized" $+ fpMaxNormalized @?= (2.4e2 :: FP 4 4),+ testCase "fpMinSubnormal" $+ fpMinSubnormal @?= (1.953125e-3 :: FP 4 4),+ testCase "fpMaxSubnormal" $+ fpMaxSubnormal @?= (1.3671875e-2 :: FP 4 4)+ ],+ testGroup+ "IEEEFPOp"+ [ testCase "fpAbs" $ do+ SameFPObj (fpAbs (0 :: FP32)) @?= 0+ SameFPObj (fpAbs (fpNegativeZero :: FP32)) @?= 0+ SameFPObj (fpAbs (fpPositiveInfinite :: FP32))+ @?= fpPositiveInfinite+ SameFPObj (fpAbs (fpNegativeInfinite :: FP32))+ @?= fpPositiveInfinite+ SameFPObj (fpAbs (1 :: FP32)) @?= 1+ SameFPObj (fpAbs (-1 :: FP32)) @?= 1+ SameFPObj (fpAbs (fpNaN :: FP32)) @?= fpNaN,+ testCase "fpNeg" $ do+ SameFPObj (fpNeg (0 :: FP32)) @?= -0+ SameFPObj (fpNeg (fpNegativeZero :: FP32)) @?= 0+ SameFPObj (fpNeg (fpPositiveInfinite :: FP32))+ @?= fpNegativeInfinite+ SameFPObj (fpNeg (fpNegativeInfinite :: FP32))+ @?= fpPositiveInfinite+ SameFPObj (fpNeg (1 :: FP32)) @?= -1+ SameFPObj (fpNeg (-1 :: FP32)) @?= 1+ SameFPObj (fpNeg (fpNaN :: FP32)) @?= fpNaN,+ testGroup+ "fpRem"+ [ testCase "inf or nan / x" $ do+ let lhs =+ [fpPositiveInfinite :: FP32, fpNegativeInfinite, fpNaN]+ let rhs =+ [ 0,+ -0,+ 1,+ -1,+ fpPositiveInfinite,+ fpNegativeInfinite,+ fpNaN+ ]+ traverse_ (\(l, r) -> SameFPObj (fpRem l r) @?= fpNaN) $+ zip lhs rhs,+ testCase "0 / neither 0 nor nan" $ do+ let lhs = [fpPositiveZero :: FP32, fpNegativeZero]+ let rhs =+ [1, -1, fpPositiveInfinite, fpNegativeInfinite]+ traverse_ (\(l, r) -> SameFPObj (fpRem l r) @?= SameFPObj l) $+ [(l, r) | l <- lhs, r <- rhs],+ testCase "0 / 0 or nan" $ do+ let lhs = [fpPositiveZero :: FP32, fpNegativeZero]+ let rhs = [fpPositiveZero, fpNegativeZero, fpNaN]+ traverse_ (\(l, r) -> SameFPObj (fpRem l r) @?= fpNaN) $+ [(l, r) | l <- lhs, r <- rhs],+ testCase "normal" $ do+ SameFPObj (fpRem (5 :: FP32) 4) @?= 1+ SameFPObj (fpRem (6 :: FP32) 4) @?= -2+ SameFPObj (fpRem (7 :: FP32) 4) @?= -1+ SameFPObj (fpRem (8 :: FP32) 4) @?= 0+ SameFPObj (fpRem (9 :: FP32) 4) @?= 1+ SameFPObj (fpRem (10 :: FP32) 4) @?= 2+ ],+ testCase "fpMinimum" $ do+ SameFPObj (fpMinimum (0 :: FP32) 0) @?= 0+ SameFPObj (fpMinimum (0 :: FP32) (-0)) @?= -0+ SameFPObj (fpMinimum (-0 :: FP32) 0) @?= -0+ SameFPObj (fpMinimum (-0 :: FP32) (-0)) @?= -0+ SameFPObj (fpMinimum (fpNaN :: FP32) fpNaN) @?= fpNaN+ SameFPObj (fpMinimum (fpNaN :: FP32) 1) @?= fpNaN+ SameFPObj (fpMinimum (1 :: FP32) fpNaN) @?= fpNaN+ SameFPObj (fpMinimum (fpNaN :: FP32) fpPositiveInfinite) @?= fpNaN+ SameFPObj (fpMinimum (fpNegativeInfinite :: FP32) fpNaN) @?= fpNaN+ SameFPObj (fpMinimum (1 :: FP32) 2) @?= 1,+ testCase "fpMinimumNumber" $ do+ SameFPObj (fpMinimumNumber (0 :: FP32) 0) @?= 0+ SameFPObj (fpMinimumNumber (0 :: FP32) (-0)) @?= -0+ SameFPObj (fpMinimumNumber (-0 :: FP32) 0) @?= -0+ SameFPObj (fpMinimumNumber (-0 :: FP32) (-0)) @?= -0+ SameFPObj (fpMinimumNumber (fpNaN :: FP32) fpNaN) @?= fpNaN+ SameFPObj (fpMinimumNumber (fpNaN :: FP32) 1) @?= 1+ SameFPObj (fpMinimumNumber (1 :: FP32) fpNaN) @?= 1+ SameFPObj (fpMinimumNumber (fpNaN :: FP32) fpPositiveInfinite)+ @?= fpPositiveInfinite+ SameFPObj (fpMinimumNumber (fpNegativeInfinite :: FP32) fpNaN)+ @?= fpNegativeInfinite+ SameFPObj (fpMinimumNumber (1 :: FP32) 2) @?= 1,+ testCase "fpMaximum" $ do+ SameFPObj (fpMaximum (0 :: FP32) 0) @?= 0+ SameFPObj (fpMaximum (0 :: FP32) (-0)) @?= 0+ SameFPObj (fpMaximum (-0 :: FP32) 0) @?= 0+ SameFPObj (fpMaximum (-0 :: FP32) (-0)) @?= -0+ SameFPObj (fpMaximum (fpNaN :: FP32) fpNaN) @?= fpNaN+ SameFPObj (fpMaximum (fpNaN :: FP32) 1) @?= fpNaN+ SameFPObj (fpMaximum (1 :: FP32) fpNaN) @?= fpNaN+ SameFPObj (fpMaximum (fpNaN :: FP32) fpPositiveInfinite) @?= fpNaN+ SameFPObj (fpMaximum (fpNegativeInfinite :: FP32) fpNaN) @?= fpNaN+ SameFPObj (fpMaximum (1 :: FP32) 2) @?= 2,+ testCase "fpMaximumNumber" $ do+ SameFPObj (fpMaximumNumber (0 :: FP32) 0) @?= 0+ SameFPObj (fpMaximumNumber (0 :: FP32) (-0)) @?= 0+ SameFPObj (fpMaximumNumber (-0 :: FP32) 0) @?= 0+ SameFPObj (fpMaximumNumber (-0 :: FP32) (-0)) @?= -0+ SameFPObj (fpMaximumNumber (fpNaN :: FP32) fpNaN) @?= fpNaN+ SameFPObj (fpMaximumNumber (fpNaN :: FP32) 1) @?= 1+ SameFPObj (fpMaximumNumber (1 :: FP32) fpNaN) @?= 1+ SameFPObj (fpMaximumNumber (fpNaN :: FP32) fpPositiveInfinite)+ @?= fpPositiveInfinite+ SameFPObj (fpMaximumNumber (fpNegativeInfinite :: FP32) fpNaN)+ @?= fpNegativeInfinite+ SameFPObj (fpMaximumNumber (1 :: FP32) 2) @?= 2+ ],+ testGroup+ "IEEEFPRoundingOp"+ [ testCase "unop nan" $ do+ let op = [fpRoundToIntegral, fpSqrt]+ let roundingMode = [rne, rna, rtz, rtn, rtp]+ traverse_ (\(o, rd) -> SameFPObj (o rd fpNaN) @?= fpNaN) $+ [(op, rd) | op <- op, rd <- roundingMode],+ testCase "binop nan" $ do+ let op = [fpAdd, fpSub, fpMul, fpDiv]+ let roundingMode = [rne, rna, rtz, rtn, rtp]+ let operands =+ [(fpNaN :: FP32, 1 :: FP32), (1, fpNaN), (fpNaN, fpNaN)]+ traverse_ (\(o, r, (a, b)) -> SameFPObj (o r a b) @?= fpNaN) $+ [(o, r, (a, b)) | o <- op, r <- roundingMode, (a, b) <- operands],+ testCase "ternop nan" $ do+ let op = [fpFMA]+ let roundingMode = [rne, rna, rtz, rtn, rtp]+ let operand = [fpNaN :: FP32, 1]+ let operands =+ [ (a, b, c)+ | a <- operand,+ b <- operand,+ c <- operand,+ fpIsNaN a || fpIsNaN b || fpIsNaN c+ ]+ traverse_ (\(o, r, (a, b, c)) -> SameFPObj (o r a b c) @?= fpNaN) $+ [ (o, r, (a, b, c))+ | o <- op,+ r <- roundingMode,+ (a, b, c) <- operands+ ],+ testCase "fpAdd" $ do+ let v = 60 :: FP 4 4+ fpAdd rne 2 v @?= 64+ fpAdd rna 2 v @?= 64+ fpAdd rne (-2) v @?= 56+ fpAdd rna (-2) v @?= 60+ fpAdd rtz 2 v @?= 60+ fpAdd rtn 2 v @?= 60+ fpAdd rtp 2 v @?= 64+ fpAdd rne (-2) (-v) @?= -64+ fpAdd rna (-2) (-v) @?= -64+ fpAdd rtz (-2) (-v) @?= -60+ fpAdd rtn (-2) (-v) @?= -64+ fpAdd rtp (-2) (-v) @?= -60+ fpAdd rne 1 v @?= 60+ fpAdd rna 1 v @?= 60+ fpAdd rtz 1 v @?= 60+ fpAdd rtn 1 v @?= 60+ fpAdd rtp 1 v @?= 64+ fpAdd rne (-1) (-v) @?= -60+ fpAdd rna (-1) (-v) @?= -60+ fpAdd rtz (-1) (-v) @?= -60+ fpAdd rtn (-1) (-v) @?= -64+ fpAdd rtp (-1) (-v) @?= -60+ fpAdd rne 3 v @?= 64+ fpAdd rna 3 v @?= 64+ fpAdd rtz 3 v @?= 60+ fpAdd rtn 3 v @?= 60+ fpAdd rtp 3 v @?= 64+ fpAdd rne (-3) (-v) @?= -64+ fpAdd rna (-3) (-v) @?= -64+ fpAdd rtz (-3) (-v) @?= -60+ fpAdd rtn (-3) (-v) @?= -64+ fpAdd rtp (-3) (-v) @?= -60+ ],+ testGroup "ConvertibleBound" $ do+ let test ::+ forall n eb sb.+ ( ValidFP eb sb,+ KnownNat n,+ 1 <= n,+ SBV.BVIsNonZero n+ ) =>+ Test+ test =+ testGroup+ ( "n="+ <> show (typeRep @n)+ <> ",eb="+ <> show (typeRep @eb)+ <> ",sb="+ <> show (typeRep @sb)+ )+ $ do+ let tcase ::+ forall (bv :: Nat -> Type) (sbvbv :: Nat -> Type).+ ( ConvertibleBound bv,+ Num (bv n),+ SBV.HasKind (sbvbv n),+ Num (SBV.SBV (sbvbv n)),+ Typeable bv+ ) =>+ Test+ tcase = testCase (show $ typeRep @bv) $ do+ let lb =+ convertibleLowerBound (0 :: bv n) RTP :: FP eb sb+ let rb =+ convertibleUpperBound (0 :: bv n) RTP :: FP eb sb+ let lbad = prevFP lb+ let rbad = nextFP rb+ let sbvlb = conSBVTerm lb+ let sbvrb = conSBVTerm rb+ let sbvlbad = conSBVTerm lbad+ let sbvrbad = conSBVTerm rbad+ let sbvlbbv =+ genericFPCast SBV.sRTP sbvlb :: SBV.SBV (sbvbv n)+ let sbvrbbv =+ genericFPCast SBV.sRTP sbvrb :: SBV.SBV (sbvbv n)+ let sbvlbadbv =+ genericFPCast+ SBV.sRTP+ sbvlbad ::+ SBV.SBV (sbvbv n)+ let sbvrbadbv =+ genericFPCast+ SBV.sRTP+ sbvrbad ::+ SBV.SBV (sbvbv n)+ SBV.SatResult (Unsatisfiable {}) <-+ SBV.sat (sbvlbbv SBV..== 1)+ SBV.SatResult (Unsatisfiable {}) <-+ SBV.sat (sbvrbbv SBV..== 1)+ SBV.SatResult (Satisfiable {}) <-+ SBV.sat (sbvlbadbv SBV..== 1)+ SBV.SatResult (Satisfiable {}) <-+ SBV.sat (sbvrbadbv SBV..== 1)+ return ()+ [tcase @IntN @SBV.IntN, tcase @WordN @SBV.WordN]+ [ test @12 @4 @16,+ test @12 @4 @14,+ test @12 @4 @13,+ test @12 @4 @12,+ test @12 @4 @11,+ test @12 @4 @10,+ test @12 @4 @9,+ test @12 @4 @2,+ test @10 @4 @16,+ test @10 @4 @12,+ test @10 @4 @11,+ test @10 @4 @10,+ test @10 @4 @9,+ test @10 @4 @8,+ test @10 @4 @7,+ test @10 @4 @2,+ test @9 @4 @16,+ test @9 @4 @11,+ test @9 @4 @10,+ test @9 @4 @9,+ test @9 @4 @8,+ test @9 @4 @7,+ test @9 @4 @6,+ test @9 @4 @2,+ test @8 @4 @16,+ test @8 @4 @10,+ test @8 @4 @9,+ test @8 @4 @8,+ test @8 @4 @7,+ test @8 @4 @6,+ test @8 @4 @5,+ test @8 @4 @2,+ test @7 @4 @16,+ test @7 @4 @9,+ test @7 @4 @8,+ test @7 @4 @7,+ test @7 @4 @6,+ test @7 @4 @5,+ test @7 @4 @3,+ test @7 @4 @2,+ test @6 @4 @16,+ test @6 @4 @8,+ test @6 @4 @7,+ test @6 @4 @6,+ test @6 @4 @5,+ test @6 @4 @3,+ test @6 @4 @2,+ test @5 @4 @16,+ test @5 @4 @7,+ test @5 @4 @6,+ test @5 @4 @5,+ test @5 @4 @3,+ test @5 @4 @2+ ],+ testGroup "IEEEFPConvertible" $ do+ let safeFromFPComplianceTest ::+ forall v.+ ( Show v,+ Eq v,+ Arbitrary v,+ SafeFromFP+ NotRepresentableFPError+ v+ (FP 4 4)+ FPRoundingMode+ (Either NotRepresentableFPError)+ ) =>+ Test+ safeFromFPComplianceTest = testProperty "safeFromFP" $+ \(d :: v) (md :: FPRoundingMode) (v :: FP 4 4) -> do+ let s = safeFromFP md v :: Either NotRepresentableFPError v+ case s of+ Left _ -> fromFPOr d md v == d+ Right r -> fromFPOr d md v == r+ [ testGroup+ "AlgReal"+ [ testCase "fromFPOr" $ do+ fromFPOr (1 :: AlgReal) rne (fpPositiveZero :: FP 4 4) @?= 0+ fromFPOr (1 :: AlgReal) rne (fpNegativeZero :: FP 4 4) @?= 0+ fromFPOr (1 :: AlgReal) rne (fpPositiveInfinite :: FP 4 4) @?= 1+ fromFPOr (1 :: AlgReal) rne (fpNegativeInfinite :: FP 4 4) @?= 1+ fromFPOr (1 :: AlgReal) rne (fpNaN :: FP 4 4) @?= 1+ fromFPOr (1 :: AlgReal) rne (3.75 :: FP 4 4)+ @?= AlgExactRational (15 % 4),+ safeFromFPComplianceTest @AlgReal,+ testCase "toFP" $ do+ toFP rne (AlgExactRational (15 % 4)) @?= (3.75 :: FP 4 4)+ toFP rne (AlgExactRational (15 % 8)) @?= (1.875 :: FP 4 4)+ toFP rne (AlgExactRational (17 % 8)) @?= (2 :: FP 4 4)+ toFP rna (AlgExactRational (17 % 8)) @?= (2.25 :: FP 4 4)+ toFP rtz (AlgExactRational (17 % 8)) @?= (2 :: FP 4 4)+ toFP rtp (AlgExactRational (17 % 8)) @?= (2.25 :: FP 4 4)+ toFP rtn (AlgExactRational (17 % 8)) @?= (2 :: FP 4 4)++ toFP rne (AlgExactRational (-(17 % 8))) @?= (-2 :: FP 4 4)+ toFP rna (AlgExactRational (-(17 % 8))) @?= (-2.25 :: FP 4 4)+ toFP rtz (AlgExactRational (-(17 % 8))) @?= (-2 :: FP 4 4)+ toFP rtp (AlgExactRational (-(17 % 8))) @?= (-2 :: FP 4 4)+ toFP rtn (AlgExactRational (-(17 % 8))) @?= (-2.25 :: FP 4 4)+ ],+ testGroup "FP" $ do+ let tcase name func = testCase name $ do+ mapM_+ ( \rm -> do+ assertBool "+0" $+ fpIsPositiveZero+ (func rm (fpPositiveZero :: FP 6 6) :: FP 4 4)+ assertBool "-0" $+ fpIsNegativeZero (func rm (fpNegativeZero :: FP 6 6))+ assertBool "+oo" $+ fpIsPositiveInfinite+ (func rm (fpPositiveInfinite :: FP 6 6))+ assertBool "-oo" $+ fpIsNegativeInfinite+ (func rm (fpNegativeInfinite :: FP 6 6))+ assertBool "nan" $+ fpIsNaN (func rm (fpNaN :: FP 6 6))+ )+ [rna, rne, rtz, rtn, rtp]+ let posfps = (/ 16) . fromIntegral <$> [48 .. 56] :: [FP 6 6]+ let fps = (negate <$> posfps) <> posfps+ let rnaExpected =+ [3, 3, 3.25, 3.25, 3.25, 3.25, 3.5, 3.5, 3.5]+ func rna <$> fps @?= (negate <$> rnaExpected) <> rnaExpected+ let rneExpected =+ [3, 3, 3, 3.25, 3.25, 3.25, 3.5, 3.5, 3.5]+ func rne <$> fps @?= (negate <$> rneExpected) <> rneExpected+ let rtzExpected =+ [3, 3, 3, 3, 3.25, 3.25, 3.25, 3.25, 3.5]+ func rtz <$> fps @?= (negate <$> rtzExpected) <> rtzExpected+ let rtnExpected =+ [3, 3, 3, 3, 3.25, 3.25, 3.25, 3.25, 3.5]+ let rtpExpected =+ [3, 3.25, 3.25, 3.25, 3.25, 3.5, 3.5, 3.5, 3.5]+ func rtn <$> fps @?= (negate <$> rtpExpected) <> rtnExpected+ func rtp <$> fps @?= (negate <$> rtnExpected) <> rtpExpected+ [ tcase "fromFPOr" (fromFPOr 2),+ tcase "toFP" toFP+ ],+ testGroup "Integrals" $ do+ let fps = (/ 4) . fromIntegral <$> [-7 .. 7] :: [FP 4 4]+ let rneFromExpected :: (Num a) => [a]+ rneFromExpected =+ [-2, -2, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2]+ rnaFromExpected :: (Num a) => [a]+ rnaFromExpected =+ [-2, -2, -1, -1, -1, -1, 0, 0, 0, 1, 1, 1, 1, 2, 2]+ rtpFromExpected :: (Num a) => [a]+ rtpFromExpected =+ [-1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2]+ rtnFromExpected :: (Num a) => [a]+ rtnFromExpected =+ [-2, -2, -2, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 1]+ rtzFromExpected :: (Num a) => [a]+ rtzFromExpected =+ [-1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]+ let posints :: (Num a, Enum a) => [a]+ posints = [30 .. 40]+ ints :: (Num a, Enum a) => [a]+ ints = (negate <$> posints) <> posints+ let rnePosToFPExpected =+ [30 :: FP 4 4, 32, 32, 32, 32, 36, 36, 36, 40, 40, 40]+ let rnaPosToFPExpected =+ [30 :: FP 4 4, 32, 32, 32, 36, 36, 36, 36, 40, 40, 40]+ let rtzPosToFPExpected =+ [30 :: FP 4 4, 30, 32, 32, 32, 32, 36, 36, 36, 36, 40]+ let rtnPosToFPExpected =+ [30 :: FP 4 4, 30, 32, 32, 32, 32, 36, 36, 36, 36, 40]+ let rtpPosToFPExpected =+ [30 :: FP 4 4, 32, 32, 36, 36, 36, 36, 40, 40, 40, 40]+ let rneToFPExpected =+ fmap negate rnePosToFPExpected <> rnePosToFPExpected+ let rnaToFPExpected =+ fmap negate rnaPosToFPExpected <> rnaPosToFPExpected+ let rtzToFPExpected =+ fmap negate rtzPosToFPExpected <> rtzPosToFPExpected+ let rtnToFPExpected =+ fmap negate rtpPosToFPExpected <> rtnPosToFPExpected+ let rtpToFPExpected =+ fmap negate rtnPosToFPExpected <> rtpPosToFPExpected++ let boundTest0 ::+ forall bv n eb sb.+ ( ValidFP eb sb,+ KnownNat n,+ 1 <= n,+ ConvertibleBound bv,+ IEEEFPConvertible (bv n) (FP eb sb) FPRoundingMode,+ Eq (bv n),+ Show (bv n)+ ) =>+ String ->+ bv n ->+ [bv n] ->+ [bv n] ->+ Test+ boundTest0 name d lbvs rbvs = testGroup name $ do+ (rm, lbv, rbv) <- zip3 [rne, rna, rtz, rtn, rtp] lbvs rbvs+ return $ testCase (show rm) $ do+ let (lb :: FP eb sb) = convertibleLowerBound d rm+ let (rb :: FP eb sb) = convertibleUpperBound d rm+ let lbad = prevFP lb+ let rbad = nextFP rb+ fromFPOr d rm lbad @?= d+ fromFPOr d rm rbad @?= d+ fromFPOr d rm lb @?= lbv+ fromFPOr d rm rb @?= rbv+ let boundTest ::+ forall bv n eb sb.+ ( ValidFP eb sb,+ KnownNat n,+ 1 <= n,+ ConvertibleBound bv,+ IEEEFPConvertible (bv n) (FP eb sb) FPRoundingMode,+ Eq (bv n),+ Show (bv n)+ ) =>+ String ->+ bv n ->+ bv n ->+ bv n ->+ Test+ boundTest name d lbv rbv =+ boundTest0 @bv @n @eb @sb+ name+ d+ (replicate 5 lbv)+ (replicate 5 rbv)++ [ testGroup+ "Integer"+ [ testCase "fromFPOr" $ do+ fromFPOr (1 :: Integer) rne (fpPositiveZero :: FP 4 4) @?= 0+ fromFPOr (1 :: Integer) rne (fpNegativeZero :: FP 4 4) @?= 0+ fromFPOr (1 :: Integer) rne (fpPositiveInfinite :: FP 4 4)+ @?= 1+ fromFPOr (1 :: Integer) rne (fpNegativeInfinite :: FP 4 4)+ @?= 1+ fromFPOr (1 :: Integer) rne (fpNaN :: FP 4 4) @?= 1+ fromFPOr (100 :: Integer) rne <$> fps @?= rneFromExpected+ fromFPOr (100 :: Integer) rna <$> fps @?= rnaFromExpected+ fromFPOr (100 :: Integer) rtp <$> fps @?= rtpFromExpected+ fromFPOr (100 :: Integer) rtn <$> fps @?= rtnFromExpected+ fromFPOr (100 :: Integer) rtz <$> fps @?= rtzFromExpected,+ safeFromFPComplianceTest @Integer,+ testCase "toFP" $ do+ toFP rne (15 :: Integer) @?= (15 :: FP 4 4)+ toFP rne <$> (ints :: [Integer]) @?= rneToFPExpected+ toFP rna <$> (ints :: [Integer]) @?= rnaToFPExpected+ toFP rtz <$> (ints :: [Integer]) @?= rtzToFPExpected+ toFP rtn <$> (ints :: [Integer]) @?= rtnToFPExpected+ toFP rtp <$> (ints :: [Integer]) @?= rtpToFPExpected+ ],+ testGroup+ "IntN"+ [ testCase "fromFPOr" $ do+ fromFPOr (1 :: IntN 32) rne (fpPositiveZero :: FP 4 4) @?= 0+ fromFPOr (1 :: IntN 32) rne (fpNegativeZero :: FP 4 4) @?= 0+ fromFPOr (1 :: IntN 32) rne (fpPositiveInfinite :: FP 4 4)+ @?= 1+ fromFPOr (1 :: IntN 32) rne (fpNegativeInfinite :: FP 4 4)+ @?= 1+ fromFPOr (1 :: IntN 32) rne (fpNaN :: FP 4 4) @?= 1+ fromFPOr (100 :: IntN 32) rne <$> fps @?= rneFromExpected+ fromFPOr (100 :: IntN 32) rna <$> fps @?= rnaFromExpected+ fromFPOr (100 :: IntN 32) rtp <$> fps @?= rtpFromExpected+ fromFPOr (100 :: IntN 32) rtn <$> fps @?= rtnFromExpected+ fromFPOr (100 :: IntN 32) rtz <$> fps @?= rtzFromExpected+ fromFPOr (0 :: IntN 3) rne (-3.5 :: FP 4 4) @?= -4+ fromFPOr (0 :: IntN 3) rne (3.5 :: FP 4 4) @?= 0+ fromFPOr (0 :: IntN 3) rna (-3.5 :: FP 4 4) @?= -4+ fromFPOr (0 :: IntN 3) rna (3.5 :: FP 4 4) @?= 0+ fromFPOr (0 :: IntN 3) rne (-4.5 :: FP 4 4) @?= -4+ fromFPOr (0 :: IntN 3) rne (4.5 :: FP 4 4) @?= 0+ fromFPOr (0 :: IntN 3) rna (-4.5 :: FP 4 4) @?= 0+ fromFPOr (0 :: IntN 3) rna (4.5 :: FP 4 4) @?= 0,+ safeFromFPComplianceTest @(IntN 3),+ testGroup "ConvertibleBound" $ do+ [ boundTest0 @IntN @12 @4 @16+ "ebn<n-1&&sb>n-1,12/4/16"+ 100+ [-256, -256, -255, -256, -255]+ [256, 256, 255, 255, 256],+ boundTest0 @IntN @12 @4 @12+ "ebn<n-1&&sb>n-1,12/4/12"+ 100+ [-256, -256, -255, -256, -255]+ [256, 256, 255, 255, 256],+ boundTest0 @IntN @12 @4 @11+ "ebn<n-1&&sb==n-1,12/4/11"+ 100+ [-256, -256, -255, -256, -255]+ [256, 256, 255, 255, 256],+ boundTest0 @IntN @12 @4 @10+ "ebn<n-1&&sb<n-1,12/4/10"+ 100+ [-256, -256, -255, -256, -255]+ [256, 256, 255, 255, 256],+ boundTest0 @IntN @12 @4 @9+ "ebn<n-1&&sb<n-1,12/4/9"+ 100+ [-256, -256, -255, -256, -255]+ [256, 256, 255, 255, 256],+ boundTest @IntN @12 @4 @2+ "ebn<n-1&&sb<n-1,12/4/2"+ 100+ (-192)+ 192,+ boundTest0 @IntN @10 @4 @16+ "ebn<n-1&&sb>n-1,10/4/16"+ 100+ [-256, -256, -255, -256, -255]+ [256, 256, 255, 255, 256],+ boundTest0 @IntN @10 @4 @11+ "ebn<n-1&&sb>n-1,10/4/10"+ 100+ [-256, -256, -255, -256, -255]+ [256, 256, 255, 255, 256],+ boundTest0 @IntN @10 @4 @10+ "ebn<n-1&&sb==n-1,10/4/9"+ 100+ [-256, -256, -255, -256, -255]+ [256, 256, 255, 255, 256],+ boundTest @IntN @10 @4 @8+ "ebn<n-1&&sb<n-1,10/4/8"+ 100+ (-255)+ 255,+ boundTest @IntN @10 @4 @7+ "ebn<n-1&&sb<n-1,10/4/7"+ 100+ (-254)+ 254,+ boundTest @IntN @10 @4 @2+ "ebn<n-1&&sb<n-1,10/4/2"+ 100+ (-192)+ 192,+ boundTest0 @IntN @9 @4 @16+ "ebn==n-1&&sb>n-1,9/4/16"+ 100+ [-256, -256, -255, -256, -255]+ [255, 255, 255, 255, 255],+ boundTest0 @IntN @9 @4 @9+ "ebn==n-1&&sb>n-1,9/4/9"+ 100+ [-256, -256, -255, -256, -255]+ [255, 255, 255, 255, 255],+ boundTest @IntN @9 @4 @8+ "ebn==n-1&&sb==n-1,9/4/8"+ 100+ (-255)+ 255,+ boundTest @IntN @9 @4 @7+ "ebn==n-1&&sb<n-1,9/4/7"+ 100+ (-254)+ 254,+ boundTest @IntN @9 @4 @2+ "ebn==n-1&&sb<n-1,9/4/2"+ 100+ (-192)+ 192,+ boundTest @IntN @8 @4 @16+ "ebn>n-1&&sb>n-1,8/4/16"+ 100+ (-128)+ 127,+ boundTest @IntN @8 @4 @8+ "ebn>n-1&&sb>n-1,8/4/8"+ 100+ (-128)+ 127,+ boundTest @IntN @8 @4 @7+ "ebn>n-1&&sb==n-1,8/4/7"+ 100+ (-128)+ 127,+ boundTest @IntN @8 @4 @6+ "ebn>n-1&&sb<n-1,8/4/6"+ 100+ (-128)+ 126,+ boundTest @IntN @8 @4 @5+ "ebn>n-1&&sb<n-1,8/4/5"+ 100+ (-128)+ 124,+ boundTest @IntN @8 @4 @2+ "ebn>n-1&&sb<n-1,8/4/2"+ 100+ (-128)+ 96,+ boundTest @IntN @7 @4 @16+ "ebn>n-1&&sb>n-1,7/4/16"+ 100+ (-64)+ 63,+ boundTest @IntN @7 @4 @7+ "ebn>n-1&&sb>n-1,7/4/7"+ 100+ (-64)+ 63,+ boundTest @IntN @7 @4 @6+ "ebn>n-1&&sb==n-1,7/4/6"+ 100+ (-64)+ 63,+ boundTest @IntN @7 @4 @5+ "ebn>n-1&&sb<n-1,7/4/5"+ 100+ (-64)+ 62,+ boundTest @IntN @7 @4 @4+ "ebn>n-1&&sb<n-1,7/4/4"+ 100+ (-64)+ 60,+ boundTest @IntN @7 @4 @2+ "ebn>n-1&&sb<n-1,7/4/2"+ 100+ (-64)+ 48,+ boundTest @IntN @5 @4 @16+ "ebn>n-1&&sb>n-1,5/4/16"+ 100+ (-16)+ 15,+ boundTest @IntN @5 @4 @5+ "ebn>n-1&&sb>n-1,5/4/5"+ 100+ (-16)+ 15,+ boundTest @IntN @5 @4 @4+ "ebn>n-1&&sb==n-1,5/4/4"+ 100+ (-16)+ 15,+ boundTest @IntN @5 @4 @3+ "ebn>n-1&&sb<n-1,5/4/3"+ 100+ (-16)+ 14,+ boundTest @IntN @5 @4 @2+ "ebn>n-1&&sb<n-1,5/4/2"+ 100+ (-16)+ 12+ ],+ testCase "toFP" $ do+ toFP rne (15 :: IntN 32) @?= (15 :: FP 4 4)+ toFP rne <$> (ints :: [IntN 32]) @?= rneToFPExpected+ toFP rna <$> (ints :: [IntN 32]) @?= rnaToFPExpected+ toFP rtz <$> (ints :: [IntN 32]) @?= rtzToFPExpected+ toFP rtn <$> (ints :: [IntN 32]) @?= rtnToFPExpected+ toFP rtp <$> (ints :: [IntN 32]) @?= rtpToFPExpected+ ],+ testGroup+ "WordN"+ [ testCase "fromFPOr" $ do+ fromFPOr (1 :: WordN 32) rne (fpPositiveZero :: FP 4 4)+ @?= 0+ fromFPOr (1 :: WordN 32) rne (fpNegativeZero :: FP 4 4)+ @?= 0+ fromFPOr (1 :: WordN 32) rne (fpPositiveInfinite :: FP 4 4)+ @?= 1+ fromFPOr (1 :: WordN 32) rne (fpNegativeInfinite :: FP 4 4)+ @?= 1+ fromFPOr (1 :: WordN 32) rne (fpNaN :: FP 4 4) @?= 1+ let m = fmap (min 100)+ fromFPOr (100 :: WordN 32) rne <$> fps @?= m rneFromExpected+ fromFPOr (100 :: WordN 32) rna <$> fps @?= m rnaFromExpected+ fromFPOr (100 :: WordN 32) rtp <$> fps @?= m rtpFromExpected+ fromFPOr (100 :: WordN 32) rtn <$> fps @?= m rtnFromExpected+ fromFPOr (100 :: WordN 32) rtz+ <$> fps+ @?= m rtzFromExpected+ fromFPOr (4 :: WordN 3) rne (-0.5 :: FP 4 4) @?= 0+ fromFPOr (4 :: WordN 3) rne (0.5 :: FP 4 4) @?= 0+ fromFPOr (4 :: WordN 3) rna (-0.5 :: FP 4 4) @?= 4+ fromFPOr (4 :: WordN 3) rna (0.5 :: FP 4 4) @?= 1+ fromFPOr (4 :: WordN 3) rne (6.5 :: FP 4 4) @?= 6+ fromFPOr (4 :: WordN 3) rne (7.5 :: FP 4 4) @?= 4+ fromFPOr (4 :: WordN 3) rna (6.5 :: FP 4 4) @?= 7+ fromFPOr (4 :: WordN 3) rna (7.5 :: FP 4 4) @?= 4,+ safeFromFPComplianceTest @(WordN 3),+ testGroup "ConvertibleBound" $ do+ [ boundTest0 @WordN @12 @4 @16+ "ebn<n&&sb>n,12/4/16"+ 100+ [0, 0, 0, 0, 0]+ [256, 256, 255, 255, 256],+ boundTest0 @WordN @12 @4 @13+ "ebn<n&&sb>n,12/4/13"+ 100+ [0, 0, 0, 0, 0]+ [256, 256, 255, 255, 256],+ boundTest0 @WordN @12 @4 @12+ "ebn<n&&sb==n,12/4/12"+ 100+ [0, 0, 0, 0, 0]+ [256, 256, 255, 255, 256],+ boundTest0 @WordN @12 @4 @11+ "ebn<n&&sb<n,12/4/11"+ 100+ [0, 0, 0, 0, 0]+ [256, 256, 255, 255, 256],+ boundTest @WordN @12 @4 @2 "ebn<n&&sb<n,12/4/2" 100 0 192,+ boundTest0 @WordN @9 @4 @16+ "ebn<n&&sb>n,9/4/16"+ 100+ [0, 0, 0, 0, 0]+ [256, 256, 255, 255, 256],+ boundTest0 @WordN @9 @4 @10+ "ebn<n&&sb>n,9/4/10"+ 100+ [0, 0, 0, 0, 0]+ [256, 256, 255, 255, 256],+ boundTest0 @WordN @9 @4 @9+ "ebn<n&&sb==n,9/4/9"+ 100+ [0, 0, 0, 0, 0]+ [256, 256, 255, 255, 256],+ boundTest @WordN @9 @4 @8 "ebn<n&&sb<n,9/4/8" 100 0 255,+ boundTest @WordN @9 @4 @2 "ebn<n&&sb<n,9/4/2" 100 0 192,+ boundTest @WordN @8 @4 @16+ "ebn==n&&sb>n,8/4/16"+ 100+ 0+ 255,+ boundTest @WordN @8 @4 @9 "ebn==n&&sb>n,8/4/16" 100 0 255,+ boundTest @WordN @8 @4 @9 "ebn==n&&sb>n,8/4/9" 100 0 255,+ boundTest @WordN @8 @4 @8 "ebn==n&&sb==n,8/4/8" 100 0 255,+ boundTest @WordN @8 @4 @7 "ebn==n&&sb<n,8/4/7" 100 0 254,+ boundTest @WordN @8 @4 @2 "ebn==n&&sb<n,8/4/2" 100 0 192,+ boundTest @WordN @7 @4 @16 "ebn>n&&sb>n,7/4/16" 100 0 127,+ boundTest @WordN @7 @4 @8 "ebn>n&&sb>n,7/4/8" 100 0 127,+ boundTest @WordN @7 @4 @7 "ebn>n&&sb==n,7/4/7" 100 0 127,+ boundTest @WordN @7 @4 @6 "ebn>n&&sb<n,7/4/6" 100 0 126,+ boundTest @WordN @7 @4 @2 "ebn>n&&sb<n,7/4/2" 100 0 96,+ boundTest @WordN @5 @4 @16 "ebn>n&&sb>n,7/4/16" 100 0 31,+ boundTest @WordN @5 @4 @6 "ebn>n&&sb>n,5/4/6" 100 0 31,+ boundTest @WordN @5 @4 @5 "ebn>n&&sb==n,5/4/5" 100 0 31,+ boundTest @WordN @5 @4 @4 "ebn>n&&sb<n,5/4/4" 100 0 30,+ boundTest @WordN @5 @4 @2 "ebn>n&&sb<n,5/4/2" 100 0 24+ ],+ testCase "toFP" $ do+ toFP rne (15 :: WordN 32) @?= (15 :: FP 4 4)+ toFP rne <$> (posints :: [WordN 32]) @?= rnePosToFPExpected+ toFP rna <$> (posints :: [WordN 32]) @?= rnaPosToFPExpected+ toFP rtz <$> (posints :: [WordN 32]) @?= rtzPosToFPExpected+ toFP rtn <$> (posints :: [WordN 32]) @?= rtnPosToFPExpected+ toFP rtp <$> (posints :: [WordN 32]) @?= rtpPosToFPExpected+ ]+ ]+ ] ]++newtype SameFPObj = SameFPObj FP32 deriving newtype (Show, Num, IEEEFPConstants)++instance Eq SameFPObj where+ SameFPObj a == SameFPObj b+ | a == 0 && b == 0 =+ fpIsPositiveZero a == fpIsPositiveZero b+ SameFPObj a == SameFPObj b | fpIsNaN a && fpIsNaN b = True+ SameFPObj a == SameFPObj b = a == b
+ test/Grisette/SymPrim/GeneralFunTests.hs view
@@ -0,0 +1,54 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeOperators #-}++module Grisette.SymPrim.GeneralFunTests (generalFunTests) where++import Grisette+ ( EvalSym (evalSym),+ ExtractSym (extractSym),+ ModelRep (buildModel),+ ModelValuePair ((::=)),+ Solvable (con),+ SymInteger,+ SymbolSetRep (buildSymbolSet),+ TypedAnySymbol,+ (-->),+ type (-->),+ type (-~>),+ )+import Test.Framework (Test, testGroup)+import Test.Framework.Providers.HUnit (testCase)+import Test.HUnit ((@?=))++generalFunTests :: Test+generalFunTests =+ testGroup+ "GeneralFun"+ [ testCase "EvalSym" $ do+ let x :: Integer --> Integer =+ "a" --> "a" + "b"+ let xe :: Integer --> Integer =+ "a" --> "a" + 1+ let m = buildModel ("b" ::= (1 :: Integer), "a" ::= (2 :: Integer))+ evalSym True m x @?= xe,+ testCase "EvalSym nested" $ do+ let x :: Integer --> Integer --> Integer =+ "a" --> (con $ "b" --> "a" + "b" + "c" :: SymInteger -~> SymInteger)+ let xe :: Integer --> Integer --> Integer =+ "a" --> (con $ "b" --> "a" + "b" + 3 :: SymInteger -~> SymInteger)+ let m =+ buildModel+ ( "b" ::= (1 :: Integer),+ "a" ::= (2 :: Integer),+ "c" ::= (3 :: Integer)+ )+ evalSym True m x @?= xe,+ testCase "ExtractSym" $ do+ let x0 :: Integer --> Integer = "a" --> "a" + "c"+ let x :: Integer --> Integer --> Integer =+ "a" --> (con $ "b" --> "a" + "b" + "c" :: SymInteger -~> SymInteger)+ extractSym x0 @?= buildSymbolSet ("c" :: TypedAnySymbol Integer)+ extractSym x @?= buildSymbolSet ("c" :: TypedAnySymbol Integer)+ ]
test/Grisette/SymPrim/Prim/BVTests.hs view
@@ -14,23 +14,19 @@ import GHC.TypeNats (KnownNat, type (+), type (<=)) import Grisette.Internal.SymPrim.BV (IntN, WordN) import Grisette.Internal.SymPrim.Prim.Term- ( PEvalBVSignConversionTerm- ( pevalBVToSignedTerm,- pevalBVToUnsignedTerm- ),- PEvalBVTerm+ ( PEvalBVTerm ( pevalBVConcatTerm, pevalBVExtendTerm, pevalBVSelectTerm ),+ PEvalBitCastTerm (pevalBitCastTerm), Term,+ bitCastTerm, bvconcatTerm, bvextendTerm, bvselectTerm, conTerm, ssymTerm,- toSignedTerm,- toUnsignedTerm, ) import Test.Framework (Test, testGroup) import Test.Framework.Providers.HUnit (testCase)@@ -107,7 +103,7 @@ bvTests = testGroup "BV"- [ testGroup "pevalBVToSignedTerm" $ do+ [ testGroup "pevalBitCastTerm to signed" $ do ToSignedTest name term expected <- [ ToSignedTest { toSignedTestName = "concrete",@@ -117,11 +113,13 @@ ToSignedTest { toSignedTestName = "symbolic", toSignedTestTerm = ssymTerm "a",- toSignedTestExpected = toSignedTerm $ ssymTerm "a"+ toSignedTestExpected =+ bitCastTerm @(WordN 4) @(IntN 4) $ ssymTerm "a" }, ToSignedTest { toSignedTestName = "toUnsigned",- toSignedTestTerm = toUnsignedTerm $ ssymTerm "a",+ toSignedTestTerm =+ bitCastTerm @(IntN 4) @(WordN 4) $ ssymTerm "a", toSignedTestExpected = ssymTerm "a" }, ToSignedTest@@ -132,8 +130,10 @@ (ssymTerm "b" :: Term (WordN 2)), toSignedTestExpected = bvconcatTerm- (toSignedTerm (ssymTerm "a" :: Term (WordN 2)))- (toSignedTerm (ssymTerm "b" :: Term (WordN 2)))+ ( bitCastTerm (ssymTerm "a" :: Term (WordN 2)) ::+ Term (IntN 2)+ )+ (bitCastTerm (ssymTerm "b" :: Term (WordN 2))) }, ToSignedTest { toSignedTestName = "bvExtend",@@ -143,13 +143,13 @@ bvextendTerm True (Proxy @4)- (toSignedTerm (ssymTerm "a" :: Term (WordN 2)))+ (bitCastTerm @(WordN 2) @(IntN 2) (ssymTerm "a")) } ] return $ testCase name $ do- let actual = pevalBVToSignedTerm term+ let actual = pevalBitCastTerm term actual @?= expected,- testGroup "pevalBVToUnsignedTerm" $ do+ testGroup "pevalBitCastTerm to unsigned" $ do ToUnsignedTest name term expected <- [ ToUnsignedTest { toUnsignedTestName = "concrete",@@ -159,11 +159,13 @@ ToUnsignedTest { toUnsignedTestName = "symbolic", toUnsignedTestTerm = ssymTerm "a",- toUnsignedTestExpected = toUnsignedTerm $ ssymTerm "a"+ toUnsignedTestExpected =+ bitCastTerm @(IntN 4) @(WordN 4) $ ssymTerm "a" }, ToUnsignedTest { toUnsignedTestName = "toSigned",- toUnsignedTestTerm = toSignedTerm $ ssymTerm "a",+ toUnsignedTestTerm =+ bitCastTerm @(WordN 4) @(IntN 4) $ ssymTerm "a", toUnsignedTestExpected = ssymTerm "a" }, ToUnsignedTest@@ -174,8 +176,8 @@ (ssymTerm "b" :: Term (IntN 2)), toUnsignedTestExpected = bvconcatTerm- (toUnsignedTerm (ssymTerm "a" :: Term (IntN 2)))- (toUnsignedTerm (ssymTerm "b" :: Term (IntN 2)))+ (bitCastTerm @(IntN 2) @(WordN 2) (ssymTerm "a"))+ (bitCastTerm (ssymTerm "b" :: Term (IntN 2))) }, ToUnsignedTest { toUnsignedTestName = "bvExtend",@@ -185,11 +187,11 @@ bvextendTerm True (Proxy @4)- (toUnsignedTerm (ssymTerm "a" :: Term (IntN 2)))+ (bitCastTerm @(IntN 2) @(WordN 2) (ssymTerm "a")) } ] return $ testCase name $ do- let actual = pevalBVToUnsignedTerm term+ let actual = pevalBitCastTerm term actual @?= expected, testGroup "pevalBVSelectTerm" $ do BVSelectTest name ix w term expected <-@@ -258,9 +260,9 @@ bvSelectIx = Proxy @2, bvSelectW = Proxy @1, bvSelectTestTerm =- toSignedTerm (ssymTerm "a" :: Term (WordN 4)),+ bitCastTerm @(WordN 4) @(IntN 4) (ssymTerm "a"), bvSelectTestExpected =- toSignedTerm+ bitCastTerm ( bvselectTerm (Proxy @2) (Proxy @1)@@ -272,9 +274,9 @@ bvSelectIx = Proxy @2, bvSelectW = Proxy @1, bvSelectTestTerm =- toUnsignedTerm (ssymTerm "a" :: Term (IntN 4)),+ bitCastTerm @(IntN 4) @(WordN 4) (ssymTerm "a"), bvSelectTestExpected =- toUnsignedTerm+ bitCastTerm ( bvselectTerm (Proxy @2) (Proxy @1)
test/Grisette/SymPrim/Prim/BitsTests.hs view
@@ -7,11 +7,7 @@ module Grisette.SymPrim.Prim.BitsTests (bitsTests) where import Data.Bits (Bits (rotateL, rotateR), FiniteBits)-import Grisette- ( IntN,- SymRotate,- WordN,- )+import Grisette (IntN, WordN) import Grisette.Internal.SymPrim.Prim.Term ( PEvalBitwiseTerm ( pevalAndBitsTerm,@@ -308,7 +304,7 @@ ] concreteSmallRotateRightCorrect ::- (PEvalRotateTerm a, Integral a, FiniteBits a, SymRotate a) =>+ (PEvalRotateTerm a, Integral a, FiniteBits a) => a -> a -> Property
test/Grisette/SymPrim/Prim/IntegralTests.hs view
@@ -41,7 +41,7 @@ sameDivPeval :: forall t.- (Num t, Eq t, PEvalDivModIntegralTerm t) =>+ (PEvalDivModIntegralTerm t) => t -> t -> (Term t -> Term t -> Term t) ->@@ -56,7 +56,7 @@ divisionPevalBoundedTests :: forall p t.- (Num t, Eq t, Bounded t, PEvalDivModIntegralTerm t) =>+ (Bounded t, PEvalDivModIntegralTerm t) => p t -> TestName -> (Term t -> Term t -> Term t) ->@@ -72,7 +72,7 @@ divisionPevalTests :: forall p t0 t.- (Num t, Eq t, Arbitrary t0, Show t0, PEvalDivModIntegralTerm t) =>+ (Arbitrary t0, Show t0, PEvalDivModIntegralTerm t) => p t -> TestName -> (t0 -> t) ->@@ -128,7 +128,7 @@ moduloPevalTests :: forall p t0 t.- (Num t, Eq t, Arbitrary t0, Show t0, PEvalDivModIntegralTerm t) =>+ (Arbitrary t0, Show t0, PEvalDivModIntegralTerm t) => p t -> TestName -> (t0 -> t) ->
test/Grisette/SymPrim/Prim/ModelTests.hs view
@@ -18,7 +18,8 @@ valueOf ), ModelRep (buildModel),- TypedSymbol,+ TypedAnySymbol,+ TypedConstantSymbol, WordN, ) import Grisette.Internal.SymPrim.Prim.Model@@ -26,7 +27,7 @@ ModelValuePair ((::=)), SymbolSet (SymbolSet), equation,- evaluateTerm,+ evalTerm, ) import Grisette.Internal.SymPrim.Prim.ModelValue (toModelValue) import Grisette.Internal.SymPrim.Prim.Term@@ -44,14 +45,14 @@ modelTests :: Test modelTests =- 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"+ let asymbol :: TypedAnySymbol Integer = "a"+ bsymbol :: TypedAnySymbol Bool = "b"+ csymbol :: TypedAnySymbol Integer = "c"+ dsymbol :: TypedAnySymbol Bool = "d"+ esymbol :: TypedAnySymbol (WordN 4) = "e"+ fsymbol :: TypedAnySymbol (IntN 4) = "f"+ gsymbol :: TypedAnySymbol (WordN 16) = "g"+ hsymbol :: TypedAnySymbol (IntN 16) = "h" m1 = emptyModel m2 = insertValue asymbol 1 m1 m3 = insertValue bsymbol True m2@@ -125,42 +126,54 @@ (someTypedSymbol csymbol, toModelValue (0 :: Integer)) ] ),- testCase "evaluateTerm" $ do- evaluateTerm False m3 (conTerm (1 :: Integer)) @=? conTerm 1- evaluateTerm True m3 (conTerm (1 :: Integer)) @=? conTerm 1- evaluateTerm False m3 (ssymTerm "a" :: Term Integer) @=? conTerm 1- evaluateTerm True m3 (ssymTerm "a" :: Term Integer) @=? conTerm 1- evaluateTerm False m3 (ssymTerm "x" :: Term Integer) @=? ssymTerm "x"- evaluateTerm True m3 (ssymTerm "x" :: Term Integer) @=? conTerm 0- evaluateTerm False m3 (ssymTerm "y" :: Term Bool) @=? ssymTerm "y"- evaluateTerm True m3 (ssymTerm "y" :: Term Bool) @=? conTerm False- evaluateTerm False m3 (ssymTerm "z" :: Term (WordN 4)) @=? ssymTerm "z"- evaluateTerm True m3 (ssymTerm "z" :: Term (WordN 4)) @=? conTerm 0- evaluateTerm False m3 (pevalNegNumTerm $ ssymTerm "a" :: Term Integer) @=? conTerm (-1)- evaluateTerm True m3 (pevalNegNumTerm $ ssymTerm "a" :: Term Integer) @=? conTerm (-1)- evaluateTerm False m3 (pevalNegNumTerm $ ssymTerm "x" :: Term Integer) @=? pevalNegNumTerm (ssymTerm "x")- evaluateTerm True m3 (pevalNegNumTerm $ ssymTerm "x" :: Term Integer) @=? conTerm 0- evaluateTerm False m3 (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a") :: Term Integer) @=? conTerm 2- evaluateTerm True m3 (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a") :: Term Integer) @=? conTerm 2- evaluateTerm False m3 (pevalAddNumTerm (ssymTerm "x") (ssymTerm "a") :: Term Integer) @=? pevalAddNumTerm (conTerm 1) (ssymTerm "x")- evaluateTerm True m3 (pevalAddNumTerm (ssymTerm "x") (ssymTerm "a") :: Term Integer) @=? conTerm 1- evaluateTerm False m3 (pevalAddNumTerm (ssymTerm "x") (ssymTerm "y") :: Term Integer) @=? pevalAddNumTerm (ssymTerm "x") (ssymTerm "y")- evaluateTerm True m3 (pevalAddNumTerm (ssymTerm "x") (ssymTerm "y") :: Term Integer) @=? conTerm 0- evaluateTerm False m3 (pevalITETerm (ssymTerm "b") (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a")) (ssymTerm "a") :: Term Integer)+ testCase "evalTerm" $ do+ evalTerm False m3 S.empty (conTerm (1 :: Integer)) @=? conTerm 1+ evalTerm True m3 S.empty (conTerm (1 :: Integer)) @=? conTerm 1+ evalTerm False m3 S.empty (ssymTerm "a" :: Term Integer) @=? conTerm 1+ evalTerm True m3 S.empty (ssymTerm "a" :: Term Integer) @=? conTerm 1+ evalTerm False m3 S.empty (ssymTerm "x" :: Term Integer) @=? ssymTerm "x"+ evalTerm True m3 S.empty (ssymTerm "x" :: Term Integer) @=? conTerm 0+ evalTerm+ False+ m3+ (S.singleton (someTypedSymbol ("x" :: TypedConstantSymbol Integer)))+ (ssymTerm "x" :: Term Integer)+ @=? ssymTerm "x"+ evalTerm+ True+ m3+ (S.singleton (someTypedSymbol ("x" :: TypedConstantSymbol Integer)))+ (ssymTerm "x" :: Term Integer)+ @=? ssymTerm "x"+ evalTerm False m3 S.empty (ssymTerm "y" :: Term Bool) @=? ssymTerm "y"+ evalTerm True m3 S.empty (ssymTerm "y" :: Term Bool) @=? conTerm False+ evalTerm False m3 S.empty (ssymTerm "z" :: Term (WordN 4)) @=? ssymTerm "z"+ evalTerm True m3 S.empty (ssymTerm "z" :: Term (WordN 4)) @=? conTerm 0+ evalTerm False m3 S.empty (pevalNegNumTerm $ ssymTerm "a" :: Term Integer) @=? conTerm (-1)+ evalTerm True m3 S.empty (pevalNegNumTerm $ ssymTerm "a" :: Term Integer) @=? conTerm (-1)+ evalTerm False m3 S.empty (pevalNegNumTerm $ ssymTerm "x" :: Term Integer) @=? pevalNegNumTerm (ssymTerm "x")+ evalTerm True m3 S.empty (pevalNegNumTerm $ ssymTerm "x" :: Term Integer) @=? conTerm 0+ evalTerm False m3 S.empty (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a") :: Term Integer) @=? conTerm 2+ evalTerm True m3 S.empty (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a") :: Term Integer) @=? conTerm 2+ evalTerm False m3 S.empty (pevalAddNumTerm (ssymTerm "x") (ssymTerm "a") :: Term Integer) @=? pevalAddNumTerm (conTerm 1) (ssymTerm "x")+ evalTerm True m3 S.empty (pevalAddNumTerm (ssymTerm "x") (ssymTerm "a") :: Term Integer) @=? conTerm 1+ evalTerm False m3 S.empty (pevalAddNumTerm (ssymTerm "x") (ssymTerm "y") :: Term Integer) @=? pevalAddNumTerm (ssymTerm "x") (ssymTerm "y")+ evalTerm True m3 S.empty (pevalAddNumTerm (ssymTerm "x") (ssymTerm "y") :: Term Integer) @=? conTerm 0+ evalTerm False m3 S.empty (pevalITETerm (ssymTerm "b") (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a")) (ssymTerm "a") :: Term Integer) @=? conTerm 2- evaluateTerm True m3 (pevalITETerm (ssymTerm "b") (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a")) (ssymTerm "a") :: Term Integer)+ evalTerm True m3 S.empty (pevalITETerm (ssymTerm "b") (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a")) (ssymTerm "a") :: Term Integer) @=? conTerm 2- evaluateTerm False m3 (pevalITETerm (ssymTerm "x") (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a")) (ssymTerm "a") :: Term Integer)+ evalTerm False m3 S.empty (pevalITETerm (ssymTerm "x") (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a")) (ssymTerm "a") :: Term Integer) @=? pevalITETerm (ssymTerm "x") (conTerm 2) (conTerm 1)- evaluateTerm True m3 (pevalITETerm (ssymTerm "x") (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a")) (ssymTerm "a") :: Term Integer)+ evalTerm True m3 S.empty (pevalITETerm (ssymTerm "x") (pevalAddNumTerm (ssymTerm "a") (ssymTerm "a")) (ssymTerm "a") :: Term Integer) @=? conTerm 1- evaluateTerm False m3 (pevalITETerm (ssymTerm "b") (ssymTerm "x") (pevalAddNumTerm (conTerm 1) (ssymTerm "y")) :: Term Integer)+ evalTerm False m3 S.empty (pevalITETerm (ssymTerm "b") (ssymTerm "x") (pevalAddNumTerm (conTerm 1) (ssymTerm "y")) :: Term Integer) @=? ssymTerm "x"- evaluateTerm True m3 (pevalITETerm (ssymTerm "b") (ssymTerm "x") (pevalAddNumTerm (conTerm 1) (ssymTerm "y")) :: Term Integer)+ evalTerm True m3 S.empty (pevalITETerm (ssymTerm "b") (ssymTerm "x") (pevalAddNumTerm (conTerm 1) (ssymTerm "y")) :: Term Integer) @=? conTerm 0- evaluateTerm False m3 (pevalITETerm (ssymTerm "z") (ssymTerm "x") (pevalAddNumTerm (conTerm 1) (ssymTerm "y")) :: Term Integer)+ evalTerm False m3 S.empty (pevalITETerm (ssymTerm "z") (ssymTerm "x") (pevalAddNumTerm (conTerm 1) (ssymTerm "y")) :: Term Integer) @=? pevalITETerm (ssymTerm "z") (ssymTerm "x") (pevalAddNumTerm (conTerm 1) (ssymTerm "y"))- evaluateTerm True m3 (pevalITETerm (ssymTerm "z") (ssymTerm "x") (pevalAddNumTerm (conTerm 1) (ssymTerm "y")) :: Term Integer)+ evalTerm True m3 S.empty (pevalITETerm (ssymTerm "z") (ssymTerm "x") (pevalAddNumTerm (conTerm 1) (ssymTerm "y")) :: Term Integer) @=? conTerm 1, testCase "construction from ModelValuePair" $ do buildModel (asymbol ::= 1) @=? Model (M.singleton (someTypedSymbol asymbol) (toModelValue (1 :: Integer)))
test/Grisette/SymPrim/Prim/TabularFunTests.hs view
@@ -18,7 +18,7 @@ ) import Test.Framework (Test, testGroup) import Test.Framework.Providers.HUnit (testCase)-import Test.HUnit ((@=?))+import Test.HUnit ((@?=)) tabularFunTests :: Test tabularFunTests =@@ -29,16 +29,16 @@ [ testCase "On concrete" $ do let f :: Integer =-> Integer = TabularFun [(1, 2), (3, 4)] 5- pevalApplyTerm (conTerm f) (conTerm 0) @=? conTerm 5- pevalApplyTerm (conTerm f) (conTerm 1) @=? conTerm 2- pevalApplyTerm (conTerm f) (conTerm 2) @=? conTerm 5- pevalApplyTerm (conTerm f) (conTerm 3) @=? conTerm 4- pevalApplyTerm (conTerm f) (conTerm 4) @=? conTerm 5,+ pevalApplyTerm (conTerm f) (conTerm 0) @?= conTerm 5+ pevalApplyTerm (conTerm f) (conTerm 1) @?= conTerm 2+ pevalApplyTerm (conTerm f) (conTerm 2) @?= conTerm 5+ pevalApplyTerm (conTerm f) (conTerm 3) @?= conTerm 4+ pevalApplyTerm (conTerm f) (conTerm 4) @?= conTerm 5, testCase "On concrete function" $ do let f :: Integer =-> Integer = TabularFun [(1, 2), (3, 4)] 5 pevalApplyTerm (conTerm f) (ssymTerm "b")- @=? pevalITETerm+ @?= pevalITETerm (pevalEqTerm (conTerm 1 :: Term Integer) (ssymTerm "b")) (conTerm 2) ( pevalITETerm@@ -47,8 +47,10 @@ (conTerm 5) ), testCase "On symbolic" $ do- pevalApplyTerm (ssymTerm "f" :: Term (Integer =-> Integer)) (ssymTerm "a")- @=? applyTerm+ pevalApplyTerm+ (ssymTerm "f" :: Term (Integer =-> Integer))+ (ssymTerm "a")+ @?= applyTerm (ssymTerm "f" :: Term (Integer =-> Integer)) (ssymTerm "a" :: Term Integer) ]
+ test/Grisette/SymPrim/QuantifierTests.hs view
@@ -0,0 +1,77 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeOperators #-}++module Grisette.SymPrim.QuantifierTests (quantifierTests) where++import Grisette+ ( Function ((#)),+ GenSymSimple (simpleFresh),+ LogicalOp (symImplies),+ ModelOps (isEmptyModel),+ SimpleListSpec (SimpleListSpec),+ SymEq ((.==)),+ SymOrd ((.>)),+ runFresh,+ solve,+ z3,+ )+import Grisette.Internal.SymPrim.Quantifier (existsFresh, existsSym, forallFresh, forallSym)+import Grisette.Internal.SymPrim.SymInteger (SymInteger)+import Grisette.SymPrim (type (=~>))+import Test.Framework (Test, testGroup)+import Test.Framework.Providers.HUnit (testCase)+import Test.HUnit (assertBool, (@?=))++#if MIN_VERSION_sbv(10,1,0)+sbvVersionCheck :: Test -> Test+sbvVersionCheck = id+#else+sbvVersionCheck :: Test -> Test+sbvVersionCheck _ = testGroup "Quantifier" []+#endif++quantifierTests :: Test+quantifierTests =+ sbvVersionCheck $+ testGroup+ "Quantifier"+ [ testCase "Basic" $ do+ let l@[x, y] = ["x", "y"] :: [SymInteger]+ r <- solve z3 $ forallSym l $ (x .== y) `symImplies` (x + 1 .== y + 1)+ case r of+ Left err -> error $ show err+ Right mo ->+ assertBool "no elements should be in the model" $ isEmptyModel mo,+ testCase "Basic2" $ do+ let [x, y] = ["x", "y"] :: [SymInteger]+ r <- solve z3 $ forallSym x $ existsSym y $ x .> y+ case r of+ Left err -> error $ show err+ Right mo ->+ assertBool "no elements should be in the model" $ isEmptyModel mo,+ testCase "With ufunc" $ do+ -- https://github.com/LeventErkok/sbv/issues/711+ let f = "f" :: SymInteger =~> SymInteger+ let x = "x" :: SymInteger+ let y = "y" :: SymInteger+ r <-+ solve z3 $+ forallSym x $+ forallSym y $+ (x .== y) `symImplies` ((f # x) .== (f # y))+ case r of+ Left err -> error $ show err+ Right _ -> return (),+ testCase "fresh" $ do+ let x = flip runFresh "x" $+ forallFresh (SimpleListSpec 2 ()) $ \(l :: [SymInteger]) ->+ existsFresh (SimpleListSpec 2 ()) $ \(r :: [SymInteger]) ->+ return $ l .== r+ let r = flip runFresh "x" $ do+ l :: [SymInteger] <- simpleFresh (SimpleListSpec 2 ())+ r <- simpleFresh (SimpleListSpec 2 ())+ return $ forallSym l $ existsSym r $ l .== r+ x @?= r+ ]
test/Grisette/SymPrim/SomeBVTests.hs view
@@ -15,7 +15,7 @@ import Control.DeepSeq (NFData, force) import Control.Exception (ArithException (Overflow), catch, evaluate) import Control.Monad.Except (ExceptT)-import Data.Bits (FiniteBits (finiteBitSize))+import Data.Bits (Bits (clearBit, complement, complementBit, setBit, shiftL, unsafeShiftL, xor, (.&.), (.|.)), FiniteBits (finiteBitSize)) import Data.Proxy (Proxy (Proxy)) import Grisette ( BV (bv, bvConcat, bvExt, bvSelect, bvSext, bvZext),@@ -23,11 +23,15 @@ LogicalOp (symNot), Mergeable (rootStrategy), SafeLinearArith (safeAdd, safeSub),+ SignConversion (toSigned, toUnsigned), Solvable (con, isym, ssym),+ SomeBV (SomeBVLit),+ SomeWordN, SymEq ((./=), (.==)), genSym, genSymSimple, mrgIf,+ mrgReturn, mrgSingle, ) import Grisette.Internal.Core.Control.Monad.Union (Union (UMrg))@@ -35,12 +39,12 @@ ( UnionBase (UnionSingle), ifWithLeftMost, )-import Grisette.Internal.SymPrim.BV (BitwidthMismatch (BitwidthMismatch), IntN)+import Grisette.Internal.SymPrim.BV (IntN) import Grisette.Internal.SymPrim.SomeBV ( SomeBV (SomeBV),+ SomeBVException (BitwidthMismatch), SomeIntN, SomeSymIntN,- SomeWordN, arbitraryBV, binSomeBV, binSomeBVR1,@@ -63,20 +67,39 @@ import Test.Framework.Providers.HUnit (testCase) import Test.Framework.Providers.QuickCheck2 (testProperty) import Test.HUnit (assertBool, (@?=))-import Test.QuickCheck (forAll, ioProperty)+import Test.QuickCheck+ ( Arbitrary (arbitrary),+ Gen,+ NonNegative (getNonNegative),+ forAll,+ ioProperty,+ ) testFuncMatch :: (Eq r, Show r) =>+ String -> (SomeIntN -> SomeIntN -> r) -> SomeIntN -> SomeIntN -> r -> Test-testFuncMatch f a b r = testCase "bit width match" $ do+testFuncMatch name f a b r = testCase name $ do let actual = f a b let expected = r actual @?= expected +testFuncMatchLit ::+ String ->+ (SomeIntN -> SomeIntN -> SomeIntN) ->+ SomeIntN ->+ SomeIntN ->+ SomeIntN ->+ Test+testFuncMatchLit name f a b r = testCase name $ do+ let SomeBVLit actual = f a b+ let SomeBVLit expected = r+ actual @?= expected+ testFuncMisMatch :: (NFData r, Show r, Eq r) => (SomeIntN -> SomeIntN -> r) ->@@ -87,7 +110,7 @@ testFuncMisMatch f a b r = testCase "bit width mismatch" $ do actual <- evaluate (force $ f a b)- `catch` \(_ :: BitwidthMismatch) -> return r+ `catch` \(_ :: SomeBVException) -> return r let expected = r actual @?= expected @@ -95,7 +118,7 @@ (Eq r, Show r, Mergeable r) => ( SomeIntN -> SomeIntN ->- ExceptT (Either BitwidthMismatch ArithException) Union r+ ExceptT (Either SomeBVException ArithException) Union r ) -> SomeIntN -> SomeIntN ->@@ -108,24 +131,40 @@ testSafeFuncMatch :: (Eq r, Show r, Mergeable r) =>+ String -> ( SomeIntN -> SomeIntN ->- ExceptT (Either BitwidthMismatch ArithException) Union r+ ExceptT (Either SomeBVException ArithException) Union r ) -> SomeIntN -> SomeIntN -> r -> Test-testSafeFuncMatch f a b r = testCase "bit width match" $ do+testSafeFuncMatch name f a b r = testCase name $ do let actual = f a b let expected = mrgSingle r actual @?= expected +testSafeFuncMatchLit ::+ String ->+ ( SomeIntN ->+ SomeIntN ->+ Either (Either SomeBVException ArithException) SomeIntN+ ) ->+ SomeIntN ->+ SomeIntN ->+ SomeIntN ->+ Test+testSafeFuncMatchLit name f a b r = testCase name $ do+ let Right (SomeBVLit actual) = f a b+ let Right (SomeBVLit expected) = mrgSingle r+ actual @?= expected+ testSafeFuncMisMatch :: (Eq r, Show r, Mergeable r) => ( SomeIntN -> SomeIntN ->- ExceptT (Either BitwidthMismatch ArithException) Union r+ ExceptT (Either SomeBVException ArithException) Union r ) -> SomeIntN -> SomeIntN ->@@ -167,44 +206,93 @@ testCase "ssymBV" $ ssymBV 4 "a" @?= SomeBV (ssym "a" :: SymIntN 4), testCase "isymBV" $ isymBV 4 "a" 1 @?= SomeBV (isym "a" 1 :: SymIntN 4),- testCase "unarySomeBV" $ do- let actual =- unarySomeBV @IntN @SomeIntN- (SomeIntN . negate)- (bv 4 5 :: SomeIntN)- let expected = bv 4 (-5)- actual @?= expected,- testCase "unarySomeBVR1" $ do- let actual = unarySomeBVR1 (negate) (bv 4 5 :: SomeIntN)- let expected = bv 4 (-5)- actual @?= expected, testGroup+ "unarySomeBV"+ [ testCase "SomeBV" $ do+ let actual =+ unarySomeBV @IntN @SomeIntN+ (SomeIntN . negate)+ undefined+ (bv 4 5 :: SomeIntN)+ let expected = bv 4 (-5)+ actual @?= expected,+ testCase "SomeBVLit" $ do+ let SomeBVLit actual =+ unarySomeBV @IntN @SomeIntN+ undefined+ (SomeBVLit . negate)+ (5 :: SomeIntN)+ let SomeBVLit expected = SomeBVLit $ -5+ actual @?= expected+ ],+ testGroup+ "unarySomeBVR1"+ [ testCase "SomeBV" $ do+ let actual = unarySomeBVR1 negate undefined (bv 4 5 :: SomeIntN)+ let expected = bv 4 (-5)+ actual @?= expected,+ testCase "SomeBVLit" $ do+ let SomeBVLit actual =+ unarySomeBVR1 undefined negate (SomeBVLit 5 :: SomeIntN)+ let SomeBVLit expected = SomeBVLit $ -5+ actual @?= expected+ ],+ testGroup "binSomeBV" [ testFuncMatch @SomeIntN- (binSomeBV (\l r -> SomeIntN $ l + r))+ "SomeBV/SomeBV"+ (binSomeBV (\l r -> SomeIntN $ l + r) undefined) (bv 4 5) (bv 4 2) (bv 4 7),+ testFuncMatch @SomeIntN+ "SomeBV/SomeBVLit"+ (binSomeBV (\l r -> SomeIntN $ l + r) undefined)+ (bv 4 5)+ 2+ (bv 4 7),+ testFuncMatch @SomeIntN+ "SomeBVLit/SomeBV"+ (binSomeBV (\l r -> SomeIntN $ l + r) undefined)+ 5+ (bv 4 2)+ (bv 4 7),+ testFuncMatchLit+ "SomeBVLit/SomeBVLit"+ (binSomeBV undefined (\l r -> SomeBVLit $ l + r))+ 5+ 2+ 7, testFuncMisMatch @SomeIntN- (binSomeBV (\l r -> SomeIntN $ l + r))+ (binSomeBV (\l r -> SomeIntN $ l + r) undefined) (bv 4 5) (bv 5 4) (bv 3 0) ], testGroup "binSomeBVR1"- [ testFuncMatch (binSomeBVR1 (+)) (bv 4 5) (bv 4 2) (bv 4 7),- testFuncMisMatch (binSomeBVR1 (+)) (bv 4 5) (bv 5 4) (bv 3 0)+ [ testFuncMatch+ "SomeBV/SomeBV"+ (binSomeBVR1 (+) undefined)+ (bv 4 5)+ (bv 4 2)+ (bv 4 7),+ testFuncMisMatch+ (binSomeBVR1 (+) undefined)+ (bv 4 5)+ (bv 5 4)+ (bv 3 0) ], testGroup "binSomeBVR2" [ testFuncMatch- (binSomeBVR2 (\l r -> (l + r, l - r)))+ "SomeBV/SomeBV"+ (binSomeBVR2 (\l r -> (l + r, l - r)) undefined) (bv 4 5) (bv 4 2) (bv 4 7, bv 4 3), testFuncMisMatch- (binSomeBVR2 (\l r -> (l + r, l - r)))+ (binSomeBVR2 (\l r -> (l + r, l - r)) undefined) (bv 4 5) (bv 5 4) (bv 3 0, bv 6 1)@@ -212,33 +300,53 @@ testGroup "binSomeBVSafe" $ do let func l r = mrgFmap SomeIntN $ safeAdd l r [ testSafeFuncMatch @SomeIntN- (binSomeBVSafe func)+ "SomeBV/SomeBV"+ (binSomeBVSafe func undefined) (bv 4 5) (bv 4 2) (bv 4 7),+ testSafeFuncMatch @SomeIntN+ "SomeBV/SomeBVInt"+ (binSomeBVSafe func undefined)+ (bv 4 5)+ 2+ (bv 4 7),+ testSafeFuncMatchLit+ "SomeBVInt/SomeBVInt"+ ( binSomeBVSafe+ undefined+ (\l r -> mrgReturn $ SomeBVLit $ l + r)+ )+ 5+ 2+ 7, testSafeFuncMatchException @SomeIntN- (binSomeBVSafe func)+ (binSomeBVSafe func undefined) (bv 4 5) (bv 4 5) Overflow, testSafeFuncMisMatch @SomeIntN- (binSomeBVSafe func)+ (binSomeBVSafe func undefined) (bv 4 5) (bv 5 4) ], testGroup "binSomeBVSafeR1" [ testSafeFuncMatch- (binSomeBVSafeR1 safeAdd)+ "SomeBV/SomeBV"+ (binSomeBVSafeR1 safeAdd undefined) (bv 4 5) (bv 4 2) (bv 4 7), testSafeFuncMatchException- (binSomeBVSafeR1 safeAdd)+ (binSomeBVSafeR1 safeAdd undefined) (bv 4 5) (bv 4 5) Overflow,- testSafeFuncMisMatch (binSomeBVSafeR1 safeAdd) (bv 4 5) (bv 5 4)+ testSafeFuncMisMatch+ (binSomeBVSafeR1 safeAdd undefined)+ (bv 4 5)+ (bv 5 4) ], testGroup "binSomeBVSafeR2" $ do let func l r = do@@ -246,6 +354,7 @@ b <- safeSub l r mrgSingle (a, b) [ testSafeFuncMatch+ "SomeBV/SomeBV" func (bv 4 5) (bv 4 2)@@ -397,6 +506,22 @@ assertBool "SomeBV with same bitwidth should compare the value" $ not $ a /= b,+ testProperty "==/SomeBV/SomeBVLit" $ \(a :: Integer) (b :: Integer) ->+ let ai = fromIntegral a :: SomeWordN+ bi = fromIntegral b :: SomeWordN+ ab = bv 4 a :: SomeWordN+ bb = bv 4 b :: SomeWordN+ in (ai == bb) == (ab == bb)+ && (ab == bi) == (ab == bb)+ && ai == ab,+ testProperty "/=/SomeBV/SomeBVLit" $ \(a :: Integer) (b :: Integer) ->+ let ai = fromIntegral a :: SomeWordN+ bi = fromIntegral b :: SomeWordN+ ab = bv 4 a :: SomeWordN+ bb = bv 4 b :: SomeWordN+ in (ai /= bb) == (ab /= bb)+ && (ab /= bi) == (ab /= bb)+ && not (ai /= ab), testCase "same bitwidth not equal" $ do let a = bv 4 4 :: SomeIntN let b = bv 4 5 :: SomeIntN@@ -425,5 +550,122 @@ let b = ssymBV 3 "b" :: SomeSymIntN a .== b @?= con False a ./= b @?= con True+ ],+ testGroup+ "Num"+ [ testGroup+ "SomeIntN"+ [ binOpLitTest @SomeIntN (+) "+",+ binOpLitTest @SomeIntN (-) "-",+ unaryOpLitTest @SomeIntN negate "negate"+ ],+ testGroup+ "SomeWordN"+ [ binOpLitTest @SomeWordN (+) "+",+ binOpLitTest @SomeWordN (-) "-",+ unaryOpLitTest @SomeWordN negate "negate"+ ]+ ],+ testGroup+ "SignConversion"+ [ testGroup+ "SomeIntN"+ [unaryOpLitTest @SomeIntN toUnsigned "toUnsigned"],+ testGroup+ "SomeWordN"+ [unaryOpLitTest @SomeWordN toSigned "toSigned"]+ ],+ testGroup+ "Bits"+ [ testGroup+ "SomeIntN"+ [ binOpLitTest @SomeIntN (.&.) ".&.",+ binOpLitTest @SomeIntN (.|.) ".|.",+ binOpLitTest @SomeIntN xor "xor",+ unaryOpLitTest @SomeIntN complement "complement",+ binIntOpLitTest @SomeIntN+ (getNonNegative <$> arbitrary)+ setBit+ "setBit",+ binIntOpLitTest @SomeIntN+ (getNonNegative <$> arbitrary)+ clearBit+ "clearBit",+ binIntOpLitTest @SomeIntN+ (getNonNegative <$> arbitrary)+ complementBit+ "complementBit",+ binIntOpLitTest @SomeIntN+ (getNonNegative <$> arbitrary)+ shiftL+ "shiftL",+ binIntOpLitTest @SomeIntN+ (getNonNegative <$> arbitrary)+ unsafeShiftL+ "unsafeShiftL"+ ],+ testGroup+ "SomeWordN"+ [ binOpLitTest @SomeWordN (.&.) ".&.",+ binOpLitTest @SomeWordN (.|.) ".|.",+ binOpLitTest @SomeWordN xor "xor",+ unaryOpLitTest @SomeWordN complement "complement",+ binIntOpLitTest @SomeWordN+ (getNonNegative <$> arbitrary)+ setBit+ "setBit",+ binIntOpLitTest @SomeWordN+ (getNonNegative <$> arbitrary)+ clearBit+ "clearBit",+ binIntOpLitTest @SomeWordN+ (getNonNegative <$> arbitrary)+ complementBit+ "complementBit",+ binIntOpLitTest @SomeWordN+ (getNonNegative <$> arbitrary)+ shiftL+ "shiftL",+ binIntOpLitTest @SomeWordN+ (getNonNegative <$> arbitrary)+ unsafeShiftL+ "unsafeShiftL"+ ] ] ]++binOpLitTest ::+ forall bv r. (Num bv, Eq r, BV bv) => (bv -> bv -> r) -> String -> Test+binOpLitTest f name =+ testProperty (name ++ "/SomeBV/SomeBVLit") $ \(a :: Integer) (b :: Integer) ->+ let ai = fromIntegral a :: bv+ bi = fromIntegral b :: bv+ ab = bv 4 a :: bv+ bb = bv 4 b :: bv+ in (f ai bb) == (f ab bb)+ && (f ab bi) == (f ab bb)+ && (f ai bi) == (f ab bb)++binIntOpLitTest ::+ forall bv.+ (Num bv, Eq bv, BV bv) =>+ Gen Int ->+ (bv -> Int -> bv) ->+ String ->+ Test+binIntOpLitTest gen f name =+ testProperty (name ++ "/SomeBV/SomeBVLit") $ \(a :: Integer) -> forAll gen $+ \(b :: Int) ->+ let ai = fromIntegral a :: bv+ ab = bv 4 a :: bv+ in (f ai b) == (f ab b)+ && (f ab b) == (f ab b)+ && (f ai b) == (f ab b)++unaryOpLitTest ::+ forall bv r. (Num bv, Eq r, BV bv) => (bv -> r) -> String -> Test+unaryOpLitTest f name =+ testProperty (name ++ "/SomeBV/SomeBVLit") $ \(a :: Integer) ->+ let ai = fromIntegral a :: bv+ ab = bv 4 a :: bv+ in f ai == f ab
+ test/Grisette/SymPrim/SymGeneralFunTests.hs view
@@ -0,0 +1,37 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeOperators #-}++module Grisette.SymPrim.SymGeneralFunTests (symGeneralFunTests) where++import Grisette.Internal.Core.Data.Class.ExtractSym (ExtractSym (extractSymMaybe))+import Grisette.Internal.Core.Data.Class.Function (Function ((#)))+import Grisette.Internal.Core.Data.Class.ModelOps+ ( SymbolSetRep (buildSymbolSet),+ )+import Grisette.Internal.SymPrim.GeneralFun (type (-->))+import Grisette.Internal.SymPrim.Prim.Internal.Term (TypedAnySymbol)+import Grisette.Internal.SymPrim.Prim.Model (AnySymbolSet, ConstantSymbolSet)+import Grisette.Internal.SymPrim.SymGeneralFun (type (-~>))+import Grisette.Internal.SymPrim.SymInteger (SymInteger)+import Test.Framework (Test, testGroup)+import Test.Framework.Providers.HUnit (testCase)+import Test.HUnit ((@?=))++symGeneralFunTests :: Test+symGeneralFunTests =+ testGroup+ "SymGeneralFun"+ [ testCase "ExtractSym" $ do+ let f :: SymInteger -~> SymInteger = "f"+ let a :: SymInteger = "a"+ let fa = f # a+ let anySymbolSet =+ buildSymbolSet+ ( "a" :: TypedAnySymbol Integer,+ "f" :: TypedAnySymbol (Integer --> Integer)+ ) ::+ AnySymbolSet+ extractSymMaybe fa @?= Just anySymbolSet+ extractSymMaybe fa @?= (Nothing :: Maybe ConstantSymbolSet)+ ]
test/Grisette/SymPrim/SymPrimTests.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE NegativeLiterals #-}@@ -16,7 +17,7 @@ catch, evaluate, )-import Control.Monad.Except (ExceptT, MonadError (throwError))+import Control.Monad.Except (ExceptT, MonadError (throwError), runExceptT) import Data.Bits ( Bits ( bit,@@ -38,18 +39,24 @@ import Data.Proxy (Proxy (Proxy)) import Data.Word (Word8) import Grisette- ( Apply (apply),+ ( AlgReal,+ Apply (apply), BV (bv), EvalSym (evalSym), ExtractSym (extractSym),+ FP,+ FP32,+ FPRoundingMode, Function ((#)),+ IEEEFPConstants (fpNaN),+ IEEEFPConvertible (fromFPOr), ITEOp (symIte), LogicalOp (symImplies, symNot, symXor, (.&&), (.||)), Mergeable (rootStrategy), MergingStrategy (SimpleStrategy), ModelOps (emptyModel, insertValue), ModelRep (buildModel),- SafeDivision+ SafeDiv ( safeDiv, safeDivMod, safeMod,@@ -71,29 +78,41 @@ sizedBVZext ), Solvable (con, conView, isym, ssym),+ SolvingFailure (Unsat), SomeSymIntN, SomeSymWordN, SymEq ((./=), (.==)),+ SymFP,+ SymFPRoundingMode,+ SymIEEEFPTraits (symFpIsNaN),+ SymIntN32, SymOrd (symCompare, (.<), (.<=), (.>), (.>=)),+ SymWordN32, ToCon (toCon), ToSym (toSym),- TypedSymbol,+ TypedAnySymbol, Union,+ bitCastOrCanonical, genSym, genSymSimple, mrgIf, mrgSingle,+ simpleMerge,+ solve, tryMerge,+ z3, pattern Con, pattern SomeSymIntN, pattern SomeSymWordN, type (-->), type (=->), )+import Grisette.Internal.Core.Data.Class.SafeFromFP (SafeFromFP (safeFromFP)) import Grisette.Internal.SymPrim.BV ( IntN (IntN), WordN (WordN), )+import Grisette.Internal.SymPrim.FP (NotRepresentableFPError) import Grisette.Internal.SymPrim.Prim.Model ( Model (Model), SymbolSet (SymbolSet),@@ -153,7 +172,9 @@ ) import Grisette.SymPrim ( ModelSymPair ((:=)),+ SymAlgReal, SymBool (SymBool),+ SymFP32, SymIntN (SymIntN), SymInteger (SymInteger), SymWordN (SymWordN),@@ -181,8 +202,6 @@ forall c s. ( Show s, Eq s,- Eq c,- Num c, Mergeable s, NFData c, Solvable c s@@ -202,8 +221,6 @@ forall c s. ( Show s, Eq s,- Eq c,- Num c, Mergeable s, NFData c, Solvable c s@@ -262,7 +279,15 @@ safeDivisionGeneralTests :: forall c c0 s.- (LinkedRep c s, Arbitrary c0, Show c0, Solvable c s, Eq s, Num c, Show s, Mergeable s, SymEq s) =>+ ( LinkedRep c s,+ Arbitrary c0,+ Show c0,+ Solvable c s,+ Eq s,+ Num c,+ Show s,+ Mergeable s+ ) => (c0 -> c) -> (s -> s -> ExceptT ArithException Union s) -> (c -> c -> c) ->@@ -369,7 +394,15 @@ safeDivModGeneralTests :: forall c c0 s.- (LinkedRep c s, Arbitrary c0, Show c0, Solvable c s, Eq s, Num c, Show s, Mergeable s, SymEq s) =>+ ( LinkedRep c s,+ Arbitrary c0,+ Show c0,+ Solvable c s,+ Eq s,+ Num c,+ Show s,+ Mergeable s+ ) => (c0 -> c) -> ( s -> s ->@@ -484,9 +517,9 @@ extractSym (symIte ("c" :: SymBool) ("a" :: SymInteger) ("b" :: SymInteger)) @=? SymbolSet ( S.fromList- [ someTypedSymbol ("c" :: TypedSymbol Bool),- someTypedSymbol ("a" :: TypedSymbol Integer),- someTypedSymbol ("b" :: TypedSymbol Integer)+ [ someTypedSymbol ("c" :: TypedAnySymbol Bool),+ someTypedSymbol ("a" :: TypedAnySymbol Integer),+ someTypedSymbol ("b" :: TypedAnySymbol Integer) ] ), testCase "GenSym" $ do@@ -522,7 +555,7 @@ testCase "signum" $ signum (ssym "a" :: SymInteger) @=? SymInteger (pevalSignumNumTerm (ssymTerm "a")) ], testGroup- "SafeDivision"+ "SafeDiv" [ safeDivisionUnboundedTests @Integer "safeDiv" id safeDiv div pevalDivIntegralTerm, safeDivisionUnboundedTests @Integer "safeMod" id safeMod mod pevalModIntegralTerm, safeDivModUnboundedTests @Integer "safeDivMod" id safeDivMod divMod pevalDivIntegralTerm pevalModIntegralTerm,@@ -612,7 +645,7 @@ signum as @=? SymIntN (pevalSignumNumTerm ast) ], testGroup- "SafeDivision"+ "SafeDiv" [ testGroup "WordN" [ safeDivisionUnboundedTests @(WordN 4) "safeDiv" WordN safeDiv div pevalDivIntegralTerm,@@ -667,10 +700,10 @@ let iint = fromIntegral i :: Integer in safeNeg (toSym i :: SymIntN 8) @=? mrgIf- (-iint .< fromIntegral (-i))+ ((-iint) .< fromIntegral (-i)) (throwError Underflow) ( mrgIf- (-iint .> fromIntegral (-i))+ ((-iint) .> fromIntegral (-i)) (throwError Overflow) (mrgSingle $ toSym $ -i :: ExceptT ArithException Union (SymIntN 8)) )@@ -708,10 +741,10 @@ let iint = fromIntegral i :: Integer in safeNeg (toSym i :: SymWordN 8) @=? mrgIf- (-iint .< fromIntegral (-i))+ ((-iint) .< fromIntegral (-i)) (throwError Underflow) ( mrgIf- (-iint .> fromIntegral (-i))+ ((-iint) .> fromIntegral (-i)) (throwError Overflow) (mrgSingle $ toSym $ -i :: ExceptT ArithException Union (SymWordN 8)) )@@ -857,6 +890,78 @@ ] ], testGroup+ "SymFP"+ [ testCase "bitCast consistent to SymWordN32" $ do+ let x = "x" :: SymFP32+ r <-+ solve+ z3+ ( symFpIsNaN x+ .&& ( (bitCastOrCanonical x :: SymWordN32)+ ./= (con (bitCastOrCanonical (fpNaN :: FP32)))+ )+ )+ case r of+ Left Unsat -> return ()+ _ -> fail $ show r,+ testCase "bitCast consistent to SymIntN32" $ do+ let x = "x" :: SymFP32+ r <-+ solve+ z3+ ( symFpIsNaN x+ .&& ( (bitCastOrCanonical x :: SymIntN32)+ ./= (con (bitCastOrCanonical (fpNaN :: FP32)))+ )+ )+ case r of+ Left Unsat -> return ()+ _ -> fail $ show r,+ testGroup "SafeFromFP" $ do+ let safeFromFPComplianceTest ::+ forall c s.+ ( Arbitrary c,+ Show c,+ Solvable c s,+ SymEq s,+ SafeFromFP+ NotRepresentableFPError+ s+ (SymFP 4 4)+ SymFPRoundingMode+ (ExceptT NotRepresentableFPError Union)+ ) =>+ Test+ safeFromFPComplianceTest =+ testProperty "safeFromFP" $+ \(d :: c) (md :: FPRoundingMode) (v :: FP 4 4) -> ioProperty $ do+ let s =+ runExceptT $+ safeFromFP+ (con md :: SymFPRoundingMode)+ (con v :: SymFP 4 4) ::+ Union (Either NotRepresentableFPError s)+ let f =+ fromFPOr+ (con d :: s)+ (con md :: SymFPRoundingMode)+ (con v :: SymFP 4 4)+ let cond = simpleMerge $ do+ s' <- s+ case s' of+ Left _ -> return $ f .== (con d)+ Right r -> return $ r .== f+ res <- solve z3 $ symNot cond+ case res of+ Left Unsat -> return ()+ m -> error $ show m+ [ safeFromFPComplianceTest @Integer @SymInteger,+ safeFromFPComplianceTest @AlgReal @SymAlgReal,+ safeFromFPComplianceTest @(WordN 3) @(SymWordN 3),+ safeFromFPComplianceTest @(IntN 3) @(SymIntN 3)+ ]+ ],+ testGroup "SomeSym" [ testGroup "BV"@@ -918,14 +1023,14 @@ symSize (symIte (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"+ let asymbol :: TypedAnySymbol Integer = "a"+ bsymbol :: TypedAnySymbol Bool = "b"+ csymbol :: TypedAnySymbol Integer = "c"+ dsymbol :: TypedAnySymbol Bool = "d"+ esymbol :: TypedAnySymbol (WordN 4) = "e"+ fsymbol :: TypedAnySymbol (IntN 4) = "f"+ gsymbol :: TypedAnySymbol (WordN 16) = "g"+ hsymbol :: TypedAnySymbol (IntN 16) = "h" va :: Integer = 1 vc :: Integer = 2 ve :: WordN 4 = 3
test/Grisette/SymPrim/TabularFunTests.hs view
@@ -9,7 +9,7 @@ ) import Test.Framework (Test, testGroup) import Test.Framework.Providers.HUnit (testCase)-import Test.HUnit ((@=?))+import Test.HUnit ((@?=)) tabularFunTests :: Test tabularFunTests =@@ -17,9 +17,9 @@ "TabularFun" [ testCase "Tabular application" $ do let f :: Integer =-> Integer = TabularFun [(1, 2), (3, 4)] 5- (f # 0) @=? 5- (f # 1) @=? 2- (f # 2) @=? 5- (f # 3) @=? 4- (f # 4) @=? 5+ (f # 0) @?= 5+ (f # 1) @?= 2+ (f # 2) @?= 5+ (f # 3) @?= 4+ (f # 4) @?= 5 ]
test/Grisette/TestUtil/SymbolicAssertion.hs view
@@ -7,7 +7,6 @@ Model, SolvingFailure (Unsat), SymEq ((./=), (.==)),- precise, solve, z3, )@@ -15,7 +14,7 @@ (@?=~) :: (HasCallStack, SymEq a, Show a, EvalSym a) => a -> a -> Assertion actual @?=~ expected = do- cex <- solve (precise z3) (symNot $ actual .== expected)+ cex <- solve z3 (symNot $ actual .== expected) case cex of Left Unsat -> return () Left err -> error $ "Solver isn't working: " ++ show err@@ -49,15 +48,15 @@ ) symShouldEq ::- (HasCallStack, Show a, SymEq a, EvalSym a) =>+ (HasCallStack, SymEq a) => a -> a -> (Model -> String) -> IO () symShouldEq actual expected notEqualCaseMessage = do- canBeNotEqual <- solve (precise z3) $ actual ./= expected- canBeEqual <- solve (precise z3) $ actual .== expected+ canBeNotEqual <- solve z3 $ actual ./= expected+ canBeEqual <- solve z3 $ actual .== expected case (canBeNotEqual, canBeEqual) of (Left _, Right _) -> return ()- (Right m, _) -> fail $ notEqualCaseMessage m- (_, Left _) -> fail "Cannot be equal"+ (Right m, _) -> error $ notEqualCaseMessage m+ (_, Left _) -> error "Cannot be equal"
test/Grisette/Unified/EvalModeTest.hs view
@@ -19,6 +19,21 @@ module Grisette.Unified.EvalModeTest (evalModeTest) where +#if MIN_VERSION_base(4,16,0)+import GHC.TypeLits (KnownNat, type (<=))+#else+import Grisette.Unified+ ( SafeUnifiedBV,+ SafeUnifiedBVFPConversion,+ SafeUnifiedSomeBV,+ UnifiedBV,+ UnifiedData,+ UnifiedBVBVConversion,+ UnifiedBVFPConversion,+ UnifiedFPFPConversion+ )+#endif+ import Control.Exception (ArithException (DivideByZero)) import Control.Monad.Error.Class (MonadError) import Control.Monad.Except (ExceptT (ExceptT))@@ -26,50 +41,51 @@ import GHC.Generics (Generic) import Grisette ( BV (bv),- BitwidthMismatch,+ BitCast (bitCast), Default (Default),+ IEEEFPConstants (fpNaN),+ IEEEFPConvertible (toFP),+ IEEEFPRoundingMode (rne), IntN, Mergeable,+ SomeBVException, SymBool,+ SymFP, SymIntN, SymInteger, Union,+ bitCastOrCanonical, mrgReturn, ) import qualified Grisette import Grisette.Internal.Core.Data.Class.LogicalOp (LogicalOp ((.&&)))+import Grisette.Internal.SymPrim.FP (NotRepresentableFPError (NaNError)) import Grisette.Internal.SymPrim.SomeBV (SomeIntN, SomeSymIntN, ssymBV) import Grisette.Unified ( EvalMode,- EvalModeTag (Con),+ EvalModeTag (Con, Sym), GetBool, GetData,+ GetFP,+ GetFPRoundingMode, GetIntN, GetInteger, GetSomeIntN,+ GetWordN, MonadWithMode, extractData, mrgIte, safeDiv,+ symFromIntegral, symIte, (.<), (.==), )+import Grisette.Unified.Internal.Class.UnifiedSafeBitCast (safeBitCast) import Test.Framework (Test, testGroup) import Test.Framework.Providers.HUnit (testCase) import Test.HUnit ((@?=)) -#if MIN_VERSION_base(4,16,0)-import GHC.TypeLits (KnownNat, type (<=))-#else-import Grisette.Unified- ( SafeUnifiedBV,- SafeUnifiedSomeBV,- UnifiedBV,- UnifiedData,- )-#endif- fbool :: forall mode. (EvalMode mode) => GetBool mode -> GetBool mode -> GetBool mode fbool l r =@@ -105,7 +121,7 @@ GetIntN mode n -> m (GetIntN mode n) fbv l r = do- v <- safeDiv @mode @ArithException l r+ v <- safeDiv @mode l r mrgReturn $ mrgIte @mode (l .== r)@@ -138,11 +154,11 @@ #if MIN_VERSION_base(4,16,0) type SomeBVConstraint mode m =- (MonadWithMode mode m, MonadError (Either BitwidthMismatch ArithException) m)+ (MonadWithMode mode m, MonadError (Either SomeBVException ArithException) m) #else type SomeBVConstraint mode m = ( MonadWithMode mode m,- MonadError (Either BitwidthMismatch ArithException) m,+ MonadError (Either SomeBVException ArithException) m, SafeUnifiedSomeBV mode m ) #endif@@ -167,7 +183,7 @@ #else type SomeBVConstraint' mode m = ( MonadWithMode mode m,- SafeUnifiedSomeBV mode (ExceptT (Either BitwidthMismatch ArithException) m)+ SafeUnifiedSomeBV mode (ExceptT (Either SomeBVException ArithException) m) ) #endif @@ -176,7 +192,7 @@ (SomeBVConstraint' mode m) => GetSomeIntN mode -> GetSomeIntN mode ->- ExceptT (Either BitwidthMismatch ArithException) m (GetSomeIntN mode)+ ExceptT (Either SomeBVException ArithException) m (GetSomeIntN mode) fsomebv' l r = do v <- safeDiv @mode l r mrgReturn $@@ -219,11 +235,90 @@ GetData mode (A mode) -> m (GetIntN mode 8) fdata d = do- a :: A mode <- extractData @mode d+ a <- extractData d case a of A v -> safeDiv @mode v (v - 1) AT v -> fdata v +#if MIN_VERSION_base(4,16,0)+type BVToFPConstraint mode = (EvalMode mode)+#else+type BVToFPConstraint mode =+ (EvalMode mode, BitCast (GetIntN mode 8) (GetFP mode 4 4))+#endif++bvToFPBitCast ::+ forall mode.+ (BVToFPConstraint mode) =>+ GetIntN mode 8 ->+ GetFP mode 4 4+bvToFPBitCast = bitCast++#if MIN_VERSION_base(4,16,0)+type FPToBVConstraint mode = (EvalMode mode)+#else+type FPToBVConstraint mode =+ (EvalMode mode, UnifiedBVFPConversion mode 8 4 4)+#endif++fpToBVBitCast ::+ forall mode.+ (FPToBVConstraint mode) =>+ GetFP mode 4 4 ->+ GetIntN mode 8+fpToBVBitCast = bitCastOrCanonical++#if MIN_VERSION_base(4,16,0)+type SafeFPToBVConstraint mode m =+ (MonadWithMode mode m, MonadError NotRepresentableFPError m)+#else+type SafeFPToBVConstraint mode m =+ ( MonadWithMode mode m,+ MonadError NotRepresentableFPError m,+ SafeUnifiedBVFPConversion mode 8 4 4 m+ )+#endif++safeFPToBVBitCast ::+ forall mode m.+ (SafeFPToBVConstraint mode m) =>+ GetFP mode 4 4 ->+ m (GetIntN mode 8)+safeFPToBVBitCast = safeBitCast @mode++#if MIN_VERSION_base(4,16,0)+type FPToFPConstraint mode = (EvalMode mode)+#else+type FPToFPConstraint mode =+ ( EvalMode mode,+ UnifiedFPFPConversion mode 4 4 3 5+ )+#endif++fpToFPConvert ::+ forall mode.+ (FPToFPConstraint mode) =>+ GetFPRoundingMode mode ->+ GetFP mode 4 4 ->+ GetFP mode 3 5+fpToFPConvert = toFP++#if MIN_VERSION_base(4,16,0)+type BVToBVConstraint mode = (EvalMode mode)+#else+type BVToBVConstraint mode =+ ( EvalMode mode,+ UnifiedBVBVConversion mode 4 4+ )+#endif++bvToBVFromIntegral ::+ forall mode.+ (BVToBVConstraint mode) =>+ GetIntN mode 4 ->+ GetWordN mode 4+bvToBVFromIntegral = symFromIntegral @mode+ evalModeTest :: Test evalModeTest = testGroup@@ -291,7 +386,7 @@ (v + r) (Grisette.symIte (l Grisette..< r) l r) :: ExceptT- (Either BitwidthMismatch ArithException)+ (Either SomeBVException ArithException) Union SomeSymIntN fsomebv l r @?= expected@@ -300,13 +395,51 @@ testGroup "GetData" [ testCase "Con" $ do- fdata @'Con (A 2) @?= Right 2- fdata @'Con (A 1) @?= Left DivideByZero,+ fdata @'Con (Identity $ A 2) @?= Right 2+ fdata @'Con (Identity $ A 1) @?= Left DivideByZero, testCase "Sym" $ do let a = "a" :: SymIntN 8 fdata (mrgReturn $ A a) @?= ( Grisette.safeDiv a (a - 1) :: ExceptT ArithException Union (SymIntN 8) )+ ],+ testGroup+ "Conversion"+ [ testGroup+ "FP/BV"+ [ testCase "Con" $ do+ bvToFPBitCast @'Con 0x22 @?= 0.15625+ fpToBVBitCast @'Con 0.15625 @?= 0x22+ fpToBVBitCast @'Con fpNaN @?= 0x7c+ safeFPToBVBitCast @'Con 0.15625 @?= Right 0x22+ safeFPToBVBitCast @'Con fpNaN @?= Left NaNError,+ testCase "Sym" $ do+ bvToFPBitCast @'Sym 0x22 @?= 0.15625+ let a = "a" :: SymIntN 8+ bvToFPBitCast @'Sym a @?= bitCast a+ fpToBVBitCast @'Sym 0.15625 @?= 0x22+ fpToBVBitCast @'Sym fpNaN @?= 0x7c+ let b = "b" :: SymFP 4 4+ fpToBVBitCast @'Sym b @?= bitCastOrCanonical b+ safeFPToBVBitCast @'Sym b+ @?= ( Grisette.safeBitCast b ::+ ExceptT NotRepresentableFPError Union (SymIntN 8)+ )+ ],+ testGroup+ "FP/FP"+ [ testCase "Con" $ do+ fpToFPConvert @'Con rne 1 @?= 1,+ testCase "Sym" $ do+ fpToFPConvert @'Sym rne 1 @?= 1+ ],+ testGroup+ "BV/BV"+ [ testCase "Con" $ do+ bvToBVFromIntegral @'Con 0xa @?= 0xa,+ testCase "Sym" $ do+ bvToBVFromIntegral @'Sym 0xa @?= 0xa+ ] ] ]
test/Grisette/Unified/UnifiedClassesTest.hs view
@@ -18,6 +18,7 @@ module Grisette.Unified.UnifiedClassesTest (unifiedClassesTest) where import Control.Monad.Except (ExceptT, MonadError (throwError))+import Control.Monad.Identity (Identity (Identity)) import qualified Data.Text as T import GHC.TypeNats (KnownNat, type (<=)) import Grisette@@ -103,8 +104,8 @@ testGroup "UnifiedSEq" [ testCase "testSEq 'Con" $ do- let x1 = X True [1 :: WordN 8] XNil [XNil]- let x2 = X False [1 :: WordN 8] XNil [XNil]+ let x1 = X True [1 :: WordN 8] (Identity XNil) [Identity XNil]+ let x2 = X False [1 :: WordN 8] (Identity XNil) [Identity XNil] testSEq x1 x1 @?= True testSEq x1 x2 @?= False, testCase "testSEq 'Sym" $ do
test/Grisette/Unified/UnifiedConstructorTest.hs view
@@ -1,4 +1,6 @@ {-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-}@@ -18,13 +20,19 @@ module Grisette.Unified.UnifiedConstructorTest (unifiedConstructorTest) where +#if MIN_VERSION_base(4,16,0)+import Grisette.Unified.Internal.UnifiedData (GetData)+#else+import Grisette.Unified.Internal.UnifiedData (GetData, UnifiedData)+#endif++import Control.Monad.Identity (Identity (Identity)) import Generics.Deriving (Default (Default))-import Grisette (Solvable (con), SymInteger, ToSym (toSym), mrgReturn)-import Grisette.TH (deriveAll, mkUnifiedConstructor)+import Grisette (Solvable (con), SymInteger, ToSym (toSym), Union, mrgReturn)+import Grisette.TH (deriveAll, mkUnifiedConstructor, mkUnifiedConstructor') import Grisette.Unified.Internal.EvalMode (EvalMode)-import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Con, Sym))+import Grisette.Unified.Internal.EvalModeTag (EvalModeTag (Sym)) import Grisette.Unified.Internal.UnifiedBool (UnifiedBool (GetBool))-import Grisette.Unified.Internal.UnifiedData (GetData, UnifiedData) import Test.Framework (Test, testGroup) import Test.Framework.Providers.HUnit (testCase) import Test.HUnit ((@?=))@@ -36,20 +44,41 @@ deriveAll ''T mkUnifiedConstructor "mk" ''T +#if MIN_VERSION_base(4,16,0)+type FConstraint mode = (EvalMode mode)+#else+type FConstraint mode =+ (EvalMode mode, UnifiedData mode (T mode SymInteger))+#endif++f :: forall mode. (FConstraint mode) => GetData mode (T mode SymInteger)+f = mkT (toSym True) 10 mkT1++data TNoMode a = TNoMode0 Bool a (TNoMode a) | TNoMode1++deriveAll ''TNoMode+mkUnifiedConstructor' ["tNoMode0", "tNoMode1"] ''TNoMode++data TNoArg = TNoArg++deriveAll ''TNoArg+mkUnifiedConstructor "mk" ''TNoArg+ unifiedConstructorTest :: Test unifiedConstructorTest = testGroup "UnifiedConstructor" [ testCase "mkUnifiedConstructor" $ do- let f ::- forall mode.- (EvalMode mode, UnifiedData mode (T mode SymInteger)) =>- GetData mode (T mode SymInteger)- f =- mkT @mode- (toSym True)- (10 :: SymInteger)- (mkT1 @mode @SymInteger)- f @'Con @?= T True 10 T1- f @'Sym @?= (mrgReturn (T (con True) 10 (mrgReturn T1)))+ f @?= Identity (T True 10 (Identity T1))+ f+ @?= ( mrgReturn (T (con True) 10 (mrgReturn T1)) ::+ Union (T 'Sym SymInteger)+ ),+ testCase "NoMode" $ do+ tNoMode0 True (10 :: Int) TNoMode1+ @?= Identity (TNoMode0 True 10 TNoMode1)+ tNoMode1 @?= (mrgReturn TNoMode1 :: Union (TNoMode Int)),+ testCase "NoArg" $ do+ mkTNoArg @?= Identity TNoArg+ mkTNoArg @?= (mrgReturn TNoArg :: Union TNoArg) ]
test/Main.hs view
@@ -9,6 +9,7 @@ ) import Grisette.Core.Control.ExceptionTests (exceptionTests) import Grisette.Core.Control.Monad.UnionTests (unionTests)+import Grisette.Core.Data.Class.BitCastTests (bitCastTests) import qualified Grisette.Core.Data.Class.BoolTests import Grisette.Core.Data.Class.EvalSymTests (evalSymTests) import Grisette.Core.Data.Class.ExtractSymTests (extractSymTests)@@ -16,13 +17,14 @@ import Grisette.Core.Data.Class.MergeableTests (mergeableTests) import Grisette.Core.Data.Class.PPrintTests (pprintTests) import Grisette.Core.Data.Class.PlainUnionTests (plainUnionTests)-import Grisette.Core.Data.Class.SafeDivisionTests (safeDivisionTests)+import Grisette.Core.Data.Class.SafeDivTests (safeDivTests) import Grisette.Core.Data.Class.SafeLinearArithTests (safeLinearArithTests) import Grisette.Core.Data.Class.SafeSymRotateTests (safeSymRotateTests) import Grisette.Core.Data.Class.SafeSymShiftTests (safeSymShiftTests) import Grisette.Core.Data.Class.SimpleMergeableTests (simpleMergeableTests) import Grisette.Core.Data.Class.SubstSymTests (substSymTests) import Grisette.Core.Data.Class.SymEqTests (seqTests)+import Grisette.Core.Data.Class.SymFiniteBitsTests (symFiniteBitsTests) import Grisette.Core.Data.Class.SymOrdTests (sordTests) import Grisette.Core.Data.Class.SymRotateTests (symRotateTests) import Grisette.Core.Data.Class.SymShiftTests (symShiftTests)@@ -52,8 +54,10 @@ import Grisette.Lib.Data.FunctorTests (functorFunctionTests) import Grisette.Lib.Data.ListTests (listTests) import Grisette.Lib.Data.TraversableTests (traversableFunctionTests)+import Grisette.SymPrim.AlgRealTests (algRealTests) import qualified Grisette.SymPrim.BVTests import Grisette.SymPrim.FPTests (fpTests)+import Grisette.SymPrim.GeneralFunTests (generalFunTests) import qualified Grisette.SymPrim.Prim.BVTests import Grisette.SymPrim.Prim.BitsTests (bitsTests) import qualified Grisette.SymPrim.Prim.BoolTests@@ -63,7 +67,9 @@ import Grisette.SymPrim.Prim.ModelTests (modelTests) import Grisette.SymPrim.Prim.NumTests (numTests) import qualified Grisette.SymPrim.Prim.TabularFunTests+import Grisette.SymPrim.QuantifierTests (quantifierTests) import Grisette.SymPrim.SomeBVTests (someBVTests)+import Grisette.SymPrim.SymGeneralFunTests (symGeneralFunTests) import Grisette.SymPrim.SymPrimTests (symPrimTests) import qualified Grisette.SymPrim.TabularFunTests import Grisette.Unified.EvalModeTest (evalModeTest)@@ -97,14 +103,15 @@ "Data" [ testGroup "Class"- [ Grisette.Core.Data.Class.BoolTests.boolTests,+ [ bitCastTests,+ Grisette.Core.Data.Class.BoolTests.boolTests, evalSymTests, extractSymTests, genSymTests, pprintTests, mergeableTests, plainUnionTests,- safeDivisionTests,+ safeDivTests, safeLinearArithTests, safeSymShiftTests, safeSymRotateTests,@@ -112,6 +119,7 @@ sordTests, simpleMergeableTests, substSymTests,+ symFiniteBitsTests, symRotateTests, symShiftTests, toConTests,@@ -175,8 +183,12 @@ symPrimTests, Grisette.SymPrim.TabularFunTests.tabularFunTests, Grisette.SymPrim.BVTests.bvTests,+ algRealTests,+ generalFunTests,+ symGeneralFunTests, someBVTests,- fpTests+ fpTests,+ quantifierTests ] sbvTests :: Test