(* Blocks that are not mapped by f are set to empty permission. This makes the invariant preservation easier. *)
Definition projectMap (f : memren) (pmap : access_map) : access_map :=
(pmap#1, Maps.PTree.fold (fun acc b bperm =>
match f b with
| Some b' =>
Maps.PTree.set b' bperm acc
| None =>
acc end)
pmap.2 (Maps.PTree.empty _)).

Lemma ctlType_inj :
forall st c c' m m' (f fg: memren)
(Hfg:forall b1 b2 : block, fg b1 = Some b2 -> b1 = b2)
(Hincr: ren_incr fg f)
(Hge_wd: ge_wd fg the_ge)
(Hvalid: valid_mem m)
(Hmem: mem_obs_eq f m m')
(Hinj: ctl_inj f c c'),
ctlType c m st <-> ctlType c' m' st.