Local Open Scope logic.
Fixpoint power_later (n:nat) P :=
match n with
| 0%nat => P
| S n' => later (power_later n' P)
end
.

(* Specifications: *)
Lemma power_now_later: forall n P, P |-- power_later n P.
Lemma power_later_andp: forall (n:nat) (P Q : mpred), power_later n (P && Q) = (power_later n P) && (power_later n Q).
Lemma power_later_exp': forall (n:nat) T (any:T) F,
power_later n (EX x:T, F x) = EX x:T, (power_later n (F x)).
Lemma power_later_sepcon: forall n P Q, power_later n (P * Q) = (power_later n P) * (power_later n Q).
Lemma power_later_connect: forall n P, power_later n (|> P) = power_later (n + 1) P.
Lemma power_later_connect': forall n P, |> (power_later n P) = power_later (n + 1) P.
Lemma power_later_derives: forall n:nat, forall P Q:mpred,
P |-- Q -> (power_later n P) |-- (power_later n Q).
Lemma power_later_TT: forall n, TT = power_later n TT.
Lemma corable_power_later: forall n P, corable P -> corable (power_later n P).
Ltac power_normalize :=
repeat (
try rewrite -> power_later_andp;
try rewrite -> power_later_sepcon;
try rewrite <- power_later_TT)
.
Lemma power_later_erase: forall n P Q R, P * Q |-- R -> power_later n P * Q |-- power_later n R.
Lemma power_prop_andp_sepcon:
forall (n:nat) P Q R, ((power_later n (!! P)) && Q) * R = (power_later n (!! P)) && (Q * R).