Library zoo.iris.algebra.lib.twins

Require Import iris.algebra.excl.
Require Import iris.algebra.proofmode_classes.

Require Import zoo.prelude.
Require Export zoo.iris.algebra.base.
Require Import zoo.iris.algebra.lib.auth_option.
Require Import zoo.options.

Definition twins {SI : sidx} A :=
  auth_option (exclR A).
Definition twins۰R {SI : sidx} A :=
  auth_option۰R (exclR A).
Definition twins۰UR {SI : sidx} A :=
  auth_option۰UR (exclR A).

Section ofe.
  Context {SI : sidx}.
  Context {A : ofe}.

  Implicit Type a b : A.

  Definition twins۰twin₁ dq a : twins۰UR A :=
    O{dq} (Excl a).
  Definition twins۰twin₂ a : twins۰UR A :=
    O (Excl a).

  #[global] Instance twins۰twin₁ne dq :
    NonExpansive (twins۰twin₁ dq).
  #[global] Instance twins۰twin₁proper dq :
    Proper ((≡) ==> (≡)) (twins۰twin₁ dq).
  #[global] Instance twins۰twin₂ne :
    NonExpansive twins۰twin₂.
  #[global] Instance twins۰twin₂proper :
    Proper ((≡) ==> (≡)) twins۰twin₂.

  #[global] Instance twins۰twin₁distinj n :
    Inj2 (=) (≡{n}≡) (≡{n}≡) twins۰twin₁.
  #[global] Instance twins۰twin₁inj :
    Inj2 (=) (≡) (≡) twins۰twin₁.
  #[global] Instance twins۰twin₂distinj n :
    Inj (≡{n}≡) (≡{n}≡) twins۰twin₂.
  #[global] Instance twins۰twin₂inj :
    Inj (≡) (≡) twins۰twin₂.

  #[global] Instance twins۰twin₁discrete dq a :
    Discrete a
    Discrete (twins۰twin₁ dq a).
  #[global] Instance twins۰twin₂discrete a :
    Discrete a
    Discrete (twins۰twin₂ a).
  #[global] Instance twins۰cmra_discrete :
    OfeDiscrete A
    CmraDiscrete (twins۰R A).

  Lemma twins۰twin₁dfracop dq1 dq2 a :
    twins۰twin₁ (dq1 dq2) a twins۰twin₁ dq1 a twins۰twin₁ dq2 a.
  #[global] Instance twins۰twin₁dfracis_op dq dq1 dq2 a :
    IsOp dq dq1 dq2
    IsOp' (twins۰twin₁ dq a) (twins۰twin₁ dq1 a) (twins۰twin₁ dq2 a).

  #[global] Instance twins۰twin₁core_id a :
    CoreId (twins۰twin₁ DfracDiscarded a).

  Lemma twins۰twin₁dfracvalidN n dq a :
    ✓{n} (twins۰twin₁ dq a)
     dq.
  Lemma twins۰twin₁dfracvalid dq a :
     (twins۰twin₁ dq a)
     dq.
  Lemma twins۰twin₁validN n a :
    ✓{n} (twins۰twin₁ (DfracOwn 1) a).
  Lemma twins۰twin₁valid a :
     (twins۰twin₁ (DfracOwn 1) a).

  Lemma twins۰twin₁dfracopvalidN n dq1 a1 dq2 a2 :
    ✓{n} (twins۰twin₁ dq1 a1 twins۰twin₁ dq2 a2)
     (dq1 dq2) a1 ≡{n}≡ a2.
  Lemma twins۰twin₁dfracopvalid dq1 a1 dq2 a2 :
     (twins۰twin₁ dq1 a1 twins۰twin₁ dq2 a2)
     (dq1 dq2) a1 a2.
  Lemma twins۰twin₁opvalidN n a1 a2 :
    ✓{n} (twins۰twin₁ (DfracOwn 1) a1 twins۰twin₁ (DfracOwn 1) a2)
    False.
  Lemma twins۰twin₁opvalid a b :
     (twins۰twin₁ (DfracOwn 1) a twins۰twin₁ (DfracOwn 1) b)
    False.

  Lemma twins۰twin₂validN n a :
    ✓{n} (twins۰twin₂ a).
  Lemma twins۰twin₂valid a :
     (twins۰twin₂ a).

  Lemma twins۰twin₂opvalidN n a b :
    ✓{n} (twins۰twin₂ a twins۰twin₂ b)
    False.
  Lemma twins۰twin₂opvalid a b :
     (twins۰twin₂ a twins۰twin₂ b)
    False.

  Lemma twinsbothdfracvalidN n dq a b :
    ✓{n} (twins۰twin₁ dq a twins۰twin₂ b)
     dq a ≡{n}≡ b.
  Lemma twinsbothdfracvalid dq a b :
     (twins۰twin₁ dq a twins۰twin₂ b)
     dq a b.
  Lemma twinsbothvalidN n a b :
    ✓{n} (twins۰twin₁ (DfracOwn 1) a twins۰twin₂ b)
    a ≡{n}≡ b.
  Lemma twinsbothvalid a b :
     (twins۰twin₁ (DfracOwn 1) a twins۰twin₂ b)
    a b.

  Lemma twins۰twin₁persist dq a :
    twins۰twin₁ dq a ~~> twins۰twin₁ DfracDiscarded a.
  Lemma twinsbothupdate a1 b1 a2 b2 :
    a2 b2
    twins۰twin₁ (DfracOwn 1) a1 twins۰twin₂ b1 ~~> twins۰twin₁ (DfracOwn 1) a2 twins۰twin₂ b2.
End ofe.

#[global] Opaque twins۰twin₁.
#[global] Opaque twins۰twin₂.

Definition twins۰URF {SI : sidx} F :=
  auth_option۰URF $ exclRF F.
#[global] Instance twins۰URFcontractive {SI : sidx} F :
  oFunctorContractive F
  urFunctorContractive (twins۰URF F).

Definition twins۰RF {SI : sidx} F :=
  auth_option۰RF $ exclRF F.
#[global] Instance twins۰RFcontractive {SI : sidx} F :
  oFunctorContractive F
  rFunctorContractive (twins۰RF F).