Inductive logic programming (ILP) is a form of program synthesis. The goal is to learn logic programs that generalise examples. ILP has attractive features such as strong data efficiency and high expressivity. The challenge lies in efficiently searching large hypothesis spaces. We present approaches to improve the learning performance of ILP systems, building on recent progress in constraint programming. We demonstrate the scalability of our approaches to complex problems involving noise or infinite numerical domains.