From 068dd35799367e9c632927ed6aafdab6f6ef48af Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Thu, 14 Jan 2016 23:09:05 +0100
Subject: [PATCH] Define Timeless in the logic.

Sadly, timelessness of many connectives is still proved in the model.
---
 modures/logic.v | 66 +++++++++++++++++++++++++++++--------------------
 1 file changed, 39 insertions(+), 27 deletions(-)

diff --git a/modures/logic.v b/modures/logic.v
index 5e65605b6..476f33ed9 100644
--- a/modures/logic.v
+++ b/modures/logic.v
@@ -220,7 +220,8 @@ Fixpoint uPred_big_sep {M} (Ps : list (uPred M)) :=
 Instance: Params (@uPred_big_sep) 1.
 Notation "'Π★' Ps" := (uPred_big_sep Ps) (at level 20) : uPred_scope.
 
-Class TimelessP {M} (P : uPred M) := timelessP x n : ✓{1} x → P 1 x → P n x.
+Class TimelessP {M} (P : uPred M) := timelessP : ▷ P ⊑ (P ∨ ▷ False).
+Arguments timelessP {_} _ {_} _ _ _ _.
 
 Module uPred. Section uPred_logic.
 Context {M : cmraT}.
@@ -798,49 +799,60 @@ Lemma uPred_big_sep_elem_of Ps P : P ∈ Ps → (Π★ Ps) ⊑ P.
 Proof. induction 1; simpl; auto. Qed.
 
 (* Timeless *)
+Lemma timelessP_spec P : TimelessP P ↔ ∀ x n, ✓{n} x → P 1 x → P n x.
+Proof.
+  split.
+  * intros HP x n ??; induction n as [|[|n]]; auto.
+    by destruct (HP x (S (S n))); auto using cmra_valid_S.
+  * move=> HP x [|[|n]] /=; auto; left.
+    apply HP, uPred_weaken with x (S n); eauto using cmra_valid_le.
+Qed.
 Global Instance const_timeless (P : Prop) : TimelessP (â–  P : uPred M)%I.
-Proof. by intros x [|n]. Qed.
-Global Instance and_timeless P Q :
-  TimelessP P → TimelessP Q → TimelessP (P ∧ Q).
-Proof. intros ?? x n ? [??]; split; auto. Qed.
-Global Instance or_timeless P Q :
-  TimelessP P → TimelessP Q → TimelessP (P ∨ Q).
-Proof. intros ?? x n ? [?|?]; [left|right]; auto. Qed.
+Proof. by apply timelessP_spec=> x [|n]. Qed.
+Global Instance and_timeless P Q: TimelessP P → TimelessP Q → TimelessP (P ∧ Q).
+Proof. by intros ??; rewrite /TimelessP later_and or_and_r; apply and_mono. Qed.
+Global Instance or_timeless P Q : TimelessP P → TimelessP Q → TimelessP (P ∨ Q).
+Proof.
+  intros; rewrite /TimelessP later_or.
+  rewrite ->(timelessP P), (timelessP Q); eauto 10.
+Qed.
 Global Instance impl_timeless P Q : TimelessP Q → TimelessP (P → Q).
 Proof.
-  intros ? x [|n] ? HPQ x' [|n'] ????; auto.
-  apply timelessP, HPQ, uPred_weaken with x' (S n'); eauto using cmra_valid_le.
+  rewrite !timelessP_spec=> HP x [|n] ? HPQ x' [|n'] ????; auto.
+  apply HP, HPQ, uPred_weaken with x' (S n'); eauto using cmra_valid_le.
 Qed.
-Global Instance sep_timeless P Q :
-  TimelessP P → TimelessP Q → TimelessP (P ★ Q).
+Global Instance sep_timeless P Q: TimelessP P → TimelessP Q → TimelessP (P ★ Q).
 Proof.
-  intros ?? x [|n] Hvalid (x1&x2&Hx12&?&?); [done|].
-  destruct (cmra_extend_op 1 x x1 x2) as ([y1 y2]&Hx&Hy1&Hy2); auto; simpl in *.
-  exists y1, y2; split_ands; [by apply equiv_dist| |].
-  * cofe_subst x; apply timelessP; rewrite Hy1; eauto using cmra_valid_op_l.
-  * cofe_subst x; apply timelessP; rewrite Hy2; eauto using cmra_valid_op_r.
+  intros; rewrite /TimelessP later_sep; rewrite ->(timelessP P), (timelessP Q).
+  apply wand_elim_l',or_elim;apply wand_intro; auto.
+  apply wand_elim_r',or_elim;apply wand_intro; rewrite ?(commutative _ Q); auto.
 Qed.
 Global Instance wand_timeless P Q : TimelessP Q → TimelessP (P -★ Q).
 Proof.
-  intros ? x [|n] ? HPQ x' [|n'] ???; auto.
-  apply timelessP, HPQ, uPred_weaken with x' (S n');
+  rewrite !timelessP_spec=> HP x [|n] ? HPQ x' [|n'] ???; auto.
+  apply HP, HPQ, uPred_weaken with x' (S n');
     eauto 3 using cmra_valid_le, cmra_valid_op_r.
 Qed.
 Global Instance forall_timeless {A} (P : A → uPred M) :
   (∀ x, TimelessP (P x)) → TimelessP (∀ x, P x).
-Proof. by intros ? x n ? HP a; apply timelessP. Qed.
+Proof. by setoid_rewrite timelessP_spec=>HP x n ?? a; apply HP. Qed.
 Global Instance exist_timeless {A} (P : A → uPred M) :
   (∀ x, TimelessP (P x)) → TimelessP (∃ x, P x).
-Proof. by intros ? x [|n] ?; [|intros [a ?]; exists a; apply timelessP]. Qed.
+Proof.
+  by setoid_rewrite timelessP_spec=>HP x [|n] ?;
+    [|intros [a ?]; exists a; apply HP].
+Qed.
 Global Instance always_timeless P : TimelessP P → TimelessP (□ P).
-Proof. intros ? x n ??; simpl; apply timelessP; auto using cmra_unit_valid. Qed.
+Proof.
+  intros ?; rewrite /TimelessP.
+  by rewrite -always_const -!always_later -always_or; apply always_mono.
+Qed.
 Global Instance eq_timeless {A : cofeT} (a b : A) :
   Timeless a → TimelessP (a ≡ b : uPred M)%I.
-Proof. by intros ? x n ??; apply equiv_dist, timeless. Qed.
-
-(** Timeless elements *)
-Global Instance own_timeless (a: M): Timeless a → TimelessP (uPred_own a).
+Proof. by intro; apply timelessP_spec=> x n ??; apply equiv_dist, timeless. Qed.
+Global Instance own_timeless (a : M): Timeless a → TimelessP (uPred_own a).
 Proof.
-  by intros ? x n ??; apply cmra_included_includedN, cmra_timeless_included_l.
+  intro; apply timelessP_spec=> x [|n] ?? //; apply cmra_included_includedN,
+    cmra_timeless_included_l; eauto using cmra_valid_le.
 Qed.
 End uPred_logic. End uPred.
-- 
GitLab