From 74e4d637c36d282d0aa8686b55dfc49aeb6f559e Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Tue, 13 Feb 2018 18:08:15 +0100 Subject: [PATCH] set modes for update modality typeclasses --- theories/bi/updates.v | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/theories/bi/updates.v b/theories/bi/updates.v index cdd0d4250..f7b00a430 100644 --- a/theories/bi/updates.v +++ b/theories/bi/updates.v @@ -3,6 +3,7 @@ From iris.bi Require Import interface derived_laws big_op. Class BUpd (PROP : Type) : Type := bupd : PROP → PROP. Instance : Params (@bupd) 2. +Hint Mode BUpd ! : typeclass_instances. Notation "|==> Q" := (bupd Q) (at level 99, Q at level 200, format "|==> Q") : bi_scope. @@ -13,6 +14,7 @@ Notation "P ==∗ Q" := (P -∗ |==> Q)%I Class FUpd (PROP : Type) : Type := fupd : coPset → coPset → PROP → PROP. Instance: Params (@fupd) 4. +Hint Mode FUpd ! : typeclass_instances. Notation "|={ E1 , E2 }=> Q" := (fupd E1 E2 Q) (at level 99, E1, E2 at level 50, Q at level 200, @@ -56,17 +58,20 @@ Class BUpdFacts (PROP : bi) `{BUpd PROP} : Prop := bupd_trans P : (|==> |==> P) ==∗ P; bupd_frame_r P R : (|==> P) ∗ R ==∗ P ∗ R; bupd_plainly P : (|==> bi_plainly P) -∗ P }. +Hint Mode BUpdFacts ! - : typeclass_instances. Section bupd_derived. Context `{BUpdFacts PROP}. + Implicit Types (P Q R: PROP). - Global Instance bupd_proper : Proper ((≡) ==> (≡)) bupd := ne_proper _. + (* FIXME: Removing the `PROP:=` diverges. *) + Global Instance bupd_proper : Proper ((≡) ==> (≡)) (bupd (PROP:=PROP)) := ne_proper _. (** BUpd derived rules *) - Global Instance bupd_mono' : Proper ((⊢) ==> (⊢)) bupd. + Global Instance bupd_mono' : Proper ((⊢) ==> (⊢)) (bupd (PROP:=PROP)). Proof. intros P Q; apply bupd_mono. Qed. - Global Instance bupd_flip_mono' : Proper (flip (⊢) ==> flip (⊢)) bupd. + Global Instance bupd_flip_mono' : Proper (flip (⊢) ==> flip (⊢)) (bupd (PROP:=PROP)). Proof. intros P Q; apply bupd_mono. Qed. Lemma bupd_frame_l R Q : (R ∗ |==> Q) ==∗ R ∗ Q. @@ -110,23 +115,25 @@ Class FUpdFacts (PROP : sbi) `{BUpd PROP, FUpd PROP} : Prop := E1 ⊆ E2 → (Q ={E1, E2'}=∗ P) -∗ (|={E1, E2}=> Q) ={E1}=∗ (|={E1, E2}=> Q) ∗ P; later_fupd_plain E P `{!Plain P} : (▷ |={E}=> P) ={E}=∗ ▷ ◇ P }. +Hint Mode FUpdFacts ! - - : typeclass_instances. Section fupd_derived. Context `{FUpdFacts PROP}. + Implicit Types (P Q R: PROP). - Global Instance fupd_proper E1 E2 : Proper ((≡) ==> (≡)) (fupd E1 E2) := ne_proper _. + Global Instance fupd_proper E1 E2 : Proper ((≡) ==> (≡)) (fupd (PROP:=PROP) E1 E2) := ne_proper _. (** FUpd derived rules *) - Global Instance fupd_mono' E1 E2 : Proper ((⊢) ==> (⊢)) (fupd E1 E2). + Global Instance fupd_mono' E1 E2 : Proper ((⊢) ==> (⊢)) (fupd (PROP:=PROP) E1 E2). Proof. intros P Q; apply fupd_mono. Qed. Global Instance fupd_flip_mono' E1 E2 : - Proper (flip (⊢) ==> flip (⊢)) (fupd E1 E2). + Proper (flip (⊢) ==> flip (⊢)) (fupd (PROP:=PROP) E1 E2). Proof. intros P Q; apply fupd_mono. Qed. Lemma fupd_intro E P : P ={E}=∗ P. Proof. rewrite -bupd_fupd. apply bupd_intro. Qed. - Lemma fupd_intro_mask' E1 E2 : E2 ⊆ E1 → (|={E1,E2}=> |={E2,E1}=> emp)%I. + Lemma fupd_intro_mask' E1 E2 : E2 ⊆ E1 → (|={E1,E2}=> |={E2,E1}=> emp : PROP)%I. Proof. exact: fupd_intro_mask. Qed. Lemma fupd_except_0 E1 E2 P : (|={E1,E2}=> ◇ P) ={E1,E2}=∗ P. Proof. by rewrite {1}(fupd_intro E2 P) except_0_fupd fupd_trans. Qed. -- GitLab