Library SSProve.Crypt.package.pkg_heap

Heaps for code/packages
This module introduces the notion of heap for storing memory in packages.

From Coq Require Import Utf8.
From Coq Require Import ZArith.
Set Warnings "-ambiguous-paths,-notation-overridden,-notation-incompatible-format".
From mathcomp Require Import ssrnat ssreflect ssrfun ssrbool ssrnum eqtype
  choice reals distr seq all_algebra fintype realsum word.
Set Warnings "ambiguous-paths,notation-overridden,notation-incompatible-format".
From extructures Require Import ord fset fmap.
From SSProve.Mon Require Import SPropBase.
From SSProve.Crypt Require Import Prelude Axioms ChoiceAsOrd
  choice_type pkg_core_definition.
Require Import Equations.Prop.DepElim.
From Equations Require Import Equations.

Set Equations With UIP.
Set Equations Transparent.

Import SPropNotations.

Set SsrOldRewriteGoalsOrder. (* change Set to Unset when porting the file, then remove the line when requiring MathComp >= 2.6 *)
Set Bullet Behavior "Strict Subproofs".
Set Default Goal Selector "!".
Set Primitive Projections.

Definition heap_init (L : Location) : L := projT2 L.2.

Definition heap := {fmap nat nat}.

Definition get_heap (map : heap) (l : Location) : l
  := odflt (heap_init l) (obind unpickle (map l.1)).

Definition set_heap (map : heap) (l : Location) (v : l) : heap
  := setm map l.1 (pickle v).

Definition empty_heap : heap := emptym.

Lemma get_empty_heap :
   , get_heap empty_heap = heap_init .
Proof.
  intros . reflexivity.
Qed.

Lemma get_set_heap_eq :
   h v,
    get_heap (set_heap h v) = v.
Proof.
  intros h v.
  rewrite /get_heap /set_heap setmE eq_refl //= pickleK //.
Qed.

Lemma get_set_heap_neq :
   h v ℓ',
    ℓ'.1 != .1
    get_heap (set_heap h v) ℓ' = get_heap h ℓ'.
Proof.
  moveh v ℓ' /negPf ne.
  rewrite /get_heap /set_heap setmE ne //.
Qed.

Lemma set_heap_contract :
   s v v',
    set_heap (set_heap s v) v' = set_heap s v'.
Proof.
  intros s v v'.
  rewrite /set_heap setmxx //.
Qed.

Lemma set_heap_commut :
   s v ℓ' v',
    .1 != ℓ'.1
    set_heap (set_heap s v) ℓ' v' =
    set_heap (set_heap s ℓ' v') v.
Proof.
  intros s v ℓ' v' ne.
  rewrite /set_heap setmC //.
Qed.