(****************************************************************
   File: Property3.v                                                 
   Authors: Amy Felty
   Version: Coq V8.4pl2
   Date: January 2014
                                                                 
   Property 3 from "A Logical Framework for Systems Biology",
   Elisabetta de Maria, Joelle Despeyroux, and Amy P. Felty.

  ***************************************************************)

Require Export BoolEq.
Require Export EqNat.
Require Export hyll_temporal.

Section property3.

Let PP := (state0 *o abs dNAdam).
Let Gamma := system.

Theorem Property3 :
  forall w:world, 
    seq_ Gamma (msingl (PP @ 0)) ((PP at 0) @ w) /\
    forall (n:nat) (A B:oo_), fireable n A -> not_fireable n B ->
       seq_ Gamma mnil_ ((PP ->> ((A &a step PP) +o B)) @ w).
Proof.
intro w; split.
(* automatically generated subproof property3_0 of the subgoal:
7 subgoals, subgoal 1 (ID 32)
  
  PP := state0 *o abs dNAdam : oo world atm tm
  Gamma := system : list judg_
  w : world
  ============================
   seq eqw eqatm Gamma (msingl (abs p53 *o pres mdm2 *o abs dNAdam @ 0))
     (abs p53 *o pres mdm2 *o abs dNAdam @ 0) *)
apply s_AtR; auto.
apply s_ConjML with
 (abs p53 *o pres mdm2)
 (abs dNAdam)
 (0) 
 mnil_
 (madd (abs p53 *o pres mdm2 @ 0)
  (madd (abs dNAdam @ 0)
  mnil_)); auto.
apply s_ConjML with
 (abs p53)
 (pres mdm2)
 (0) 
 (madd (abs dNAdam @ 0)
  mnil_)
 (madd (abs p53 @ 0)
  (madd (pres mdm2 @ 0)
  (madd (abs dNAdam @ 0)
  mnil_))); auto.
apply s_ConjMR with
 (madd (abs p53 @ 0)
  (madd (pres mdm2 @ 0)
  mnil_))
 (madd (abs dNAdam @ 0)
  mnil_); auto.
apply s_ConjMR with
 (madd (abs p53 @ 0)
  mnil_)
 (madd (pres mdm2 @ 0)
  mnil_); auto.
apply s_init; auto.
apply s_init; auto.
apply s_init; auto.
(* End of subgoal *)
intro n; case n.
intros A B h; inversion h.
clear n; intro n; case n.
intros A B h1 h2; inversion_clear h1; inversion_clear h2.
(* automatically generated subproof property3_1 of the subgoal:
subgoal 2 (ID 212) is:
 seq_ Gamma mnil_
   (PP ->>
    pres dNAdam +o (pres dNAdam *o pres mdm2) +o
    (pres dNAdam *o abs mdm2) *o dont_care p53 &a 
    step PP +o (abs dNAdam *o dont_cares (mdm2 :: p53 :: nil)) @ w) *)
apply s_ImpR with
(madd (abs p53 *o pres mdm2 *o abs dNAdam @ w)
  mnil_); auto.
apply s_ConjML with
 (abs p53 *o pres mdm2)
 (abs dNAdam)
 (w) 
 mnil_
 (madd (abs p53 *o pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)); auto.
apply s_ConjML with
 (abs p53)
 (pres mdm2)
 (w) 
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_))); auto.
apply s_DisjAR2; auto.
apply s_ConjMR with
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  mnil_)); auto.
unfold munion,madd; simpl; auto.
apply ms_perm312; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_init; auto.
apply s_ConjMR with
 (madd (pres mdm2 @ w)
  mnil_)
 (madd (abs p53 @ w)
  mnil_); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_DisjAR1; auto.
apply s_init; auto.
apply s_DisjAR2; auto.
apply s_init; auto.
(* End of subgoal *)
clear n; intro n; case n.
intros A B h1 h2; inversion_clear h1; inversion_clear h2.
(* automatically generated subproof property3_2 of the subgoal:
  PP := state0 *o abs dNAdam : oo world atm tm
  Gamma := system : list judg_
  w : world
  n : nat
  A : oo_
  B : oo_
  ============================
   seq_ Gamma mnil_
     (PP ->>
      abs mdm2 +o (abs mdm2 *o pres p53) +o (abs mdm2 *o abs p53) *o
      dont_care dNAdam &a step PP +o
      (pres mdm2 *o dont_cares (p53 :: dNAdam :: nil)) @ w) *)
