标签: z3

Z3可以在增量模式下工作吗?

我在QFBV公式上使用Z3.我想知道Z3是否可以像SAT求解器这样的公式逐步增加布尔子句.基本上我需要一种方法来实现以下循环:

F = initial QFBV formula
while(F is unsat) {
    F := F Union {some additional QFBV formula based on unsat core}
}
Run Code Online (Sandbox Code Playgroud)

Z3是否保留学到的信息?我可以逐步使用z3吗?

谢谢.

z3

5
推荐指数
1
解决办法
579
查看次数

如何用Z3隐藏变量

说我有

t1<x and x<t2
Run Code Online (Sandbox Code Playgroud)

是否可以隐藏变量x以便 t1<t2 在Z3中?

smt z3

5
推荐指数
1
解决办法
437
查看次数

(Z3Py)声明功能

对于某些给定的结果/ x对,我想在简单的"result = x*t + c"公式中找到c和t系数:

from z3 import *

x=Int('x')
c=Int('c')
t=Int('t')

s=Solver()

f = Function('f', IntSort(), IntSort())

# x*t+c = result
# x, result = [(1,55), (12,34), (13,300)]

s.add (f(x)==(x*t+c))
s.add (f(1)==55, f(12)==34, f(13)==300)

t=s.check()
if t==sat:
    print s.model()
else:
   print t
Run Code Online (Sandbox Code Playgroud)

......但结果显然是错误的.我可能需要找出如何映射函数参数.

我该如何正确定义功能?

python z3

5
推荐指数
1
解决办法
2413
查看次数

防止解决方案被简化

我想从z3获得的解决方案没有简化使用let语句.

例如,如果我给出以下内容:

(declare-const x Int)
  (elim-quantifiers (exists ((x.1 Int)) 
    (and (or (and (= (- x.1 2) 0) (<= (- x.1 9) 0)) 
             (and (or (= (- x.1 2) 0) (and (<= (- x.1 4) 0) 
                                      (and (<= (- 4 x.1) 0) 
                                           (<= (- x.1 11) 0)))) (<= (- x.1 9) 0))) (= (- (+ x.1 2) x) 0))))
Run Code Online (Sandbox Code Playgroud)

我得到的解决方案是:

