A heuristic is a technique that allows to introduce domain-specific knowledge about a problem into programs in order to provide them with an intelligent or expert component which helps to solve the problem. Heuristic knowledge can be obtained from human experts or it can be automatically extracted using techniques such as statistical models, problem simplification or machine learning. Our interest in this technique consists in its combination with other techniques such as parallelism, genetic algorithms and state-space search, in order to solve constraint satisfaction and optimisation problems.