À minha família, que me apoia incondicionalmente. Faço um agradecimento especial aos meus pais, Augusto e Claudia, que me motivam sempre a não desistir dos meus sonhos, e à minha irmã (e melhor amiga) Débora, que mesmo nos dias mais tristes e cansativos consegue me fazer sorrir. Obrigada por sempre me convencer de que eu sou capaz de conquistar meus objetivos.Ao meu namorado Roberto, que é meu companheiro de todas as horas. Obrigada por aguentar meus dramas diários e por me fazer enxergar o lado bom de tudo.Ao meu orientador Paulo Borba, que passei a admirar (ainda mais) depois de me tornar sua aluna. Sempre muito paciente comigo e presente na minha vida, tem guiado meus passos da melhor forma possível. Serei eternamente grata pelos ensinamentos. Agradeço também ao meu co-orientador Lepoldo Teixeira, que é uma inspiração para mim como profissional. Sua constante presença e apoio foram essenciais.Aos meus amigos, que torcem tanto por mim e sempre me colocam pra cima, obrigada por tudo.Aos membros do SPG, pelos comentários e feedbacks a respeito do meu trabalho. Em especial, gostaria de agradecer às minhas irmãs de pesquisa Klissiomara, Paola e Thaís, que se tornaram amigas. Nossa convivência e momentos de descontração são de extrema importância pra mim. À Nicolas Dintzner, que desenvolveu uma ferramenta bastante útil no meu trabalho e estava sempre à disposição para me ajudar. Esta interação contribuiu bastante para o meu aprendizado. À Coordenação de Aperfeiçoamento Pessoal de Nível Superior (CAPES), por ter financiado esta pesquisa."Mathematical reasoning may be regarded rather schematically as the exercise of a combination of two facilities, which we may call intuition and ingenuity.
AbstractSoftware product lines (SPLs) are sets of related systems that are built based on reusable artifacts. They have three elements: a variability model, that has feature declarations and dependencies among them; implementation artifacts and a configuration knowledge, that maps features to their implementation. SPLs provide several advantages, like software quality and reuse improvements, productivity gains and the capacity to customize a system depending on customers needs. There are several challenges in the SPL development context. To build customizable software and meet all customer needs, SPLs tend to increase over time. The larger a SPL becomes, the higher is the complexity to evolve it. Therefore, it is not trivial to predict which products are affected by a change, specially in large SPLs. One might need to check if products had their behaviour preserved to avoid inadvertently affecting existing users in an evolution scenario. In refactoring and conservative extension scenarios, we can avoid this problem by checking for behavior preservation, either by testing the generated products or by using formal theories. Product line refinement theories support that by requiring behavior preservation for all existing products. This happens in a number of situations, such as code refinements. For instance, in function renaming tran...