From 9271f70982fa4f840fb942f25c8eb9263e084de3 Mon Sep 17 00:00:00 2001
From: Jacques-Henri Jourdan <jacques-henri.jourdan@normalesup.org>
Date: Thu, 22 Dec 2016 17:13:44 +0100
Subject: [PATCH] Type class for unguarding.

It makes the rule for ending a lifetime more syntax directed.
---
 theories/typing/programs.v     | 15 +++++--------
 theories/typing/type_context.v | 40 +++++++++++++---------------------
 2 files changed, 21 insertions(+), 34 deletions(-)

diff --git a/theories/typing/programs.v b/theories/typing/programs.v
index acd7ed90..0a3cd6df 100644
--- a/theories/typing/programs.v
+++ b/theories/typing/programs.v
@@ -99,20 +99,18 @@ Section typing_rules.
 
   (* TODO: It should be possible to show this while taking only one step.
      Right now, we could take two. *)
-  Lemma typed_endlft E L C T κ κs e :
-    Closed [] e →
-    typed_body E L C (unblock_tctx κ T) e →
-    typed_body E ((κ, κs) :: L) C T (Endlft ;; e).
+  Lemma typed_endlft E L C T1 T2 κ κs e :
+    Closed [] e → UnblockTctx κ T1 T2 →
+    typed_body E L C T2 e → typed_body E ((κ, κs) :: L) C T1 (Endlft ;; e).
   Proof.
-    iIntros (Hc He tid qE) "#HEAP #LFT Htl HE". rewrite /llctx_interp big_sepL_cons.
+    iIntros (Hc Hub He tid qE) "#HEAP #LFT Htl HE". rewrite /llctx_interp big_sepL_cons.
     iIntros "[Hκ HL] HC HT". iDestruct "Hκ" as (Λ) "(% & Htok & #Hend)".
     iSpecialize ("Hend" with "Htok"). wp_bind Endlft.
     iApply (wp_fupd_step with "Hend"); try done. wp_seq.
     iIntros "!> #Hdead !>". wp_seq. iApply (He with "HEAP LFT Htl HE HL HC >").
-    iApply (unblock_tctx_interp with "[] HT").
-    simpl in *. subst κ. rewrite -lft_dead_or. auto.
+    iApply (Hub with "[] HT"). simpl in *. subst κ. rewrite -lft_dead_or. auto.
   Qed.
-  
+
   Lemma type_assign E L ty1 ty ty1' p1 p2 :
     typed_write E L ty1 ty ty1' →
     typed_instruction E L [TCtx_hasty p1 ty1; TCtx_hasty p2 ty] (p1 <- p2)
@@ -169,5 +167,4 @@ Section typing_rules.
     { iExists _. iFrame. }
     iMod ("Hcl2" with "Hl2") as "($ & $ & $ & $)". done.
   Qed.
-
 End typing_rules.
diff --git a/theories/typing/type_context.v b/theories/typing/type_context.v
index 4b5c76b4..2ba014a3 100644
--- a/theories/typing/type_context.v
+++ b/theories/typing/type_context.v
@@ -193,35 +193,25 @@ Section type_context.
     iApply ("Ho" with "*"). done.
   Qed.
 
-  Definition unblock_tctx_elt κ x :=
-    match x with
-    | TCtx_blocked p κ' ty =>
-      if decide (κ = κ') then TCtx_hasty p ty else x
-    | _ => x
-    end.
+  Class UnblockTctx (κ : lft) (T1 T2 : tctx) : Prop :=
+    unblock_tctx : ∀ tid, [†κ] -∗ tctx_interp tid T1 ={⊤}=∗ tctx_interp tid T2.
 
-  Lemma unblock_tctx_elt_interp tid κ x :
-    [†κ] -∗ tctx_elt_interp tid x ={⊤}=∗
-        tctx_elt_interp tid (unblock_tctx_elt κ x).
+  Global Instance unblock_tctx_nil κ : UnblockTctx κ [] [].
+  Proof. by iIntros (tid) "_ $". Qed.
+
+  Global Instance unblock_tctx_cons_unblock T1 T2 p κ ty :
+    UnblockTctx κ T1 T2 →
+    UnblockTctx κ (TCtx_blocked p κ ty::T1) (TCtx_hasty p ty::T2).
   Proof.
-    iIntros "H† H". destruct x as [|? κ' ?]; simpl. by auto.
-    destruct (decide (κ = κ')) as [->|]; simpl; last by auto.
-    iDestruct "H" as (v) "[% H]". iExists v. iSplitR. by auto.
-    by iApply ("H" with "H†").
+    iIntros (H12 tid) "#H†". rewrite !tctx_interp_cons. iIntros "[H HT1]".
+    iMod (H12 with "H† HT1") as "$". iDestruct "H" as (v) "[% H]".
+    iExists (v). by iMod ("H" with "H†") as "$".
   Qed.
 
-  Definition unblock_tctx κ (T : tctx) : tctx :=
-    unblock_tctx_elt κ <$> T.
-
-  Lemma unblock_tctx_interp tid κ T :
-    [†κ] -∗ tctx_interp tid T ={⊤}=∗
-        tctx_interp tid (unblock_tctx κ T).
+  Global Instance unblock_tctx_cons κ T1 T2 x :
+    UnblockTctx κ T1 T2 → UnblockTctx κ (x::T1) (x::T2) | 100.
   Proof.
-    iIntros "#H† H". rewrite /tctx_interp big_sepL_fmap.
-    iApply (big_opL_forall (λ P Q, [†κ] -∗ P ={⊤}=∗ Q) with "H† H").
-    { by iIntros (?) "_ $". }
-    { iIntros (?? A ?? B) "#H† [H1 H2]". iSplitL "H1".
-        by iApply (A with "H†"). by iApply (B with "H†"). }
-    move=>/= _ ? _. by apply unblock_tctx_elt_interp.
+    iIntros (H12 tid) "#H†". rewrite !tctx_interp_cons. iIntros "[$ HT1]".
+    by iMod (H12 with "H† HT1") as "$".
   Qed.
 End type_context.
-- 
GitLab