Z3 实数算术和数据类型理论整合得不太好

2024-03-28

这与我之前问过的问题有关Z3 SMT 2.0 与 Z3 py 实现 https://stackoverflow.com/questions/13826217/z3-smt-2-0-vs-z3-py-implementation我实现了无穷大正实数的完整代数,但求解器行为不当。 当注释的约束给出约束的实际解决方案时,我对这个简单的实例一无所知。

# Data type declaration
MyR = Datatype('MyR')
MyR.declare('inf');
MyR.declare('num',('re',RealSort()))

MyR = MyR.create()
inf = MyR.inf
num  = MyR.num
re  = MyR.re

# Functions declaration
#sum 
def msum(a, b):
    return If(a == inf, a, If(b == inf, b, num(re(a) + re(b))))

#greater or equal 
def mgeq(a, b):
  return If(a == inf, True, If(b == inf, False, re(a) >= re(b)))

#greater than
def mgt(a, b):
  return If(a == inf, b!=inf, If(b == inf, False, re(a) > re(b)))

#multiplication  inf*0=0 inf*inf=inf  num*num normal
def mmul(a, b):
    return If(a == inf, If(b==num(0),b,a), If(b == inf, If(a==num(0),a,b), num(re(a)*re(b))))

s0,s1,s2 = Consts('s0 s1 s2', MyR)

# Constraints add to solver
constraints =[
  s2==mmul(s0,s1),
  s0!=inf,
  s1!=inf
]
#constraints =[s2==mmul(s0,s1),s0==num(1),s1==num(2)]

sol1= Solver()
sol1.add(constraints)

set_option(rational_to_decimal=True)

if sol1.check()==sat:
  m = sol1.model()
  print m
else:
  print sol1.check()

我不知道这是令人惊讶还是预料之中。有办法让它发挥作用吗?


你的问题是非线性的。新的(完整的)非线性算术求解器(nlsat)在 Z3 中没有与其他理论(例如代数数据类型)集成。请参阅帖子:

  • 使用 Z3_solver_get_unsat_core 获取 unsat 核心 https://stackoverflow.com/questions/13590129/getting-unsat-core-using-z3-solver-get-unsat-core
  • 非线性算术和未解释的函数 https://stackoverflow.com/questions/10669503/non-linear-arithmetic-and-uninterpreted-functions

这是当前版本的限制。未来的版本将解决这个问题。

同时,您可以通过使用不同的编码来解决该问题。如果仅使用实数算术和布尔值,问题将在以下范围内nlsat。一种可能性是编码MyR作为 Python 对:Z3 布尔表达式和 Z3 实数表达式。

这是部分编码。我没有对所有运算符进行编码。该示例也可在线获取,网址为http://rise4fun.com/Z3Py/EJLq http://rise4fun.com/Z3Py/EJLq

from z3 import *

# Encoding MyR as pair (Z3 Boolean expression, Z3 Real expression)
# We use a class to be able to overload +, *, <, ==
class MyRClass:
    def __init__(self, inf, val):
        self.inf = inf
        self.val = val
    def __add__(self, other):
        other = _to_MyR(other)
        return MyRClass(Or(self.inf, other.inf), self.val + other.val)
    def __radd__(self, other):
        return self.__add__(other)
    def __mul__(self, other):
        other = _to_MyR(other)
        return MyRClass(Or(self.inf, other.inf), self.val * other.val)
    def __rmul(self, other):
        return self.__mul__(other)
    def __eq__(self, other):
        other = _to_MyR(other)
        return Or(And(self.inf, other.inf),
                  And(Not(self.inf), Not(other.inf), self.val == other.val))
    def __ne__(self, other):
        return Not(self.__eq__(other))

    def __lt__(self, other):
        other = _to_MyR(other)
        return And(Not(self.inf),
                   Or(other.inf, self.val < other.val))

def MyR(name):
    # A MyR variable is encoded as a pair of variables name.inf and name.var
    return MyRClass(Bool('%s.inf' % name), Real('%s.val' % name))

def MyRVal(v):
    return MyRClass(BoolVal(False), RealVal(v))

def Inf():
    return MyRClass(BoolVal(True), RealVal(0))

