Summer Term 2017
Automata Theory (Seminar, Proseminar)
In the lecture about theoretical computer science you have seen finite automata, pushdown automata and Turing machines. All three of them operate on finite words. However there are other automata models and automata that do not operate on finite words, but e.g. on infinite words, on nested words, on trees, etc. In this seminar we will have a look at automata models that you have not seen in the lecture on theoretical computer science.
Program Analysis & Software Testing (Seminar)
Program analysis is the research area that studies the automatic analysis of computer programs. The methods that are developed in this research area e.g., help programmers to understand complex programs, allow compilers to optimize their code, and enable computers to check the correctness of programs. In this seminar each student will study a research paper and give a talk in which he/she presents a summary of the paper.
Softwarepraktikum (Nur für B.Sc. Informatik und B. Sc. ESE)
In diesem Praktikum soll ein Softwareentwicklungsprozess, beginnend bei Anforderungserhebung über Entwurfsphase bis hin zur Implementierung, die Organisation der Arbeit innerhalb einer Gruppe und der Umgang mit komplexen Systemen erlernt werden. Die Teilnehmer werden von den Betreuern in Gruppen eingeteilt und müssen eine bestimmte Aufgabenstellung realisieren. Hierzu müssen sie sich selbst organisieren, die Anforderungen definieren, Arbeit geschickt auf Gruppenmitglieder verteilen und neue Technologien selbstständig erlernen.
Cyber-Physical Systems - Hybrid Models (Lecture)
In this lecture, we investigate different methods and algorithms used to model and analyze cyber-physical systems. We use the formalism of hybrid automata to account for the discrete and the continuous aspects of the behavior of cyber-physical systems.
Formal Methods for Java (Lecture)
Recently, formal methods have been successfully used to specify and verify large software system. A current example is the Verisoft project, whose goal is to create a fully verified processor, operating system and compiler. In this lecture we will investigate the exising methods for the language Java. The language Java was chosen because it is a mature language, with a semi-formal definition of its semantics (The Java Language Specification). However, to use mathematical reasoning, we need a precise definition of the semantics. Therefore, we will sketch the definition of an operational semantics for Java. Furthermore, we will investigate different formal methods for Java. The starting point will be the language extension JML that allows Design by Contract. This allows to add pre- and postconditions to methods and invariants to classes and loops. These assertions can be checked during runtime and this is the purpose of the JML runtime assertion checker (jmlrac). On the other hand, there are static methods, e.g., ESC/Java and Jahob, that automatically provide mathematical proofs that the Java code ensures the post-condition for each possible pre-condition. If these proofs cannot be find automatically, one can also use theorem provers that assists finding a proof manually. In this lecture, we will present the different approaches for verification of Java code. In the exercise you can investigate different tools on small practical examples.
Program Verification (Lecture)
Often computers are used in embedded, networked, safety critical applications. The cost of failure is high. In this lecture we introduce the basis of automatic tools for ensuring that a system does not have bad behaviours. In the lecture, we start with a short introduction to propositional logic and first-order reasoning. We then go on to establish a setting for the verification of programs, whose correctness is specified by a kind of program comments. In this setting, the correctness of the program is reduced to the validity of logical formulas. The validity is proven automatically by a new generation of powerful reasoning engines. Finally, we connect verification with static analysis methods that have been developed originally in compiler optimization and which are formalized by Patrick and Radhia Cousot's framework of abstract interpretation.
Softwaretechnik / Software Engineering (Lecture)
Software engineering is "the application of engineering to software" (IEEE 610.12). Goal of this course is to provide a broad overview over the challenges of software engineering and techniques and tools to overcome them. To this end, we will discuss the main activities with software development (in particular project management, requirements engineering, design, testing, formal verification) with an emphasis on formal methods. We will study process models, (software metrics), approaches to requirements specification and analysis, (formal) modeling and analysis techniques, design and architecture patterns, testing, and program verification.