错误:无法强制到coq中的可计算引用

错误:无法强制到coq中的可计算引用,coq,compcert,Coq,Compcert,我正在尝试展开Mem.load,但出现错误: 错误:无法将Mem.load强制为可计算引用 我编写了与load1完全相同的Mem.load定义,并且是可展开的 Require Import compcert.common.AST. Require Import compcert.common.Memory. Require Import compcert.common.Values. Require Import compcert.lib.Coqlib. Require Import compc

我正在尝试展开Mem.load,但出现错误:

错误:无法将
Mem.load
强制为可计算引用

我编写了与
load1
完全相同的
Mem.load
定义,并且是可展开的

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.

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

Global Opaque Mem.alloc Mem.free Mem.store Mem.load Mem.storebytes Mem.loadbytes.
这意味着它不能展开

在尝试
展开Mem.load
之前,只需说它是
透明的
,然后一切都会工作:

Transparent Mem.load.
unfold Mem.load.

我想说,我确信
Mem.load
是可以展开的,这是有充分理由的,因此OP应该重新考虑他们最初的策略。