Non-functional requirements encompass important design concerns such as schedulability, security, and communication constraints. In model-based development they non-locally impact admissible platform mappings and design spaces. In this paper we present a novel and formal approach for specifying non-functional requirements as constraint systems over the space of models. Our approach, based on structured logic programming, allows interacting requirements to be specified independently from each other and composed together.