In this course, we will study functional programming, and will learn how to take advantage of the features of modern typed functional programming languages. We will study in depth the notions of algebraic data types, higher-order functions, polymorphism, and side-effects. The practice sessions will be done in Haskell, but concepts presented in the course can be applied in many other languages such as OCaml, SML or Python.
Prerequisites: CSE201 and CSE203
- Responsable: Blazy Olivier
- Responsable: Boury Théo
- Responsable: Haucourt Emmanuel
- Responsable: Zeilberger Noam
- Responsable: Blazy Olivier
- Responsable: Harington Elies
- Responsable: Haucourt Emmanuel
- Responsable: Strub Pierre-Yves
Prerequisite:CSE203
The course will present the paradigm of Constraint Logic Programming from its logical foundations for programming with relations, to its current applications. From logic programming and the early days of artificial intelligence, towards the holy grail of programming simply by modelling, the students will learn how to use a recent dialect of Prolog for relational databases, knowledge representation, automated deduction and combinatorial problem solving. The balance between declarative programming and efficiency, between clean semantics and expressiveness will be of particular interest, and will lead us into looking at how things work internally in a Prolog bytecode compiler (Warren Abstract Machine, indexing…) on practical examples.
- Responsable: Blazy Olivier
- Responsable: Fages François
- Responsable: Gardin Jackie
- Responsable: Haucourt Emmanuel
- Responsable: Hemery Mathieu
- Responsable: Blazy Olivier
- Responsable: Bournez Olivier
- Responsable: Haucourt Emmanuel
- Responsable: Blazy Olivier
- Responsable: Goubault Eric
- Responsable: Haucourt Emmanuel
- Responsable: Hummes Flores Bernardo
- Responsable: Lafont Ambroise
- Responsable: Pogudin Gleb
Prerequisite: CSE201, CSE202
This course explores fundamental concepts in 2D and 3D computer graphics, including digital images, 2- and 3-dimensional geometry, curves and surfaces, perspective, ray tracing, filtering and antialiasing, the graphics pipeline, and human visual perception.
- Responsable: Blazy Olivier
- Responsable: Bonneel Nicolas
- Responsable: Haucourt Emmanuel
- Responsable: Sundararaman Ramanasubramanyam
Our society relies on software and hardware systems for both safety- and mission-critical applications (e.g., autonomous vehicles, control systems, device drivers, ...) in different domains (e.g., aerospace, avionics, medical devices, ...). However, designing correct and reliable systems is challenging due to the systems' complexity (e.g., system's size, concurrency, ...). Model Checking studies the theory and algorithms that automatically check if a system always behaves "as intended". Such algorithms are successfully used in real life to verify hardware (e.g., in companies designing hardware like Intel, ARM, Apple, ...) and software (e.g., at NASA, Microsoft, ...).
This course is an introduction to Model Checking and will explain how we can specify a system (e.g., a program, the design of a microprocessor, a distributed protocol) and its properties with a mathematical formalisms (e.g., logic) and how we can reason automatically about all the possible system's executions (e.g., to show that a program or the design of a microprocessor do not contain bugs).
At the end of the course, a student will be able to:
- Model discrete systems (e.g., programs) using formal languages to precisely define the system's executions.
- Express different system properties (e.g., safety, liveness) using temporal logic.
- Reason algorithmically about all the possible executions of a system, deciding if a system satisfies a property.
- Implement the basic model checking algorithms for discrete systems and temporal logic properties.
- Manipulate programmatically state machines, automata, and logical formulas.
- Recognize the challenges of (statically) checking a complex system.
The lectures cover the theoretical aspects of Model Checking, introducing the necessary background, algorithms, and proofs showing the correctness of the approaches. During the tutorials, the students will learn how to implement, in practice, such automated reasoning techniques.
The course focuses on the algorithms for discrete, finite-state systems. It is a starting point for model checking more expressive systems, such as infinite-state systems (e.g., real software), probabilistic systems, timed and hybrid systems (e.g., control systems), and machine-learning systems (e.g., neural networks). The course is also a starting point for exploring other problems in formal methods (e.g., automated program synthesis).
- Responsable: Blazy Olivier
- Responsable: Haucourt Emmanuel
- Responsable: Mover Sergio