Program Definition age1_juicy_mem (j: juicy_mem): option juicy_mem :=
      match age1 (m_phi j) with
        | Some phi' => Some (mkJuicyMem (m_dry j) phi' _ _ _ _)
        | None => None
      end.

(* Specifications: *)
Lemma age1_juicy_mem_unpack: forall j j', age1_juicy_mem j = Some j' -> age (m_phi j) (m_phi j') /\ m_dry j = m_dry j'.
Lemma age1_juicy_mem_unpack': forall j j', age (m_phi j) (m_phi j') /\ m_dry j = m_dry j' -> age1_juicy_mem j = Some j'.
Lemma age1_juicy_mem_unpack'': forall j j', age (m_phi j) (m_phi j') -> m_dry j = m_dry j' -> age1_juicy_mem j = Some j'.
Lemma rmap_join_eq_level: forall phi1 phi2: rmap, joins phi1 phi2 -> level phi1 = level phi2.
Lemma rmap_join_sub_eq_level: forall phi1 phi2: rmap, join_sub phi1 phi2 -> level phi1 = level phi2.
Lemma age1_juicy_mem_None1: forall j, age1_juicy_mem j = None -> age1 (m_phi j) = None.
Lemma age1_juicy_mem_None2: forall j, age1 (m_phi j) = None -> age1_juicy_mem j = None.
Lemma age1_juicy_mem_Some: forall j j', age1_juicy_mem j = Some j' -> age1 (m_phi j) = Some (m_phi j').
Lemma unage_juicy_mem: forall j' : juicy_mem, exists j : juicy_mem, age1_juicy_mem j = Some j'.
Lemma level1_juicy_mem: forall j: juicy_mem, age1_juicy_mem j = None <-> level (m_phi j) = 0%nat.
Lemma level2_juicy_mem: forall j1 j2: juicy_mem, age1_juicy_mem j1 = Some j2 -> level (m_phi j1) = S (level (m_phi j2)).
Lemma juicy_mem_ageable_facts: ageable_facts juicy_mem (fun j => level (m_phi j)) age1_juicy_mem.