Haskell使用Z3 Theorem Prover

目录

背景

方法

创建Environment ​

Source language -> Z3 AST

求值

备注


背景

Haskell是一款函数式编程语言, Z3官方并没有提供Haskell绑定.

如果利用第三方库z3: Bindings for the Z3 Theorem Prover, 其代码晦涩难懂且并没有文档支持.

方法

创建Environment \large \Phi

 为了达到目的,首先需要一个环境\Phi来存储变量\large Var和其对应的类型\large Type. 举例来说, \large value \rightarrow int 

Source language -> Z3 AST

函数签名如下,意思就是根据环境和表达式,得到对应的\large AST

expr2Z3 :: Z3.MonadZ3 z3 => Environment -> Expr -> z3 Z3.AST

具体方法就是利用库中提供的函数例如来创造对应的\large AST,这点需查询文档来找需要的函数. 

Z3.mkInt value type

求值

由于我们希望如果\large AST不满足时, Z3可以报告一个反例. 因此我们使用\large mkNot来求其布尔值的否定.

mkNot :: MonadZ3 z3 => AST -> z3 AST

然后使用\large assert函数进行求值.

-- | Alias for 'solverAssertCnstr'
assert :: MonadZ3 z3 => AST -> z3 ()
assert = solverAssertCnstr

求值之后的结果在模型里面,利用\large getModel取值.

-- | Check and get model.
--
-- Alias for 'solverCheckAndGetModel'
getModel :: MonadZ3 z3 => z3 (Result, Maybe Model)
getModel = solverCheckAndGetModel

如果\large Result = Unsat, 则原式的否定为假,原式为真.

如果\large Result = Sat,那么原式为假,可从\large Model得道满足否定的一系列值.

备注

这是前一段上的Program Verification的编程项目,感觉国内没多少人会用到这个.如有人问起我再补充.

如果有需要我可以把英文原版和相关的程序优化都写一下.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值