铸造类型在coq

时间:2016-10-14 00:28:53

标签: coq coq-tactic compcert

我有定义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_def2类似的另一个定义my_def1,并添加proj_bytes vl总是返回Some bl的公理,所以:

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

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

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

以下是memval的定义:

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

1 个答案:

答案 0 :(得分:2)

你有两种方法,让我们先做一些预赛:

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.

然而,上述方法都不会给你一个证据的巨大进步,因此真正的问题是你最初的目的是什么。