From 0de297e176aecb406130ac042097d802dd4cc042 Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Wed, 15 Feb 2017 19:25:59 +0100 Subject: [PATCH] more FromPure and IntoPure instances --- theories/proofmode/class_instances.v | 59 +++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/theories/proofmode/class_instances.v b/theories/proofmode/class_instances.v index 2fd3fa1ca..db9633a91 100644 --- a/theories/proofmode/class_instances.v +++ b/theories/proofmode/class_instances.v @@ -43,6 +43,24 @@ Global Instance into_pure_cmra_valid `{CMRADiscrete A} (a : A) : @IntoPure M (✓ a) (✓ a). Proof. by rewrite /IntoPure discrete_valid. Qed. +Global Instance into_pure_pure_conj (φ1 φ2 : uPred M) P1 P2 : + IntoPure φ1 P1 -> IntoPure φ2 P2 -> IntoPure (φ1 ∧ φ2) (P1 ∧ P2). +Proof. rewrite /IntoPure pure_and. by intros -> ->. Qed. +Global Instance into_pure_pure_sep (φ1 φ2 : uPred M) P1 P2 : + IntoPure φ1 P1 -> IntoPure φ2 P2 -> IntoPure (φ1 ∗ φ2) (P1 ∧ P2). +Proof. rewrite /IntoPure sep_and pure_and. by intros -> ->. Qed. +Global Instance into_pure_pure_disj (φ1 φ2 : uPred M) P1 P2 : + IntoPure φ1 P1 -> IntoPure φ2 P2 -> IntoPure (φ1 ∨ φ2) (P1 ∨ P2). +Proof. rewrite /IntoPure pure_or. by intros -> ->. Qed. +Global Instance into_pure_pure_impl (φ1 φ2 : uPred M) P1 P2 : + FromPure φ1 P1 -> IntoPure φ2 P2 -> IntoPure (φ1 → φ2) (P1 → P2). +Proof. rewrite /FromPure /IntoPure pure_impl. by intros -> ->. Qed. +Global Instance into_pure_pure_wand (φ1 φ2 : uPred M) P1 P2 : + FromPure φ1 P1 -> IntoPure φ2 P2 -> IntoPure (φ1 -∗ φ2) (P1 → P2). +Proof. + rewrite /FromPure /IntoPure pure_impl always_impl_wand. by intros -> ->. +Qed. + Global Instance into_pure_exist {X : Type} (Φ : X → uPred M) φ : (∀ x, @IntoPure M (Φ x) (φ x)) → @IntoPure M (∃ x, Φ x) (∃ x, φ x). Proof. @@ -55,15 +73,6 @@ Global Instance into_pure_forall {X : Type} (Φ : X → uPred M) φ : Proof. rewrite /IntoPure=>Hx. rewrite -pure_forall_2. by setoid_rewrite Hx. Qed. -Global Instance into_pure_pure_conj (φ1 φ2 : uPred M) P1 P2 : - IntoPure φ1 P1 -> IntoPure φ2 P2 -> IntoPure (φ1 ∧ φ2) (P1 ∧ P2). -Proof. rewrite /IntoPure pure_and. by intros -> ->. Qed. -Global Instance into_pure_pure_sep (φ1 φ2 : uPred M) P1 P2 : - IntoPure φ1 P1 -> IntoPure φ2 P2 -> IntoPure (φ1 ∗ φ2) (P1 ∧ P2). -Proof. rewrite /IntoPure sep_and pure_and. by intros -> ->. Qed. -Global Instance into_pure_pure_disj (φ1 φ2 : uPred M) P1 P2 : - IntoPure φ1 P1 -> IntoPure φ2 P2 -> IntoPure (φ1 ∨ φ2) (P1 ∨ P2). -Proof. rewrite /IntoPure pure_or. by intros -> ->. Qed. (* FromPure *) Global Instance from_pure_pure φ : @FromPure M ⌜φ⌠φ. @@ -82,6 +91,38 @@ Qed. Global Instance from_pure_bupd P φ : FromPure P φ → FromPure (|==> P) φ. Proof. rewrite /FromPure=> ->. apply bupd_intro. Qed. + +Global Instance from_pure_pure_conj (φ1 φ2 : uPred M) P1 P2 : + FromPure φ1 P1 -> FromPure φ2 P2 -> FromPure (φ1 ∧ φ2) (P1 ∧ P2). +Proof. rewrite /FromPure pure_and. by intros -> ->. Qed. +Global Instance from_pure_pure_sep (φ1 φ2 : uPred M) P1 P2 : + FromPure φ1 P1 -> FromPure φ2 P2 -> FromPure (φ1 ∗ φ2) (P1 ∧ P2). +Proof. rewrite /FromPure pure_and always_and_sep_l. by intros -> ->. Qed. +Global Instance from_pure_pure_disj (φ1 φ2 : uPred M) P1 P2 : + FromPure φ1 P1 -> FromPure φ2 P2 -> FromPure (φ1 ∨ φ2) (P1 ∨ P2). +Proof. rewrite /FromPure pure_or. by intros -> ->. Qed. +Global Instance from_pure_pure_impl (φ1 φ2 : uPred M) P1 P2 : + IntoPure φ1 P1 -> FromPure φ2 P2 -> FromPure (φ1 → φ2) (P1 → P2). +Proof. rewrite /FromPure /IntoPure pure_impl. by intros -> ->. Qed. +Global Instance from_pure_pure_wand (φ1 φ2 : uPred M) P1 P2 : + IntoPure φ1 P1 -> FromPure φ2 P2 -> FromPure (φ1 -∗ φ2) (P1 → P2). +Proof. + rewrite /FromPure /IntoPure pure_impl always_impl_wand. by intros -> ->. +Qed. + +Global Instance from_pure_exist {X : Type} (Φ : X → uPred M) φ : + (∀ x, @FromPure M (Φ x) (φ x)) → @FromPure M (∃ x, Φ x) (∃ x, φ x). +Proof. + rewrite /FromPure=>Hx. apply pure_elim'=>-[x ?]. rewrite -(exist_intro x). + rewrite -Hx. apply pure_intro. done. +Qed. +Global Instance from_pure_forall {X : Type} (Φ : X → uPred M) φ : + (∀ x, @FromPure M (Φ x) (φ x)) → @FromPure M (∀ x, Φ x) (∀ x, φ x). +Proof. + rewrite /FromPure=>Hx. apply forall_intro=>x. apply pure_elim'=>Hφ. + rewrite -Hx. apply pure_intro. done. +Qed. + (* IntoPersistentP *) Global Instance into_persistentP_always_trans P Q : IntoPersistentP P Q → IntoPersistentP (□ P) Q | 0. -- GitLab