From 86bb4fb3e16d96aa5445f5209abe7d0cbc719f26 Mon Sep 17 00:00:00 2001 From: Jacques-Henri Jourdan <jacques-henri.jourdan@normalesup.org> Date: Thu, 14 Dec 2017 15:18:21 +0100 Subject: [PATCH] Embedding stuff in a separated file. --- _CoqProject | 1 + theories/bi/bi.v | 2 +- theories/bi/derived_laws.v | 104 ---------------------------- theories/bi/embedding.v | 134 +++++++++++++++++++++++++++++++++++++ theories/bi/interface.v | 28 -------- theories/bi/monpred.v | 2 +- 6 files changed, 137 insertions(+), 134 deletions(-) create mode 100644 theories/bi/embedding.v diff --git a/_CoqProject b/_CoqProject index a94cce5ca..f467b8c0a 100644 --- a/_CoqProject +++ b/_CoqProject @@ -36,6 +36,7 @@ theories/bi/fractional.v theories/bi/counter_examples.v theories/bi/fixpoint.v theories/bi/monpred.v +theories/bi/embedding.v theories/base_logic/upred.v theories/base_logic/derived.v theories/base_logic/base_logic.v diff --git a/theories/bi/bi.v b/theories/bi/bi.v index c0846ea37..4cef163c5 100644 --- a/theories/bi/bi.v +++ b/theories/bi/bi.v @@ -1,4 +1,4 @@ -From iris.bi Require Export derived_laws big_op updates. +From iris.bi Require Export derived_laws big_op updates embedding. Set Default Proof Using "Type". Module Import bi. diff --git a/theories/bi/derived_laws.v b/theories/bi/derived_laws.v index a929f62a5..f8249ff54 100644 --- a/theories/bi/derived_laws.v +++ b/theories/bi/derived_laws.v @@ -2296,107 +2296,3 @@ To avoid that, we declare it using a [Hint Immediate], so that it will only be used at the leaves of the proof search tree, i.e. when the premise of the hint can be derived from just the current context. *) Hint Immediate bi.plain_persistent : typeclass_instances. - -(* BI embeddings *) -Section bi_embedding. - Context `{BiEmbedding PROP1 PROP2}. - - Global Instance bi_embed_proper : Proper ((≡) ==> (≡)) bi_embed. - Proof. apply (ne_proper _). Qed. - Global Instance bi_embed_mono_flip : Proper (flip (⊢) ==> flip (⊢)) bi_embed. - Proof. solve_proper. Qed. - Global Instance bi_embed_inj : Inj (≡) (≡) bi_embed. - Proof. - intros ?? EQ. apply bi.equiv_spec, conj; apply (inj bi_embed); - rewrite EQ //. - Qed. - - Lemma bi_embed_valid (P : PROP1) : @bi_embed PROP1 PROP2 _ P ↔ P. - Proof. - by rewrite /bi_valid -bi_embed_emp; split=>?; [apply (inj bi_embed)|f_equiv]. - Qed. - - Lemma bi_embed_forall A (Φ : A → PROP1) : ⎡∀ x, Φ x⎤ ⊣⊢ ∀ x, ⎡Φ x⎤. - Proof. - apply bi.equiv_spec; split; [|apply bi_embed_forall_2]. - apply bi.forall_intro=>?. by rewrite bi.forall_elim. - Qed. - Lemma bi_embed_exist A (Φ : A → PROP1) : ⎡∃ x, Φ x⎤ ⊣⊢ ∃ x, ⎡Φ x⎤. - Proof. - apply bi.equiv_spec; split; [apply bi_embed_exist_1|]. - apply bi.exist_elim=>?. by rewrite -bi.exist_intro. - Qed. - Lemma bi_embed_and P Q : ⎡P ∧ Q⎤ ⊣⊢ ⎡P⎤ ∧ ⎡Q⎤. - Proof. rewrite !bi.and_alt bi_embed_forall. by f_equiv=>-[]. Qed. - Lemma bi_embed_or P Q : ⎡P ∨ Q⎤ ⊣⊢ ⎡P⎤ ∨ ⎡Q⎤. - Proof. rewrite !bi.or_alt bi_embed_exist. by f_equiv=>-[]. Qed. - Lemma bi_embed_impl P Q : ⎡P → Q⎤ ⊣⊢ (⎡P⎤ → ⎡Q⎤). - Proof. - apply bi.equiv_spec; split; [|apply bi_embed_impl_2]. - apply bi.impl_intro_l. by rewrite -bi_embed_and bi.impl_elim_r. - Qed. - Lemma bi_embed_wand P Q : ⎡P -∗ Q⎤ ⊣⊢ (⎡P⎤ -∗ ⎡Q⎤). - Proof. - apply bi.equiv_spec; split; [|apply bi_embed_wand_2]. - apply bi.wand_intro_l. by rewrite -bi_embed_sep bi.wand_elim_r. - Qed. - Lemma bi_embed_pure φ : ⎡⌜φâŒâŽ¤ ⊣⊢ ⌜φâŒ. - Proof. - rewrite (@bi.pure_alt PROP1) (@bi.pure_alt PROP2) bi_embed_exist. - do 2 f_equiv. apply bi.equiv_spec. split; [apply bi.True_intro|]. - rewrite -(_ : (emp → emp : PROP1) ⊢ True) ?bi_embed_impl; - last apply bi.True_intro. - apply bi.impl_intro_l. by rewrite right_id. - Qed. - Lemma bi_embed_internal_eq (A : ofeT) (x y : A) : ⎡x ≡ y⎤ ⊣⊢ x ≡ y. - Proof. - apply bi.equiv_spec; split; [apply bi_embed_internal_eq_1|]. - etrans; [apply (bi.internal_eq_rewrite x y (λ y, ⎡x ≡ y⎤%I)); solve_proper|]. - rewrite -(bi.internal_eq_refl True%I) bi_embed_pure. - eapply bi.impl_elim; [done|]. apply bi.True_intro. - Qed. - Lemma bi_embed_iff P Q : ⎡P ↔ Q⎤ ⊣⊢ (⎡P⎤ ↔ ⎡Q⎤). - Proof. by rewrite bi_embed_and !bi_embed_impl. Qed. - Lemma bi_embed_wand_iff P Q : ⎡P ∗-∗ Q⎤ ⊣⊢ (⎡P⎤ ∗-∗ ⎡Q⎤). - Proof. by rewrite bi_embed_and !bi_embed_wand. Qed. - Lemma bi_embed_affinely P : ⎡bi_affinely P⎤ ⊣⊢ bi_affinely ⎡P⎤. - Proof. by rewrite bi_embed_and bi_embed_emp. Qed. - Lemma bi_embed_absorbingly P : ⎡bi_absorbingly P⎤ ⊣⊢ bi_absorbingly ⎡P⎤. - Proof. by rewrite bi_embed_sep bi_embed_pure. Qed. - Lemma bi_embed_plainly_if P b : ⎡bi_plainly_if b P⎤ ⊣⊢ bi_plainly_if b ⎡P⎤. - Proof. destruct b; auto using bi_embed_plainly. Qed. - Lemma bi_embed_persistently_if P b : - ⎡bi_persistently_if b P⎤ ⊣⊢ bi_persistently_if b ⎡P⎤. - Proof. destruct b; auto using bi_embed_persistently. Qed. - Lemma bi_embed_affinely_if P b : ⎡bi_affinely_if b P⎤ ⊣⊢ bi_affinely_if b ⎡P⎤. - Proof. destruct b; simpl; auto using bi_embed_affinely. Qed. - Lemma bi_embed_hforall {As} (Φ : himpl As PROP1): - ⎡bi_hforall Φ⎤ ⊣⊢ bi_hforall (hcompose bi_embed Φ). - Proof. induction As=>//. rewrite /= bi_embed_forall. by do 2 f_equiv. Qed. - Lemma bi_embed_hexist {As} (Φ : himpl As PROP1): - ⎡bi_hexist Φ⎤ ⊣⊢ bi_hexist (hcompose bi_embed Φ). - Proof. induction As=>//. rewrite /= bi_embed_exist. by do 2 f_equiv. Qed. - - Global Instance bi_embed_plain P : Plain P → Plain ⎡P⎤. - Proof. intros ?. by rewrite /Plain -bi_embed_plainly -plain. Qed. - Global Instance bi_embed_persistent P : Persistent P → Persistent ⎡P⎤. - Proof. intros ?. by rewrite /Persistent -bi_embed_persistently -persistent. Qed. - Global Instance bi_embed_affine P : Affine P → Affine ⎡P⎤. - Proof. intros ?. by rewrite /Affine (affine P) bi_embed_emp. Qed. - Global Instance bi_embed_absorbing P : Absorbing P → Absorbing ⎡P⎤. - Proof. intros ?. by rewrite /Absorbing -bi_embed_absorbingly absorbing. Qed. -End bi_embedding. - -Section sbi_embedding. - Context `{SbiEmbedding PROP1 PROP2}. - - Lemma sbi_embed_laterN n P : ⎡▷^n P⎤ ⊣⊢ â–·^n ⎡P⎤. - Proof. induction n=>//=. rewrite sbi_embed_later. by f_equiv. Qed. - Lemma sbi_embed_except_0 P : ⎡◇ P⎤ ⊣⊢ â—‡ ⎡P⎤. - Proof. by rewrite bi_embed_or sbi_embed_later bi_embed_pure. Qed. - - Global Instance sbi_embed_timeless P : Timeless P → Timeless ⎡P⎤. - Proof. - intros ?. by rewrite /Timeless -sbi_embed_except_0 -sbi_embed_later timeless. - Qed. -End sbi_embedding. \ No newline at end of file diff --git a/theories/bi/embedding.v b/theories/bi/embedding.v new file mode 100644 index 000000000..ac2ad7bf6 --- /dev/null +++ b/theories/bi/embedding.v @@ -0,0 +1,134 @@ +From iris.bi Require Import interface derived_laws. +From stdpp Require Import hlist. + +(* Embeddings are often used to *define* the connectives of the + domain BI. Hence we cannot ask it to verify the properties of + embeddings. *) +Class BiEmbed (A B : Type) := bi_embed : A → B. +Arguments bi_embed {_ _ _} _%I : simpl never. +Notation "⎡ P ⎤" := (bi_embed P) : bi_scope. +Instance: Params (@bi_embed) 3. +Typeclasses Opaque bi_embed. + +Class BiEmbedding (PROP1 PROP2 : bi) `{BiEmbed PROP1 PROP2} := { + bi_embed_ne :> NonExpansive bi_embed; + bi_embed_mono :> Proper ((⊢) ==> (⊢)) bi_embed; + bi_embed_entails_inj :> Inj (⊢) (⊢) bi_embed; + bi_embed_emp : ⎡emp⎤ ⊣⊢ emp; + bi_embed_impl_2 P Q : (⎡P⎤ → ⎡Q⎤) ⊢ ⎡P → Q⎤; + bi_embed_forall_2 A (Φ : A → PROP1) : (∀ x, ⎡Φ x⎤) ⊢ ⎡∀ x, Φ x⎤; + bi_embed_exist_1 A (Φ : A → PROP1) : ⎡∃ x, Φ x⎤ ⊢ ∃ x, ⎡Φ x⎤; + bi_embed_internal_eq_1 (A : ofeT) (x y : A) : ⎡x ≡ y⎤ ⊢ x ≡ y; + bi_embed_sep P Q : ⎡P ∗ Q⎤ ⊣⊢ ⎡P⎤ ∗ ⎡Q⎤; + bi_embed_wand_2 P Q : (⎡P⎤ -∗ ⎡Q⎤) ⊢ ⎡P -∗ Q⎤; + bi_embed_plainly P : ⎡bi_plainly P⎤ ⊣⊢ bi_plainly ⎡P⎤; + bi_embed_persistently P : ⎡bi_persistently P⎤ ⊣⊢ bi_persistently ⎡P⎤ +}. + +Class SbiEmbedding (PROP1 PROP2 : sbi) `{BiEmbed PROP1 PROP2} := { + sbi_embed_bi_embed :> BiEmbedding PROP1 PROP2; + sbi_embed_later P : ⎡▷ P⎤ ⊣⊢ â–· ⎡P⎤ +}. + +Section bi_embedding. + Context `{BiEmbedding PROP1 PROP2}. + + Global Instance bi_embed_proper : Proper ((≡) ==> (≡)) bi_embed. + Proof. apply (ne_proper _). Qed. + Global Instance bi_embed_mono_flip : Proper (flip (⊢) ==> flip (⊢)) bi_embed. + Proof. solve_proper. Qed. + Global Instance bi_embed_inj : Inj (≡) (≡) bi_embed. + Proof. + intros ?? EQ. apply bi.equiv_spec, conj; apply (inj bi_embed); + rewrite EQ //. + Qed. + + Lemma bi_embed_valid (P : PROP1) : @bi_embed PROP1 PROP2 _ P ↔ P. + Proof. + by rewrite /bi_valid -bi_embed_emp; split=>?; [apply (inj bi_embed)|f_equiv]. + Qed. + + Lemma bi_embed_forall A (Φ : A → PROP1) : ⎡∀ x, Φ x⎤ ⊣⊢ ∀ x, ⎡Φ x⎤. + Proof. + apply bi.equiv_spec; split; [|apply bi_embed_forall_2]. + apply bi.forall_intro=>?. by rewrite bi.forall_elim. + Qed. + Lemma bi_embed_exist A (Φ : A → PROP1) : ⎡∃ x, Φ x⎤ ⊣⊢ ∃ x, ⎡Φ x⎤. + Proof. + apply bi.equiv_spec; split; [apply bi_embed_exist_1|]. + apply bi.exist_elim=>?. by rewrite -bi.exist_intro. + Qed. + Lemma bi_embed_and P Q : ⎡P ∧ Q⎤ ⊣⊢ ⎡P⎤ ∧ ⎡Q⎤. + Proof. rewrite !bi.and_alt bi_embed_forall. by f_equiv=>-[]. Qed. + Lemma bi_embed_or P Q : ⎡P ∨ Q⎤ ⊣⊢ ⎡P⎤ ∨ ⎡Q⎤. + Proof. rewrite !bi.or_alt bi_embed_exist. by f_equiv=>-[]. Qed. + Lemma bi_embed_impl P Q : ⎡P → Q⎤ ⊣⊢ (⎡P⎤ → ⎡Q⎤). + Proof. + apply bi.equiv_spec; split; [|apply bi_embed_impl_2]. + apply bi.impl_intro_l. by rewrite -bi_embed_and bi.impl_elim_r. + Qed. + Lemma bi_embed_wand P Q : ⎡P -∗ Q⎤ ⊣⊢ (⎡P⎤ -∗ ⎡Q⎤). + Proof. + apply bi.equiv_spec; split; [|apply bi_embed_wand_2]. + apply bi.wand_intro_l. by rewrite -bi_embed_sep bi.wand_elim_r. + Qed. + Lemma bi_embed_pure φ : ⎡⌜φâŒâŽ¤ ⊣⊢ ⌜φâŒ. + Proof. + rewrite (@bi.pure_alt PROP1) (@bi.pure_alt PROP2) bi_embed_exist. + do 2 f_equiv. apply bi.equiv_spec. split; [apply bi.True_intro|]. + rewrite -(_ : (emp → emp : PROP1) ⊢ True) ?bi_embed_impl; + last apply bi.True_intro. + apply bi.impl_intro_l. by rewrite right_id. + Qed. + Lemma bi_embed_internal_eq (A : ofeT) (x y : A) : ⎡x ≡ y⎤ ⊣⊢ x ≡ y. + Proof. + apply bi.equiv_spec; split; [apply bi_embed_internal_eq_1|]. + etrans; [apply (bi.internal_eq_rewrite x y (λ y, ⎡x ≡ y⎤%I)); solve_proper|]. + rewrite -(bi.internal_eq_refl True%I) bi_embed_pure. + eapply bi.impl_elim; [done|]. apply bi.True_intro. + Qed. + Lemma bi_embed_iff P Q : ⎡P ↔ Q⎤ ⊣⊢ (⎡P⎤ ↔ ⎡Q⎤). + Proof. by rewrite bi_embed_and !bi_embed_impl. Qed. + Lemma bi_embed_wand_iff P Q : ⎡P ∗-∗ Q⎤ ⊣⊢ (⎡P⎤ ∗-∗ ⎡Q⎤). + Proof. by rewrite bi_embed_and !bi_embed_wand. Qed. + Lemma bi_embed_affinely P : ⎡bi_affinely P⎤ ⊣⊢ bi_affinely ⎡P⎤. + Proof. by rewrite bi_embed_and bi_embed_emp. Qed. + Lemma bi_embed_absorbingly P : ⎡bi_absorbingly P⎤ ⊣⊢ bi_absorbingly ⎡P⎤. + Proof. by rewrite bi_embed_sep bi_embed_pure. Qed. + Lemma bi_embed_plainly_if P b : ⎡bi_plainly_if b P⎤ ⊣⊢ bi_plainly_if b ⎡P⎤. + Proof. destruct b; auto using bi_embed_plainly. Qed. + Lemma bi_embed_persistently_if P b : + ⎡bi_persistently_if b P⎤ ⊣⊢ bi_persistently_if b ⎡P⎤. + Proof. destruct b; auto using bi_embed_persistently. Qed. + Lemma bi_embed_affinely_if P b : ⎡bi_affinely_if b P⎤ ⊣⊢ bi_affinely_if b ⎡P⎤. + Proof. destruct b; simpl; auto using bi_embed_affinely. Qed. + Lemma bi_embed_hforall {As} (Φ : himpl As PROP1): + ⎡bi_hforall Φ⎤ ⊣⊢ bi_hforall (hcompose bi_embed Φ). + Proof. induction As=>//. rewrite /= bi_embed_forall. by do 2 f_equiv. Qed. + Lemma bi_embed_hexist {As} (Φ : himpl As PROP1): + ⎡bi_hexist Φ⎤ ⊣⊢ bi_hexist (hcompose bi_embed Φ). + Proof. induction As=>//. rewrite /= bi_embed_exist. by do 2 f_equiv. Qed. + + Global Instance bi_embed_plain P : Plain P → Plain ⎡P⎤. + Proof. intros ?. by rewrite /Plain -bi_embed_plainly -plain. Qed. + Global Instance bi_embed_persistent P : Persistent P → Persistent ⎡P⎤. + Proof. intros ?. by rewrite /Persistent -bi_embed_persistently -persistent. Qed. + Global Instance bi_embed_affine P : Affine P → Affine ⎡P⎤. + Proof. intros ?. by rewrite /Affine (affine P) bi_embed_emp. Qed. + Global Instance bi_embed_absorbing P : Absorbing P → Absorbing ⎡P⎤. + Proof. intros ?. by rewrite /Absorbing -bi_embed_absorbingly absorbing. Qed. +End bi_embedding. + +Section sbi_embedding. + Context `{SbiEmbedding PROP1 PROP2}. + + Lemma sbi_embed_laterN n P : ⎡▷^n P⎤ ⊣⊢ â–·^n ⎡P⎤. + Proof. induction n=>//=. rewrite sbi_embed_later. by f_equiv. Qed. + Lemma sbi_embed_except_0 P : ⎡◇ P⎤ ⊣⊢ â—‡ ⎡P⎤. + Proof. by rewrite bi_embed_or sbi_embed_later bi_embed_pure. Qed. + + Global Instance sbi_embed_timeless P : Timeless P → Timeless ⎡P⎤. + Proof. + intros ?. by rewrite /Timeless -sbi_embed_except_0 -sbi_embed_later timeless. + Qed. +End sbi_embedding. diff --git a/theories/bi/interface.v b/theories/bi/interface.v index 9f8f611ac..2add9f305 100644 --- a/theories/bi/interface.v +++ b/theories/bi/interface.v @@ -524,31 +524,3 @@ Proof. eapply sbi_mixin_later_false_em, sbi_sbi_mixin. Qed. End sbi_laws. End bi. - -(* Typically, embeddings are used to *define* the destination BI. - Hence we cannot ask it to verify the properties of embeddings. *) -Class BiEmbed (A B : Type) := bi_embed : A → B. -Arguments bi_embed {_ _ _} _%I : simpl never. -Notation "⎡ P ⎤" := (bi_embed P) : bi_scope. -Instance: Params (@bi_embed) 3. -Typeclasses Opaque bi_embed. - -Class BiEmbedding (PROP1 PROP2 : bi) `{BiEmbed PROP1 PROP2} := { - bi_embed_ne :> NonExpansive bi_embed; - bi_embed_mono :> Proper ((⊢) ==> (⊢)) bi_embed; - bi_embed_entails_inj :> Inj (⊢) (⊢) bi_embed; - bi_embed_emp : ⎡emp⎤ ⊣⊢ emp; - bi_embed_impl_2 P Q : (⎡P⎤ → ⎡Q⎤) ⊢ ⎡P → Q⎤; - bi_embed_forall_2 A (Φ : A → PROP1) : (∀ x, ⎡Φ x⎤) ⊢ ⎡∀ x, Φ x⎤; - bi_embed_exist_1 A (Φ : A → PROP1) : ⎡∃ x, Φ x⎤ ⊢ ∃ x, ⎡Φ x⎤; - bi_embed_internal_eq_1 (A : ofeT) (x y : A) : ⎡x ≡ y⎤ ⊢ x ≡ y; - bi_embed_sep P Q : ⎡P ∗ Q⎤ ⊣⊢ ⎡P⎤ ∗ ⎡Q⎤; - bi_embed_wand_2 P Q : (⎡P⎤ -∗ ⎡Q⎤) ⊢ ⎡P -∗ Q⎤; - bi_embed_plainly P : ⎡bi_plainly P⎤ ⊣⊢ bi_plainly ⎡P⎤; - bi_embed_persistently P : ⎡bi_persistently P⎤ ⊣⊢ bi_persistently ⎡P⎤ -}. - -Class SbiEmbedding (PROP1 PROP2 : sbi) `{BiEmbed PROP1 PROP2} := { - sbi_embed_bi_embed :> BiEmbedding PROP1 PROP2; - sbi_embed_later P : ⎡▷ P⎤ ⊣⊢ â–· ⎡P⎤ -}. diff --git a/theories/bi/monpred.v b/theories/bi/monpred.v index e0ac53384..7caa5644c 100644 --- a/theories/bi/monpred.v +++ b/theories/bi/monpred.v @@ -1,4 +1,4 @@ -From iris.bi Require Import derived_laws. +From iris.bi Require Import bi. (** Definitions. *) -- GitLab