Library joinmemLib
Require Import include.
Require Import memory.
Require Import memdata.
Require Import language.
Require Import opsem.
Require Import assertion.
Require Import baseTac.
Require Import simulation.
Lemma Mem_minus_disj : forall M m, MemMod.disj (MemMod.minus M m) m.
Lemma join_minus_r : forall m1 m2 m3 M,
MemMod.join m1 m2 (MemMod.minus M m3) ->
exists mx, MemMod.join m2 m3 mx.
Lemma taskst_join_merge : forall o o1 M1 M2 o´, joinmem o M1 o1 ->
joinmem o1 M2 o´ -> exists M3, MemMod.join M1 M2 M3 /\ joinmem o M3 o´.
Lemma join_intro_l: forall G E M isr aux M´ o, joinmem (G, E , M, isr, aux) M´ o -> exists M1, MemMod.join M M´ M1 /\ o = (G,E,M1,isr,aux).
Lemma join_intro_r : forall G E M isr aux M´ o, joinmem o M´ (G, E , M, isr, aux) -> exists M1, MemMod.join M1 M´ M /\ o = (G,E,M1,isr,aux).
Lemma Mem_join_disj : forall M1 M2 M, MemMod.join M1 M2 M -> MemMod.disj M1 M2.
Lemma join_mjoin_intro_intro: forall G E M1 isr aux M2 M3 M o,
joinmem (G,E,M1,isr,aux) M o ->
MemMod.join M2 M3 M
-> exists M´, joinmem (G,E,M´,isr,aux) M2 o /\ MemMod.join M1 M3 M´.
Lemma join_frame_dis : forall o1 M o1´ Ms o0 Mf o2,
joinmem o1 M o1´ ->
joinmem o1´ Ms o0 ->
joinmem o0 Mf o2 ->
exists o M´, joinmem o1 Ms o /\
joinmem o M´ o2 /\ joinmem o M o0 /\ MemMod.join M Mf M´.
Lemma join_sub_inv: forall o1 M o1´ Ms Os ab I, joinmem o1 M o1´ ->
(substaskst o1´ Ms, Os, ab) |= INV I ->
(substaskst o1 Ms, Os, ab) |= INV I.
Lemma join_sub_inv_rev: forall o1 M o1´ Ms Os ab I, joinmem o1 M o1´ ->
(substaskst o1 Ms, Os, ab) |= INV I ->
(substaskst o1´ Ms, Os, ab) |= INV I.
Lemma join_inject: forall o1 M1 o2 M o3 M0 Mf , joinmem o2 M o3 ->
joinmem o1 M1 o2 ->
MemMod.join M0 Mf M ->
exists o2´ o1´ , joinmem o2´ Mf o3 /\joinmem o1´ M1 o2´
/\ joinmem o1 M0 o1´.
Lemma joinmem_get_disj : forall o M o´,joinmem o M o´ -> MemMod.disj (get_mem (get_smem o)) M.
Lemma join_memj_intro : forall o M o´ M1 M2, joinmem o M o´ -> MemMod.join M1 M2 M ->
exists o1 , joinmem o1 M2 o´ /\ joinmem o M1 o1.
Lemma join_disj_disj : forall o M o´ Ms,
joinmem o M o´ -> MemMod.disj (get_mem (get_smem o´)) Ms ->
MemMod.disj (get_mem (get_smem o)) Ms.
Lemma join_join_intro : forall o M o´ M´ o´´ ,joinmem o M o´ -> joinmem o´ M´ o´´ ->
exists M1, joinmem o M1 o´´/\ MemMod.join M M´ M1.
Lemma join_swinv_prop : forall o M o´ Mc aop O I, joinmem o M o´ ->
(substaskst o Mc, O, aop) |= SWINV I
-> (substaskst o´ Mc, O, aop) |= SWINV I.
Lemma join_swinv_prop_rev : forall o M o´ Mc aop O I, joinmem o M o´ ->
(substaskst o´ Mc, O, aop) |= SWINV I
-> (substaskst o Mc, O, aop) |= SWINV I.
Lemma join_join_intro´ : forall o M o´ M´ o´´, joinmem o M o´ -> joinmem o´ M´ o´´ -> exists o1, joinmem o M´ o1/\ joinmem o1 M o´´.
Lemma env_join_get: forall x l tp E1 E1´ E E2,
EnvMod.join (EnvMod.sig x (l, tp)) E1 E1´ ->
EnvMod.join E E1´ E2 ->
EnvMod.get E2 x = Some (l, tp) .
Lemma ListSet_set_In_cons_elim :
forall {t:Type} (a b:t) x,
ListSet.set_In a (b::x) -> a = b \/ ListSet.set_In a x.
Lemma ListSet_set_In_cons_intro :
forall {t:Type} (a b:t) x,
a = b \/ ListSet.set_In a x -> ListSet.set_In a (b::x).
Lemma join_eq_dom_env: forall x l tp E1 E1´ dd,
EnvMod.join (EnvMod.sig x (l, tp)) E1 E1´ ->
eq_dom_env E1 (getlenvdom dd) ->
eq_dom_env E1´ ((x,tp)::(getlenvdom dd)).
Lemma join_join_getgenv : forall o o´ M1 M2 G E M isr aux,
joinmem o M1 o´ -> joinmem o´ M2 (G,E,M,isr,aux) -> get_genv (get_smem o) = G.
Lemma join_join_getlenv : forall o o´ M1 M2 G E M isr aux,
joinmem o M1 o´ -> joinmem o´ M2 (G,E,M,isr,aux) -> get_lenv (get_smem o) = E.
Lemma join_eqenv : forall o M o´, joinmem o M o´ -> eqenv o o´.
Lemma eqenv_trans : forall o o´ o´´, eqenv o o´ -> eqenv o´ o´´ -> eqenv o o´´.
Lemma eqenv_comm: forall o o´, eqenv o o´ -> eqenv o´ o.
Lemma joinmem_eqg : forall o M o´, joinmem o M o´ -> get_genv (get_smem o) = get_genv (get_smem o´).