我一直在看一些dafny教程,但是找不到如何读取(或写入)简单文本文件的方法。当然,这必须可行吗?
答案 0 :(得分:3)
我已经根据Ironfleet project中的代码为Dafny编写了一个非常基本的文件IO库。
该库由两个文件组成:一个Dafny文件fileio.dfy,用于声明各种文件操作的签名,以及一个实现它们的C#文件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
然后您可以运行该程序(由于我使用的是Unix,因此我使用mono
):
mono fileiotest.exe
,成功时应打印done
。
最后,您可以检查文件foo.txt
的内容!它应该说hello world!
一些最后的笔记。
首先,fileio.dfy
中的操作规范非常薄弱。我还没有为磁盘上的内容定义任何逻辑模型,因此您将无法证明诸如“如果我读了刚刚写的文件,我将获得相同的数据”。 (实际上,除非在有关机器上其他进程的其他假设下进行,否则这些事情是不正确的。)如果您有兴趣尝试证明这些事情,请告诉我,我可以进一步提供帮助。
第二,签名要做给您的一件事是强制错误处理。所有操作都会返回一个布尔值,说明操作是否失败,除非您知道所有操作都成功,否则规范基本上不会告诉您任何内容。如果这对您来说是一门合理的编程学科,那么最好由Dafny实施。 (如果您不想这样做,很容易取出。)
答案 1 :(得分:0)
我正在尝试在 Dafny 3.1.0 中使用这个 fileiotest.dfy。为此,我首先修复了 fileio.dfy 中 HostEnvironment 类缺少构造函数的问题,将其重写为:
class HostEnvironment
{
constructor{:axiom} () requires false
ghost var ok:OkState
}
fileio.dfy 和 fileiotest.dfy 在 Dafny 中都可以完美编译。 但是,当我尝试使用 fileionative.cs 进行组装时,出现以下错误:
PS C:\Users\jiplucap\Desktop\CTL_Models_and_Proofs\fileio> & "C:\Program Files\dotnet\dotnet.EXE" "c:\Users\jiplucap\.vscode\extensions\correctnesslab.dafny-vscode-1.6.0\out\resources\dafny\Dafny.dll" "c:\Users\jiplucap\Desktop\CTL_Models_and_Proofs\fileio\fileiotest.dfy" /verifyAllModules /compile:1 /spillTargetCode:1 /out:bin\fileiotest fileionative.cs
Dafny program verifier finished with 12 verified, 0 errors
Wrote textual form of target program to fileiotest.cs
Errors compiling program into fileiotest
(9,30): error CS0234: The type or namespace name 'IPEndPoint' does not exist in the namespace 'System.Net' (are you missing an assembly reference?)
(8,28): error CS0234: The type or namespace name 'Sockets' does not exist in the namespace 'System.Net' (are you missing an assembly reference?)
(1888,18): error CS0117: 'FileStream' does not contain a definition for 'Open'
(1900,23): error CS1061: 'FileStream' does not contain a definition for 'Write' and no accessible extension method 'Write' accepting a first argument of type 'FileStream' cam' could be found (are you missing a using directive or an assembly reference?)
我也尝试使用配置 /spillTargetCode:3,然后我得到了一个不同的错误。
请问,有没有办法(在 Dafny 3.1.0 中)组装 fileiotest.dfy 和 fileionative.cs 来生成 fileiote.exe?
答案 2 :(得分:0)
尝试使用 /r:System.Core.dll /r:System.dll /r:System 编译(使用 csc.exe)fileionative.cs 和 fileiotest.cs(后者由 Dafny 编译器生成)两个文件。 Collections.dll /r:System.Runtime.dll /r:System.Numerics.dll,引发了很多与不可访问性相关的错误,例如:
error CS0122: 'System.Collections.Immutable.ImmutableArray<T>' is inaccessible due to its protection level
error CS0053: Inconsistent accessibility: property type 'System.Collections.Immutable.ImmutableArray<T>' is less accessible than property
'Dafny.Sequence<T>.ImmutableElements'
和其他类似的。
请问,有人可以编写一个简单的 Dafny 程序,该程序使用外部 C# 系统方法(用于读取文件的本机代码)读取文本文件并返回要在 Dafny 程序中使用的读取字符串吗?