You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Coq的Z类型提取为Haskell的Integer类型?

Coq Z类型提取到Haskell Integer的可行方案

嘿,刚好我对Coq到Haskell的提取这块比较熟悉,给你梳理下解决方案:

首先,不需要额外找第三方库——Coq自带的提取机制就能直接把Z完美映射到Haskell原生的Integer类型(毕竟Haskell的Integer本身就是任意精度的,和Coq的Z特性完全匹配),不用像OCaml那样依赖外部bigint库。

完整的提取配置代码

你可以直接在Coq代码里加入以下Extract指令,完成类型和构造器的映射:

-- 映射Coq的positive类型到Haskell Integer
Extract Inductive positive => "Integer"
  [ "(2 * _ + 1)" "(2 * _)" "1" ]
  "(\x y z -> case x of { 1 -> z; n -> if even n then y (n `div` 2) else x ((n - 1) `div` 2) })".

-- 核心:映射Coq的Z类型到Haskell Integer
Extract Inductive Z => "Integer"
  [ "0" "" "negate" ]
  "(\x y z -> case x of { 0 -> x; n -> if n > 0 then y n else z (negate n) })".

-- 可选:把Coq的N类型也同步映射到Integer
Extract Inductive N => "Integer"
  [ "0" "(+1)" ]
  "(\x y -> case x of { 0 -> x; n -> y (n - 1) })".

代码说明

  • 对于Z的构造器:Z0对应Haskell的0,Zpos直接用空字符串""(因为正Integer不需要额外包装,直接用原值),Zneg对应Haskell的negate函数。
  • 最后的lambda表达式是对应Coq中case分析的Haskell实现,确保模式匹配能正确转换。

额外补充:提取常用Z运算

如果你的Coq代码里用到了Z的算术或比较操作,还可以加上这些提取指令,让生成的Haskell代码直接用原生Integer的运算:

Extract Constant Z.add => "(+)".
Extract Constant Z.mul => "(*)".
Extract Constant Z.sub => "(-)".
Extract Constant Z.eq => "(==)".
Extract Constant Z.lt => "(<)".
Extract Constant Z.le => "(<=)".

这样提取出来的Haskell代码既简洁又高效,完全符合Haskell的惯用写法。

内容的提问来源于stack exchange,提问作者Rafael Castro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:57:07