断言和设置基数

2024-01-03

  • 为什么下面的断言会失败?
  • 另外,如果我取消评论,为什么所有断言都有效ASSERT 0(第 22 行)?
function CountFactors(i:nat): nat
  requires i >= 1;
{
  var a := set b | 1 <= b <= i && i % b == 0;
  |a|
}
function CountFactorsSet(i:nat): set<nat>
  requires i >= 1;
{
  var a := set b | 1 <= b <= i && i % b == 0;
  a
}
method CountFactorsMethod(i:nat) returns (a: set<nat>)
  requires i >= 1;
{
  a := set b | 1 <= b <= i && i % b == 0;
}
method Main()
{
  var r:= CountFactorsMethod(2);
  print(r);
  // assert CountFactorsSet(2) == {1, 2}; // ASSERT 0
  assert CountFactors(2) == 2; // ASSERT 1
}

这里是链接到代码 https://rise4fun.com/Dafny/Bp3j。我正在使用达夫尼 2.3.0.10506


在 Dafny 中使用集合(或映射或序列)时,这是一个非常常见的问题。这个问题归结为所谓的集合的“外延相等”。

在数学中,如果两个集合具有相同的元素,则它们相等。也就是说,(用伪 Dafny 语法):

A == B   <==>   (forall x :: x in A <==> x in B)

这为在两步中证明集合相等提供了非常强大的推理原理。取任意元素A并显示它在B,然后取任意元素B并显示它在A.

不幸的是,从自动推理的角度来看,这是一项相当昂贵的任务。如果达夫尼试图通过这条规则证明每一个集合都等于它能想到的所有其他集合,那就太慢了。

相反,达夫尼采用以下经验法则:

我,达夫尼,不会尝试通过外延性证明两个集合相等,除非你在程序中明确要求我断言它们相等。

这通过限制 Dafny 考虑证明彼此相等的集合数量来控制验证性能。

所以,当你assert CountFactorsSet(2) == {1, 2};你允许达夫尼对这个集合进行外延推理CountFactorsSet(2),事实证明这足以解决这个问题。


顺便说一句,在较大的程序中,如果你never重复一组理解两次。相反,始终将推导式包装在函数内,如下所示。

function CountFactorsSet(i:nat): set<nat>
  requires i >= 1;
{
  set b | 1 <= b <= i && i % b == 0
}
function CountFactors(i:nat): nat
  requires i >= 1;
{
  |CountFactorsSet(i)|
}

通过使用函数而不是直接使用推导式,您可以使 Dafny 的生活变得更加轻松,因为应用于相同参数的函数的两次出现是相等的,这变得“明显”,而对于 Dafny 来说,两个不同的语法出现并不“明显”相同的理解力是平等的。

事实证明,在你的例子中并不重要,但我只是想警告你,以防你计划更多地进行理解。

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

断言和设置基数 的相关文章

