首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >coq中的铸造类型

coq中的铸造类型
EN

Stack Overflow用户
提问于 2016-10-14 00:28:53
回答 1查看 713关注 0票数 1

我有my_def1的定义

代码语言:javascript
复制
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的公理,因此:

代码语言:javascript
复制
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 accepts list byte__]?

以下是memval的定义

代码语言:javascript
复制
Inductive memval : Type :=
  Undef : memval
 | Byte : byte -> memval
 | Fragment : val -> quantity -> nat -> memval
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-14 01:00:02

你有两种方法,让我们先做一些初步的准备:

代码语言:javascript
复制
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.

然后,您可以将您的公理定义为:

代码语言:javascript
复制
Axiom pb1 : forall vl , { v | proj_bytes vl = Some v }.

您破坏了这个公理,并用内部等式重写。然而,正如您所猜测的那样,这种方法有点不方便。

最好假装有一个默认值来破坏proj_bytes:

代码语言:javascript
复制
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.

然而,上述任何一种方法都不会给你很大的进步,因此真正的问题是你最初的目的是什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40033123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档