diff --git a/theories/logrel/examples/choice_subtyping.v b/theories/logrel/examples/choice_subtyping.v index 0fae3e166c717f8118fd252a0355a93e21803577..d99833b12dff323857ce21be1d9ccdddc3f35a51 100644 --- a/theories/logrel/examples/choice_subtyping.v +++ b/theories/logrel/examples/choice_subtyping.v @@ -1,3 +1,8 @@ +(** +A mechanisation of a binary variant of the subtyping example on page 23 of the paper: +"On the Preciseness of Subtyping in Session Types" +https://arxiv.org/pdf/1610.00328.pdf +*) From actris.channel Require Import proofmode proto channel. From actris.logrel Require Import subtyping_rules. From iris.proofmode Require Import tactics. @@ -5,122 +10,143 @@ From iris.proofmode Require Import tactics. Section choice_example. Context `{heapG Σ, chanG Σ}. - Variables R M P Q S U : ltty Σ. + Variables Sr Sm Sp Sq Ss Su : ltty Σ. + Variables Srm Ssm Srp Ssp Sr' : ltty Σ. + Variables Tr Ts Tu Tr' Ts' Tq : lsty Σ. (** - ?R. ((!M._) <+> (!P._) <+> (!Q._)) + The subtype + ?Sr.((!Srm.Tr) <+> (!Srp.Tr') <+> (!Sq.Tq)) <&> - ?S. ((!M._) <+> (!P._)) + ?Ss.((!Ssm.Ts) <+> (!Ssp.Ts')) *) Definition prot_sub : lsty Σ := (lty_branch - (<[1%Z:= <??> TY R ; + (<[1%Z:= <??> TY Sr ; lty_select - (<[1%Z:= <!!> TY M ; END]> - (<[2%Z:= <!!> TY P ; END]> - (<[3%Z:= <!!> TY Q ; END]>∅)))]> - (<[2%Z:= <??> TY S ; + (<[1%Z:= <!!> TY Srm ; Tr]> + (<[2%Z:= <!!> TY Srp ; Tr']> + (<[3%Z:= <!!> TY Sq ; Tq]>∅)))]> + (<[2%Z:= <??> TY Ss ; lty_select - (<[1%Z := <!!> TY M ; END]> - (<[2%Z := <!!> TY P; END]>∅))]>∅)))%lty. + (<[1%Z := <!!> TY Ssm ; Ts]> + (<[2%Z := <!!> TY Ssp ; Ts']>∅))]>∅)))%lty. (** - !M.((?R._) <&> (?S._) <&> (?U._)) + The supertype + !Sm.((?Sr.Tr) <&> (?Ss.Ts) <&> (?Su.Tu)) <+> - !P.((?R._) <&> (?S._)) + !Sp.((?Sr'.Tr') <&> (?Ss.Ts')) *) Definition prot_sup : lsty Σ := (lty_select - (<[1%Z:= <!!> TY M ; lty_branch - (<[1%Z:= <??> TY R ; END]> - (<[2%Z:= <??> TY S ; END]> - (<[3%Z:= <??> TY U ; END]>∅)))]> - (<[2%Z:= <!!> TY P ; lty_branch - (<[1%Z := <??> TY R ; END]> - (<[2%Z := <??> TY S; END]>∅))]>∅)))%lty. + (<[1%Z:= <!!> TY Sm ; lty_branch + (<[1%Z:= <??> TY Sr ; Tr]> + (<[2%Z:= <??> TY Ss ; Ts]> + (<[3%Z:= <??> TY Su ; Tu]>∅)))]> + (<[2%Z:= <!!> TY Sp ; lty_branch + (<[1%Z := <??> TY Sr' ; Tr']> + (<[2%Z := <??> TY Ss ; Ts']>∅))]>∅)))%lty. (** Weaken select - ?R.((!M._) <+> (!P._)) + ?Sr.((!Srm.Tr) <+> (!Srp.Tr')) <&> - ?S.((!M._) <+> (!P._)) + ?Ss.((!Ssm.Ts) <+> (!Ssp.Ts')) *) Definition prot1 : lsty Σ := (lty_branch - (<[1%Z:= <??> TY R ; + (<[1%Z:= <??> TY Sr ; lty_select - (<[1%Z:= <!!> TY M ; END]> - (<[2%Z:= <!!> TY P ; END]>∅))]> - (<[2%Z:= <??> TY S ; + (<[1%Z:= <!!> TY Srm ; Tr]> + (<[2%Z:= <!!> TY Srp ; Tr']>∅))]> + (<[2%Z:= <??> TY Ss ; lty_select - (<[1%Z := <!!> TY M ; END]> - (<[2%Z := <!!> TY P; END]>∅))]>∅)))%lty. + (<[1%Z := <!!> TY Ssm ; Ts]> + (<[2%Z := <!!> TY Ssp; Ts']>∅))]>∅)))%lty. (** Swap recv/select - ((?R.!M._) <+> (?R.!P._)) + ((?Sr.!Srm.Tr) <+> (?Sr.!Srp.Tr')) <&> - ((?S.!M._) <+> (?S.!P._)) + ((?Ss.!Ssm.Ts) <+> (?Ss.!Ssp.Ts')) *) Definition prot2 : lsty Σ := (lty_branch (<[1%Z:= lty_select - (<[1%Z:= <??> TY R ; <!!> TY M ; END]> - (<[2%Z:= <??> TY R ; <!!> TY P ; END]>∅))]> + (<[1%Z:= <??> TY Sr ; <!!> TY Srm ; Tr]> + (<[2%Z:= <??> TY Sr ; <!!> TY Srp ; Tr']>∅))]> (<[2%Z:= lty_select - (<[1%Z := <??> TY S ; <!!> TY M ; END]> - (<[2%Z := <??> TY S ; <!!> TY P; END]>∅))]>∅)))%lty. + (<[1%Z := <??> TY Ss ; <!!> TY Ssm ; Ts]> + (<[2%Z := <??> TY Ss ; <!!> TY Ssp; Ts']>∅))]>∅)))%lty. (** swap branch/select - ((?R.!M._) <&> (?S.!M._)) + ((?Sr.!Srm.Tr) <&> (?Ss.!Ssm.Ts)) <+> - ((?R.!P._) <&> (?S.!P._)) + ((?Sr.!Srp.Tr') <&> (?Ss.!Ssp.Ts')) *) Definition prot3 : lsty Σ := (lty_select (<[1%Z:= lty_branch - (<[1%Z:= <??> TY R ; <!!> TY M ; END]> - (<[2%Z:= <??> TY S ; <!!> TY M ; END]>∅))]> + (<[1%Z:= <??> TY Sr ; <!!> TY Srm ; Tr]> + (<[2%Z:= <??> TY Ss ; <!!> TY Ssm ; Ts]>∅))]> (<[2%Z:= lty_branch - (<[1%Z := <??> TY R ; <!!> TY P ; END]> - (<[2%Z := <??> TY S ; <!!> TY P; END]>∅))]>∅)))%lty. + (<[1%Z := <??> TY Sr ; <!!> TY Srp ; Tr']> + (<[2%Z := <??> TY Ss ; <!!> TY Ssp; Ts']>∅))]>∅)))%lty. (** swap recv/send - ((!M.?R._) <&> (!M.?S._)) + ((!Srm.?Sr.Tr) <&> (!Ssm.?Ss.Ts)) <+> - ((!P.?R._) <&> (!P.?S._)) + ((!Srp.?Sr.Tr') <&> (!Ssp.?Ss.Ts')) *) Definition prot4 : lsty Σ := (lty_select (<[1%Z:= lty_branch - (<[1%Z:= <!!> TY M ; <??> TY R ; END]> - (<[2%Z:= <!!> TY M ; <??> TY S ; END]>∅))]> + (<[1%Z:= <!!> TY Srm ; <??> TY Sr ; Tr]> + (<[2%Z:= <!!> TY Ssm ; <??> TY Ss ; Ts]>∅))]> (<[2%Z:= lty_branch - (<[1%Z := <!!> TY P ; <??> TY R ; END]> - (<[2%Z := <!!> TY P; <??> TY S ; END]>∅))]>∅)))%lty. + (<[1%Z := <!!> TY Srp ; <??> TY Sr ; Tr']> + (<[2%Z := <!!> TY Ssp ; <??> TY Ss ; Ts']>∅))]>∅)))%lty. (** - Swap branch/send - !M.((?R._) <&> (?S._)) + Subtype messages + ((!Sm.?Sr.Tr) <&> (!Sm.?Ss.Ts)) <+> - !P.((?R._) <&> (?S._)) + ((!Sp.?Sr'.Tr') <&> (!Sp.?Ss.Ts')) *) Definition prot5 : lsty Σ := (lty_select - (<[1%Z:= <!!> TY M ; - lty_branch (<[1%Z:= <??> TY R ; END]> - (<[2%Z:= <??> TY S ; END]>∅))]> - (<[2%Z:= <!!> TY P ; + (<[1%Z:= lty_branch + (<[1%Z:= <!!> TY Sm ; <??> TY Sr ; Tr]> + (<[2%Z:= <!!> TY Sm ; <??> TY Ss ; Ts]>∅))]> + (<[2%Z:= lty_branch + (<[1%Z := <!!> TY Sp ; <??> TY Sr' ; Tr']> + (<[2%Z := <!!> TY Sp ; <??> TY Ss ; Ts']>∅))]>∅)))%lty. + + (** + Swap branch/send + (!Sm.((?Sr.Tr) <&> (?Ss.Ts))) + <+> + (!Sp.((?Sr'.Tr') <&> (!Sp.?Ss.Ts'))) + *) + Definition prot6 : lsty Σ := + (lty_select + (<[1%Z:= <!!> TY Sm ; + lty_branch (<[1%Z:= <??> TY Sr ; Tr]> + (<[2%Z:= <??> TY Ss ; Ts]>∅))]> + (<[2%Z:= <!!> TY Sp ; lty_branch - (<[1%Z := <??> TY R ; END]> - (<[2%Z := <??> TY S ; END]>∅))]>∅)))%lty. + (<[1%Z := <??> TY Sr' ; Tr']> + (<[2%Z := <??> TY Ss ; Ts']>∅))]>∅)))%lty. Lemma subtype_proof : - ⊢ prot_sub <: prot_sup. + Sm <: Srm -∗ Sm <: Ssm -∗ Sp <: Srp -∗ Sp <: Ssp -∗ Sr <: Sr' -∗ + prot_sub <: prot_sup. Proof. + iIntros "#HRM #HSM #HRP #HSP #HR". (** Weakening of select *) iApply (lty_le_trans _ prot1). { @@ -149,17 +175,17 @@ Section choice_example. { iApply (lty_le_swap_branch_select (<[1%Z:= - <[1%Z:=(<??> TY R; <!!> TY M; END)%lty]> - (<[2%Z:= (<??> TY R; <!!> TY P; END)%lty]>∅)]> + <[1%Z:=(<??> TY Sr; <!!> TY Srm; Tr)%lty]> + (<[2%Z:= (<??> TY Sr; <!!> TY Srp; Tr')%lty]>∅)]> (<[2%Z:= - <[1%Z:=(<??> TY S; <!!> TY M; END)%lty]> - (<[2%Z:= (<??> TY S; <!!> TY P; END)%lty]>∅)]>∅)) + <[1%Z:=(<??> TY Ss; <!!> TY Ssm; Ts)%lty]> + (<[2%Z:= (<??> TY Ss; <!!> TY Ssp; Ts')%lty]>∅)]>∅)) (<[1%Z:= - <[1%Z:=(<??> TY R; <!!> TY M; END)%lty]> - (<[2%Z:= (<??> TY S; <!!> TY M; END)%lty]>∅)]> + <[1%Z:=(<??> TY Sr; <!!> TY Srm; Tr)%lty]> + (<[2%Z:= (<??> TY Ss; <!!> TY Ssm; Ts)%lty]>∅)]> (<[2%Z:= - <[1%Z:=(<??> TY R; <!!> TY P; END)%lty]> - (<[2%Z:= (<??> TY S; <!!> TY P; END)%lty]>∅)]>∅)) + <[1%Z:=(<??> TY Sr; <!!> TY Srp; Tr')%lty]> + (<[2%Z:= (<??> TY Ss; <!!> TY Ssp; Ts')%lty]>∅)]>∅)) ). intros i j Ss1' Ss2' Hin1 Hin2. assert (i = 1%Z ∨ i = 2%Z). @@ -211,16 +237,33 @@ Section choice_example. + rewrite big_sepM2_insert=> //. iSplit=> //. iApply lty_le_swap_recv_send. } - (** Swap branch/send *) iApply (lty_le_trans _ prot5). + { + iApply lty_le_select. iIntros "!>". + rewrite big_sepM2_insert=> //. iSplit. + - iApply lty_le_branch. iIntros "!>". + rewrite big_sepM2_insert=> //. iSplit. + + iApply lty_le_send; eauto. + + rewrite big_sepM2_insert=> //. iSplit=> //. + iApply lty_le_send; eauto. + - rewrite big_sepM2_insert=> //. iSplit=> //. + iApply lty_le_branch. iIntros "!>". + rewrite big_sepM2_insert=> //. iSplit. + + iApply lty_le_send; [eauto|]. + iApply lty_le_recv; eauto. + + rewrite big_sepM2_insert=> //. iSplit=> //. + iApply lty_le_send; eauto. + } + (** Swap branch/send *) + iApply (lty_le_trans _ prot6). { iApply lty_le_select. iIntros "!>". rewrite big_sepM2_insert=> //. iSplit. - iApply (lty_le_swap_branch_send _ - (<[1%Z:=(<??> TY R; END)%lty]> (<[2%Z:=(<??> TY S; END)%lty]> ∅))). + (<[1%Z:=(<??> TY Sr; Tr)%lty]> (<[2%Z:=(<??> TY Ss; Ts)%lty]> ∅))). - rewrite big_sepM2_insert=> //. iSplit=> //. iApply (lty_le_swap_branch_send _ - ((<[1%Z:=(<??> TY R; END)%lty]> (<[2%Z:=(<??> TY S; END)%lty]> ∅)))). + ((<[1%Z:=(<??> TY Sr'; Tr')%lty]> (<[2%Z:=(<??> TY Ss; Ts')%lty]> ∅)))). } (** Weaken branch *) iApply lty_le_select. iIntros "!>".