From 19cca411f3ddf7db03ffb2db34197a4f85de009e Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Thu, 12 Nov 2015 11:46:30 +0100
Subject: [PATCH] Owning a monoid element.

---
 iris/logic.v | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/iris/logic.v b/iris/logic.v
index 168edfbad..fdc73daff 100644
--- a/iris/logic.v
+++ b/iris/logic.v
@@ -137,6 +137,17 @@ Next Obligation.
     auto using ra_unit_preserving, cmra_unit_valid.
 Qed.
 
+Program Definition iprop_own {A : cmraT} (a : A) : iProp A :=
+  {| iprop_holds n x := ∃ a', x ={n}= a ⋅ a' |}.
+Next Obligation. by intros A a x1 x2 n [a' Hx] ?; exists a'; rewrite <-Hx. Qed.
+Next Obligation.
+  intros A a x1 x n1 n2; rewrite ra_included_spec; intros [x2 Hx] ?? [a' Hx1].
+  exists (a' â‹… x2). by rewrite (associative op), <-(dist_le _ _ _ _ Hx1), Hx.
+Qed.
+Program Definition iprop_valid {A : cmraT} (a : A) : iProp A :=
+  {| iprop_holds n x := validN n a |}.
+Solve Obligations with naive_solver eauto 2 using cmra_valid_le.
+
 Definition iprop_fixpoint {A} (P : iProp A → iProp A)
   `{!Contractive P} : iProp A := fixpoint P (iprop_const True).
 
@@ -402,9 +413,24 @@ Proof.
   by rewrite ra_unit_l, ra_unit_idempotent.
 Qed.
 
+(* Own *)
+Lemma iprop_own_op (a1 a2 : A) :
+  iprop_own (a1 ⋅ a2) ≡ (iprop_own a1 ★ iprop_own a2)%I.
+Proof.
+  intros x n ?; split.
+  * intros [z ?]; exists a1, (a2 â‹… z); split; [by rewrite (associative op)|].
+    split. by exists (unit a1); rewrite ra_unit_r. by exists z.
+  * intros (y1&y2&Hx&[z1 Hy1]&[z2 Hy2]); exists (z1 â‹… z2).
+    rewrite (associative op), <-(commutative op z1), <-!(associative op), <-Hy2.
+    by rewrite (associative op), (commutative op z1), <-Hy1.
+Qed.
+Lemma iprop_own_valid (a : A) : iprop_own a ⊆ iprop_valid a.
+Proof.
+  intros x n Hv [a' Hx]; simpl; rewrite Hx in Hv; eauto using cmra_valid_op_l.
+Qed.
+
 (* Fix *)
 Lemma iprop_fixpoint_unfold (P : iProp A → iProp A) `{!Contractive P} :
   iprop_fixpoint P ≡ P (iprop_fixpoint P).
 Proof. apply fixpoint_unfold. Qed.
 End logic.
-
-- 
GitLab