这可能是一个奇怪的问题,因为Coq应该是纯函数式的语言,但是Extraction
存在并且它显然有副作用,所以我假设可能有一个更基本的命令来输出字符串或文件的常量,如下所示:
Extraction "file.txt" "hello"%string.
这可能吗?是否需要编写自定义提取器(我甚至不知道这是否可行)?
这个问题的实际原因与Coq中已经存在的提取机制的动机有关,但是假设我想输出C代码或其他当前不支持的代码。我仍然可以在Coq extract : Expr -> string
中编写一个函数来获取我在归纳类型Expr
中形式化的自定义语法。如何将此字符串输出到文件?
答案 0 :(得分:3)
您可以Redirect
使用Eval
来关闭:
Require Import String.
Open Scope string_scope.
Redirect "file.txt" Eval compute in "hello".
(* file.txt.out now contains:
= "hello"
: string
*)
或者,在Coq中编写函数extract
,然后使用提取机制为感兴趣的extract e
提取e
,最后编写一个导入此函数的OCaml程序(字符串)不变并打印出来。采用这种方法的原因是在Coq中构建字符串非常慢,以至于您可能无法运行Eval compute extract e
,但您可以在OCaml中运行它。您也可以(以未经验证的方式)用OCaml本地字符串替换Coq字符串,这样这个过程实际上是有效的;这很容易通过在提取前在Coq中导入ExtrOcamlString
来实现。