Z3:检查模型是否唯一

2024-04-21

Z3 有没有办法证明/表明给定模型是唯一的并且不存在其他解决方案?

一个小例子来演示

(declare-const a1 Int)
(declare-const a2 Int)
(declare-const a3 Int)
(declare-const b1 Int)
(declare-const b2 Int)
(declare-const b3 Int)
(declare-const c1 Int)
(declare-const c2 Int)
(declare-const c3 Int)
(declare-const ra Int)
(declare-const rb Int)
(declare-const rc Int)
(declare-const r1 Int)
(declare-const r2 Int)
(declare-const r3 Int)
(assert (>= a1 0))
(assert (>= a2 0))
(assert (>= a3 0))
(assert (>= b1 0))
(assert (>= b2 0))
(assert (>= b3 0))
(assert (>= c1 0))
(assert (>= c2 0))
(assert (>= c3 0))
(assert (<= a1 9))
(assert (<= a2 9))
(assert (<= a3 9))
(assert (<= b1 9))
(assert (<= b2 9))
(assert (<= b3 9))
(assert (<= c1 9))
(assert (<= c2 9))
(assert (<= c3 9))
(assert (= ra 38))
(assert (= rb 1))
(assert (= rc 27))
(assert (= r1 55))
(assert (= r2 72))
(assert (= r3 6))
(assert (= ra (- (* a1 a2) a3)))
(assert (= rb (- (- b1 b2) b3)))
(assert (= rc (* (* c1 c2) c3)))
(assert (= r1 (- (* a1 b1) c1)))
(assert (= r2 (* (+ a2 b2) c2)))
(assert (= r3 (- (+ a3 b3) c3)))
(check-sat)
(get-model)

我知道以下模型是唯一的,但我可以使用某些 Z3 选项或添加断言来确保这一点吗?

(model 
  (define-fun c3 () Int
    3)
  (define-fun c2 () Int
    9)
  (define-fun c1 () Int
    1)
  (define-fun b3 () Int
    5)
  (define-fun b2 () Int
    2)
  (define-fun b1 () Int
    8)
  (define-fun a3 () Int
    4)
  (define-fun a2 () Int
    6)
  (define-fun a1 () Int
    7)
  (define-fun r3 () Int
    6)
  (define-fun r2 () Int
    72)
  (define-fun r1 () Int
    55)
  (define-fun rc () Int
    27)
  (define-fun rb () Int
    1)
  (define-fun ra () Int
    38)
)

为了澄清起见,我通过 JAVA API 使用 Z3


是的:这个想法是断言找到的模型分配的值是唯一可能的分配,因此它是唯一的。这可以通过添加一个断言来完成,该断言声明所有常量不等于其分配的模型值。

对于您的示例,这将是:

(assert (not (and
  (= c3 3)
  (= c2 9)
  (= c1 1)
  (= b3 5)
  (= b2 2)
  (= b1 8)
  (= a3 4)
  (= a2 6)
  (= a1 7)
  (= r3 6)
  (= r2 72)
  (= r1 55)
  (= rc 27)
  (= rb 1)
  (= ra 38))))
(check-sat) ; unsat => no other model exists

如果您尝试更改任何值(例如,将 c3 = 3 更改为 c3 = 4),这将再次变得令人满意。这是完整示例的rise@fun 链接:http://rise4fun.com/Z3/nD5n http://rise4fun.com/Z3/nD5n

有关如何使用 API 以编程方式执行此操作的更多详细信息,请参阅以下问题和解答:

Z3:找到所有满意的模型 https://stackoverflow.com/questions/13395391/z3-finding-all-satisfying-models

(Z3Py) 检查方程的所有解 https://stackoverflow.com/questions/11867611/z3py-checking-all-solutions-for-equation

请注意,根据第二个链接答案中的注释,您不能仅使用 SMT-lib 前端以编程方式执行此操作,如果您想自动化此过程,则必须使用 API 来遍历找到的模型。

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

Z3:检查模型是否唯一 的相关文章

