Library GC.lemma_step.lemma_end


Section lemma_end.

Require Export gc.
Require Export reachable.

Notation Reachable := (reachable node) (only parsing).

Lemma gcend_ancestor_col :
  (s t : state) (n : node),
 ( m : node,
  reachable node (hp s) m n mk s m = white mk s m = free)
 gc_end s t
  m : node,
 reachable node (hp t) m n mk t m = white mk t m = free.

intros s t n H_reach gcend m H_reach_m_t; elim gcend; clear gcend.
intros ctls ctlt heap mark; rewrite mark; apply H_reach; rewrite <- heap;
 assumption.
Qed.

Lemma gcend_accest_access :
  s t : state,
 gc_end s t
  n : node, accessible node (hp t) rt n accessible node (hp s) rt n.

intros s t gcend n acces_t_n; elim gcend; clear gcend.
intros ctls ctlt heap mark; rewrite <- heap; assumption.
Qed.

Lemma gcend_notaccess_notaccest :
  (s t : state) (n : node),
 ¬ accessible node (hp s) rt n gc_end s t ¬ accessible node (hp t) rt n.

intros s t n notacces_n_s gcend; elim gcend; clear gcend.
intros ctls ctlt heap mark; rewrite heap; assumption.
Qed.

Lemma gcend_notgreyt_notgreys :
  s t : state,
 gc_end s t n : node, mk t n grey mk s n grey.

intros s t gcend n mktn; elim gcend; clear gcend.
intros ctls ctlt heap mark; rewrite <- mark; assumption.
Qed.

Lemma gcend_blacks_blackt :
  s t : state,
 gc_end s t n : node, mk s n = black mk t n = black.

intros s t gcend n mktn; elim gcend; clear gcend.
intros ctls ctlt heap mark; rewrite mark; assumption.
Qed.

Lemma gcend_notfrees_notfreet :
  s t : state,
 gc_end s t n : node, mk s n free mk t n free.

intros s t gcend n mktn; elim gcend; clear gcend.
intros ctls ctlt heap mark; rewrite mark; assumption.
Qed.

Lemma gcend_white :
  (s t : state) (n : node),
 mk s n = white gc_end s t mk t n = white.

intros s t n mksn gcend; elim gcend; clear gcend.
intros ctls ctlt heap mark; rewrite mark; assumption.
Qed.

Lemma gcend_nogrey :
  s t : state,
 ( n : node, mk s n grey)
 gc_end s t n : node, mk t n grey.

intros s t mksn gcend; elim gcend; clear gcend.
intros ctls ctlt heap mark; rewrite mark; auto.
Qed.

Lemma gcend_nowhite :
  s t : state,
 ( n : node, mk s n white)
 gc_end s t n : node, mk t n white.

intros s t mksn gcend; elim gcend; clear gcend.
intros ctls ctlt heap mark; rewrite mark; auto.
Qed.

End lemma_end.

Hint Resolve gcend_notaccess_notaccest.
Hint Resolve gcend_white.
Hint Resolve gcend_nowhite.
Hint Resolve gcend_blacks_blackt.
Hint Resolve gcend_nogrey.
Hint Resolve gcend_ancestor_col.