(**************************************************************** File: Property1.v Authors: Amy Felty Version: Coq V8.4pl2 Date: January 2014 Property 1 (Versions 1 and 2) 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 property1. Let Gamma := system. Theorem Property1V1 : forall (w:world), exists (u v:world), (u < 3 /\ v < 3 /\ seq_ Gamma (madd (pres dNAdam *o state0 @ w) mnil_) (delt_ u ((state1 *o dont_care dNAdam) &a (delt_ v (state0 *o dont_care dNAdam))) @ w)). Proof. intro w; exists 2; exists 2; split; auto; split; auto. unfold state1,state0,dont_care. (* automatically generated proof starts here *) apply s_ConjML with (pres dNAdam) (abs p53 *o pres mdm2) (w) mnil_ (madd (pres dNAdam @ w) (madd (abs p53 *o pres mdm2 @ w) mnil_)); auto. apply s_ConjML with (abs p53) (pres mdm2) (w) (madd (pres dNAdam @ w) mnil_) (madd (pres dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ 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). 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 delt_; auto. apply s_DownR; auto. apply s_AtR; auto. apply s_copy with (dagger rule1) (0) (madd (dagger rule1 @ 0) (madd (pres dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ w) mnil_)))); simpl; auto. unfold rule1; auto. unfold dagger; auto. apply s_WallL with (fun W1 => (pres dNAdam +o (pres dNAdam *o pres mdm2) +o (pres dNAdam *o abs mdm2) ->> step (pres dNAdam *o abs 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 (pres dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ w) mnil_))) (madd ((pres dNAdam +o (pres dNAdam *o pres mdm2) +o (pres dNAdam *o abs mdm2) ->> step (pres dNAdam *o abs 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 (pres dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ w) mnil_)))); auto. apply s_AtL with (pres dNAdam +o (pres dNAdam *o pres mdm2) +o (pres dNAdam *o abs mdm2) ->> step (pres dNAdam *o abs 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 (pres dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ w) mnil_))) (madd (pres dNAdam +o (pres dNAdam *o pres mdm2) +o (pres dNAdam *o abs mdm2) ->> step (pres dNAdam *o abs 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 dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ w) mnil_)))); auto. apply s_ImpL with (pres dNAdam +o (pres dNAdam *o pres mdm2) +o (pres dNAdam *o abs mdm2)) (step (pres dNAdam *o abs 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 dNAdam @ w) (madd (pres mdm2 @ w) mnil_)) (madd (abs p53 @ w) mnil_) (madd (step (pres dNAdam *o abs 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_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_DisjAR1; auto. apply s_DisjAR2; auto. apply s_ConjMR with (madd (pres dNAdam @ w) mnil_) (madd (pres mdm2 @ w) mnil_); auto. apply s_init; auto. apply s_init; auto. apply s_ConjML with (step (pres dNAdam *o abs 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 (pres dNAdam *o abs 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 (pres dNAdam *o abs mdm2) @ w) (madd (abs p53 @ w) mnil_)) (madd (step (pres dNAdam *o abs 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 (pres dNAdam *o abs 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 (pres dNAdam *o abs 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 (pres dNAdam *o abs mdm2) @ w) (madd (abs p53 @ w) mnil_)) (madd (abs p53 at w ->> abs p53 at (w + 1) @ w) (madd (step (pres dNAdam *o abs 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 (pres dNAdam *o abs mdm2) @ w) mnil_) (madd (abs p53 at (w + 1) @ w) (madd (step (pres dNAdam *o abs 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 => (pres dNAdam *o abs mdm2) at (W1 + 1)) (w) (madd (abs p53 at (w + 1) @ w) mnil_) (madd (abs p53 at (w + 1) @ w) (madd ((pres dNAdam *o abs 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). 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 dNAdam *o abs mdm2) (w + 1) (w) (madd (abs p53 at (w + 1) @ w) mnil_) (madd (abs p53 at (w + 1) @ w) (madd (pres dNAdam *o abs 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 (pres dNAdam *o abs mdm2 @ w + 1) mnil_) (madd (abs p53 @ w + 1) (madd (pres dNAdam *o abs mdm2 @ w + 1) mnil_)); auto. apply s_ConjML with (pres dNAdam) (abs mdm2) (w + 1) (madd (abs p53 @ w + 1) mnil_) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs 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). apply s_copy with (dagger rule2) (0) (madd (dagger rule2 @ 0) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs mdm2 @ w + 1) mnil_)))); simpl; auto. unfold rule2; auto. unfold dagger; auto. apply s_WallL with (fun W1 => (abs mdm2 +o (abs mdm2 *o pres p53) +o (abs mdm2 *o abs p53) ->> step (abs mdm2 *o pres 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 + 1) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs mdm2 @ w + 1) mnil_))) (madd ((abs mdm2 +o (abs mdm2 *o pres p53) +o (abs mdm2 *o abs p53) ->> step (abs mdm2 *o pres 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 + 1) @ 0) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs mdm2 @ w + 1) mnil_)))); auto. apply s_AtL with (abs mdm2 +o (abs mdm2 *o pres p53) +o (abs mdm2 *o abs p53) ->> step (abs mdm2 *o pres 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 + 1) (0) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs mdm2 @ w + 1) mnil_))) (madd (abs mdm2 +o (abs mdm2 *o pres p53) +o (abs mdm2 *o abs p53) ->> step (abs mdm2 *o pres 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 + 1) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs mdm2 @ w + 1) mnil_)))); auto. apply s_ImpL with (abs mdm2 +o (abs mdm2 *o pres p53) +o (abs mdm2 *o abs p53)) (step (abs mdm2 *o pres 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 + 1) (madd (abs p53 @ w + 1) (madd (abs mdm2 @ w + 1) mnil_)) (madd (pres dNAdam @ w + 1) mnil_) (madd (step (abs mdm2 *o pres 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 + 1) (madd (pres 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_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_DisjAR2; auto. apply s_ConjMR with (madd (abs mdm2 @ w + 1) mnil_) (madd (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). apply s_init; auto. apply s_init; auto. apply s_ConjML with (step (abs mdm2 *o pres p53)) (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1))))) (w + 1) (madd (pres dNAdam @ w + 1) mnil_) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ w + 1) (madd (pres dNAdam @ w + 1) 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 + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (pres dNAdam @ w + 1) mnil_)) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (!! ((pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1)) &a (abs dNAdam at (w + 1) ->> abs dNAdam at (w + 1 + 1))) @ w + 1) (madd (pres dNAdam @ 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). specialize (H 0); repeat (inversion_clear 0). apply s_BangL with ((pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1)) &a (abs dNAdam at (w + 1) ->> abs dNAdam at (w + 1 + 1))) (w + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (pres dNAdam @ 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_copy with ((pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1)) &a (abs dNAdam at (w + 1) ->> abs dNAdam at (w + 1 + 1))) (w + 1) (madd ((pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1)) &a (abs dNAdam at (w + 1) ->> abs dNAdam at (w + 1 + 1)) @ w + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (pres dNAdam @ w + 1) mnil_))); simpl; auto. apply s_ConjAL1 with (pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1)) (abs dNAdam at (w + 1) ->> abs dNAdam at (w + 1 + 1)) (w + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (pres dNAdam @ w + 1) mnil_)) (madd (pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1) @ w + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (pres dNAdam @ w + 1) mnil_))); auto. apply s_ImpL with (pres dNAdam at (w + 1)) (pres dNAdam at (w + 1 + 1)) (w + 1) (madd (pres dNAdam @ w + 1) mnil_) (madd (step (abs mdm2 *o pres p53) @ w + 1) mnil_) (madd (pres dNAdam at (w + 1 + 1) @ w + 1) (madd (step (abs mdm2 *o pres p53) @ 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_AtR; auto. apply s_init; auto. apply s_AtL with (pres dNAdam) (w + 1 + 1) (w + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) mnil_) (madd (pres dNAdam @ w + 1 + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) mnil_)); auto. unfold step; auto. apply s_DownL with (fun W1 => (abs mdm2 *o pres p53) at (W1 + 1)) (w + 1) (madd (pres dNAdam @ w + 1 + 1) mnil_) (madd (pres dNAdam @ w + 1 + 1) (madd ((abs mdm2 *o pres p53) at (w + 1 + 1) @ 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). apply s_AtL with (abs mdm2 *o pres p53) (w + 1 + 1) (w + 1) (madd (pres dNAdam @ w + 1 + 1) mnil_) (madd (pres dNAdam @ w + 1 + 1) (madd (abs mdm2 *o pres p53 @ w + 1 + 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). apply s_ConjML with (abs mdm2) (pres p53) (w + 1 + 1) (madd (pres dNAdam @ w + 1 + 1) mnil_) (madd (pres dNAdam @ w + 1 + 1) (madd (abs mdm2 @ w + 1 + 1) (madd (pres p53 @ w + 1 + 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). apply s_ConjAR; auto. apply s_ConjMR with (madd (abs mdm2 @ w + 1 + 1) (madd (pres p53 @ w + 1 + 1) mnil_)) (madd (pres dNAdam @ w + 1 + 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 (pres p53 @ w + 1 + 1) mnil_) (madd (abs mdm2 @ w + 1 + 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). replace (w+2) with (w+1+1); try omega. apply s_init; auto. replace (w+2) with (w+1+1); try omega. apply s_init; auto. apply s_DisjAR1; auto. replace (w+2) with (w+1+1); try omega. apply s_init; auto. unfold delt_; auto. apply s_DownR; auto. apply s_AtR; auto. apply s_copy with (dagger rule3) (0) (madd (dagger rule3 @ 0) (madd (pres dNAdam @ w + 1 + 1) (madd (abs mdm2 @ w + 1 + 1) (madd (pres p53 @ w + 1 + 1) mnil_)))); simpl; auto. right; right; right; right; left. simpl; auto. unfold rule3; auto. unfold dagger; auto. apply s_WallL with (fun W1 => (pres p53 +o (pres p53 *o pres mdm2) +o (pres p53 *o abs mdm2) ->> step (pres p53 *o pres mdm2) *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 + 2) (madd (pres dNAdam @ w + 1 + 1) (madd (abs mdm2 @ w + 1 + 1) (madd (pres p53 @ w + 1 + 1) mnil_))) (madd ((pres p53 +o (pres p53 *o pres mdm2) +o (pres p53 *o abs mdm2) ->> step (pres p53 *o pres mdm2) *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 + 2) @ 0) (madd (pres dNAdam @ w + 1 + 1) (madd (abs mdm2 @ w + 1 + 1) (madd (pres p53 @ w + 1 + 1) mnil_)))); auto. apply s_AtL with (pres p53 +o (pres p53 *o pres mdm2) +o (pres p53 *o abs mdm2) ->> step (pres p53 *o pres mdm2) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1))))) (w + 2) (0) (madd (pres dNAdam @ w + 1 + 1) (madd (abs mdm2 @ w + 1 + 1) (madd (pres p53 @ w + 1 + 1) mnil_))) (madd (pres p53 +o (pres p53 *o pres mdm2) +o (pres p53 *o abs mdm2) ->> step (pres p53 *o pres mdm2) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ w + 2) (madd (pres dNAdam @ w + 1 + 1) (madd (abs mdm2 @ w + 1 + 1) (madd (pres p53 @ w + 1 + 1) mnil_)))); auto. apply s_ImpL with (pres p53 +o (pres p53 *o pres mdm2) +o (pres p53 *o abs mdm2)) (step (pres p53 *o pres mdm2) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1))))) (w + 2) (madd (abs mdm2 @ w + 1 + 1) (madd (pres p53 @ w + 1 + 1) mnil_)) (madd (pres dNAdam @ w + 1 + 1) mnil_) (madd (step (pres p53 *o pres mdm2) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ w + 2) (madd (pres dNAdam @ w + 1 + 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_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_DisjAR2; auto. apply s_ConjMR with (madd (pres p53 @ w + 1 + 1) mnil_) (madd (abs mdm2 @ w + 1 + 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). replace (w+2) with (w+1+1); try omega. apply s_init; auto. replace (w+2) with (w+1+1); try omega. apply s_init; auto. apply s_ConjML with (step (pres p53 *o pres mdm2)) (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1))))) (w + 2) (madd (pres dNAdam @ w + 1 + 1) mnil_) (madd (step (pres p53 *o pres mdm2) @ w + 2) (madd (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ w + 2) (madd (pres dNAdam @ w + 1 + 1) 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 + 2) (madd (step (pres p53 *o pres mdm2) @ w + 2) (madd (pres dNAdam @ w + 1 + 1) mnil_)) (madd (step (pres p53 *o pres mdm2) @ w + 2) (madd (!! ((pres dNAdam at (w + 2) ->> pres dNAdam at (w + 2 + 1)) &a (abs dNAdam at (w + 2) ->> abs dNAdam at (w + 2 + 1))) @ w + 2) (madd (pres dNAdam @ w + 1 + 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). specialize (H 0); repeat (inversion_clear 0). apply s_BangL with ((pres dNAdam at (w + 2) ->> pres dNAdam at (w + 2 + 1)) &a (abs dNAdam at (w + 2) ->> abs dNAdam at (w + 2 + 1))) (w + 2) (madd (step (pres p53 *o pres mdm2) @ w + 2) (madd (pres dNAdam @ w + 1 + 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_copy with ((pres dNAdam at (w + 2) ->> pres dNAdam at (w + 2 + 1)) &a (abs dNAdam at (w + 2) ->> abs dNAdam at (w + 2 + 1))) (w + 2) (madd ((pres dNAdam at (w + 2) ->> pres dNAdam at (w + 2 + 1)) &a (abs dNAdam at (w + 2) ->> abs dNAdam at (w + 2 + 1)) @ w + 2) (madd (step (pres p53 *o pres mdm2) @ w + 2) (madd (pres dNAdam @ w + 1 + 1) mnil_))); simpl; auto. apply s_ConjAL1 with (pres dNAdam at (w + 2) ->> pres dNAdam at (w + 2 + 1)) (abs dNAdam at (w + 2) ->> abs dNAdam at (w + 2 + 1)) (w + 2) (madd (step (pres p53 *o pres mdm2) @ w + 2) (madd (pres dNAdam @ w + 1 + 1) mnil_)) (madd (pres dNAdam at (w + 2) ->> pres dNAdam at (w + 2 + 1) @ w + 2) (madd (step (pres p53 *o pres mdm2) @ w + 2) (madd (pres dNAdam @ w + 1 + 1) mnil_))); auto. apply s_ImpL with (pres dNAdam at (w + 2)) (pres dNAdam at (w + 2 + 1)) (w + 2) (madd (pres dNAdam @ w + 1 + 1) mnil_) (madd (step (pres p53 *o pres mdm2) @ w + 2) mnil_) (madd (pres dNAdam at (w + 2 + 1) @ w + 2) (madd (step (pres p53 *o pres mdm2) @ w + 2) 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. replace (w+2) with (w+1+1); try omega. apply s_init; auto. apply s_AtL with (pres dNAdam) (w + 2 + 1) (w + 2) (madd (step (pres p53 *o pres mdm2) @ w + 2) mnil_) (madd (pres dNAdam @ w + 2 + 1) (madd (step (pres p53 *o pres mdm2) @ w + 2) mnil_)); auto. unfold step; auto. apply s_DownL with (fun W1 => (pres p53 *o pres mdm2) at (W1 + 1)) (w + 2) (madd (pres dNAdam @ w + 2 + 1) mnil_) (madd (pres dNAdam @ w + 2 + 1) (madd ((pres p53 *o pres mdm2) at (w + 2 + 1) @ w + 2) 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). apply s_AtL with (pres p53 *o pres mdm2) (w + 2 + 1) (w + 2) (madd (pres dNAdam @ w + 2 + 1) mnil_) (madd (pres dNAdam @ w + 2 + 1) (madd (pres p53 *o pres mdm2 @ w + 2 + 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). apply s_ConjML with (pres p53) (pres mdm2) (w + 2 + 1) (madd (pres dNAdam @ w + 2 + 1) mnil_) (madd (pres dNAdam @ w + 2 + 1) (madd (pres p53 @ w + 2 + 1) (madd (pres mdm2 @ w + 2 + 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). apply s_copy with (dagger rule4) (0) (madd (dagger rule4 @ 0) (madd (pres dNAdam @ w + 2 + 1) (madd (pres p53 @ w + 2 + 1) (madd (pres mdm2 @ w + 2 + 1) mnil_)))); simpl; auto. right; right; right; right; right; right; left. 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 + 3) (madd (pres dNAdam @ w + 2 + 1) (madd (pres p53 @ w + 2 + 1) (madd (pres mdm2 @ w + 2 + 1) 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 + 3) @ 0) (madd (pres dNAdam @ w + 2 + 1) (madd (pres p53 @ w + 2 + 1) (madd (pres mdm2 @ w + 2 + 1) 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 + 3) (0) (madd (pres dNAdam @ w + 2 + 1) (madd (pres p53 @ w + 2 + 1) (madd (pres mdm2 @ w + 2 + 1) 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 + 3) (madd (pres dNAdam @ w + 2 + 1) (madd (pres p53 @ w + 2 + 1) (madd (pres mdm2 @ w + 2 + 1) 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 + 3) (madd (pres p53 @ w + 2 + 1) (madd (pres mdm2 @ w + 2 + 1) mnil_)) (madd (pres dNAdam @ w + 2 + 1) 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 + 3) (madd (pres dNAdam @ w + 2 + 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_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 (pres mdm2 @ w + 2 + 1) mnil_) (madd (pres p53 @ w + 2 + 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). replace (w+3) with (w+2+1); try omega. apply s_init; auto. replace (w+3) with (w+2+1); try omega. 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 + 3) (madd (pres dNAdam @ w + 2 + 1) mnil_) (madd (step (pres mdm2 *o abs p53) @ w + 3) (madd (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ w + 3) (madd (pres dNAdam @ w + 2 + 1) 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 + 3) (madd (step (pres mdm2 *o abs p53) @ w + 3) (madd (pres dNAdam @ w + 2 + 1) mnil_)) (madd (step (pres mdm2 *o abs p53) @ w + 3) (madd (!! ((pres dNAdam at (w + 3) ->> pres dNAdam at (w + 3 + 1)) &a (abs dNAdam at (w + 3) ->> abs dNAdam at (w + 3 + 1))) @ w + 3) (madd (pres dNAdam @ w + 2 + 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). specialize (H 0); repeat (inversion_clear 0). apply s_BangL with ((pres dNAdam at (w + 3) ->> pres dNAdam at (w + 3 + 1)) &a (abs dNAdam at (w + 3) ->> abs dNAdam at (w + 3 + 1))) (w + 3) (madd (step (pres mdm2 *o abs p53) @ w + 3) (madd (pres dNAdam @ w + 2 + 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_copy with ((pres dNAdam at (w + 3) ->> pres dNAdam at (w + 3 + 1)) &a (abs dNAdam at (w + 3) ->> abs dNAdam at (w + 3 + 1))) (w + 3) (madd ((pres dNAdam at (w + 3) ->> pres dNAdam at (w + 3 + 1)) &a (abs dNAdam at (w + 3) ->> abs dNAdam at (w + 3 + 1)) @ w + 3) (madd (step (pres mdm2 *o abs p53) @ w + 3) (madd (pres dNAdam @ w + 2 + 1) mnil_))); simpl; auto. apply s_ConjAL1 with (pres dNAdam at (w + 3) ->> pres dNAdam at (w + 3 + 1)) (abs dNAdam at (w + 3) ->> abs dNAdam at (w + 3 + 1)) (w + 3) (madd (step (pres mdm2 *o abs p53) @ w + 3) (madd (pres dNAdam @ w + 2 + 1) mnil_)) (madd (pres dNAdam at (w + 3) ->> pres dNAdam at (w + 3 + 1) @ w + 3) (madd (step (pres mdm2 *o abs p53) @ w + 3) (madd (pres dNAdam @ w + 2 + 1) mnil_))); auto. apply s_ImpL with (pres dNAdam at (w + 3)) (pres dNAdam at (w + 3 + 1)) (w + 3) (madd (pres dNAdam @ w + 2 + 1) mnil_) (madd (step (pres mdm2 *o abs p53) @ w + 3) mnil_) (madd (pres dNAdam at (w + 3 + 1) @ w + 3) (madd (step (pres mdm2 *o abs p53) @ w + 3) 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. replace (w+3) with (w+2+1); try omega. apply s_init; auto. apply s_AtL with (pres dNAdam) (w + 3 + 1) (w + 3) (madd (step (pres mdm2 *o abs p53) @ w + 3) mnil_) (madd (pres dNAdam @ w + 3 + 1) (madd (step (pres mdm2 *o abs p53) @ w + 3) mnil_)); auto. unfold step; auto. apply s_DownL with (fun W1 => (pres mdm2 *o abs p53) at (W1 + 1)) (w + 3) (madd (pres dNAdam @ w + 3 + 1) mnil_) (madd (pres dNAdam @ w + 3 + 1) (madd ((pres mdm2 *o abs p53) at (w + 3 + 1) @ w + 3) 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). apply s_AtL with (pres mdm2 *o abs p53) (w + 3 + 1) (w + 3) (madd (pres dNAdam @ w + 3 + 1) mnil_) (madd (pres dNAdam @ w + 3 + 1) (madd (pres mdm2 *o abs p53 @ w + 3 + 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). apply s_ConjML with (pres mdm2) (abs p53) (w + 3 + 1) (madd (pres dNAdam @ w + 3 + 1) mnil_) (madd (pres dNAdam @ w + 3 + 1) (madd (pres mdm2 @ w + 3 + 1) (madd (abs p53 @ w + 3 + 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). apply s_ConjMR with (madd (pres mdm2 @ w + 3 + 1) (madd (abs p53 @ w + 3 + 1) mnil_)) (madd (pres dNAdam @ w + 3 + 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 + 3 + 1) mnil_) (madd (pres mdm2 @ w + 3 + 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). replace (w+2+2) with (w+3+1); try omega. apply s_init; auto. replace (w+2+2) with (w+3+1); try omega. apply s_init; auto. apply s_DisjAR1; auto. replace (w+2+2) with (w+3+1); try omega. apply s_init; auto. Qed. Theorem Property1V2 : forall (w:world), exists (u v:world), (u < 3 /\ v < 3 /\ seq_ Gamma (madd (pres dNAdam *o state0 @ w) mnil_) (state1 *o dont_care dNAdam @ w+u) /\ seq_ Gamma (madd (state1 @ w+u) mnil_) (state0 @ w+u+v)). Proof. intro w; exists 2; exists 2; unfold state1,state0,dont_care; repeat (split; auto). (* first automatically generated proof starts here *) apply s_ConjML with (pres dNAdam) (abs p53 *o pres mdm2) (w) mnil_ (madd (pres dNAdam @ w) (madd (abs p53 *o pres mdm2 @ w) mnil_)); auto. apply s_ConjML with (abs p53) (pres mdm2) (w) (madd (pres dNAdam @ w) mnil_) (madd (pres dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ 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). 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 (dagger rule1) (0) (madd (dagger rule1 @ 0) (madd (pres dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ w) mnil_)))); simpl; auto. unfold rule1; auto. unfold dagger; auto. apply s_WallL with (fun W1 => (pres dNAdam +o (pres dNAdam *o pres mdm2) +o (pres dNAdam *o abs mdm2) ->> step (pres dNAdam *o abs 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 (pres dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ w) mnil_))) (madd ((pres dNAdam +o (pres dNAdam *o pres mdm2) +o (pres dNAdam *o abs mdm2) ->> step (pres dNAdam *o abs 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 (pres dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ w) mnil_)))); auto. apply s_AtL with (pres dNAdam +o (pres dNAdam *o pres mdm2) +o (pres dNAdam *o abs mdm2) ->> step (pres dNAdam *o abs 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 (pres dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ w) mnil_))) (madd (pres dNAdam +o (pres dNAdam *o pres mdm2) +o (pres dNAdam *o abs mdm2) ->> step (pres dNAdam *o abs 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 dNAdam @ w) (madd (abs p53 @ w) (madd (pres mdm2 @ w) mnil_)))); auto. apply s_ImpL with (pres dNAdam +o (pres dNAdam *o pres mdm2) +o (pres dNAdam *o abs mdm2)) (step (pres dNAdam *o abs 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 dNAdam @ w) (madd (pres mdm2 @ w) mnil_)) (madd (abs p53 @ w) mnil_) (madd (step (pres dNAdam *o abs 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_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_DisjAR1; auto. apply s_DisjAR2; auto. apply s_ConjMR with (madd (pres dNAdam @ w) mnil_) (madd (pres mdm2 @ w) mnil_); auto. apply s_init; auto. apply s_init; auto. apply s_ConjML with (step (pres dNAdam *o abs 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 (pres dNAdam *o abs 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 (pres dNAdam *o abs mdm2) @ w) (madd (abs p53 @ w) mnil_)) (madd (step (pres dNAdam *o abs 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 (pres dNAdam *o abs 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 (pres dNAdam *o abs 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 (pres dNAdam *o abs mdm2) @ w) (madd (abs p53 @ w) mnil_)) (madd (abs p53 at w ->> abs p53 at (w + 1) @ w) (madd (step (pres dNAdam *o abs 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 (pres dNAdam *o abs mdm2) @ w) mnil_) (madd (abs p53 at (w + 1) @ w) (madd (step (pres dNAdam *o abs 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 => (pres dNAdam *o abs mdm2) at (W1 + 1)) (w) (madd (abs p53 at (w + 1) @ w) mnil_) (madd (abs p53 at (w + 1) @ w) (madd ((pres dNAdam *o abs 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 (pres dNAdam *o abs mdm2) (w + 1) (w) (madd (abs p53 at (w + 1) @ w) mnil_) (madd (abs p53 at (w + 1) @ w) (madd (pres dNAdam *o abs 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). repeat (inversion_clear H). apply s_AtL with (abs p53) (w + 1) (w) (madd (pres dNAdam *o abs mdm2 @ w + 1) mnil_) (madd (abs p53 @ w + 1) (madd (pres dNAdam *o abs mdm2 @ w + 1) mnil_)); auto. apply s_ConjML with (pres dNAdam) (abs mdm2) (w + 1) (madd (abs p53 @ w + 1) mnil_) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs 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). apply s_copy with (dagger rule2) (0) (madd (dagger rule2 @ 0) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs mdm2 @ w + 1) mnil_)))); simpl; auto. unfold rule2; auto. unfold dagger; auto. apply s_WallL with (fun W1 => (abs mdm2 +o (abs mdm2 *o pres p53) +o (abs mdm2 *o abs p53) ->> step (abs mdm2 *o pres 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 + 1) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs mdm2 @ w + 1) mnil_))) (madd ((abs mdm2 +o (abs mdm2 *o pres p53) +o (abs mdm2 *o abs p53) ->> step (abs mdm2 *o pres 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 + 1) @ 0) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs mdm2 @ w + 1) mnil_)))); auto. apply s_AtL with (abs mdm2 +o (abs mdm2 *o pres p53) +o (abs mdm2 *o abs p53) ->> step (abs mdm2 *o pres 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 + 1) (0) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs mdm2 @ w + 1) mnil_))) (madd (abs mdm2 +o (abs mdm2 *o pres p53) +o (abs mdm2 *o abs p53) ->> step (abs mdm2 *o pres 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 + 1) (madd (abs p53 @ w + 1) (madd (pres dNAdam @ w + 1) (madd (abs mdm2 @ w + 1) mnil_)))); auto. apply s_ImpL with (abs mdm2 +o (abs mdm2 *o pres p53) +o (abs mdm2 *o abs p53)) (step (abs mdm2 *o pres 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 + 1) (madd (abs p53 @ w + 1) (madd (abs mdm2 @ w + 1) mnil_)) (madd (pres dNAdam @ w + 1) mnil_) (madd (step (abs mdm2 *o pres 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 + 1) (madd (pres 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_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_DisjAR2; auto. apply s_ConjMR with (madd (abs mdm2 @ w + 1) mnil_) (madd (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). apply s_init; auto. apply s_init; auto. apply s_ConjML with (step (abs mdm2 *o pres p53)) (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1))))) (w + 1) (madd (pres dNAdam @ w + 1) mnil_) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ w + 1) (madd (pres dNAdam @ w + 1) 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 + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (pres dNAdam @ w + 1) mnil_)) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (!! ((pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1)) &a (abs dNAdam at (w + 1) ->> abs dNAdam at (w + 1 + 1))) @ w + 1) (madd (pres dNAdam @ 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). specialize (H 0); repeat (inversion_clear 0). apply s_BangL with ((pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1)) &a (abs dNAdam at (w + 1) ->> abs dNAdam at (w + 1 + 1))) (w + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (pres dNAdam @ 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_copy with ((pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1)) &a (abs dNAdam at (w + 1) ->> abs dNAdam at (w + 1 + 1))) (w + 1) (madd ((pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1)) &a (abs dNAdam at (w + 1) ->> abs dNAdam at (w + 1 + 1)) @ w + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (pres dNAdam @ w + 1) mnil_))); simpl; auto. apply s_ConjAL1 with (pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1)) (abs dNAdam at (w + 1) ->> abs dNAdam at (w + 1 + 1)) (w + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (pres dNAdam @ w + 1) mnil_)) (madd (pres dNAdam at (w + 1) ->> pres dNAdam at (w + 1 + 1) @ w + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) (madd (pres dNAdam @ w + 1) mnil_))); auto. apply s_ImpL with (pres dNAdam at (w + 1)) (pres dNAdam at (w + 1 + 1)) (w + 1) (madd (pres dNAdam @ w + 1) mnil_) (madd (step (abs mdm2 *o pres p53) @ w + 1) mnil_) (madd (pres dNAdam at (w + 1 + 1) @ w + 1) (madd (step (abs mdm2 *o pres p53) @ 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_AtR; auto. apply s_init; auto. apply s_AtL with (pres dNAdam) (w + 1 + 1) (w + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) mnil_) (madd (pres dNAdam @ w + 1 + 1) (madd (step (abs mdm2 *o pres p53) @ w + 1) mnil_)); auto. unfold step; auto. apply s_DownL with (fun W1 => (abs mdm2 *o pres p53) at (W1 + 1)) (w + 1) (madd (pres dNAdam @ w + 1 + 1) mnil_) (madd (pres dNAdam @ w + 1 + 1) (madd ((abs mdm2 *o pres p53) at (w + 1 + 1) @ 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). apply s_AtL with (abs mdm2 *o pres p53) (w + 1 + 1) (w + 1) (madd (pres dNAdam @ w + 1 + 1) mnil_) (madd (pres dNAdam @ w + 1 + 1) (madd (abs mdm2 *o pres p53 @ w + 1 + 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). apply s_ConjML with (abs mdm2) (pres p53) (w + 1 + 1) (madd (pres dNAdam @ w + 1 + 1) mnil_) (madd (pres dNAdam @ w + 1 + 1) (madd (abs mdm2 @ w + 1 + 1) (madd (pres p53 @ w + 1 + 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). apply s_ConjMR with (madd (abs mdm2 @ w + 1 + 1) (madd (pres p53 @ w + 1 + 1) mnil_)) (madd (pres dNAdam @ w + 1 + 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 (pres p53 @ w + 1 + 1) mnil_) (madd (abs mdm2 @ w + 1 + 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). replace (w+2) with (w+1+1); try omega. apply s_init; auto. replace (w+2) with (w+1+1); try omega. apply s_init; auto. apply s_DisjAR1; auto. replace (w+2) with (w+1+1); try omega. apply s_init; auto. (* second automatically generated proof starts here *) apply s_ConjML with (pres p53) (abs mdm2) (w+2) mnil_ (madd (pres p53 @ (w+2)) (madd (abs mdm2 @ (w+2)) mnil_)); auto. apply s_copy with (dagger rule3) (0) (madd (dagger rule3 @ 0) (madd (pres p53 @ (w+2)) (madd (abs mdm2 @ (w+2)) mnil_))); simpl; auto. unfold rule3; auto. unfold dagger; auto. apply s_WallL with (fun W1 => (pres p53 +o (pres p53 *o pres mdm2) +o (pres p53 *o abs mdm2) ->> step (pres p53 *o pres mdm2) *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+2) (madd (pres p53 @ (w+2)) (madd (abs mdm2 @ (w+2)) mnil_)) (madd ((pres p53 +o (pres p53 *o pres mdm2) +o (pres p53 *o abs mdm2) ->> step (pres p53 *o pres mdm2) *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+2) @ 0) (madd (pres p53 @ (w+2)) (madd (abs mdm2 @ (w+2)) mnil_))); auto. apply s_AtL with (pres p53 +o (pres p53 *o pres mdm2) +o (pres p53 *o abs mdm2) ->> step (pres p53 *o pres mdm2) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1))))) (w+2) (0) (madd (pres p53 @ (w+2)) (madd (abs mdm2 @ (w+2)) mnil_)) (madd (pres p53 +o (pres p53 *o pres mdm2) +o (pres p53 *o abs mdm2) ->> step (pres p53 *o pres mdm2) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ (w+2)) (madd (pres p53 @ (w+2)) (madd (abs mdm2 @ (w+2)) mnil_))); auto. apply s_ImpL with (pres p53 +o (pres p53 *o pres mdm2) +o (pres p53 *o abs mdm2)) (step (pres p53 *o pres mdm2) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1))))) (w+2) (madd (pres p53 @ (w+2)) (madd (abs mdm2 @ (w+2)) mnil_)) mnil_ (madd (step (pres p53 *o pres mdm2) *o down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ (w+2)) mnil_); auto. apply s_DisjAR2; auto. apply s_ConjMR with (madd (pres p53 @ (w+2)) mnil_) (madd (abs mdm2 @ (w+2)) mnil_); auto. apply s_init; auto. apply s_init; auto. apply s_ConjML with (step (pres p53 *o pres mdm2)) (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1))))) (w+2) mnil_ (madd (step (pres p53 *o pres mdm2) @ (w+2)) (madd (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ (w+2)) 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+2) (madd (step (pres p53 *o pres mdm2) @ (w+2)) mnil_) (madd (step (pres p53 *o pres mdm2) @ (w+2)) (madd (!! ((pres dNAdam at (w+2) ->> pres dNAdam at ((w+2) + 1)) &a (abs dNAdam at (w+2) ->> abs dNAdam at ((w+2) + 1))) @ (w+2)) 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+2) ->> pres dNAdam at ((w+2) + 1)) &a (abs dNAdam at (w+2) ->> abs dNAdam at ((w+2) + 1))) (w+2) (madd (step (pres p53 *o pres mdm2) @ (w+2)) 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 step; auto. apply s_DownL with (fun W1 => (pres p53 *o pres mdm2) at (W1 + 1)) (w+2) mnil_ (madd ((pres p53 *o pres mdm2) at (w+2+1) @ (w+2)) mnil_); auto. apply s_AtL with (pres p53 *o pres mdm2) (w+2+1) (w+2) mnil_ (madd (pres p53 *o pres mdm2 @ w+2+1) mnil_); auto. apply s_ConjML with (pres p53) (pres mdm2) (w+2 + 1) mnil_ (madd (pres p53 @ w+2 + 1) (madd (pres mdm2 @ w+2 + 1) mnil_)); auto. apply s_copy with (dagger rule4) (0) (madd (dagger rule4 @ 0) (madd (pres p53 @ w+2 + 1) (madd (pres mdm2 @ w+2 + 1) mnil_))); simpl; auto. unfold rule4,oo2daggerJudg; simpl; tauto. 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+2 + 1) (madd (pres p53 @ w+2 + 1) (madd (pres mdm2 @ w+2 + 1) 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+2 + 1) @ 0) (madd (pres p53 @ w+2 + 1) (madd (pres mdm2 @ w+2 + 1) 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+2 + 1) (0) (madd (pres p53 @ w+2 + 1) (madd (pres mdm2 @ w+2 + 1) 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+2 + 1) (madd (pres p53 @ w+2 + 1) (madd (pres mdm2 @ w+2 + 1) 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+2 + 1) (madd (pres p53 @ w+2 + 1) (madd (pres mdm2 @ w+2 + 1) mnil_)) 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+2 + 1) mnil_); auto. apply s_DisjAR1; auto. apply s_DisjAR2; auto. apply s_ConjMR with (madd (pres mdm2 @ w+2 + 1) mnil_) (madd (pres p53 @ w+2 + 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_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+2 + 1) mnil_ (madd (step (pres mdm2 *o abs p53) @ w+2 + 1) (madd (down (fun W1 => !! ((pres dNAdam at W1 ->> pres dNAdam at (W1 + 1)) &a (abs dNAdam at W1 ->> abs dNAdam at (W1 + 1)))) @ w+2 + 1) 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+2 + 1) (madd (step (pres mdm2 *o abs p53) @ w+2 + 1) mnil_) (madd (step (pres mdm2 *o abs p53) @ w+2 + 1) (madd (!! ((pres dNAdam at (w+2 + 1) ->> pres dNAdam at (w+2 + 1 + 1)) &a (abs dNAdam at (w+2 + 1) ->> abs dNAdam at (w+2 + 1 + 1))) @ w+2 + 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). specialize (H 0); repeat (inversion_clear 0). apply s_BangL with ((pres dNAdam at (w+2 + 1) ->> pres dNAdam at (w+2 + 1 + 1)) &a (abs dNAdam at (w+2 + 1) ->> abs dNAdam at (w+2 + 1 + 1))) (w+2 + 1) (madd (step (pres mdm2 *o abs p53) @ w+2 + 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 step; auto. apply s_DownL with (fun W1 => (pres mdm2 *o abs p53) at (W1 + 1)) (w+2 + 1) mnil_ (madd ((pres mdm2 *o abs p53) at (w+2 + 1 + 1) @ w+2 + 1) mnil_); auto. apply s_AtL with (pres mdm2 *o abs p53) (w+2 + 1 + 1) (w+2 + 1) mnil_ (madd (pres mdm2 *o abs p53 @ w+2 + 1 + 1) mnil_); auto. apply s_ConjML with (pres mdm2) (abs p53) (w+2 + 1 + 1) mnil_ (madd (pres mdm2 @ w+2 + 1 + 1) (madd (abs p53 @ w+2 + 1 + 1) mnil_)); auto. apply s_ConjMR with (madd (abs p53 @ w+2 + 1 + 1) mnil_) (madd (pres mdm2 @ w+2 + 1 + 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). replace (w+2+2) with (w+2+1+1); try omega. apply s_init; auto. replace (w+2+2) with (w+2+1+1); try omega. apply s_init; auto. Qed. End property1.