From e2c98f5cc3c55d82178fd1ea1132582cc2a2e394 Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Thu, 1 Dec 2016 23:56:57 +0100
Subject: [PATCH] Stuck.

---
 theories/lifetime/primitive.v    | 10 ++++++++
 theories/lifetime/raw_reborrow.v |  2 +-
 theories/lifetime/reborrow.v     | 44 +++++++++++++++++++++++++-------
 3 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/theories/lifetime/primitive.v b/theories/lifetime/primitive.v
index 0f2ab240..6450bba1 100644
--- a/theories/lifetime/primitive.v
+++ b/theories/lifetime/primitive.v
@@ -302,6 +302,16 @@ Proof.
   - rewrite -lft_dead_or. iIntros "[H†|H†]". by iApply "H1†". by iApply "H2†".
 Qed.
 
+Lemma lft_incl_mono κ1 κ1' κ2 κ2' :
+  κ1 ⊑ κ1' -∗ κ2 ⊑ κ2' -∗ κ1 ∪ κ2 ⊑ κ1' ∪ κ2'.
+Proof.
+  iIntros "#H1 #H2". iApply (lft_incl_glb with "[]").
+  - iApply (lft_incl_trans with "[] H1").
+    iApply lft_le_incl. apply gmultiset_union_subseteq_l.
+  - iApply (lft_incl_trans with "[] H2").
+    iApply lft_le_incl. apply gmultiset_union_subseteq_r.
+Qed.
+
 Lemma lft_incl_acc E κ κ' q :
   ↑lftN ⊆ E →
   κ ⊑ κ' -∗ q.[κ] ={E}=∗ ∃ q', q'.[κ'] ∗ (q'.[κ'] ={E}=∗ q.[κ]).
diff --git a/theories/lifetime/raw_reborrow.v b/theories/lifetime/raw_reborrow.v
index 32c27b7c..2b43fc72 100644
--- a/theories/lifetime/raw_reborrow.v
+++ b/theories/lifetime/raw_reborrow.v
@@ -129,7 +129,7 @@ Proof.
   iDestruct (own_bor_auth with "HI [Hi]") as %?.
   { by rewrite /idx_bor_own. }
   iDestruct (big_sepS_elem_of_acc _ _ κ with "Hinv") as "[Hκ Hκclose]".
-  { rewrite elem_of_difference elem_of_dom not_elem_of_singleton. done. }
+  { by rewrite elem_of_difference elem_of_dom not_elem_of_singleton. }
   iMod (raw_bor_unnest _ _ _ _ (idx_bor_own 1 (κ, i) ∗ Pi)%I
     with "[$HI $Hκ] Hi Hislice Hbor [Hvs]")
     as (Pb') "([HI Hκ] & $ & Halive & Hvs)"; [solve_ndisj|done|done|..].
diff --git a/theories/lifetime/reborrow.v b/theories/lifetime/reborrow.v
index 2da7a7f5..fc793e8e 100644
--- a/theories/lifetime/reborrow.v
+++ b/theories/lifetime/reborrow.v
@@ -1,5 +1,6 @@
-From lrust.lifetime Require Export derived.
-From lrust.lifetime Require Export raw_reborrow.
+From lrust.lifetime Require Export borrow derived.
+From lrust.lifetime Require Import raw_reborrow.
+From iris.algebra Require Import csum auth frac gmap dec_agree gset.
 From iris.base_logic Require Import big_op.
 From iris.base_logic.lib Require Import boxes.
 From iris.proofmode Require Import tactics.
@@ -28,13 +29,38 @@ Lemma bor_unnest E κ κ' P :
   ↑lftN ⊆ E →
   lft_ctx -∗ &{κ'} &{κ} P ={E, E∖↑lftN}▷=∗ &{κ ∪ κ'} P.
 Proof.
-  iIntros (?) "#LFT Hκ'". rewrite {2}/bor.
-  iMod (bor_exists with "LFT Hκ'") as (κ'') "Hκ'"; first done.
-  rewrite {1}/bor; iDestruct "Hκ'" as (κ''') "[#H⊑' Hκ''']".
-(*
-  iMod (raw_rebor _ _ (κ'' ∪ κ''') with "LFT Hκ'''") as "[Hκ Hclose]"; first done.
+  iIntros (?) "#LFT Hκ". rewrite {2}/bor.
+  iMod (bor_exists with "LFT Hκ") as (κ0) "Hκ"; first done.
+  rewrite {1}/bor; iDestruct "Hκ" as (κ0') "[#H⊑ Hκ]".
+  set (κ'' := κ0 ∪ κ0').
+  iMod (raw_rebor _ _ κ'' with "LFT Hκ") as "[Hκ _]"; first done.
   { apply gmultiset_union_subseteq_r. }
-Check   
-Qed. *)
+  iInv mgmtN as (A I) "(>HA & >HI & Hinv)" "Hclose".
+  iMod (ilft_create _ _ κ'' with "HA HI Hinv") as (A' I') "(% & HA & HI & Hinv)".
+  clear A I; rename A' into A; rename I' into I.
+  iDestruct (big_sepS_delete _ _ κ'' with "Hinv") as "[Hinv' Hinv]";
+    first by apply elem_of_dom.
+  rewrite {1}/lft_inv; iDestruct "Hinv'" as "[[Hinv' >%]|[Hdead >%]]"; last first.
+  { rewrite /lft_inv_dead;
+      iDestruct "Hdead" as (Pi) "(Hdead & Hcnt & Hinh)".
+    iMod (raw_bor_fake _ true _ P with "Hdead")
+      as "[Hdead Hbor]"; first solve_ndisj.
+    iMod ("Hclose" with "[- Hbor]") as "_".
+    { rewrite /lfts_inv. iExists A, I. iFrame "HA HI".
+      iApply (big_sepS_delete _ _ κ''); first by apply elem_of_dom.
+      iNext; iFrame "Hinv". rewrite /lft_inv. iRight. iSplit; last auto.
+      rewrite /lft_inv_dead. iExists Pi. iFrame. }
+    iApply (step_fupd_mask_mono E _ _ E); try solve_ndisj.
+    rewrite /bor. do 3 iModIntro. 
+    iExists κ''. iFrame "Hbor". rewrite /κ''.
+    (* Why is this going to work out *)
+    admit. }
+  rewrite {1}/raw_bor /idx_bor_own /=; iDestruct "Hκ" as (i) "[Hi #Hislice]".
+  rewrite lft_inv_alive_unfold;
+    iDestruct "Hinv'" as (Pb Pi) "(Halive & Hvs & Hinh)".
+  rewrite /lft_bor_alive; iDestruct "Halive" as (B) "(Hbox & >HB● & HB)".
+  iDestruct (own_bor_valid_2 with "HB● Hi")
+    as %[HB%to_borUR_included _]%auth_valid_discrete_2.
+  iMod (own_bor_update_2 with "HB● Hi") as "[HB● Hi]".
 Admitted.
 End reborrow.
-- 
GitLab