Distributive laws for composition and union of module specifications for software systems