如何向 Dafny 添加功能?

How can I add a feature to Dafny?

我想为 Dafny 添加一些基本的便利功能,例如在 Dafny 中定义集合并集的能力(参见 )。但是 Dafny 的内部结构似乎没有很好的文档记录,我不知道从哪里开始。

如何添加这样的功能?

这是一个很好的问题。我不确定为什么它被否决了。谢谢你的提问。我希望我在开始接触 Dafny 时就知道在哪里可以找到有关其内部结构的信息。

Rustan 有很多关于如何使用 Dafny 的tutorials/papers/examples。 (事实上​​ ,我想说我们在这里略微遭受了财富的尴尬,因为近十年来分布着如此多的资源,以至于很难知道从哪里开始。但这是另一天的故事。)另外, Dafny 是一个活生生的项目:事情会发生变化,因此一些文件已经过时了。你应该为此做好准备,并始终愿意打开一个新文件并在现代 Dafny 中尝试一些东西。

总而言之,关于 Dafny 的 internals 的资源相对较少。最好的继续进行的方法是确保您对 Dafny 背后的理论有透彻的理解,然后只阅读代码。 (相当不错!)具体指点一下。

  • The Dafny Reference Manual 本质上是 Dafny 输入语法的注释描述。它最后一次认真编辑是在大约两年前,所以有些东西已经过时了,但作为 Dafny 功能的最详尽列表,它仍然是无价的。 (如果您发现缺少特定内容,请提交 github 问题,我们会尽力修复它们。)我建议阅读它 cover-to-cover。

  • 在 Spec# 上查看 Rustan 的 summer school course that give a theoretical presentation of Dafny and Boogie. Also check out this earlier summer school course,其中包含许多相同的想法,但速度更慢。

  • 学习在 Boogie 中编程。

    • 从(已有 10 年历史,但准确率仍为 90%)手册开始 This is Boogie 2。通过比较,深入了解 Boogie 将帮助您了解 Dafny 为 table 带来的影响。

    • 让 Dafny 为您翻译一些示例到 Boogie(使用 command-line 选项 /print:foo.bpl),并阅读生成的 Boogie 代码。

    • 阅读Boogie test suite to see more examples. Start with the textbook directory。忽略具有有趣名称的目录。

    • 另请查看 Boogie 的 more-sophisticated-than-you-might-expect 类型系统上的 this paper。 (它超越了 Hindley-Milner 多态性!)

  • 至少了解一点 Z3。

    • 特别关注它如何使用触发器来处理量词。 Dafny-level 触发器视图的一个很好的介绍是论文 Trigger Selection Strategies to Stabalize Automatic Program Verifiers.

    • 请 Boogie 为您翻译一些(小的)示例到 Z3(使用 command-line 选项 /proverLog:foo.smt2),并阅读生成的 Z3 代码。这很辛苦,但为了自己的熏陶,做一两次还是值得的。它在调试过程中偶尔也会有帮助。

  • 深入研究Dafny test suite

    • 阅读测试。测试套件中有很多测试,在许多情况下,这是唯一可以看到某些功能的真实、实时、工作示例的地方。如果有测试套件中未显示的功能,请提交 Github 问题,我们会尽力解决。

    • 学习 运行 测试,这样您就可以测试您对 Dafny 的改进是否会破坏现有程序。 (基本思路是install the lit testing tool指向Test目录。)

  • 阅读代码。

    • 总的来说,这是令人耳目一新的好代码。 high-level 结构的文档不足,但 low-level 结构通常被记录 and/or 清楚。因此,您的工作是重建 high-level 结构。首先了解 Dafny 的不同阶段——解析、"resolution"/类型检查、转换为 Boogie 以供验证、编译为 C# 以供执行。
    • 这是 command-line 工具的 main()。追踪并找到阶段并阅读您感兴趣的阶段。
  • 提问。不幸的是,没有关于达夫尼内部结构的具体、详细问题的好地方。 Stack Overflow 不合适; Github 也不是。也许最好的 stop-gap 是在 Github 上提交 "request for documentation" 问题,我们将看看我们能做些什么。

如果我遗漏了什么,我希望 Rustan 能插话。

祝你好运,用 Rustan 的话来说:安全编程!


This page(向下滚动到 "Dafny")还链接到更多关于 Dafny 的论文,您可能会感兴趣。