让我们假设一个非常简单的约束:solve(x > 0 && x < 5).
Z3(或任何其他SMT求解器,或任何其他自动技术)可以计算x满足给定约束的(整数)变量的最小值和最大值吗?
在我们的例子中,最小值为1,最大值为4.
鉴于这x,y,z = Ints('x y z') 和字符串一样s='x + y + 2*z = 5',是否有快速方法将s转换为z3表达式?如果它不可能那么似乎我必须做很多字符串操作来进行转换.
我正在试验Z3,在那里我结合了算术,量词和平等的理论.这似乎不是非常有效,事实上,在可能的情况下用所有实例化的地面实例替换量词似乎更有效.考虑下面的示例,其中我为一个函数编码了唯一名称公理,该函数f接受两个排序参数Obj并返回一个解释排序S.这个公理说明每个唯一的参数列表f返回一个唯一的对象:
(declare-datatypes () ((Obj o1 o2 o3 o4 o5 o6 o7 o8)))
(declare-sort S 0)
(declare-fun f (Obj Obj) S)
(assert (forall ((o11 Obj) (o12 Obj) (o21 Obj) (o22 Obj))
(=>
(not (and (= o11 o21) (= o12 o22)))
(not (= (f o11 o12) (f o21 o22))))))
Run Code Online (Sandbox Code Playgroud)
虽然这是在逻辑中定义这样一个公理的标准方法,但是像这样实现它在计算上非常昂贵.它包含4个量化变量,每个变量可以有8个值.这意味着这导致了8^4 = 4096平等.需要Z3 0.69s和2016量词实例来证明这一点.当我编写一个生成此公式实例的简单脚本时:
(assert (distinct (f o1 o1) (f o1 o2) .... (f o8 o7) (f o8 o8)))
Run Code Online (Sandbox Code Playgroud)
生成这些公理需要0.002s,而在Z3中需要0.01s(或更少).当我们增加域中的对象或函数的参数数量时,f这种差异会迅速增加,并且量化的情况很快变得不可行.
这让我想知道:当我们有一个有界域时,为什么我们首先在Z3中使用量词?我知道SMT使用启发式方法来寻找解决方案,但我感觉它仍然无法与一个简单的特定于域的地面实施竞争,后者将基础实例提供给SMT,这仅仅是SAT解决方案.我的直觉是否正确?
我们有一个使用Z3 API v4.0的.NET项目.我们希望能够在Mono上编译和运行该项目.
该项目与MonoDevelop合作得很好.但是,当我们运行或调试程序时,发生以下异常
System.DllNotFoundException: z3.dll
at (wrapper managed-to-native) Microsoft.Z3.Native/LIB:Z3_mk_context_rc (intptr)
at Microsoft.Z3.Native.Z3_mk_context_rc (IntPtr a0) [0x00000] in <filename unknown>:0
at Microsoft.Z3.Context..ctor () [0x00000] in <filename unknown>:0
at <StartupCode$Nqueens>.$Nqueens..cctor () [0x00000] in /path/to/file:15
Run Code Online (Sandbox Code Playgroud)
如果重要的话我们使用Mac OS X和Mono 3.0.2/MonoDevelop 3.0.5.
有没有人在Mono上使用Z3 API的经验?
这听起来像一个奇怪的想法,但我们的情况描述如下.我们有一个使用Z3的课程,所有实验室计算机都安装了Windows和.NET框架.但是,一些在自己的计算机(Linux,Mac)上工作的学生应该能够编译和运行该项目.
摘要:
感谢@Leo的建议,我可以在MonoDevelop下运行该项目并进行一些更改:
1)创建App.config文件并在configuration标记下添加以下信息:
<dllmap dll="z3.dll" target="libz3.dylib" os="osx" cpu="x86"/>
Run Code Online (Sandbox Code Playgroud)
2)libz3.dylib从Mac OS X发行版复制(或从新版本的源代码构建)并确保共享库并在编译项目时Microsoft.Z3.dll复制到输出文件夹(bin/Debug在Debug模式下).为此,我们ItemGroup在项目文件中手动添加到标签:
<None Include="libz3.dylib">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<Visible>False</Visible>
</None>
Run Code Online (Sandbox Code Playgroud)
libz3.so在Linux上,该过程应该类似.
我们尝试了不同理论的各种例子.到目前为止没有发生错误或异常.
浏览Z3源代码,我遇到了一堆引用QF_FPA的文件,它似乎代表无量词,浮点运算.但是,我似乎无法找到有关其状态的任何文档,或者如何通过各种前端(特别是SMT-Lib2)使用它.这是IEEE-754 FP的编码吗?如果是,支持哪些精度/操作?任何文档都是最有帮助的..
我正在使用Z3来提取不可满足的配方的不饱和核心.我正在使用Z3 @Rise界面(基于Web)编写以下代码,
(set-logic QF_LIA)
(set-option :produce-unsat-cores true)
(declare-fun ph1 () Int)
(declare-fun ph1p () Int)
(declare-fun ph3 () Int)
(declare-fun ph3p () Int)
(declare-fun ph4 () Int)
(declare-fun ph4p () Int)
(define-fun one () Bool (= ph3p (+ ph1 1)))
(define-fun two () Bool (= ph3 (+ ph1 1)))
(define-fun three () Bool (= ph1p (+ ph1 1)))
(define-fun four () Bool (= ph4p (+ ph1p 1)))
(define-fun five () Bool (>= ph1 0))
(define-fun six () Bool (>= ph4 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 python 中的 Z3 库,但它不起作用。它给出了一个错误 Int 未定义。
我使用 pip 安装了 z3 模块,如您所见,导入 lib 时没有抛出错误消息。我使用的是 Mac OS X 和 python 版本 2.7.6
>>> from z3 import *
>>> x = Int('x')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Int' is not defined
Run Code Online (Sandbox Code Playgroud) 我在Haskell中编写了一个应用程序,它调用Z3求解器来解决一些复杂公式的约束.感谢Haskell,我可以快速切换我正在使用的数据类型.
当使用SBV的AlgReal类型进行计算时,我得到的结果是合理的时间,但是切换到Float或Double类型会使Z3消耗~2Gb的RAM,甚至在30分钟内也不会产生.
这是否期望产生浮点解决方案需要更多时间,或者我的方面有些错误?
我正在尝试用zt的smt-lib 2语法编码QBF.运行z3会产生警告
警告:未能找到量词的模式(量词id:k!14)
并且可满足性结果是"未知的".
代码如下:
(declare-fun R (Bool Bool Bool Bool) Bool)
(assert
(forall ((x2 Bool) (x3 Bool))
(exists ((y Bool))
(forall ((x1 Bool))
(R x1 x2 x3 y)
)
)
)
)
(check-sat)
Run Code Online (Sandbox Code Playgroud)
我通过重写代码来摆脱警告
(set-option :auto-config false)
(set-option :mbqi false)
(declare-fun R (Bool Bool Bool Bool) Bool)
(declare-fun x1 () Bool)
(declare-fun x2 () Bool)
(declare-fun x3 () Bool)
(declare-fun y () Bool)
(assert
(forall ((x2 Bool) (x3 Bool))
(!
(exists ((y Bool))
(!
(forall ((x1 Bool))
(!
(R …Run Code Online (Sandbox Code Playgroud) 我试图使用Z3解决12000+布尔变量的SAT问题.我希望大多数变量在解决方案中评估为false.有没有办法引导或提示Z3作为SAT求解器首先尝试"极性假"?我已经尝试使用cryptominisat 2并取得了良好的效果.