Enhancing Scalability in Genetic Programming with Adaptable Constraints, Type Constraints and Automatically Defined Functions