2016-10-14 26 views
0

我試圖展開Mem.load可評價的參考,我得到的錯誤:錯誤:無法強迫在COQ

Error: Cannot coerce Mem.load to an evaluable reference.

我寫的Mem.load完全相同的Definitionload1,是展開的。

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

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. 
+2

我想說,我敢肯定'Mem.load'是展開的一個很好的理由,所以OP應該重新考慮他們原來的策略。 – ejgallego

+0

完全同意! ) –