apply s_ImpR with
(madd (abs p53 *o pres mdm2 *o abs dNAdam @ w)
  mnil_); auto.
apply s_ConjML with
 (abs p53 *o pres mdm2)
 (abs dNAdam)
 (w) 
 mnil_
 (madd (abs p53 *o pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)); auto.
apply s_ConjML with
 (abs p53)
 (pres mdm2)
 (w) 
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_))); auto.
apply s_DisjAR2; auto.
apply s_ConjMR with
 (madd (pres mdm2 @ w)
  mnil_)
 (madd (abs p53 @ w)
  (madd (abs dNAdam @ w)
  mnil_)); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_init; auto.
apply s_ConjMR with
 (madd (abs p53 @ w)
  mnil_)
 (madd (abs dNAdam @ w)
  mnil_); auto.
apply s_DisjAR2; auto.
apply s_init; auto.
apply s_DisjAR2; auto.
apply s_init; auto.
(* End of subgoal *)
clear n; intro n; case n.
intros A B h1 h2; inversion_clear h1; inversion_clear h2.
(* automatically generated subproof property3_3 of the subgoal:
  PP := state0 *o abs dNAdam : oo world atm tm
  Gamma := system : list judg_
  w : world
  n : nat
  A : oo_
  B : oo_
  ============================
   seq_ Gamma mnil_
     (PP ->>
      pres p53 +o (pres p53 *o pres mdm2) +o (pres p53 *o abs mdm2) *o
      dont_care dNAdam &a step PP +o
      (abs p53 *o dont_cares (mdm2 :: dNAdam :: nil)) @ w) *)
apply s_ImpR with
(madd (abs p53 *o pres mdm2 *o abs dNAdam @ w)
  mnil_); auto.
apply s_ConjML with
 (abs p53 *o pres mdm2)
 (abs dNAdam)
 (w) 
 mnil_
 (madd (abs p53 *o pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)); auto.
apply s_ConjML with
 (abs p53)
 (pres mdm2)
 (w) 
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_))); auto.
apply s_DisjAR2; auto.
apply s_ConjMR with
 (madd (abs p53 @ w)
  mnil_)
 (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)); auto.
apply s_init; auto.
apply s_ConjMR with
 (madd (pres mdm2 @ w)
  mnil_)
 (madd (abs dNAdam @ w)
  mnil_); auto.
apply s_DisjAR1; auto.
apply s_init; auto.
apply s_DisjAR2; auto.
apply s_init; auto.
(* End of subgoal *)
clear n; intro n; case n.
intros A B h1 h2; inversion_clear h1; inversion_clear h2.
(* automatically generated subproof property3_4 of the subgoal:
  PP := state0 *o abs dNAdam : oo world atm tm
  Gamma := system : list judg_
  w : world
  n : nat
  A : oo_
  B : oo_
  ============================
   seq_ Gamma mnil_
     (PP ->>
      pres mdm2 +o (pres mdm2 *o pres p53) +o (pres mdm2 *o abs p53) *o
      dont_care dNAdam &a step PP +o
      (abs mdm2 *o dont_cares (p53 :: dNAdam :: nil)) @ w) *)
apply s_ImpR with
(madd (abs p53 *o pres mdm2 *o abs dNAdam @ w)
  mnil_); auto.
apply s_ConjML with
 (abs p53 *o pres mdm2)
 (abs dNAdam)
 (w) 
 mnil_
 (madd (abs p53 *o pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)); auto.
apply s_ConjML with
 (abs p53)
 (pres mdm2)
 (w) 
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_))); auto.
apply s_DisjAR1; auto.
apply s_ConjAR; auto.
apply s_ConjMR with
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  mnil_))
 (madd (abs dNAdam @ w)
  mnil_); auto.
apply s_DisjAR2; auto.
apply s_ConjMR with
 (madd (pres mdm2 @ w)
  mnil_)
 (madd (abs p53 @ w)
  mnil_); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_init; auto.
apply s_init; auto.
apply s_DisjAR2; auto.
apply s_init; auto.
apply s_copy with
 (dagger rule4)
 (0)
 (madd (dagger rule4 @ 0)
  (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)))); simpl; auto.
