(* Where should this sit? *)
Section Timeless.
Definition except0 P := P || |>FF.
Definition timeless P := |>P |-- except0 P.
Definition timeless' (P : mpred) := forall (a a' : rmap),
predicates_hered.app_pred P a' -> age a a' ->
predicates_hered.app_pred P a.

(* Specifications: *)
Lemma timeless'_timeless : forall P, timeless' P -> timeless P.
Lemma except0_mono : forall P Q, P |-- Q -> except0 P |-- except0 Q.
Lemma except0_intro : forall P, P |-- except0 P.
Lemma except0_trans : forall P, except0 (except0 P) |-- except0 P.
Lemma except0_timeless : forall P Q, P |-- except0 Q -> timeless P -> |> P |-- except0 Q.
Lemma except0_frame_r : forall P Q, except0 P * Q |-- except0 (P * Q).
Lemma except0_frame_l : forall P Q, P * except0 Q |-- except0 (P * Q).
Lemma except0_bupd_elim : forall P, except0 (|==> except0 P) |-- |==> except0 P.
Lemma except0_bupd : forall P, except0 (|==> P) = |==> (except0 P).
Lemma except0_sepcon : forall P Q, except0 (P * Q) = except0 P * except0 Q.
Lemma except0_andp : forall P Q, except0 (P && Q) = except0 P && except0 Q.
Lemma except0_exp : forall {A} (x : A) P, except0 (EX x : A, P x) = EX x : A, except0 (P x).
Lemma timeless_sepcon : forall P Q, timeless P -> timeless Q -> timeless (P * Q).
Lemma timeless_andp : forall P Q, timeless P -> timeless Q -> timeless (P && Q).
Lemma own_timeless : forall {P : Ghost} g (a : G), timeless (own g a NoneP).
Lemma timeless_exp : forall {A} (x : A) P, (forall x, timeless (P x)) -> timeless (EX x : A, P x).
Lemma timeless_prop : forall P, timeless (!! P).
Lemma address_mapsto_timeless : forall m v sh p, timeless (res_predicates.address_mapsto m v sh p).
Lemma timeless_FF : timeless FF.
Lemma timeless_emp : timeless emp.
Lemma nonlock_permission_bytes_timeless : forall sh l z,
timeless (res_predicates.nonlock_permission_bytes sh l z).
Lemma timeless_orp : forall P Q, timeless P -> timeless Q -> timeless (P || Q).
Lemma mapsto_timeless : forall sh t v p, timeless (mapsto sh t p v).
Lemma memory_block'_timeless : forall sh n b z,
timeless (mapsto_memory_block.memory_block' sh n b z).
Lemma memory_block_timeless : forall sh n p,
timeless (memory_block sh n p).
Lemma struct_pred_timeless : forall {CS : compspecs} sh m f t off
(IH : Forall (fun it : ident * type =>
forall (v : reptype (t it)) (p : val),
timeless (data_at_rec sh (t it) v p)) m) v p,
timeless (struct_pred m (fun (it : ident * type) v =>
withspacer sh (f it + sizeof (t it)) (off it)
(at_offset (data_at_rec sh (t it) v) (f it))) v p).
Lemma union_pred_timeless : forall {CS : compspecs} sh m t off
(IH : Forall (fun it : ident * type =>
forall (v : reptype (t it)) (p : val),
timeless (data_at_rec sh (t it) v p)) m) v p,
timeless (union_pred m (fun (it : ident * type) v =>
withspacer sh (sizeof (t it)) (off it)
(data_at_rec sh (t it) v)) v p).
Lemma data_at_rec_timeless : forall {CS : compspecs} sh t v p,
timeless (data_at_rec sh t v p).
Lemma data_at_timeless : forall {CS : compspecs} sh t v p, timeless (data_at sh t v p).
End Timeless.