coq 中的铸造类型

Casting types in coq

我有定义 my_def1:

Require Import compcert.common.Memory.
Require Import compcert.common.Values.
Require Import compcert.lib.Integers.  

Definition my_def1 (vl: list memval) : val :=
 match proj_bytes vl with
    | Some bl => Vint(Int.sign_ext 16 (Int.repr (decode_int bl)))
    | None => Vundef
 end.

我想写下另一个类似于 my_def1 的定义 my_def2,并添加一个 proj_bytes vl 总是 return Some bl 的公理,所以:

Definition my_def2 (vl: list memval) : val :=
   Vint(Int.sign_ext 16 (Int.repr (decode_int ((*?*)) )))
end.

我的问题是如何完成my_def2并写出关于proj_bytes vl的相关axiom

或者问题是如何从类型 list memval 转换为 list byte [decode_int 接受 list byte]?

这里是 memval 的定义:

Inductive memval : Type :=
  Undef : memval
 | Byte : byte -> memval
 | Fragment : val -> quantity -> nat -> memval

你有两种方法,我们先做一些准备工作:

Variable (memval byte : Type).
Variable (proj_bytes : list memval -> option byte).

Inductive val := Vundef | VInt : byte -> val.

Definition my_def1 (vl: list memval) : val :=
 match proj_bytes vl with
    | Some bl => VInt bl
    | None    => Vundef
 end.

那么,您可以将公理定义为:

Axiom pb1 : forall vl , { v | proj_bytes vl = Some v }.

你破坏这个公理并用内在等式重写。但是,您可以猜到,这种方法有点不方便。

最好假装有默认值去析构proj_bytes:

Variable (byte_def : byte).

Definition bsel vl :=
  match proj_bytes vl with
  | Some bl => bl
  | None    => byte_def
  end.

Definition my_def2 (vl: list memval) : val := VInt (bsel vl).

Lemma my_defP vl : my_def1 vl = my_def2 vl.
Proof.
now destruct (pb1 vl) as [b H]; unfold my_def1, my_def2, bsel; rewrite H.
Qed.

然而,none 上述方法会给你的证明带来很大的进步,因此真正的问题是你最初的目的是什么。