/** * AsyncBellmanFord * -- compute the distance from a source node, given the neighbors * from N. Lynch, p. 507 */ type Pid; type Val; var dist: [Pid] int; var parent: [Pid] Pid; const weight: [Pid, Pid] int; axiom (forall p: Pid :: weight[p,p] == 0); axiom (forall p, q: Pid :: weight[p,q] >= 0); const unique P1, P2, P3, P4: Pid; const NULL: Val; const INF: int; axiom (INF == 10000); procedure Main () { var root: Pid; var w: Val; assume (w != NULL); assume (forall p: Pid :: dist[p] == INF); call {:async} bellmanFord (root, 0, root); return; } procedure bellmanFord (this: Pid, w: int, sender: Pid) { var neighbor: Pid; if ( w + weight[this,sender] < dist[this] ) { dist[this] := w + weight[this,sender]; parent[this] := sender; while (*) { havoc neighbor; assume neighbor != this; assume neighbor != sender; call {:async} bellmanFord (neighbor, dist[this], this); } } return; }