<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Towards A Practical Model of Reactive Communication-Centric Software?</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Jaime Arias</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Mauricio Cano</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jorge A. Pérez</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>University of Bordeaux</institution>
          ,
          <addr-line>CNRS LaBRI UMR, INRIA</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>University of Groningen</institution>
          ,
          <country country="NL">The Netherlands</country>
        </aff>
      </contrib-group>
      <fpage>227</fpage>
      <lpage>233</lpage>
      <abstract>
        <p>Many distributed software systems are communication-centric: they are composed of heterogeneous software artifacts that interact following precise communication structures (protocols). One much-studied approach to system analysis equips process calculi with behavioral types (such as session types) so to abstract protocols and verify interacting programs. Unfortunately, existing behaviorally typed frameworks do not adequately support reactive behavior, an increasingly relevant feature in protocols. To address this shortcoming, We have been exploring how the synchronous programming paradigm can uniformly support the formal analysis of reactive, communication-centric programs. In this short communication, we motivate our approach and report on ongoing developments.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>
        In this short note, we describe our ongoing work on a reactive programming model
for communication-centric software systems. While most previous work relies on
models based on the π-calculus [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ], we are developing practical support for
communication-centric software systems using ReactiveML [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], a synchronous
programming language with functional and reactive features, and which relies
on solid formal foundations.
      </p>
      <p>
        In communication-centric software systems, collections of heterogeneous
software artifacts usually follow well-defined communication structures, or protocols.
Ensuring that programs conform to these protocols is key to certify system
correctness. One much-studied approach to the analysis of communicating programs
uses behavioral types [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], a type-based verification technique that captures
complex communication structures while enforcing resource-usage policies. Session
? Research partially supported by EU COST Action IC1201 (Behavioral Types for
      </p>
      <p>
        Reliable Large-Scale Software Systems) and CNRS PICS project 07313 (SuCCeSS).
Copyright c by the paper’s authors. Copying permitted for private and academic
purposes.
types [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] are a class of behavioral types that organize protocols as sessions
between two or more participants; a session type describes the contribution of each
partner to the protocol. First formulated as a type theory for the π-calculus,
session-based concurrency has been implemented as communication libraries for
mainstream languages, such as OCaml [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] and Scala [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ].
      </p>
      <p>
        One shortcoming of existing implementations is that they are based on
overly rigid programming models. In particular, current practical support for
communication-centric software systems does not explicitly consider reactive
behavior in communicating programs. This is a crucial feature, especially as
autonomous agents can now engage into protocols in our behalf (e.g., financial
transactions). In fact, reactive behavior is central in realistic implementations
of protocols with, e.g., exception handling, dynamic reconfiguration, and time.
While these features can be represented in languages based on the π-calculus
(cf. e.g., [
        <xref ref-type="bibr" rid="ref3 ref6">6,3</xref>
        ]), resulting models are often difficult or unnatural to reason about.
Session types themselves focus on representing communication structures and
thus abstract away from aspects related to reactivity. As protocols in emerging
applications are increasingly subject to external stimuli/events (typically hard to
predict), developing programming support that uniformly integrates structured
communications and flexible forms of reactive behavior appears as a pressing
need.
      </p>
      <p>
        To our knowledge, the amalgamation of reactive behavior into models of
