如何从coq

时间:2018-04-10 06:05:05

标签: coq

这可能是一个奇怪的问题,因为Coq应该是纯函数式的语言,但是Extraction存在并且它显然有副作用,所以我假设可能有一个更基本的命令来输出字符串或文件的常量,如下所示:

Extraction "file.txt" "hello"%string.

这可能吗?是否需要编写自定义提取器(我甚至不知道这是否可行)?

这个问题的实际原因与Coq中已经存在的提取机制的动机有关,但是假设我想输出C代码或其他当前不支持的代码。我仍然可以在Coq extract : Expr -> string中编写一个函数来获取我在归纳类型Expr中形式化的自定义语法。如何将此字符串输出到文件?

1 个答案:

答案 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来实现。