Commit 12dc9a35 authored by Robbert Krebbers's avatar Robbert Krebbers

Consistently use `Recv`.

parent 31806a14
Pipeline #25635 failed with stage
in 9 seconds
...@@ -3,7 +3,7 @@ lock-protected buffers, and their primitive proof rules. Moreover: ...@@ -3,7 +3,7 @@ lock-protected buffers, and their primitive proof rules. Moreover:
- It defines the connective [c ↣ prot] for ownership of channel endpoints, - It defines the connective [c ↣ prot] for ownership of channel endpoints,
which describes that channel endpoint [c] adheres to protocol [prot]. which describes that channel endpoint [c] adheres to protocol [prot].
- It proves Actris's specifications of [send] and [receive] w.r.t. dependent - It proves Actris's specifications of [send] and [recv] w.r.t. dependent
separation protocols. separation protocols.
An encoding of the usual branching connectives [prot1 <{Q1}+{Q2}> prot2] and An encoding of the usual branching connectives [prot1 <{Q1}+{Q2}> prot2] and
...@@ -104,13 +104,13 @@ Typeclasses Opaque iProto_branch. ...@@ -104,13 +104,13 @@ Typeclasses Opaque iProto_branch.
Arguments iProto_branch {_} _ _%I _%I _%proto _%proto. Arguments iProto_branch {_} _ _%I _%I _%proto _%proto.
Instance: Params (@iProto_branch) 2 := {}. Instance: Params (@iProto_branch) 2 := {}.
Infix "<{ P1 }+{ P2 }>" := (iProto_branch Send P1 P2) (at level 85) : proto_scope. Infix "<{ P1 }+{ P2 }>" := (iProto_branch Send P1 P2) (at level 85) : proto_scope.
Infix "<{ P1 }&{ P2 }>" := (iProto_branch Receive P1 P2) (at level 85) : proto_scope. Infix "<{ P1 }&{ P2 }>" := (iProto_branch Recv P1 P2) (at level 85) : proto_scope.
Infix "<+{ P2 }>" := (iProto_branch Send True P2) (at level 85) : proto_scope. Infix "<+{ P2 }>" := (iProto_branch Send True P2) (at level 85) : proto_scope.
Infix "<&{ P2 }>" := (iProto_branch Receive True P2) (at level 85) : proto_scope. Infix "<&{ P2 }>" := (iProto_branch Recv True P2) (at level 85) : proto_scope.
Infix "<{ P1 }+>" := (iProto_branch Send P1 True) (at level 85) : proto_scope. Infix "<{ P1 }+>" := (iProto_branch Send P1 True) (at level 85) : proto_scope.
Infix "<{ P1 }&>" := (iProto_branch Receive P1 True) (at level 85) : proto_scope. Infix "<{ P1 }&>" := (iProto_branch Recv P1 True) (at level 85) : proto_scope.
Infix "<+>" := (iProto_branch Send True True) (at level 85) : proto_scope. Infix "<+>" := (iProto_branch Send True True) (at level 85) : proto_scope.
Infix "<&>" := (iProto_branch Receive True True) (at level 85) : proto_scope. Infix "<&>" := (iProto_branch Recv True True) (at level 85) : proto_scope.
Section channel. Section channel.
Context `{!heapG Σ, !chanG Σ}. Context `{!heapG Σ, !chanG Σ}.
...@@ -233,9 +233,9 @@ Section channel. ...@@ -233,9 +233,9 @@ Section channel.
Qed. Qed.
Lemma try_recv_spec_packed {TT} c (pc : TT val * iProp Σ * iProto Σ) : Lemma try_recv_spec_packed {TT} c (pc : TT val * iProp Σ * iProto Σ) :
{{{ c iProto_message Receive pc }}} {{{ c iProto_message Recv pc }}}
try_recv c try_recv c
{{{ v, RET v; (v = NONEV c iProto_message Receive pc) {{{ v, RET v; (v = NONEV c iProto_message Recv pc)
( x : TT, v = SOMEV ((pc x).1.1) c (pc x).2 (pc x).1.2) }}}. ( x : TT, v = SOMEV ((pc x).1.1) c (pc x).2 (pc x).1.2) }}}.
Proof. Proof.
rewrite iProto_mapsto_eq. iIntros (Φ) "Hc HΦ". wp_lam; wp_pures. rewrite iProto_mapsto_eq. iIntros (Φ) "Hc HΦ". wp_lam; wp_pures.
...@@ -267,7 +267,7 @@ Section channel. ...@@ -267,7 +267,7 @@ Section channel.
Qed. Qed.
Lemma recv_spec_packed {TT} c (pc : TT val * iProp Σ * iProto Σ) : Lemma recv_spec_packed {TT} c (pc : TT val * iProp Σ * iProto Σ) :
{{{ c iProto_message Receive pc }}} {{{ c iProto_message Recv pc }}}
recv c recv c
{{{ x, RET (pc x).1.1; c (pc x).2 (pc x).1.2 }}}. {{{ x, RET (pc x).1.1; c (pc x).2 (pc x).1.2 }}}.
Proof. Proof.
...@@ -280,7 +280,7 @@ Section channel. ...@@ -280,7 +280,7 @@ Section channel.
(** A version written without Texan triples that is more convenient to use (** A version written without Texan triples that is more convenient to use
(via [iApply] in Coq. *) (via [iApply] in Coq. *)
Lemma recv_spec {TT} Φ c (pc : TT val * iProp Σ * iProto Σ) : Lemma recv_spec {TT} Φ c (pc : TT val * iProp Σ * iProto Σ) :
c iProto_message Receive pc - c iProto_message Recv pc -
(.. x : TT, c (pc x).2 - (pc x).1.2 - Φ (pc x).1.1) - (.. x : TT, c (pc x).2 - (pc x).1.2 - Φ (pc x).1.1) -
WP recv c {{ Φ }}. WP recv c {{ Φ }}.
Proof. Proof.
......
...@@ -33,8 +33,8 @@ Class ActionDualIf (d : bool) (a1 a2 : action) := ...@@ -33,8 +33,8 @@ Class ActionDualIf (d : bool) (a1 a2 : action) :=
Hint Mode ActionDualIf ! ! - : typeclass_instances. Hint Mode ActionDualIf ! ! - : typeclass_instances.
Instance action_dual_if_false a : ActionDualIf false a a := eq_refl. Instance action_dual_if_false a : ActionDualIf false a a := eq_refl.
Instance action_dual_if_true_send : ActionDualIf true Send Receive := eq_refl. Instance action_dual_if_true_send : ActionDualIf true Send Recv := eq_refl.
Instance action_dual_if_true_receive : ActionDualIf true Receive Send := eq_refl. Instance action_dual_if_true_recv : ActionDualIf true Recv Send := eq_refl.
Class ProtoNormalize {Σ} (d : bool) (p : iProto Σ) Class ProtoNormalize {Σ} (d : bool) (p : iProto Σ)
(pas : list (bool * iProto Σ)) (q : iProto Σ) := (pas : list (bool * iProto Σ)) (q : iProto Σ) :=
...@@ -166,7 +166,7 @@ End classes. ...@@ -166,7 +166,7 @@ End classes.
Lemma tac_wp_recv `{!chanG Σ, !heapG Σ} {TT : tele} Δ i j K Lemma tac_wp_recv `{!chanG Σ, !heapG Σ} {TT : tele} Δ i j K
c p (pc : TT val * iProp Σ * iProto Σ) Φ : c p (pc : TT val * iProp Σ * iProto Σ) Φ :
envs_lookup i Δ = Some (false, c p)%I envs_lookup i Δ = Some (false, c p)%I
ProtoNormalize false p [] (iProto_message Receive pc) ProtoNormalize false p [] (iProto_message Recv pc)
let Δ' := envs_delete false i false Δ in let Δ' := envs_delete false i false Δ in
(.. x : TT, (.. x : TT,
match envs_app false match envs_app false
......
...@@ -121,24 +121,24 @@ Notation "<!> 'MSG' v ; p" := ...@@ -121,24 +121,24 @@ Notation "<!> 'MSG' v ; p" :=
Notation "<?> x1 .. xn , 'MSG' v {{ P } } ; p" := Notation "<?> x1 .. xn , 'MSG' v {{ P } } ; p" :=
(iProto_message (iProto_message
Receive Recv
(tele_app (TT:=TeleS (λ x1, .. (TeleS (λ xn, TeleO)) .. )) $ (tele_app (TT:=TeleS (λ x1, .. (TeleS (λ xn, TeleO)) .. )) $
λ x1, .. (λ xn, (v%V,P%I,p%proto)) ..)) λ x1, .. (λ xn, (v%V,P%I,p%proto)) ..))
(at level 20, x1 binder, xn binder, v at level 20, P, p at level 200) : proto_scope. (at level 20, x1 binder, xn binder, v at level 20, P, p at level 200) : proto_scope.
Notation "<?> x1 .. xn , 'MSG' v ; p" := Notation "<?> x1 .. xn , 'MSG' v ; p" :=
(iProto_message (iProto_message
Receive Recv
(tele_app (TT:=TeleS (λ x1, .. (TeleS (λ xn, TeleO)) .. )) $ (tele_app (TT:=TeleS (λ x1, .. (TeleS (λ xn, TeleO)) .. )) $
λ x1, .. (λ xn, (v%V,True%I,p%proto)) ..)) λ x1, .. (λ xn, (v%V,True%I,p%proto)) ..))
(at level 20, x1 binder, xn binder, v at level 20, p at level 200) : proto_scope. (at level 20, x1 binder, xn binder, v at level 20, p at level 200) : proto_scope.
Notation "<?> 'MSG' v {{ P } } ; p" := Notation "<?> 'MSG' v {{ P } } ; p" :=
(iProto_message (iProto_message
Receive Recv
(tele_app (TT:=TeleO) (v%V,P%I,p%proto))) (tele_app (TT:=TeleO) (v%V,P%I,p%proto)))
(at level 20, v at level 20, P, p at level 200) : proto_scope. (at level 20, v at level 20, P, p at level 200) : proto_scope.
Notation "<?> 'MSG' v ; p" := Notation "<?> 'MSG' v ; p" :=
(iProto_message (iProto_message
Receive Recv
(tele_app (TT:=TeleO) (v%V,True%I,p%proto))) (tele_app (TT:=TeleO) (v%V,True%I,p%proto)))
(at level 20, v at level 20, p at level 200) : proto_scope. (at level 20, v at level 20, p at level 200) : proto_scope.
...@@ -190,21 +190,21 @@ Definition iProto_le_pre {Σ V} ...@@ -190,21 +190,21 @@ Definition iProto_le_pre {Σ V}
p1 proto_message a1 pc1 p1 proto_message a1 pc1
p2 proto_message a2 pc2 p2 proto_message a2 pc2
match a1, a2 with match a1, a2 with
| Receive, Receive => | Recv, Recv =>
v p1', pc1 v (proto_eq_next p1') - v p1', pc1 v (proto_eq_next p1') -
p2', rec p1' p2' pc2 v (proto_eq_next p2') p2', rec p1' p2' pc2 v (proto_eq_next p2')
| Send, Send => | Send, Send =>
v p2', pc2 v (proto_eq_next p2') - v p2', pc2 v (proto_eq_next p2') -
p1', rec p1' p2' pc1 v (proto_eq_next p1') p1', rec p1' p2' pc1 v (proto_eq_next p1')
| Receive, Send => | Recv, Send =>
v1 v2 p1' p2', v1 v2 p1' p2',
pc1 v1 (proto_eq_next p1') - pc2 v2 (proto_eq_next p2') - pc1 v1 (proto_eq_next p1') - pc2 v2 (proto_eq_next p2') -
pc1' pc2' pt, pc1' pc2' pt,
rec p1' (proto_message Send pc1') rec p1' (proto_message Send pc1')
rec (proto_message Receive pc2') p2' rec (proto_message Recv pc2') p2'
pc1' v2 (proto_eq_next pt) pc1' v2 (proto_eq_next pt)
pc2' v1 (proto_eq_next pt) pc2' v1 (proto_eq_next pt)
| Send, Receive => False | Send, Recv => False
end. end.
Instance iProto_le_pre_ne {Σ V} (rec : iProto Σ V iProto Σ V iProp Σ) : Instance iProto_le_pre_ne {Σ V} (rec : iProto Σ V iProto Σ V iProp Σ) :
NonExpansive2 (iProto_le_pre rec). NonExpansive2 (iProto_le_pre rec).
...@@ -235,12 +235,12 @@ Fixpoint iProto_interp_aux {Σ V} (n : nat) ...@@ -235,12 +235,12 @@ Fixpoint iProto_interp_aux {Σ V} (n : nat)
| S n => | S n =>
( vl vsl' pc p2', ( vl vsl' pc p2',
vsl = vl :: vsl' vsl = vl :: vsl'
iProto_le (proto_message Receive pc) pr iProto_le (proto_message Recv pc) pr
pc vl (proto_eq_next p2') pc vl (proto_eq_next p2')
iProto_interp_aux n vsl' vsr pl p2') iProto_interp_aux n vsl' vsr pl p2')
( vr vsr' pc p1', ( vr vsr' pc p1',
vsr = vr :: vsr' vsr = vr :: vsr'
iProto_le (proto_message Receive pc) pl iProto_le (proto_message Recv pc) pl
pc vr (proto_eq_next p1') pc vr (proto_eq_next p1')
iProto_interp_aux n vsl vsr' p1' pr) iProto_interp_aux n vsl vsr' p1' pr)
end. end.
...@@ -431,12 +431,12 @@ Section proto. ...@@ -431,12 +431,12 @@ Section proto.
| Send => | Send =>
v p2', pc2 v (proto_eq_next p2') - v p2', pc2 v (proto_eq_next p2') -
p1', iProto_le p1' p2' pc1 v (proto_eq_next p1') p1', iProto_le p1' p2' pc1 v (proto_eq_next p1')
| Receive => | Recv =>
v1 v2 p1' p2', v1 v2 p1' p2',
pc1 v1 (proto_eq_next p1') - pc2 v2 (proto_eq_next p2') - pc1 v1 (proto_eq_next p1') - pc2 v2 (proto_eq_next p2') -
pc1' pc2' pt, pc1' pc2' pt,
iProto_le p1' (proto_message Send pc1') iProto_le p1' (proto_message Send pc1')
iProto_le (proto_message Receive pc2') p2' iProto_le (proto_message Recv pc2') p2'
pc1' v2 (proto_eq_next pt) pc1' v2 (proto_eq_next pt)
pc2' v1 (proto_eq_next pt) pc2' v1 (proto_eq_next pt)
end. end.
...@@ -451,8 +451,8 @@ Section proto. ...@@ -451,8 +451,8 @@ Section proto.
Qed. Qed.
Lemma iProto_le_recv_inv p1 pc2 : Lemma iProto_le_recv_inv p1 pc2 :
iProto_le p1 (proto_message Receive pc2) - pc1, iProto_le p1 (proto_message Recv pc2) - pc1,
p1 proto_message Receive pc1 p1 proto_message Recv pc1
v p1', pc1 v (proto_eq_next p1') - v p1', pc1 v (proto_eq_next p1') -
p2', iProto_le p1' p2' pc2 v (proto_eq_next p2'). p2', iProto_le p1' p2' pc2 v (proto_eq_next p2').
Proof. Proof.
...@@ -542,7 +542,7 @@ Section proto. ...@@ -542,7 +542,7 @@ Section proto.
(pc1 x1).1.1 = (pc2 x2).1.1 (pc1 x1).1.1 = (pc2 x2).1.1
(pc2 x2).1.2 (pc2 x2).1.2
iProto_le (pc1 x1).2 (pc2 x2).2) - iProto_le (pc1 x1).2 (pc2 x2).2) -
iProto_le (iProto_message Receive pc1) (iProto_message Receive pc2). iProto_le (iProto_message Recv pc1) (iProto_message Recv pc2).
Proof. Proof.
iIntros "H". rewrite iProto_le_unfold iProto_message_eq. iIntros "H". rewrite iProto_le_unfold iProto_message_eq.
iRight. iExists _, _, _, _; do 2 (iSplit; [done|]). iRight. iExists _, _, _, _; do 2 (iSplit; [done|]).
...@@ -557,7 +557,7 @@ Section proto. ...@@ -557,7 +557,7 @@ Section proto.
(pc1 x1).1.1 = (pc2 x2).1.1 (pc1 x1).1.1 = (pc2 x2).1.1
(pc2 x2).1.2 (pc2 x2).1.2
iProto_le (pc1 x1).2 (pc2 x2).2) - iProto_le (pc1 x1).2 (pc2 x2).2) -
iProto_le (iProto_message Receive pc1) (iProto_message Receive pc2). iProto_le (iProto_message Recv pc1) (iProto_message Recv pc2).
Proof. Proof.
iIntros "H". iApply iProto_le_recv. iIntros (x2) "Hpc". iIntros "H". iApply iProto_le_recv. iIntros (x2) "Hpc".
rewrite bi_tforall_forall. iDestruct ("H" with "Hpc") as "H". rewrite bi_tforall_forall. iDestruct ("H" with "Hpc") as "H".
...@@ -574,10 +574,10 @@ Section proto. ...@@ -574,10 +574,10 @@ Section proto.
(pc1 x1).1.1 = (pc4 x4).1.1 (pc1 x1).1.1 = (pc4 x4).1.1
(pc2 x2).1.1 = (pc3 x3).1.1 (pc2 x2).1.1 = (pc3 x3).1.1
iProto_le (pc1 x1).2 (iProto_message Send pc3) iProto_le (pc1 x1).2 (iProto_message Send pc3)
iProto_le (iProto_message Receive pc4) (pc2 x2).2 iProto_le (iProto_message Recv pc4) (pc2 x2).2
(pc3 x3).1.2 (pc4 x4).1.2 (pc3 x3).1.2 (pc4 x4).1.2
((pc3 x3).2 (pc4 x4).2)) - ((pc3 x3).2 (pc4 x4).2)) -
iProto_le (iProto_message Receive pc1) (iProto_message Send pc2). iProto_le (iProto_message Recv pc1) (iProto_message Send pc2).
Proof. Proof.
iIntros "H". rewrite iProto_le_unfold iProto_message_eq. iIntros "H". rewrite iProto_le_unfold iProto_message_eq.
iRight. iExists _, _, _, _; do 2 (iSplit; [done|]); simpl. iRight. iExists _, _, _, _; do 2 (iSplit; [done|]); simpl.
...@@ -598,10 +598,10 @@ Section proto. ...@@ -598,10 +598,10 @@ Section proto.
(pc1 x1).1.1 = (pc4 x4).1.1 (pc1 x1).1.1 = (pc4 x4).1.1
(pc2 x2).1.1 = (pc3 x3).1.1 (pc2 x2).1.1 = (pc3 x3).1.1
iProto_le (pc1 x1).2 (iProto_message Send pc3) iProto_le (pc1 x1).2 (iProto_message Send pc3)
iProto_le (iProto_message Receive pc4) (pc2 x2).2 iProto_le (iProto_message Recv pc4) (pc2 x2).2
(pc3 x3).1.2 (pc4 x4).1.2 (pc3 x3).1.2 (pc4 x4).1.2
((pc3 x3).2 (pc4 x4).2)) - ((pc3 x3).2 (pc4 x4).2)) -
iProto_le (iProto_message Receive pc1) (iProto_message Send pc2). iProto_le (iProto_message Recv pc1) (iProto_message Send pc2).
Proof. Proof.
iIntros "H". iApply iProto_le_swap. iIntros (x1 x2) "Hpc1 Hpc2". iIntros "H". iApply iProto_le_swap. iIntros (x1 x2) "Hpc1 Hpc2".
repeat setoid_rewrite bi_tforall_forall. iDestruct ("H" with "Hpc1 Hpc2") as "H". repeat setoid_rewrite bi_tforall_forall. iDestruct ("H" with "Hpc1 Hpc2") as "H".
...@@ -618,10 +618,10 @@ Section proto. ...@@ -618,10 +618,10 @@ Section proto.
Lemma iProto_le_swap_simple {TT1 TT2} (v1 : TT1 V) (v2 : TT2 V) Lemma iProto_le_swap_simple {TT1 TT2} (v1 : TT1 V) (v2 : TT2 V)
(P1 : TT1 iProp Σ) (P2 : TT2 iProp Σ) (p : TT1 TT2 iProto Σ V) : (P1 : TT1 iProp Σ) (P2 : TT2 iProp Σ) (p : TT1 TT2 iProto Σ V) :
iProto_le iProto_le
(iProto_message Receive (λ x1, (iProto_message Recv (λ x1,
(v1 x1, P1 x1, iProto_message Send (λ x2, (v2 x2, P2 x2, p x1 x2))))) (v1 x1, P1 x1, iProto_message Send (λ x2, (v2 x2, P2 x2, p x1 x2)))))
(iProto_message Send (λ x2, (iProto_message Send (λ x2,
(v2 x2, P2 x2, iProto_message Receive (λ x1, (v1 x1, P1 x1, p x1 x2))))). (v2 x2, P2 x2, iProto_message Recv (λ x1, (v1 x1, P1 x1, p x1 x2))))).
Proof. Proof.
iApply iProto_le_swap. iIntros (x1 x2) "/= HP1 HP2". iApply iProto_le_swap. iIntros (x1 x2) "/= HP1 HP2".
iExists TT2, TT1, (λ x2, (v2 x2, P2 x2, p x1 x2)), iExists TT2, TT1, (λ x2, (v2 x2, P2 x2, p x1 x2)),
...@@ -717,12 +717,12 @@ Section proto. ...@@ -717,12 +717,12 @@ Section proto.
iProto_le (iProto_dual p) pr) iProto_le (iProto_dual p) pr)
( vl vsl' pc pr', ( vl vsl' pc pr',
vsl = vl :: vsl' vsl = vl :: vsl'
iProto_le (proto_message Receive pc) pr iProto_le (proto_message Recv pc) pr
pc vl (proto_eq_next pr') pc vl (proto_eq_next pr')
iProto_interp vsl' vsr pl pr') iProto_interp vsl' vsr pl pr')
( vr vsr' pc pl', ( vr vsr' pc pl',
vsr = vr :: vsr' vsr = vr :: vsr'
iProto_le (proto_message Receive pc) pl iProto_le (proto_message Recv pc) pl
pc vr (proto_eq_next pl') pc vr (proto_eq_next pl')
iProto_interp vsl vsr' pl' pr). iProto_interp vsl vsr' pl' pr).
Proof. Proof.
...@@ -824,7 +824,7 @@ Section proto. ...@@ -824,7 +824,7 @@ Section proto.
Lemma iProto_interp_recv vl vsl vsr pl pr pcr : Lemma iProto_interp_recv vl vsl vsr pl pr pcr :
iProto_interp (vl :: vsl) vsr pl pr - iProto_interp (vl :: vsl) vsr pl pr -
iProto_le pr (proto_message Receive pcr) - iProto_le pr (proto_message Recv pcr) -
pr, pcr vl (proto_eq_next pr) iProto_interp vsl vsr pl pr. pr, pcr vl (proto_eq_next pr) iProto_interp vsl vsr pl pr.
Proof. Proof.
iIntros "H Hle". iDestruct (iProto_interp_le_r with "H Hle") as "H". iIntros "H Hle". iDestruct (iProto_interp_le_r with "H Hle") as "H".
...@@ -916,7 +916,7 @@ Section proto. ...@@ -916,7 +916,7 @@ Section proto.
Lemma iProto_recv_l {TT} γ (pc : TT V * iProp Σ * iProto Σ V) vr vsr vsl : Lemma iProto_recv_l {TT} γ (pc : TT V * iProp Σ * iProto Σ V) vr vsr vsl :
iProto_ctx γ vsl (vr :: vsr) - iProto_ctx γ vsl (vr :: vsr) -
iProto_own γ Left (iProto_message Receive pc) == iProto_own γ Left (iProto_message Recv pc) ==
(x : TT), (x : TT),
vr = (pc x).1.1 vr = (pc x).1.1
iProto_ctx γ vsl vsr iProto_ctx γ vsl vsr
...@@ -938,7 +938,7 @@ Section proto. ...@@ -938,7 +938,7 @@ Section proto.
Lemma iProto_recv_r {TT} γ (pc : TT V * iProp Σ * iProto Σ V) vl vsr vsl : Lemma iProto_recv_r {TT} γ (pc : TT V * iProp Σ * iProto Σ V) vl vsr vsl :
iProto_ctx γ (vl :: vsl) vsr - iProto_ctx γ (vl :: vsl) vsr -
iProto_own γ Right (iProto_message Receive pc) == iProto_own γ Right (iProto_message Recv pc) ==
(x : TT), (x : TT),
vl = (pc x).1.1 vl = (pc x).1.1
iProto_ctx γ vsl vsr iProto_ctx γ vsl vsr
......
...@@ -13,7 +13,7 @@ recursive domain equation: ...@@ -13,7 +13,7 @@ recursive domain equation:
Here, the left-hand side of the sum is used for the terminated process, while Here, the left-hand side of the sum is used for the terminated process, while
the right-hand side is used for the communication constructors. The type the right-hand side is used for the communication constructors. The type
[action] is an inductively defined datatype with two constructors [Send] and [action] is an inductively defined datatype with two constructors [Send] and
[Receive]. Compared to having an additional sum in [proto], this makes it [Recv]. Compared to having an additional sum in [proto], this makes it
possible to factorize the code in a better way. possible to factorize the code in a better way.
The remainder [V → (▶ proto → PROP) → PROP)] is a predicate that ranges over The remainder [V → (▶ proto → PROP) → PROP)] is a predicate that ranges over
...@@ -39,10 +39,10 @@ From iris.algebra Require Import cofe_solver. ...@@ -39,10 +39,10 @@ From iris.algebra Require Import cofe_solver.
Set Default Proof Using "Type". Set Default Proof Using "Type".
Module Export action. Module Export action.
Inductive action := Send | Receive. Inductive action := Send | Recv.
Instance action_inhabited : Inhabited action := populate Send. Instance action_inhabited : Inhabited action := populate Send.
Definition action_dual (a : action) : action := Definition action_dual (a : action) : action :=
match a with Send => Receive | Receive => Send end. match a with Send => Recv | Recv => Send end.
Instance action_dual_involutive : Involutive (=) action_dual. Instance action_dual_involutive : Involutive (=) action_dual.
Proof. by intros []. Qed. Proof. by intros []. Qed.
Canonical Structure actionO := leibnizO action. Canonical Structure actionO := leibnizO action.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment