我想为Dafny添加一些基本的便利功能,例如在Dafny中定义set union的功能(参见this question)。但是,Dafny的内部似乎没有很好的记录,我不知道从哪里开始。
如何添加此功能?
答案 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
目录。)
阅读代码。
main()
。追踪并找到阶段并阅读您感兴趣的阶段。提出问题。不幸的是,对于Dafny的内部问题,没有具体的详细问题。 Stack Overflow是不合适的; Github也不是。也许最好的差距就是提交文件"请求提供文件"关于Github的问题,我们将看到我们能做些什么。
我希望Rustan可能会在我错过的事情中插话。
祝你好运,用Rustan的话来说:安全地编程!
This page(向下滚动到" Dafny")还链接到更多您可能感兴趣的Dafny论文。