正确 Dafny 方法的 Z3 模型

2024-01-18

对于正确的方法,Z3能否找到该方法验证条件的模型?

我原以为不会,但这里有一个例子,该方法是正确的

但验证发现了一个模型。

这是 Dafny 1.9.7 的情况。


Malte 所说的是正确的(我发现它也得到了很好的解释)。

Dafny 是健全的,因为它只会验证正确的程序。换句话说,如果一个程序不正确,Dafny 验证者永远不会说它是正确的。然而,潜在的决策问题通常是不可判定的。因此,不可避免地会出现程序满足其规范而验证者仍然给出错误消息的情况。事实上,在这种情况下,验证者甚至可能会显示据称反例。它可能是一个错误的反例(如上例所示)——它只是意味着,据验证者所知,这是一个反例。如果验证者只是多花一点时间,或者足够聪明,展开更多函数定义,应用归纳假设,或者做许多其他好事,那么就有可能确定反例是假的。因此,您收到的任何错误消息(包括可能伴随此类错误消息的任何反例)都应解释为possible错误(和possible反例)。

如果您尝试验证循环的正确性并且没有提供足够强大的循环不变量,则经常会发生类似的情况。然后,Dafny 验证器可能会在进入循环时显示一些实际上永远不会出现的变量值。然后,反例试图让您了解如何适当地增强循环不变性。

最后,让我对马尔特所说的话补充两点。

首先,这个例子中至少还有另一个不完整性的来源,即非线性算术。有时可能很难导航。

二、函数的使用技巧Dummy可以简化。提及(至少在这个例子中)就足够了Pow调用,例如这样:

lemma EvenPowerLemma(a: int, b: nat)
  requires Even(b)
  ensures Pow(a, b) == Pow(a*a, b/2)
{
  if b != 0 {
    var dummy := Pow(a, b - 2);
  }
}

不过,我更喜欢其他两个手动证明,因为它们可以更好地向用户解释证明是什么。

Rustan

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

正确 Dafny 方法的 Z3 模型 的相关文章

  • 量词与非量词

    我有一个关于量词的问题 假设我有一个数组 我想计算该数组的数组索引 0 1 和 2 declare const cpuA Array Int Int assert or select cpuA 0 0 select cpuA 0 1 ass
  • SMT 中的混合理论

    我想构造一个 SMT 公式 其中包含对整数线性算术和布尔变量的多个断言 以及对实际非线性算术和布尔变量的一些断言 对整数和实数的断言仅共享布尔变量 例如 请考虑以下公式 declare fun b Bool assert b true de
  • 增量求解有什么好处?

    如果 pop 完全破坏了上下文 即学到的引理 增量约束求解使用 堆栈 的目的是什么 模式 理由 我想如果我只有 1 个约束 几个 合词 最好进行单个查询 而不是 将单独帧中的合取词堆叠到堆栈上 如果我 有超过 1 个约束并决定使用增量求解
  • 从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
  • 检索 Z3Py 中的值会产生意外结果

    我想找到一个表达式的最大间隔e对所有人来说都是如此x 编写这样的公式的方法应该是 Exists d ForAll x in d d e and ForAll x not in d d e 为了得到这样一个d 公式f在 Z3 中 看上面的 可
  • 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必须是一个完美的正方形 我不明白为什
  • Dafny 没有条件可以触发谓词

    我有以下用于 tic tac toe 游戏的 Dafny 代码片段 用于检查玩家 1 是否在棋盘上有获胜行 predicate isWinRowForPlayer1 board array2
  • 简化 CNF 公式,同时保留某些变量的所有解决方案

    有关的 CNF 简化 https stackoverflow com questions 23461191 cnf simplification 事实上 我认为这个问题的提交者可能是在追求我想要的东西 有许多工具可用于简化 或求解前 预处理
  • 跟踪 z3::optimize unsat_core

    如何正确追踪z3 optimize未饱和核心 Z3 C z3 optimize当我添加时没有找到预期的解决方案不饱和核心跟踪 基于这些examples https github com Z3Prover z3 blob 9df6c10ad8
  • 任意长度的通用位向量类型

    出于与此处描述相同的原因 用户定义的未解释函数 https stackoverflow com questions 7740556 equivalent of define fun in z3 api 我想定义我自己的未解释函数 bvred
  • 使用 Z3_solver_get_unsat_core 获取 unsat 核心

    假设这是非线性实数算术的约束集 例如 pred1 gt v2 x v0 x v1 y v0 y v2 y v0 y v1 x v0 x 0 pred2 gt v1 x v0 x v2 y v0 y v1 y v0 y v2 x v0 x 0
  • z3 中使用哪些技术来处理非线性整数实数问题?

    以下是 a 的 z3 统计数据problem http www ccs neu edu home jaideep example smt2在非线性整数实数片段中 我的许多问题与此类似 add rows 11062574 added eqs
  • Z3 将数组的默认值设置为零

    我正在尝试求解数组表达式的模型 其中数组的默认值等于 0 例如 我正在尝试解决这个例子 但我总是得到未知的结果 declare const arr Array Int Int declare const arr2 Array Int Int
  • 尝试在Python中使用Z3找到布尔公式的所有解决方案

    我是 Z3 的新手 正在尝试制作一个求解器 将每个可满足的解决方案返回到布尔公式 从其他 SO 帖子中记下笔记 我已经编写了我希望能起作用的代码 但事实并非如此 问题似乎是 通过添加以前的解决方案 我删除了一些变量 但它们又在后面的解决方案
  • 为什么 Dafny 不能验证某些简单设置的基数和关系命题?

    这是一个简单的 Dafny 程序 两行代码和三个断言 method Main var S set s int 0 lt s lt 50 2 s var T set t t in S t lt 25 assert S 50 does not
  • 为什么 Z3 在这个简单的输入上返回“未知”?

    这是输入 set option auto config false set option mbqi false declare sort T6 declare sort T7 declare fun set23 T7 T7 Bool ass
  • Z3 C API 在运行时更改超时

    是否可以使用 C API 在运行时更改求解器的超时值 为了设置超时 可以执行以下操作 Z3 config cfg Z3 mk config Z3 set param value cfg SOFT TIMEOUT 10000 set time
  • 如何获取 Z3 上下文的所有可用配置设置的列表?

    net API 具有以下 Context 构造函数 Context Dictionary lt string string gt settings 如何获取所有可能设置的列表 具体来说 我对如何要求 Z3 生成 unsat 核心感兴趣 即相
  • 如何使用 Z3 SMT-LIB 证明 Frobenius 代数中的定理

    我们在弗罗贝尼乌斯代数中证明以下定理 使用以下代码进行证明 Frobenius algebra object A mu eta delta epsilon declare sort A declare sort AA declare sor
  • 如何使用“存在”量词?

    Dafny 文档没有使用 存在 量词 method Main assert exists n int n gt 1 这会出现断言错误 以下作品 predicate dummy n int true method Main assert du

随机推荐