(** ** Memories equal up to alpha-renaming *)
From mathcomp.ssreflect Require Import ssreflect ssrbool ssrnat ssrfun eqtype seq fintype finfun.
Set Implicit Arguments.
(*NOTE: because of redefinition of [val], these imports must appear after Ssreflect eqtype.*)
(** ** Block renamings*)
Module Renamings.
Definition memren := block -> option block.
Definition ren_incr f1 f2 :=
forall (b b' : block),
f1 b = Some b' -> f2 b = Some b'.
Definition ren_separated (f f' : memren) m1 m2 :=
forall (b1 b2 : block),
f b1 = None ->
f' b1 = Some b2 ->
~ Mem.valid_block m1 b1 /\ ~ Mem.valid_block m2 b2.
Definition ren_domain_incr (f1 f2: memren) :=
forall b,
f1 b -> f2 b.
(** Defining the domain of a renaming with respect to a memory*)
Definition domain_memren (f: memren) m :=
forall b, Mem.valid_block m b <-> isSome (f b).

(* Specifications: *)
Lemma restrPermMap_domain:
forall f m p (Hlt: permMapLt p (getMaxPerm m)),
domain_memren f m <-> domain_memren f (restrPermMap Hlt).
Lemma domain_memren_incr:
forall f f' f'' m,
domain_memren f' m ->
domain_memren f'' m ->
ren_domain_incr f f' <-> ren_domain_incr f f''.
Lemma domain_memren_trans:
forall f f' m m',
domain_memren f m ->
domain_memren f m' ->
domain_memren f' m' ->
domain_memren f' m.
Lemma ren_incr_domain_incr:
forall f f',
ren_incr f f' ->
ren_domain_incr f f'.
Lemma ren_domain_incr_refl:
forall f,
ren_domain_incr f f.
Lemma ren_domain_incr_trans:
forall f f' f'',
ren_domain_incr f f' ->
ren_domain_incr f' f'' ->
ren_domain_incr f f''.
Lemma ren_incr_trans:
forall f f' f'',
ren_incr f f' ->
ren_incr f' f'' ->
ren_incr f f''.
Lemma ren_incr_refl:
forall f,
ren_incr f f.
Lemma ren_separated_refl:
forall f m m',
ren_separated f f m m'.