unfold rule4; auto.
unfold dagger; auto.
apply s_WallL with
 (fun W1 => (pres mdm2 +o (pres mdm2 *o pres p53) +o (pres mdm2 *o abs p53) ->> step (pres mdm2 *o abs p53) *o down (fun W2 => !! ((pres dNAdam at W2 ->> pres dNAdam at (W2 + 1)) &a (abs dNAdam at W2 ->> abs dNAdam at (W2 + 1))))) at W1)
 (0)
 (w)
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)))
 (madd ((pres mdm2 +o (pres mdm2 *o pres p53) +o (pres mdm2 *o abs p53) ->> step (pres mdm2 *o abs p53) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1))))) at w @ 0)
  (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)))); auto.
apply s_AtL with
 (pres mdm2 +o (pres mdm2 *o pres p53) +o (pres mdm2 *o abs p53) ->> step (pres mdm2 *o abs p53) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))))
 (w)
 (0)
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)))
 (madd (pres mdm2 +o (pres mdm2 *o pres p53) +o (pres mdm2 *o abs p53) ->> step (pres mdm2 *o abs p53) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ w)
  (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)))); auto.
apply s_ImpL with
 (pres mdm2 +o (pres mdm2 *o pres p53) +o (pres mdm2 *o abs p53))
 (step (pres mdm2 *o abs p53) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))))
 (w) 
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  mnil_))
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (step (pres mdm2 *o abs p53) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ w)
  (madd (abs dNAdam @ w)
  mnil_)); auto.
apply s_DisjAR2; auto.
apply s_ConjMR with
 (madd (pres mdm2 @ w)
  mnil_)
 (madd (abs p53 @ w)
  mnil_); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_init; auto.
apply s_init; auto.
apply s_ConjML with
 (step (pres mdm2 *o abs p53))
 (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))))
 (w) 
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (step (pres mdm2 *o abs p53) @ w)
  (madd (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ w)
  (madd (abs dNAdam @ w)
  mnil_))); auto.
apply s_DownL with
 (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1))))
 (w)
 (madd (step (pres mdm2 *o abs p53) @ w)
  (madd (abs dNAdam @ w)
  mnil_))
 (madd (step (pres mdm2 *o abs p53) @ w)
  (madd (!! ((pres dNAdam at w ->> pres dNAdam at (w + 1)) &a (abs dNAdam at w ->> abs dNAdam at (w + 1))) @ w)
  (madd (abs dNAdam @ w)
  mnil_))); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
specialize (H 0); repeat (inversion_clear 0).
apply s_BangL with
 ((pres dNAdam at w ->> pres dNAdam at (w + 1)) &a (abs dNAdam at w ->> abs dNAdam at (w + 1)))
 (w)
 (madd (step (pres mdm2 *o abs p53) @ w)
  (madd (abs dNAdam @ w)
  mnil_)); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_copy with
 ((pres dNAdam at w ->> pres dNAdam at (w + 1)) &a (abs dNAdam at w ->> abs dNAdam at (w + 1)))
 (w) 
 (madd ((pres dNAdam at w ->> pres dNAdam at (w + 1)) &a (abs dNAdam at w ->> abs dNAdam at (w + 1)) @ w)
  (madd (step (pres mdm2 *o abs p53) @ w)
  (madd (abs dNAdam @ w)
  mnil_))); simpl; auto.
apply s_ConjAL2 with
 (pres dNAdam at w ->> pres dNAdam at (w + 1))
 (abs dNAdam at w ->> abs dNAdam at (w + 1))
 (w) 
 (madd (step (pres mdm2 *o abs p53) @ w)
  (madd (abs dNAdam @ w)
  mnil_))
 (madd (abs dNAdam at w ->> abs dNAdam at (w + 1) @ w)
  (madd (step (pres mdm2 *o abs p53) @ w)
  (madd (abs dNAdam @ w)
  mnil_))); auto.
apply s_ImpL with
 (abs dNAdam at w)
 (abs dNAdam at (w + 1))
 (w) 
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (step (pres mdm2 *o abs p53) @ w)
  mnil_)
 (madd (abs dNAdam at (w + 1) @ w)
  (madd (step (pres mdm2 *o abs p53) @ w)
  mnil_)); auto.
unfold munion,madd; simpl; auto.
apply ms_eq_cons; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_AtR; auto.
apply s_init; auto.
unfold step; auto.
apply s_DownL with
 (fun W1 => (pres mdm2 *o abs p53) at (W1 + 1))
 (w)
 (madd (abs dNAdam at (w + 1) @ w)
  mnil_)
 (madd (abs dNAdam at (w + 1) @ w)
  (madd ((pres mdm2 *o abs p53) at (w + 1) @ w)
  mnil_)); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
