Copyright | (c) Sirui Lu 2021-2024 |
---|---|
License | BSD-3-Clause (see the LICENSE file) |
Maintainer | siruilu@cs.washington.edu |
Stability | Experimental |
Portability | GHC only |
Safe Haskell | None |
Language | Haskell2010 |
Grisette.Internal.Core.Data.Class.SymEq
Description
Synopsis
- class SymEq a where
- class (forall a. SymEq a => SymEq (f a)) => SymEq1 (f :: Type -> Type) where
- symEq1 :: (SymEq a, SymEq1 f) => f a -> f a -> SymBool
- class (forall a. SymEq a => SymEq1 (f a)) => SymEq2 (f :: Type -> Type -> Type) where
- liftSymEq2 :: (a -> b -> SymBool) -> (c -> d -> SymBool) -> f a c -> f b d -> SymBool
- symEq2 :: (SymEq a, SymEq b, SymEq2 f) => f a b -> f a b -> SymBool
- pairwiseSymDistinct :: SymEq a => [a] -> SymBool
- distinct :: Eq a => [a] -> Bool
- data family SymEqArgs arity a b
- class GSymEq arity (f :: Type -> Type) where
- genericSymEq :: (Generic a, GSymEq Arity0 (Rep a)) => a -> a -> SymBool
- genericLiftSymEq :: (Generic1 f, GSymEq Arity1 (Rep1 f)) => (a -> b -> SymBool) -> f a -> f b -> SymBool
Symbolic equality
Symbolic equality. Note that we can't use Haskell's Eq
class since
symbolic comparison won't necessarily return a concrete Bool
value.
>>>
let a = 1 :: SymInteger
>>>
let b = 2 :: SymInteger
>>>
a .== b
false>>>
a ./= b
true
>>>
let a = "a" :: SymInteger
>>>
let b = "b" :: SymInteger
>>>
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.
data X = ... deriving Generic deriving SymEq via (Default X)
Methods
(.==) :: a -> a -> SymBool infix 4 Source #
(./=) :: a -> a -> SymBool infix 4 Source #
symDistinct :: [a] -> SymBool Source #
Check if all elements in a list are distinct, under the symbolic equality semantics.
Instances
SymEq ByteString Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: ByteString -> ByteString -> SymBool Source # (./=) :: ByteString -> ByteString -> SymBool Source # symDistinct :: [ByteString] -> SymBool Source # | |
SymEq All Source # | |
SymEq Any Source # | |
SymEq Int16 Source # | |
SymEq Int32 Source # | |
SymEq Int64 Source # | |
SymEq Int8 Source # | |
SymEq Word16 Source # | |
SymEq Word32 Source # | |
SymEq Word64 Source # | |
SymEq Word8 Source # | |
SymEq Ordering Source # | |
SymEq AssertionError Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: AssertionError -> AssertionError -> SymBool Source # (./=) :: AssertionError -> AssertionError -> SymBool Source # symDistinct :: [AssertionError] -> SymBool Source # | |
SymEq VerificationConditions Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: VerificationConditions -> VerificationConditions -> SymBool Source # (./=) :: VerificationConditions -> VerificationConditions -> SymBool Source # symDistinct :: [VerificationConditions] -> SymBool Source # | |
SymEq AlgReal Source # | |
SymEq FPRoundingMode Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: FPRoundingMode -> FPRoundingMode -> SymBool Source # (./=) :: FPRoundingMode -> FPRoundingMode -> SymBool Source # symDistinct :: [FPRoundingMode] -> SymBool Source # | |
SymEq NotRepresentableFPError Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: NotRepresentableFPError -> NotRepresentableFPError -> SymBool Source # (./=) :: NotRepresentableFPError -> NotRepresentableFPError -> SymBool Source # symDistinct :: [NotRepresentableFPError] -> SymBool Source # | |
SymEq SomeBVException Source # | |
Defined in Grisette.Internal.SymPrim.SomeBV Methods (.==) :: SomeBVException -> SomeBVException -> SymBool Source # (./=) :: SomeBVException -> SomeBVException -> SymBool Source # symDistinct :: [SomeBVException] -> SymBool Source # | |
SymEq SymAlgReal Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: SymAlgReal -> SymAlgReal -> SymBool Source # (./=) :: SymAlgReal -> SymAlgReal -> SymBool Source # symDistinct :: [SymAlgReal] -> SymBool Source # | |
SymEq SymBool Source # | |
SymEq SymFPRoundingMode Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: SymFPRoundingMode -> SymFPRoundingMode -> SymBool Source # (./=) :: SymFPRoundingMode -> SymFPRoundingMode -> SymBool Source # symDistinct :: [SymFPRoundingMode] -> SymBool Source # | |
SymEq SymInteger Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: SymInteger -> SymInteger -> SymBool Source # (./=) :: SymInteger -> SymInteger -> SymBool Source # symDistinct :: [SymInteger] -> SymBool Source # | |
SymEq Text Source # | |
SymEq Integer Source # | |
SymEq () Source # | |
SymEq Bool Source # | |
SymEq Char Source # | |
SymEq Double Source # | |
SymEq Float Source # | |
SymEq Int Source # | |
SymEq Word Source # | |
(Generic a, GSymEq Arity0 (Rep a)) => SymEq (Default a) Source # | |
SymEq a => SymEq (Identity a) Source # | |
SymEq a => SymEq (First a) Source # | |
SymEq a => SymEq (Last a) Source # | |
SymEq a => SymEq (Down a) Source # | |
SymEq a => SymEq (Dual a) Source # | |
SymEq a => SymEq (Product a) Source # | |
SymEq a => SymEq (Sum a) Source # | |
SymEq p => SymEq (Par1 p) Source # | |
SymEq a => SymEq (Ratio a) Source # | |
SymEq a => SymEq (Union a) Source # | |
(KnownNat n, 1 <= n) => SymEq (IntN n) Source # | |
(KnownNat n, 1 <= n) => SymEq (WordN n) Source # | |
(forall (n :: Nat). (KnownNat n, 1 <= n) => SymEq (bv n), forall (n :: Nat). (KnownNat n, 1 <= n) => Num (bv n), MaySomeBV bv) => SymEq (SomeBV bv) Source # | The
|
(KnownNat n, 1 <= n) => SymEq (SymIntN n) Source # | |
(KnownNat n, 1 <= n) => SymEq (SymWordN n) Source # | |
SymEq a => SymEq (Maybe a) Source # | |
SymEq a => SymEq [a] Source # | |
(Generic1 f, GSymEq Arity1 (Rep1 f), SymEq a) => SymEq (Default1 f a) Source # | |
(SymEq a1, SymEq a2) => SymEq (Either a1 a2) Source # | |
SymEq (Proxy a) Source # | |
SymEq (U1 p) Source # | |
SymEq (V1 p) Source # | |
(SymEq e, SymEq a) => SymEq (CBMCEither e a) Source # | |
Defined in Grisette.Internal.Core.Control.Monad.CBMCExcept Methods (.==) :: CBMCEither e a -> CBMCEither e a -> SymBool Source # (./=) :: CBMCEither e a -> CBMCEither e a -> SymBool Source # symDistinct :: [CBMCEither e a] -> SymBool Source # | |
ValidFP eb sb => SymEq (FP eb sb) Source # | |
ValidFP eb sb => SymEq (SymFP eb sb) Source # | |
(SymEq1 a1, SymEq a2) => SymEq (MaybeT a1 a2) Source # | |
(SymEq a1, SymEq a2) => SymEq (a1, a2) Source # | |
SymEq a => SymEq (Const a b) Source # | |
SymEq (f a) => SymEq (Ap f a) Source # | |
SymEq (f a) => SymEq (Alt f a) Source # | |
SymEq (f p) => SymEq (Rec1 f p) Source # | |
SymEq (m (CBMCEither e a)) => SymEq (CBMCExceptT e m a) Source # | |
Defined in Grisette.Internal.Core.Control.Monad.CBMCExcept Methods (.==) :: CBMCExceptT e m a -> CBMCExceptT e m a -> SymBool Source # (./=) :: CBMCExceptT e m a -> CBMCExceptT e m a -> SymBool Source # symDistinct :: [CBMCExceptT e m a] -> SymBool Source # | |
(SymEq a1, SymEq1 a2, SymEq a3) => SymEq (ExceptT a1 a2 a3) Source # | |
(SymEq1 m, SymEq a) => SymEq (IdentityT m a) Source # | |
(SymEq a1, SymEq1 a2, SymEq a3) => SymEq (WriterT a1 a2 a3) Source # | |
(SymEq a1, SymEq1 a2, SymEq a3) => SymEq (WriterT a1 a2 a3) Source # | |
(SymEq a1, SymEq a2, SymEq a3) => SymEq (a1, a2, a3) Source # | |
(SymEq (l a), SymEq (r a)) => SymEq (Product l r a) Source # | |
(SymEq (l a), SymEq (r a)) => SymEq (Sum l r a) Source # | |
(SymEq (f p), SymEq (g p)) => SymEq ((f :*: g) p) Source # | |
(SymEq (f p), SymEq (g p)) => SymEq ((f :+: g) p) Source # | |
SymEq c => SymEq (K1 i c p) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4) => SymEq (a1, a2, a3, a4) Source # | |
SymEq (f (g a)) => SymEq (Compose f g a) Source # | |
SymEq (f (g p)) => SymEq ((f :.: g) p) Source # | |
SymEq (f p) => SymEq (M1 i c f p) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5) => SymEq (a1, a2, a3, a4, a5) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6) => SymEq (a1, a2, a3, a4, a5, a6) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7) => SymEq (a1, a2, a3, a4, a5, a6, a7) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8) => SymEq (a1, a2, a3, a4, a5, a6, a7, a8) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9) => SymEq (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9, SymEq a10) => SymEq (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -> SymBool Source # (./=) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -> SymBool Source # symDistinct :: [(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)] -> SymBool Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9, SymEq a10, SymEq a11) => SymEq (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) -> SymBool Source # (./=) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) -> SymBool Source # symDistinct :: [(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)] -> SymBool Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9, SymEq a10, SymEq a11, SymEq a12) => SymEq (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) -> SymBool Source # (./=) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) -> SymBool Source # symDistinct :: [(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)] -> SymBool Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9, SymEq a10, SymEq a11, SymEq a12, SymEq a13) => SymEq (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) -> SymBool Source # (./=) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) -> SymBool Source # symDistinct :: [(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)] -> SymBool Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9, SymEq a10, SymEq a11, SymEq a12, SymEq a13, SymEq a14) => SymEq (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) -> SymBool Source # (./=) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) -> SymBool Source # symDistinct :: [(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)] -> SymBool Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9, SymEq a10, SymEq a11, SymEq a12, SymEq a13, SymEq a14, SymEq a15) => SymEq (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) Source # | |
Defined in Grisette.Internal.Internal.Impl.Core.Data.Class.SymEq Methods (.==) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) -> SymBool Source # (./=) :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) -> SymBool Source # symDistinct :: [(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)] -> SymBool Source # |
class (forall a. SymEq a => SymEq (f a)) => SymEq1 (f :: Type -> Type) where Source #
Lifting of the SymEq
class to unary type constructors.
Any instance should be subject to the following law that canonicity is preserved:
liftSymEq (.==)
should be equivalent to (.==)
, under the symbolic
semantics.
This class therefore represents the generalization of SymEq
by decomposing
its main method into a canonical lifting on a canonical inner method, so that
the lifting can be reused for other arguments than the canonical one.
Methods
liftSymEq :: (a -> b -> SymBool) -> f a -> f b -> SymBool Source #
Lift a symbolic equality test through the type constructor.
The function will usually be applied to an symbolic equality function, but the more general type ensures that the implementation uses it to compare elements of the first container with elements of the second.
Instances
symEq1 :: (SymEq a, SymEq1 f) => f a -> f a -> SymBool Source #
Lift the standard (
function through the type constructor..==
)
class (forall a. SymEq a => SymEq1 (f a)) => SymEq2 (f :: Type -> Type -> Type) where Source #
Lifting of the SymEq
class to binary type constructors.
Methods
liftSymEq2 :: (a -> b -> SymBool) -> (c -> d -> SymBool) -> f a c -> f b d -> SymBool Source #
Lift symbolic equality tests through the type constructor.
The function will usually be applied to an symbolic equality function, but the more general type ensures that the implementation uses it to compare elements of the first container with elements of the second.
Instances
SymEq2 Either Source # | |
SymEq2 (,) Source # | |
SymEq a => SymEq2 ((,,) a) Source # | |
(SymEq a1, SymEq a2) => SymEq2 ((,,,) a1 a2) Source # | |
(SymEq a1, SymEq a2, SymEq a3) => SymEq2 ((,,,,) a1 a2 a3) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4) => SymEq2 ((,,,,,) a1 a2 a3 a4) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5) => SymEq2 ((,,,,,,) a1 a2 a3 a4 a5) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6) => SymEq2 ((,,,,,,,) a1 a2 a3 a4 a5 a6) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7) => SymEq2 ((,,,,,,,,) a1 a2 a3 a4 a5 a6 a7) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8) => SymEq2 ((,,,,,,,,,) a1 a2 a3 a4 a5 a6 a7 a8) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9) => SymEq2 ((,,,,,,,,,,) a1 a2 a3 a4 a5 a6 a7 a8 a9) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9, SymEq a10) => SymEq2 ((,,,,,,,,,,,) a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9, SymEq a10, SymEq a11) => SymEq2 ((,,,,,,,,,,,,) a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9, SymEq a10, SymEq a11, SymEq a12) => SymEq2 ((,,,,,,,,,,,,,) a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) Source # | |
(SymEq a1, SymEq a2, SymEq a3, SymEq a4, SymEq a5, SymEq a6, SymEq a7, SymEq a8, SymEq a9, SymEq a10, SymEq a11, SymEq a12, SymEq a13) => SymEq2 ((,,,,,,,,,,,,,,) a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) Source # | |
symEq2 :: (SymEq a, SymEq b, SymEq2 f) => f a b -> f a b -> SymBool Source #
Lift the standard (
function through the type constructor..==
)
pairwiseSymDistinct :: SymEq a => [a] -> SymBool Source #
Default pairwise symbolic distinct implementation.
More Eq
helper
distinct :: Eq a => [a] -> Bool Source #
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
Generic SymEq
data family SymEqArgs arity a b Source #
The arguments to the generic equality function.
Instances
data SymEqArgs Arity0 _ _1 Source # | |
newtype SymEqArgs Arity1 a b Source # | |
class GSymEq arity (f :: Type -> Type) where Source #
The class of types that can be generically compared for symbolic equality.
Instances
GSymEq Arity1 Par1 Source # | |
GSymEq arity (U1 :: Type -> Type) Source # | |
GSymEq arity (V1 :: Type -> Type) Source # | |
SymEq1 f => GSymEq Arity1 (Rec1 f) Source # | |
(GSymEq arity a, GSymEq arity b) => GSymEq arity (a :*: b) Source # | |
(GSymEq arity a, GSymEq arity b) => GSymEq arity (a :+: b) Source # | |
SymEq a => GSymEq arity (K1 i a :: Type -> Type) Source # | |
(SymEq1 f, GSymEq Arity1 g) => GSymEq Arity1 (f :.: g) Source # | |
GSymEq arity a => GSymEq arity (M1 i c a) Source # | |