在 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 强制执行它是件好事。 (如果你不想要这个,很容易拿出来。)
我一直在查看一些 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 强制执行它是件好事。 (如果你不想要这个,很容易拿出来。)