Student that pass the course satisfactorily will be able to:

- Analyze the computational complexity of algorithms by using discrete mathematics.
- Express facts and situations by using symbolic logic and set theory.
- Apply logical principles for sound reasoning.
- Apply probability theory and statistics to handle uncertainty.
- Analyze the power and limitations of abstract models of computation.
- Infer facts and relationships from collected data.
- Design computer-based systems with realistic requirements.
- Evaluate and adapt standard algorithms (e.g. sorting, searching, string processing, language recognition, combination generation, and graph processing) for realistic tasks.
- Design and implement algorithms, heuristics and supporting data structures as packaged components.
- Construct mathematical or logical models of computational problems.
- Use non-verbal modes of communication, e.g. graphical.
- Use a programming language in non-imperative paradigm, e.g. functional and logic.