Io 通过ynot在Coq中归档I/O

Io 通过ynot在Coq中归档I/O,io,coq,Io,Coq,是否有人有一个小的工作代码片段来从Coq中的文件读取字符串(ynot库似乎可以做到这一点,但我无法理解) Ynot可在此处找到: 该发行版在示例中包含一个IO目录,其中包括定义如下内容的FS.v: Fixpoint ReadFile (fm : fd_model) (ms : list mode) (fd : File fm ms) (str : string) {struct str} : Trace := match str with | EmptyString

是否有人有一个小的工作代码片段来从Coq中的文件读取字符串(ynot库似乎可以做到这一点,但我无法理解)

Ynot可在此处找到: 该发行版在示例中包含一个IO目录,其中包括定义如下内容的
FS.v

Fixpoint ReadFile (fm : fd_model) (ms : list mode) (fd : File fm ms) (str : string) {struct str} : Trace :=  
   match str with  
       | EmptyString => Read fd None :: nil  
       | String a b => (ReadFile fd b) ++ (Read fd (Some a) :: nil)  
   end.
Eval compute in ReadFile (File (FileModel "demo.txt") [R]).  
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
Error: The term "File (FileModel "demo.txt") [R]" has type "Set" while it is expected to have type "File ?16 ?17".
但我不知道如何调用它

我试过这样的方法:

Fixpoint ReadFile (fm : fd_model) (ms : list mode) (fd : File fm ms) (str : string) {struct str} : Trace :=  
   match str with  
       | EmptyString => Read fd None :: nil  
       | String a b => (ReadFile fd b) ++ (Read fd (Some a) :: nil)  
   end.
Eval compute in ReadFile (File (FileModel "demo.txt") [R]).  
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
Error: The term "File (FileModel "demo.txt") [R]" has type "Set" while it is expected to have type "File ?16 ?17".
类似地,Quark项目()使用替代机制定义了
VCRIO.v


任何帮助都将不胜感激

一般来说,您将无法直接在Coq内部执行文件I/O,原因很简单,即底层语言Gallina是纯粹的、全面的

特别是,您正在查看的函数
ReadFile
不是一个读取文件的函数,而是一个计算读取文件操作生成的跟踪的函数

在Quark(及其后续项目反射)中,我们绕过这一点的方法是对这些有效动作进行公理化,例如,请参见第323行中的公理化原语类型

因此,在Coq方面,我们使用这种一元有效类型进行推理,然后一旦代码被提取出来,这些公理就会用适当类型的OCaml函数实现,请参见这里 第111行

这显然增加了您的可信计算基础,因为您需要确保您的原语完全按照您公理化的方式执行,而不再执行其他操作


总而言之,我们无法在Gallina本身中执行有效的操作,因此我们将这些操作公理化,并且只能使用提取的OCaml代码来真正执行它们

我不知道有什么技术可以让你在Gallina中使用丰富的类型来实现这些功能。

对IO建模(通过公理化)并将其设置为提取(通过实现)与使用Haskell的FFI类似。但是,您将无法在校样中运行代码或使用解释器。您只能通过提取并编译它来运行它。但这仅仅是一个不便。想象一下,如果您这样定义
plus

Axiom plus : nat -> nat -> nat.
Infix "+" := plus.
Axiom plus_0 : forall n1, n1 + 0 = n1.
Axiom plus_S : forall n1 n2, n1 + (S n2) = S (n1 + n2).
Extract Constant plus => "(\ n1 n2 -> case n2 of
  O -> n1
  S n3 -> S (plus n1 n3))".
这不会是可执行的,但您仍然能够证明关于
plus
需要证明的一切。不过,证明条件会更大。例如,
eq\u refl
将不再是
2+2=4
的证明。此外,Coq将不再进行任何心智检查

对于“实现”部分,如果要提取到Haskell,请执行以下操作:

Axiom plus : nat -> nat -> nat.
Infix "+" := plus.
Axiom plus_0 : forall n1, n1 + 0 = n1.
Axiom plus_S : forall n1 n2, n1 + (S n2) = S (n1 + n2).
Extract Constant plus => "(\ n1 n2 -> case n2 of
  O -> n1
  S n3 -> S (plus n1 n3))".
然后你把它提取出来

Extraction Language Haskell.
Recursive Extraction plus.
现在,在没有意识到的情况下尝试提取