Emerging semantic web service description formalisms, such as OWL-S, allow for a definition of the semantic of services. Describing input and output types is not sufficient to declaratively and unambiguously denote the operations offered by a web service. Two services may have the same input and output types and have completely different semantics of their operation. In this paper we present an approach for the specification of a web service denotation based on OWL-S capabilities, and an algorithm for dynamic discovery of services exploiting their denotation. We show how preconditions and results of the OWL-S formalism can be used to constrain the actual denotation of a service, and we describe how an agent can perform dynamic discovery of services exploiting their denotation. In our scenario, an agent has to search for the appropriate service, and verify that this service is able to produce the information that the agent needs.