2016-10-14 11 views
0

での評価の基準に強制することはできません私はMem.loadを展開しようとしていると私はエラーを取得する:エラー:のCoQ

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

私はload1としてMem.loadのまったく同じDefinitionを書き、展開可能です。これは、それがunfold EDになることができないことを意味

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

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を含むいくつかの名前を定義します。 unfold Mem.loadしようとする前に

だけで、すべてが動作します後、それは、Transparentであると言う:

Transparent Mem.load. 
unfold Mem.load. 
+2

私は、私は 'Mem.load'は、正当な理由のために展開可能であると確信していることを言いたいですOPはむしろ元の戦略を再考すべきです。 – ejgallego

+0

完全に同意してください! ) –