structured communications has been little explored by previous works (see, e.g., [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]).
Our efforts have been triggered by our declarative interpretation of session-based
concurrency [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Our current work goes beyond the interpretation in [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] so to
consider reactive and declarative behavior from a programming languages perspective.
To this end, we have developed an implementation of sessions in ReactiveML [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ],
supported by a formal translation of session processes as ReactiveML programs.
Based on our preliminary results, we believe that models of reactive programming
improve previous works by offering a uniform basis for expressing and reasoning
about different kinds of constructs.
2
      </p>
    </sec>
    <sec id="sec-2">
      <title>Session Types</title>
      <p>
        Session types offer a type-based methodology to the validation of communicating
programs [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. Structured dialogues (protocols) between interacting parties are
represented as sessions; sequences of interactions along each channel in the
program/process are then abstracted as types, which can be used to (statically)
verify whether a program conforms to its intended protocols. Key properties
are fidelity (programs respect prescribed protocols) and communication safety
(programs do not have errors, e.g., communication mismatches). The syntax of
(binary) session types T, S is as follows:
!T.S
?T.S
&amp;{li : Ti}i∈I
⊕{li : Ti}i∈I
μX.T
end
      </p>
      <sec id="sec-2-1">
        <title>Output a value of type T , continue as type/protocol S</title>
        <p>Receive a value of type T , continue as type/protocol S
External choice among labeled types/protocols Ti (branching)
Internal choice of a labeled type/protocol Tj , with j ∈ I (selection)
Recursive protocol/type (with type variable X)</p>
        <p>Terminated protocol
In session-based concurrency, the notion of duality is key to ensure communication
safety. Intuitively, duality relates session types with opposite behaviors: e.g., the
dual of input is output, and vice versa; branching is the dual of selection, and
vice versa.</p>
        <p>We illustrate session types using a traditional example in the literature: the
Buyer-Seller-Shipper protocol, which can be informally described as follows:</p>
      </sec>
      <sec id="sec-2-2">
        <title>1. Buyer requests an item from Seller.</title>
        <p>2. Seller replies back asking for Buyer’s unique address.
3. Buyer sends his address to Seller, confirming the order.
4. Seller forwards Buyer’s address to Shipper.
5. Shipper sends to Buyer the estimated delivery time.
6. Buyer confirms to Shipper his availability for receiving the item.
We may formalize this protocol using the following session types:
BuySell = !item.?confirmation.!address.end SellShip = !address.end</p>
        <p>ShipBuy = !ETA.&amp;{yes :!ok.end, no :!bye.end}
where item, confirmation, address, and ETA denote basic types. Type BuySell
describes interactions between Buyer and Seller from Buyer’s perspective.
Similarly, SellShip describes an interaction from Seller’s perspective, and ShipBuy
takes the standpoint of Shipper in communications. Complementary types can
be obtained using duality. These three sessions take place in order, as in the
informal description above.
3</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>A Reactive Approach to Communication-Centric</title>
    </sec>
    <sec id="sec-4">
      <title>Systems</title>
      <p>The protocol presented before is well-suited for deployment using traditional
technologies (e.g., web services). However, it does not consider the possibility of
changes at runtime due to unexpected circumstances or external events. Moreover,
the protocol is not suited to emerging scenarios in which protocol partners are
deployed in, e.g., mobile devices with limited computational power and availability.
For instance, it is easy to imagine Shipper being implemented by a drone with
communication capabilities.</p>
      <p>To address these shortcomings of protocol descriptions in session-based
concurrency, we propose to use reactive behavior, as present in synchronous reactive
programming. In this context, we can envision a reactive variant of the
BuyerSeller-Shipper protocol, in which Shipper is a drone, and Buyer communicates
from a mobile phone. In this variant of the protocol, the first six steps are as
before; after Steps 1–6, an event from Buyer to Seller triggers the following
protocol:</p>
      <sec id="sec-4-1">
        <title>R1. Buyer adds an item to his recently completed order.</title>
        <p>R2. Seller replies back confirming the modified order.</p>
        <p>R3. Seller forwards the modified order to Shipper.</p>
        <p>R4. Shipper replies back in one of the following ways:
a) Shipper returns back to the store, picks up the new item, and confirms
to Buyer the previously given estimated delivery time, or
b) Shipper continues with the original order, and informs Buyer that the
second item will be delivered separately.</p>
        <p>That is, in the reactive Buyer-Seller-Shipper protocol some of the exchanges are
“standard” or “default” (cf. Steps 1-6); there are also other exchanges that are
executed as a reaction to some event or external circumstance (cf. Steps R1-R4).
In the latter steps, the external event concerns the request by Buyer of modifying
his order; other conceivable conditions include, e.g., drone malfunctioning and
wrong/delayed package deliveries. These extra exchanges also constitute
structured protocols, amenable to specification and validation using sessions; however,
their occurrence can be very hard to predict.</p>
        <p>
          Synchronous Reactive Programming and ReactiveML. Synchronous Reactive
