06.11.2013 Aufrufe

Modellieren, Programmieren, Verifizieren - Lehrstuhl ...

Modellieren, Programmieren, Verifizieren - Lehrstuhl ...

Modellieren, Programmieren, Verifizieren - Lehrstuhl ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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!

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!