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 , joinmem o M1 o1 ->
     joinmem o1 M2 -> exists M3, MemMod.join M1 M2 M3 /\ joinmem o M3 .

Lemma join_intro_l: forall G E M isr aux o, joinmem (G, E , M, isr, aux) o -> exists M1, MemMod.join M M1 /\ o = (G,E,M1,isr,aux).

Lemma join_intro_r : forall G E M isr aux o, joinmem o (G, E , M, isr, aux) -> exists M1, MemMod.join M1 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 , joinmem (G,E,,isr,aux) M2 o /\ MemMod.join M1 M3 .

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 , joinmem o1 Ms o /\
                          joinmem o o2 /\ joinmem o M o0 /\ MemMod.join M Mf .

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 ,joinmem o M -> MemMod.disj (get_mem (get_smem o)) M.

Lemma join_memj_intro : forall o M M1 M2, joinmem o M -> MemMod.join M1 M2 M ->
          exists o1 , joinmem o1 M2 /\ joinmem o M1 o1.

Lemma join_disj_disj : forall o M Ms,
                     joinmem o M -> MemMod.disj (get_mem (get_smem )) Ms ->
                             MemMod.disj (get_mem (get_smem o)) Ms.

Lemma join_join_intro : forall o M o´´ ,joinmem o M -> joinmem o´´ ->
         exists M1, joinmem o M1 o´´/\ MemMod.join M M1.

Lemma join_swinv_prop : forall o M Mc aop O I, joinmem o M ->
                        (substaskst o Mc, O, aop) |= SWINV I
                         -> (substaskst Mc, O, aop) |= SWINV I.

 Lemma join_swinv_prop_rev : forall o M Mc aop O I, joinmem o M ->
                        (substaskst Mc, O, aop) |= SWINV I
                         -> (substaskst o Mc, O, aop) |= SWINV I.

 Lemma join_join_intro´ : forall o M o´´, joinmem o M -> joinmem o´´ -> exists o1, joinmem o 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 M1 M2 G E M isr aux,
                    joinmem o M1 -> joinmem M2 (G,E,M,isr,aux) -> get_genv (get_smem o) = G.

Lemma join_join_getlenv : forall o M1 M2 G E M isr aux,
                    joinmem o M1 -> joinmem M2 (G,E,M,isr,aux) -> get_lenv (get_smem o) = E.

Lemma join_eqenv : forall o M , joinmem o M -> eqenv o .

Lemma eqenv_trans : forall o o´´, eqenv o -> eqenv o´´ -> eqenv o o´´.

Lemma eqenv_comm: forall o , eqenv o -> eqenv o.

Lemma joinmem_eqg : forall o M , joinmem o M -> get_genv (get_smem o) = get_genv (get_smem ).