1

こんにちは、Coq から Ocaml への抽出を書いています。型を変換したいと思います。

positive --> int32
N -> int32

しかし、私はタイプを維持したいZですint

これらの条件を抽出するために私が行っているコードは次のとおりです。

Require Import ZArith NArith.
Require Import ExtrOcamlBasic.

(* Mapping of [positive], [N], [Z] into [int32]. *)
Extract Inductive positive => int32
[ "(fun p-> let two = Int32.add Int32.one Int32.one in
    Int32.add Int32.one (Int32.mul two p))"
  "(fun p->
    let two = Int32.add Int32.one Int32.one in Int32.mul two p)" "Int32.one" ]
  "(fun f2p1 f2p f1 p -> let two = Int32.add Int32.one Int32.one in
    if p <= Int32.one then f1 () else if Int32.rem p two = Int32.zero then
    f2p (Int32.div p two) else f2p1 (Int32.div p two))".

Extract Inductive N => int32 [ "Int32.zero" "" ]
"(fun f0 fp n -> if n=Int32.zero then f0 () else fp n)".

Extract Inductive Z => int [ "0" "" "(~-)" ]
"(fun f0 fp fn z -> if z=0 then f0 () else if z>0 then fp z else fn (-z))".

Coq のライブラリ ( BinInt.v )でZ -> int定義されているため、保持することはできません。Z

Inductive Z : Set :=
  | Z0 : Z
  | Zpos : positive -> Z
  | Zneg : positive -> Z.

エラーが発生しました: (function coq_Zdouble_plus_one)

ファイル「BinInt.ml」、38 行目、4 ~ 5 文字目:

エラー: この式は int 型ですが、式は int32 型である必要があります

BinInt.ml

open BinPos
open Datatypes

(** val coq_Z_rect :
    'a1 -> (int32 -> 'a1) -> (int32 -> 'a1) -> int -> 'a1 **)

let coq_Z_rect f f0 f1 z =
  (fun f0 fp fn z -> if z=0 then f0 () else if z>0 then fp z else fn (-z))
    (fun _ ->
    f)
    (fun x ->
    f0 x)
    (fun x ->
    f1 x)
    z

(** val coq_Z_rec : 'a1 -> (int32 -> 'a1) -> (int32 -> 'a1) -> int -> 'a1 **)

let coq_Z_rec f f0 f1 z =
  (fun f0 fp fn z -> if z=0 then f0 () else if z>0 then fp z else fn (-z))
    (fun _ ->
    f)
    (fun x ->
    f0 x)
    (fun x ->
    f1 x)
    z

(** val coq_Zdouble_plus_one : int -> int **)

let coq_Zdouble_plus_one x =
  (fun f0 fp fn z -> if z=0 then f0 () else if z>0 then fp z else fn (-z))
    (fun _ ->
    Int32.one)
    (fun p ->
    ((fun p-> let two = Int32.add Int32.one Int32.one in
    Int32.add Int32.one (Int32.mul two p))
    p))
    (fun p -> (~-)
    (coq_Pdouble_minus_one p))
    x

を抽出すればZ -> int32OKですが、私が望むものではありません。

4

1 に答える 1

1

あなたの問題は、それZが内部的に構築されていることpositiveです。

Inductive Z : Set := Z0 : Z
                   | Zpos : positive -> Z
                   | Zneg : positive -> Z
                   .

これは、 を取得するたびに、Z実際にはpositiveといくつかの追加情報を取得していることを意味します。

本当に と に異なる型を使用したい場合は、Zpositiveの間に変換関数を挿入する必要がintありint32ます。抽出機能を使えばできるかもしれませんが、それがどのように可能か、あるいは可能かどうかはわかりません。

私が目にするもう1つの問題は、 s の一致内のコードZpositives を処理することです。つまり、型間で常に変換が行われ、一方の型が他方よりも優れている可能性のある余分な精度が失われます。可能であれば、両方に同じタイプを使用します。

于 2012-05-03T14:23:15.377 に答える