在将Coq提取到Ocaml时将nat转换为big_int

时间:2012-04-17 07:17:17

标签: ocaml coq coq-extraction

我正在进行提取转换natbig_int

当我使用库ExtrOcamlNatBigInt时,它不会在big_int

中为Ocaml返回正确的类型

所以我修改它(文件ExtrOcamlNatBigInt),但我找不到定义函数nat_case的方法,因为在Ocaml的libary Big_int中它们没有函数nat_case。 / p>

Extract Inductive nat => "Big_int.big_int"
  [ "Big_int.zero_big_int" "Big_int.succ_big_int" ] "Big_int.nat_case".

我尝试通过以下方式为nat_case定义第二个定义:

Extract Inductive nat => "Big_int.big_int"
  [ "Big_int.zero_big_int" "Big_int.succ_big_int" ] "(fun fO fS n ->
    let one = Big_int.unit_big_int in
    if n = Big_int.zero_big_int then fO () else fS (n - one))".

使用第二个定义后的结果如下:

(** val nat_rect :
    'a1 -> (Big_int.big_int -> 'a1 -> 'a1) -> Big_int.big_int -> 'a1 **)

let rec nat_rect f f0 n =
  let one = Big_int.unit_big_int in
    if n = Big_int.zero_big_int then f () else f0 (n - one)
    (fun _ ->
    f)
    (fun n0 ->
    f0 n0 (nat_rect f f0 n0)) n

我在第nelse f0 (n - one)处收到错误:

文件“Datatypes.ml”,第68行,字符51-52:错误:此表达式的类型为Big_int.big_int,但表达式的类型为int

我认为这是因为minus-

我还修改了minus提取:

Extract Constant minus => "fun n m -> Big_int.max_big_int Big_int.zero_big_int 
   (Big_int.sub_big_int n m)".

你能帮我定一下nat_case的{​​{1}}函数吗?非常感谢你。

1 个答案:

答案 0 :(得分:3)

(-)保留给整数运算,您不能对big_int使用相同的运算符。替换

(n - one)

by:

Big_int.sub_big_int n one