Ошибка: не удается принудительно перейти к оцениваемой ссылке в coq

#coq #compcert

#coq #compcert

Вопрос:

Я пытаюсь развернуть Mem.load и получаю сообщение об ошибке:

Ошибка: не удается принудительно Mem.load перейти к оцениваемой ссылке.

Я написал то же Definition Mem.load load1 самое, что и и, которое можно развернуть.

 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.
 

Комментарии:

1. Я хотел бы сказать, что я уверен Mem.load , что она развертывается по уважительной причине, поэтому OP следует скорее пересмотреть свою первоначальную стратегию.