在Coq
中,从nat
类型到int
或big_int
的提取未经过认证(效率很高)。如下面这些链接:
http://coq.inria.fr/V8.3/stdlib/Coq.extraction.ExtrOcamlNatBigInt.html 和
http://coq.inria.fr/distrib/8.3/stdlib/Coq.extraction.ExtrOcamlNatInt.html
两人都说: 免责声明:尝试通过将nat提取到big_int来获得有效的认证程序并不一定是个好主意。请参阅ExtrOcamlNatInt.v中的注释
如果我有coq
种类型:nat
,Z, N
和positive
我应该选择ocaml
类型来获取我可以提取的类型一个经过认证(更安全)的程序(我可以忽略它的效率)?。
目前,我选择将所有这些内容提取到int
。然后在ocaml int
内部,我使用Int64
进行内部攻击(获取边界min_int
和max_int
,如果k < min_int
则min_int
,否则),对于Z
和positive
数字我检查:如果(i:int) < 0
然后返回类型非负int,如果i <= 0
那么它是positive
< / p>
答案 0 :(得分:1)
如果你不关心效率,你不应该尝试将Coq的类型绑定到Ocaml类型,只需按原样提取它们(归纳类型),你就会安全。但是,使用nat
(一元数)的计算将非常慢。例如:
Extraction nat.
(*
type nat =
| O
| S of nat
*)
提取Z
会更加冗长。