From ff935fd4a4e072e026760a2eac9b9196e0ca74c8 Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Wed, 5 Oct 2016 14:08:49 +0200
Subject: [PATCH] Define FromOp type class and use it in the proof mode.

---
 proofmode/class_instances.v | 21 ++++++++++++++++++---
 proofmode/classes.v         |  3 +++
 proofmode/ghost_ownership.v |  6 +++---
 3 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/proofmode/class_instances.v b/proofmode/class_instances.v
index e193dd85a..47277f8bb 100644
--- a/proofmode/class_instances.v
+++ b/proofmode/class_instances.v
@@ -132,6 +132,10 @@ Proof. rewrite /FromAnd=> <-. by rewrite later_and. Qed.
 (* FromSep *)
 Global Instance from_sep_sep P1 P2 : FromSep (P1 ★ P2) P1 P2 | 100.
 Proof. done. Qed.
+Global Instance from_sep_ownM (a b1 b2 : M) :
+  FromOp a b1 b2 →
+  FromSep (uPred_ownM a) (uPred_ownM b1) (uPred_ownM b2).
+Proof. intros. by rewrite /FromSep -ownM_op from_op. Qed.
 Global Instance from_sep_always P Q1 Q2 :
   FromSep P Q1 Q2 → FromSep (□ P) (□ Q1) (□ Q2).
 Proof. rewrite /FromSep=> <-. by rewrite always_sep. Qed.
@@ -142,9 +146,6 @@ Global Instance from_sep_rvs P Q1 Q2 :
   FromSep P Q1 Q2 → FromSep (|=r=> P) (|=r=> Q1) (|=r=> Q2).
 Proof. rewrite /FromSep=><-. apply rvs_sep. Qed.
 
-Global Instance from_sep_ownM (a b : M) :
-  FromSep (uPred_ownM (a â‹… b)) (uPred_ownM a) (uPred_ownM b) | 99.
-Proof. by rewrite /FromSep ownM_op. Qed.
 Global Instance from_sep_big_sepM
     `{Countable K} {A} (Φ Ψ1 Ψ2 : K → A → uPred M) m :
   (∀ k x, FromSep (Φ k x) (Ψ1 k x) (Ψ2 k x)) →
@@ -160,6 +161,20 @@ Proof.
   rewrite /FromSep=> ?. rewrite -big_sepS_sepS. by apply big_sepS_mono.
 Qed.
 
+(* FromOp *)
+Global Instance from_op_op {A : cmraT} (a b : A) : FromOp (a â‹… b) a b.
+Proof. by rewrite /FromOp. Qed.
+Global Instance from_op_persistent {A : cmraT} (a : A) :
+  Persistent a → FromOp a a a.
+Proof. intros. by rewrite /FromOp -(persistent_dup a). Qed.
+Global Instance from_op_pair {A B : cmraT} (a b1 b2 : A) (a' b1' b2' : B) :
+  FromOp a b1 b2 → FromOp a' b1' b2' →
+  FromOp (a,a') (b1,b1') (b2,b2').
+Proof. by constructor. Qed.
+Global Instance from_op_Some {A : cmraT} (a : A) b1 b2 :
+  FromOp a b1 b2 → FromOp (Some a) (Some b1) (Some b2).
+Proof. by constructor. Qed.
+
 (* IntoOp *)
 Global Instance into_op_op {A : cmraT} (a b : A) : IntoOp (a â‹… b) a b.
 Proof. by rewrite /IntoOp. Qed.
diff --git a/proofmode/classes.v b/proofmode/classes.v
index ac65c81e3..5963a454d 100644
--- a/proofmode/classes.v
+++ b/proofmode/classes.v
@@ -39,6 +39,9 @@ Global Arguments into_and : clear implicits.
 Lemma mk_into_and_sep p P Q1 Q2 : (P ⊢ Q1 ★ Q2) → IntoAnd p P Q1 Q2.
 Proof. rewrite /IntoAnd=>->. destruct p; auto using sep_and. Qed.
 
+Class FromOp {A : cmraT} (a b1 b2 : A) := from_op : b1 ⋅ b2 ≡ a.
+Global Arguments from_op {_} _ _ _ {_}.
+
 Class IntoOp {A : cmraT} (a b1 b2 : A) := into_op : a ≡ b1 ⋅ b2.
 Global Arguments into_op {_} _ _ _ {_}.
 
diff --git a/proofmode/ghost_ownership.v b/proofmode/ghost_ownership.v
index a1a2804ed..d09303599 100644
--- a/proofmode/ghost_ownership.v
+++ b/proofmode/ghost_ownership.v
@@ -9,7 +9,7 @@ Implicit Types a b : A.
 Global Instance into_and_own p γ a b1 b2 :
   IntoOp a b1 b2 → IntoAnd p (own γ a) (own γ b1) (own γ b2).
 Proof. intros. apply mk_into_and_sep. by rewrite (into_op a) own_op. Qed.
-Global Instance from_sep_own γ a b :
-  FromSep (own γ (a ⋅ b)) (own γ a) (own γ b) | 90.
-Proof. by rewrite /FromSep own_op. Qed.
+Global Instance from_sep_own γ a b1 b2 :
+  FromOp a b1 b2 → FromSep (own γ a) (own γ b1) (own γ b2).
+Proof. intros. by rewrite /FromSep -own_op from_op. Qed.
 End ghost.
-- 
GitLab