Modellieren, Programmieren, Verifizieren - Lehrstuhl ...
Modellieren, Programmieren, Verifizieren - Lehrstuhl ...
Modellieren, Programmieren, Verifizieren - Lehrstuhl ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong><br />
Dreiklang der Softwaretechnik und Programmiersprachen!<br />
Prof. Dr. Gerald Lüttgen!<br />
<strong>Lehrstuhl</strong> Softwaretechnik und Programmiersprachen!<br />
Universität Bamberg!<br />
www.swt-bamberg.de!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 3!
Die Sinfonie des heutigen Abends!<br />
2. Satz (Andante)!<br />
Softwareentwicklung im ingenieurswissenschaftlichen Kontext!<br />
– <strong>Modellieren</strong>, <strong>Programmieren</strong> und <strong>Verifizieren</strong> gehören zusammen!<br />
3. Satz (Scherzo)!<br />
Vorstellung von zwei aktuellen Forschungsprojekten am <strong>Lehrstuhl</strong>!<br />
– An den Nahtstellen von <strong>Modellieren</strong>, <strong>Programmieren</strong> und <strong>Verifizieren</strong>!<br />
4. Satz „Finale“ (Adagio)!<br />
Begegnung und fachliche Diskussion bei Bu#et, Bier und Musik!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 4!
Softwareentwicklung im<br />
ingenieurswissenschaftlichen Kontext!<br />
<strong>Modellieren</strong>, <strong>Programmieren</strong> und <strong>Verifizieren</strong><br />
gehören zusammen!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 5!
Anfänge der Softwareentwicklung!<br />
• Programmierbare Rechner!<br />
– Mechanisch!<br />
• Webstuhl von J.-M. Jacquard (1805)!<br />
– Elektromechanisch!<br />
• Z3 & Z4 von K. Zuse (1940er-Jahre)!<br />
– Elektronisch!<br />
• ENIAC (U. Pennsylvania, 40er-Jahre)!<br />
• Höhere Programmiersprachen!<br />
– Fortran, Lisp, Cobol, Algol (1950-60er)!<br />
– C, Smalltalk, ML, Prolog (1970er)!<br />
[Quelle d. Abb.: !<br />
Wikimedia Commons]!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 6!
Die 1. Softwarekrise!<br />
• Computer, Software & Programmierung (seit 50er-Jahre)!<br />
– Höhere Programmiersprachen und Compiler!<br />
• Die 1. Softwarekrise (60er–80er-Jahre)!<br />
[Quelle d. Abb.: Wikimedia Commons]!<br />
– Rede von E. W. Dijkstra zur Verleihung des Turing Awards 1972!<br />
„[...] nun da wir gigantische Computer haben, ist die Programmierung<br />
zu einem ebenso gigantischen Problem geworden.“!<br />
– Softwareentwicklung nach intuitiven Methoden, wenig Qualitätssicherung!<br />
Kundenanforderungen und Termine wurden nicht eingehalten, Programmierfehler<br />
häuften sich, Kosten stiegen rasant, Projekte scheiterten!<br />
– Einberufung einer internationalen Konferenz in Garmisch!<br />
„Softwaretechnik“ (Software Engineering) als Lösung [F. L. Bauer]!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 7!
Lernen von den Ingenieurwissenschaften!<br />
Vorgehensweise bei der Entwicklung von Produkten!<br />
Spezifikation!<br />
!<br />
<strong>Modellieren</strong>,!<br />
Entwerfen!<br />
+!<br />
Projektmanagement!<br />
<strong>Verifizieren</strong>!<br />
Entwurf!<br />
Produkt!<br />
Realisieren!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 8!
Lernen von den Ingenieurwissenschaften!<br />
Vorgehensweise bei der Entwicklung von Tragflächen!<br />
Spezifikation!<br />
Anforderungen an Tragfläche!<br />
!<br />
<strong>Modellieren</strong>,!<br />
Entwerfen!<br />
+!<br />
Projektmanagement!<br />
<strong>Verifizieren</strong>!<br />
(im Windkanal)!<br />
Entwurf!<br />
Skizzen des!<br />
Tragflächenprofils!<br />
Realisieren!<br />
Produkt!<br />
Modell aus Verbund-!<br />
werksto"en!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 9!
Lernen von den Ingenieurwissenschaften!<br />
Vorgehensweise bei der Entwicklung von Programmen!<br />
Spezifikation!<br />
Kundenanforderungen!<br />
!<br />
<strong>Modellieren</strong>,!<br />
Entwerfen!<br />
+!<br />
Projektmanagement!<br />
Testen!<br />
Entwurf!<br />
z. B. UML Modelle!<br />
<strong>Programmieren</strong>!<br />
Programm!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 10!
Zur Unified Modeling Language (UML)!<br />
<strong>Modellieren</strong> von Struktur!<br />
• Z. B. Klassendiagramme!<br />
• Hier am Beispiel Hotel!<br />
<strong>Modellieren</strong> von Verhalten!<br />
• Z. B. Zustandsdiagramme!<br />
• Hier am Beispiel Hotelzimmer!<br />
[Quelle d. Abb.: Informatik Forum Simon, 2012]!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 11!
Lernen von den Ingenieurwissenschaften!<br />
Vorgehensweise bei der Entwicklung von Programmen!<br />
Spezifikation!<br />
Kundenanforderungen!<br />
!<br />
<strong>Modellieren</strong>,!<br />
Entwerfen!<br />
+!<br />
Projektmanagement!<br />
Testen!<br />
Entwurf!<br />
z. B. UML Modelle!<br />
<strong>Programmieren</strong>!<br />
Programm!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 12!
Zur Programmierung!<br />
Unterstützung „großer“ Software!<br />
• Modularität (1980er-Jahre)!<br />
– Programm als Kollektion von<br />
Modulen!<br />
– Unterstützung des Konzepts<br />
durch Programmiersprache<br />
und Compiler!<br />
• Schnittstellen (Interfaces)!<br />
– Definition zusammengehöriger<br />
Routinen sowie deren Parameter,<br />
einschließlich Datentypen!<br />
– Flexibel umgesetzt auch in der<br />
Objektorientierung (Klassen-/<br />
Interface-Konzept)!<br />
Beispiel einer Schnittstelle!<br />
Informationsverzeichnis, z. B. Telefonbuch!<br />
deferred class DICTIONARY [ELEMENT]<br />
feature!<br />
put (x: ELEMENT; key: STRING)!<br />
-- Füge x von Datentyp ELEMENT mit!<br />
-- Schlüssel key von Datentyp STRING!<br />
-- (Zeichenkette) ein!<br />
lookup (key: STRING): ELEMENT!<br />
-- Schlage Element mit Schlüssel key nach!<br />
delete (key: STRING)!<br />
-- Lösche Element mit Schlüssel key!<br />
end -- DICTIONARY!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 13!
Lernen von den Ingenieurwissenschaften!<br />
Vorgehensweise bei der Entwicklung von Programmen!<br />
Spezifikation!<br />
Kundenanforderungen!<br />
!<br />
<strong>Modellieren</strong>,!<br />
Entwerfen!<br />
+!<br />
Projektmanagement!<br />
Testen!<br />
Entwurf!<br />
z. B. UML Modelle!<br />
<strong>Programmieren</strong>!<br />
Programm!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 14!
Die 2. Softwarekrise!<br />
• Computer, Software & Programmierung (seit 50er-Jahre)!<br />
– Höhere Programmiersprachen und Compiler!<br />
• Die 1. Softwarekrise – Quantitative Komplexität (60er–80er-Jahre)!<br />
– Softwaretechnik (Software Engineering)!<br />
– Vorgehen und Management aus den Ingenieurswissenschaften!<br />
• Die 2. Softwarekrise – Qualitative Komplexität (seit 90er-Jahre)!<br />
– Das Internetzeitalter, mit neuen Programmiersprachen wie Java und Python!<br />
– Vernetzung und Parallelität!<br />
– Verteilte Systeme, Mehrkernprozessoren!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 15!
Beispiel: Der Clayton Eisenbahntunnel!<br />
• Tunnel auf der Eisenbahnstrecke Brighton-London!<br />
– Zweigleisig, ein Gleis pro Fahrtrichtung!<br />
• Im 19. Jh. Signale und Tunnelwärter auf Süd- und Nordseite!<br />
– Automatisches Signalsetzen durch einfahrenden Zug!<br />
– Zurücksetzen durch Tunnelwärter!<br />
– Telegraphen zur Kommunikation der Tunnelwärter!<br />
• „Zug im Tunnel“ / „Tunnel ist frei“ / „Hat Zug den Tunnel verlassen?“!<br />
– Automatische Erkennung von Signalfehlern!<br />
• Benachrichtung des Tunnelwärters durch Glocke !<br />
• Flagge „Stop“ bzw. „Freie Fahrt“ zum manuellen Signalisieren!<br />
[G. Holzmann. Design and Validation of Computer Protocols. Prentice Hall, 1990]!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 16!
Der 25. August 1861!<br />
• Drei Züge verlassen Brighton in wenigen Minuten Abstand!<br />
– Die folgenden Ereignisse ergeben sich ...!<br />
– ... und nun?!<br />
• Folgenschwerer Unfall!<br />
– Der zweite Zug setzte rückwärts aus dem Tunnel als der dritte au#uhr!!<br />
– Unglückliche Sequenz von Umständen und Entscheidungen!<br />
• Was bedeutet dies für vernetzte, parallele Systeme?!<br />
– Ihr durch Verzahnung entstehendes Verhalten ist nicht vorausschaubar!<br />
– Systemfehler sind in der Regel nicht wiederholbar/reproduzierbar!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 17!
Lernen von den Ingenieurwissenschaften!<br />
Verwendung von Mathematik für Modellierung und Analyse!<br />
Reales Problem!<br />
Reale Resultate!<br />
Luftstrom an Tragfläche!<br />
Lösen,!<br />
sehr komplex!<br />
Verbesserte Tragfläche!<br />
!<br />
Abstrahieren,!<br />
<strong>Modellieren</strong>!<br />
Numerische!<br />
Strömungsmechanik!<br />
Konkretisieren,!<br />
Transformieren!<br />
Mathem. Modell!<br />
Mathem. Ergebnisse!<br />
Di"erentialgleichungen!<br />
Berechnen!<br />
Numerische Lösung!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 18!
Lernen von den Ingenieurwissenschaften!<br />
Verwendung von Mathematik für Modellierung und Analyse!<br />
Reales Problem!<br />
Reale Resultate!<br />
Eigenschaft + Programm!<br />
Lösen,!<br />
sehr komplex!<br />
Verbessertes Programm!<br />
!<br />
Abstrahieren,!<br />
<strong>Modellieren</strong>!<br />
Modellprüfung!<br />
(Model Checking)!<br />
Konkretisieren,!<br />
Transformieren!<br />
Mathem. Modell!<br />
Mathem. Ergebnisse!<br />
Logische Formel + Automat!<br />
Berechnen!<br />
Erfüllt Automat die Formel?!<br />
Warum bzw. warum nicht?!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 19!
Beispiel: Protokollverifikation!<br />
Textuelle Modellierung eines Datentransferprotokolls als Automat!<br />
mtype = {ini, ack, dreq, data, shutup, quiet, dead}; /* message type */!<br />
chan W = [1] of {mtype}; chan M = [1] of {mtype}; /* message channels, capacity 1 */!<br />
active proctype Mproc() /* 1 st process */ !active proctype Wproc() /* 2 nd process */!<br />
{ W!ini; M?ack; ! /* connect */ !{ W?ini; ! ! /* wait for ini !*/!<br />
!timeout -> ! ! /* wait ! */ ! M!ack; ! ! /* acknowledge !*/!<br />
! ! !if ! ! /* 2 options: */ ! do ! ! /* 3-options loop: !*/!<br />
! ! !:: W!shutup ! /* start shutdown */ ! :: W?dreq -> ! /* data requested */!<br />
! ! !:: W!dreq; ! /* or request data */ ! ! M!data ! /* send data !*/!<br />
! ! ! M?data -> do ! /* loop */ :: W?data -> ! /* receive data !*/!<br />
! ! ! :: W!data ! /* send data */ ! ! M!data ! /* send data !*/!<br />
! ! ! :: W!shutup; ! /* or shutdown */ ! :: W?shutup -> ! /* shutdown rqst !*/!<br />
break! /* exit loop */ ! !M!shutup; ! /* start shutdown !*/!<br />
! ! ! od ! ! ! ! !break ! /* exit loop !*/!<br />
! ! !fi; ! ! ! ! od;!<br />
!M?shutup; W!quiet; M?dead } /* shtdn */ ! W?quiet; M!dead } ! /* shtdwn hndshk !*/!<br />
!<br />
[G. Holzmann. Design and Validation of Computer Protocols. Prentice Hall, 1990]!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 20!
SPIN findet Verklemmung im Protokoll!<br />
!<br />
SPIN Model Checker!<br />
(invalid end state = Verklemmung)!<br />
[spinroot.com]!<br />
[G. Holzmann, JPL]!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 21!
Verifikation sequentieller Programme!<br />
Historie der Programmverifikation!<br />
• Vision bereits von A. Turing (1949)!<br />
– „Checking a Large Routine“!<br />
– Lokale Zusicherungen für<br />
Korrektheitsbeweise!<br />
• Formalisierung durch R. Floyd (1967)<br />
und C. A. R. Hoare (1969)!<br />
– Vor-/Nachbedingungen<br />
von Routinen!<br />
– (Schleifen-)Invarianten!<br />
• Praktische Umsetzung z. B. durch!<br />
– B. Meyer (Design-by-Contract,<br />
Ei#el, 1986)!<br />
– Microsoft (Code Contracts,<br />
Visual Studio, 2008)!<br />
Kontrakte in Ei#el-Interfaces!<br />
class interface DICTIONARY [ELEMENT]<br />
feature!<br />
put (x: ELEMENT; key: STRING) is!<br />
invariant<br />
require -- Vorbedingungen!<br />
count < capacity!<br />
not key.empty!<br />
ensure -- Nachbedingungen!<br />
has (x)!<br />
item (key) = x!<br />
count = old count + 1!<br />
! !0
Fortlauf der Softwareentwicklung!<br />
• Computer, Software & Programmierung (seit 50er-Jahre)!<br />
– Höhere Programmiersprachen und Compiler!<br />
• Die 1. Softwarekrise – Quantitative Komplexität (60er–80er-Jahre)!<br />
– Softwaretechnik (Software Engineering)!<br />
– Vorgehen und Management aus den Ingenieurswissenschaften!<br />
• Die 2. Softwarekrise – Qualitative Komplexität (seit 90er-Jahre)!<br />
– Vernetzung und Parallelität!<br />
– Mathematische Analyse aus den Ingenieurswissenschaften!<br />
– Formale Methoden!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 23!
Stand der Dinge!<br />
• Was haben formale Methoden bislang u. a. geleistet?!<br />
– Entdeckung von Fehlern!<br />
• Authentifizierungsalgorithmus von Needham-Schroeder [Lowe]!<br />
• IEEE Protokoll für Geräte im Gesundheitswesen [Keiren et al.]!<br />
– Formale Methoden finden in der Industrie zunehmend Anwendung!<br />
• Chipindustrie, Automobilbranche, Luft-/Raumfahrt, Telekommunikation!<br />
• Welche Herausforderungen sind u. a. noch zu meistern?!<br />
– Modularisierung der formalen Methoden und nicht nur der Programme!<br />
• Heutige Programme sind zu groß, um sie monolithisch zu analysieren!<br />
– Heuristiken zur Unterstützung von Verifikationsalgorithmen!<br />
• Welcher Algorithmus ist im Einzelfall am erfolgsverprechendsten?!<br />
• Wie sollten die Parameter von Verifikationswerkzeugen justiert werden?!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 24!
Vorstellung von zwei aktuellen<br />
Forschungsprojekten am <strong>Lehrstuhl</strong>!<br />
An den Nahtstellen von!<br />
<strong>Modellieren</strong>, <strong>Programmieren</strong> und <strong>Verifizieren</strong>!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 25!
Interfacetheorien!<br />
• Interfacetheorien erweitern Interfaces für parallele Systeme!<br />
– Zusätzlich Beschreibung eines Kommunikationsprotokolls<br />
reaktives Interface!<br />
– Kommunikationsanforderungen und -garantien an Umgebung!<br />
• Fragestellungen<br />
[Kooperation mit U. Augsburg, Prof. W. Vogler]!<br />
– Wann erfüllt eine Komponente ein Interface?!<br />
– Wann verfeinert ein Interface ein anderes?!<br />
– Wie können Erfüllung und Verfeinerung automatisch<br />
überprüft werden? Wie aufwendig ist dies?!<br />
• Besonderheit!<br />
– Erfüllung/Verfeinerung eines reaktiven Interfaces muss auch potentielle<br />
Verklemmungen und Inkompatibilitäten berücksichtigen!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 26!
• Interface als Modell!<br />
Reichhaltige Interfaces!<br />
Spezifikation!<br />
<strong>Modellieren</strong>!<br />
<strong>Verifizieren</strong>!<br />
Interface!<br />
<strong>Programmieren</strong>!<br />
Programm!<br />
! Interface verbindet Spezifikation und Programm!<br />
• Interfacetheorien sollten mächtig und heterogen sein!<br />
– Logische Konstrukte der Spezifikation (z. B. Konjunktion, Disjunktion)!<br />
– Operationelle Konstrukte des Programms (z. B. Paralleloperatoren)!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 27!
Heapanalyse zur korrekten Speicherverwaltung!<br />
• Heapanalyse<br />
– Korrekte Speicherverwaltung bei der Programmierung<br />
dynamischer Datenstrukturen, beispielsweise Listen!<br />
– Interesse gilt u. a. der Identifikation von Datenstrukturen<br />
eines gegebenen Programms!<br />
• Anwendungen!<br />
[Kooperation mit Dr. David White]!<br />
– In der Programmverifikation, als Heuristik für Verifikationsalgorithmen!<br />
– In der Analyse von Altsystemen, zum Erkennen komplexer Datenstrukturen!<br />
• Schwierigkeit!<br />
– Viele interessante Datenstrukturen lassen sich durch eine rein strukturelle,<br />
statische Analyse nicht voneinander unterscheiden!<br />
– Beispiel: Eine Liste kann sich verschieden verhalten, z. B. als!<br />
• Stack – Elemente werden vorne eingefügt und wieder vorne herausgenommen!<br />
• Queue – Elemente werden vorne eingefügt aber hinten herausgenommen!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 28!
Identifikation dynamischer Datenstrukturen!<br />
• Ansatz zur Programmanalyse!<br />
C-Programm!<br />
Ausführung +!<br />
Abstraktion!<br />
Feature Trace!<br />
Sehr komplex!<br />
Maschinelles<br />
Lernen!<br />
Identifikation v.!<br />
Datenstrukturen!<br />
Mustererkennung!<br />
Identifikation v.!<br />
wdh. Mustern!<br />
• Fragestellungen!<br />
– Wie kann der Ansatz von simplen, listenähnlichen auf generelle,<br />
geschachtelte Datenstrukturen erweitert werden?!<br />
– Wie kann der Ansatz auf Maschinencode übertragen werden?!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 29!
Zum Abschluss!<br />
• <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> gehören zusammen!<br />
– „Das Ganze ist mehr als die Summe seiner Teile“ [Aristoteles]!<br />
• Die Informatik ist auch in den Ingenieurwissenschaften und<br />
der Mathematik verwurzelt!<br />
– „Es gibt nichts Praktischeres als eine gute Theorie“ [K. Lewin]!<br />
• Was Sie von heute Abend behalten sollten!<br />
– Gerald Lüttgen hilft dabei, Software zuverlässiger zu machen!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 30!
Vielen Dank für Ihre Aufmerksamkeit!<br />
„Das Bu"et ist erö"net“!<br />
© 2013 Gerald Lüttgen! Antrittsvorlesung – <strong>Modellieren</strong>, <strong>Programmieren</strong>, <strong>Verifizieren</strong> – 31!