Programming (SRP) is an event-based model of computation, optimized for
programming reactive systems [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]. Synchronous languages are based on the
hypothesis of perfect synchrony: reactive programs respond instantaneously and
produce their outputs synchronously with their input. A synchronous program
is meant to deterministically react to events coming from the environment: in
essence, it evolves through an infinite sequence of successive reactions indexed by
a global logical clock. During a reaction, each system component computes new
output values based on the input values and its internal state; the communication
of all events between components occurs synchronously during each reaction.
Reactions are required to converge and computations are entirely performed
before the current execution instant ends and the next one begins. This notion of
time enables SRP programs to have an order in the events of the system, which
makes it possible to reason about some time-related properties [
          <xref ref-type="bibr" rid="ref10 ref8">8,10</xref>
          ].
        </p>
        <p>
          ReactiveML is an SRP-based extension to the OCaml programming
language [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ], based on the reactive model presented in [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ]. This model allows
unbounded time response from processes and avoids causality issues that can
occur in other approaches to SRP, such as the one used by ESTEREL [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ].
ReactiveML extends OCaml with the notion of processes, which are state machines
whose behavior can be executed through several logical instants. Processes are
considered the reactive counterpart of OCaml functions, which are considered as
instantaneous in ReactiveML.
        </p>
        <p>In ReactiveML, synchronization is based on signals: events that occur in
one logical instant. Signals can trigger reactions in processes, to be executed
instantaneously or in the next time unit. Signals can carry values and can be
emitted from different processes in the same logical instant. There are three basic
ReactiveML constructs:
emit s v emits signal s with value v.
await one s &lt;e&gt; in P awaits a value along signal s that is
patternmatched to expression &lt;e&gt;. Process P is
executed in the next instant.
signal s in P declares signal s and bounds it to continuation</p>
        <p>P.</p>
        <p>
          Our Current Work: Structured Communications in SRP. Models of
communicationcentric systems (such as session types) usually rely on directed exchanges along
named channels. However, in SRP there is no native notion of channels: as we
have seen, signals are the main synchronization unit in ReactiveML. To deal with
this discrepancy, a key idea in our work is “simulating” channels using signals.
To this end, and since we would like to represent protocols respecting linearity,
we follow the representation of session channels in [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ], which uses a
continuationpassing style. This means that for each interaction within a communication
structure a new channel is created.
        </p>
        <p>We describe our ReactiveML implementation for Seller in the reactive
BuyerSeller-Shipper protocol. Recall that Seller is involved in two sessions: he first
communicates with Client, then interactions with Shipper occur. In the code
below we assume that all sessions have been already initiated; these are noted
cb for Buyer and cs for Seller.
let process seller conf =
await one cb (item,y) in signal c1 in
emit y (conf,c1);pause;
await one c1 (addr,u) in signal c2 in
emit cs (addr,c2);pause
The code declares seller as a process in ReactiveML (a non-instantaneous
function); we describe its body. The first line awaits a signal cb, which carries a
pair of elements: a value and a reference to the signal where further interactions
will occur (i.e., y). Then, a signal c1, where the next interaction will occur, is
declared. Subsequently, a pair (containing a message conf and a reference to
signal c1) is emitted over signal y; no further actions are taken in this time unit.
Once the message is received by Buyer, seller awaits Buyer’s address. At this
point, the first session has finished and communication with Shipper begins. In
the last line, Buyer’s address is sent to Shipper.</p>
        <p>Notice that once seller is finished, so is any communication from Seller. But
