dafny 相应的 SMT 查询

dafny corresponding SMT queries

我正在尝试检查一个简单的循环程序,该程序在整数数组 中找到最大元素。这是永久链接 here。一切正常,但我真的很感兴趣 生成的 SMT 文件,所以我使用以下方法提取它:

$ dafny /compile:3 /proverLog:./mySMT.smt myCode.dfy

然后运行和z3如下:

$ z3 ./mySMT.smt

我收到了 3 unsat 个回复,我想知道 对应的 3 个查询是什么? 我查看了 *.smt 文件,发现了 11K 的机器生成的 SMT。 关于解密 smt 文件的任何提示?谢谢!

如果您想要生成的 SMT 文件,那么 11K 文件就是您的答案。我想查看它会让您得出这样的结论,即您实际上不想查看生成的 SMT 文件。

所以,我不知道你想要完成什么。如果您想了解有关您的程序的更多信息,那么最好的方法是(仅)从 Dafny 程序文本开始工作。例如,您可以添加更多 assert 语句,本质上是询问验证者给定条件是否可在语句位置证明。

如果你对Dafny是如何对其验证条件进行编码感兴趣的(也就是说,如果你自己是一个工具开发者,想学习如何生成良好的验证条件),那么我建议你使用/print 开关生成 Dafny 生成的 Boogie 程序。对 Boogie 中间验证语言有一定了解后,Boogie 代码是可读的。有关如何将类 Dafny 语言编码为 Boogie 的更多教程,我推荐:

"Specification and verification of object-oriented software", K. Rustan M. Leino. Lecture note, Marktoberdorf 2008.

鲁斯坦

PS。除非您坚持特定格式,否则如果您首先将数组元素转换为序列,则无需使用循环即可打印数组元素:

print "a = ", a[..], "\n";