Reasoning, learning, searching for new information, extracting models from knowledge base systems and adapting to unpredictable situations are key factors in any modern computer system. The goal of this course is to investigate knowledge representation models and algorithms that are useful to reason about facts and situations and are suitable to support advanced search and optimisation strategies other than learning systems. In fact, learning from experience and from errors is a crucial aspect for any intelligent system that has to interact with an external environment. The course moves from simple to complex problems introducing concept such as heuristic search and approximation algorithms. These are important tools to allow the student to theoretically analyze and practically solve real life situations.