Specification languages for distributed systems