packages feed

hasmtlib 1.2.0 → 1.3.0

raw patch · 5 files changed

+37/−5 lines, 5 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Language.Hasmtlib.Counting: atLeast :: forall t f. (Functor f, Foldable f, Num (Expr t), Orderable (Expr t)) => Expr t -> f (Expr BoolSort) -> Expr BoolSort
+ Language.Hasmtlib.Counting: atMost :: forall t f. (Functor f, Foldable f, Num (Expr t), Orderable (Expr t)) => Expr t -> f (Expr BoolSort) -> Expr BoolSort
+ Language.Hasmtlib.Counting: exactly :: forall t f. (Functor f, Foldable f, Num (Expr t), Orderable (Expr t)) => Expr t -> f (Expr BoolSort) -> Expr BoolSort
- Language.Hasmtlib.Type.Solution: solVal :: forall t_aHmd. Lens' (SMTVarSol t_aHmd) (Value t_aHmd)
+ Language.Hasmtlib.Type.Solution: solVal :: forall t_aHq7. Lens' (SMTVarSol t_aHq7) (Value t_aHq7)
- Language.Hasmtlib.Type.Solution: solVar :: forall t_aHmd. Lens' (SMTVarSol t_aHmd) (SMTVar t_aHmd)
+ Language.Hasmtlib.Type.Solution: solVar :: forall t_aHq7. Lens' (SMTVarSol t_aHq7) (SMTVar t_aHq7)

Files

CHANGELOG.md view
@@ -6,6 +6,11 @@ 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/). +## v1.3.0 _(2024-07-12)_++### Added+- Added cardinality constraints with `Language.Hasmtlib.Counting`+ ## v1.2.0 _(2024-07-11)_  ### Added
README.md view
@@ -62,7 +62,7 @@   ```haskell     data SMTSort = BoolSort | IntSort | RealSort | BvSort Nat | ArraySort SMTSort SMTSort     data Expr (t :: SMTSort) where ...-  +     ite :: Expr BoolSort -> Expr t -> Expr t -> Expr t   ``` - [x] Full SMTLib 2.6 standard support for Sorts Int, Real, Bool, unsigned BitVec & Array@@ -76,7 +76,7 @@       setLogic "QF_BV"       x <- var @(BvSort 16)       y <- var-      assert $ x - (maxBound `mod` 8) === y * y +      assert $ x - (maxBound `mod` 8) === y * y       return (x,y)   ``` - [x] Add your own solvers via the [Solver type](https://github.com/bruderj15/Hasmtlib/blob/master/src/Language/Hasmtlib/Type/Solution.hs)@@ -87,14 +87,15 @@ - [x] Solvers via external processes: CVC5, Z3, Yices2-SMT & MathSAT   ```haskell     (result, solution) <- solveWith (solver mathsat) $ do-      setLogic "QF_LIA" +      setLogic "QF_LIA"       assert $ ...   ``` - [x] Incremental solving   ```haskell       cvc5Living <- interactiveSolver cvc5       interactiveWith cvc5Living $ do-        setLogic "QF_LIA"    +        setLogic "QF_LIA"+        setOption $ Incremental True         setOption $ ProduceModels True         x <- var @IntSort         assert $ x === 42
hasmtlib.cabal view
@@ -1,7 +1,7 @@ cabal-version:         3.0  name:                  hasmtlib-version:               1.2.0+version:               1.3.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.@@ -30,6 +30,7 @@                      , Language.Hasmtlib.Iteable                      , Language.Hasmtlib.Boolean                      , Language.Hasmtlib.Variable+                     , Language.Hasmtlib.Counting                      , Language.Hasmtlib.Equatable                      , Language.Hasmtlib.Orderable                      , Language.Hasmtlib.Integraled
src/Language/Hasmtlib.hs view
@@ -14,6 +14,7 @@   , module Language.Hasmtlib.Equatable   , module Language.Hasmtlib.Orderable   , module Language.Hasmtlib.Codec+  , module Language.Hasmtlib.Counting   , module Language.Hasmtlib.Variable   , module Language.Hasmtlib.Solver.Common   , module Language.Hasmtlib.Solver.CVC5@@ -37,6 +38,7 @@ import Language.Hasmtlib.Equatable import Language.Hasmtlib.Orderable import Language.Hasmtlib.Codec+import Language.Hasmtlib.Counting import Language.Hasmtlib.Variable import Language.Hasmtlib.Solver.Common import Language.Hasmtlib.Solver.CVC5
+ src/Language/Hasmtlib/Counting.hs view
@@ -0,0 +1,23 @@+module Language.Hasmtlib.Counting where++import Prelude hiding (not, (&&), (||), or)+import Language.Hasmtlib.Internal.Expr.Num ()+import Language.Hasmtlib.Internal.Expr+import Language.Hasmtlib.Equatable+import Language.Hasmtlib.Orderable+import Language.Hasmtlib.Iteable++-- | Out of many bool-expressions build a formula which encodes that __at most__ 'k' of them are 'true'+atMost  :: forall t f. (Functor f, Foldable f, Num (Expr t), Orderable (Expr t)) => Expr t -> f (Expr BoolSort) -> Expr BoolSort+atMost  k = (<=? k) . sum . fmap (\b -> ite b 1 0)+{-# INLINEABLE atMost #-}++-- | Out of many bool-expressions build a formula which encodes that __at least__ 'k' of them are 'true'+atLeast :: forall t f. (Functor f, Foldable f, Num (Expr t), Orderable (Expr t)) => Expr t -> f (Expr BoolSort) -> Expr BoolSort+atLeast k = (>=? k) . sum . fmap (\b -> ite b 1 0)+{-# INLINEABLE atLeast #-}++-- | Out of many bool-expressions build a formula which encodes that __exactly__ 'k' of them are 'true'+exactly :: forall t f. (Functor f, Foldable f, Num (Expr t), Orderable (Expr t)) => Expr t -> f (Expr BoolSort) -> Expr BoolSort+exactly k = (=== k) . sum . fmap (\b -> ite b 1 0)+{-# INLINEABLE exactly #-}