eapply self_simulation.minject in matchmem.
subst.
unfold virtueThread_inject.
destruct virtueThread as (virtue1, virtue2).
cbv iota beta delta[fst] in *.
split.
- clear - A matchmem compiled .

Lemma inject_virtue_sub_map:
forall {Sem1 Sem2}
(st1 : ThreadPool.t(resources:=dryResources)(Sem:=Sem1))
(m1 : mem) (tid : nat)
(st2 : ThreadPool.t(resources:=dryResources)(Sem:=Sem2))
(mu : meminj) (m2 : mem)
(Htid1 : ThreadPool.containsThread st1 tid) (Htid2 : ThreadPool.containsThread st2 tid)
{A} (virtue1 : PTree.t (Z -> option A))
(Hcmpt1: mem_compatible st1 m1)(Hcmpt2: mem_compatible st2 m2),
Mem.inject mu (restrPermMap (proj1 (Hcmpt1 tid Htid1)))
(restrPermMap (proj1 (Hcmpt2 tid Htid2))) ->
bounded_maps.sub_map virtue1 (snd (getMaxPerm m1)) ->
bounded_maps.sub_map (tree_map_inject_over_mem m2 mu virtue1) (snd (getMaxPerm m2)).