加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 如何将z3py表达式转换为smtlib 2格式

发布时间:2020-12-20 13:41:25 所属栏目:Python 来源:网络整理
导读:我的问题与: Z3: convert Z3py expression to SMT-LIB2?有关 我试图将z3py表达式转换为smtlib2格式.使用以下脚本,但转换后,当我将结果提供给z3或任何其他SMT时,我得到: “Syntax error,unexpected let” 有什么方法可以使用z3py以smtlib2格式将其带入,这样
我的问题与: Z3: convert Z3py expression to SMT-LIB2?有关

我试图将z3py表达式转换为smtlib2格式.使用以下脚本,但转换后,当我将结果提供给z3或任何其他SMT时,我得到:

“Syntax error,unexpected let”

有什么方法可以使用z3py以smtlib2格式将其带入,这样我就不必再次编写长表达式了.

以下是我用于转换的代码:

def convertor(f,status="unknown",name="benchmark",logic=""):
v = (Ast * 0)()
if isinstance(f,Solver):
a = f.assertions()
if len(a) == 0:
  f = BoolVal(True)
else:
  f = And(*a)
return Z3_benchmark_to_smtlib_string(f.ctx_ref(),name,logic,status,"",v,f.as_ast())

x = Int('x')
y = Int('y')
s = Solver()
s.add(x > 0)
s.add( x < 100000)
s.add(x==2*y)
print convertor(s,logic="QF_LIA")

这是输出:

(set-info :status unknown)
(set-logic QF_LIA)
(declare-fun y () Int)
(declare-fun x () Int)
(let (($x34 (= x (* 2 y))))
(let (($x31 (< x 100000)))
(let (($x10 (> x 0)))
(let (($x35 (and $x10 $x31 $x34)))
(assert $x35)))))
(check-sat)

解决方法

这也与另一个问题 here有关.

最有可能的是,这个问题是由于Z3的过时版本.有许多错误修正,但尚未进入主分支并使用unstable分支(或预编译的夜间二进制文件here),我得到一个不同的输出,Z3接受没有错误:

(set-info :status unknown)
(set-logic QF_LIA)
(declare-fun y () Int)
(declare-fun x () Int)
(assert
(let (($x34 (= x (* 2 y))))
(let (($x31 (< x 100000)))
(let (($x10 (> x 0)))
(and $x10 $x31 $x34)))))
(check-sat)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读