在 Dafny 中读取(写入)文件

Reading from (Writing to) files in Dafny

我一直在查看一些 dafny 教程,但找不到如何读取(或写入)简单的文本文件。当然,这一定是可能的吧?

我根据 Ironfleet project.

中的代码为 Dafny 编写了一个非常基本的文件 IO 库

该库由两个文件组成:一个实现它们的 Dafny 文件 fileio.dfy declaring signatures for various file operations, and a C# file fileionative.cs

例如,here 是一个简单的 Dafny 程序,它将字符串 hello world! 写入当前目录中的文件 foo.txt

要编译,将所有三个文件放在同一个目录中,然后 运行:

dafny fileiotest.dfy fileionative.cs

应该打印类似

的内容
Dafny 2.1.1.10209

Dafny program verifier finished with 4 verified, 0 errors
Compiled program written to fileiotest.cs
Compiled assembly into fileiotest.exe

然后你可以 运行 程序(我使用 mono 因为我在 unix 上):

mono fileiotest.exe

成功时应该打印 done

终于可以查看文件内容了foo.txt!它应该说 hello world!


一些最后的笔记。

首先,fileio.dfy 中的操作规范非常薄弱。我还没有为磁盘上的内容定义任何类型的逻辑模型,因此您无法证明 "if I read the file I just wrote, I get back the same data" 之类的东西。 (事实上​​ ,除非对机器上的其他进程等进行额外假设,否则这些事情是不正确的。)如果您有兴趣尝试证明这些事情,请告诉我,我可以提供进一步的帮助。

其次,签名 do 给你的一件事是强制错误处理。所有操作 return 一个布尔值,表示它们是否失败,除非您知道所有操作都已成功,否则规范基本上什么也不会告诉您。如果这对您来说是一个合理的编程规则,那么让 Dafny 强制执行它是件好事。 (如果你不想要这个,很容易拿出来。)