Io 通过ynot在Coq中归档I/O
是否有人有一个小的工作代码片段来从Coq中的文件读取字符串(ynot库似乎可以做到这一点,但我无法理解) Ynot可在此处找到: 该发行版在示例中包含一个IO目录,其中包括定义如下内容的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
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.
现在,在没有意识到的情况下尝试提取