hasmtlib 2.1.0 → 2.2.0
raw patch · 7 files changed
+187/−79 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Language.Hasmtlib.Codec: -- | Resulting of decoding <tt>a</tt>
+ Language.Hasmtlib.Codec: class GCodec f where {
+ Language.Hasmtlib.Codec: gdecode :: GCodec f => Solution -> f a -> Maybe (GDecoded f a)
+ Language.Hasmtlib.Codec: gencode :: GCodec f => GDecoded f a -> f a
+ Language.Hasmtlib.Codec: instance (Language.Hasmtlib.Codec.GCodec f, Language.Hasmtlib.Codec.GCodec g) => Language.Hasmtlib.Codec.GCodec (f GHC.Generics.:*: g)
+ Language.Hasmtlib.Codec: instance (Language.Hasmtlib.Codec.GCodec f, Language.Hasmtlib.Codec.GCodec g) => Language.Hasmtlib.Codec.GCodec (f GHC.Generics.:+: g)
+ Language.Hasmtlib.Codec: instance Language.Hasmtlib.Codec.Codec a => Language.Hasmtlib.Codec.Codec (Data.Functor.Identity.Identity a)
+ Language.Hasmtlib.Codec: instance Language.Hasmtlib.Codec.Codec a => Language.Hasmtlib.Codec.Codec (Data.Monoid.First a)
+ Language.Hasmtlib.Codec: instance Language.Hasmtlib.Codec.Codec a => Language.Hasmtlib.Codec.Codec (Data.Monoid.Last a)
+ Language.Hasmtlib.Codec: instance Language.Hasmtlib.Codec.Codec a => Language.Hasmtlib.Codec.Codec (Data.Semigroup.Internal.Dual a)
+ Language.Hasmtlib.Codec: instance Language.Hasmtlib.Codec.Codec a => Language.Hasmtlib.Codec.Codec (Data.Semigroup.Internal.Product a)
+ Language.Hasmtlib.Codec: instance Language.Hasmtlib.Codec.Codec a => Language.Hasmtlib.Codec.Codec (Data.Semigroup.Internal.Sum a)
+ Language.Hasmtlib.Codec: instance Language.Hasmtlib.Codec.Codec a => Language.Hasmtlib.Codec.GCodec (GHC.Generics.K1 i a)
+ Language.Hasmtlib.Codec: instance Language.Hasmtlib.Codec.GCodec GHC.Generics.U1
+ Language.Hasmtlib.Codec: instance Language.Hasmtlib.Codec.GCodec GHC.Generics.V1
+ Language.Hasmtlib.Codec: instance Language.Hasmtlib.Codec.GCodec f => Language.Hasmtlib.Codec.GCodec (GHC.Generics.M1 i c f)
+ Language.Hasmtlib.Codec: type GDecoded f :: Type -> Type;
+ Language.Hasmtlib.Equatable: instance (Language.Hasmtlib.Equatable.Equatable a, Language.Hasmtlib.Equatable.Equatable b) => Language.Hasmtlib.Equatable.Equatable (Data.Either.Either a b)
+ Language.Hasmtlib.Equatable: instance (Language.Hasmtlib.Equatable.Equatable a, Language.Hasmtlib.Equatable.Equatable b) => Language.Hasmtlib.Equatable.Equatable (a, b)
+ Language.Hasmtlib.Equatable: instance (Language.Hasmtlib.Equatable.Equatable a, Language.Hasmtlib.Equatable.Equatable b, Language.Hasmtlib.Equatable.Equatable c) => Language.Hasmtlib.Equatable.Equatable (a, b, c)
+ Language.Hasmtlib.Equatable: instance (Language.Hasmtlib.Equatable.Equatable a, Language.Hasmtlib.Equatable.Equatable b, Language.Hasmtlib.Equatable.Equatable c, Language.Hasmtlib.Equatable.Equatable d) => Language.Hasmtlib.Equatable.Equatable (a, b, c, d)
+ Language.Hasmtlib.Equatable: instance (Language.Hasmtlib.Equatable.Equatable a, Language.Hasmtlib.Equatable.Equatable b, Language.Hasmtlib.Equatable.Equatable c, Language.Hasmtlib.Equatable.Equatable d, Language.Hasmtlib.Equatable.Equatable e) => Language.Hasmtlib.Equatable.Equatable (a, b, c, d, e)
+ Language.Hasmtlib.Equatable: instance (Language.Hasmtlib.Equatable.Equatable a, Language.Hasmtlib.Equatable.Equatable b, Language.Hasmtlib.Equatable.Equatable c, Language.Hasmtlib.Equatable.Equatable d, Language.Hasmtlib.Equatable.Equatable e, Language.Hasmtlib.Equatable.Equatable f) => Language.Hasmtlib.Equatable.Equatable (a, b, c, d, e, f)
+ Language.Hasmtlib.Equatable: instance (Language.Hasmtlib.Equatable.Equatable a, Language.Hasmtlib.Equatable.Equatable b, Language.Hasmtlib.Equatable.Equatable c, Language.Hasmtlib.Equatable.Equatable d, Language.Hasmtlib.Equatable.Equatable e, Language.Hasmtlib.Equatable.Equatable f, Language.Hasmtlib.Equatable.Equatable g) => Language.Hasmtlib.Equatable.Equatable (a, b, c, d, e, f, g)
+ Language.Hasmtlib.Equatable: instance (Language.Hasmtlib.Equatable.Equatable a, Language.Hasmtlib.Equatable.Equatable b, Language.Hasmtlib.Equatable.Equatable c, Language.Hasmtlib.Equatable.Equatable d, Language.Hasmtlib.Equatable.Equatable e, Language.Hasmtlib.Equatable.Equatable f, Language.Hasmtlib.Equatable.Equatable g, Language.Hasmtlib.Equatable.Equatable h) => Language.Hasmtlib.Equatable.Equatable (a, b, c, d, e, f, g, h)
+ Language.Hasmtlib.Equatable: instance Language.Hasmtlib.Equatable.Equatable a => Language.Hasmtlib.Equatable.Equatable (Data.Functor.Identity.Identity a)
+ Language.Hasmtlib.Equatable: instance Language.Hasmtlib.Equatable.Equatable a => Language.Hasmtlib.Equatable.Equatable (Data.Monoid.First a)
+ Language.Hasmtlib.Equatable: instance Language.Hasmtlib.Equatable.Equatable a => Language.Hasmtlib.Equatable.Equatable (Data.Monoid.Last a)
+ Language.Hasmtlib.Equatable: instance Language.Hasmtlib.Equatable.Equatable a => Language.Hasmtlib.Equatable.Equatable (Data.Semigroup.Internal.Dual a)
+ Language.Hasmtlib.Equatable: instance Language.Hasmtlib.Equatable.Equatable a => Language.Hasmtlib.Equatable.Equatable (Data.Semigroup.Internal.Product a)
+ Language.Hasmtlib.Equatable: instance Language.Hasmtlib.Equatable.Equatable a => Language.Hasmtlib.Equatable.Equatable (Data.Semigroup.Internal.Sum a)
+ Language.Hasmtlib.Equatable: instance Language.Hasmtlib.Equatable.Equatable a => Language.Hasmtlib.Equatable.Equatable (Data.Tree.Tree a)
+ Language.Hasmtlib.Equatable: instance Language.Hasmtlib.Equatable.Equatable a => Language.Hasmtlib.Equatable.Equatable (GHC.Maybe.Maybe a)
+ Language.Hasmtlib.Equatable: instance Language.Hasmtlib.Equatable.Equatable a => Language.Hasmtlib.Equatable.Equatable [a]
+ Language.Hasmtlib.Iteable: instance Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) a => Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) (Data.Functor.Identity.Identity a)
+ Language.Hasmtlib.Iteable: instance Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) a => Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) (Data.Monoid.First a)
+ Language.Hasmtlib.Iteable: instance Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) a => Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) (Data.Monoid.Last a)
+ Language.Hasmtlib.Iteable: instance Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) a => Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) (Data.Semigroup.Internal.Dual a)
+ Language.Hasmtlib.Iteable: instance Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) a => Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) (Data.Semigroup.Internal.Product a)
+ Language.Hasmtlib.Iteable: instance Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) a => Language.Hasmtlib.Iteable.Iteable (Language.Hasmtlib.Internal.Expr.Expr 'Language.Hasmtlib.Type.SMTSort.BoolSort) (Data.Semigroup.Internal.Sum a)
+ Language.Hasmtlib.Orderable: instance (Language.Hasmtlib.Orderable.Orderable a, Language.Hasmtlib.Orderable.Orderable b) => Language.Hasmtlib.Orderable.Orderable (Data.Either.Either a b)
+ Language.Hasmtlib.Orderable: instance (Language.Hasmtlib.Orderable.Orderable a, Language.Hasmtlib.Orderable.Orderable b) => Language.Hasmtlib.Orderable.Orderable (a, b)
+ Language.Hasmtlib.Orderable: instance (Language.Hasmtlib.Orderable.Orderable a, Language.Hasmtlib.Orderable.Orderable b, Language.Hasmtlib.Orderable.Orderable c) => Language.Hasmtlib.Orderable.Orderable (a, b, c)
+ Language.Hasmtlib.Orderable: instance (Language.Hasmtlib.Orderable.Orderable a, Language.Hasmtlib.Orderable.Orderable b, Language.Hasmtlib.Orderable.Orderable c, Language.Hasmtlib.Orderable.Orderable d) => Language.Hasmtlib.Orderable.Orderable (a, b, c, d)
+ Language.Hasmtlib.Orderable: instance (Language.Hasmtlib.Orderable.Orderable a, Language.Hasmtlib.Orderable.Orderable b, Language.Hasmtlib.Orderable.Orderable c, Language.Hasmtlib.Orderable.Orderable d, Language.Hasmtlib.Orderable.Orderable e) => Language.Hasmtlib.Orderable.Orderable (a, b, c, d, e)
+ Language.Hasmtlib.Orderable: instance (Language.Hasmtlib.Orderable.Orderable a, Language.Hasmtlib.Orderable.Orderable b, Language.Hasmtlib.Orderable.Orderable c, Language.Hasmtlib.Orderable.Orderable d, Language.Hasmtlib.Orderable.Orderable e, Language.Hasmtlib.Orderable.Orderable f) => Language.Hasmtlib.Orderable.Orderable (a, b, c, d, e, f)
+ Language.Hasmtlib.Orderable: instance (Language.Hasmtlib.Orderable.Orderable a, Language.Hasmtlib.Orderable.Orderable b, Language.Hasmtlib.Orderable.Orderable c, Language.Hasmtlib.Orderable.Orderable d, Language.Hasmtlib.Orderable.Orderable e, Language.Hasmtlib.Orderable.Orderable f, Language.Hasmtlib.Orderable.Orderable g) => Language.Hasmtlib.Orderable.Orderable (a, b, c, d, e, f, g)
+ Language.Hasmtlib.Orderable: instance (Language.Hasmtlib.Orderable.Orderable a, Language.Hasmtlib.Orderable.Orderable b, Language.Hasmtlib.Orderable.Orderable c, Language.Hasmtlib.Orderable.Orderable d, Language.Hasmtlib.Orderable.Orderable e, Language.Hasmtlib.Orderable.Orderable f, Language.Hasmtlib.Orderable.Orderable g, Language.Hasmtlib.Orderable.Orderable h) => Language.Hasmtlib.Orderable.Orderable (a, b, c, d, e, f, g, h)
+ Language.Hasmtlib.Orderable: instance Language.Hasmtlib.Orderable.Orderable a => Language.Hasmtlib.Orderable.Orderable (Data.Functor.Identity.Identity a)
+ Language.Hasmtlib.Orderable: instance Language.Hasmtlib.Orderable.Orderable a => Language.Hasmtlib.Orderable.Orderable (Data.Monoid.First a)
+ Language.Hasmtlib.Orderable: instance Language.Hasmtlib.Orderable.Orderable a => Language.Hasmtlib.Orderable.Orderable (Data.Monoid.Last a)
+ Language.Hasmtlib.Orderable: instance Language.Hasmtlib.Orderable.Orderable a => Language.Hasmtlib.Orderable.Orderable (Data.Semigroup.Internal.Dual a)
+ Language.Hasmtlib.Orderable: instance Language.Hasmtlib.Orderable.Orderable a => Language.Hasmtlib.Orderable.Orderable (Data.Semigroup.Internal.Product a)
+ Language.Hasmtlib.Orderable: instance Language.Hasmtlib.Orderable.Orderable a => Language.Hasmtlib.Orderable.Orderable (Data.Semigroup.Internal.Sum a)
+ Language.Hasmtlib.Orderable: instance Language.Hasmtlib.Orderable.Orderable a => Language.Hasmtlib.Orderable.Orderable (Data.Tree.Tree a)
+ Language.Hasmtlib.Orderable: instance Language.Hasmtlib.Orderable.Orderable a => Language.Hasmtlib.Orderable.Orderable (GHC.Maybe.Maybe a)
+ Language.Hasmtlib.Orderable: instance Language.Hasmtlib.Orderable.Orderable a => Language.Hasmtlib.Orderable.Orderable [a]
+ Language.Hasmtlib.Variable: class GVariable f
+ Language.Hasmtlib.Variable: gvariable :: (GVariable f, MonadSMT s m) => m (f a)
+ Language.Hasmtlib.Variable: instance Language.Hasmtlib.Variable.GVariable GHC.Generics.U1
+ Language.Hasmtlib.Variable: instance Language.Hasmtlib.Variable.Variable a => Language.Hasmtlib.Variable.GVariable (GHC.Generics.K1 i a)
+ Language.Hasmtlib.Variable: instance Language.Hasmtlib.Variable.Variable a => Language.Hasmtlib.Variable.Variable (Data.Functor.Identity.Identity a)
+ Language.Hasmtlib.Variable: instance Language.Hasmtlib.Variable.Variable a => Language.Hasmtlib.Variable.Variable (Data.Monoid.First a)
+ Language.Hasmtlib.Variable: instance Language.Hasmtlib.Variable.Variable a => Language.Hasmtlib.Variable.Variable (Data.Monoid.Last a)
+ Language.Hasmtlib.Variable: instance Language.Hasmtlib.Variable.Variable a => Language.Hasmtlib.Variable.Variable (Data.Semigroup.Internal.Dual a)
+ Language.Hasmtlib.Variable: instance Language.Hasmtlib.Variable.Variable a => Language.Hasmtlib.Variable.Variable (Data.Semigroup.Internal.Product a)
+ Language.Hasmtlib.Variable: instance Language.Hasmtlib.Variable.Variable a => Language.Hasmtlib.Variable.Variable (Data.Semigroup.Internal.Sum a)
+ Language.Hasmtlib.Variable: instance forall k (f :: k -> *) (a :: k). Language.Hasmtlib.Variable.Variable (f a) => Language.Hasmtlib.Variable.Variable (Data.Semigroup.Internal.Alt f a)
+ Language.Hasmtlib.Variable: instance forall k (f :: k -> *) (g :: k -> *). (Language.Hasmtlib.Variable.GVariable f, Language.Hasmtlib.Variable.GVariable g) => Language.Hasmtlib.Variable.GVariable (f GHC.Generics.:*: g)
+ Language.Hasmtlib.Variable: instance forall k (f :: k -> *) i (c :: GHC.Generics.Meta). Language.Hasmtlib.Variable.GVariable f => Language.Hasmtlib.Variable.GVariable (GHC.Generics.M1 i c f)
+ Language.Hasmtlib.Variable: instance forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1). Language.Hasmtlib.Variable.Variable (f (g a)) => Language.Hasmtlib.Variable.Variable (Data.Functor.Compose.Compose f g a)
+ Language.Hasmtlib.Variable: instance forall k m (a :: k). Language.Hasmtlib.Variable.Variable m => Language.Hasmtlib.Variable.Variable (Data.Functor.Const.Const m a)
- Language.Hasmtlib.Codec: decode :: (Codec a, Traversable f, Codec b, a ~ f b, Decoded a ~ f (Decoded b)) => Solution -> a -> Maybe (Decoded a)
+ Language.Hasmtlib.Codec: decode :: (Codec a, Generic a, Generic (Decoded a), GCodec (Rep a), GDecoded (Rep a) x ~ Rep (Decoded a) x) => Solution -> a -> Maybe (Decoded a)
- Language.Hasmtlib.Codec: encode :: (Codec a, Functor f, Codec b, a ~ f b, Decoded a ~ f (Decoded b)) => Decoded a -> a
+ Language.Hasmtlib.Codec: encode :: (Codec a, Generic a, Generic (Decoded a), GCodec (Rep a), GDecoded (Rep a) x ~ Rep (Decoded a) x) => Decoded a -> a
- Language.Hasmtlib.Type.ArrayMap: arrConst :: forall k_ajJZ v_ajK0. Lens' (ConstArray k_ajJZ v_ajK0) v_ajK0
+ Language.Hasmtlib.Type.ArrayMap: arrConst :: forall k_ajKf v_ajKg. Lens' (ConstArray k_ajKf v_ajKg) v_ajKg
- Language.Hasmtlib.Type.ArrayMap: stored :: forall k_ajJZ v_ajK0 k_alco. Lens (ConstArray k_ajJZ v_ajK0) (ConstArray k_alco v_ajK0) (Map k_ajJZ v_ajK0) (Map k_alco v_ajK0)
+ Language.Hasmtlib.Type.ArrayMap: stored :: forall k_ajKf v_ajKg k_alcE. Lens (ConstArray k_ajKf v_ajKg) (ConstArray k_alcE v_ajKg) (Map k_ajKf v_ajKg) (Map k_alcE v_ajKg)
- Language.Hasmtlib.Type.Expr: varId :: forall t_asDF t_asJY. Iso (SMTVar t_asDF) (SMTVar t_asJY) Int Int
+ Language.Hasmtlib.Type.Expr: varId :: forall t_asDV t_asKe. Iso (SMTVar t_asDV) (SMTVar t_asKe) Int Int
- Language.Hasmtlib.Type.Solution: solVal :: forall t_aIfF. Lens' (SMTVarSol t_aIfF) (Value t_aIfF)
+ Language.Hasmtlib.Type.Solution: solVal :: forall t_aP7j. Lens' (SMTVarSol t_aP7j) (Value t_aP7j)
- Language.Hasmtlib.Type.Solution: solVar :: forall t_aIfF. Lens' (SMTVarSol t_aIfF) (SMTVar t_aIfF)
+ Language.Hasmtlib.Type.Solution: solVar :: forall t_aP7j. Lens' (SMTVarSol t_aP7j) (SMTVar t_aP7j)
- Language.Hasmtlib.Variable: variable :: (Variable a, MonadSMT s m, Applicative f, Traversable f, Variable b, a ~ f b) => m a
+ Language.Hasmtlib.Variable: variable :: (Variable a, MonadSMT s m, Generic a, GVariable (Rep a)) => m a
Files
- CHANGELOG.md +8/−0
- hasmtlib.cabal +1/−1
- src/Language/Hasmtlib/Codec.hs +82/−53
- src/Language/Hasmtlib/Equatable.hs +22/−0
- src/Language/Hasmtlib/Iteable.hs +8/−0
- src/Language/Hasmtlib/Orderable.hs +23/−0
- src/Language/Hasmtlib/Variable.hs +43/−25
CHANGELOG.md view
@@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [PVP versioning](https://pvp.haskell.org/). +## v2.2.0 _(2024-08-09)_++### Added+- Added multiple basic instances for `Equatable`, `Orderable`, `Iteable`, `Variable` & `Codec`++### Changed+- *(breaking change)* `Variable` & `Codec` now ship with a `Generic` default implementation instead of relying on `Applicative`. This will break your instances if the type does not have an instance for `Generic`.+ ## v2.1.0 _(2024-07-26)_ ### Added
hasmtlib.cabal view
@@ -1,7 +1,7 @@ cabal-version: 3.0 name: hasmtlib-version: 2.1.0+version: 2.2.0 synopsis: A monad for interfacing with external SMT solvers description: Hasmtlib is a library for generating SMTLib2-problems using a monad. It takes care of encoding your problem, marshaling the data to an external solver and parsing and interpreting the result into Haskell types.
src/Language/Hasmtlib/Codec.hs view
@@ -1,7 +1,6 @@ {-# LANGUAGE DefaultSignatures #-}--- required for DefaultEncoded a-{-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE LambdaCase #-}+{-# LANGUAGE UndecidableInstances #-} module Language.Hasmtlib.Codec where @@ -20,28 +19,43 @@ import Data.IntMap as IM hiding (foldl) import Data.Dependent.Map as DMap import Data.Tree (Tree)+import Data.Monoid (Sum, Product, First, Last, Dual)+import Data.Functor.Identity (Identity) import qualified Data.Vector.Sized as V import Control.Monad+import GHC.Generics --- | Compute the default 'Decoded' 'Type' for every functor-wrapper.--- Useful for instances using default signatures.+-- | Computes a default 'Decoded' 'Type' by distributing 'Decoded' to it's type arguments. type family DefaultDecoded a :: Type where- DefaultDecoded (f a) = f (Decoded a)+ DefaultDecoded (t a b c d e f g h) = t (Decoded a) (Decoded b) (Decoded c) (Decoded d) (Decoded e) (Decoded f) (Decoded g) (Decoded h)+ DefaultDecoded (t a b c d e f g) = t (Decoded a) (Decoded b) (Decoded c) (Decoded d) (Decoded e) (Decoded f) (Decoded g)+ DefaultDecoded (t a b c d e f) = t (Decoded a) (Decoded b) (Decoded c) (Decoded d) (Decoded e) (Decoded f)+ DefaultDecoded (t a b c d e) = t (Decoded a) (Decoded b) (Decoded c) (Decoded d) (Decoded e)+ DefaultDecoded (t a b c d) = t (Decoded a) (Decoded b) (Decoded c) (Decoded d)+ DefaultDecoded (t a b c) = t (Decoded a) (Decoded b) (Decoded c)+ DefaultDecoded (t a b) = t (Decoded a) (Decoded b)+ DefaultDecoded (t a) = t (Decoded a)+ DefaultDecoded () = () -- | Lift values to SMT-Values or decode them.+--+-- You can derive an instance of this class if your type is 'Generic'. class Codec a where+ -- | Resulting of decoding @a@ type Decoded a :: Type type Decoded a = DefaultDecoded a -- | Decode a value using given solution. decode :: Solution -> a -> Maybe (Decoded a)- default decode :: (Traversable f, Codec b, a ~ f b, Decoded a ~ f (Decoded b)) => Solution -> a -> Maybe (Decoded a)- decode sol = traverse (decode sol)+ default decode :: (Generic a, Generic (Decoded a), GCodec (Rep a), GDecoded (Rep a) x ~ Rep (Decoded a) x) => Solution -> a -> Maybe (Decoded a)+ decode sol x = do+ gdecodedx <- gdecode sol $ from x+ Just $ to gdecodedx -- | Encode a value as constant. encode :: Decoded a -> a- default encode :: (Functor f, Codec b, a ~ f b, Decoded a ~ f (Decoded b)) => Decoded a -> a- encode = fmap encode+ default encode :: (Generic a, Generic (Decoded a), GCodec (Rep a), GDecoded (Rep a) x ~ Rep (Decoded a) x) => Decoded a -> a+ encode = to . gencode . from -- | Decode and evaluate expressions instance KnownSMTSort t => Codec (Expr t) where@@ -117,56 +131,71 @@ encode = Constant . wrapValue -instance Codec () where- type Decoded () = ()- decode _ _ = Just ()- encode _ = ()+instance Codec ()+instance (Codec a, Codec b) => Codec (a,b)+instance (Codec a, Codec b, Codec c) => Codec (a,b,c)+instance (Codec a, Codec b, Codec c, Codec d) => Codec (a,b,c,d)+instance (Codec a, Codec b, Codec c, Codec d, Codec e) => Codec (a,b,c,d,e)+instance (Codec a, Codec b, Codec c, Codec d, Codec e, Codec f) => Codec (a,b,c,d,e,f)+instance (Codec a, Codec b, Codec c, Codec d, Codec e, Codec f, Codec g) => Codec (a,b,c,d,e,f,g)+instance (Codec a, Codec b, Codec c, Codec d, Codec e, Codec f, Codec g, Codec h) => Codec (a,b,c,d,e,f,g,h)+instance Codec a => Codec [a]+instance Codec a => Codec (Maybe a)+instance Codec a => Codec (Tree a)+instance (Codec a, Codec b) => Codec (Either a b)+instance Codec a => Codec (Sum a)+instance Codec a => Codec (Product a)+instance Codec a => Codec (First a)+instance Codec a => Codec (Last a)+instance Codec a => Codec (Dual a)+instance Codec a => Codec (Identity a) -instance (Codec a, Codec b) => Codec (a,b) where- type Decoded (a,b) = (Decoded a, Decoded b)- decode s (a,b) = (,) <$> decode s a <*> decode s b- encode (a,b) = (encode a, encode b)+instance Codec a => Codec (IntMap a) where+ decode sol = traverse (decode sol)+ encode = fmap encode -instance (Codec a, Codec b, Codec c) => Codec (a,b,c) where- type Decoded (a,b,c) = (Decoded a, Decoded b, Decoded c)- decode s (a,b,c) = (,,) <$> decode s a <*> decode s b <*> decode s c- encode (a,b,c) = (encode a, encode b, encode c)+instance Codec a => Codec (Seq a) where+ decode sol = traverse (decode sol)+ encode = fmap encode -instance (Codec a, Codec b, Codec c, Codec d) => Codec (a,b,c,d) where- type Decoded (a,b,c,d) = (Decoded a, Decoded b, Decoded c, Decoded d)- decode s (a,b,c,d) = (,,,) <$> decode s a <*> decode s b <*> decode s c <*> decode s d- encode (a,b,c,d) = (encode a, encode b, encode c, encode d)+instance Codec a => Codec (Map k a) where+ type Decoded (Map k a) = Map k (Decoded a)+ decode sol = traverse (decode sol)+ encode = fmap encode -instance (Codec a, Codec b, Codec c, Codec d, Codec e) => Codec (a,b,c,d,e) where- type Decoded (a,b,c,d,e) = (Decoded a, Decoded b, Decoded c, Decoded d, Decoded e)- decode s (a,b,c,d,e) = (,,,,) <$> decode s a <*> decode s b <*> decode s c <*> decode s d <*> decode s e- encode (a,b,c,d,e) = (encode a, encode b, encode c, encode d, encode e)+class GCodec f where+ type GDecoded f :: Type -> Type+ gdecode :: Solution -> f a -> Maybe (GDecoded f a)+ gencode :: GDecoded f a -> f a -instance (Codec a, Codec b, Codec c, Codec d, Codec e, Codec f) => Codec (a,b,c,d,e,f) where- type Decoded (a,b,c,d,e,f) = (Decoded a, Decoded b, Decoded c, Decoded d, Decoded e, Decoded f)- decode s (a,b,c,d,e,f) = (,,,,,) <$> decode s a <*> decode s b <*> decode s c <*> decode s d <*> decode s e <*> decode s f- encode (a,b,c,d,e,f) = (encode a, encode b, encode c, encode d, encode e, encode f)+instance GCodec U1 where+ type GDecoded U1 = U1+ gdecode _ U1 = Just U1+ gencode = id -instance (Codec a, Codec b, Codec c, Codec d, Codec e, Codec f, Codec g) => Codec (a,b,c,d,e,f,g) where- type Decoded (a,b,c,d,e,f,g) = (Decoded a, Decoded b, Decoded c, Decoded d, Decoded e, Decoded f, Decoded g)- decode s (a,b,c,d,e,f,g) = (,,,,,,) <$> decode s a <*> decode s b <*> decode s c <*> decode s d <*> decode s e <*> decode s f <*> decode s g- encode (a,b,c,d,e,f,g) = (encode a, encode b, encode c, encode d, encode e, encode f, encode g)+instance GCodec V1 where+ type GDecoded V1 = V1+ gdecode _ = Just+ gencode = id -instance (Codec a, Codec b, Codec c, Codec d, Codec e, Codec f, Codec g, Codec h) => Codec (a,b,c,d,e,f,g,h) where- type Decoded (a,b,c,d,e,f,g,h) = (Decoded a, Decoded b, Decoded c, Decoded d, Decoded e, Decoded f, Decoded g, Decoded h)- decode s (a,b,c,d,e,f,g,h) = (,,,,,,,) <$> decode s a <*> decode s b <*> decode s c <*> decode s d <*> decode s e <*> decode s f <*> decode s g <*> decode s h- encode (a,b,c,d,e,f,g,h) = (encode a, encode b, encode c, encode d, encode e, encode f, encode g, encode h)+instance (GCodec f, GCodec g) => GCodec (f :*: g) where+ type GDecoded (f :*: g) = (GDecoded f :*: GDecoded g)+ gdecode sol (a :*: b) = liftM2 (:*:) (gdecode sol a) (gdecode sol b)+ gencode (a :*: b) = gencode a :*: gencode b -instance Codec a => Codec [a]-instance Codec a => Codec (IntMap a)-instance Codec a => Codec (Map k a)-instance Codec a => Codec (Maybe a)-instance Codec a => Codec (Seq a)-instance Codec a => Codec (Tree a)+instance (GCodec f, GCodec g) => GCodec (f :+: g) where+ type GDecoded (f :+: g) = (GDecoded f :+: GDecoded g)+ gdecode sol (L1 a) = L1 <$> gdecode sol a+ gdecode sol (R1 a) = R1 <$> gdecode sol a+ gencode (L1 a) = L1 $ gencode a+ gencode (R1 a) = R1 $ gencode a -instance (Codec a, Codec b) => Codec (Either a b) where- type Decoded (Either a b) = Either (Decoded a) (Decoded b)- decode s (Left a) = Left <$> decode s a- decode s (Right b) = Right <$> decode s b- encode (Left a) = Left (encode a)- encode (Right b) = Right (encode b)+instance GCodec f => GCodec (M1 i c f) where+ type GDecoded (M1 i c f) = (M1 i c (GDecoded f))+ gdecode sol (M1 x) = M1 <$> gdecode sol x+ gencode (M1 x) = M1 $ gencode x++instance Codec a => GCodec (K1 i a) where+ type GDecoded (K1 i a) = K1 i (Decoded a)+ gdecode sol (K1 a) = K1 <$> decode sol a+ gencode (K1 a) = K1 $ encode a
src/Language/Hasmtlib/Equatable.hs view
@@ -11,12 +11,17 @@ import Data.Int import Data.Word import Data.Void+import Data.Tree (Tree)+import Data.Monoid (Sum, Product, First, Last, Dual)+import Data.Functor.Identity (Identity) import qualified Data.Vector.Sized as V import Numeric.Natural import GHC.Generics -- | Test two as on equality as SMT-Expression. --+-- You can derive an instance of this class if your type is 'Generic'.+-- -- @ -- x <- var @RealType -- y <- var@@ -83,3 +88,20 @@ instance Equatable Double where x === y = bool (x == y) instance Equatable Ordering where x === y = bool (x == y) instance Equatable Bool where x === y = bool (x == y)+instance (Equatable a, Equatable b) => Equatable (a,b)+instance (Equatable a, Equatable b, Equatable c) => Equatable (a,b,c)+instance (Equatable a, Equatable b, Equatable c, Equatable d) => Equatable (a,b,c,d)+instance (Equatable a, Equatable b, Equatable c, Equatable d, Equatable e) => Equatable (a,b,c,d,e)+instance (Equatable a, Equatable b, Equatable c, Equatable d, Equatable e, Equatable f) => Equatable (a,b,c,d,e,f)+instance (Equatable a, Equatable b, Equatable c, Equatable d, Equatable e, Equatable f, Equatable g) => Equatable (a,b,c,d,e,f,g)+instance (Equatable a, Equatable b, Equatable c, Equatable d, Equatable e, Equatable f, Equatable g, Equatable h) => Equatable (a,b,c,d,e,f,g,h)+instance Equatable a => Equatable [a]+instance Equatable a => Equatable (Tree a)+instance Equatable a => Equatable (Maybe a)+instance (Equatable a, Equatable b) => Equatable (Either a b)+instance Equatable a => Equatable (Sum a)+instance Equatable a => Equatable (Product a)+instance Equatable a => Equatable (First a)+instance Equatable a => Equatable (Last a)+instance Equatable a => Equatable (Dual a)+instance Equatable a => Equatable (Identity a)
src/Language/Hasmtlib/Iteable.hs view
@@ -6,6 +6,8 @@ import Language.Hasmtlib.Type.SMTSort import Data.Sequence (Seq) import Data.Tree+import Data.Monoid (Sum, Product, First, Last, Dual)+import Data.Functor.Identity (Identity) -- | If condition (p :: b) then (t :: a) else (f :: a) --@@ -30,6 +32,12 @@ instance Iteable (Expr BoolSort) a => Iteable (Expr BoolSort) (Maybe a) instance Iteable (Expr BoolSort) a => Iteable (Expr BoolSort) (Seq a) instance Iteable (Expr BoolSort) a => Iteable (Expr BoolSort) (Tree a)+instance Iteable (Expr BoolSort) a => Iteable (Expr BoolSort) (Sum a)+instance Iteable (Expr BoolSort) a => Iteable (Expr BoolSort) (Product a)+instance Iteable (Expr BoolSort) a => Iteable (Expr BoolSort) (First a)+instance Iteable (Expr BoolSort) a => Iteable (Expr BoolSort) (Last a)+instance Iteable (Expr BoolSort) a => Iteable (Expr BoolSort) (Dual a)+instance Iteable (Expr BoolSort) a => Iteable (Expr BoolSort) (Identity a) instance Iteable (Expr BoolSort) () where ite _ _ _ = ()
src/Language/Hasmtlib/Orderable.hs view
@@ -13,12 +13,17 @@ import Data.Int import Data.Word import Data.Void+import Data.Tree (Tree)+import Data.Monoid (Sum, Product, First, Last, Dual)+import Data.Functor.Identity (Identity) import Numeric.Natural import GHC.Generics import GHC.TypeNats -- | Compare two as as SMT-Expression. --+-- You can derive an instance of this class if your type is 'Generic'.+-- -- @ -- x <- var @RealSort -- y <- var@@ -155,3 +160,21 @@ x <=? y = bool (x <= y) instance Orderable Bool where x <? y = bool (x < y) x <=? y = bool (x <= y)++instance (Orderable a, Orderable b) => Orderable (a,b)+instance (Orderable a, Orderable b, Orderable c) => Orderable (a,b,c)+instance (Orderable a, Orderable b, Orderable c, Orderable d) => Orderable (a,b,c,d)+instance (Orderable a, Orderable b, Orderable c, Orderable d, Orderable e) => Orderable (a,b,c,d,e)+instance (Orderable a, Orderable b, Orderable c, Orderable d, Orderable e, Orderable f) => Orderable (a,b,c,d,e,f)+instance (Orderable a, Orderable b, Orderable c, Orderable d, Orderable e, Orderable f, Orderable g) => Orderable (a,b,c,d,e,f,g)+instance (Orderable a, Orderable b, Orderable c, Orderable d, Orderable e, Orderable f, Orderable g, Orderable h) => Orderable (a,b,c,d,e,f,g,h)+instance Orderable a => Orderable [a]+instance Orderable a => Orderable (Tree a)+instance Orderable a => Orderable (Maybe a)+instance (Orderable a, Orderable b) => Orderable (Either a b)+instance Orderable a => Orderable (Sum a)+instance Orderable a => Orderable (Product a)+instance Orderable a => Orderable (First a)+instance Orderable a => Orderable (Last a)+instance Orderable a => Orderable (Dual a)+instance Orderable a => Orderable (Identity a)
src/Language/Hasmtlib/Variable.hs view
@@ -6,21 +6,27 @@ import Language.Hasmtlib.Type.MonadSMT import Language.Hasmtlib.Type.SMTSort import Data.Proxy+import Data.Monoid (Sum, Product, First, Last, Alt, Dual)+import Data.Functor.Const (Const)+import Data.Functor.Identity (Identity)+import Data.Functor.Compose (Compose)+import GHC.Generics -- | Construct a variable datum of a data-type by creating variables for all its fields. --+-- You can derive an instance of this class if your type is 'Generic' and has exactly one constructor.+-- -- @--- data V3 a = V3 a a a+-- data V3 a = V3 a a a deriving Generic -- instance Variable a => V3 a -- @ ----- >>> varV3 <- variable @(V3 (Expr RealType)) ; varV3--- V3 (Var RealType) (Var RealType) (Var RealType)+-- >>> varV3 :: V3 (Expr RealType) <- variable ; varV3+-- V3 (Expr RealType) (Expr RealType) (Expr RealType) class Variable a where variable :: MonadSMT s m => m a- default variable :: (MonadSMT s m, Applicative f, Traversable f, Variable b, a ~ f b) => m a- variable = sequenceA $ pure variable- {-# INLINEABLE variable #-}+ default variable :: (MonadSMT s m, Generic a, GVariable (Rep a)) => m a+ variable = to <$> gvariable -- | Wrapper for 'variable' which takes a 'Proxy' variable' :: forall s m a. (MonadSMT s m, Variable a) => Proxy a -> m a@@ -31,29 +37,41 @@ variable = var {-# INLINE variable #-} -instance Variable () where- variable = return ()--instance (Variable a, Variable b) => Variable (a,b) where- variable = (,) <$> variable <*> variable+instance Variable ()+instance (Variable a, Variable b) => Variable (a,b)+instance (Variable a, Variable b, Variable c) => Variable (a,b,c)+instance (Variable a, Variable b, Variable c, Variable d) => Variable (a,b,c,d)+instance (Variable a, Variable b, Variable c, Variable d, Variable e) => Variable (a,b,c,d,e)+instance (Variable a, Variable b, Variable c, Variable d, Variable e, Variable f) => Variable (a,b,c,d,e,f)+instance (Variable a, Variable b, Variable c, Variable d, Variable e, Variable f, Variable g) => Variable (a,b,c,d,e,f,g)+instance (Variable a, Variable b, Variable c, Variable d, Variable e, Variable f, Variable g, Variable h) => Variable (a,b,c,d,e,f,g,h)+instance Variable a => Variable (Sum a)+instance Variable a => Variable (Product a)+instance Variable a => Variable (First a)+instance Variable a => Variable (Last a)+instance Variable a => Variable (Dual a)+instance Variable a => Variable (Identity a)+instance Variable m => Variable (Const m a)+instance Variable (f a) => Variable (Alt f a)+instance Variable (f (g a)) => Variable (Compose f g a) -instance (Variable a, Variable b, Variable c) => Variable (a,b,c) where- variable = (,,) <$> variable <*> variable <*> variable+instance Variable a => Variable (Maybe a) where+ variable = Just <$> variable -instance (Variable a, Variable b, Variable c, Variable d) => Variable (a,b,c,d) where- variable = (,,,) <$> variable <*> variable <*> variable <*> variable+instance Variable b => Variable (Either a b) where+ variable = Right <$> variable -instance (Variable a, Variable b, Variable c, Variable d, Variable e) => Variable (a,b,c,d,e) where- variable = (,,,,) <$> variable <*> variable <*> variable <*> variable <*> variable+class GVariable f where+ gvariable :: MonadSMT s m => m (f a) -instance (Variable a, Variable b, Variable c, Variable d, Variable e, Variable f) => Variable (a,b,c,d,e,f) where- variable = (,,,,,) <$> variable <*> variable <*> variable <*> variable <*> variable <*> variable+instance GVariable U1 where+ gvariable = return U1 -instance (Variable a, Variable b, Variable c, Variable d, Variable e, Variable f, Variable g) => Variable (a,b,c,d,e,f,g) where- variable = (,,,,,,) <$> variable <*> variable <*> variable <*> variable <*> variable <*> variable <*> variable+instance (GVariable f, GVariable g) => GVariable (f :*: g) where+ gvariable = liftA2 (:*:) gvariable gvariable -instance (Variable a, Variable b, Variable c, Variable d, Variable e, Variable f, Variable g, Variable h) => Variable (a,b,c,d,e,f,g,h) where- variable = (,,,,,,,) <$> variable <*> variable <*> variable <*> variable <*> variable <*> variable <*> variable <*> variable+instance GVariable f => GVariable (M1 i c f) where+ gvariable = M1 <$> gvariable -instance Variable a => Variable (Maybe a)-instance Variable b => Variable (Either a b)+instance Variable a => GVariable (K1 i a) where+ gvariable = K1 <$> variable