program graph;
  -- Computes a minimum spanning tree of a weighted graph
var nodes := { "A", "B", "C", "D", "E"};

var edges := { [{"A","B"}, 3], [{"B","C"},7], [{"C","D"},2],
                [{"A","C"}, 6], [{"D","E"}, 1], [{"C","E"}, 4] };
 

print(MinSpanTree(nodes,edges));
 

procedure MinSpanTree(nodes,edges);
  var tree := {};
  var newnodes := { arb nodes };
  nodes := nodes - newnodes;

  while nodes /= {} loop
    eligible_edges := pickedges(newnodes,nodes,edges);
    [endpoints,cost] :=
       arb { [endpoints,cost]  in eligible_edges |
                cost = min / { c : [-,c] in eligible_edges }};

    newnode := arb { n in endpoints | n in nodes };
    nodes less:= newnode;
    newnodes with:= newnode;
    tree with:= [endpoints,cost];
  end loop;
  return tree;
end MinSpanTree;

procedure pickedges(newnodes,oldnodes,edges);
  return { [endpoints,cost] in edges |
                (exists x in endpoints | x in oldnodes) and
                (exists y in endpoints | y in newnodes) };
end pickedges;

end graph;