Ltac hered :=
  match goal with
    H : ?P ?x |- ?P ?y => revert H
  end;
  match goal with
    |- ?P ?x -> ?P ?y =>
    cut (hereditary age P);
    [ let h := fresh "h" in intros h; apply h; auto | ]
  end.Ltac agejoinhyp :=
  match goal with
    H : sepalg.join _ _ ?m, A : age ?m _ |- _ =>
    pose proof age1_join2 _ H A; clear H
  end.Ltac agehyps :=
  match goal with
    H : age ?x ?y, HH : ?P ?x |- _ =>
    cut (P y);
    [ clear HH; intros HH
    | hered;
      try apply pred_hered;
      try apply predicates_hered.exactly_obligation_1]
  end.

(* Specifications: *)
Lemma hereditary_func_at' loc fs : hereditary age (func_at' fs loc).
Lemma anti_hereditary_func_at' loc fs : hereditary (fun x y => age y x) (func_at' fs loc).
Lemma pures_eq_unage {phi1 phi1' phi2}: ge (level phi1') (level phi2) -> age phi1 phi1' -> juicy_safety.pures_eq phi1' phi2 -> juicy_safety.pures_eq phi1 phi2.
Lemma jstep_age_sim {C} {csem : @semantics.CoreSemantics C mem} {c c' jm1 jm2 jm1'} : age jm1 jm2 -> jstep csem c jm1 c' jm1' -> level jm2 <> O -> exists jm2', age jm1' jm2' /\ jstep csem c jm2 c' jm2'.
Lemma jsafeN__age {G C Z HH Sem Jspec ge ora q n} jm jmaged : ext_spec_stable age (JE_spec _ Jspec) -> age jm jmaged -> le n (level jmaged) -> @jsafeN_ G Z C HH Sem Jspec ge n ora q jm -> @jsafeN_ G Z C HH Sem Jspec ge n ora q jmaged.
Lemma jsafeN__age_to {G C Z HH Sem Jspec ge ora q n} l jm : ext_spec_stable age (JE_spec _ Jspec) -> le n l -> @jsafeN_ G Z C HH Sem Jspec ge n ora q jm -> @jsafeN_ G Z C HH Sem Jspec ge n ora q (age_to l jm).
Lemma m_dry_age_to n jm : m_dry (age_to n jm) = m_dry jm.
Lemma m_phi_age_to n jm : m_phi (age_to n jm) = age_to n (m_phi jm).