Im letzten Abschnitt wollen wir das nun anwenden auf den abstrakten Datentyp.
Das ist die Frage 4 in unserem Wiederholungsfragen. Damit,
wir hatten schon gerade gesagt, man kann das ganz gut verwenden,
man verwendet es tatsächlich auch für christlicherheitskritische Bereiche.
Und jetzt wollen wir das machen für diesen abstrakten Daten,
der tatsächlich mit Objekten was zu tun hat.
Abstrakte Datentypen ist etwas,
was die theoretische Basis oder wenn sie so wollen,
ein Teil der Definition von Objekten beschreibt,
in der traditionellen emperativen Programmierung wurden Daten und Operationen getrennt behandelt.
Die Daten gab es den Datentyp.
Für die Operationen gab es das, was sie tun.
Und für die Semantik war wirklich nicht eine Definition da.
Man hat ein Typkonzepte gebraucht, nämlich um den Datentyp zu deklarieren.
Und das beschreibt dann den Wertebereich und die Darstellung dieser Variablen,
dieser Daten. Und der nächste Schritt war,
dass man Daten und die Operationen gemeinsam definiert.
Und damit hat man, das hat man
als abstrakte Datentypen-Abstract-Data-Teil bezeichnet
Und wir verwenden das, indem wir daraus das als Basis
nehmen, Objekte zu kapseln. Ja, wir kapseln,
die Daten, und die sind dabei wird,
das wird gekapselt, zusammen mit ihren Zugriffsoperationen,
das sind dann die Funktionen, die darauf definiert sind.
Und wir haben dabei auch noch die Bedingungen. Und jetzt
kommt die Sache ins Rollen, die Semantik zu beschreiben,
nämlich die Bedingungen, die bei diesen Operationen gelten.
So, wer abstrakt sind, die unter anderem deswegen,
weil sie nicht genau sagen, wie denn die Verarbeitung wie die Verwirklichung passiert.
Sie erinnern sich, Implementation heißt nicht etwakudieren, Implementation heißt Verwirklichung.
Ja, also die Art der Art der Verwirklichung
bleibt verborgen und damit könnten wir das auch in Java,
in Cishape oder in einer ganz anderen Programmiersprache implementieren.
Also ist diese abstrakter Datentyp, der ist so eine Art Spezifikation. Ja,
und damit auch ein Stück weit unabhängig von der Programmiersprache und auch liefert Informationen,
die wir für eine formale Prüfung und vielleicht auch für die Codegenerierung brauchen können.
Ja, so Was haben wir dabei schon behandelt?
Wir haben schon gesagt, die Dienstleistung einer Klasse,
nämlich die Operationen können mit die Schnittstelle zugegriffen werden.
Die Felder, die Exemplarvariablen, die sind gekapselt, also sind private.
Und ich kann die Implementation austauschen, hoffentlich,
weil wir keine Nebeneffekte haben, weil diese klar definiert sind.
So, nochmal zur Definition, ja, das hatte ich
eigentlich schon gesagt. Der Datentyp beschreibt,
den Wertebereich und die Operationen gehören da dazu,
wenn wir einen abstrakten Datentyp bilden wollen
Und die Operationen könnte man formal definieren mit einer El Gibra,
also alkoholfreiischen Spezifikation und da besteht sie der abstrakter Datentyp typischerweise
aus der Definition der Typen. Eine Definition der Funktionen,
jetzt kommt diese Aktione, sie erinnern sich aksymatische Spezifikationen,
hatten wir gerade und die Vorbedingungen, die dazu gelten.
So, wir schauen uns das am Beispiel an.
So abstrakt klingt, das ist das immer sehr einfach und
wir haben jetzt erstmal natürliche Zahlen als Beispiel genommen.
Ja, also wir können das Sache als einen Namen geben,
natürliche Zahlen, ja und wir wollen definieren,
was gilt denn da eigentlich
Alles. Ja, zunehmend, zunächst, dass wir sagen,
okay, natürliche Zahlen sind irgendwie natürliche Zahlen.
Damit haben wir nicht viel wirklich geholfen,
dass man mit Beziehungs irgendwo das irgendwo anders gesagt sein muss.
Was ist denn natt? Ja, so,
dann haben wir Funktionen, die erstmal sagen,
die erste natürliche Zahl ist erstmal die Null.
Ja, die Null ist eine natürliche Zahl und dann gibt
es die Funktion Nachfolger. Das ist, bildet ab,
die Menge der höhnlichen Zahlen auf die Menge der natürlichen Zahlen.
Wenn Sie sagen, ja, hilft mir das irgendwie?
Wir werden sehen
So, und dann gibt es noch die Adire-Funktion. Ja,
da kann ich aus natürlichen Zahlen und nochmal natürlichen Zahlen weder natürliche Zahlen bilden.
Ja, Kreuzprodukt heißt dieses Symbol, die Menge ist also relativ groß.
Ich kann da ganz viele mögliche Funktionen damit beschreiben. So,
und jetzt Axiome, das sind Gleichungen, das sind Regeln.
Das sind Gesetze, die wir hier mit den Signaturen bilden.
Und damit machen wir erst den Sinn,
weil wir jede Seite dem Nachfolger irgendwas Natürliches, tja,
das kann sein.
Jetzt schauen wir uns das
mal gerade für die Addition an
Ja, zum Beispiel gibt es hier, wenn ich etwa
eine Zahl eh mit der Null addiere, kommt wieder eh raus.
Ja, dann haben wir hier eine weitere,
ein weiteres Aktion für die Vertauschbarkeit der Reihenfolge von addieren und der Funktion Nachfolger.
Ja, wenn wir eh mit dem Nachfolger von J agieren,
ist es das Gleiche wie die Addition von Eun J,
mit dem Nachfolger. Das sagt schon ein bisschen mehr,
als wenn nur hier diese Additionsfunktion haben.
Sie sagt nämlich wirklich, was kommt denn bei 3 plus 4
raus? Ja, da brauchen wir noch weitere Aktionen
Aber das ist erstmal schon eine Basis. Und vielleicht
würde es sogar schon reichen mit der 3 bis 4,
weil die wissen ja, das geht von der Müll aus,
es gibt so und so viele Reihenfolgen, so wie viele Nachforderungen.
Ja, wir müssen noch die Funktion für den Nachfolger hier definieren,
dass die Nachfolger, die im eins erhöhten Wert ist,
das fehlt hier auf jeden Fall.
Ja, und die Gebrauch, die Algebra,
beschreiben wir, die Wertemenge und die Operationen damals.
Soweit erstmal ein Gesang, super,
so viel für natürliche Zahlen weiß ich doch alles.
Ja,
der Computer versteht es nicht
Wir brauchen es für eine merschinelle Prüfung, das ist nicht maschinell zugänglich haben.
Und wenn wir dann hier diese einfachen Bedingungen haben und diese einfachen Beschreibungsfunktionen,
um diese einfachen Beschreibungen für Aktionen und damit kann ein Computer
ein Prüfwerkzeug etwas tun, dann haben wir viel gewonnen,
denn das Werkzeug wird für sich keine Fehler machen.
Etwas komplizierter, aber immer noch ganz einfach, der Stack.
Stack ist ein Stapel, ja, wir kennen den Stapel von Sachen,
wo man etwas aufeinander packt und das letzte nehme ich runter.
Damit hat man typischerweise, wenn man Multitasking macht,
ich werde also bei irgendwelchen Sachen unterbrochen, zum Beispiel Tour,
gerade etwas hat meinen Schreibtisch voll und da kommt jemand,
der mir eine Reisung geben darf, für dessen Weisung ich befolge,
ein Lehrer, die Eltern, der Chef und sagen,
es gab was ganz Wichtiges, bitte liegt das mal zur Seite,
was du machst und mach jetzt mal dieses, wof.
Ja, und das packt ja obendrauf und dann mache ich das. Ja,
und dann keine 20 Minuten später kommt ein noch höherer Chef oder der gleiche Chef mit einer noch höheren,
noch wichtigeren Sache und sagt, oh,
hier ist noch was Wichtigeres, mach erstmal das,
unterbrich mal, wup obendrauf, ja,
und ich mache das Oberste,
arbeite das ab,
wenn es weg ist,
dann arbeite ich
das Nächste und wenn es weg ist das
Ja, also das,
was ich zuerst im Stapel hatte, kommt zunetzt heraus.
Und das, was zuletzt hereinkam, kam zuerst heraus.
Ich erzähle ihm. Es langweile sie wahrscheinlich, weil sie das jetzt kennen.
Gut. Also wir haben erstmal diesen Stapel, der hat Elemente.
Ich habe in meinem Arbeitspaket, was im Stapel etwas neue Arbeitsaufgaben.
Man kann das nehmen für ganz einfache Sachen wie Integer.
Man kann es auch nehmen für etwas Komplizierteres wie irgendwie
ein Kundenobjekt oder eben einer Tätigkeit.
Also der Stack bezieht sich auf einen Typ,
auf irgendetwas
So, es gibt noch Buyen, den benutzen wir wieder.
So, und dann gibt es die Funktion MT.
Da ist das Steck leer. Hier steht noch nicht gesagt,
was da die Bedingungen dafür sind. Die kommen hier unten. Ja,
aber Hebel hat erstmal gesagt, was für eine Signatur sozusagen ergibt,
die man, wie mit Typenarbeit, die bei Push,
habe ich den Stack.
Ein Element aus dieser Element-Typ-Menge und es kommt wieder eins,
es ergibt uns wieder eins Deck sein.
Beim Pop habe ich den Stack, ja,
und da kommt wieder ein Stack raus,
der aber nicht das gleiche ist.
Das Top-Element
Zugriff auf das Stop-Element, auf das oberste Element,
das kann ich beim Stack machen, auf das oberste kann
ich nebenbei Marken nicht zugreifen, nur auf das oberste.
Und da kriege ich, ich nehme mit dem Stack
und bekomme ein Element und die Funktion ist empty.
Da nehme ich den Stack und bekomme eine wahr falsche Aussage.
Embolie. Ja, und jetzt gibt es die Operationen,
zum Beispiel das Top-Element angewendet auf das mit dem Push-Up,
mit der Push-Operation zusammen.
Also ich liefer, ich bekomme jetzt andersrum gesagt, hier,
das als letztes Push-Spiel eingepackte Element bekomme ich als top.
Ja, das sagt etwas, was Push tut in was
top top tut
Tut. So, jetzt das Gleiche mit dem Herunternehmen.
Papa ist das Herunternehmen, ja, also das,
was ich zuletzt draufgepackt habe, kommt zuerst wieder herunter.
Das ist hier zum Beispiel dieses Last-In-First-Out-Regel, die wir hier so beschrieben.
Da hat das mich zuletzt im Mengen getan und mit Push
kommt zuerst mit Pop heraus. Dann gibt es etwas zur MT-Regel,
ja, das ist MT, gibt Tod,
wenn ich gerade die MP-Regel angewendet habe,
wenn ich jetzt gerade einen näheren Stick erzeugt habe,
ja,
und wenn ich etwas hineingepackt habe,
dann gibt diese Regel falsch
So, dann gibt es hier noch die Ansagen für Vorbedingungen.
Achso, was mir hier vielleicht jetzt nebenan steht, ja,
sie können lesen, die Implementation ist hier nicht dabei.
Ich werde sage nicht, wie mache ich denn dieses Push
und wie mache ich denn das Pulver? Das ist,
was bleibt versteckt und damit unabhängig von der Implementierung geschrieben.
So, und jetzt haben wir noch Vorbedingungen, ja,
ich darf nichts runternehmen, wenn es leer ist.
Und wenn die Top-Operation geht auch nicht,
wenn etwas leer ist, da ist nämlich nichts obendrauf.
So, das sind so Einschränkungen.
Ein kleines bisschen komplizierter, aber immer noch ganz einfach.
Bei der Liste wird es schon ein bisschen komplizierter. Sie wissen,
wisst ihr, das ist immer ein Element,
ich bin eine Zeit auf das Nächste,
wie dann den Zeiger auf den nächsten,
wieder mit dem Zeiger auf den nächsten und das Ganze am Schluss.
Hier sind die gleichen Teile. Wir beschenken uns jetzt mal
drauf, die gleichen Teile darzustellen. Ja,
also es gibt die Menge der Typen,
das ist im Wesentlichen die Liste mit diesem Element-Typ,
den wir da reinpacken, was auch immer das ist.
Ob das jetzt Leute in der Schlange sind oder Arbeitsaufgaben oder einfach nur Elemente,
die Einträge in meinem Kalender sind oder in einem Telefonbuch
oder was auch immer
Wir brauchen Bullyen als Typ, den wir irgendwie benutzen wollen.
Den definieren wir nicht, den importieren wir.
Und dann gibt es Funktionen, etwas leer zu machen.
Das erste Element, den West einer Liste,
etwas dranhängen, zwei Listen verbinden und die Aussage,
ob etwas leer ist, der billigste leer ist.
Ja, und da gibt es Exhumen dafür.
Das erste Element First liefert ein Element, ja,
und zwar das, was wir zuerst angehängt haben.
Der Rest liefert den Rest der Liste
So, dann gibt es das Empty nochmal,
das sah so ähnlich aus schon,
wenn etwas leer ist, dann liefert es Empty leer.
Und dann wäre es endlich, wenn wir das leeres hatten
und haben was dran gehängt, dann ist es nicht mehr leer.
Wenn wir zwei Listen miteinander verbinden,
dann hören wir die gleiche Operation und das eine ist,
was angehängt ist, dann können wir das umgekehrt machen.
Wir haben zwei Listen, verbinden die und hängen damals an.
Kommt das Gleiche raus. Das ist also so eine Art
Vertauschbarkeit von Reihenfolge und wir haben Vorbedingungen.
Wir können auf das erste Element nur zugreifen,
wenn das nicht leer ist und den Rest können wir auch nur zugreifen,
wenn es nicht leer ist.
Wenn nichts drin ist, gibt es keinen Anfang und kein
Ende ist nichts drin
Soweit. Was ich Ihnen hier zeigen möchte, ist letztlich
bei diesen beiden Sachen, ja, das sind einfache Operationen.
Trotzdem ist es schon relativ kompliziert, das zu formulieren,
wenn man in diese Ausdrucksweise erstmal eingestiegen ist, ist es nicht mehr so schwer.
Trotzdem wird es schwierig sein für jemanden,
für einen Fachmann, angenommen,
wir machen das jetzt hier für das Art und Weise,
wie ich mit einer Buchung in einem Konto umgehe und will das ihm mit dem Bankmitarbeiter klären.
Ja, dann wird es schon für ihn relativ schwierig zu sagen,
ist denn das jetzt hier komplett korrekt formuliert?
Wo ist denn das und das? Ja,
also Prüfen ist die Spezifikation denn korrekt formuliert,
dürfte schon ein bisschen schwieriger sein
Okay, wir machen mal weiter. Hier gibt es das
Gleiche nochmal als Schlange. Wir hören dann auch auf.
Also ich gehe jetzt nicht durch alle möglichen Strukturen durch,
eine Schlange, es ist eine Cue, das ist das Gegenteil von einem Stack.
Ja, bei der Schlange, Sie wissen schon, beim Bäcker,
ja, also der zuletzt kommt, kriegt auch zuletzt,
in der er zuerst kam, der kriegt auch zuerst.
Also First in, First out, über umgekehrt gegenüber dem Stack Last in First out.
Hier gibt es auch etwas an die Cue dranhängen,
von der Cue abnehmen, was ist vorne und die Q ist leer,
die ganzen Regeln, wir schauen uns einfach nur ein paar davon an,
zum Beispiel, wenn ich eine leere,
eine leere Schlange habe, eine leere View habe, dann,
und ich hänge da was dran und nehme es wieder ab,
ist sie wieder leer.
Soweit, so einfach,
aber mit diesen einfachen Regeln gelingt es uns, das Verhalten,
eine Schlange zu beschreiben, ohne dass wir wirklich beschreiben,
was passiert da im Detail, wie ist die Links,
wie sind die Links zwischen den Elementen realisiert,
wie ist das gespeichert, wie führen wir das aus.
Das ist alles unabhängig, wir beschreiben mir das so,
wie es tut. So, wenn wir etwas,
die Reihenfolge tauschen zwischen dranhängen und abhängen, dann ist das auch vertauschbar.
Das Frontelement ist das, was wir zuerst reingepackt haben.
Also wenn wir ein leeres Element haben und haben dann X reingepackt,
dann ist dieses X auch das Frontelement.
Das sagt diese Zeile. Oder wenn wir eine Liste haben,
die Kuh ist, also die Liste Kuh,
dann und wir packen da ein X dran,
dann bleibt trotzdem das Kuh vorne dran.
So, das Gleiche für Endy, was wir schon ein paar Mal hatten.
Und wenn wir ein Endy in der Lehrerliste haben und packen
da was dran,
dann ist die
nicht melde
So, die Vorbedingungen sind auch relativ wenige hier,
wenn ein Freundelement haben will,
nur wenn es ziemlich näher ist und etwas wegnehmen von der Schlange,
können wir auch nur, wenn es sie nicht leer ist.
Es gibt hier keine Bedingungen, weil die Schlange voll ist.
Die abstrakte Schlange hat so eine Endheit und endlich viele Plätze,
genauso wie der abstrakte Stack, unendlich viele Plätze hat.
Und so sind auch meistens die Implementierungen,
das geht nur nicht mehr weiter, wenn der Speicherplatz reicht.
Und wenn sie da einfach noch einen Speicherriegel in den Computer reinstecken,
dann können sie eben ein ganzes Terabyte voll belegen mit ihrem Stack,
wenn sie wollen.
Oder mit ihrer Schlange
Soweit das, wir haben dazu als Aufgabe nur etwas für eine eigene Formulierung.
Mir kommt jetzt, glaube ich, noch die Menge,
ja, die Menge ist ja dadurch gekennzeichnet,
interaktiv in der richtigen Vorlesung, wenn ich Sie jetzt fragen,
was denn eine Menge im Unterschied zu einer Liste ist.
Hier verrate ich es Ihnen bei einer Menge, oder ich denke,
die meisten von Ihnen wissen das, nennen sich 0,9 Prozent wissen,
dass bei einer Menge habe ich Elemente nur einmal drin.
Und wenn ich etwas, was ich drin habe, nochmal reinpacke,
wird es nicht anders. Es ist entweder enthalten oder nicht enthalten,
ja, also hier gibt es in Third,
die Weed, etwas löschen, zwischen zwei Mengen,
die Teilung zwischen zwei Mengen, die Differenzmenge und die Aussage,
ob etwas enthalten ist und ob die Mengen leer.
Als das sind die Funktionen, die ich mit
so einer Linke mache, eine Menge machen kann.
Die gibt es wieder für irgendwelche Elementarelemente, die da drin sind.
Also Tee heißen die hier wieder bei uns. Und wenn die Lehrerelementmenge gibt,
sie in wir fragen, wie ob sie das Element X enthält,
dann gibt es falsch, wenn wir etwas löschen,
ja, aus der Differenzmenge, dann Was ist jetzt hier?
Ach genau, das Löschen ist so wie die Differenzlänge entfernen.
Und das Einfügen ist, wie die Vereinigung von zwei Sachen.
Und das Vereinigten einer Lehrmenge mit einem Element ist dann diese Menge mit dem Element.
So, Vorbedingungen sehen Sie hier. Jetzt mittlerweile sollten Sie
schon genug Übungen haben, das zu verstehen.
Löschen geht nicht, wenn uns leer ist. Wenn wir zwei,
wenn wir die Schnittmenge bilden zwischen einer Lehrmenge und dem S,
Mehrmenge und etwas anderem, dann ist die Schnittmenge immer die leere Menge.
Die Differenzmenge ist immer die leere Menge. Und wenn wir
etwas einfügen und in leere Mengen ist sie nicht mehr leer und
wenn wir eine leere Menge prüfen, ob sie leer ist,
dann ist das so.
Manche Sachen, von denen mag ich vorkommen, wie selbstverständlich.
Trotzdem sind es wichtige Aussagen, weil da das Prinzip drin steckt.
So, wir haben jetzt hier noch den Baum. Ja,
der Baum ist letztlich, dadurch auch so eine elementare Datenstruktur,
die man ganz häufig braucht, wo man immer Verzweigungen hat.
Das heißt, es gibt immer zwei Nachfolgeelemente im Gegensatz zur
Liste, wo es nur eine gibt
Ja, und das ist der nähere Baum, weil ja
immer zwei Elemente enthält es gibt. Auch noch andere.
Aber der nähere Baum sind zwei Elemente und da spielt wichtig
die Rolle bei Satirverfahren, da schnell im Zugriffsverfahren und sowas.
Und da gibt es dann Lilbe und Rechte Elemente.
Ja, soweit dazu. Und wir gehen mal,
bevor wir hier zur Diskussion schreiten, nochmal zu den Fragen.
Da haben wir, sie sollen doch mal selbst sowas angeben.
Diese Frage wären wir so ganz wirklich nicht in der Klausur finden,
sondern da werden sie schon die Aufgabe bekommen, dass für irgendetwas Konkretes zu machen.
Aber versuchen Sie diese Aufgabe mal zu lösen,
indem Sie für etwas, was Sie selbst nehmen,
versuchen, diese Teile, nämlich die Typdefinition,
da geh noch mal zurück hier, also die Typdefinition,
die Funktionen, die Aktionen, die Vorbedingungen, zu erklären,
so löst sich diese Aufgabe.
Und Sie erklären das für den Kunden zum Beispiel,
Sie sagen, der Kunde besteht aus Nama, Adresse,
Alter, und vielleicht noch ein Kennzeichen für die Politik.
Und wenn Sie definieren, Bonität ist ja, nein,
dann ist sie eben Bouli.
Das ist der Typ und dann geben Sie fest,
was für Operationen haben Sie denn mit dem Kunden?
Ja, ich zahle dem was oder ich stufe denen
in den
Exklusivklasse von Kunden ein oder was auch immer.
Sie legen das fest und sie legen auch fest,
was für Regeln dafür gelte. Oder für den Wochentag,
zum Beispiel gleich der Mittentag, hat er Nachfolger.
Und nach dem Sonntag, ja, da kommt wieder der Montag.
So geht's. Oder das Konto. Sie dürfen das Kunde
überziehen und sie dürfen das Kunde nicht immer ziehen.
Versuchen Sie mal dafür, regeln Sie definitiv. Damit lernen Sie,
versuchen Sie das auch so auszudrücken und damit üben Sie das ein bisschen.
Denn dass nur diese Folien angucken, hilft Ihnen nicht wirklich.
Gut. Wir kommen so langsam zum Schluss dieses Abschnittes.
Wir haben gesagt, diese Abstrakte, diese Funktion,
diese Beschreibung, diese Spezifikation, Spezifikation to Specify,
etwas genau zu schreiben, ist nicht an der Implementierung orientiert.
Und deswegen auch nicht an Objekten orientiert, sondern sie ist an Operationen orientiert.
Deswegen können wir das implementationsunabhängig machen und deswegen ist es auch
möglich, zwei Sachen miteinander zu vergleichen.
Und es ist möglich zu prüfen, auf etwas korrekter arbeitet.
So, hier ist mal als Beispiel,
wir hörten die Objekte und wir können das so sagen,
okay, der Stack, der kriegt die Operation pushen,
die müssen wir halt auf
Ja, während hier gesagt wird, ja,
nicht die Operation, rufen wir auf, genau,
die sollen wir sagen, was passiert denn da?
In der Zeit, in dem Fall. Nicht so viel,
ich müsste noch die Bedingungen dazu haben, die Aktion.
Die Aktionen beschreiben das ganze Implementationsunabhängig. Ja,
und die Vorbild- und Nachbedingungen, die können wir sehr gut
verwenden beim Design by Contract, für die Positivtests insbesondere.
Ja, und das ist der Punkt,
wo wir sagen wollen, ja,
die sind abstrakte Datenfügig,
sind wichtig für die Praxis
Und damit möchte ich die ganze Sache beschließen.
Ich möchte ihn mit auf den Weg geben. Ja,
die theoretische Informatik branken wir. Wir brauchen sie immer dann,
wenn wir hohe Risiken haben, wenn es komplex wird,
wenn wir als Menschen mit unseren Fehlern,
die wir normalerweise machen, zu viele Fehler machen.
Wenn wir Maschinen brauchen,
um etwas zu prüfen oder in den Maschinen brauchen,
um etwas fehlerfrei zu generieren, überall da brauchen wir so etwas.
Damit, soweit diese Veranstaltung zu Korrektheit und Fundalisierung