令人惊讶的是,达夫尼未能验证集合理解的有界性

2023-12-02

Dafny 对于集合交集函数的定义没有任何问题。

function method intersection(A: set<int>, B: set<int>): (r: set<int>)
{
    set x | x in A && x in B
}

但当谈到并集时,达夫尼抱怨道,“集合理解必须产生有限集,但达夫尼的启发式方法无法弄清楚如何产生‘x’的有界值集”。 A 和 B 是有限的,因此,显然并集也是有限的。

function method union(A: set<int>, B: set<int>): (r: set<int>)
{
    set x | x in A || x in B
}

对于初学者来说,如何解释这种看似不一致的行为?


这确实可能令人惊讶!

首先,让我注意到,在实践中,Dafny 有内置的交集和并集运算符,它知道这些运算符保留了有限性。因此,您不需要使用集合推导式来表达这些想法。相反你可以说A * B and A + B分别。

然而,我的猜测是,您遇到了一个更复杂的示例,其中您使用了带有析取的集合理解,并且对为什么 Dafny 无法证明它是有限的感到困惑。

Dafny 使用句法启发式来确定集合推导式是否是有限的。不幸的是,这些启发式方法在任何地方都没有得到很好的记录。就这个问题而言,关键点是启发式要么依赖于推导式的绑定变量的类型,要么寻找以其他方式约束元素的合取。例如,达夫尼可以证明

set x: int | 0 <= x < 10 && ...

有限的,以及

set x:A | x in S && ...

在这两种情况下,相关界限必须是连词。达夫尼没有语法启发法来证明析取的界限,尽管人们可以想象添加一个。这就是为什么达夫尼无法证明你的union函数有限。

顺便说一句,另一种解决方法是使用潜在的无限集(写成iset在达夫尼)。如果您不需要使用集合的基数,那么这些可能会更好。

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

令人惊讶的是,达夫尼未能验证集合理解的有界性 的相关文章

  • 指向其声明范围之外的局部变量的指针

    假设我有一个代表 PDF 文档的结构pdf以及代表其中一页的结构pdf page typedef struct pdf page int page no pdf page next page char content pdf page ty
  • 炸弹实验室阶段_4

    Dump of assembler code for function func4 lt 0 gt mov rbx 0x18 rsp lt 5 gt mov rbp 0x10 rsp lt 10 gt mov r12 0x8 rsp lt
  • JavaScript 中的 Django FOR 循环

    首先 我是编程新手 我正在尝试制作一个嵌入了 Google 地图的网页 在该地图中您可以看到一条设置路径的彩色线 为此 我使用 Django 在我的views py 中 我有一个名为points 的变量 其中我将一些坐标作为字符串写入列表中
  • AsycTask 抛出 IllegalStateException - 片段未附加到 Activity

    我的 Android 应用程序中有以下 AsyncTask 此 AsyncTask 包含在扩展 PreferenceFragment 的类的 OnCreate 方法中 public class NotificationsPreference
  • 从 PHP 中的图像 url 中删除解析字符串

    我有以下图像网址 http www example org wp content blogs dir 29 files 2013 02 Personalized Results Asterisk 600x417 png 这里的 url 包含
  • 通过 Opencv 混合两个图像

    我想使用Opencv对齐两个不同尺寸的图像 事实上 函数 cvAddWeighted 使我们能够组合或混合两个图像 尺寸相同 但不是我的情况 所以如果有人知道如何实现这个功能 我需要帮助 考虑图像的不同尺寸 谢谢 y m First che
  • 将 NULL 从 PHP 传递到 MySQL 以进行自动增量

    所以我在 MySQL 中设置了一个包含三列的数据库 第一列是 idnum 它自动递增用户 ID 号 第二个和第三个分别是名字和姓氏 我的问题是 当我通过 PHP 文件中的查询字符串将名称发送到数据库时 我收到了几个不同的错误 当我发送查询时
  • 使用 TypeScript 接口中的字符串枚举值作为计算属性键

    我想定义一个函数根据我给出的键返回不同类型的对象 这基本上就像这里使用的技巧createElement功能 https github com Microsoft TypeScript blob master lib lib dom d ts
  • 用于查找表中代表性行的 SQL 查询

    假设我有一个像这样的付款表 CREATE TABLE Payments PaymentID INT CustomerID INT Value INT PaidOn DATE INSERT INTO Payments VALUES 1 1 5

随机推荐