inversion_clear H.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_AtL with
 (pres mdm2 *o abs p53)
 (w + 1)
 (w)
 (madd (abs dNAdam at (w + 1) @ w)
  mnil_)
 (madd (abs dNAdam at (w + 1) @ w)
  (madd (pres mdm2 *o abs p53 @ w + 1)
  mnil_)); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
inversion_clear H.
apply s_AtL with
 (abs dNAdam)
 (w + 1)
 (w)
 (madd (pres mdm2 *o abs p53 @ w + 1)
  mnil_)
 (madd (abs dNAdam @ w + 1)
  (madd (pres mdm2 *o abs p53 @ w + 1)
  mnil_)); auto.
apply s_ConjML with
 (pres mdm2)
 (abs p53)
 (w + 1) 
 (madd (abs dNAdam @ w + 1)
  mnil_)
 (madd (abs dNAdam @ w + 1)
  (madd (pres mdm2 @ w + 1)
  (madd (abs p53 @ w + 1)
  mnil_))); auto.
unfold munion,madd; simpl; auto.
apply ms_perm231; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
unfold step; auto.
apply s_DownR; auto.
apply s_AtR; auto.
apply s_ConjMR with
 (madd (pres mdm2 @ w + 1)
  (madd (abs p53 @ w + 1)
  mnil_))
 (madd (abs dNAdam @ w + 1)
  mnil_); auto.
unfold munion,madd; simpl; auto.
apply ms_perm231; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_ConjMR with
 (madd (abs p53 @ w + 1)
  mnil_)
 (madd (pres mdm2 @ w + 1)
  mnil_); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_init; auto.
apply s_init; auto.
apply s_init; auto.
(* End of subgoal *)
clear n; intro n; case n.
intros A B h1 h2; inversion_clear h1; inversion_clear h2.
(* automatically generated subproof property3_5 of the subgoal:
  PP := state0 *o abs dNAdam : oo world atm tm
  Gamma := system : list judg_
  w : world
  n : nat
  A : oo_
  B : oo_
  ============================
   seq_ Gamma mnil_
     (PP ->>
      pres p53 +o (pres p53 *o pres dNAdam) +o (pres p53 *o abs dNAdam) *o
      dont_care mdm2 &a step PP +o
      (abs p53 *o dont_cares (mdm2 :: dNAdam :: nil)) @ w) *)
apply s_ImpR with
(madd (abs p53 *o pres mdm2 *o abs dNAdam @ w)
  mnil_); auto.
apply s_ConjML with
 (abs p53 *o pres mdm2)
 (abs dNAdam)
 (w) 
 mnil_
 (madd (abs p53 *o pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)); auto.
apply s_ConjML with
 (abs p53)
 (pres mdm2)
 (w) 
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_))); auto.
apply s_DisjAR2; auto.
apply s_ConjMR with
 (madd (abs p53 @ w)
  mnil_)
 (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)); auto.
apply s_init; auto.
apply s_ConjMR with
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (pres mdm2 @ w)
  mnil_); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_DisjAR2; auto.
apply s_init; auto.
apply s_DisjAR1; auto.
apply s_init; auto.
(* End of subgoal *)
clear n; intro n; case n.
intros A B h1 h2; inversion_clear h1; inversion_clear h2.
(* automatically generated subproof property3_6 of the subgoal:
  PP := state0 *o abs dNAdam : oo world atm tm
  Gamma := system : list judg_
  w : world
  n : nat
  A : oo_
  B : oo_
  ============================
   seq_ Gamma mnil_
     (PP ->>
      abs dNAdam +o (abs dNAdam *o pres mdm2) +o (abs dNAdam *o abs mdm2) *o
      dont_care p53 &a step PP +o
      (pres dNAdam *o dont_cares (mdm2 :: p53 :: nil)) @ w) *)
apply s_ImpR with
(madd (abs p53 *o pres mdm2 *o abs dNAdam @ w)
  mnil_); auto.
apply s_ConjML with
 (abs p53 *o pres mdm2)
 (abs dNAdam)
 (w) 
 mnil_
 (madd (abs p53 *o pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)); auto.
apply s_ConjML with
 (abs p53)
 (pres mdm2)
 (w) 
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_))); auto.
apply s_DisjAR1; auto.
apply s_ConjAR; auto.
apply s_ConjMR with
 (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_))
 (madd (abs p53 @ w)
  mnil_); auto.
unfold munion,madd; simpl; auto.
apply ms_perm231; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_DisjAR1; auto.
apply s_DisjAR2; auto.
apply s_ConjMR with
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (pres mdm2 @ w)
  mnil_); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_init; auto.
