One interesting side note -- because Ada is a multi-tasking language, the objects that are designed to retain read/write global state need some kind of synchronization/protection. For such objects (tasks and protected objects), the object.operation(...) syntax is intentionally chosen, because there is clearly a special role played by the "target" task or protected object. By contrast, for value-oriented operations like set union, the symmetrical syntax of "union(set1, set2)" seems far more intuitive than "set1.union(set2)", and the symmetrical syntax is used for such operations in Ada.
(Tucker Taft)