def _to_MyR(v):
    if isinstance(v, MyRClass):
        return v
    elif isinstance(v, ArithRef):
        return MyRClass(BoolVal(False), v)
    else:
        return MyRVal(v)

s0 = MyR('s0')
s1 = MyR('s1')
s2 = MyR('s2')

sol = Solver()
sol.add( s2 == s0*s1,
         s0 != Inf(),
         s1 != Inf(),
         s0 == s1,
         s2 == 2,
         )
print sol
print sol.check()
print sol.model()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Z3 实数算术和数据类型理论整合得不太好 的相关文章

  • 如何让 Z3 返回最小模型?

    如果我给 Z3 一个像 p 这样的公式q 我希望 Z3 返回 p true q dont care 或者 p 和 q 切换 但它似乎坚持为 p 和 q 赋值 即使我没有完成转换 通话时亮起Eval 除了对此感到惊讶之外 我的问题是如果 p
  • Z3:int2bv 的异常

    declare const a Int declare const b Int declare const c BitVec 32 declare const d BitVec 32 assert b bv2int c assert c i
  • 如何使 Z3 的 (Python) SAT 求解偏向某个标准,例如“更喜欢”具有更多否定文字

    在 Z3 Python 中 有什么方法可以将 SAT 搜索 偏向 标准 吗 一个案例 我想要Z3获取一个模型 但不是任何模型 如果可能的话 给我一个具有大量否定文字的模型 因此 举例来说 如果我们必须搜索A or B一个可能的模型是 A T
  • 将项目分配给具有功能的组

    我有一个问题 我要将变量分配给集合 每个集合都有可以分配给它的变量的限制 并且每个变量都可以分配给总集合的某个子集 Example a可以成套A or B b可以成套B c可以成套A or B d可以成套A 因此 我们可以有A a d B
  • 表示 SMT-LIB 中的时间约束

    我试图在 SMT LIB 中表示时间约束 以检查它们的可满足性 我正在寻找有关我所采取的方向的反馈 我对 SMT LIB 比较陌生 非常感谢您的意见 我所面临的限制是事件的时间和持续时间 例如 考虑以自然语言给出的以下约束 约翰在 13 0
  • 从Z3能得到最终的CNF公式吗?

    这是我的简单编码 我想得到包含所有这些约束的最终布尔 CNF Z3 解算器中是否有任何选项可以获得最终的布尔 CNF x Int x y Int y c1 And x gt 1 x lt 10 c2 And y gt 1 y lt 10 c
  • 从 z3 模型中仅提取一个值

    我正在寻找相当于 z3 源 API获取价值 例如 当我有以下查询时 我可以轻松指定我想要查看哪些值 declare const s1 String declare const s2 String assert 8 str len s1 as
  • 如何在线使用Z3Py解决运算放大器的问题

    求下列电路中R的值 使用以下代码可以解决此问题 R V1 V2 Vo Reals R V1 V2 Vo I1 V1 R 50 I2 V2 R 10 g R I1 I2 print g equations Vo g print equatio
  • Z3中数组的理论:(1)模型很难理解,(2)不知道如何实现功能,(3)与序列的区别

    继发布于的问题之后Z3 Py 中的数组的表现力如何 一个例子 https stackoverflow com questions 73778513 how expressive can we be with arrays in z3py a
  • Z3 返回型号不可用

    如果可能的话 我想要对我的代码有第二意见 问题的约束条件是 a b c d e f是非零整数 s1 a b c and s2 d e f 是集合 The sum s1 i s2 j for i j 0 2必须是一个完美的正方形 我不明白为什
  • 如何让 z3 返回多个 unsat 核心、多个令人满意的作业

    我正在研究一个研究工具的一个组件 我有兴趣检索 对于 QF LRA 多个 最少或其他 UNSAT核心以及 多项 SAT 作业 我检查了论坛以获取有关此主题的早期讨论 例如 在逻辑 QF LRA 上使用 z3 时如何获得不同的 unsat 核
  • 跟踪 z3::optimize unsat_core

    如何正确追踪z3 optimize未饱和核心 Z3 C z3 optimize当我添加时没有找到预期的解决方案不饱和核心跟踪 基于这些examples https github com Z3Prover z3 blob 9df6c10ad8
  • Z3 Optimize 最大和最小功能背后的理论是什么?

    我写这封信是为了询问 Z3 Optimize 功能背后的理论 算法 特别是它的maximum and minimum功能 这对我来说似乎很神奇 它是某种二分搜索吗 它如何有效地计算出这里的最大 最小值 我试图搜索相关功能的源代码 例如 ex
  • (Z3Py) 函数声明有什么限制吗?

    函数声明有什么限制吗 例如 这段代码返回 unsat from z3 import def one op op arg1 arg2 if op 1 return arg1 arg2 if op 2 return arg1 arg2 if o
  • z3 中使用哪些技术来处理非线性整数实数问题?

    以下是 a 的 z3 统计数据problem http www ccs neu edu home jaideep example smt2在非线性整数实数片段中 我的许多问题与此类似 add rows 11062574 added eqs
  • 将 IR 转换为 Z3 公式?

    我在 IR 中有一些代码 并且该代码已经是 SSA 形式 现在我正在尝试将此代码转换为SMT公式 然后将其提供给Z3进行一些验证 我有一些疑问 有没有技术论文详细解释如何将SSA IR转换为SMT公式 我四处寻找 一无所获 对于那些计算指令
  • 使用 Z3 SMT 解决谓词演算问题

    我想使用 Z3 来解决最自然地用原子 符号 集合 谓词和一阶逻辑表达的问题 例如 伪代码 A a1 a2 a3 A is a set B b1 b2 b3 C c1 c2 c3 def p a A b B c C gt Bool p is
  • Z3 求解器中 MAxSMT 和用户定义成本函数的组合

    我正在使用 Z3 来优化带有一些软约束 带有加权 MaxSMT 的成本函数 我很好奇 MaxSMT 和用户定义的成本函数如何交互 求解器是否最小化 MaxSMT 成本和目标函数两者 是否有优先级机制 我找不到这方面的任何文档 如果我遗漏了什
  • 为什么 Z3 对于很小的搜索空间来说很慢?

    我正在尝试制作一个 Z3 程序 在 Python 中 它生成执行某些任务的布尔电路 例如 添加两个 n 位数字 但性能非常糟糕 以至于对整个解决方案空间进行强力搜索将导致快一点 这是我第一次使用 Z3 所以我可能会做一些影响我性能的事情 但
  • Z3 Java API 定义函数

    我需要您帮助使用 Z3 Java API 定义函数 我尝试解决这样的问题 与 z3 exe 进程一起工作正常 declare fun a Real declare fun b Real declare fun c Bool define f

