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 上述方法会给你的证明带来很大的进步,因此真正的问题是你最初的目的是什么。
我有定义 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 上述方法会给你的证明带来很大的进步,因此真正的问题是你最初的目的是什么。