diff --git a/iris_core.v b/iris_core.v index d2b7a6c17d0980a126dcb57377acbf54ae264396..60ae6e1767b48c2e4cde8baef65e71368be048c6 100644 --- a/iris_core.v +++ b/iris_core.v @@ -180,6 +180,32 @@ Module IrisCore (RL : RA_T) (C : CORE_LANG). End Invariants. + Section Timeless. + + Definition timelessP P w n := + forall w' k r (HSw : w ⊑ w') (HLt : k < n) (Hp : P w' k r), P w' (S k) r. + + Program Definition timeless P : Props := + m[(fun w => mkUPred (fun n r => timelessP P w n) _)]. + Next Obligation. + intros n1 n2 _ _ HLe _ HT w' k r HSw HLt Hp; eapply HT, Hp; [eassumption |]. + omega. + Qed. + Next Obligation. + intros w1 w2 EQw k; simpl; intros _ HLt; destruct n as [| n]; [now inversion HLt |]. + split; intros HT w' m r HSw HLt' Hp. + - symmetry in EQw; assert (HD := extend_dist _ _ _ _ EQw HSw); assert (HS := extend_sub _ _ _ _ EQw HSw). + apply (met_morph_nonexp _ _ P) in HD; apply HD, HT, HD, Hp; now (assumption || eauto with arith). + - assert (HD := extend_dist _ _ _ _ EQw HSw); assert (HS := extend_sub _ _ _ _ EQw HSw). + apply (met_morph_nonexp _ _ P) in HD; apply HD, HT, HD, Hp; now (assumption || eauto with arith). + Qed. + Next Obligation. + intros w1 w2 HSw n; simpl; intros _ HT w' m r HSw' HLt Hp. + eapply HT, Hp; [etransitivity |]; eassumption. + Qed. + + End Timeless. + Section Ownership. (** Ownership **) @@ -196,13 +222,17 @@ Module IrisCore (RL : RA_T) (C : CORE_LANG). intros u1 u2 Hequ. intros w n r. split; intros [t Heqt]; exists t; [rewrite <-Hequ|rewrite Hequ]; assumption. Qed. - Lemma ownR_sc u t: - ownR (u · t) == ownR u * ownR t. + Lemma ownR_timeless {u} : + valid(timeless(ownR u)). + Proof. intros w n _ w' k r _ _; now auto. Qed. + + Lemma ownR_sc u v: + ownR (u · v) == ownR u * ownR v. Proof. intros w n r; split; [intros Hut | intros [r1 [r2 [EQr [Hu Ht] ] ] ] ]. - destruct Hut as [s Heq]. rewrite-> assoc in Heq. exists↓ (s · u) by auto_valid. - exists↓ t by auto_valid. + exists↓ v by auto_valid. split; [|split]. + rewrite <-Heq. reflexivity. + exists s. reflexivity. @@ -228,6 +258,9 @@ Module IrisCore (RL : RA_T) (C : CORE_LANG). rewrite EQr. reflexivity. Qed. + Lemma ownS_timeless {σ} : valid(timeless(ownS σ)). + Proof. exact ownR_timeless. Qed. + (** Proper ghost state: ownership of logical **) Program Definition ownL : RL.res -n> Props := n[(fun r : RL.res => ownR (1, r))]. @@ -236,6 +269,9 @@ Module IrisCore (RL : RA_T) (C : CORE_LANG). simpl in EQr. intros w m t. simpl. change ( (ex_unit state, r1) ⊑ (ra_proj t) <-> (ex_unit state, r2) ⊑ (ra_proj t)). rewrite EQr. reflexivity. Qed. + Lemma ownL_timeless {r : RL.res} : valid(timeless(ownL r)). + Proof. exact ownR_timeless. Qed. + (** Ghost state ownership **) Lemma ownL_sc (r s : RL.res) : ownL (r · s) == ownL r * ownL s. @@ -249,30 +285,6 @@ Module IrisCore (RL : RA_T) (C : CORE_LANG). End Ownership. - (** Timeless *) - - Definition timelessP P w n := - forall w' k r (HSw : w ⊑ w') (HLt : k < n) (Hp : P w' k r), P w' (S k) r. - - Program Definition timeless P : Props := - m[(fun w => mkUPred (fun n r => timelessP P w n) _)]. - Next Obligation. - intros n1 n2 _ _ HLe _ HT w' k r HSw HLt Hp; eapply HT, Hp; [eassumption |]. - omega. - Qed. - Next Obligation. - intros w1 w2 EQw k; simpl; intros _ HLt; destruct n as [| n]; [now inversion HLt |]. - split; intros HT w' m r HSw HLt' Hp. - - symmetry in EQw; assert (HD := extend_dist _ _ _ _ EQw HSw); assert (HS := extend_sub _ _ _ _ EQw HSw). - apply (met_morph_nonexp _ _ P) in HD; apply HD, HT, HD, Hp; now (assumption || eauto with arith). - - assert (HD := extend_dist _ _ _ _ EQw HSw); assert (HS := extend_sub _ _ _ _ EQw HSw). - apply (met_morph_nonexp _ _ P) in HD; apply HD, HT, HD, Hp; now (assumption || eauto with arith). - Qed. - Next Obligation. - intros w1 w2 HSw n; simpl; intros _ HT w' m r HSw' HLt Hp. - eapply HT, Hp; [etransitivity |]; eassumption. - Qed. - Section WorldSatisfaction. (* First, we need to compose the resources of a finite map. This won't be pretty, for diff --git a/iris_unsafe.v b/iris_unsafe.v index 1ebfce9ed5e247f88ccec4b4ba82589006ea4ca3..0a9a176cbac270a97a1da8e6dc9a72b3f6351462 100644 --- a/iris_unsafe.v +++ b/iris_unsafe.v @@ -11,11 +11,6 @@ Module Unsafety (RL : RA_T) (C : CORE_LANG). Local Open Scope bi_scope. Local Open Scope iris_scope. - (* PDS: Move to iris_core.v *) - Lemma ownL_timeless {r : RL.res} : - valid(timeless(ownL r)). - Proof. intros w n _ w' k r' HSW HLE. auto. Qed. - (* PDS: Hoist, somewhere. *) Program Definition restrictV (Q : expr -n> Props) : vPred := n[(fun v => Q (` v))].