Library DistributedReferenceCounting.machine1.invariant7
Require Export DistributedReferenceCounting.machine1.invariant6.
Lemma parent_invariant_inductive :
∀ (c : Config) (t : class_trans c),
legal c →
(legal c →
∀ s : Site,
indirect_son1 c s → ∃ s1 : Site, direct_son c s1 ∧ ancestor c s1 s) →
legal (transition c t) →
∀ s : Site,
indirect_son1 (transition c t) s →
∃ s1 : Site,
direct_son (transition c t) s1 ∧ ancestor (transition c t) s1 s.
Proof.
simple induction t.
simpl in |- ×.
intros s1 s2 n n0 a H H0 Hnext.
intros.
elim (H0 H s).
intros.
split with x.
decompose [and] H2.
split.
elim H3; intros; apply direct_son_intro; auto.
simpl in |- *; auto.
intros.
apply inc_dec_not_in_post.
auto.
intro.
discriminate.
elim H4.
intros.
apply short.
elim H5.
intros.
apply parent_intro.
simpl in |- *; auto.
simpl in |- ×.
apply inc_dec_in_post.
auto.
intro; discriminate.
intros.
apply (long (copy_trans c s1 s2) s0 s3 s4).
auto.
elim H7.
intros.
apply parent_intro.
simpl in |- *; auto.
simpl in |- ×.
apply inc_dec_in_post.
auto.
intro; discriminate.
apply indirect_son1_intro.
elim H1.
intros.
auto.
elim H1.
intros.
generalize H3.
simpl in |- ×.
auto.
elim H1.
intros.
generalize H4.
simpl in |- ×.
case (eq_queue_dec s1 s0 s2 owner).
intro.
decompose [and] a0.
rewrite H5; rewrite H6.
rewrite post_here.
simpl in |- ×.
auto.
intro.
rewrite post_elsewhere.
auto.
auto.
simpl in |- ×.
intros s1 s2 e H H0 Hnext; intros.
elim (H0 H s).
intros.
split with x.
decompose [and] H2.
split.
elim H3.
intros.
apply direct_son_intro.
auto.
simpl in |- *; auto.
simpl in |- ×.
intros.
apply inc_dec_not_in_collect with (m := dec).
auto.
auto.
discriminate.
elim H4.
intros.
apply short.
apply parent_intro.
simpl in |- ×.
elim H5.
auto.
simpl in |- ×.
apply inc_dec_in_collect with (m := dec).
auto.
elim H5.
auto.
discriminate.
intros.
apply (long (rec_dec_trans c s1 s2) s0 s3 s4).
auto.
elim H7.
intros.
apply parent_intro.
simpl in |- *; auto.
simpl in |- *; apply inc_dec_in_collect with (m := dec).
auto.
auto.
discriminate.
elim H1.
intros.
apply indirect_son1_intro.
auto.
generalize H3.
simpl in |- ×.
auto.
generalize H4.
simpl in |- ×.
case (eq_queue_dec s1 s0 s2 owner).
intro.
decompose [and] a.
rewrite H6; rewrite H5.
rewrite collect_here.
unfold not in |- ×.
intros.
elim H7.
intro.
generalize (inc_dec_not_in_first_out (bm c s0 owner) dec s3).
unfold not in |- ×.
intro.
intro.
apply H9.
auto.
auto.
rewrite <- H6; rewrite <- H5; auto.
discriminate.
generalize (H8 s3).
auto.
auto.
intro.
rewrite collect_elsewhere.
auto.
auto.
simpl in |- ×.
intros s1 s3 e H H0 Hnext; intros.
elim (decide_rt c s1).
intro.
elim (H0 H s).
intros.
decompose [and] H2.
split with x.
split.
elim H3; intros; apply direct_son_intro; auto.
simpl in |- ×.
rewrite post_elsewhere.
rewrite collect_elsewhere.
auto.
left.
generalize (not_inc_dec_in (bm c s0 owner) H7).
intro.
unfold not in |- *; intro.
elim (H8 s3).
apply first_in.
rewrite <- H9; auto.
left; auto.
elim H4.
intros; apply short.
elim H5; intros.
apply parent_intro.
simpl in |- *; auto.
simpl in |- ×.
apply
(inc_dec_in_post (Collect_message Message (bm c) s1 owner) s5 s4 owner s3).
rewrite collect_elsewhere.
auto.
left.
unfold not in |- *; intro.
rewrite H8 in a.
rewrite a in H6; discriminate.
intro; discriminate.
intros.
apply long with (s1 := s0).
auto.
elim H7.
intros; apply parent_intro.
simpl in |- *; auto.
simpl in |- ×.
apply
(inc_dec_in_post (Collect_message Message (bm c) s1 owner) s6 s5 owner s3).
rewrite collect_elsewhere; auto.
left; unfold not in |- *; intro.
rewrite H10 in a.
rewrite a in H8; discriminate.
intro; discriminate.
elim H1.
intros.
apply indirect_son1_intro.
auto.
generalize H3; simpl in |- *; auto.
generalize H4; simpl in |- ×.
rewrite post_elsewhere.
rewrite collect_elsewhere.
auto.
left.
unfold not in |- ×.
intro.
generalize H3; simpl in |- ×.
rewrite <- H5; rewrite a; auto with v62.
left; auto.
intro HA.
elim (H0 H s).
intros.
decompose [and] H2.
elim (decide_ancestor c x s s1).
intro.
elim (decide_direct_son (rec_inc_trans c s1 s3) s1).
intro.
split with s1.
split.
auto.
case (eq_site_dec s1 s).
intro.
generalize H1.
rewrite <- e0.
generalize e0.
elim a.
intros.
generalize H8 e0 e1.
elim H9.
intros.
elim H12.
rewrite e1; rewrite <- e2.
auto.
intro.
elim H5.
intuition.
intro.
generalize a e.
elim H6.
intros.
apply short.
generalize a0 e0.
elim H7.
intros.
apply parent_intro.
simpl in |- *; auto.
simpl in |- ×.
apply inc_dec_in_post.
cut (s4 ≠ s5).
intro.
rewrite collect_elsewhere.
auto.
left.
apply (not_reflexive c).
auto.
apply inc_dec_in.
auto.
apply (not_reflexive c).
auto.
apply inc_dec_in.
auto.
auto.
intro; discriminate.
intros.
apply (long (rec_inc_trans c s2 s3) s2 s0 s4).
apply H8.
auto.
auto.
generalize H7 a0 e0.
elim H9.
intros.
apply parent_intro.
simpl in |- *; auto.
simpl in |- ×.
apply inc_dec_in_post.
rewrite collect_elsewhere.
auto.
left.
generalize (parent_intro c s5 s6 H10 H11).
intro.
generalize (long c s2 s5 s6 H12 H13).
intro.
apply ancestor_not_reflexive with (c := c).
auto.
auto.
intro; discriminate.
intro.
split with x.
elim (direct_or_indirect_son1 (rec_inc_trans c s1 s3) s1).
intro; elim b; auto.
intro.
split.
generalize b; elim H3.
intro s0; intros.
apply direct_son_intro.
auto.
simpl in |- ×.
auto.
simpl in |- ×.
rewrite post_elsewhere.
case (eq_site_dec s1 s0).
intro.
intro.
rewrite e0.
unfold not in |- *; intro.
generalize (H8 s2).
intro.
elim H10.
apply (inc_dec_in_collect2 (bm c) (inc_dec s3) s0 s1 owner s2).
auto.
rewrite e0; auto.
intro.
rewrite collect_elsewhere.
auto.
left; auto.
left; auto.
generalize b0; elim H4.
intros.
apply short.
generalize b1; elim H6.
intros.
apply parent_intro.
simpl in |- *; auto.
simpl in |- ×.
case (eq_queue_dec owner s5 s3 owner).
intro.
case (eq_site_dec s1 s5).
intro.
decompose [and] a.
generalize e.
rewrite e0; rewrite <- H9.
rewrite empty_q_to_me.
simpl in |- ×.
intro; discriminate.
auto.
intro.
decompose [and] a.
rewrite H10; rewrite H9.
rewrite post_here.
rewrite collect_elsewhere.
simpl in |- ×.
generalize H8; rewrite H9; auto.
left; auto.
intro.
rewrite post_elsewhere.
case (eq_site_dec s1 s5).
intro.
generalize e0.
generalize o.
elim b2.
simpl in |- ×.
intros.
generalize H11.
rewrite post_elsewhere.
rewrite e0.
rewrite e1.
auto.
generalize e.
rewrite e0.
generalize H8.
rewrite collect_here.
elim (bm c s5 owner).
simpl in |- ×.
intuition.
intros d q.
case q.
simpl in |- ×.
intros.
elim H14.
intro.
unfold not in |- *; intro; contradiction.
case d.
simpl in |- ×.
auto.
simpl in |- ×.
auto.
simpl in |- *; auto.
auto.
intro; rewrite collect_elsewhere.
auto.
left; auto.
auto.
intros.
apply long with (s1 := s0).
generalize (H7 b1); intro.
auto.
elim H8.
intros.
apply parent_intro.
simpl in |- ×.
auto.
simpl in |- ×.
apply
(inc_dec_in_post (Collect_message Message (bm c) s1 owner) s6 s5 owner s3).
case (eq_site_dec s1 s6).
intro.
rewrite e0; rewrite collect_here.
generalize H10.
generalize e0; elim b1.
simpl in |- ×.
intros.
generalize H13; rewrite post_elsewhere.
rewrite e1.
rewrite e0.
rewrite collect_here.
generalize H14.
elim (bm c s6 owner).
simpl in |- *; intuition.
intros d q.
case q.
simpl in |- ×.
intros.
elim H17; intro; unfold not in |- *; intro; contradiction.
case d.
simpl in |- *; auto.
simpl in |- *; auto.
simpl in |- *; auto.
left; auto.
intro.
rewrite collect_elsewhere; auto.
intro; discriminate.
unfold not in |- *; intro.
generalize e; rewrite H6.
rewrite empty_q_to_me.
simpl in |- *; discriminate.
auto.
simpl in |- ×.
elim H5.
intro.
rewrite H6.
apply ancestor_rt2 with (s1 := x).
auto.
auto.
intro.
apply ancestor_rt with (s2 := s).
auto.
auto.
unfold not in |- *; intro.
generalize e; rewrite H6.
rewrite empty_q_to_me.
simpl in |- *; discriminate.
auto.
intro.
split with x.
split.
generalize H4 H5.
elim H3.
intros.
apply direct_son_intro.
auto.
simpl in |- *; auto.
simpl in |- ×.
rewrite post_elsewhere.
rewrite collect_elsewhere.
auto.
left.
unfold not in |- *; intro.
generalize (not_inc_dec_in (bm c s0 owner) H8).
intro.
generalize e; rewrite H11.
intro.
elim (H12 s3).
apply first_in.
auto.
left; auto.
generalize H5.
elim H4.
intros.
apply short.
generalize H7; elim H6.
intros.
apply parent_intro.
simpl in |- ×.
auto.
simpl in |- ×.
apply
(inc_dec_in_post (Collect_message Message (bm c) s1 owner) s5 s4 owner s3).
rewrite collect_elsewhere.
auto.
left.
decompose [and] H10; auto.
intro; discriminate.
intros.
apply long with (s1 := s0).
apply H7.
split.
decompose [and] H9.
unfold not in |- *; intro.
elim H11.
rewrite H12; apply short; auto.
decompose [and] H9.
unfold not in |- *; intro.
elim H11.
apply long with (s1 := s0).
auto.
auto.
generalize H9; elim H8.
intros.
apply parent_intro.
simpl in |- *; auto.
simpl in |- ×.
apply
(inc_dec_in_post (Collect_message Message (bm c) s1 owner) s6 s5 owner s3).
rewrite collect_elsewhere; auto.
left; decompose [and] H12; auto.
intro; discriminate.
auto.
auto.
apply indirect_son1_intro.
unfold not in |- *; intro.
generalize e; rewrite H5.
rewrite empty_q_to_me.
simpl in |- *; discriminate.
auto.
auto.
unfold not in |- *; intro.
generalize (not_inc_dec_in (bm c s1 owner) H5).
intro.
generalize (H6 s3).
elim (H6 s3).
apply first_in.
auto.
elim (decide_direct_son c s).
elim H1.
intros.
generalize H2 H3 H4; elim a.
intros.
unfold not in |- ×.
elim H10.
simpl in |- ×.
rewrite post_elsewhere.
rewrite collect_elsewhere.
auto.
left; unfold not in |- ×.
intro.
generalize e.
rewrite H11.
intro.
generalize (not_inc_dec_in (bm c s2 owner) H7).
intro.
elim (H12 s3).
apply first_in.
auto.
left; auto.
intro.
elim (direct_or_indirect_son1 c s).
intro; elim b; auto.
auto.
elim H1.
auto.
elim H1; auto.
elim H1; auto.
simpl in |- ×.
intros s1 s2 e e0 H H0 Hnext; intros.
elim (H0 H s).
intros.
split with x.
decompose [and] H2.
split.
elim H3; intros; apply direct_son_intro; auto.
simpl in |- *; auto.
intros.
apply inc_dec_not_in_post.
apply inc_dec_not_in_collect with (m := copy).
auto.
auto.
discriminate.
intro.
discriminate.
elim H4.
intros.
apply short.
elim H5.
intros.
apply parent_intro.
simpl in |- *; auto.
simpl in |- ×.
apply inc_dec_in_post.
apply inc_dec_in_collect with (m := copy).
auto.
auto.
discriminate.
intro.
discriminate.
intros.
apply long with (s1 := s3).
auto.
elim H7.
intros.
apply parent_intro.
simpl in |- *; auto.
simpl in |- ×.
apply inc_dec_in_post.
apply (inc_dec_in_collect (bm c) s6 s1 s2 s5 copy).
auto.
auto.
discriminate.
intro; discriminate.
elim H1.
intros.
apply indirect_son1_intro.
auto.
generalize H3.
simpl in |- ×.
auto.
generalize H4.
simpl in |- ×.
intro.
unfold not in |- ×.
intro.
elim H5.
intro.
generalize (H6 s3).
intro.
unfold not in |- ×.
intro.
elim H7.
generalize H8.
case (eq_queue_dec s2 s0 s1 owner).
intro.
decompose [and] a.
rewrite H9; rewrite H10.
rewrite post_here.
simpl in |- ×.
rewrite collect_elsewhere.
auto.
right; auto.
intro.
rewrite post_elsewhere.
case (eq_queue_dec s1 s0 s2 owner).
intro.
decompose [and] a.
rewrite H9; rewrite H10.
generalize (inc_dec_in_collect2 (bm c) copy s0 s0 owner s3).
intro.
intro.
apply H11.
rewrite <- H9; rewrite <- H10.
auto.
auto.
intro.
rewrite collect_elsewhere.
auto.
auto.
auto.
simpl in |- ×.
intros s2 e e0 H H0 Hnext; intros.
elim (direct_or_indirect_son1 (rec_copy2_trans c s2) s2).
intro.
elim (H0 H s).
intros.
split with x.
decompose [and] H2.
split.
elim H3.
intros.
apply direct_son_intro.
auto.
simpl in |- ×.
unfold Set_rec_table in |- *; rewrite other_site; auto.
unfold not in |- *; intro.
generalize e.
rewrite H8; rewrite H6; auto with v62.
simpl in |- ×.
rewrite collect_elsewhere; auto.
elim H4.
intros.
apply short.
elim H5; intros.
apply parent_intro.
simpl in |- ×.
unfold Set_rec_table in |- *; rewrite other_site; auto.
unfold not in |- *; intro.
generalize e; rewrite H8; rewrite H6; auto with v62.
simpl in |- ×.
case (eq_queue_dec owner s4 s2 owner).
intro; decompose [and] a0.
rewrite H9 in e.
rewrite <- H8 in H6.
rewrite H6 in e; discriminate.
intro; rewrite collect_elsewhere; auto.
intros.
apply long with (s1 := s1).
auto.
elim H7.
intros.
apply parent_intro.
simpl in |- ×.
unfold Set_rec_table in |- *; rewrite other_site; auto.
unfold not in |- *; intro.
generalize e; rewrite H10; rewrite H8; discriminate.
simpl in |- ×.
case (eq_queue_dec owner s5 s2 owner); intro.
decompose [and] a0.
rewrite H11 in e; rewrite <- H10 in H8; rewrite e in H8; discriminate.
rewrite collect_elsewhere; auto.
cut (s2 ≠ s).
elim H1.
intros.
apply indirect_son1_intro.
auto.
generalize H3; simpl in |- *; unfold Set_rec_table in |- *;
rewrite other_site; auto.
generalize H4; simpl in |- ×.
rewrite collect_elsewhere; auto.
unfold not in |- *; intro.
rewrite H2 in H1.
generalize H2 a; elim H1.
intros.
generalize H6 H5; elim a0; intros.
elim H11.
rewrite <- H10.
rewrite <- H2.
auto.
intro.
case (eq_site_dec s2 s).
intro.
elim (decide_inc_dec_in_queue (rec_copy2_trans c s2) s2).
intro.
elim a.
intros.
elim (decide_direct_son c x).
intro.
split with x.
split.
cut (s2 ≠ x).
elim a0.
intros.
apply direct_son_intro.
auto.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
simpl in |- ×.
rewrite collect_elsewhere; auto.
unfold not in |- *; intro.
rewrite <- H2 in a0.
generalize e; elim a0; intros.
rewrite e2 in H4; discriminate.
apply short.
rewrite <- e1.
apply parent_intro.
simpl in |- ×.
unfold Set_rec_table in |- *; rewrite that_site.
auto.
auto.
intro HA.
elim (H0 H x).
intros.
decompose [and] H2.
split with x0.
split.
cut (s2 ≠ x0).
elim H3.
intros.
apply direct_son_intro.
auto.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
simpl in |- ×.
rewrite collect_elsewhere; auto.
elim H3.
intros.
unfold not in |- *; intro.
generalize e; rewrite H8; rewrite H6; auto with v62.
apply long with (s1 := x).
elim H4.
intros.
apply short.
elim H5.
intros.
apply parent_intro.
simpl in |- ×.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
unfold not in |- *; intro.
generalize e; rewrite H8; rewrite H6; auto with v62.
simpl in |- ×.
rewrite collect_elsewhere; auto.
right; unfold not in |- *; intro; generalize e0.
rewrite H8; rewrite empty_q_to_me.
simpl in |- *; discriminate.
auto.
intros.
apply long with (s1 := s1).
auto.
elim H7.
intros; apply parent_intro.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
unfold not in |- *; intro; generalize e.
rewrite H10; rewrite H8; auto with v62.
simpl in |- *; rewrite collect_elsewhere; auto.
right; unfold not in |- *; intro; generalize e0.
rewrite H10; rewrite empty_q_to_me; simpl in |- ×.
discriminate.
auto.
apply parent_intro.
rewrite <- e1; simpl in |- ×.
unfold Set_rec_table in |- *; rewrite that_site; auto.
rewrite <- e1.
auto.
cut (inc_dec_in_queue x (bm c s2 owner)).
intro.
generalize (inc_dec_in x (bm c s2 owner) H2).
intro.
generalize (not_owner_inc3 c s2 owner H x H3); intro.
generalize (positive_st c x s2 H4 H H3); intro.
generalize (st_rt c x H H4 H5); intro.
apply indirect_son1_intro.
auto.
auto.
elim (direct_or_indirect_son1 c x H4 H6).
intro; elim HA; auto.
intro.
elim b0.
auto.
generalize p; simpl in |- ×.
rewrite collect_elsewhere; auto.
left; unfold not in |- *; intro.
generalize e0; rewrite H2; rewrite empty_q_to_me; simpl in |- ×.
discriminate.
auto.
cut (inc_dec_in_queue x (bm c s2 owner)).
intro.
generalize (inc_dec_in x (bm c s2 owner) H2).
intro.
generalize (not_owner_inc3 c s2 owner H x H3); intro.
auto.
generalize p; simpl in |- ×.
rewrite collect_elsewhere; auto.
left; unfold not in |- *; intro.
generalize e0; rewrite H2; rewrite empty_q_to_me; simpl in |- ×.
discriminate.
auto.
generalize e1; elim b; intros.
elim H4.
rewrite e1; rewrite <- e2; auto.
intro.
elim (H0 H s).
intros.
split with x.
decompose [and] H2.
split.
elim H3.
intros.
apply direct_son_intro.
auto.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
unfold not in |- *; intro; generalize e.
rewrite H8; rewrite H6; auto with v62.
simpl in |- ×.
rewrite collect_elsewhere; auto.
generalize n; elim H4.
intros.
apply short.
generalize n0; elim H5; intros; apply parent_intro.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
simpl in |- ×.
rewrite collect_elsewhere; auto.
right; unfold not in |- *; intro.
generalize e0; rewrite H8; rewrite empty_q_to_me; simpl in |- ×.
discriminate.
auto.
intros.
apply long with (s1 := s1).
apply H6.
generalize e; elim H5; intros.
generalize e1; elim H8; intros.
unfold not in |- *; intro.
generalize e2; rewrite H11; rewrite H9; auto with v62.
generalize e1; elim H10.
intros.
unfold not in |- ×.
intro; generalize e2.
rewrite H13; rewrite H11; auto with v62.
generalize n0; elim H7; intros.
apply parent_intro.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
simpl in |- *; rewrite collect_elsewhere; auto.
right; unfold not in |- *; intro.
generalize e0; rewrite H10; rewrite empty_q_to_me; simpl in |- ×.
discriminate.
auto.
generalize n; elim H1.
intros.
apply indirect_son1_intro.
auto.
generalize H3; simpl in |- *; unfold Set_rec_table in |- *;
rewrite other_site; auto.
generalize H4; simpl in |- *; rewrite collect_elsewhere.
auto.
right; unfold not in |- *; intro; generalize e0.
rewrite H5; rewrite empty_q_to_me; simpl in |- ×.
discriminate.
auto.
unfold not in |- *; intro; generalize e0.
rewrite H2; rewrite empty_q_to_me; simpl in |- ×.
discriminate.
auto.
simpl in |- *; unfold Set_rec_table in |- *; rewrite that_site; auto.
simpl in |- ×.
intros s1 s2 e n e0 H H0 Hnext; intros s H1.
case (eq_site_dec s2 s).
intro.
elim (decide_direct_son c s1 n).
intro.
split with s1.
split.
generalize e0; elim a.
intros.
apply direct_son_intro.
auto.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site;
auto with v62.
unfold not in |- *; intro; generalize e2.
rewrite H5; rewrite empty_q_to_me; simpl in |- ×.
discriminate.
auto.
simpl in |- ×.
rewrite post_elsewhere.
intro.
case (eq_site_dec s2 owner).
intro.
rewrite e3; rewrite collect_here.
apply inc_dec_not_in_first_out with (m := copy).
rewrite <- e3; auto.
discriminate.
auto.
intro; rewrite collect_elsewhere; auto.
left; unfold not in |- *; intro; generalize e2.
rewrite H5; rewrite empty_q_to_me; simpl in |- ×.
discriminate.
auto.
apply short.
apply parent_intro.
rewrite <- e1; simpl in |- ×.
unfold Set_rec_table in |- *; rewrite that_site; auto.
simpl in |- ×.
rewrite e1; rewrite post_here; simpl in |- ×.
case (eq_site_dec s1 s1).
auto.
intro.
auto.
intro.
elim (direct_or_indirect_son1 c s1 n).
intro; elim b; auto.
intro.
elim (H0 H s1 b0).
intros.
split with x.
decompose [and] H2.
split.
elim H3.
intros.
apply direct_son_intro.
auto.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
unfold not in |- *; intro; generalize e.
rewrite H8; rewrite H6; auto with v62.
simpl in |- ×.
rewrite post_elsewhere.
case (eq_queue_dec s1 s0 s2 owner).
intro; decompose [and] a.
rewrite H8; rewrite H9; rewrite collect_here.
intro.
apply inc_dec_not_in_first_out with (m := copy).
rewrite <- H8; rewrite <- H9; auto.
discriminate.
auto.
intro; rewrite collect_elsewhere; auto.
left; unfold not in |- *; intro; generalize e.
rewrite H8; rewrite H6; auto with v62.
apply long with (s1 := s1).
generalize H4.
cut
(∀ sa sb : Site,
ancestor c sa sb → sb ≠ s2 → ancestor (rec_copy3_trans c s1 s2) sa sb).
intros.
apply H5.
auto.
elim b0.
intros.
unfold not in |- *; intro; generalize e.
rewrite <- H10; rewrite H8; auto with v62.
intros.
generalize H6.
elim H5.
intros; apply short.
generalize H8; elim H7; intros; apply parent_intro.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
simpl in |- ×.
rewrite post_elsewhere.
apply (inc_dec_in_collect (bm c) s5 s1 s2 s4 copy).
auto.
auto.
discriminate.
left; auto.
intros.
apply long with (s1 := s3).
apply H8.
elim H7.
intros.
elim H11.
intros.
unfold not in |- *; intro; generalize H12.
rewrite H14; rewrite e; auto with v62.
intros.
elim H13; intros.
unfold not in |- *; intro; generalize H14.
rewrite H16; rewrite e; auto with v62.
generalize H10.
elim H9.
intros.
apply parent_intro.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
simpl in |- ×.
rewrite post_elsewhere.
apply (inc_dec_in_collect (bm c) s6 s1 s2 s5 copy).
auto.
auto.
discriminate.
left; auto.
apply parent_intro.
simpl in |- ×.
rewrite e1; unfold Set_rec_table in |- *; rewrite that_site; auto.
simpl in |- ×.
rewrite e1; rewrite post_here; simpl in |- ×.
case (eq_site_dec s1 s1).
auto.
auto.
generalize e1; elim H1; simpl in |- ×.
intros.
cut (inc_dec_in_queue s1 (bm (rec_copy3_trans c s1 s2) s2 owner)).
intro.
generalize (inc_dec_in s1 (bm (rec_copy3_trans c s1 s2) s2 owner) H5).
intro.
cut (s1 ≠ owner).
intro.
generalize (positive_st (rec_copy3_trans c s1 s2) s1 s2 H7 Hnext H6).
intro.
generalize (st_rt (rec_copy3_trans c s1 s2) s1 Hnext H7 H8).
simpl in |- ×.
unfold Set_rec_table in |- *; rewrite other_site; auto.
unfold not in |- *; intro; generalize e0.
rewrite H9; rewrite empty_q_to_me; simpl in |- ×.
discriminate.
auto.
auto.
simpl in |- ×.
rewrite post_here; simpl in |- *; auto.
case (eq_site_dec s1 s1).
auto.
auto.
intro.
elim (H0 H s).
intros.
decompose [and] H2.
split with x.
split.
elim H3.
intros.
apply direct_son_intro.
auto.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
unfold not in |- *; intro; generalize e.
rewrite H8; rewrite H6; auto with v62.
simpl in |- ×.
rewrite post_elsewhere.
intro.
apply inc_dec_not_in_collect with (m := copy).
auto.
auto.
discriminate.
left.
unfold not in |- *; intro; generalize e.
rewrite H8; rewrite H6; auto with v62.
generalize n0.
elim H4.
intros.
apply short.
generalize n1; elim H5; intros.
apply parent_intro.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
simpl in |- ×.
rewrite post_elsewhere.
apply inc_dec_in_collect with (m := copy).
auto.
auto.
discriminate.
left; auto.
intros.
apply long with (s1 := s3).
apply H6.
elim H5; intros.
elim H8; intros.
unfold not in |- *; intro; generalize e.
rewrite H11; rewrite H9; auto with v62.
elim H10; intros.
unfold not in |- *; intro; generalize e.
rewrite H13; rewrite H11; auto with v62.
generalize n1; elim H7.
intros.
apply parent_intro.
simpl in |- *; unfold Set_rec_table in |- *; rewrite other_site; auto.
simpl in |- ×.
rewrite post_elsewhere.
apply (inc_dec_in_collect (bm c) s6 s1 s2 s5 copy).
auto.
auto.
discriminate.
left; auto.
generalize n0; elim H1; intros.
apply indirect_son1_intro.
auto.
generalize H3; simpl in |- ×.
unfold Set_rec_table in |- *; rewrite other_site; auto.
unfold not in |- *; intro.
elim H4; simpl in |- ×.
intro; rewrite post_elsewhere.
apply inc_dec_not_in_collect with (m := copy).
auto.
exact (H5 s3).
discriminate.
left; auto.
simpl in |- ×.
intros s e e0 n H H0 Hnext; intros s0 H1.
elim (H0 H s0).
intros.
decompose [and] H2.
split with x.
split.
cut (s ≠ x).
intro.
generalize H5; elim H3.
intros.
apply direct_son_intro.
auto.
simpl in |- ×.
unfold Reset_rec_table in |- *; rewrite other_site; auto.
simpl in |- ×.
intro.
apply inc_dec_not_in_post.
auto.
intro; discriminate.
generalize (ancestor_has_positive_st c H x s0 H4); intro.
unfold not in |- *; intro.
generalize H5; rewrite <- H6; rewrite e.
intro.
omega.
generalize H1.
elim H4.
intros.
apply short.
generalize H6; elim H5; intros.
cut (s4 ≠ s).
intro; apply parent_intro.
simpl in |- *; unfold Reset_rec_table in |- *; rewrite other_site; auto.
simpl in |- ×.
rewrite post_elsewhere; auto.
elim H9.
simpl in |- ×.
intros.
unfold not in |- *; intro.
rewrite H13 in H11.
generalize H11; unfold Reset_rec_table in |- *; rewrite that_site;
auto with v62.
intros.
apply long with (s1 := s1).
apply H6.
generalize H7; elim H5.
intros.
apply indirect_son1_intro.
elim H10.
intros.
apply (not_owner_inc3 c s7 owner H).
apply inc_dec_in.
auto.
auto.
simpl in |- *; unfold Reset_rec_table in |- *; rewrite other_site; auto.
elim H9; auto.
generalize (short c s5 s3 H10); intro.
generalize (ancestor_has_positive_st c H s5 s3 H11); intro.
unfold not in |- *; intro; generalize e.
rewrite H13; intro.
rewrite e1 in H12; omega.
simpl in |- ×.
elim H9; intros.
case (eq_site_dec s s7).
intro.
rewrite e1; rewrite post_here; simpl in |- *; auto.
unfold not in |- *; intro.
apply (H13 s6).
auto.
intro; rewrite post_elsewhere.
unfold not in |- *; intro.
apply (H13 s6); auto.
left; auto.
intros.
apply indirect_son1_intro.
elim H12.
intros.
apply (not_owner_inc3 c s8 owner H).
apply inc_dec_in.
auto.
auto.
simpl in |- *; unfold Reset_rec_table in |- *; rewrite other_site; auto.
elim H11; auto.
generalize (short c s6 s3 H12); intro.
generalize (ancestor_has_positive_st c H s6 s3 H13); intro.
unfold not in |- *; intro.
rewrite H15 in e; rewrite e in H14; omega.
simpl in |- ×.
elim H11; intros.
unfold not in |- *; intros.
apply (H15 s7).
apply inc_dec_in_post.
auto.
intro; discriminate.
generalize H8; elim H7.
intros.
cut (s5 ≠ s).
intro.
apply parent_intro.
simpl in |- *; unfold Reset_rec_table in |- *; rewrite other_site; auto.
simpl in |- ×.
rewrite post_elsewhere; auto.
elim H11.
intros.
unfold not in |- *; intro.
generalize H13; rewrite H15; simpl in |- *; unfold Reset_rec_table in |- *;
rewrite that_site; auto with v62.
generalize H1; elim H1; intros.
apply indirect_son1_intro.
auto.
generalize H3; simpl in |- *; unfold Reset_rec_table in |- *;
rewrite other_site; auto.
elim H5; intros.
unfold not in |- *; intro; generalize H7.
rewrite H9; simpl in |- *; unfold Reset_rec_table in |- *;
rewrite that_site; auto with v62.
generalize H4; simpl in |- ×.
intro.
unfold not in |- *; intro.
elim H6.
intro.
unfold not in |- *; intro.
apply (H7 s2).
apply (inc_dec_in_post2 (bm c) s1 s2 s owner dec).
auto.
discriminate.
Qed.
Lemma parent_invariant :
∀ c : Config,
legal c →
∀ s : Site,
indirect_son1 c s → ∃ s1 : Site, direct_son c s1 ∧ ancestor c s1 s.
Proof.
intros c H.
generalize H.
elim H.
simpl in |- ×.
intros.
elim H1.
simpl in |- ×.
intros.
elim H4.
intro; auto.
unfold not in |- *; auto.
exact parent_invariant_inductive.
Qed.