apply s_init; auto.
apply s_DisjAR2; auto.
apply s_init; auto.
apply s_copy with
 (dagger rule6)
 (0)
 (madd (dagger rule6 @ 0)
  (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)))); simpl; auto.
unfold rule6,oo2daggerJudg; simpl; tauto.
unfold dagger; auto.
apply s_WallL with
 (fun W1 => (abs dNAdam +o (abs dNAdam *o pres mdm2) +o (abs dNAdam *o abs mdm2) ->> step (abs dNAdam *o pres mdm2) *o down (fun W2 => !! ((pres p53 at W2 ->> pres p53 at (W2 + 1)) &a (abs p53 at W2 ->> abs p53 at (W2 + 1))))) at W1)
 (0)
 (w)
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)))
 (madd ((abs dNAdam +o (abs dNAdam *o pres mdm2) +o (abs dNAdam *o abs mdm2) ->> step (abs dNAdam *o pres mdm2) *o down (fun W1 => !! ((pres p53 at W1 ->> pres p53 at (W1 + 1)) &a (abs p53 at W1 ->> abs p53 at (W1 + 1))))) at w @ 0)
  (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)))); auto.
apply s_AtL with
 (abs dNAdam +o (abs dNAdam *o pres mdm2) +o (abs dNAdam *o abs mdm2) ->> step (abs dNAdam *o pres mdm2) *o down (fun W1 => !! ((pres p53 at W1 ->> pres p53 at (W1 + 1)) &a (abs p53 at W1 ->> abs p53 at (W1 + 1)))))
 (w)
 (0)
 (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)))
 (madd (abs dNAdam +o (abs dNAdam *o pres mdm2) +o (abs dNAdam *o abs mdm2) ->> step (abs dNAdam *o pres mdm2) *o down (fun W1 => !! ((pres p53 at W1 ->> pres p53 at (W1 + 1)) &a (abs p53 at W1 ->> abs p53 at (W1 + 1)))) @ w)
  (madd (abs p53 @ w)
  (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_)))); auto.
apply s_ImpL with
 (abs dNAdam +o (abs dNAdam *o pres mdm2) +o (abs dNAdam *o abs mdm2))
 (step (abs dNAdam *o pres mdm2) *o down (fun W1 => !! ((pres p53 at W1 ->> pres p53 at (W1 + 1)) &a (abs p53 at W1 ->> abs p53 at (W1 + 1)))))
 (w) 
 (madd (pres mdm2 @ w)
  (madd (abs dNAdam @ w)
  mnil_))
 (madd (abs p53 @ w)
  mnil_)
 (madd (step (abs dNAdam *o pres mdm2) *o down (fun W1 => !! ((pres p53 at W1 ->> pres p53 at (W1 + 1)) &a (abs p53 at W1 ->> abs p53 at (W1 + 1)))) @ w)
  (madd (abs p53 @ w)
  mnil_)); auto.
unfold munion,madd; simpl; auto.
apply ms_eq_cons; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
apply ms_perm231; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_DisjAR1; auto.
apply s_DisjAR2; auto.
apply s_ConjMR with
 (madd (abs dNAdam @ w)
  mnil_)
 (madd (pres mdm2 @ w)
  mnil_); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_init; auto.
apply s_init; auto.
apply s_ConjML with
 (step (abs dNAdam *o pres mdm2))
 (down (fun W1 => !! ((pres p53 at W1 ->> pres p53 at (W1 + 1)) &a (abs p53 at W1 ->> abs p53 at (W1 + 1)))))
 (w) 
 (madd (abs p53 @ w)
  mnil_)
 (madd (step (abs dNAdam *o pres mdm2) @ w)
  (madd (down (fun W1 => !! ((pres p53 at W1 ->> pres p53 at (W1 + 1)) &a (abs p53 at W1 ->> abs p53 at (W1 + 1)))) @ w)
  (madd (abs p53 @ w)
  mnil_))); auto.
apply s_DownL with
 (fun W1 => !! ((pres p53 at W1 ->> pres p53 at (W1 + 1)) &a (abs p53 at W1 ->> abs p53 at (W1 + 1))))
 (w)
 (madd (step (abs dNAdam *o pres mdm2) @ w)
  (madd (abs p53 @ w)
  mnil_))
 (madd (step (abs dNAdam *o pres mdm2) @ w)
  (madd (!! ((pres p53 at w ->> pres p53 at (w + 1)) &a (abs p53 at w ->> abs p53 at (w + 1))) @ w)
  (madd (abs p53 @ w)
  mnil_))); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
