Library GC.safety.rtgreyorblack


Section invariant1.

Require Export gc.
Require Export Sumbool.

Lemma rt_grey_or_black_init :
  s : state, init_state s rt_grey_or_black s.

unfold rt_grey_or_black in |- *; unfold init_state in |- *; intros s init;
 right.
elim init; clear init.
intros ctls init; elim init; clear init; unfold init_marking in |- ×.
intros mark heap; elim mark; clear mark.
intros mksrt mark; assumption.
Qed.

Lemma rt_grey_or_black_addedge :
  s t : state, rt_grey_or_black s add_edge s t rt_grey_or_black t.

unfold rt_grey_or_black in |- *; intros s t H_s addedge.
elim addedge; clear addedge; unfold marking_add in |- ×.
intros n m acces_s_n acces_s_m ctls ctlt add mark.
elim mark; clear mark.
intro case1; elim case1; clear case1.
intros mksn mark; rewrite mark; assumption.
intros case; elim case; clear case.
intro case2; elim case2; clear case2.
intros mksn mark; elim mark; clear mark.
intros mksm mark; rewrite mark; assumption.
intros case3; elim case3; clear case3.
intros mksn mark; elim mark; clear mark.
intros mksm mark; elim mark; clear mark.
intros mark mktm; unfold rt_grey_or_black in |- *;
 unfold rt_grey_or_black in H_s.
elim H_s; clear H_s.
intro mksrt; left; rewrite <- (mark rt); auto.
apply (noteqmar_noteqnod (mk s) rt m); rewrite mksrt; rewrite mksm;
 discriminate.
intro mksrt; right; rewrite <- (mark rt); auto.
apply (noteqmar_noteqnod (mk s) rt m); rewrite mksrt; rewrite mksm;
 discriminate.
Qed.

Lemma rt_grey_or_black_removeedge :
  s t : state,
 rt_grey_or_black s remove_edge s t rt_grey_or_black t.

unfold rt_grey_or_black in |- *; intros s t H_s removeedge.
elim removeedge; clear removeedge.
intros n m acces_s_n acces_s_m ctls ctlt remove mark.
rewrite mark; assumption.
Qed.

Lemma rt_grey_or_black_alloc :
  s t : state, rt_grey_or_black s alloc s t rt_grey_or_black t.

unfold rt_grey_or_black in |- *; intros s t H_s alloc.
elim alloc; clear alloc.
intros ctls ctlt n mksn H_fils mark add.
elim mark; clear mark.
intros mark mktn.
elim H_s; clear H_s.
intro mksrt; left; rewrite <- (mark rt); auto.
apply (noteqmar_noteqnod (mk s) rt n); rewrite mksrt; rewrite mksn;
 discriminate.
intro mksrt; right; rewrite <- (mark rt); auto.
apply (noteqmar_noteqnod (mk s) rt n); rewrite mksrt; rewrite mksn;
 discriminate.
Qed.

Lemma black_grey_node :
  s t : state,
 rt_grey_or_black s
 grey_node_case (mk s) (mk t) (hp s) rt_grey_or_black t.

unfold rt_grey_or_black in |- *; intros s t H_s H_sons.
elim H_sons; clear H_sons.
intros g mksg mktg case1 case2.
elim (eq_dec_node rt g).
intro rteqg; right; rewrite rteqg; assumption.
intro rtdifg; elim H_s; clear H_s.
intro mksrt; elim (sumbool_of_bool (hp s g rt)); intro hsgrt.
left; rewrite <- (case2 rt); auto.
split; auto.
left; split; auto.
rewrite mksrt; discriminate.
left; rewrite <- (case2 rt); auto.
right; auto.
elim (sumbool_of_bool (hp s g rt)); intro hsgrt.
rewrite <- (case2 rt); auto.
split; auto.
left; split; auto.
rewrite H; discriminate.
rewrite <- (case2 rt); auto.
Qed.

