如何向Dafny添加功能?

时间:2018-04-03 16:56:06

标签: dafny

我想为Dafny添加一些基本的便利功能,例如在Dafny中定义set union的功能(参见this question)。但是,Dafny的内部似乎没有很好的记录,我不知道从哪里开始。

如何添加此功能?

1 个答案:

答案 0 :(得分:4)

这是一个很好的问题。我不确定为什么会被投票。谢谢你的询问。我希望当我开始进入Dafny时,我更清楚地知道在哪里寻找有关其内部的信息。

Rustan有许多关于如何使用 Dafny的教程/论文/示例。 (事实上​​,我会说我们在这里因为财富的尴尬而遭受轻微的痛苦,因为近十年来有这么多的资源,很难知道从哪里开始。但那是另一天的故事。 )此外,Dafny是一个活生生的项目:事情发生了变化,因此有些文件已经过时了。你应该为此做好准备,并且总是愿意打开一个新文件并在现代Dafny中尝试。

所有这一切,关于Dafny的 internals 的资源相对较少。最好的方法是确保你对Dafny背后的理论有一个透彻的理解,然后阅读代码。 (它非常好!)这里有一些具体的指示。

  • The Dafny Reference Manual本质上是对Dafny的输入语法的注释描述。它是大约两年前的最后一次编辑,所以有些东西已经过时了,但它仍然是一个非常有用的Dafny功能列表。 (如果您发现缺少特定的内容,请提交github问题,我们会尝试修复它们。)我建议您阅读封面封面。

  • 查看Rustan的summer school course,其中提供了Dafny和Boogie的理论演示。另请查看关于Spec#的earlier summer school course,其中包含许多相同的想法,但步调更为悠闲。

  • 学习在Boogie中编程。

    • 从(10岁,但仍然是90%准确)手册This is Boogie 2开始。相比之下,深刻理解Boogie会帮助你看到Dafny带来的东西。

    • 请Dafny将一些示例翻译成Boogie(使用命令行选项/print:foo.bpl),并阅读生成的Boogie代码。

    • 阅读Boogie test suite以查看更多示例。从textbook directory开始。忽略有趣名称的目录。

    • 还可以查看Boogie比您更期望的类型系统this paper。 (它超越了Hindley-Milner多态性!)

  • 至少了解一下Z3。

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

    • 请Boogie为您(使用命令行选项/proverLog:foo.smt2)将一些(小)示例转换为Z3,并读取生成的Z3代码。这非常困难,但值得一两次进行自己的启发。它在调试过程中偶尔也会有用。

  • 深入研究Dafny test suite

    • 阅读测试。测试套件中有很多测试,在许多情况下,这是查看某个功能的真实,实时,实际示例的唯一地方。如果测试套件中没有显示功能,请提交Github问题,我们会尝试处理它。

    • 学习如何运行测试,以便测试您对Dafny的改进是否会破坏现有程序。 (基本的想法是install lit testing tool并将其指向Test目录。)

  • 阅读代码。

    • 总的来说,它的代码令人耳目一新。高级结构未被记录,但低级结构通常被记录和/或清楚。因此,您的工作就是重建高层结构。首先要了解Dafny的不同阶段 - 解析,"解决" /类型检查,转换到Boogie进行验证,编译到C#以便执行。
    • 这里是命令行工具的main()。追踪并找到阶段并阅读您感兴趣的阶段。
  • 提出问题。不幸的是,对于Dafny的内部问题,没有具体的详细问题。 Stack Overflow是不合适的; Github也不是。也许最好的差距就是提交文件"请求提供文件"关于Github的问题,我们将看到我们能做些什么。

我希望Rustan可能会在我错过的事情中插话。

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

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