agent user(U,S) {
oracle (int) tone[S], (bool) ringing[S]
handle (bool) onhook[S], (int) dialled_number[S]
protocol
not onhook[S] -> onhook[S]= true; dialled_number[S]=@,
not onhook[S] & (tone[S] == D) -> dialled_number[S]=N,
not onhook[S] & (tone[S] == C) -> <speak>,
onhook[S] and not ringing[S] -> onhook[S] = false ; dial(S),
onhook[S] and ringing[S] -> onhook[S] = false ; <speak>
}
agent telephone(S) {
oracle (bool) onhook[S], connecting[S,*], dialling[S],
(int) dialled_number[S],
(bool) connected[S,*], engaged[S,*]
state (bool) onhook[S] = true,
(int) dialled_number[S],
(bool) connecting[S,*] = false,
(bool) dialling[S] = false,
(char) tone[S]
derivate
(char) tone[S] = D if dialling[S]:
E if connecting[S, dialled_number[S]]
and engaged[S, dialled_number[S]]:
R if connecting[S, dialled_number[S]]
and not engaged[S, dialled_number[S]]:
C if connected[S,?] and connected[?,S]:
@ otherwise
}
agent exchange() {
oracle (bool) onhook[*], connected[*,*], connecting[*,*], answered[*]
state (bool) onhook[*], connected[*,*] = false, answered[*] = false
(bool) ringing[*], engaged[S,*],
(time) Tdial , Tcall
derivate
(bool) ringing[*] = connected[?,*] and onhook[*] and not answered[*],
(bool) engaged[S,*] = connecting[S,*] and (ringing[*] and not onhook[*]),
(time) Tdial = <timeout for dialling>,
(time) Tcall = <timeout for calling>
}
agent dial(S) {
oracle
(int) dialled_number[S],
(time) Tdial, time,
(bool) onhook[S],
(bool) connecting[S,*] = false
handle (time) tstart
state (time) tstart = |time|,
(bool) valid = <dialled_number[S] is valid>
derivate
(bool) dialling[S] = not onhook[S] and ((time - tstart) < Tdial),
(bool) LIVE = dialling[S] and not connecting[S, dialled_number[S]]
protocol
dialling[S] and valid -> connect(S, dialled_number[S])
}
agent connect(S,D) {
oracle (bool) onhook[S], onhook[D], ringing[D], engaged[S,D],
(time) Tcall , time
handle (time) tcall ,
(bool) connected[S,D], answered[D]
state (time) tcall = |time|,
(bool) connected[S,D] = false,
(bool) answered[D] = false
derivate
(bool) connecting[S,D] = not connected[S,D],
(bool) LIVE = not onhook[S] and
( (connecting[S,D] and (time-tcall )<Tcall)
and ringing[D] and
(connected[S,D] and (not answered[D] and not onhook[D]))
)
protocol
not engaged[S,D] and not connected[S,D] -> connected[S,D] = true,
not onhook[D] and not answered[S,D] and connected[S,D -> answered[D] = true,
engaged[S,D] -> delete connect(S,D)
}
agent environment() {
handle time
state time = 0
protocol
true -> time = |time| + 1
}