Enter a pi-calculus in the box below, and press the "submit" button to invoke deadlock-free analysis. Examples are given below. Note that on this web interface, only small examples can be tested (as the time-out is set to 1 second). To test larger examples or other features of TyPiCal, please download the source code from here.
/*** one input and one ouput ***/ x?y | x!1
/*** deadlocked process ***/ new x in new y in x?z.y!z | y?z.x!z
/*** Not deadlocked --- there is an ouput x! to break the deadlock ***/ new x in new y in x?z.y!z | y?z.x!z | x!1
/*** lock-free, two dining philosophers ***/
new philos1 in new philos2 in new fork1 in new fork2 in
/*** a left-handed philosopher, who picks the left fork first ***/
*philos1?x.(let left=fst(x) in let right=snd(x) in
left?w.right?w.(left!() | right!() | eating1!() | philos1!(left,right))) |
philos1!(fork1,fork2) |
/*** a left-handed philosopher, who picks the left fork first ***/
*philos2?x.(let left=fst(x) in let right=snd(x) in
right?w.left?w.(left!() | right!() | eating2!() | philos2!(left,right))) |
philos2!(fork2,fork1) |
/*** forks ***/
fork1!() | fork2!()
/*** deadlocked, two dining philosophers ***/
new philos1 in new philos2 in
new fork1 in new fork2 in
/*** a left-handed philosopher, who picks the left fork first ***/
*philos1?x.(let left=fst(x) in let right=snd(x) in
left?w.right?w.(left!() | right!() | eating1!() | philos1!(left,right))) |
philos1!(fork1,fork2) |
/*** a right-handed philosopher, who picks the left fork first ***/
*philos2?x.(let left=fst(x) in let right=snd(x) in
left?w.right?w.(left!() | right!() | eating2!() | philos2!(left,right))) |
philos2!(fork2,fork1) |
/*** forks ***/
fork1!() | fork2!()
/**** The symbol table example taken from
**** Deng and Sangiorgi, "Ensuring Termination by Typability," Information and Computation
**** The changes from the original example are:
**** (1) Synchronous outputs have been replaced with asynchronous ones.
**** (2) nil has been replaced by a dummy channel, and an extra parameter has been added to p,
**** which expresses whether b is nil.
****/
(new p in
*(p?x.
let a=fst(x) in let b=fst(snd(x)) in let n=fst(snd(snd(x))) in let s = fst(snd(snd(snd(x)))) in
let empty = snd(snd(snd(snd(x)))) in /*** p?(a,b,n,s,empty). ***/
a?y.let t = fst(y) in let r = snd(y) in /*** a?(t,r). ***/
if t=s then (r!n | p!(a,(b,(n,(s,empty)))))
else if empty then
(r!(n+1) |
new c in new dummy in
(p!(c,(dummy,(n+1,(t,true)))) | p!(a,(c,(n,(s,false)))) |
*dummy?z.let r=snd(z) in r!0))/*** A dummy process to respond to any request immediately.
Actually, it is never called.***/
else (b!(t,r) | p!(a,(b,(n,(s,false))))))
| (new dummy in p!(a,(dummy,(1,(s0,true)))) | *dummy?z.let r=snd(z) in r!0)
)
| a!(1,r1)
| a!(2,r2)
| a!(3,r3)
| a!(4,r3)
| r1?x.O
| r2?x.O