1. Introduction
Software has moved from monolithic, static, and centralized structures to modular, dynamic, and distributed ones [1]. This shift has been supported by the development of new architectural paradigms. Service-oriented architectures (SOAs) [2] are currently among the most successful ones. They center around the abstraction of a service that encapsulates atomic functionality. SOA applications, also called workflows, consist of a set of tasks, each one associated with a required functionality, and a control flow between those tasks. For every task in the workflow, several services can be applicable that offer the same functionality. Executing a workflow requires a binding that maps workflow tasks to specific services.