标签: Z3
smttheorem-proving
我正试图在我的理论中删除存在量词。这意味着我用函数替换存在量词,这些函数由存在量词范围内的通用量化变量参数化
我在Z3中找到了一个解释,但是我仍然很难做到这一点。假设以下两个函数:
(define-fun f1 ((t Int)) Bool (= t 3))
(define-fun f2 () Bool (exists ((t Int)) (f1 t)))
我相信f2应该是真的,因为存在一个整数t,使得(f1 t)是真的,即t=3。我通过为存在量化公式引入一个常数来应用Skolemizatio
用另一个函数替换公式中的函数符号的最佳方法是什么?
Z3py的替换似乎只适用于表达式,我现在要做的是尝试猜测函数可以应用到的所有可能的常量/变量组合,然后用另一个函数的应用来替换它们。有更好的方法吗?我们可以实现一个简单的自下而上重写器,给定一个术语s,一个函数f和术语t将用t[r\u 1,…,r\n>替换s中的每个f(r\u 1,…,r\n)。我使用符号t[r_1,…,r_n]来表示通过用术语r_1,…,r_n替换t中的自由变量而获得的术语
重写器可以通过Z3API实现。我使用AstMap缓存
我正在尝试用“nlsat”解算器实现快速解释算法。
由于算法需要多次求解原始约束集的子集,所以我决定使用Z3/C++接口中的PUP/POP函数。
选择器变量用于暗示添加/删除约束
但我在解决约束集时遇到了一个问题。z3能够在不到1分钟的时间内告诉我整个约束集未设置。但当检查原始约束集的子集时,它在超过1小时的时间内没有给出结果
整个约束集
原始约束集的子集
是什么显著改变了性能?通常,什么会影响nlsat解算器的性能
感谢您的建议。nlsat解算器不会公开增量,因此当您创建多个查询时,它将从头开
在我的研究中,我自动生成SMT2,然后将其传递给Z3。生成的代码基本上是一个包含许多不同约束的非常大的连词(and…)。
与生成许多断言相反,这样做是否会损失(或获得?)任何显著的性能?您不会损失或获得。在几乎所有的设置中,Z3都会将任何连接拆分为多个断言,这样做所需的时间可以忽略不计
这个问题以前也曾出现过:我敢说,你的问题不会得到明确的答案,因为你没有给出任何关于你的约束所属理论的细节。即使你做到了,也很难给出一个令人满意的答案。我建议你先进行实验(生成两种形状),如果需要,回到这里报告你的
我试图解析python文件中的.smt2文件(如果我只是在z3上运行它,它会给出一个没有问题的答案)
ctx = Context()
s = Solver(ctx=ctx)
f = parse_smt2_file("./Encodings/foo.smt2", ctx=ctx)
s.add(f)
我遇到了以下问题:
回溯(最近一次调用):文件“”,第1行,在
f=z3.parse_smt2_文件(“./ex.smt2”,ctx=ctx)文件“X/Applications/z3-4.3.3.37
据我所知,由于z3不识别超越函数,所以在使用以下代码进行转换时,它会给我带来一个错误
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)
我在Z3中尝试了以下代码。但Z3表示目前还没有这一型号
(declare-const s String)
(declare-fun toUppercase (String) (String))
(assert (= (str.len s) (str.len (toUppercase s))))
(assert (forall ((i Int) (x String))
(let ((a!1 (and (not (= (str.at x i) "a"))
(
在Z3中,有没有一种有效的方法可以找到两个BitVec()之间的汉明距离?也就是说,两个长度相等的位向量在各自的位置上相差一定数量的位。我正在尝试使用来自的一些Z3API
这是我迄今为止一直尝试的:
V_1, V_2 = BitVecs('V_1 V_2',bit_length) #bit_length varies from 1 to 9.
s.add(Sum([ZeroExt(int(ceil(log(bit_length)/log(2))+1), Extract(i,i,(V_1 ^ V_
我需要一个具有相同值的重复向量,但重复向量的顺序不同。
但是,我不知道如何设置此约束
目前,我正在创建如下向量:
age = RealVector('age', NUM)
age_med_all = RealVector('age_m_a', NUM)
s.add([age[i] == age_med_all[i] for i in range(NUM)])
s.add([age_med_all[i] <= age_med_all[i + 1] for i in range(NUM -
我正在使用Z3的ELIM_量词功能来消除位向量公式中的量词。我遇到了以下情况,Z3生成了一个正确但过于复杂的结果,我想知道是否有一种方法可以重新编写我的问题,或者可能有一个配置选项可以得到我期望的简单结果
首先,这里是一个按预期工作的示例。它指出,对于长度为4的位向量,存在一个等于它的位向量
(set-option ELIM_QUANTIFIERS true)
(declare-fun a () BitVec[4])
(simplify (exists ((x BitVec[4]))
有没有办法让z3解算器发出“符号”解?例如,对于方程:
1+x=c
解决方案是x=c-1,但z3总是发出特定的模型,如[c=0,x=-1]。如何将c“定义”为符号变量?不幸的是,Z3没有公开这种功能。虽然我们在内部使用解算器,但它们不会在API中公开。在未来版本中,我们希望公开内部组件,例如:解算器、Grobner bases过程等。在当前版本中,我们有一种称为解算eq(请参阅)的策略。它使用高斯消去法的推广来消除变量。但是,这是一个预处理步骤,您无法控制消除哪些变量。对此有任何更新吗?在Z3的
我在linux上使用Z34.1 C-API。
我想为解算器指定一个超时
我正在使用以下命令,但是命令Z3_solver_set_params()中出现分段错误
Z3_context ctx=mk_context();
Z3_解算器s=Z3_mk_解算器(ctx);
Z3_参数=Z3_mk_参数(ctx);
Z3_符号r=Z3_mk_字符串_符号(ctx,“:超时”);
Z3参数集单元(ctx、参数、r、静态铸造(10));
Z3解算器集参数(ctx,s,参数);
似乎我没有正确使用API。
在
假设这里有一组关于非线性实数算术的约束,比如
pred1 = (> (- (* (- v2_x v0_x) (- v1_y v0_y)) (* (- v2_y v0_y) (- v1_x v0_x))) 0)
pred2 = (> (- (* (- v1_x v0_x) (- v2_y v0_y)) (* (- v1_y v0_y) (- v2_x v0_x))) 0)
事实上,如果我们这样做
Z3_solver_assert(ctx,solver,pred1);
Z3_solv
我想创建一个SMT序列,这样我就有了一个完整的总排序
例1:
a
在阅读了Z3和Leo的文章后,我认为(检查sat)和(使用smt检查sat)是等效的。但是,当对我们的测试套件(230个SMTLIB2文件)运行Z3 4.3.2三次时,使用(检查sat),需要198s/192s/195s秒,而使用(使用smt检查sat),则需要275s/283s/270s秒。我还尝试了夜间构建Z3 4.4.0 d3fb5f2a4cda,两者的区别很相似
为什么会这样
更多可能相关的信息:
Windows 7 x64、Z3 x64
我们所有的测试都配置了auto_config
我创建了z3::expr和int对的std::map,并希望存储不同的表达式。然而,当我存储不同类型的表达式时,比如说先存储一个64位向量,然后存储一个32位向量,编译器抛出了一个z3::异常,并抱怨bvslt的函数应用程序无效,在参数位置2排序不匹配,预期(u.BitVec 64),但给定(u.BitVec 32)。如果我只存储64位矢量或32位矢量的expr,它不会抱怨。我不知道bvslt是如何存储两个独立表达式的
所以我的问题是,有没有办法将不同排序的表达式存储到一个映射中?当然可以存储不
下面是我无法用java实现的解决方案。请帮帮我。下面是我试图实现的代码片段
我发现了同样的问题:
在java中,我没有model[]方法。在java中,我有没有任何参数的getModel方法
还有一个问题。我们如何实现“!=”内加。比如说
s、 阿多拉!=s、 型号[a],b!=s、 模型[b]
For==我们有mkEq方法,但我找不到任何与“!=”相关的方法
我尝试使用:
s、 添加ctx.mkOrctx.mkEqa、ctx.mkNots.getModel、ctx.mkEqa、ctx.mkN
我在Z3中有一组布尔变量,比如ai,bj,和ck,来描述我的SAT问题。然而,在我的问题中,需要考虑三个算术约束:
a1 + a2 + a3 + ... + an = 1
b1 + b2 + b3 + ... + bn = 0
c1 + c2 + c3 + ... + cn <= 1
a1+a2+a3+…+an=1
b1+b2+b3+…+bn=0
c1+c2+c3+…+cn您可以在if表达式中嵌入布尔值,例如,您可以编写
if(a1,1,0) + if(a2,1,2) + ...
我正在使用(Z3Py)的Python绑定。我有N个布尔变量,x1,…,xN。我想表达一个约束,即N中的K应该是真的。在Z3Py中,我如何才能做到这一点?有任何内置的支持吗?我查看了在线文档,但没有提到任何API
对于N个约束中的一个约束,我知道我可以分别表示对于所有I,j,至少有一个是真的(assert Or(x1,…,xN)),最多有一个是真的(assert Not(和(xi,xj))。我还知道如何手动表示N取1和N取K约束。然而,我的印象是,当解算器内置了对该约束的支持时,它有时会比手动表达
我试图用Z3解决一个相当棘手的问题。这不太相关,但我正在使用.NET绑定以及最新的Z3夜间发布版
我已经总结了这个问题,但请记住,实际问题比这更复杂
在非常简短的语句中,可以选择数组的任何索引。然后我将1添加到其中,结果存储在数组的任何其他索引中。这是重复,因为经常需要。在这个过程的最后,我们选择了一个索引,我们断言它等于一个特定的值——这就是问题的症结所在
如果用户没有为计算中使用的索引赋值,则最终断言将始终成功。例如:
(declare-const index1 Int)
(declare-
我想找到一个最大区间,其中表达式e对所有x都为真。编写这样一个公式的方法应该是:Exists d:ForAll x in(-d,d)。e和所有x不在(-d,d)内!e
为了得到这样一个d,Z3中的f公式(查看上面的公式)可以是:
from z3 import *
x = Real('x')
delta = Real('d')
s = Solver()
e = And(1/10000*x**2 > 0, 1/5000*x**3 + -1/5000*x**2 < 0)
f = Fo
我试图将位向量约束为等于字符串中空字节的索引。但是,我在int2bv中遇到了性能问题
作为该问题的一个简单示例,此问题(无int2bv)可立即解决:
; Solve time: 0m0.065s
(declare-const s String)
(declare-const len Int)
(assert (= (str.indexof s "\00") len))
(assert (>= len 256)) ; 0x100
(assert (<= len 4095)) ; 0xF
标签: Z3
smtnonlinear-optimization
我列出了一些关于二次函数的断言:
(declare-fun H () Int)
(assert (>= H 8000))
(assert (<= H 12000))
(minimize (- (^ H 2) H))
(check-sat)
(声明fun H()Int)
(断言(>=H 8000))
(assert(通常,z3不能处理非线性项。(如果将两个变量相乘,则项是非线性的。在您的情况下,这就是(^h2))
优化引擎尤其如此:整数上的非线性约束很可能无法实现。但你很幸运:你的公
我是Z3求解器python的新手。我试图定义一个列表,并将所有输出限制在该列表中,以实现像xor这样的简单操作
我的代码:
b=Solver()
ls=[1,2,3,4,5] #my list
s1=BitVec('s1',32)
s2=BitVec('s2',32)
x=b.check(s1^s2==1, s1 in ls, s2 in ls) #s1 and s2 belongs to the list, however, this is not the
标签: Z3
smtcvc4optimathsatmathsat
我正在写一个需要转换的问题的BV编码
一些Int到BitVec,反之亦然
在mathsat/optimathsat中,可以使用:
((_ to_bv BITS) <int_term>) ; Int => BitVec
(sbv_to_int <bv_term>) ; Signed BitVec => Int
(ubv_to_int <bv_term>) ; Unsigned BitVec => Int
((_ int2b
我需要SMTLIB2公式的完整模型:
Z3(版本3.2和4.0)返回所有变量的值,但不返回var4的值。我尝试了一些配置设置,如
MODEL_COMPLETION = true
但它似乎不起作用。有人有什么建议吗?相比之下,CVC3返回一个模型(包括var4),因此它不是SMTLIB或我的示例的问题
我需要这个的原因已经解释了。简而言之:我想使用C API进行增量求解。因此,我必须多次使用函数Z3\u parse\u smtlib2\u string。此函数需要以前声明的函数和常量作为参数
我需要知道如何在z3中执行以下操作:
对于L4中的所有x。x
标签: Z3
transition-systems
我使用Z3的PDR引擎来证明过渡系统中的不变量。
当一个转换系统包含一个必须通过才能达到特定状态的计数器循环时,性能会很慢
L0 = L.L0
L1 = L.L1
L2 = L.L2
y=Int('y')
i = Int('i')
state = Const('state', L)
t1 = { "guard" : state == L0,
"effect" : [ L1, i ] }
t2 = { "guard" : And(state == L1),
"effect" :
我实际上使用Z3py来调度解决问题,我试图表示一个2处理器系统,其中必须完成4个不同执行时间的进程
我的实际数据是:
流程1:到达时间为0,执行时间为4
流程2:到达时间为1,执行时间为3
流程3:3点到达,执行时间5点
流程4:在1到达,执行时间为2
实际上,我试图表示每个流程,同时在等分时间的子流程中分解每个流程,因此我的数据类型如下:
Pn = Datatype('Pn')
Pn.declare('1')
Pn.declare('2')
Pn.declare('3')
Pn.declare
我的问题是“Distinct”在z3 python中工作吗?。我比较了以下代码,结果似乎不一样:
(declare-const x Int)
(declare-const y Int)
(assert (distinct x y))
(check-sat)
(get-model)
结果是:
sat
(model
(define-fun y () Int
0)
(define-fun x () Int
1)
)
我添加了否定断言只是为了测试,结果是未满足的,
我是Z3的初学者。我只是尝试了Z3软件包中发布的一些示例,我再也没有其他的经验了。我正在研究一个关于图中最短路径的问题。我可以用Z3吗?谢谢大家 您可以用逻辑来表达这样的查询,但也许您可以使用专用的Dijktra算法或变体来解决这样的问题。
有关使用Z3的介绍,请查看链接自的教程
我已经通读了那篇材料。我知道Z3非常灵活,能够解决许多复杂的问题。我想了解更多关于Z3的理论,但似乎没有关于基本机制或介绍的信息。你能告诉我怎样才能学到更多吗?
对于以下公式
(声明乐趣i()Int)
(声明fun@I()Int)
(声明funr2()(数组Int))
(断言(=i 4))
(断言(对于所有(@I Int))
(!(=>(和(>=@i0)(
标签: Z3
theorem-provingabstract-algebra
使用ATP Leo II和TPTP thf语言,可以证明Frobenius代数和开闭余元中的许多定理。我使用以下代码创建了一个
thf(alpha_decl,type,(alpha: $aaxa > $axaa)).
thf(invalpha_decl,type,(invalpha: $axaa > $aaxa )).
thf(mu_decl,type,(mu: $aa > $a )).
thf(eta_decl,type,(eta: $i > $a )).
thf(m
我有一个简短的(4行)程序,它在一个系统上终止,但在另一个系统上不终止
(set-logic QF_FP)
(declare-fun s0 () (_ FloatingPoint 11 53))
(assert (fp.isSubnormal (fp.mul roundNearestTiesToEven s0 s0)))
(check-sat)
此程序应产生(sat),但Z3崩溃,并出现以下回溯:
(gdb) bt
#0 bv_rewriter::mk_mul_eq (this=this@e
我有一种意想不到的A型
sortA = DeclareSort('A')
和一个函数foo:
foo = Function('foo',sortA,sortA,BoolSort())
现在我想定义一个排序为a的常量列表。我的尝试是:
X = [ Consts("c_%s" % i,sortA) for i in range(10) ]
但这不起作用,因为
s.add(foo(X[0],X[1]))
给出一个“Z3表达式预期”错误。我非常感谢您的帮助:)Consts创建了一个常量列表,该列
对于涉及普遍量化实变量的约束,z3、e-匹配或mbqi中使用哪种方法?当我查看z3中的help()选项时,默认情况下这两个都是真的
Z3能否生成Craig插值(至少对于命题逻辑而言?)。
我没有在Z3的文档中找到它。不,Z3不支持Craig Interplants,但它生成证明。可以从证明中提取插入元素。Ken Mcmillan正在使用这种方法在Z3上开发一种插入式发电机。感谢您的回复。你知道项目的状态吗?它会在几天、几周、几个月内完成吗?肯的插值决策程序已经在使用。他最终将在MSR网站上发布。目前,他是在个人基础上发布的。你可以联系他去做手术。
Z3会支持AUFBV吗
对于以下脚本:
(set-logic AUFBV)
(declare-fun x () (_ BitVec 16))
(declare-const t (Array (_ BitVec 16) (_ BitVec 16)))
(assert (= (select t #x0000) #x0000))
在线Z3演示似乎对set logic调用感到满意,但随后它抱怨排序BitVec和Array。(顺便说一句,在线演示似乎对set logic调用很满意,而不管逻辑名称是什么,
据我所知,Z3在遇到量化线性实数/有理数算法时,应用了比约纳、IJCAR 2010以及比约纳和蒙尼奥最近的工作中描述的一种量词消去形式(这至少是qe_sat_tractic.cpp所说的)
我在想
如果公式是多线性的,从“常量”是符号的意义上看,它是否仍然有效。例如。∀x、 斧头≤B⇒ 斧头≤ 0可以通过分离案例a0来处理。这可以使用Weispfenning的虚拟替换方法实现,但我不知道Z3最终实现了什么(也就是说,它是实现了一般方法还是限制于常数系数的方法)
在Z3中,是否有可能输出消去法的结
我试图向Z3提出涉及未解释的函数(始终使用域int)、实数和量词的查询。我知道添加量词通常会导致未知结果,但我很惊讶这种情况发生得如此之快:
(declare-fun $in1 (Int) Real)
(declare-fun $in2 (Int) Real)
(assert (< ($in1 0) ($in2 0)))
(assert (forall (($$out Real))
(not (and (< ($in1 0) $$out) (< $$out ($in2 0)
例如,我有一个约束x+y>100。我不希望z3给我x的值是1或2,我也不希望z3给我y的值是1或2
所以,x和y可以是除1或2之外的任何数字
我们能对z3实施这样的限制吗
谢谢 当然。。只需断言x>2和y>2。这里是z3py:
from z3 import *
x = Int('x')
y = Int('y')
s = Solver()
s.add (x > 2)
s.add (y > 2)
s.add (x+y > 100)
s.check()
print s.mode
对于大型模型,通过Z3 Python API使用的函数model()会截断输出(在某些情况下,模型会以“…”继续)
有没有办法避免这种情况?我有下面的函数,它试图将str(self.solver.check())给出的答案和str(self.solver.model())给出的模型保存到文件名中
问题的结果是:
sat[C5_VM1 = 0,
... //these "..." are added by me
VM6Type = 6,
ProcProv11 = 18,
VM2Type = 5,
我正在Z3中为列表开发一个插入方法。但是,我必须满足一些要求:
如果项目已在列表中,则不会插入该项目
如果列表(集合)已满,则不会插入该项
首先,我定义了数据类型:
(声明数据类型(T)((Lst-nil(cons(hd-T)(tl-Lst ')))
我定义函数isFull以了解列表是否超过最大容量,IsMember以了解列表是否包含数字
(define-fun isFull ((l (Lst Int))) Bool
(ite
(<= (len l) 10)
我正在为Z3分析仪建立一个模型。由于这个模型有大量的约束,并且所有这些约束都是一个接一个地构建的,所以所有这个过程都使用不同的Z3API。因此,当我查看构建模型所需的所有时间时,这是一个非常长的时间。有时甚至我的笔记本电脑内存不足,无法完成模型创建过程。为了解决这个问题,我希望将所需的模型构建为文本文件,并将完成的模型提供给Z3解算器。从理论上讲,这将改善计时问题,因为我将只调用Z3API一次。当我环顾四周时,我唯一能找到的就是使用一个名为“Z3_benchmark_to_smtlib_stri
我在UFBV查询上运行Z3。当前查询包含2个调用检查sat。
如果我在check sat之后放置push 1,Z3将在30秒内解决查询。如果我根本没有放入任何push 1,因此有两个调用check sat,而它们之间没有任何push 1,那么Z3将在200秒内解决它。
有趣。有什么具体的原因或巧合吗?Z3.x有一种基于战术和战术的“战略规范语言”。我还没有“做广告”,因为它正在进行中。
本文描述了基本思想。
对于每种逻辑,我们都有不同的内置策略。这些策略通常不支持增量求解,因为它们可能应用使用“
当Z3返回一个带有未解释排序的模型时,比如说Q,它使用Q!瓦尔!0
然而,如果我从头开始创建一个查询,并将此符号称为Q的居民,那么Z3理所当然地抱怨Q!瓦尔!0是一个未知常量
本质上,我试图让Z3枚举Q的所有居民,要求它给我一个与之前返回的模型不同的模型。因此,在随后对Z3的调用中,我需要引用这些常量
有没有办法使用SMT-Lib2接口实现这一点
我有一个枚举类型BoolT,它包含Bool和Bot
我想定义一个等式函数eq,给定两个Bool,如果其中一个参数是Bot,则返回Bot,否则两个Bool参数之间的等式。但是,我无法定义布尔值之间的实际比较。直到现在我才得到这个函数
(define-fun eq ((x1 BoolT) (x2 BoolT)) BoolT
(ite (or (= x1 Bot) (= x2 Bot)) Bot Bool))
而我需要像这样的东西
(define-fun eq ((x1 BoolT) (x2
我们需要一个字符串解算器,正在考虑Z3 str或其后续Z3str2。这些扩展能否与Z3的所有其他部分(即Z3中实现的所有其他理论解算器)同时使用?或者这些字符串扩展只能使用准独立的吗?我不这么认为,不。尝试使用Z3 str声明一个实型会出错。似乎只支持字符串和int
在使用Z3 STR之前还有其他需要考虑的事情。它似乎需要稍微不同的非SMT-LIB v2兼容输入格式。z3str/tests/中提供了一些示例文件。例如,它们使用声明变量来声明变量,而不是声明常量或声明乐趣
关于Z3 str和Z3-
这是我第一次使用Z3,我试图找到给定表单的所有sat真理赋值,它不断抛出:
Z3(5,10):错误:函数应用程序无效,参数丢失
(echo "((p => q) v (q => p)) ^ ~((p => q) ^ (q => p)))")
(declare-const p Bool)
(declare-const q Bool)
(assert (and(or(=> p q)(=> q p)) (not(and(=> p q) (=> q p))
Z3中是否有好的机制来抽象断言?我想创建一个“函数”,它接受参数并对这些参数进行断言,其中可能包含“局部变量”定义
假设我有一个字符串,我想断言它代表13到24之间的十进制数。我可以编写一组关于字符串的正则表达式断言,并将其与str.to.intrange断言相结合。我可以直接这样做,但是如果我有几十个这样的变量,我想对它们做出断言,它就会重复。我可以使用外部语言API,或者在Z3中定义一个返回布尔值的宏/函数,并断言它是真的,但这感觉有点间接。这里的习惯用语是什么?我希望Z3能够像手工编写断言
1 2 3 4 5 6 ...
下一页 最后一页 共 34 页