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决定非线性实数运算的存在片段吗 也就是说 我可以用它作为决策程序来测试是否 带有 和 x 的无量词公式有实数解吗 是的 Z3有一个非线性多项式实数运算的存在片段的判定过程 当然 该过程是以可用资源为模完成的 该过程相当昂贵 本文 htt
  • Z3 Solver Java API:意外行为

    通过向求解器添加条件 我想使用 solver check 检查是否存在解 因此 我创建了一个简单的示例来寻找 t1 的解决方案 我知道 t1 有一个解 即 t1 0 然而 求解器的状态不是 SATISFIABLE public static
  • Z3中的parthood定义

    我试图在 Z3 中定义集合对 使用数组定义 之间的部分关系 在下面的代码中称为 C 我写了 3 个断言来定义自反性 传递性和反对称性 但 Z3 返回 未知 我不明白为什么 define sort Set Array Int Bool dec
  • 通过 Z3 C++ API 使用浮点运算

    我正在尝试使用 Z3 解决非线性实数问题 我需要 Z3 来生成多个解决方案 在问题域中 精度并不是关键问题 我只需要小数点后一位或两位小数 因此 我需要设置 Z3 不探索实数的所有搜索空间 以最大限度地减少找到多个解决方案的时间 我正在尝试
  • Z3 上下文序列化/反序列化?

    是否可以序列化 反序列化 Z3 上下文 来自 C 如果没有 这个功能有计划吗 我认为这个功能对于现实世界的应用程序很重要 当前 API 不直接支持此功能 下一版本将支持多个求解器 我们将提供用于将断言从一个求解器复制到另一个求解器并检索断言
  • 如何使用 z3py 进行增量求解

    我正在使用 Z3 求解器的 python API 来搜索优化的时间表 它工作得很好 除了有时即使对于小图也非常慢 但有时非常快 原因可能是我的调度问题的约束相当复杂 我试图加快速度 并偶然发现了一些关于增量解决方案的文章 据我了解 您可以使
  • 跟踪 z3::optimize unsat_core

    如何正确追踪z3 optimize未饱和核心 Z3 C z3 optimize当我添加时没有找到预期的解决方案不饱和核心跟踪 基于这些examples https github com Z3Prover z3 blob 9df6c10ad8
  • 使用函数在 z3 中创建列表

    我试图将这段伪代码转换为 SMT LIB 语言 但我卡住了 List function my fun int x list nil for i in 1 to x if some condition on i list concat i r
  • Z3 -smt2 -in:获取Z3版本

    使用选项启动后可以获得Z3的版本吗 smt2 in 就像是 get z3 version Z3 4 3 2 x64 Desired reply 在SMT LIB 2 0前端 我们可以使用命令 get info version 该命令是标准的
  • (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
  • 将 IR 转换为 Z3 公式?

    我在 IR 中有一些代码 并且该代码已经是 SSA 形式 现在我正在尝试将此代码转换为SMT公式 然后将其提供给Z3进行一些验证 我有一些疑问 有没有技术论文详细解释如何将SSA IR转换为SMT公式 我四处寻找 一无所获 对于那些计算指令
  • Z3 的参考资料 - 它是如何工作的[内部理论]?

    我有兴趣阅读 Z3 背后的内部理论 具体来说 我想了解 Z3 SMT 求解器的工作原理 以及它如何找到不正确模型的反例 我希望能够手动计算出一些非常简单的示例的跟踪 然而 所有 Z3 参考文献似乎都是如何在其中编码 或对其算法的非常高级的描
  • 有人尝试过用Z3本身来证明Z3吗?

    有没有人尝试证明Z3 http research microsoft com en us um redmond projects z3 与Z3本身 是否有可能使用 Z3 来证明 Z3 是正确的 更理论化的是 是否有可能使用 X 本身来证明工
  • 如何将公式转换为析取范式?

    说给定一个公式 t1 gt 2 或 t2 gt 3 且 t3 gt 1 我希望得到它的析取范式 t1 gt 2 且 t3 gt 1 或 t2 gt 3 且 t3 gt 1 在Z3中如何实现这一点 Z3没有将公式转换为DNF的API或策略 然
  • Z3 支持非线性算术

    我知道 Z3 对非线性算术有一些支持 但想知道扩展到什么范围 是否可以指定支持和不支持 或可能超时 哪些类别的非线性算术 提前了解这些将帮助我尽早放弃我的任务 似乎不支持与电源相关的内容 如下所示 def pow2 x k Int k re
  • 了解 z3 模型

    Z3Py 片段 x Int x fun Function fun IntSort IntSort IntSort phi ForAll x fun x x x print phi solve phi 永久链接 http rise4fun c
  • Z3 求解器中 MAxSMT 和用户定义成本函数的组合

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

    在 z3 中是否可以声明一个以另一个函数作为参数的函数 例如 这个 declare fun foo Int Bool Int 似乎不太管用 谢谢 正如 Leonardo 提到的 SMT Lib 确实not允许高阶函数 这不仅仅是语法限制 使
  • Z3统计中内存使用量的单位是什么?

    z3 统计中测量内存使用情况的单位是什么 是MB还是KB 记忆到底意味着什么 是执行期间的最大内存使用量还是所有分配的总和 它是执行期间最大堆大小的近似值 并通过 cmd context cpp 中的以下函数将其添加到统计对象中 void
  • 是否可以将一位的位向量转换为 SMTLib2 中的布尔变量?

    我想要一个布尔变量来测试 例如 位向量的第三位是否为 0 位向量的理论允许提取 1 位作为位向量 但不是布尔类型 我想知道我是否可以出演这个角色 谢谢 更新 如果我的问题不清楚 我很抱歉 但 Nikolaj Bjorner 的答案是如何测试

随机推荐

  • 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我实现了无穷大正实