Skip to content
Snippets Groups Projects
Commit 6bbcc096 authored by Robbert Krebbers's avatar Robbert Krebbers Committed by Hai Dang
Browse files

Improve coding style.

parent 195389f0
No related branches found
No related tags found
No related merge requests found
...@@ -311,95 +311,68 @@ Section embed. ...@@ -311,95 +311,68 @@ Section embed.
End plainly. End plainly.
End embed. End embed.
(** Transitive embedding: this constructs an embedding of [PROP1] into [PROP3] (* Not defined using an ordinary [Instance] because the default
by combining the embeddings of [PROP1] into [PROP2] and [PROP2] into [PROP3]. [class_apply @bi_embed_plainly] shelves the [BiPlainly] premise, making proof
Note that declaring these instances globally can make TC search ambiguous or search for the other premises fail. See the proof of [monPred_objectively_plain]
diverging. These are only defined so that a user can conveniently use them to for an example where it would fail with a regular [Instance].*)
manually combine embeddings. *) Global Hint Extern 4 (Plain _) =>
Section transitive_embedding. notypeclasses refine (embed_plain _ _) : typeclass_instances.
Context `{BE1: BiEmbed PROP1 PROP2} `{BE2: BiEmbed PROP2 PROP3}.
Local Instance embed_embed : Embed PROP1 PROP3 :=
λ P, embed (embed P).
Local Ltac unfold_embed := rewrite /embed /bi_embed_embed /= /embed_embed /=.
Local Instance embed_embed_mono : (** Transitive embedding: this constructs an embedding of [PROP1] into [PROP3]
Proper (() ==> ()) (@embed PROP1 PROP3 _). by combining the embeddings of [PROP1] into [PROP2] and [PROP2] into [PROP3].
Proof. intros ?? PQ. unfold_embed. by rewrite PQ. Qed. Note that declaring these instances globally can make TC search ambiguous or
diverging. These are only defined so that a user can conveniently use them to
manually combine embeddings. *)
Section embed_embed.
Context `{BiEmbed PROP1 PROP2, BiEmbed PROP2 PROP3}.
Local Instance embed_embed_ne : NonExpansive (@embed PROP1 PROP3 _). Local Instance embed_embed : Embed PROP1 PROP3 := λ P, P ⎤%I.
Proof. unfold_embed. solve_proper. Qed.
Definition embed_embedding_mixin : Lemma embed_embedding_mixin : BiEmbedMixin PROP1 PROP3 embed_embed.
BiEmbedMixin PROP1 PROP3 embed_embed.
Proof. Proof.
split; try apply _; unfold_embed. split; unfold embed, embed_embed.
- intros P. rewrite embed_emp_valid. by apply BE1. - solve_proper.
- intros PROP' IN P Q. rewrite embed_interal_inj; by apply BE1. - solve_proper.
- rewrite -bi_embed_mixin_emp_2; [|apply BE1]. apply BE2. - intros P. by rewrite !embed_emp_valid.
- intros P Q. rewrite -embed_impl. apply embed_mono, BE1. - intros PROP' ? P Q. by rewrite !embed_interal_inj.
- intros A Φ. rewrite -embed_forall. apply embed_mono, BE1. - by rewrite -!embed_emp_2.
- intros A Φ. rewrite -embed_exist. apply embed_mono, BE1. - intros P Q. by rewrite -!embed_impl.
- intros P Q. rewrite -embed_sep. apply embed_proper, BE1. - intros A Φ. by rewrite -!embed_forall.
- intros P Q. rewrite -embed_wand. apply embed_mono, BE1. - intros A Φ. by rewrite -!embed_exist.
- intros P. rewrite -embed_persistently. apply embed_proper, BE1. - intros P Q. by rewrite -!embed_sep.
- intros P Q. by rewrite -!embed_wand.
- intros P. by rewrite -!embed_persistently.
Qed. Qed.
Local Instance embed_bi_embed : BiEmbed PROP1 PROP3 := Local Instance embed_bi_embed : BiEmbed PROP1 PROP3 :=
{| bi_embed_mixin := embed_embedding_mixin |}. {| bi_embed_mixin := embed_embedding_mixin |}.
Definition embed_embed_emp Lemma embed_embed_alt (P : PROP1) : P ⊣⊢@{PROP3} P ⎤.
`{@BiEmbedEmp _ _ BE1} `{@BiEmbedEmp _ _ BE2} : Proof. done. Qed.
Lemma embed_embed_emp :
BiEmbedEmp PROP1 PROP2 BiEmbedEmp PROP2 PROP3
BiEmbedEmp PROP1 PROP3. BiEmbedEmp PROP1 PROP3.
Proof. Proof. rewrite /BiEmbedEmp !embed_embed_alt. by intros -> ->. Qed.
rewrite /BiEmbedEmp. unfold_embed. Lemma embed_embed_later :
rewrite -embed_emp. apply embed_mono. by apply embed_emp_1. BiEmbedLater PROP1 PROP2 BiEmbedLater PROP2 PROP3
Qed.
Definition embed_embed_later
`{@BiEmbedLater _ _ BE1} `{@BiEmbedLater _ _ BE2} :
BiEmbedLater PROP1 PROP3. BiEmbedLater PROP1 PROP3.
Proof. Proof. intros ?? P. by rewrite !embed_embed_alt !embed_later. Qed.
rewrite /BiEmbedLater => P. unfold_embed. Lemma embed_embed_internal_eq
rewrite -embed_later. apply embed_proper. by apply embed_later. `{!BiInternalEq PROP1, !BiInternalEq PROP2, !BiInternalEq PROP3} :
Qed. BiEmbedInternalEq PROP1 PROP2 BiEmbedInternalEq PROP2 PROP3
Definition embed_embed_internal_eq
`{BiInternalEq PROP1} `{BiInternalEq PROP2} `{BiInternalEq PROP3}
`{@BiEmbedInternalEq _ _ BE1 _ _} `{@BiEmbedInternalEq _ _ BE2 _ _} :
BiEmbedInternalEq PROP1 PROP3. BiEmbedInternalEq PROP1 PROP3.
Proof. Proof. intros ?? A x y. by rewrite !embed_embed_alt !embed_internal_eq. Qed.
rewrite /BiEmbedInternalEq => ???. unfold_embed. Lemma embed_embed_bupd `{!BiBUpd PROP1, !BiBUpd PROP2, !BiBUpd PROP3} :
rewrite -embed_internal_eq. apply embed_mono. by apply embed_internal_eq_1. BiEmbedBUpd PROP1 PROP2 BiEmbedBUpd PROP2 PROP3
Qed.
Definition embed_embed_bupd
`{BiBUpd PROP1} `{BiBUpd PROP2} `{BiBUpd PROP3}
`{@BiEmbedBUpd _ _ BE1 _ _} `{@BiEmbedBUpd _ _ BE2 _ _} :
BiEmbedBUpd PROP1 PROP3. BiEmbedBUpd PROP1 PROP3.
Proof. Proof. intros ?? P. by rewrite !embed_embed_alt !embed_bupd. Qed.
rewrite /BiEmbedBUpd => P. unfold_embed. Lemma embed_embed_fupd `{!BiFUpd PROP1, !BiFUpd PROP2, !BiFUpd PROP3} :
rewrite -embed_bupd. apply embed_proper. by apply embed_bupd. BiEmbedFUpd PROP1 PROP2 BiEmbedFUpd PROP2 PROP3
Qed.
Definition embed_embed_fupd
`{BiFUpd PROP1} `{BiFUpd PROP2} `{BiFUpd PROP3}
`{@BiEmbedFUpd _ _ BE1 _ _} `{@BiEmbedFUpd _ _ BE2 _ _} :
BiEmbedFUpd PROP1 PROP3. BiEmbedFUpd PROP1 PROP3.
Proof. Proof. intros ?? E1 E2 P. by rewrite !embed_embed_alt !embed_fupd. Qed.
rewrite /BiEmbedFUpd => ?? P. unfold_embed. Lemma embed_embed_plainly
rewrite -embed_fupd. apply embed_proper. by apply embed_fupd. `{!BiPlainly PROP1, !BiPlainly PROP2, !BiPlainly PROP3} :
Qed. BiEmbedPlainly PROP1 PROP2 BiEmbedPlainly PROP2 PROP3
Definition embed_embed_plainly
`{BiPlainly PROP1} `{BiPlainly PROP2} `{BiPlainly PROP3}
`{@BiEmbedPlainly _ _ BE1 _ _} `{@BiEmbedPlainly _ _ BE2 _ _} :
BiEmbedPlainly PROP1 PROP3. BiEmbedPlainly PROP1 PROP3.
Proof. Proof. intros ?? P. by rewrite !embed_embed_alt !embed_plainly. Qed.
rewrite /BiEmbedPlainly => P. unfold_embed. End embed_embed.
rewrite -embed_plainly. apply embed_proper. by apply embed_plainly.
Qed.
End transitive_embedding.
(* Not defined using an ordinary [Instance] because the default
[class_apply @bi_embed_plainly] shelves the [BiPlainly] premise, making proof
search for the other premises fail. See the proof of [monPred_objectively_plain]
for an example where it would fail with a regular [Instance].*)
Global Hint Extern 4 (Plain _) =>
notypeclasses refine (embed_plain _ _) : typeclass_instances.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment