OCaml字符串和Coq字符串(从Coq提取到OCaml)

时间:2014-09-02 03:03:31

标签: ocaml coq coq-extraction

我使用了从Coq到OCaml的提取,我在其中输入了ZNpositive

我不会在OCaml的int中提取它。

然后我提取的类型是:

type positive =
| Coq_xI of positive
| Coq_xO of positive
| Coq_xH

type coq_N =
| N0
| Npos of positive

type coq_Z =
| Z0
| Zpos of positive
| Zneg of positive

我在OCaml中有一个程序,其中一些函数使用OCaml类型string

在我的OCaml程序中,我需要编写一些转换类型的函数:string -> coq_Nstring -> coq_Zstring -> positive

我尝试在Coq中编写函数,然后使用提取来获取OCaml类型,但Coq string与OCaml string不同。

例如:

open Ascii
open BinNums
open Datatypes

type string =
| EmptyString
| String of ascii * string

let string_of_coqN (s: string): coq_N =
  match s with
    | EmptyString -> N0
    | String (a, _) -> (coq_N_of_ascii a);;

其中coq_N_of_ascii是从coq函数N_of_ascii中提取的。

当我应用函数string_of_coqN时,例如:

let test (x: string) = string_of_N x;;

我得到了抱怨

Error: This expression has type string but an expression was expected of type
         String0.string

您能否帮我找一种编写转换函数的方法:string -> coq_Nstring -> coq_Zstring -> positive

1 个答案:

答案 0 :(得分:3)

对于字符串,最简单的方法是在提取文件中导入标准库模块ExtrOcamlString,这将导致Coq在OCaml中将它们提取为char list。然后,您可以使用自定义代码在char list和本地string之间进行转换。请查看CompCert分布中的文件lib/Camlcoq.v,函数camlstring_of_coqstringcoqstring_of_camlstring