随机推荐

  • 如何关闭MIPS-GCC自动指令重排序?

    继这个问题之后 使用跳转 和链接 指令的奇怪 MIPS 汇编器行为 https stackoverflow com questions 3807480 weird mips assembler behavior with jump and
  • 使用 jQuery 在 AngularJS 元素指令上绑定事件

    我在 AngularJS 中有一个指令 module angular module demoApp null module directive sample function return restrict E transclude tru
  • 吃豆人:眼睛是如何找到回到怪物洞的路的?

    我在 吃豆人 中发现了很多关于鬼魂人工智能的参考 但没有提到在鬼魂被吃豆人吃掉后 眼睛如何找到回到中央鬼洞的路 在我的实现中 我实现了一个简单但糟糕的解决方案 我只是在每个角落都硬编码了应该采取的方向 有更好 或最好的解决方案吗 也许是一个
  • C#/.NET 分析器应具有哪些功能?

    这可能是一则边缘广告 更不用说主观了 但这个问题是诚实的 在过去的两个月里 我一直在为 NET 开发一个新的开源分析器 称为 SlimTune Profiler http code google com p slimtune http co
  • SwiftUI 是否可以调用该函数并从其他页面更改视图?

    这是我的代码 struct FirstPage View var body some View VStack NavigationView VStack Text First Page bold NavigationLink destina
  • Node.js 异步等待 - 错误 regeneratorRuntime

    我学习了如何在浏览器中使用 Promise 但是当我想在 Node js 中使用它时 它会抛出错误 var ref asyncToGenerator PURE regeneratorRuntime mark function callee
  • 将 CVPixelBuffer 渲染到 NSView (macOS)

    我有一个CVPixelBuffer我正在尝试在屏幕上有效地绘制 转变为低效率的方式NSImage可以工作 但速度非常慢 丢掉了大约 40 的帧数 因此 我尝试使用将其渲染在屏幕上CIContext s drawImage inRect fr
  • 使用 SharedSizeGroup 测量/排列网格

    两个包含以某种方式指定的元素的网格和 SharedSizeGroup 似乎存在一些问题 这个问题是为了回答先前的问题 https stackoverflow com questions 3865033 grid height not adj
  • Visual Studio 调试器在混合调试模式下停止命中断点

    我在 MSVC2013 中混合调试时遇到严重问题 从本机 C DLL 调用 COM 方法后 调试器不再在断点处停止 代码结构 上图展示了代码的整体结构 我有一个解决方案 其中包含大约 10 个 C 项目 大约 50 个 C 本机项目和一个
  • Android Studio、OpenCV、C++、jni、NDK - 无法配置?

    我正在尝试使用 jni 和 Android Studio NDK 在 Android Studio 中进行 OpenCV C 调用 这些是我一直在工作的参考资料 https github com opencv opencv tree mas
  • Kubernetes 应用服务但端点没有

    当我尝试将服务应用于 pod 时 端点始终为 none 有人可以知道任何根本原因吗 我还检查选择器是否与deployment yaml 中定义的内容匹配 下面是我使用的部署 服务文件 我还附上了服务描述 部署 yaml apiVersion
  • 如何避免在 git-add 时指定绝对文件路径

    Using git add一旦文件路径变得很长 命令就会变得乏味 例如git add src test com abc product server datasource manager aats DSManger java是否可以绕过指定
  • 将参数从 .aspx.cs 传递到 .ashx

    我想将字符串传递到 ashx 页面 通常我会通过在 aspx 页面中设置参数来完成此操作 例如 Loader TreeLoader ashx passedVariable hello 但我想在 aspx cs 端以编程方式执行此操作 因为该
  • 引导程序中导航和巨型屏幕之间的差距

    对于我的一生 我无法确定我的导航和大屏幕之间的空白来自哪里 我已经玩过很多变量 但无法让它消失 我在这里做了一个cssdeckhttp cssdeck com labs u6ws0ozl http cssdeck com labs u6ws
  • 用于屏幕文本的 OCR(光学字符识别)

    我正在尝试创建一个软件 通过捕获屏幕截图来自动化 PC 然后使用 OCR 光学字符识别 来查找要单击的特定按钮 例如 我已经有了鼠标和键盘控制部分 但现在 我需要 OCR 来处理屏幕截图 我发现 Tesseract OCR 似乎不能很好地处
  • 为什么 Django 中的 Google-Auth(Google Identity) 弹出窗口空白?

    我的 Google 身份验证卡在弹出身份验证流程中 一键式身份验证工作正常 但按钮不行 div div 我点击它 弹出窗口打开 但它仍然空白 没有任何进展
  • SDWebImage 在 swift 中崩溃

    看来如果我在已完成的块中使用 self 它就会崩溃 self imageView sd setImageWithURL MYIMAGEURL placeholderImage nil options SDWebImageOptions Re
  • 如何让主键从1000开始?

    create table tablename id integer unsigned not null AUTO INCREMENT primary key id 我需要主键从1000开始 我正在使用MySQL 如果您的表已经创建为自动增量
  • 左特征向量在 scipy 中没有给出正确的(马尔可夫)平稳概率

    给定以下马尔可夫矩阵 import numpy scipy linalg A numpy array 0 9 0 1 0 15 0 85 平稳概率存在且等于 6 4 通过取矩阵的大幂可以很容易地验证这一点 B A copy for in x
  • Z3:检查模型是否唯一

    Z3 有没有办法证明 表明给定模型是唯一的并且不存在其他解决方案 一个小例子来演示 declare const a1 Int declare const a2 Int declare const a3 Int declare const b