目录
背景
Haskell是一款函数式编程语言, Z3官方并没有提供Haskell绑定.
如果利用第三方库z3: Bindings for the Z3 Theorem Prover, 其代码晦涩难懂且并没有文档支持.
方法
创建Environment ![\large \Phi](https://latex.csdn.net/eq?%5Clarge%20%5CPhi)
为了达到目的,首先需要一个环境来存储变量
和其对应的类型
. 举例来说,
Source language -> Z3 AST
函数签名如下,意思就是根据环境和表达式,得到对应的.
expr2Z3 :: Z3.MonadZ3 z3 => Environment -> Expr -> z3 Z3.AST
具体方法就是利用库中提供的函数例如来创造对应的,这点需查询文档来找需要的函数.
Z3.mkInt value type
求值
由于我们希望如果不满足时, Z3可以报告一个反例. 因此我们使用
来求其布尔值的否定.
mkNot :: MonadZ3 z3 => AST -> z3 AST
然后使用函数进行求值.
-- | Alias for 'solverAssertCnstr'
assert :: MonadZ3 z3 => AST -> z3 ()
assert = solverAssertCnstr
求值之后的结果在模型里面,利用取值.
-- | Check and get model.
--
-- Alias for 'solverCheckAndGetModel'
getModel :: MonadZ3 z3 => z3 (Result, Maybe Model)
getModel = solverCheckAndGetModel
如果, 则原式的否定为假,原式为真.
如果,那么原式为假,可从
得道满足否定的一系列值.
备注
这是前一段上的Program Verification的编程项目,感觉国内没多少人会用到这个.如有人问起我再补充.
如果有需要我可以把英文原版和相关的程序优化都写一下.