| (1) assignment:  lhs=rhs; i | 
| τ[lhs=rhs; i](aeg) = τ[i]((
aeg.Es∪evts(lhs)∪evts(rhs),
aeg.pos∪end(aeg.pos)×(evts(rhs)∪
evts(lhs)\trg(lhs))∪
(evts(rhs)∪evts(lhs)\trg(lhs))
×trg(lhs),
aeg.cmp
)) |  | 
|  | 
| (2) function call:  fun(); i | 
| τ[fun(); i] = τ[i] ∘ τ[body(fun)] |  | 
|  | 
| (3) guard:  [expr] i1; i2 | 
| τ[[guard] i1; i2] (aeg) = let 
guarded=τ[i1](aeg) in
τ[i2] ((aeg.Es∪ guarded.Es,
aeg.pos∪guarded.pos,aeg.cmp)) |  | 
|  | 
| (4) forward jump:   goto l; | 
| τ[goto l; i] = τ[follow(l)] |  | 
|  | 
| (5) backward jump:  l: i1; 
[cond] goto l; i2 | 
| τ[l: i1; [cond]goto l; i2] (aeg) = let 
local=τ[i1] (aeg) in
τ[i2]((aeg.Es∪local.Es, 
aeg.pos∪
local.pos ∪ end(local.pos)×
begin(local.pos),aeg.cmp)) |  | 
|  | 
| (6) assume / assert / skip: 
  assume(φ); i / assert(φ); i / skip; i | 
| τ[assume(φ); i] = τ[i] |  | 
|  | 
| (7) new thread:  start_thread th; 
i | 
| τ [start_thread th; i](aeg) =  let
local=τ[body(th)](∅) and 
main=τ[i](aeg) and
inter=τ[i](∅) in
(local.Es∪main.Es,
local.pos∪main.pos, 
local.Es⊗inter.Es) |  | 
|  | 
| (8) end of thread / function:  end_thread; | 
| τ[end_thread](aeg) = aeg |  | 
|  | 
| (9) atomic section:  atomic_begin; 
i1; atomic_end; i2 | 
| τ[atomic_start; i1; atomic_end; i2](aeg) =
let section=τ[i1]((aeg.Es,aeg.pos∪
end(aeg.pos)×{f}, aeg.cmp)) in
τ[i2]((section.Es,
section.pos∪
end(section.pos)×{f},
section.cmp)) |  |