diff --git a/theories/logrel/subtyping.v b/theories/logrel/subtyping.v index 428b13a2443ecf2cfdc07fcf28537c75fe179d20..3ebdbedd8fdad2eea23decbe2fd4fa6a4cc19d36 100644 --- a/theories/logrel/subtyping.v +++ b/theories/logrel/subtyping.v @@ -6,10 +6,17 @@ equivalent to having both [A <: B] and [B <: A]. Finally, the notion of a when [A <: copy A]. *) From actris.logrel Require Export model term_types. +Definition lsty_le_def {Σ} (P1 P2 : lsty Σ) := + iProto_le (lsty_car P1) (lsty_car P2). +Definition lsty_le_aux : seal (@lsty_le_def). by eexists. Qed. +Definition lsty_le := lsty_le_aux.(unseal). +Definition lsty_le_eq : @lsty_le = @lsty_le_def := lsty_le_aux.(seal_eq). +Arguments lsty_le {_} _ _. + Definition lty_le {Σ k} : lty Σ k → lty Σ k → iProp Σ := match k with | tty_kind => λ A1 A2, ■∀ v, ltty_car A1 v -∗ ltty_car A2 v - | lty_kind => λ P1 P2, ■iProto_le (lsty_car P1) (lsty_car P2) + | lty_kind => λ P1 P2, ■lsty_le P1 P2 end%I. Arguments lty_le : simpl never. Infix "<:" := lty_le (at level 70) : bi_scope. @@ -34,7 +41,9 @@ Section subtyping. Proof. rewrite /lty_bi_le /=. apply _. Qed. Global Instance lty_le_ne : NonExpansive2 (@lty_le Σ k). - Proof. destruct k; solve_proper. Qed. + Proof. + rewrite /lty_le lsty_le_eq. destruct k; rewrite ?/lsty_le_def; solve_proper. + Qed. Global Instance lty_le_proper {k} : Proper ((≡) ==> (≡) ==> (≡)) (@lty_le Σ k). Proof. apply (ne_proper_2 _). Qed. Global Instance lty_bi_le_ne {k} : NonExpansive2 (@lty_bi_le Σ k). diff --git a/theories/logrel/subtyping_rules.v b/theories/logrel/subtyping_rules.v index 75a170d0800c058037ffa19fb8f5a16f82281456..d91dd81fa20d964d5a138e424c8cd2f4c69981d1 100644 --- a/theories/logrel/subtyping_rules.v +++ b/theories/logrel/subtyping_rules.v @@ -12,12 +12,14 @@ Section subtyping_rules. (** Generic rules *) Lemma lty_le_refl {k} (M : lty Σ k) : ⊢ M <: M. - Proof. destruct k. by iIntros (v) "!> H". by iModIntro. Qed. + Proof. destruct k. by iIntros (v) "!> H". + rewrite /lty_le lsty_le_eq /lsty_le_def. by iModIntro. Qed. Lemma lty_le_trans {k} (M1 M2 M3 : lty Σ k) : M1 <: M2 -∗ M2 <: M3 -∗ M1 <: M3. Proof. destruct k. - iIntros "#H1 #H2" (v) "!> H". iApply "H2". by iApply "H1". - - iIntros "#H1 #H2 !>". by iApply iProto_le_trans. + - iIntros "#H1 #H2 !>". + rewrite /lty_le lsty_le_eq /lsty_le_def. by iApply iProto_le_trans. Qed. Lemma lty_bi_le_refl {k} (M : lty Σ k) : ⊢ M <:> M. @@ -242,7 +244,8 @@ Section subtyping_rules. ▷ (S1 <: S2) -∗ chan S1 <: chan S2. Proof. iIntros "#Hle" (v) "!> H". - iApply (iProto_mapsto_le with "H [Hle]"). eauto. + iApply (iProto_mapsto_le with "H [Hle]"). + rewrite /lty_le lsty_le_eq. eauto. Qed. (** Session subtyping *) @@ -250,6 +253,7 @@ Section subtyping_rules. ▷ (A2 <: A1) -∗ ▷ (S1 <: S2) -∗ (<!!> TY A1 ; S1) <: (<!!> TY A2 ; S2). Proof. + rewrite /lty_le lsty_le_eq. iIntros "#HAle #HSle !>" (v) "H". iExists v. iDestruct ("HAle" with "H") as "$". by iModIntro. Qed. @@ -258,6 +262,7 @@ Section subtyping_rules. ▷ (A1 <: A2) -∗ ▷ (S1 <: S2) -∗ (<??> TY A1 ; S1) <: (<??> TY A2 ; S2). Proof. + rewrite /lty_le lsty_le_eq. iIntros "#HAle #HSle !>" (v) "H". iExists v. iDestruct ("HAle" with "H") as "$". by iModIntro. Qed. @@ -265,22 +270,33 @@ Section subtyping_rules. Lemma lty_le_exist_elim_l k (M : lty Σ k → lmsg Σ) S : (∀ (A : lty Σ k), (<??> M A) <: S) -∗ ((<?? (A : lty Σ k)> M A) <: S). - Proof. iIntros "#Hle !>". iApply (iProto_le_exist_elim_l_inhabited M). auto. Qed. + Proof. + rewrite /lty_le lsty_le_eq. + iIntros "#Hle !>". iApply (iProto_le_exist_elim_l_inhabited M). auto. + Qed. Lemma lty_le_exist_elim_r k (M : lty Σ k → lmsg Σ) S : (∀ (A : lty Σ k), S <: (<!!> M A)) -∗ (S <: (<!! (A : lty Σ k)> M A)). - Proof. iIntros "#Hle !>". iApply (iProto_le_exist_elim_r_inhabited _ M). auto. Qed. + Proof. + rewrite /lty_le lsty_le_eq. + iIntros "#Hle !>". iApply (iProto_le_exist_elim_r_inhabited _ M). auto. + Qed. Lemma lty_le_exist_intro_l k (M : lty Σ k → lmsg Σ) (A : lty Σ k) : ⊢ (<!! X> M X) <: (<!!> M A). - Proof. iIntros "!>". iApply (iProto_le_exist_intro_l). Qed. + Proof. + rewrite /lty_le lsty_le_eq. + iIntros "!>". iApply (iProto_le_exist_intro_l). + Qed. Lemma lty_le_exist_intro_r k (M : lty Σ k → lmsg Σ) (A : lty Σ k) : ⊢ (<??> M A) <: (<?? X> M X). - Proof. iIntros "!>". iApply (iProto_le_exist_intro_r). Qed. + Proof. + rewrite /lty_le lsty_le_eq. + iIntros "!>". iApply (iProto_le_exist_intro_r). + Qed. - (* Elimination rules need inhabited variant of telescopes in the model *) Lemma lty_le_texist_elim_l {kt} (M : ltys Σ kt → lmsg Σ) S : (∀ Xs, (<??> M Xs) <: S) -∗ (<??.. Xs> M Xs) <: S. @@ -316,6 +332,7 @@ Section subtyping_rules. Lemma lty_le_swap_recv_send A1 A2 S : ⊢ (<??> TY A1; <!!> TY A2; S) <: (<!!> TY A2; <??> TY A1; S). Proof. + rewrite /lty_le lsty_le_eq. iIntros "!>" (v1 v2). iApply iProto_le_trans; [iApply iProto_le_base; iApply (iProto_le_exist_intro_l _ v2)|]. @@ -327,6 +344,7 @@ Section subtyping_rules. Lemma lty_le_swap_recv_select A Ss : ⊢ (<??> TY A; lty_select Ss) <: lty_select ((λ S, <??> TY A; S) <$> Ss)%lty. Proof. + rewrite /lty_le lsty_le_eq. iIntros "!>" (v1 x2). iApply iProto_le_trans; [iApply iProto_le_base; iApply (iProto_le_exist_intro_l _ x2)|]; simpl. @@ -340,6 +358,7 @@ Section subtyping_rules. Lemma lty_le_swap_branch_send A Ss : ⊢ lty_branch ((λ S, <!!> TY A; S) <$> Ss)%lty <: (<!!> TY A; lty_branch Ss). Proof. + rewrite /lty_le lsty_le_eq. iIntros "!>" (x1 v2). iApply iProto_le_trans; [|iApply iProto_le_base; iApply (iProto_le_exist_intro_r _ x1)]; simpl. @@ -354,6 +373,7 @@ Section subtyping_rules. ▷ ([∗ map] S1;S2 ∈ Ss1; Ss2, S1 <: S2) -∗ lty_select Ss1 <: lty_select Ss2. Proof. + rewrite /lty_le lsty_le_eq. iIntros "#H !>" (x); iMod 1 as %[S2 HSs2]. iExists x. iDestruct (big_sepM2_forall with "H") as "{H} [>% H]". assert (is_Some (Ss1 !! x)) as [S1 HSs1] by naive_solver. @@ -365,6 +385,7 @@ Section subtyping_rules. Ss2 ⊆ Ss1 → ⊢ lty_select Ss1 <: lty_select Ss2. Proof. + rewrite /lty_le lsty_le_eq. intros; iIntros "!>" (x); iMod 1 as %[S HSs2]. iExists x. assert (Ss1 !! x = Some S) as HSs1 by eauto using lookup_weaken. rewrite HSs1. iSplitR; [by eauto|]. @@ -375,6 +396,7 @@ Section subtyping_rules. ▷ ([∗ map] S1;S2 ∈ Ss1; Ss2, S1 <: S2) -∗ lty_branch Ss1 <: lty_branch Ss2. Proof. + rewrite /lty_le lsty_le_eq. iIntros "#H !>" (x); iMod 1 as %[S1 HSs1]. iExists x. iDestruct (big_sepM2_forall with "H") as "{H} [>% H]". assert (is_Some (Ss2 !! x)) as [S2 HSs2] by naive_solver. @@ -386,6 +408,7 @@ Section subtyping_rules. Ss1 ⊆ Ss2 → ⊢ lty_branch Ss1 <: lty_branch Ss2. Proof. + rewrite /lty_le lsty_le_eq. intros; iIntros "!>" (x); iMod 1 as %[S HSs1]. iExists x. assert (Ss2 !! x = Some S) as HSs2 by eauto using lookup_weaken. rewrite HSs2. iSplitR; [by eauto|]. @@ -396,25 +419,29 @@ Section subtyping_rules. Lemma lty_le_app S11 S12 S21 S22 : (S11 <: S21) -∗ (S12 <: S22) -∗ (S11 <++> S12) <: (S21 <++> S22). - Proof. iIntros "#H1 #H2 !>". by iApply iProto_le_app. Qed. + Proof. rewrite /lty_le lsty_le_eq. + iIntros "#H1 #H2 !>". by iApply iProto_le_app. Qed. Lemma lty_le_app_id_l S : ⊢ (END <++> S) <:> S. - Proof. rewrite /lty_app left_id. iSplit; by iModIntro. Qed. + Proof. rewrite /lty_app left_id. + iSplit; rewrite /lty_le lsty_le_eq /lsty_le_def; by iModIntro. Qed. Lemma lty_le_app_id_r S : ⊢ (S <++> END) <:> S. - Proof. rewrite /lty_app right_id. iSplit; by iModIntro. Qed. + Proof. rewrite /lty_app right_id. + iSplit; rewrite /lty_le lsty_le_eq /lsty_le_def; by iModIntro. Qed. Lemma lty_le_app_assoc S1 S2 S3 : ⊢ (S1 <++> S2) <++> S3 <:> S1 <++> (S2 <++> S3). - Proof. rewrite /lty_app assoc. iSplit; by iModIntro. Qed. + Proof. rewrite /lty_app assoc. + iSplit; rewrite /lty_le lsty_le_eq /lsty_le_def; by iModIntro. Qed. Lemma lty_le_app_send A S1 S2 : ⊢ (<!!> TY A; S1) <++> S2 <:> (<!!> TY A; S1 <++> S2). Proof. - rewrite /lty_app iProto_app_message iMsg_app_exist. - setoid_rewrite iMsg_app_base. iSplit; by iIntros "!> /=". + rewrite /lty_app iProto_app_message iMsg_app_exist. setoid_rewrite iMsg_app_base. + iSplit; rewrite /lty_le lsty_le_eq /lsty_le_def; by iIntros "!> /=". Qed. Lemma lty_le_app_recv A S1 S2 : ⊢ (<??> TY A; S1) <++> S2 <:> (<??> TY A; S1 <++> S2). Proof. - rewrite /lty_app iProto_app_message iMsg_app_exist. - setoid_rewrite iMsg_app_base. iSplit; by iIntros "!> /=". + rewrite /lty_app iProto_app_message iMsg_app_exist. setoid_rewrite iMsg_app_base. + iSplit; rewrite /lty_le lsty_le_eq /lsty_le_def; by iIntros "!> /=". Qed. Lemma lty_le_app_choice a (Ss : gmap Z (lsty Σ)) S2 : @@ -423,8 +450,8 @@ Section subtyping_rules. rewrite /lty_app /lty_choice iProto_app_message iMsg_app_exist; setoid_rewrite iMsg_app_base; setoid_rewrite lookup_total_alt; setoid_rewrite lookup_fmap; setoid_rewrite fmap_is_Some. - iSplit; iIntros "!> /="; destruct a; iIntros (x); iExists x; - iMod 1 as %[S ->]; iSplitR; eauto. + iSplit; rewrite /lty_le lsty_le_eq; iIntros "!> /="; destruct a; + iIntros (x); iExists x; iMod 1 as %[S ->]; iSplitR; eauto. Qed. Lemma lty_le_app_select A Ss S2 : ⊢ lty_select Ss <++> S2 <:> lty_select ((.<++> S2) <$> Ss)%lty. @@ -434,11 +461,13 @@ Section subtyping_rules. Proof. apply lty_le_app_choice. Qed. Lemma lty_le_dual S1 S2 : S2 <: S1 -∗ lty_dual S1 <: lty_dual S2. - Proof. iIntros "#H !>". by iApply iProto_le_dual. Qed. + Proof. rewrite /lty_le lsty_le_eq. iIntros "#H !>". by iApply iProto_le_dual. Qed. Lemma lty_le_dual_l S1 S2 : lty_dual S2 <: S1 -∗ lty_dual S1 <: S2. - Proof. iIntros "#H !>". by iApply iProto_le_dual_l. Qed. + Proof. rewrite /lty_le lsty_le_eq. iIntros "#H !>". + by iApply iProto_le_dual_l. Qed. Lemma lty_le_dual_r S1 S2 : S2 <: lty_dual S1 -∗ S1 <: lty_dual S2. - Proof. iIntros "#H !>". by iApply iProto_le_dual_r. Qed. + Proof. rewrite /lty_le lsty_le_eq. iIntros "#H !>". + by iApply iProto_le_dual_r. Qed. Lemma lty_le_dual_end : ⊢ lty_dual (Σ:=Σ) END <:> END. Proof. rewrite /lty_dual iProto_dual_end=> /=. apply lty_bi_le_refl. Qed. @@ -447,7 +476,8 @@ Section subtyping_rules. ⊢ lty_dual (lty_message a (TY A; S)) <:> lty_message (action_dual a) (TY A; (lty_dual S)). Proof. rewrite /lty_dual iProto_dual_message iMsg_dual_exist. - setoid_rewrite iMsg_dual_base. iSplit; by iIntros "!> /=". + setoid_rewrite iMsg_dual_base. + iSplit; rewrite /lty_le lsty_le_eq /lsty_le_def; by iIntros "!> /=". Qed. Lemma lty_le_dual_send A S : ⊢ lty_dual (<!!> TY A; S) <:> (<??> TY A; lty_dual S). Proof. apply lty_le_dual_message. Qed. @@ -460,8 +490,8 @@ Section subtyping_rules. rewrite /lty_dual /lty_choice iProto_dual_message iMsg_dual_exist; setoid_rewrite iMsg_dual_base; setoid_rewrite lookup_total_alt; setoid_rewrite lookup_fmap; setoid_rewrite fmap_is_Some. - iSplit; iIntros "!> /="; destruct a; iIntros (x); iExists x; - iMod 1 as %[S ->]; iSplitR; eauto. + iSplit; rewrite /lty_le lsty_le_eq; iIntros "!> /="; destruct a; + iIntros (x); iExists x; iMod 1 as %[S ->]; iSplitR; eauto. Qed. Lemma lty_le_dual_select (Ss : gmap Z (lsty Σ)) : @@ -472,3 +502,4 @@ Section subtyping_rules. Proof. iApply lty_le_dual_choice. Qed. End subtyping_rules. +