随机推荐

  • SDL - 绘制“负”圆圈(战争迷雾)

    我有这个 800x600square 我想绘制到屏幕上 我想在其中 切割 圆圈 其中 alpha 为 0 基本上我是在地图上绘制整个矩形 因此在我绘制的这些 圆圈 中 您可以看到地图 否则您会看到灰色方块 所以 我假设你想在你的一款游戏中添
  • 使用 jQuery datepicker 和 Angular 2 更改事件

    当我使用 jQuery datepicker 插件时 我在捕获更改事件时遇到一些问题 并且我尝试使用 change 方法来捕获更改 但似乎当我使用此插件时 角度无法捕获它 Component selector foo element tem
  • iframe 中的回调方法将值返回给 opener

    我必须在 iframe 中调用回调方法才能将值返回给 opener I know 挤压盒 http digitarald de project squeezebox 有 分配 打开 关闭 静态方法 但我不明白它是如何工作的 有人可以帮助我吗
  • 如何在文本文件更改时重新初始化 java servlet

    我有一个 servlet 它在初始化期间从文本文件中提取数据 现在我正在使用 cron 作业更新该文本文件 比如每天上午 10 点 并希望在每次该特定文件发生更改时重新初始化 servlet 我可以遵循的第二种方法是将 servlet 的重
  • 引用声明是否为引用对象引入了新名称?

    In 这个问题 https stackoverflow com q 33344259 560648我们知道 RVO 不能应用于像这样的表达式p first 在评论中还建议 RVO 通常不适用于类似这样的表达式r在声明之后auto r p f
  • 局部声明隐藏实例变量警告

    本地声明隐藏 self treatmentId treatmentId 附近的实例变量消息弹出窗口和 self treatmentName treatmentName implementation Treatment synthesize
  • 如何检索LDAP数据库的所有属性

    我在用LDAP模块 of python连接到LDAP服务器 我可以查询数据库 但我不知道如何查询检索数据库中存在的字段 这样我就可以提前通知用户查询数据库 告诉他他试图访问的字段不在数据库中 例如 如果存在的字段只是 cn memberOf
  • Flexbox 填充底部在 Firefox 和 Safari 中失败

    当向下滚动时 parentdiv 你应该在底部看到它的红色背景 因为padding bottom 这适用于 Chrome 但不适用于 Safari 和 Firefox container display flex width 200px h
  • iOS - 用于故事板检测 iPad / iPhone 设备的逻辑

    我需要将故事板定义为应用程序委托文件中身份验证脚本的一部分 用于将相关数据传递到特定视图 一切正常 但通过以这种方式定义我的故事板 我覆盖所有设备 iPad或iPhone 的路径 我希望我的应用程序是通用的 并遵循依赖于设备的不同故事板 因
  • 如何在 Laravel 5.3 中执行“内部”重定向

    我了解如何使用redirect 方法重定向用户 但此方法返回302代码 浏览器必须发出第二个HTTP请求 是否可以在内部将请求转发到不同的控制器和操作 我正在中间件中进行此检查 因此我的句柄函数如下所示 public function ha
  • 如何用JS在按钮点击时显示不同的div?

    我正在尝试制作一个有 2 张卡片的部分 每张卡片都有一个按钮和一个小的描述性文本 我想要实现的是 当我单击按钮时 会发生 3 件事 1 该按钮更改内容 从 变为 但这是我最不担心的 2 一个div显示与该卡对应的信息 占用100 vw 和
  • 共享扩展程序未上传全尺寸图像

    我正在为我的 iOS 应用程序开发共享扩展 我确实做了所有事情 但问题是我的代码仅适用于小图像 但是当我上传从设备摄像头拍摄的图像时 上传失败 只有文本被上传 void performUploadWith NSDictionary para
  • 约什·史密斯 (Josh Smith) 的 RelayCommand 实现是否存在缺陷?

    考虑参考Josh Smith 的文章采用模型 视图 视图模型设计模式的 WPF 应用程序 http msdn microsoft com en us magazine dd419663 aspx 具体来说是一个示例实现RelayComman
  • axios 和 android 模拟器出现网络错误

    我有一个 React Native 应用程序 它使用 NodeJS 后端来提供 API 我的 React Native 前端正在使用 Expo 和 Axios 来访问我的 NodeJS API 使用 Hapi Joi Knex 这将 例如
  • 如何从 JavaScript 调用 ActionScript 函数

    我在actionscript3中有一个这样的函数 private function uploadFile event MouseEvent void var uploader URLRequest new URLRequest server
  • 如何使用强名称对 .NET 程序集 DLL 文件进行签名? [复制]

    这个问题在这里已经有答案了 我有一个名称不强的程序集 我没有它的源代码 我现在需要它签名 有没有办法做到这一点 如果原始程序集被标记为延迟签名 则可以使用 sn exe 工具 如果原始程序集没有如此标记 则可以使用 ildasm exe 反
  • “无法解析所有依赖项”与第 3 方库(来自 Maven Central)

    In my build gradle 我定义了一些第 3 方库 所有这些库都可以在 Maven Central 中找到 dependencies compile com google code gson gson 2 2 4 compile
  • 如何将react-native升级到最新版本

    我正在尝试升级到最新版本的react native react native 0 26 2 以便我可以使用react native flux router I am getting this error Chrome 控制台仅显示默认错误消
  • 在一个 vscode 窗口中调试 React 组件库,同时符号链接到主机应用程序

    Summary 我有一个独特的情况 我们创建了一个 由于缺乏更好的术语 micro ui 作为 React 组件 UI 接收 props 因此它可以动态配置自身以在我们的几个较大的应用程序中工作 由于它在多个应用程序中使用的性质 我们决定将
  • Z3 实数算术和数据类型理论整合得不太好

    这与我之前问过的问题有关Z3 SMT 2 0 与 Z3 py 实现 https stackoverflow com questions 13826217 z3 smt 2 0 vs z3 py implementation我实现了无穷大正实