in the reactive protocol, Seller must await possible further actions from either
Buyer or Shipper. To implement this key feature, we extend the previous code
with the following line of code: await one g (v,e) in P. This new line puts
seller to “sleep" until an event/signal g from either Buyer or Seller triggers a new
reaction P from it. Note that this signal for interrupts or events should be known
to every party in the communication. The idea is then that the continuation
process P should decide which course of action to take depending on the value
carried by g. In our reactive protocol, process P could implement Steps R1-R4,
following the implementation scheme of seller.
4</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Concluding Remarks</title>
      <p>
        We have described our ongoing implementation of essential features of
sessionbased concurrency in ReactiveML, a reactive functional programming language.
Our implementation uses ReactiveML processes to handle usual session protocols
(send, receive, select, and branch constructs). We believe that our approach is
already on a par with other session implementations (such as [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]) with substantial
room for improvement, due to the reactive behavior supported by ReactiveML.
We expect our research to enable the practical use of session-based concurrency
into emerging application scenarios, such as, e.g., Collective Adaptive Systems
(CAS).
      </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>A.</given-names>
            <surname>Benveniste</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Caspi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. A.</given-names>
            <surname>Edwards</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Halbwachs</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P. L.</given-names>
            <surname>Guernic</surname>
          </string-name>
          , and R. de Simone.
          <article-title>The synchronous languages 12 years later</article-title>
          .
          <source>Proceedings of the IEEE</source>
          ,
          <volume>91</volume>
          (
          <issue>1</issue>
          ):
          <fpage>64</fpage>
          -
          <lpage>83</lpage>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>G.</given-names>
            <surname>Berry</surname>
          </string-name>
          and
          <string-name>
            <surname>G. Gonthier.</surname>
          </string-name>
          <article-title>The esterel synchronous programming language: Design, semantics, implementation</article-title>
          .
          <source>Sci. Comput</source>
          . Program.,
          <volume>19</volume>
          (
          <issue>2</issue>
          ):
          <fpage>87</fpage>
          -
          <lpage>152</lpage>
          ,
          <year>1992</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>L.</given-names>
            <surname>Bocchi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Yang</surname>
          </string-name>
          , and
          <string-name>
            <given-names>N.</given-names>
            <surname>Yoshida</surname>
          </string-name>
          .
          <article-title>Timed multiparty session types</article-title>
          .
          <source>In Proc. of CONCUR'14</source>
          , volume
          <volume>8704</volume>
          , pages
          <fpage>419</fpage>
          -
          <lpage>434</lpage>
          . Springer,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>F.</given-names>
            <surname>Boussinot</surname>
          </string-name>
          and R. de Simone.
          <article-title>The SL synchronous language</article-title>
          .
          <source>IEEE Trans. Software Eng.</source>
          ,
          <volume>22</volume>
          (
          <issue>4</issue>
          ):
          <fpage>256</fpage>
          -
          <lpage>266</lpage>
          ,
          <year>1996</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>M.</given-names>
            <surname>Cano</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Rueda</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H. A.</given-names>
            <surname>López</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J. A.</given-names>
            <surname>Pérez</surname>
          </string-name>
          .
          <article-title>Declarative interpretations of session-based concurrency</article-title>
          .
          <source>In Proc. of PPDP'15</source>
          , pages
          <fpage>67</fpage>
          -
          <lpage>78</lpage>
          . ACM,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>M.</given-names>
            <surname>Carbone</surname>
          </string-name>
          .
          <article-title>Session-based choreography with exceptions</article-title>
          .
          <source>Electr. Notes Theor. Comput. Sci.</source>
          ,
          <volume>241</volume>
          :
          <fpage>35</fpage>
          -
          <lpage>55</lpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>O.</given-names>
            <surname>Dardha</surname>
          </string-name>
          , E. Giachino, and
          <string-name>
            <given-names>D.</given-names>
            <surname>Sangiorgi</surname>
          </string-name>
          .
          <article-title>Session types revisited</article-title>
          .
          <source>In Proc. of PPDP'12</source>
          , pages
          <fpage>139</fpage>
          -
          <lpage>150</lpage>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8. R. de Simone,
          <string-name>
            <given-names>J.</given-names>
            <surname>Talpin</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D.</given-names>
            <surname>Potop-Butucaru</surname>
          </string-name>
          .
          <article-title>The synchronous hypothesis and synchronous languages</article-title>
          .
          <source>In Embedded Systems Handbook. CRC Press</source>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>X.</given-names>
            <surname>Fu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Bultan</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Su</surname>
          </string-name>
          .
          <article-title>Conversation protocols: a formalism for specification and verification of reactive electronic services</article-title>
          .
          <source>Theor. Comput. Sci.</source>
          ,
          <volume>328</volume>
          (
          <issue>1-2</issue>
          ):
          <fpage>19</fpage>
          -
          <lpage>37</lpage>
          ,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <given-names>A.</given-names>
            <surname>Gamati</surname>
          </string-name>
          .
          <article-title>Designing Embedded Systems with the SIGNAL Programming Language: Synchronous, Reactive Specification</article-title>
          . Springer, 1st edition,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <given-names>K.</given-names>
            <surname>Honda</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V. T.</given-names>
            <surname>Vasconcelos</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Kubo</surname>
          </string-name>
          .
          <article-title>Language Primitives and Type Discipline for Structured Communication-Based Programming</article-title>
          .
          <source>In Proc. of ESOP'98</source>
          , volume
          <volume>1381</volume>
          , pages
          <fpage>122</fpage>
          -
          <lpage>138</lpage>
          . Springer,
          <year>1998</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12. H.
          <string-name>
            <surname>Hüttel</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          <string-name>
            <surname>Lanese</surname>
            ,
            <given-names>V. T.</given-names>
          </string-name>
          <string-name>
            <surname>Vasconcelos</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          <string-name>
            <surname>Caires</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Carbone</surname>
          </string-name>
          ,
          <string-name>
            <surname>P.-M. Deniélou</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Mostrous</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          <string-name>
            <surname>Padovani</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Ravara</surname>
            , E. Tuosto,
            <given-names>H. T.</given-names>
          </string-name>
          <string-name>
            <surname>Vieira</surname>
            , and
            <given-names>G.</given-names>
          </string-name>
          <string-name>
            <surname>Zavattaro</surname>
          </string-name>
          .
          <article-title>Foundations of session types and behavioural contracts</article-title>
          .
          <source>ACM Comput. Surv.</source>
          ,
          <volume>49</volume>
          (
          <issue>1</issue>
          ):3:
          <fpage>1</fpage>
          -
          <lpage>3</lpage>
          :
          <fpage>36</fpage>
          ,
          <string-name>
            <surname>Apr</surname>
          </string-name>
          .
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <given-names>L.</given-names>
            <surname>Mandel</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Pouzet</surname>
          </string-name>
          .
          <article-title>ReactiveML: a reactive extension to ML</article-title>
          .
          <source>In Proc. of PPDP'05</source>
          , pages
          <fpage>82</fpage>
          -
          <lpage>93</lpage>
          . ACM,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <given-names>R.</given-names>
            <surname>Milner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Parrow</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D.</given-names>
            <surname>Walker</surname>
          </string-name>
          .
          <article-title>A calculus of mobile processes, I. Inf</article-title>
          . Comput.,
          <volume>100</volume>
          (
          <issue>1</issue>
          ):
          <fpage>1</fpage>
          -
          <lpage>40</lpage>
          ,
          <year>1992</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <given-names>L.</given-names>
            <surname>Padovani. FuSe -</surname>
          </string-name>
          <article-title>A simple library implementation of binary sessions</article-title>
          . URL: http://www.di.unito.it/~padovani/Software/FuSe/FuSe.html.
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <given-names>A.</given-names>
            <surname>Scalas</surname>
          </string-name>
          and
          <string-name>
            <given-names>N.</given-names>
            <surname>Yoshida</surname>
          </string-name>
          .
          <article-title>Lightweight session programming in scala</article-title>
          .
          <source>In ECOOP</source>
          <year>2016</year>
          ,
          <article-title>LIPIcs</article-title>
          . Dagstuhl,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>