随机推荐

  • Angular rxjs Observable.interval() 无法在 Chrome 的后台选项卡上正确触发

    我正在编写带有通过 RxJs observables 实现的间隔计时器的 Angular2 应用程序 并且刚刚注意到当选项卡处于后台时 Chrome 浏览器中 Observable interval 和 Observable timer 的
  • 减少多维数组的维度

    我无法迭代这一系列产品信息 并获得每个项目的回显谷歌电子商务跟踪代码的所需结果 如何将维度减少一 简而言之 怎么转这个 Array array gt Array 0 gt Array product id gt 7 prod count g
  • 多GPU基本使用

    例如 我如何使用两个设备来改进 以下代码的性能 向量之和 是否可以 同时 使用更多设备 如果是 我如何管理向量在不同设备的全局内存上的分配 include
  • 如何使用 github api 获取原始分叉存储库?

    我想知道如何从我的分叉存储库中获取原始存储库 我在用https api github com users user repos type forks获取分叉存储库的列表 它返回叉子上的各种链接 但我找不到如何获取原始存储库 任何想法 注意
  • 我可以在 kotlin 中使用非短路逻辑运算符吗?

    val myBoolean false true 在 Kotlin 中给出编译错误 意外标记 使用 分隔同一行上的表达式 您正在寻找的 运算符 是中缀andKotlin 中的函数 参考页面 https kotlinlang org api
  • 将 ORM 合并到(半)SOA 架构中

    我正在探索 ORM 的产品 专注于 NHibernate 考虑所有选项 并且确信使用它可能会给我们的一些项目带来很大的好处 但是我很难想象它会如何发挥作用在我们的系统中 我的理解是 ORM 非常适合用于将数据库和业务逻辑粘合在一起 这假设业
  • Elasticsearch 中任意查询的“实际命中”(不仅仅是匹配文档)计数

    这真的让我很沮丧 我尝试寻找解决方案很长一段时间 但无论我在哪里尝试从提出相同问题的人那里找到问题 他们要么想要一些不同的东西 比如here https stackoverflow com questions 37734693 elasti
  • 如何使用选项卡更新滑动视图中的片段

    以下 我正在使用使用选项卡滑动视图 http developer android com training implementing navigation lateral html 到目前为止工作相当顺利 问题是 我有两个片段 选项卡 每个
  • 在node.js中获取上传的文件名/路径

    如何获取上传的文件名 路径的名称以在 Node js 中对其进行操作 我想将文件从临时文件夹移动到客户文件夹 Node JS 不会自动将上传的文件保存到磁盘 相反 您必须阅读并解析multipart form data通过以下方式满足自己r
  • 将 NASM 和 64 位 C 代码编译并链接到引导加载程序中 [重复]

    这个问题在这里已经有答案了 我制作了一个非常简单的一级引导加载程序 它执行两个主要操作 从 16 位实模式切换到 64 位长模式 并从硬盘读取接下来的几个用于启动基本内核的扇区 对于基本内核 我尝试用 C 而不是汇编编写代码 对此我有一些疑
  • Windows Metro 应用程序中没有 P2P?

    在 BUILD 的 NET 开发人员对 Windows 8 应用程序开发的看法 会议中 讲师提到 Metro 配置文件中仅公开了客户端 WCF 功能 我们无法创建服务器 http channel9 msdn com Events BUILD
  • 添加缓存到 Zend\Form\Annotation\AnnotationBuilder

    因为我终于找到了一个二进制文件memcache对于 Windows 上的 PHP 5 4 4 我正在加快我当前正在开发的应用程序的速度 我已经成功将 memcache 设置为 Doctrine ORM 映射缓存驱动程序 但我需要修复另一个泄
  • 标准化 Tensorflow 对象检测 API 的输入

    Tensorflow 对象检测 API 默认情况下是否会进行类似于输入标准化的预处理 我在任何地方都找不到任何有关它的文档 数据增强中有一个名为 NormalizeImage 的选项 在动物园模型的所有配置文件中 我从未看到它被使用过 下雨
  • 是否可以将文件组从一个数据库复制到另一个数据库?

    我想提取数据库的子集并复制到另一个服务器 数据库 是否可以从一个数据库复制 备份单个文件组并附加 恢复到另一个数据库 您无法将文件组恢复到不同的数据库中 任何还原操作都必须经历恢复阶段 此时针对还原的数据文件重播日志 并且新数据库将具有与还
  • 使用 Moq 模拟依赖属性

    如果我有一个类 它具有通过属性注入解决的依赖项 是否可以使用 Moq 来模拟该属性的行为 e g public class SomeClass empty constructor public SomeClass dependency pu
  • 字符串不变性。更改后是否必须将其重新分配给同一个变量?

    字符串是不可变的 这是否意味着我总是必须对传递给方法的字符串执行类似的操作 str str toLowerCase or is str toLowerCase 美好的 我尝试了第二个 但没有给我任何错误 为什么 字符串是不可变的 是的 你自
  • zend框架如何获取当前登录的用户详细信息

    我想获取在 zend 框架中登录我的网站的用户详细信息 您可以像这样获取存储在 Zend Auth 中的数据 identity Zend Auth getInstance gt getIdentity The identity变量现在应该包
  • 如何在 SwiftUI 中异步请求完成后调用函数?

    我有一个函数可以调用 2 种类型的 api 请求来获取我的应用程序中需要的一堆数据 在该函数中 我发出位置请求 然后对于响应中的每个位置 我发出不同的请求以获取该特定位置的详细信息 例如 如果请求 1 返回 20 个位置 则我的第二个请求将
  • 重写 BeanPropertyRowMapper 以支持 JodaTime DateTime

    我的域对象有几个 Joda TimeDateTime字段 当我使用 SimpleJdbcTemplate 读取数据库值时 病人病人 jdbc queryForObject sql new BeanPropertyRowMapper Pati
  • 断言和设置基数

    为什么下面的断言会失败 另外 如果我取消评论 为什么所有断言都有效ASSERT 0 第 22 行 function CountFactors i nat nat requires i gt 1 var a set b 1 lt b lt i