Consistency-by-Construction Techniques for Software Models and Model Transformations