specialize (H 0); repeat (inversion_clear 0).
apply s_BangL with
 ((pres p53 at w ->> pres p53 at (w + 1)) &a (abs p53 at w ->> abs p53 at (w + 1)))
 (w)
 (madd (step (abs dNAdam *o pres mdm2) @ w)
  (madd (abs p53 @ w)
  mnil_)); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_copy with
 ((pres p53 at w ->> pres p53 at (w + 1)) &a (abs p53 at w ->> abs p53 at (w + 1)))
 (w) 
 (madd ((pres p53 at w ->> pres p53 at (w + 1)) &a (abs p53 at w ->> abs p53 at (w + 1)) @ w)
  (madd (step (abs dNAdam *o pres mdm2) @ w)
  (madd (abs p53 @ w)
  mnil_))); simpl; auto.
apply s_ConjAL2 with
 (pres p53 at w ->> pres p53 at (w + 1))
 (abs p53 at w ->> abs p53 at (w + 1))
 (w) 
 (madd (step (abs dNAdam *o pres mdm2) @ w)
  (madd (abs p53 @ w)
  mnil_))
 (madd (abs p53 at w ->> abs p53 at (w + 1) @ w)
  (madd (step (abs dNAdam *o pres mdm2) @ w)
  (madd (abs p53 @ w)
  mnil_))); auto.
apply s_ImpL with
 (abs p53 at w)
 (abs p53 at (w + 1))
 (w) 
 (madd (abs p53 @ w)
  mnil_)
 (madd (step (abs dNAdam *o pres mdm2) @ w)
  mnil_)
 (madd (abs p53 at (w + 1) @ w)
  (madd (step (abs dNAdam *o pres mdm2) @ w)
  mnil_)); auto.
unfold munion,madd; simpl; auto.
apply ms_eq_cons; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_AtR; auto.
apply s_init; auto.
unfold step; auto.
apply s_DownL with
 (fun W1 => (abs dNAdam *o pres mdm2) at (W1 + 1))
 (w)
 (madd (abs p53 at (w + 1) @ w)
  mnil_)
 (madd (abs p53 at (w + 1) @ w)
  (madd ((abs dNAdam *o pres mdm2) at (w + 1) @ w)
  mnil_)); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
repeat (inversion_clear H).
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_AtL with
 (abs dNAdam *o pres mdm2)
 (w + 1)
 (w)
 (madd (abs p53 at (w + 1) @ w)
  mnil_)
 (madd (abs p53 at (w + 1) @ w)
  (madd (abs dNAdam *o pres mdm2 @ w + 1)
  mnil_)); auto.
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
inversion_clear H.
apply s_AtL with
 (abs p53)
 (w + 1)
 (w)
 (madd (abs dNAdam *o pres mdm2 @ w + 1)
  mnil_)
 (madd (abs p53 @ w + 1)
  (madd (abs dNAdam *o pres mdm2 @ w + 1)
  mnil_)); auto.
apply s_ConjML with
 (abs dNAdam)
 (pres mdm2)
 (w + 1) 
 (madd (abs p53 @ w + 1)
  mnil_)
 (madd (abs p53 @ w + 1)
  (madd (abs dNAdam @ w + 1)
  (madd (pres mdm2 @ w + 1)
  mnil_))); auto.
unfold munion,madd; simpl; auto.
apply ms_perm231; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
unfold munion,madd; simpl; auto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
unfold step; auto.
apply s_DownR; auto.
apply s_AtR; auto.
apply s_ConjMR with
 (madd (abs p53 @ w + 1)
  (madd (pres mdm2 @ w + 1)
  mnil_))
 (madd (abs dNAdam @ w + 1)
  mnil_); auto.
unfold munion,madd; simpl; auto.
apply ms_eq_cons; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
apply ms_perm21; try (apply eqj_refl);
  try (apply eq_nat_refl); try (apply eqatm_refl); eauto.
repeat split; right; auto; intros [hh _];  repeat (inversion_clear 0).
apply s_ConjMR with
 (madd (abs p53 @ w + 1)
  mnil_)
 (madd (pres mdm2 @ w + 1)
  mnil_); auto.
apply s_init; auto.
apply s_init; auto.
apply s_init; auto.
(* End of subgoal *)
clear n; intros n A B h1 h2.
inversion h1.
Qed.

End property3.
