我使用了从Coq到OCaml的提取,我在其中输入了Z
,N
,positive
我不会在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_N
,string -> coq_Z
,string -> 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_N
,string -> coq_Z
和string -> positive
?
答案 0 :(得分:3)
对于字符串,最简单的方法是在提取文件中导入标准库模块ExtrOcamlString
,这将导致Coq在OCaml中将它们提取为char list
。然后,您可以使用自定义代码在char list
和本地string
之间进行转换。请查看CompCert分布中的文件lib/Camlcoq.v
,函数camlstring_of_coqstring
和coqstring_of_camlstring
。