从Dafny中读取(写入)文件

时间:2018-09-16 04:19:35

标签: file io dafny

我一直在看一些dafny教程,但是找不到如何读取(或写入)简单文本文件的方法。当然,这必须可行吗?

3 个答案:

答案 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 程序中使用的读取字符串吗?