(let ((a!1 (and (or (and (<= x 4) (>= x 4)) (and (<= x 6) (>= x 6) (<= …
Run Code Online (Sandbox Code Playgroud)

z3

5
推荐指数
1
解决办法
245
查看次数

z3 C++ API&ite

也许我错过了什么,但是使用z3 C++ API构建if-then-else表达式的方法是什么?

我可以使用C API,但我想知道为什么C++ API中没有这样的函数.

问候,朱利安

z3

5
推荐指数
1
解决办法
1233
查看次数

在Z3Py中检索枚举类型的值

如何检索枚举变量的值v ?例如,

vTyp, (val1,val2,val3) = EnumSort('vTyp',['val1','val2','val3'])
v = Const('my variable',vTyp)
Run Code Online (Sandbox Code Playgroud)

现在,由于只是上面的变量v,我将如何检索值的列表 [val1,val2,val3]v(这里val1,val3,val3是表达如上)?

我试过了,[v.sort().constructor(0), ...(1), ...(2)] 但是构造方法没有返回表达式。

python z3

5
推荐指数
1
解决办法
187
查看次数

Z3时序变化

自升级到Z3(最新的git master)的开源版本以来,我注意到使用C API(从2-122s开始)重复运行几乎相同的SMT查询之间存在显着的时序差异.查询之间的唯一区别是数组的命名(在QF_AUFBV逻辑中).

我们按如下方式分配数组:

Z3_symbol s = Z3_mk_string_symbol(z3_context, arrayName);
Z3_mk_const(z3_context, s,
            Z3_mk_array_sort(z3_context, getSort(32), getSort(8)));
Run Code Online (Sandbox Code Playgroud)

下面是一个示例查询(转换为SMT-LIB).将"arr51"替换为其他名称(例如,"a"或"arr51_0x2628008")会显着改变查询的持续时间,最多可达两个数量级.在不改变阵列名称的情况下重复运行不会出现明显的时序变化.

有趣的是,Z3 3.2的旧二进制版本似乎不受阵列命名的影响(并且对于我们的大多数查询运行速度更快).

(benchmark klee
:status unsat
:logic QF_AUFBV
:extrafuns ((arr51 Array[32:8]))
:assumption
(let (?x13 (concat (select arr51 bv58[32]) (concat (select arr51 bv57[32]) (select arr51 bv56[32]))))
(let (?x16 (concat (select arr51 bv59[32]) ?x13))
(let (?x23 (concat bv0[32] ?x16))
(let (?x34 (bvsub (bvadd (concat (extract[33:0] ?x23) bv0[30]) (concat (extract[35:0] ?x23) bv0[28])) (concat (extract[40:0] ?x23) bv0[23])))
(let (?x42 (bvadd (bvadd ?x34 (concat (extract[44:0] ?x23) bv0[19])) (concat (extract[45:0] ?x23) …
Run Code Online (Sandbox Code Playgroud)

z3

5
推荐指数
1
解决办法
345
查看次数

Z3py:将Z3公式转换为picosat使用的子句

链接:具有Pyhton绑定的
Z3定理证明者
picosat

我已经使用Z3作为SAT求解器。对于较大的公式,似乎存在性能问题,这就是为什么我想查看picosat来查看它是否是更快的替代方案。我现有的python代码使用z3语法生成一个命题公式:

from z3 import *

import pycosat
from pycosat import solve, itersolve

#
#1 2  3  4  5  6  7   8  (variable names in picosat are numbers!)
#
C, G, M, P, R, S, SN, B = Bools('C G M P R S SN B')
C = (And(*(S,Or(Not(S),P),Or(Not(P),S),Or(Not(P),B),Or(Not(C),P),Or(Not(G),P),Or(Not(M),P),Or(Not(R),P),Or(Not(SN),P),Or(Not(B),P),True,Not(False),Or(R,SN,B,G,M,C,True))))

# formula in Z3:
f = simplify(C)

print f 
Run Code Online (Sandbox Code Playgroud)

输出/结果

And(S,
    Or(Not(S), P),
    Or(Not(P), S),
    Or(Not(P), B),

    Or(Not(C), P),
    Or(Not(G), P),
    Or(Not(M), P),
    Or(Not(R), P),
    Or(Not(SN), P),
    Or(Not(B), …
Run Code Online (Sandbox Code Playgroud)

python sat-solvers z3 z3py

5
推荐指数
1
解决办法
1295
查看次数

HORN条款Z3文档

我正在尝试使用Z3的HORN逻辑(set-logic HORN)对一些命令式程序进行编码,但是在定义子句时遇到了一些困难(使用SMT2).谁能告诉我在哪里可以找到Z3这个功能的良好文档来源?

z3

5
推荐指数
1
解决办法
365
查看次数

Z3中使用的DPLL(T)算法(线性算法)

Z3的算术求解器是基于DPLL(T)和Simplex(本文所述)开发的.我不明白Z3在生成冲突解释时如何执行回溯.我举个例子:

线性算术公式为:

(2x1+x2?200 OR 3x1+x2?250) AND (2x1+x2+x3?200 OR 4x1+2x2+x3?400) AND x1?50 AND x2?50 AND x3?60

断言后2x1+x2?200,2x1+x2+x3?200,x1?50,x2?50x3?60先后,它产生冲突的解释集{2x1+x2+x3?200, x1?50, x2?50, x3?60}.

我的问题是,当生成此冲突集时,如何执行回溯?

algorithm smt z3

5
推荐指数
1
解决办法
443
查看次数

标签 统计

z3 ×10

python ×3

smt ×2

algorithm ×1

sat-solvers ×1

z3py ×1