TODO unfinished bits

TODO: I guess that most of this should take part of the Reference Manual.

Additives

(not yet supported in the prototype, see Issue #10)

A₀ ⊕ A₁ = !(x : LR). case x of { `left -> A₀ ; `right -> A₁ }
A₀ & A₁ = ?(x : LR). case x of { `left -> A₀ ; `right -> A₁ }
0       = !(x : Empty). case x of {}
⊤       = ?(x : Empty). case x of {}

Loli

Definition:

A -o B = {~A,B}

Equivalences:

A -o B -o C -o D
  == A -o (B -o (C -o D))
  == {~A,B -o C -o D}
  == {~A,{~B,C -o D}}
  == {~A,{~B,{~C,D}}}
  ~= {~A,~B,~C,D}
  ~= {{~A,~B,~C},D}
  == {~[A,B,C],D}
  == [A,B,C] -o D

{}/[] are associative and commutative

{A,B} -o {B,A}
[A,B] -o [B,A]

[::] is associative

[:[:A,B:],C:] -o [:A,[:B,C:]:]

Mix rule

[A0,...,An] -o {A,...,An}

[] -o {}
[A,B] -o {A,B}
Session Parallel Sequential
[A,B] -o {A,B} ten_loli_par.ll ten_loli_par_sequential.ll
{A,B} -o {B,A} par_comm.ll
A : Session
B : Session
C : Session

par_comm_core = proc(i : ~{A,B}, o : {B,A})
  i[na,nb]
  o{b,a}
  (fwd(A)(a,na) | fwd(B)(b,nb))

par_comm = proc(c :
  c{i,o}
  @par_comm_core(i,o)

ten_comm = proc(c : [~B,~A] -o [~A,~B])
  c{i,o}
  @par_comm_core(o,i)

par_assoc_core = proc(i : ~{{A,B},C}, o : {A,{B,C}})
  i[nab,nc] nab[na,nb] o{a,bc} bc{b,c}
  (fwd(A)(a,na) | fwd(B)(b,nb) | fwd(C)(c,nc))

par_assoc = proc(c : {{A,B},C} -o {A,{B,C}})
  c{i,o}
  @par_assoc_core(i,o)

ten_assoc = proc(c : [[~A,~B],~C] -o [~A,[~B,~C]])
  c{i,o}
  @par_assoc_core(o,i)

ten_loli_seq = proc(c : [A,B] -o [:A,B:])
  c{i,o}
  i{na,nb}
  o[:a,b:]
  (fwd(A)(a,na) | fwd(B)(b,nb))

par_loli_seq = proc(c : {A,B} -o [:A,B:])
  c{i,o}
  i[na,nb]
  o[:a,b:]
  (fwd(A)(a,na) | fwd(B)(b,nb))

seq_assoc_core = proc(i : ~[:[:A,B:],C:], o : [:A,[:B,C:]:])
  i[:nab,nc:]
  nab[:na,nb:]
  o[:a,bc:]
  bc[:b,c:]
  (fwd(A)(a,na) | fwd(B)(b,nb) | fwd(C)(c,nc))

seq_assoc = proc(c : [:[:A,B:],C:] -o [:A,[:B,C:]:])
  c{i,o}
  @seq_assoc_core(i,o)

TODO: Rejected

{A,B} -o [A,B]

TODO: Should be accepted eventually

{!S,!T} -o [!S,!T]
{?S,?T} -o [?S,?T]
[:[:A,B:],C:] -o [:A,[:B,C:]:]
[:A,[:B,C:]:] -o [:[:A,B:],C:]