我正在进行提取转换nat
到big_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
我在第n
行else 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}}函数吗?非常感谢你。
答案 0 :(得分:3)
(-)
保留给整数运算,您不能对big_int
使用相同的运算符。替换
(n - one)
by:
Big_int.sub_big_int n one