Lemma free_white_node :
  (s t : state) (n : node),
 rt_grey_or_black s
 mk s n = white update_color (mk s) (mk t) free n rt_grey_or_black t.

unfold rt_grey_or_black in |- *; intros s t n H_s mksn mark; elim mark;
 clear mark.
intros mark mktn; elim H_s; clear H_s.
intro mksrt; left; rewrite <- (mark rt); auto.
apply (noteqmar_noteqnod (mk s) rt n); rewrite mksrt; rewrite mksn;
 discriminate.
intro mksrt; right; rewrite <- (mark rt); auto.
apply (noteqmar_noteqnod (mk s) rt n); rewrite mksrt; rewrite mksn;
 discriminate.
Qed.

Lemma rt_grey_or_black_gccall :
  s t : state, rt_grey_or_black s gc_call s t rt_grey_or_black t.

intros s t H_s gccall; elim gccall; clear gccall; unfold init_color in |- ×.
intros ctls ctlt heap mark init; elim init; clear init.
intros mktrt mark_case; unfold rt_grey_or_black in |- *; left; assumption.
intros ctls ctlt heap H_sons; apply (black_grey_node s t); auto.
intros ctls ctlt heap mark m mksm upd_col.
apply (free_white_node s t m); assumption.
Qed.

Lemma rt_grey_or_black_marknode :
  s t : state,
 rt_grey_or_black s mark_node s t rt_grey_or_black t.

intros s t H_s marknode; elim marknode; clear marknode.
intros ctls ctlt heap H_sons; apply (black_grey_node s t); assumption.
Qed.

Lemma rt_grey_or_black_gcstop :
  s t : state, rt_grey_or_black s gc_stop s t rt_grey_or_black t.

unfold rt_grey_or_black in |- *; intros s t H_s gcstop; elim gcstop;
 clear gcstop.
intros ctls ctlt heap mark; rewrite mark; assumption.
Qed.

Lemma rt_grey_or_black_gcfree :
  s t : state, rt_grey_or_black s gc_free s t rt_grey_or_black t.

unfold rt_grey_or_black in |- *; intros s t H_s gcfree; elim gcfree;
 clear gcfree.
intros ctls ctlt H_col heap m mksm mark; elim mark; clear mark.
intros mark mktm.
unfold rt_grey_or_black in |- *; unfold rt_grey_or_black in H_s.
elim H_s; clear H_s.
intro mksrt; left; rewrite <- (mark rt); auto.
apply (noteqmar_noteqnod (mk s) rt m); rewrite mksrt; rewrite mksm;
 discriminate.
intro mksrt; right; rewrite <- (mark rt); auto.
apply (noteqmar_noteqnod (mk s) rt m); rewrite mksrt; rewrite mksm;
 discriminate.
Qed.

Lemma rt_grey_or_black_gcfree1 :
  s t : state, rt_grey_or_black s gc_free1 s t rt_grey_or_black t.

intros s t H_s gcfree1.
elim gcfree1; clear gcfree1.
intros ctls ctlt heap n mksn upd_col.
apply (free_white_node s t n); assumption.
Qed.

Lemma rt_grey_or_black_gcend :
  s t : state, rt_grey_or_black s gc_end s t rt_grey_or_black t.

unfold rt_grey_or_black in |- *; intros s t H_s gcend.
elim gcend; clear gcend.
intros ctls ctlt heap mark; rewrite mark; assumption.
Qed.

End invariant1.

Hint Resolve rt_grey_or_black_init.
Hint Immediate rt_grey_or_black_addedge.
Hint Immediate rt_grey_or_black_removeedge.
Hint Immediate rt_grey_or_black_alloc.
Hint Immediate rt_grey_or_black_gccall.
Hint Immediate rt_grey_or_black_marknode.
Hint Immediate rt_grey_or_black_gcstop.
Hint Immediate rt_grey_or_black_gcfree.
Hint Immediate rt_grey_or_black_gcfree1.
Hint Immediate rt_grey_or_black_gcend.