packages feed

expressions-z3-0.5: expressions-z3.cabal

name:                expressions-z3
version:             0.5
synopsis:            Encode and Decode expressions from Z3 ASTs
description:
  A simple interface for converting expressions back and forth between pure
  representation and an AST within a Z3 context.
  .
  Assume
  .
  > λ> :m + Control.Monad Data.Expression Data.Expression.Z3 Z3.Monad Data.Singletons
  > λ> :t f
  > f :: MonadZ3 z3 => AST -> z3 AST
  .
  Then
  .
  > λ> let g :: ( MonadZ3 z3, IFromZ3 f, IToZ3 f, SingI s ) => IFix f s -> z3 (IFix f s); g = fromZ3 <=< f <=< toZ3
  > λ> :t g (var "a" :: Lia 'BooleanSort)
  > g (var "a" :: Lia 'BooleanSort) :: MonadZ3 z3 => z3 (Lia 'BooleanSort)
  .
  For example
  .
  > λ> let f b = mkStringSymbol "a" >>= mkIntVar >>= toApp >>= \a' -> mkForallConst [] [a'] b
  > λ> let g :: ( MonadZ3 z3, IFromZ3 f, IToZ3 f ) => IFix f 'BooleanSort -> z3 (IFix f 'BooleanSort); g = fromZ3 <=< g <=< toZ3
  > λ> evalZ3 $ g (var "a" .+. cnst 1 .=. var "b" :: Lia 'BooleanSort)
  > (forall ((a : int)) (= (+ 1 (a : int)) (b : int)))
  .
  Or more interestingly
  .
  > λ> :{
  > |  let f :: ( MonadZ3 z3, IFromZ3 f, IToZ3 f, SingI s ) => IFix f s -> z3 (IFix f s)
  > |      f a = do
  > |      a' <- toZ3 a
  > |      r <- getModel
  > |      case r of
  > |          (Sat, Just m) -> do
  > |              v <- modelEval m a' True
  > |              case v of
  > |                Just v' -> fromZ3 v'
  > |                _ -> error "..."
  > |          _ -> error "..."
  > :}
  > λ> evalZ3 $ f (var "a" :: Lia 'BooleanSort)
  > false
  > λ> evalZ3 $ f (var "a" :: Lia 'IntegralSort)
  > 0
  > λ> evalZ3 $ f (var "a" .+. cnst 1:: Lia 'IntegralSort)
  > 1

license:             BSD3
license-file:        LICENSE
author:              Jakub Daniel
maintainer:          jakub.daniel@protonmail.com
copyright:           Copyright (C) 2017 Jakub Daniel
category:            Data, Logic, Math
build-type:          Simple
extra-source-files:  ChangeLog.md
cabal-version:       >=1.10

source-repository head
  type:     git
  location: https://github.com/jakubdaniel/expressions-z3.git

library
  exposed-modules:     Data.Expression.Z3
  build-depends:       base >=4.9 && <4.13,
                       containers >=0.5 && <0.7,
                       expressions >=0.5 && <0.6,
                       singletons >=2.2 && <2.6,
                       transformers >=0.5.2 && <0.6,
                       list-t >=1.0 && <1.1,
                       z3 >=4.1.2 && <4.4
  hs-source-dirs:      src
  default-language:    Haskell2010
  ghc-options:         -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns

test-suite test
  type:                exitcode-stdio-1.0
  build-depends:       base,
                       containers,
                       expressions,
                       expressions-z3,
                       singletons,
                       transformers,
                       z3
  hs-source-dirs:      test
  main-is:             Main.hs
  default-language:    Haskell2010
  ghc-options:         -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns