错误:无法强制转换为coq中的可评估引用

时间:2016-10-14 19:49:38

标签: coq compcert

我试图展开Mem.load并收到错误:

  

错误:无法将Mem.load强制转换为可评估的参考。

我写的Definition Mem.loadload1完全相同,并且是可展开的。

Require Import compcert.common.AST.
Require Import compcert.common.Memory.
Require Import compcert.common.Values.
Require Import compcert.lib.Coqlib.
Require Import compcert.lib.Maps.

Local Notation "a # b" := (PMap.get b a) (at level 1).

Definition load1 (chunk: memory_chunk) (m: mem) (b: block) (ofs: Z): option val :=
  if Mem.valid_access_dec m chunk b ofs Readable
  then Some(decode_val chunk (Mem.getN (size_chunk_nat chunk) ofs (m.(Mem.mem_contents)#b)))
  else None.

Lemma mem_load_eq: forall (c : memory_chunk) (m : mem) (b : block) (ofs : Z),
(load1 c m b ofs) = (Mem.load c m b ofs).
Proof.
  intros.
  unfold load1.
  unfold Mem.load. (*I get error here when unfolding *)
Admitted.

1 个答案:

答案 0 :(得分:1)

compcert.common.Memory模块定义了几个名称,包括Mem.load是不透明的:

Global Opaque Mem.alloc Mem.free Mem.store Mem.load Mem.storebytes Mem.loadbytes.

这意味着它不能unfold

在尝试unfold Mem.load之前,只要说它是Transparent,之后一切都会有效:

Transparent Mem.load.
unfold Mem.load.