Program Definition set_ghost (m : rmap) (g : ghost) (Hg : _) :=
  proj1_sig (make_rmap (resource_at m) g (level m) _ Hg).Fixpoint prog_vars' {F V} (l: list (ident * globdef F V)) : list (ident * globvar V) :=
 match l with nil => nil | (i,Gvar v)::r => (i,v):: prog_vars' r | _::r => prog_vars' r
 end.Definition prog_vars {F} (p: program F) := prog_vars' (prog_defs p).(* How to relate Gamma to funspecs in memory, once we are outside the
   semax proofs?  We define 'matchfunspecs' which will be satisfied by
   the initial memory, and preserved under resource_decay / pures_eq /
   aging. *)

Definition cond_approx_eq n A P1 P2 :=
  (forall ts,
      fmap (dependent_type_functor_rec ts (AssertTT A)) (approx n) (approx n) (P1 ts) =
      fmap (dependent_type_functor_rec ts (AssertTT A)) (approx n) (approx n) (P2 ts)).

(* Specifications: *)
Lemma cond_approx_eq_sym n A P1 P2 : cond_approx_eq n A P1 P2 -> cond_approx_eq n A P2 P1.
Lemma cond_approx_eq_trans n A P1 P2 P3 : cond_approx_eq n A P1 P2 -> cond_approx_eq n A P2 P3 -> cond_approx_eq n A P1 P3.
Lemma cond_approx_eq_weakening n n' A P1 P2 : (n' <= n)%nat -> cond_approx_eq n A P1 P2 -> cond_approx_eq n' A P1 P2.
Lemma level_initial_core {F} ge G n : level (@initial_core F ge G n) = n.