So, schönen guten Morgen. Ich bin zunächst mal wieder bei der Wiederholung und hoffe, das Mikrofon stimmt und die Beleuchtung. Gut. Ja,
wir waren, wir hatten ja in der letzten Stunde bei den synchronen Produkten angefangen,
was eine Verallgemeinerung der Produktkonstruktion für endliche Automaten auf Transaktionssysteme war und hatten da zunächst,
dass all die allgemeinen Überlegungen überhaupt zur Synchronisation,
nämlich in Bezug auf Rande Wu-Synchronisation, Speichersynchronisation,
und Nachrichtensynchronisation und nochmal angemerkt,
dass Mivia beispielsweise Speichersynchronisation auf Roundevous-Synchronisation zurückführen können,
indem wir hier eine Funktionseinheit, ein Medium zwischenschalten,
auch wieder in Form eines Transitionssystems und in asymmetrischer Weise dasselbe für die Nachrichtensynchronisation,
wo wir hier dieses Transitionssystem dann Kanal nennen würden.
Und zu dem letzteren Fall hatten wir dann ein konkretes Beispiel,
Mit Sender-Kanal und Empfänger,
wobei Sender und Empfänger zwei Zustände haben und jeweils eine Kante mit Randovous-Synchronisation und eine ohne.
Und die Synchronisation findet über den Kanal statt. Und dieser
Kanal kann sich gewissermaßen einerseits, nehmen wir mal an,
den mittleren Zustand dem Sender zuwenden oder dem Empfänger zuwenden und
jeweils den Datenaustausch in der Richtung durchführen.
Ja, die Zustände entsprechen Leerfüllung,
Eins- und Füllung 2 und diese Synchronisationsrelation,
also die Paare, die gemeinsam ausgeführt werden,
werden hier in dieser Menge von Paaren dargestellt
Wobei wir auch erlauben, diese Paare umzubenennen in einfache Bezeichner,
was dann zur Vereinfachung eben dient. Ja,
die Animation sah dann so aus, dass wir hier dann
die entsprechende Kommunikation mit dem Kanal hatten und die Abgabe des Kanals an den Empfängern.
Dann kamen wir zur formalen Definition, also das Produkt,
Transitionssystem von zwei Transitionssystemen, TS1 und TS2,
geschrieben mit diesem und Kreuz und Kringel als eine Art kathäsischen Produkt,
aber in Variation mit dem Index Sync,
der eben die Synchronisationsrelation angeht, ist zunächst mal,
besteht zunächst mal dann eben aus dem kathäsischen Produkt der Zustände.
Das neue Alphabet ist die Vereinigung der alten Alphabete mit dieser,
mit den synchronisierten Paaren oder der Umbenennung.
Die kann auch entfallen, Und im Einzelnen dann ist noch
zu erklären, die neue Transitionsregel. Hier, der Allgemeine
Fall, wo wir also eine solche Synchronisation vorliegen haben.
Und im Produkttransitionssystem haben wir dann dieses Paar hier,
was genau dann diese Übergänge gemeinsam beschreibt,
die hier in den einzelnen Transitionssystemen gegeben waren.
Oder in der Variante mit der Umbenennung durch Gamma von A1
und A2. Nämlich mal die anderen beiden Fälle waren diejenigen,
wo nur einer der Partner einen Schritt macht,
also hier das
Nicht? Und der Zustand des TS2 bleibt der gleiche.
Und hier entsprechend, wo der TS2 den Schritt macht und
das TS1 bleibt der Zustand der gleiche. Hier,
das geht hier von S nach S und hier sollte dann
wohl auch S stehen und das zwei ist ein Druckfehler.
Ja, und das gilt dann genau in dem Fall,
wenn also diese Aktion A2 nicht in der Synchronisationsrelation steht,
also kein Keines Partners bedarf für den Übergang.
Dann hatten wir eine Folie zur sogenannten Inter-Lieblingssemantik, nämlich den Fall,
wo wir ein Produkt haben und die Synchronisationsrelation gleich der leeren Menge ist,
nicht was sozusagen der Extremfall ist,
für in den meisten Fällen haben wir wenige Aktionen, die synchronisiert sind und einige,
die unsynchronisiert sind und die verhalten sich dann so wie hier.
Nicht und wenn wir das so gewissermaßen mit rein machen,
dann sehen wir, dass dann das Produkttransitionssystem,
die Gestalt eines Würfels hat,
wo alle drei Aktionen in beliebiger Reihenfolge
eben stattfinden können
Als Anwendungsbeispiel hatten wir dann nochmal eben dieses Sender-Empfängersystem.
Jetzt aber in der Variante, dass wir diesen Kanal hier
nicht explizit dargestellt hatten. Das hat den Grund darin,
dass dann später beim Alternierbit-Protokoll das Verhaltenstransitionssystem zu groß würde.
Aber hier nun zunächst nochmal die Einleitung.
Die haben wir also den Sender spezifiziert und den Empfänger.
Und mit der entsprechenden Synchronisation zieht das Produkt Transitionssystem
dann so aus
Und wir hatten dann hier noch den Fall betrachtet,
dass eben diese beiden Aktionen,
die oben durch Pfeile dargestellt sind, nebenläufig stattfinden können,
was dann eben diesem Parallelogramm in der Interliving Semantics entspricht.
Also erst flauen, dann grün oder erst grün und
dann flau und das Ganze unabhängig voneinander.
Ja, nun betrachten wir den nächsten Fall,
ach nein, zunächst haben wir noch diese Animation,
wo das Ganze eben abläuft
Und dann hatten wir jetzt noch die externe Sicht der internen Sicht gegenüber gestellt.
Interne Sicht war vorher, jetzt haben wir die externe Sicht,
wo wir nur die äußeren Kanäle,
die sichtbaren Kanäle betrachten und nicht.
Und im Verhalten können wir das jetzt so darstellen,
dass wir die internen Übergänge gewissermaßen verdecken und daraus nur
einen Zustand macht,
was dann
ein solches Transitionssystem ergibt
Ja, dann sind wir jetzt auf das Alternier-Pit-Protokoll zugesteuert,
hatten jetzt noch mal diese ursprüngliche Arbeit hier zitiert und gesehen,
dass in der ursprünglichen Arbeit eben auch schon so eine Art Automatendarstellung vorgelegen hat.
Und das Alternier-Pit-Protokoll behandelt also den Fall, dass der Kanal gestört ist.
Nicht, das modellieren wir also zunächst mal dadurch,
dass wir diese Störung hier durch ein Sondersymbol modellieren.
An dieser Stelle werde ich noch mal anmerken, nicht,
also ausführlichere Darstellung wäre,
wenn wir hier wieder für den Kanal ein Transitionssystem dazwischen schalten,
wie ganz am Anfang und dann würde gewissermaßen in bei dem Übergang des Transitionssystems,
die dieser Fehler auftreten.
Das ist hier weggelassen, damit das Endtransitionssystem für das Verhalten
nicht zu groß wird. Und es wird hier so getan,
als ob der Fehler schon auftreten würde,
wenn der Sender schreibt, auf den Kanal schreibt.
Ja, nicht und der Empfänger empfängt auch den Fehler und
das entsprechende Produkt, Transitionssystem sah so aus.
Und das externe Verhalten wäre dann dieses hier,
wo dann auch der Fehler übertragen wird
So, in Richtung Weiterschreiten zum Alterniertbit-Protokoll kamen wir dann zu
dem entstörten System, was dadurch möglich ist,
dass wir hier einen Rückkanal haben für eine Bestätigung, positiv oder negativ.
Und das ist immer noch nicht das Alterniertbit-Protokoll, weil dann später ja,
wie wir gesehen hatten, auch der Rückkanal gestört ist.
Das ist hier in diesem Zwischenschritt noch nicht der Fall. Ja,
dementsprechend hätten wir hier also diese positive und negative Quittung,
die dann auch vom Sender entsprechend dann aufgenommen wird und den
beim negativen Quittung den Sender dazu veranlasst,
das Datum nochmal zu senden
Nicht und das Produkttransitionssystem würde ebenso aussehen und wenn wir wieder zum intern externen Verhalten kommen,
hätten wir diese Zustände zusammenzulegen und das entsprechende Bild würde dann so aussehen.
Ja, an dieser Stelle hatten wir auch noch mal überlegt,
dass eben eine solche Endlosschleife hier mit dem in dem roten Pfeilen vermieden werden muss,
was semantisch bedeutet,
dass der Kanal nicht permanent gestört sein kann,
dass es also eine notwendige Voraussetzung für das Funktionieren
dieses Alternierbit-Protokoll ist
Ja, wenn wir das als Büchi-Automat auffassen,
dann wäre diese Fairness-Annahme zum Beispiel dadurch gewährleistet,
dass wir diesen Anfangs- und Endzustand,
diesen Anfangszustand auch als Endzustand nehmen und gewissermaßen,
dass die da unendlich oft durchlaufen werden muss,
wodurch also ein permanentes Durchlaufen dieser roten Schleife also unmöglich ist.
Ja, anders als beim letzten Mal wollte ich jetzt nochmal
auf das Wechselspiel zwischen System und Spezifikation eingehen, was wir ganz am Anfang hatten.
Wir erinnern sich ja, ich hatte ja gesagt,
in manchen Fällen könnte man auch ein Transitionssystem für eine Spezifikation verwenden.
Nicht in dem Falle könnten wir zu sagen, dieses Transitionssystem,
als die Spezifikation auffassen. Also die Aufgabe bestände darin,
einen solchen Sender, ein solches Sender-Empfängersystem zu konstruieren,
dass dieses Verhalten hat. Nämlich der Gestalt,
dass wenn ein Datum D über den Kanal A eingegeben wird,
dann beim Empfänger dasselbe Datum D über den Kanal C kommt
und wir intern noch nicht wissen, wie das Ganze funktionieren soll.
Nämlich der Schritt, nächste Schritt wäre dann der Entwurf eines Systems.
Das wäre dann dieses, dieser Sender und Empfänger.
Und die Verifikation würde jetzt darin bestehen,
dass wir das System verhalten durch das Produkt Transaktionssystem modellieren und
das Verhalten dieses konstruierten Systems mit der Spezifikation vergleichen.
Das heißt also, wir hätten diesen roten Pfeil,
den wir am Anfang mehrfach hatten, dass wir überlegen,
dass eben jede Folge, die hier möglich ist,
auch hier drüben in der Spezifikation als erlaubt,
gekennzeichnet ist.
Und in der Tat hätten wir hier sogar den Pfeil in
beide Richtungen oder sogar auch die B-Simulation
Ja, nicht? Und die Verifikation würde dann darin bestehen,
dass wir eben zeigen, jede Folge, die hier möglich ist,
ist auch hier möglich, was hier dadurch geschehen könnte,
dass wir diese Abstraktion rechtfertigen, dass wir sagen,
wenn wir diese Zustände hier so zusammenfassen,
dann sind die noch extern sichtbaren Transitionen,
genau die wir im Recht haben.
War deine Wortmeldung? Nein, seht nicht so aus.
Gut. Ja, dann sind wir weiter fortgeschritten,
indem wir uns noch mal überlegt hatten,
dass wir also mit einem solchen Datum D eben
ein Okay bekommen und für einen Fehler ein Not,
Und dass wir nun annehmen, dass eben auch der Quittungskanal gestört ist.
Und der tritt, der Trick im Alternierbildprotokoll,
der besteht jetzt nun da drin, dieses Bestätigungs,
diesen Bestätigungsmechanismus dann auch für den Kanal D zu übernehmen.
Das heißt, dort hätten wir auch ein Okay und ein Not-OK,
dann für den Kanal D. Und die erinnern sich,
dass ich ja sagte, dass diese Autoren,
die als erstes ein solches Verfahren vorgestellt hatten,
die Vermutung geäußert hatten,
man bräuchte mindestens zwei Bit und dass die Autoren des Alternierbildprotokolls das widerlegt haben und der Trick bestand darin,
dass sie eben dieses Quittungsspit doppelt verwendet hatten.
Nicht zunächst einmal wird das Staat, wird dem Datum ein Bit 0,
ein Bit mit dem Wert 0 zunächst, beigefügt,
wo dann eine Null für okay und eine 1 für Not-OK zurückkommt.
Und hier unten, ja, ach so, ja,
das wieder vergessen. Das heißt,
im Falle von OK wird das nächste Datum durchstrich,
dann aber mit dem gewechselten Wert 1 über Sand.
Und bei Not-OK wird der alte Wert über Sand
mit dem alten Bit-Wert
gleich null
So, und jetzt kommen wir ja zu dem Kanal D,
wo wir jetzt dieselben Werte 0 und 1 doppelverwenden.
Das heißt also, diese Null wird gewissermaßen für beide Fälle
zusammengelegt und hat die doppelte Interpretation. Entsprechend,
dass die 1. Das heißt also,
bei 1 weiß also der Sender,
dass entweder die Nachricht auf dem Kanal B gestört war oder
die Antwort auf dem Kanal D gestört war oder beides
Und in allen diesen Fällen schickt er das Datum nochmal,
wodurch sich, also die Komplikation ergibt,
dass durchaus zweimal dasselbe Datum vom Sender an den Empfänger geschickt werden kann und zwar ungestört.
Das wiederum kann der Empfänger daran entscheiden, dass ja dann
hier in diesem Falle zweimal derselbe Wert des Bits dann übertragen wird.
Das habe ich jetzt hier nochmal dargestellt, hier also nochmal die Frage,
was passiert bei korrektem Versand, aber gestörter Quittung?
Nicht, das wäre ja dieser Fall,
dass wir hier einen korrekten Versand haben,
aber eine gestörte Quittung
Das Alternierbritt-Protokoll sieht dann so aus, dass dasselbe Datum dann nochmal verschickt wird.
Wir sehen hier zweimal blau übereinander mit demselben D, aber eben,
wie gesagt, der Empfänger kann eben dieses Doppel senden,
dadurch erkennen, dass er an dieser Stelle dann sieht,
dass beigepackte Bitter denselben Wert, das Bittert nicht alterniert,
also nimmt er nur eine Kopie dieser Nachrichten.
Nicht also zusammengefasst, R erkennt dies,
da Bit nicht alterniert
So, das ist jetzt nun vorausschauend. Die Funktionsweise des Alternierbeet-Protokolls,
was eine symmetrische Gestalt hat, nicht also der Teil hier
von S0 bis S3, gleicht den Teil von S3 bis S0.
Nur mit dem Unterschied, dass wir einmal das beigepackte Pit0
und einmal das beigepackte Bild 1 haben.
Entsprechend beim Empfänger. Und das Produkttransitionssystem sieht dann ein bisschen größer aus.
Und die Abstraktion zum externen Verhalten führt dann zu diesem Bild,
wo wir jetzt sehen, wir haben tatsächlich den Fehler maskiert.
Hier wird ein D abgeschickt und empfangen und hier das nächste
D-Strich wieder und dann geht es entsprechend weiter.
Und genauso können wir hier auch wieder dieses als Spezifikation auffassen
und dann dieses System konstruieren und die Verifikation besteht darin,
dass wir zeigen, dass das Verhalten dieser Spezifikation eben entspricht.
Ja, dann hatten wir hier auch wieder so eine Animation.
Das wäre also zunächst wieder die Eingabe über den Kanal A. Dann wäre hier der Fehler,
wo dann durch die negative Quittung das Datum nochmal geschickt ist.
Hier in diesem Fall beim zweiten Mal wird das
korrekt übermittelt und dann über den Kanal C
eben abgegeben
Und die entsprechende Quittung gegeben. Dann haben wir hier noch mal die Zurücksetzung,
wo jetzt der, wie wir korrekten Versand, aber gestörte Quittung haben.
Die Frage, ob, also D-0 wird doppelt Versand,
aber eben erkannt. Nicht, was wir daran eben erkennen,
dass wir eben hier zurückgehen und der Empfänger dieses nur einmal empfängt.
Ja, das war es dann im Prinzip. Nur noch mal
die Erinnerung an die Fairness-Annahme, die auch hier wieder notwendig ist.
Wir müssen voraussetzen, dass der Kanal, also beide Kanäle,
nicht permanent gestört sind, was im Transaktionssystem bedeutet,
dass diese Schleifen hier, die nicht durch den Anfangsendzüchternd gehen,
nicht permanent durchlaufen werden. Gut,
das war es dann zu diesem Abschnitt und wir sind dann zu den Kripke-Strukturen gekommen,
welche die Form des Transaktionssystems ist,
die wir jetzt in der temporalen Logik dann benutzen werden und wir hatten als Einführung zunächst nochmal diese etikettierten Transitionssystemen,
wo die Etikette darin bestehen,
dass wir die Bezeichner der Transitionen auch anders wählen können und diese gewissermaßen denen Etikette oder Labels verpassen können.
Wenn ich schon später bei der Kripke-Struktur wird es so sein,
dass wir die Transitionen gar nicht mehr brauchen,
aber die Etikette dann als Eigenschaften, den Zuständen zu ordnen.
Also hier nochmal der Fall. Wir könnten beispielsweise als interne
abstrakte Bezeichner hier Buchstaben, ABC und so weiter nehmen und
als externe semantische Bezeichner das, was tatsächlich eben passiert.
Und dieses geschieht dann durch eine solche Abbildung,
die die Aktionen in ein neues Alphabet abbildet, was dann die Etiketten sind.
Und das Ganze wird dann auch von Wörtern buchstabenweise übertragen.
Ja, und dann haben wir auch die entsprechende Etikettensprache.
Die terminale Etikettensprache, wer dann diejenige,
die die terminalen Aktionsfolgen übersetzen in die Etikette. Ja,
manchmal verwendet man dann auch als Zielalphabet das Alphabet vereinigt mit dem leeren Wort,
Das bedeutet, dass dann dieses Y extern verschwindet.
Und man kann das sozusagen als internes Aktion auffassen,
wie wir das vorhin auch gemacht haben.
Nicht dieses Tee kochen wäre dann jetzt hier eine interne Aktion
und nach außen eben nicht sichtbar.
Also eben hat man es gerade umgekehrt. Also jetzt ist
das Tee kochen intern und das unsichtbare Y extern.
Ja, nun kommen wir tatsächlich zu den Gripri-Strukturen,
die dann also zur Analyse von Transitionssystemen mit temporaler Logik benutzt werden.
Dabei werden weniger die Aktionen folgen,
sondern viel mehr Eigenschaften der Zustände betrachtet
Eigenschaften werden durch atomare Aussagen in den Zuständen beschrieben.
Das heißt, wir haben einen festen Satz von atomaren Aussagen
und wir betrachten dann jetzt logische Konduktionen von diesen atomaren Aussagen.
So, und eine Zustands-Etikettenfunktion weiß jedem Zustand die Menge der lokal gültigen, atomaren Aussagen zu.
Und dann hatte ich noch meinen kleinen Exkurs zu Petri-Netzen gemacht,
wobei das Petri-Netz jetzt nicht weiter hier eingeführt wird,
sondern nur darauf verwiesen wird, dass auch dieses als Verhalten ein Transitionssystem hat,
was dann in einem Tool so ausgesehen hat,
wobei ein Fehler vorlag, der ja daran sichtbar war,
dass wir hier an dieser Stelle eine Verklemmung,
einen Deadlock hatten.
Nicht was in der Vergrößerung dann eben folgendermaßen ausgesehen hat.
Und man könnte dann diese Folge hier nachvollziehen und gucken.
Und das ist auch damals so geschehen, woran der Fehler gelegen hat.
Nicht in der temporalen Logik geht man dann den Weg,
dass man nicht solche Grafiken ausdruckt,
weil die A zu groß sind und B auch nicht mehr leserlich sind,
sondern man gibt dann nur einfach binäre Antworten,
korrekt und nicht korrekt und im fehlerhaften Falle dann zum Beispiel eine solche Folge aus,
die dann zu dem Fehler führt und die man dann entsprechend studieren kann.
Ja, das war dann der Korrigierte Fall,
der dann zu dem Transitionssystem führt,
wo keine Verklemmung mehr da war und wichtig an dieser Folie ist,
nur nochmal die Information,
wie groß das Ganze in dem Fall war,
was dann auch entsprechend dem Transaktionssystem entspricht,
was das Tool
dann eben untersucht hat
Ja, also nur zur Kripke-Struktur. Das heißt,
wir haben jetzt hier unsere atomaren Aussagen. Alpha 1,
Alpha 2, Alpha 3,
die dann auch manchmal kombinierte hier auftreten oder manchmal als leere Menge.
Und im Prinzip betrachten wir jetzt nicht mehr die Namen
der Aktionen und manchmal stehen die zwar noch da,
dann aber nur um die Lesbarkeit zu verbessern.
Nicht und hier hatten wir ein Beispiel, wo jetzt in
der Tat Eine Kripbestruktur vorlegt, wo wir an den Transitionen keine Bezeichnung haben.
Und nur die Informationen in den Zuständen von Normalbetrieb, Störung und Störbetrieb.
Und unser Beispiel ist, dass dieses Mikrowellenofens,
was aus dem ursprünglichen Buch von Clark entnommen ist und was sie,
wenn sie mal im Internet googeln, zum Model-Checking oder temporalen Logik,
dann werden sie das auch immer wieder finden.
Wir betrachten jetzt hier nur zunächst mal diese Etikettenfunktion,
wo wir jetzt hier das Etikett von dem Zustand 3. Hier besteht hier jetzt aus der Brötchen-Kommunikation,
dass nicht mehr Start gilt, aber Close für Tür geschlossen,
Notiz und Norderror und in anderen Zuständen dann entsprechend.
Wobei man dann meist die negativen Fälle weglässt,
um das Ganze übersichtlicher gestaltet und nur die positiven Fälle dann eben stehen lässt.
Das heißt, hier bei Oberbehörden dann die leere Menge oder
logisch,
also Truhe stehen
Gut, nicht? Und typische Aussagen, die man dann,
oder Fragen, die man an das System stellt,
ist, wenn Start und Norderror gilt,
ob dann später vielleicht wir mal in die Situation hielt kommen.
Das heißt, dass der ganze Ofen dann eben aufwärmt.
Das ist aber vorgegriffen, das müssen wir jetzt im Augenblick
noch nicht verstehen.
Zunächst mal sind wir nur bei der Kripke-Struktur und hier um
dem eine Anschauung zu geben
Ja, so eine Kripke-Struktur, die enthat auch jetzt nun
eine Binäre, Transaktionsrelation, die Links total sein soll,
was eben bedeutet, dass wir hier keine Sackgassen haben.
Das hängt damit zusammen, dass wir unendliche Folgen als Semantik betrachten wollen,
die ja dann hier in manchen Fällen nicht mehr gegeben werden.
Nicht man kann diese Einschränkung aber dadurch umgeben,
indem man hier einfach einen solchen Zustand eines Senke anschließt,
die besagt, immer dann,
wenn ich in diesem Zustand bin und dort verbleibe,
dann habe ich vorher zum Beispiel einer in dieser markanten Zustände
mit der Verklemmung passiert
Okay, also das ist keine entscheidende Einschränkung. Und wir haben aber dadurch den Vorteil,
dass wir Fairness-Annahmen und Lebendigkeitsannahmen eben besser formulieren können. Ja,
wie gesagt, also diese Gripge-Struktur ist ein Transaktionssystem,
wo wir die Aktionsnamen keine Rolle mehr spielen und formal könnte man so vorgehen,
dass man sagt, ja, wir haben ja das A immer noch,
aber das ist ein Element, die also gewissermaßen ohne Aussage.
Und die kürzere Darstellung besteht dann also darin, dass die Transitionsrelation
jetzt als binäre Relation und nicht mehr als Triple geschrieben wird.
Aber sonst gibt es wieder Zustandsmengen, nicht notwendig, endlich,
Anfangszustände, diese links totale Transitionsrelation und natürlich die Zustandsetikettenfunktion,
also eine Abbildung der Zustände in die Potenzmenge der atomaren Aussagen,
was hier sozusagen als Potenzmenge von AP geschrieben ist,
nicht unter unten wieder diese Beispiele,
wo wir dann hier,
also diese Mengen
drin stehen haben
Ja, und dann müssen wir natürlich ein bisschen wieder nachschieben, unsere Semantik.
Wir haben also Rechnungen, die wir jetzt also als Zustand folgen auffassen.
Wir stehen zwar auch wieder die Namen der Transitionen dran,
aber lesen sich, sind jetzt hier nur die Zustandsfolgen,
die dann hier zum Beispiel so geschrieben werden als Pi,
ist eine unendliche Folge von Zuständen,
also ein Element von Großelshochomega.
Der Gestalt, dass jeder Übergang in der Transitionsrelation
eben steht
Ja, und dann haben wir jetzt auch wieder
die Mengen der Rechnungen, ganz analog wie vorher.
Also SS von M wäre jetzt die Menge der Rechnungen, wie hier definiert.
Und das Ganze können wir dann auch übertragen auf die Etiketten,
indem wir jeden Zustand in dieser Folge hier oben durch das entsprechende Etikett,
was ja, wie gesagt, eine Menge ist ersetzen.
Und das Ganze heißt in der Literatur auf Trace dann.
Konkreter oder anschaulicher wird das so als Beispiel,
wenn wir hier wieder bei unserem Getränke-Automat sind,
dann hätten wir ja hier diese Zustandsfolge S0 S1.
Und dann hätten wir die Alternative S2 S4 oder
S5 und dann geht es wieder von vorne los und das immer wieder holt.
Und wenn wir jetzt da zu den Etiketten übergehen,
dann würden wir hier zum Beispiel das S0 durch das Etikett von S0,
was ja die leere Menge ist, ersetzen,
das Etikett oder den Zustand S0 durch das Etikett von S1,
was ja das Alpha 1 ist und so weiter und so fort.
Und wir würden dann als Trace diese Folge dann eben bekommen.
Ja, soweit waren wir in der letzten Stunde gekommen.
Haben Sie da jetzt noch eine Frage zu,
soll ich nochmal
was erklären
Okay, dann kommen wir jetzt zu der sogenannten Ekodierung von Ekriptostrukturen.
Das bedeutet folgendes. Normalerweise liegt ja uns ein System,
nicht als Transitionssystem vor, sondern als Programm.
Und wir müssen jetzt das Programm als Transitionssystem kodieren,
was im Prinzip kein Problem ist, aber praktisch vielleicht doch gewöhnungsbedürftig ist.
Und dieser Abschnitt hat nur den einzigen Zweck,
ihnen eine prinzipielle Möglichkeit mal zu zeigen,
dass sie den Weg sehen,
wie man jetzt ein konkretes Programm geschrieben in einer Programmsprache als Transitionssystem eben auffassen kann,
wie es dann beispielsweise auch einem Model-Checker dann vorgelegt wird.
Ja, was sind die Zustände eines Programms? Ja,
können wir auffassen. Das sind gewissermaßen die Kombinationen von Werten,
die die Variable haben können. Nicht normalerweise haben Programme
eine endliche Menge von Variablen und in einem bestimmten Zustand hat
jede Variable einen Wert und das wäre dann eben der Zustand.
Nicht, was wir dann hier, wenn wir zum Beispiel
zwei Variablen haben, so schreiben können. Das ist der Zustand,
wo die Variable 1 in WR2, VL2,
denn WR3 und V3 den Wert 5 hat, mit diesem Pfeil,
der an eine Zuweisung oder eine Substitution eben erinnert.
Und diese Kurdierung wird gerne in logischer Form vorgenommen.
Das ist das, was da drunter steht,
in logischer Form würde man dann eben schreiben,
V1 gleich 2 und V2 Gleichstrei und V3 Gleich 5.
Das wäre sozusagen die logische Kurdierung dieses Zustands
Und dann haben wir natürlich auch wieder eine Formel für die Menge der Anfangszustände.
Und wir müssen auch die Transitionen kodieren. Ja, die Transitionen,
also die Übergänge, die werden in einer Weise kodiert,
was jetzt auch wieder gewöhnungsbedürftig ist.
Und zwar schreibt man das hier gerne R,
nicht was an die Transitionsrelation erinnert, das ist jetzt eine logische Formel,
die jetzt Variablen V und V-Strich enthält.
Was bedeutet, es gibt da solche Variablen, V1,
V2, V3, aber den gleichen Satz in gestrichener Form,
also V1-Strich,
Und das macht man, um den Wechsel der Werte der Variablen
zu beschreiben, vor der Transition sind die ungestrichenen Werte.
Und nach der Trandition haben wir die Werte der gestrichenen Variablen.
Also, wir haben hier also eine Menge von Variablen.
Wir haben jetzt die gestrichenen Menge entsprechend,
die dann den Wert nach der Transition beschreibt.
Und die Beziehung zwischen beiden wird durch eine logische Formel,
nämlich dieses R von VV-Strich,
beschrieben die diese beiden Sätze von Variablen
enthalten kann
Ja, nicht. Und da kommen wir jetzt zu einer
weiteren Definition von Kripke-Struktur, jetzt in logischer Darstellung.
Nicht, wo jetzt S die Menge der Zustände,
die Menge der Belegungen ist, so wie eben beschrieben als Werte von Variablen.
Wir haben eine Menge von Anfangszuständen, die durch eine logische Formel,
nämlich die Bedingung für den oder die Anfangszustände beschrieben wird.
Und wir haben jetzt hier eine solche Zustandsüberführungsrelation,
die jetzt durch eine solche Formel beschrieben wird.
Ja, und dann haben wir natürlich auch die Etiketten,
so wie vorher. Nicht, das wird auch wieder am deutlichsten,
wenn wir ein kleines Beispiel betrachten, hier hätten wir eine Beispiel,
wo wir zwei Variablen haben, nämlich X und Y.
Die mögen die Werte 0 und 1 haben,
das sozusagen David Domain. Und das System besteht darin,
dass in jedem Schritt X als X plus Y Model 2 berechnet wird.
Und der Anfangszustand sei X gleich 1 und Y gleich 1. So,
und wenn wir das Ganze jetzt in logischer Weise beschreiben, dann
Er würde da so aussehen, die Anfangsbedingung wäre eben x
gleich 1 und y gleich 1. Ich dachte,
hier haben wir sozusagen die logische Gleichheit.
Und um das zu unterscheiden, jetzt hier von der semantischen Gleichheit
haben wir für die semantische Gleichheit oder Äquivalenz dann diesen Dreifachstrich.
Und die Zustandsüberführungsrelation wäre dann diese Formel,
die also wie vorher beschrieben, die Variablen X und Y enthält.
Und auch nochmal die entsprechenden entsprechenden Satz von x-strich und y-strich.
Nämlich um die Definition von dieser Formel ist so x-strich,
also der Wert von x nach der Tradition,
is x plus y,
Model U2.
Und Y verändert sich nicht
Nicht, das ist ganz einsichtig. Ja,
da steht das Ganze jetzt nochmal und daraus können wir jetzt
die Gripge-Struktur in Form eines Transitionssystems herleiten, so wie wir es kennen.
Nicht also die Zustandsmenge wäre ein D-Kreuz D, also alle Kombinationen von Werten.
Das heißt, wir hätten zunächst mal diese vier Zustände,
wo wir jetzt die Zustände schon drin stehen haben,
1-1-0-1 und so weiter.
Und die Übergänge sind also so wie hier dargestellt.
Wir haben also vier Übergänge entsprechend der Formel,
die dann so aussehen, was dann eben bedeutet,
dass wir hier von dem Anfangszustand,
der ja auch 1-1 ist und hier auch spezifiziert ist,
dann in 0-1 kommen und wieder zurück und die beiden Zustände hier unten nicht erreichbar sind.
Das heißt, wenn wir in den meisten Fällen
nur die von dem Anfangszustand erreichbaren Zuständen betrachten,
würde der untere Teil dann also wegfallen
Ja, diese logische Darstellung hat also doch in
der Folge beim Mortal Checking eine große Bedeutung erlangt,
und zwar durch die sogenannten Binary Decision Diagramms oder Kurz BDD.
Weiß jemand, was das ist? BDDs, Binary Decision Diagramms.
Noch nie irgendwo mal vorgekommen. Das ist folgendes. Und
zwar hat man durch diese BDDs in vielen Fällen dieses exfonelle,
exponentielle Wachstum des Mortal Checking reduzieren können auf ein Kleineres,
Polynomielles oder noch Einfaches.
Und zwar dadurch, indem man die Buttchen-Funktionen,
die jetzt ja dahinterstehen und durch diese Bultchen,
diese logischen Formeln beschrieben werden können, reduziert hat.
Und sie wissen ja alle,
wenn sie so eine Bultje-Funktion haben und den ganzen Baum aufspannen,
dann stehen ja am Ende der Wert, den sie bekommen,
indem sie einen Pfad von der Wurzel zu Platt durchlaufen.
Und dieser Pfad beschreibt die einzelne Belegung der Variablen
Nicht so ähnlich, wie sie das, wenn sie
ein Morser-Alphabet hören, so einem Zeiger entsprechend machen können.
Und dann ist es ja unten bei den Blättern,
gibt es ja dann nur die Werte 0 und 1. Das heißt,
statt der 2 hoch Endblätter brauchen sie eigentlich nur zwei Blätter,
nämlich einen für 0 und 1. Das ist schon eine Reduktion.
Und zwischendurch kann man auch ganz viel zusammenlegen und dadurch wird also
der breite Baum dann oft zu was gar nicht schmalen.
Und das führte dann zu einer enormen Reduktion dieses Aufwandes. Nicht,
wenn man das zum ersten Mal hört,
so ging es mir auch, denkt man, ja,
das ist zwar einsichtig, aber bringt denn das,
was denn diese Formeln sind ja extrem kompliziert und so weiter.
Und das war auch eine der großen Erkenntnisse im Zusammenhang mit dem Modelchecking,
dass also durch das PDDs diese irren Zustandsräume auf einmal analysierbar wurden.
Also dann durch diese PDDs. Und dazu muss man also
dann diese logischen Darstellungen kennen, wozu wir hier aber
keine Zeit mehr haben
Gut. Ja, das war jetzt dieses Beispiel und
an diesem Beispiel ist Ihnen wahrscheinlich aufgefallen,
das ist ja noch gar kein richtiges Programm.
Wir haben nicht verschiedene Zeilen,
wir hatten nur eine Zeile und wollen dann normalerweise mehrere Zeilen haben,
wir wollen schleifen und dergleichen haben.
Nicht, und das machen wir jetzt im nächsten Abschnitt.
Das heißt, wir trachten jetzt die Konstruktion von solchen Kripke-Strukturen in logischer Form von Programmen.
Und zwar zunächst für sequenzielle Programme und da ja Auch der
Fokus auf den parallelen Programmen liegt hinterher auch dafür.
Das ist im allgemeinen Fall natürlich ein ziemlicher Aufwand.
Und deswegen nehmen wir hier nur ein ganz elementares Programm,
beispielhaft, was sozusagen nur aus dem notwendigsten besteht,
um die Thuring-Mächtigkeit zu bekommen, nämlich Zuweisungen,
hintereinander Ausführung und bedingte Anweisung und Schleife.
Und zur Vereinfachung nehmen wir noch auch eine leere Anweisung,
Skipp-Anweisung hinzu
Ja, das heißt, wir haben jetzt also solche Programme,
die verschiedene Zeilen umfassen. Und die haben jetzt natürlich dann Zeilennummern,
was jetzt ja für die Beschreibung des Zustands des Programms wichtig ist.
Man muss ja immer wissen, in welcher Zeile man gerade ist.
Und diese Zeilennummern werden durch eine spezielle Variable PC,
nicht was für viel wie heißt wie Program-Countern heißt,
oder deutsche Befehlszähler, wo dann der Wert der entsprechenden Zeile drinsteht.
Und bei den Parallelenprogrammen ist ja auch so, dass man
manchmal Teile des Programmes hat, das nicht aktiv ist.
Da kann man dann auch hier nochmal dieses Bottom-Symbol benutzen,
was für nicht aktiv steht
Ja, da das bei der ersten Betrachtung auch zunächst mal ziemlich unanschaulich ist,
habe ich dann mal hier ein kleines Beispiel schon mal hingeschrieben.
Nicht der Anfangswert unseres kleinen Beispiels sei X gleich 1,
Y gleich 2. Die Zeile 1 heißt,
die Variable X bekommt den Wert von 2 Y
und danach soll der einen Wert von Y,
der alte Wert von Y minus 1 sein.
Und danach befinden wir uns zu der Zeile L3.
Also noch keine Schleife, einfach nur,
um das am Anfang
einfach zu halten
Ja, und dann ist es ja in vielen Fällen so,
dass einige Variablen gar nicht verändert werden.
Also hier in L1 wird Y nicht verändert, ein L2X,
nicht? Und dazu haben wir das spezielle Prädikat Same,
was jetzt für eine Menge Y von Variablen sagt,
da verändert sich nichts.
Einfach nur eine abkürzende Schreibweise. Ebenso abkürzend ist jetzt das
Brief von V, das beschreibt jetzt die Anfangsbelegung der Variablen.
Das hatten wir eben in dem kleinen Beispiel schon
Nicht so, dass jetzt also der Anfangszustand erstmal dieses Brief
von V ist, was ja eben schon hatten,
aber hinzu kommt jetzt auch noch die Festlegung des Befehlszählers am Anfang.
Das heißt, das PC bekommt irgendwie einen Wert im Normalfall 0
oder 1. So, und dann geht es,
also da haben wir hier das Beispiel dazu, nicht,
also für dieses kleine Programm wäre also der Anfangszustand X
gleich 1 und Y gleich 2 und PC
So, und nun kommen wir zur Definition der einzelnen Anweisungen,
also der Zuweisung und der Hintereinanderausführung für dieses kleine Beispiel.
Und das wird jetzt durch eine Prozedur C von mit
den Parametern LP und L-Strich definiert, wobei P,
das zu definierende Programmfragment ist, L ist der Befehl,
der Wert des Befehlszählers vorher und L-Strich,
der Wert des Befehlszählers nachher
Nicht, das heißt jetzt, Prozedur ist aber im Grunde
nichts anderes als eine induktive Definition, wie bei den regulären Ausdrücken.
Und das heißt jetzt also nur Prozedur, um das Informatikern
schmackhafter nett zu machen. Das heißt, wir fangen an,
dieses See für einfache Zuweisungen zu schreiben und kommen dann zu
hintereinander Ausführungen, bedingten Verzweigungen, Schleifen und dergleichen.
Also hier steht es auch nochmal, L. und L. Strich
sind die Zeilnummer jeweils vor und nach der Anweisung.
PC und Pizrich, die Befehlszähler,
Variablen für die Befehlszähler
vorher und nachher
Ja, und dann fangen wir jetzt mal an mit der Zuweisung.
Das wäre jetzt also jetzt die Definition oder Prozedur für die Zuweisung,
wo die Variable V den Wert eines Ausdruckes eh bekommt,
den wir jetzt hier nicht weiter spezifizieren.
Wichtig ist für uns nur, dass dieses eh einen Wert
liefert auf der Basis von Variablen, wie hier unten.
Nicht und L und L. Strich sind wie überschrieben.
Und jetzt sollten Sie mal überlegen,
ob Sie jetzt schon sich denken können,
was da jetzt im Recht hinkommt
Mit dem PC, das ist einfach, nicht vorher,
der Wert von PC ist 11 vorher und PC Strich hinterher ist 11 Strich.
Ja, und was sollte sich dann noch ändern? Ja,
der Wert der Variable V,
der soll den Wert von E bekommen und alle anderen Variablen bleiben gleich,
nicht und nichts anderes steht da auch.
Also PC ist L und PC Strich ist L Strich und
der Wert von V nachher ist also V-Strich,
ist der Wert von E und die anderen Variablen werden eben nicht verändert.
Das sieht ja schon mal schlicht aus
So. Nächste wäre jetzt die Hintereinander-Ausführung.
Das sieht ja grafisch so aus, sozusagen als Flussdiagramm.
Vorher haben wir L. Dann kommt ein Programmteil P1,
den wir induktiv schon definiert haben. Dann kommt ein Programmteil P2,
der hier vielleicht mit L2-Strich anfängt und das Ende,
das Ganze endet jetzt mit L-Strich. So,
und jetzt wollen wir also hier dieses C von LL-Strich definieren,
wo in der Mitte jetzt dieses Programmfragment drin steht.
Und sie können auch schon mal überlegen, wie das aussieht.
Zeige ich aber trotzdem, jetzt schon mal
Das heißt, wir haben jetzt hier unser Programmfragment,
was wir hier mit B1 und P2 beschrieben haben und da jetzt gewissermaßen
auch noch diesen Befehlszähler für den Zwischenschritt L2-Strich hingeschrieben haben.
Nicht am Anfang haben wir L und hinterher haben wir L-Strich und das soll genau dann gelten,
wenn das Entsprechende für die Programmteile gilt, nämlich,
dass wir mit P1 von L nach L2-Strich bekommen und von L2-Strich nach L-Strich kommen.
Ja, das sieht zunächst mal aus,
wir sind ein taktischer Salat, um das nochmal ein bisschen hervorzuheben,
habe ich das so gemacht, ich weiß nicht,
ob das nützt,
also L1 und L2 sind die Befehlszähler vorher nachher und in der Mitte der Kasten ist jetzt das zu definierende Programmfragment,
was jetzt Induktiv jetzt auf die Definition von P1 und P2 zurückgreift.
Ja, und jetzt hatte ich ja gesagt,
das sind jetzt die beiden Beschreibungen von P1 und von P2,
wo ich ja deutlich und gesagt habe, da steht aber,
oder, das ist ihnen vielleicht aufgefallen.
Kann sich jemand erklären, warum da, oder, es steht und nicht und?
Ja, sie haben da schon öfters sich gemeldet,
nochmal jemand anderes? Das wäre doch einfach schon naheliegend.
Oder zu sagen, ja bitte? Ja,
ich versuche nochmal, das laut zu wiederholen fürs Mikrofon.
Die Antwort ist, dass sie jetzt diese zwei Bedingungen sind,
die nicht gelten sollen, sondern gewissermaßen Alternativen sind.
Entweder bin ich sozusagen im ersten Fall oder im zweiten Fall
und deswegen das Order. Ich habe das so sagen,
mal für die Aufzählung erholt. Ich erinnere mich daran,
dass der Kommilitone sagte, ich soll auch ihre Fragen wiederholen,
damit die aufgenommen sind, aber leider gibt es wenig Fragen.
Das heißt, wir dürfen ruhig mal ab und zu auch mal
was fragen, damit ich Gelegenheit habe, das zu üben.
Aber ich komme auf den Punkt nochmal zurück,
gleich in einer veranschaulichen Zunächst mal betrachten wir jetzt,
was wir bis jetzt gelernt haben an unserem Beispiel.
Das war jetzt unser Beispielsprogramm und die Anfangsbedingung haben wir jetzt hier so dargestellt,
der Bit, der Programmzählern war ja L1, so fängt es ja an.
Die Anfangsbedingung war x gleich 1 und y gleich 2. So,
dann machen wir den ersten Schritt mit dem Befehlzähler L1,
dem Befehl, den gewissermaßen unter Instruktionsverarbeitungs- Mechanismus bei in der Zeile L1 vorfindet.
Und die Zugehörige Tranditionsrelation wäre also diese, wie eben beschrieben.
Und das führt jetzt eben dazu, dass wir jetzt hinterher den Befehlszähler L2 haben.
Und der Wert von X ist jetzt vier,
nämlich es wird ja hier, X wird auf zweimal Y im Gesetz.
Y war vorher zwei. Und Y ist unverändert vorher zwei,
hinterher zwei. Das steht hier für Sie zur Übung,
dann nochmal ausführlich ausgeschrieben
Nicht und wieder mit dem mysteriösen Hoda, nicht dann hier. Ja,
und dann geht's weiter,
dann steht der Befehlszähler jetzt hier bei L2. Dann gucken wir diese Zeile an,
das heißt, danach ist der Befehlszähler bei L3 und X ist immer noch vier,
aber Y ist altes Y minus 1, also Y gleich 1,
was jetzt hier ausgeschrieben dieser Zeile entsprechend entsprechend der Definition.
Und da oben also, wie gesagt,
immer wieder das Oder. Und ich versuche jetzt mal,
Ihnen das nochmal nahezubringen, an einem anderen Beispiel.
Und zwar betrachten wir mal
irgendeinen Grafen
Nicht, wie da oben sind die Kanten eines Grafen.
Und Graf wird ja beschrieben durch die Knoten und Kanten.
Die Knoten lassen wir mal weg. Und die Kanten wären ja jetzt A,
B, B, C und C A. Nicht,
und das könnte ich ja dadurch beschreiben,
durch die Menge aller XY, der Gestalt, das XY,
gleich A, B, oder PC oder CA ist.
Und das wird also zusammengefügt, dann auf diese Art und
Weise, dass das dann diesen Grafen ergibt. So,
und wenn Sie jetzt auf die Idee kommen und sagen,
da muss er bei uns stehen, so wie vorher,
dann können wir ja mal überlegen, was das denn wäre,
wenn ich statt dem Odern uns stehe,
was für ein Graf würde denn da oben dann stehen?
Ja, bitte
Genau, das wäre dann der leere Graf. Naja,
Knoten hätten wir noch, aber die bringen ja auch nichts.
Nicht, das wäre ja, ist ja unmöglich,
dass das X gleichzeitig A, B und C sein kann.
Und deswegen musste ein O oder stehen. Das heißt,
dieses O oder steht gewissermaßen für die Sammlung der verschiedenen Alternativen,
nicht bei einer normalen Mengen, oder in vielen Mengen
Darstellungen steht da auch, naja,
das sage ich jetzt lieber nicht mit dem Komma,
das könnte auch ein Unbedeuten. Aber so ist die Erklärung,
dass dieses O oder hier für diese verschiedenen Fälle diese stehen,
die dieses Paar XY im Hafen kann.
Okay,
ja bitte
Ja. Ja, vielen Dank für die Frage.
Jetzt habe ich auch Gelegenheit, das zu wiederholen.
Die Frage war also, das Oderheer ist ja bei der Menge kommunitativ.
Das kann ich so rum und so rum schreiben.
Und bei den Programmen haben wir ja, ist das Ganze nicht kommunitativ.
Also plätter ich nochmal zurück. Und wir gucken uns nochmal
hier an bei diesem, oder hier. Wenn Sie sich
das betrachten, sehen Sie das, stört das immer noch?
Könnte ich das nicht auch andersrum schreiben,
den hinteren Teil nach vorne
Ja. Ja, also eher der Einwand ist,
wenn ich das umdrehe, würde ich ja gewissermaßen diese Ausführung umändern.
Aber mein Gegenargument ist, wenn ich hier zum Beispiel in dem Zustand bin,
dann habe ich ja den Befehlzähler L1. Dann gucke ich hier
sozusagen in meine Liste von logischen Diskussionsjunktionen.
Und da bleibt mir nichts anderes übrig, als hier zum L1 zu gehen.
Auch wenn es andersrum dastehen würde. Das heißt also,
der Befehlzähler ist, Unheimlich wichtig und der verhindert,
dass sich das in der falschen Reihenfolge nicht und das bestätigt nochmal die Aussage,
dass das einfach nur eine Menge von Möglichkeiten ist und in welcher Reihenfolge dieses aufgeschrieben wird,
macht höchstens die Liste effizienter, aber prinzipiell ändert das nicht.
Ja, okay, dankeschön. Gut,
also gehen wir wieder weiter
Und kommen jetzt zur schleifenden Anweisung. Das sieht auch wieder
wild aus und das wird einfach dadurch vereinfacht,
dass wir das so sagen, als Flussdiagramm schreiben.
Wir haben also hier den Schleifenkörper mit dem Befehlszähler L1 und den Schleifenkörper P1.
Und die Schleife besteht darin, dass wir hier eine politische Bedingung haben,
wo man mit beim Wahr-P gleich war,
in die Schleife gehen und B,
gleich Falls rausgehen und dann die nächste Anweisung L-Strich ausführen.
Das heißt, wir haben hier oben dann jetzt wieder die
bekannte Struktur vorne, L hinten L-Strich, in der Mitte
Die Schleifenanweisung und auch gleich die Syntax der Schleife.
Hier haben wir die Schleifenbedingungen und hier den Schleifenkörper,
der jetzt auch wieder den Befehlszähler L1 hat.
Ja, und das Ganze sieht eben so aus,
dass wir zurückgreifen auf die Definition des Schleifenkörpers.
Dass wir am Anfang L haben und hinterher L1,
wenn B gilt, dann gehen wir nämlich in die Schleife hinein.
Und wenn wir bei L1 sind,
müssen wir dann hinterher hier weitermachen mit dem Schleifenkörper.
Oder es gilt B nicht, dann gehen wir
gleich nach Elstrich
Ich auch, auch wenn wir schon mehrfach die Schleife durchschlafen haben.
Das ist also nach demselben Muster. Dann hatte ich ja schon
das Kipp angewandt, angekündigt, was ja denkbar einfach ist.
Da verändern sich keine Variablen. Nur der Programmtailer,
der Zeilenzähler, wird eben weitergesetzt. Ja, und dann
ist ja nochmal die bedingte Anweisung wichtig, die so aussieht.
Nicht von L komme ich nach L-Strich und wahlweise,
wenn B gleich wahr ist über L1 und den Programmteil,
P1 und im anderen Fall über
Sodass wir hier induktiv auch wieder über die Beschreibung von P1 und P2 zurückgreifen.
Durch Ansammlung, also oder wieder. Und das Ganze sieht dann eben so aus,
dass wir hier von L nach L. Strich kommen,
wo hier wir diese Schleife haben und dass sie bedeutet eben,
dass wir dann hier eben,
wenn also bei B wahr ist,
nach L1 gehen und wenn B falsch ist nach L2 ist,
was dadurch geregelt ist,
dass diese Programmteile hier unterschiedliche Zeilennummern am Anfang eben
haben.
Gut, das waren jetzt die sequenziellen Programme und
unsere Parallelen oder nebenläufigen Programme sind auch wieder ganz schlicht.
Die haben immer nur die Gestalt hier, Co-Beginn,
Co-End und dadurch haben wir,
dazwischen haben wir jetzt sequenzielle Programme mit so einem Parallelstrichen.
Die haben ja gemerkt, ich sage meistens Parallele oder Nebenläufige.
Eigentlich bemühe ich mich, da zu unterscheiden, obwohl dazu sage,
mein persönlicher Geschmack ist und in der Literatur und in dem Formatiksprache
nicht ein allgemeiner Standard ist.
Ich bevorzuge nebenläufig dann zu sagen, wenn wir
keine strenge Synchronisation haben
Das ist auch ein ganzes Gebiet, die sogenannten parallelen Programme,
die bestehen sozusagen aus mehreren sequenziellen Programmen,
wobei die Abarbeitung sozusagen getaktet ist.
Das heißt also, im ersten Schritt werden alle Parallelen Zweige im
ersten Schritt abgearbeitet und dann und so weiter und so fort.
Nicht und nebenläufig würde das so sein, dass die Ausführungsgeschwindigkeiten
unabhängig sind. Wenn ich also das entspricht zu sagen,
den Synchronschaltkreisen und den Asynchronenschaltkreisen in gewisser Weise
Okay, jetzt bei den Nebenläufen-Programmen, da haben wir jetzt hier folgende Bezeichnungsweise.
Das Ganze gilt jetzt auf das Buch von Clark zurück,
was ich demnächst auch nochmal als Referenz zeige. Nicht,
wobei dann hier die parallelen Programmteile hier auch nochmal mit Zeilnummern versehen und auch hier intern,
um darauf dann eben Bezug nehmen zu können.
Ja, die Anfangsbedingung für so ein paralleles Programm ist,
dazu sagen die Anfangswerte der Variablen gilt,
dass der Programmzähler irgendwie auf einem M steht,
aber die Teilprogramme zunächst mal auf undefiniert oder inaktiv stehen nicht.
Das ist das, was wir vorhin schon mal erwähnt haben.
Und der dass sozusagen die Semantik des gesamten Programmes sieht dann eben so aus,
nicht wo wir hier unten jetzt dann wieder auf die einzelnen Programmteile zurückgreifen.
Das heißt also, hier kommen wir von dem LE
mit dem Programmteil PI nach dem LE-Strich.
Und nur die Variablen werden verändert,
die jetzt hier in diesem Programm PI angesprochen werden.
Und auch die Programmteiler nur in dem Teil werden verändert,
nicht die anderen. Und da haben wir hier jetzt wieder
ein großes Oder von I gleich 1 bis N
aus demselben Grund wie vorher
Ja, dann müssen wir dann nur noch über
die Initialisierung und Termination sprechen. Die Initialisierung ist die,
dass wir am Anfang hier ein der Programmzähler auf L steht,
wie hier in der Definition gefordert, dass er hinterher auf,
nee, auf eins und die einzelnen Programmteile auf L1 stehen,
so wie sie hier innen drin am Anfang eben stehen.
Lech und dann geht's los mit den einzelnen Teilen und nach der Termination
Und bei der Art Termination bedeutet, dass dann der Programmzähler vom Hauptprogramm undefiniert ist.
Und die Teile alle auf den entsprechenden Strich gestrichen teilstehen.
Das heißt, die sind also abgearbeitet.
Und... Ja, und hinterher sind dann die Programmteile inaktiv.
Und es geht sozusagen im Hauptprogramm eben weiter. Können Sie erkennen,
ob jetzt bei dieser Form von parallelen Programmen in den einzelnen Zweigen
gemeinsame Variablen verändert werden können. Also Sie wissen ja,
das ist problematisch, wenn parallele Programme dieselbe Variable beschreiben,
überschreiben, verändern. Kann das hier passieren nach der Definition?
Ja, kann passieren. Das ist also nicht ausgeschlossen.
Da steht eben nicht da drin, nicht,
also hier unten steht nur, dass nur die Variablen verändert werden,
die hier in dem Programmteil PE vorkommen,
aber eine Variable X beispielsweise kann in mehreren Programmteilen vorkommen.
Nicht und im allgemeinen Fall ist das natürlich so,
dass es dann von der Reihenfolge der Abarbeitung abhängt,
welchen Wert, die dann hinterher eben hat.
Das ist also nicht ausgeschlossen, aber hier geht es
ja nur überhaupt erstmal darum, Programme zu definieren.
Ja, und dann haben wir noch eine Anweisung,
die es bei sequentiellen Programmen nicht gibt.
Das ist die sogenannte Awade-Anleitung, die also ein Warten beschreibt.
Die Semantik ist also, der Befehlzähler soll angehalten werden,
bis also die Bedingung B eben eingetroffen ist.
Und die Beschreibung ist also so,
was in der grafischen Darstellung Folgendes folgendermaßen aussieht,
der Befehlzähler ist am Anfang
Und er ist El Strich, wenn die Bedingung B gilt. Und wenn die Bedingung B nicht gilt,
dann bleibt das hier,
und das wird hier durch eine Schleife dargestellt,
das ist also sozusagen eine Form des sogenannten Busy-Marating,
nämlich was man am Anfang bei einfachen Spieleprogrammen vor,
weiß ich nicht, wie vielen Jahren auch hatte, nicht,
wenn sie an solche Programme auf dem Atari oder Commodore vielleicht besser oder noch früheren Denken,
da gab es keine Interradbefehle im Betriebssystem,
die einen parallelen Teil anhalten konnten.
Und das wurde dann dadurch simuliert,
dass das der Programmteil dann immer einfach
eine Totschleife durchlaufen hat
Und das machen wir hier eben auch,
um das Ganze dann als Transitionssystem eben darstellen zu können,
weil wir genau wie bei diesen frühen Rechnern im Tranditionssystem keine Interraptmöglichkeit haben.
Naja, und das Ganze sieht also ähnlich wie bei
der bedingten Anwalt oder bei der Schleife aus.
Nicht vorher haben wir L und hinterher haben wir L-Strich.
Und wenn also B gilt hier, dann sind wir hinterher
bei L-Strich. Und wenn B nicht gilt,
sind wir hinterher bei L. Nicht, das heißt also,
für B gleich Falls hätten wir den roten Teil und für B
gleich drohen den Kröten teil und dann geht das unten weiter
Gut. Ja, jetzt ist wieder ein Beispiel angesagt.
Und dazu nehme ich jetzt ein klassisches Beispiel,
was über das Beispiel hinaus noch eine Bedeutung hat.
Nämlich das sogenannte Problem des Wechselseitigen Ausschlusses oder Englisch,
das Problem des Mutual Exclusion, wie das hier aufsteht.
Mutual Disclusion bedeutet vor, im Folgendes. Ich hatte eben schon erwähnt,
nicht, dass bei Parallelen oder nebenläufigen Programmen es kritisch ist,
wenn verschiedene Parallele oder nebenläufige Programmteile auf eine Variable oder auf einen Speicherbereich zugreifen,
weil es dann von der Reihenfolge abhängen kann, was hinterher der Wert ist.
Und deswegen, um das sicherzugehen, gibt es eine Synchronisationsform,
die darin besteht, dass man Die,
wenn ein solches Programmteil auf einen sogenannten kritischen Abschnitt zugreift,
die anderen sperrt.
Und dies ist also ein klassisches Synchronisationsproblem. Und das betrachten wir
hier dann, um gleichzeitig jetzt hier auch unsere Programmbeschreibungen darzustellen.
Ja, und dann nimmt man klassischerweise zwei Bedingungen an.
Wir haben also zwei Prozesse, P und Q oder sequenzielle Programme,
P und Q und wechselseitiger Ausschluss bedeutet,
dass die Befehlszähler,
P von P und Q
nie gleichzeitig in ihrem kritischen Abschnitt sind
Gibt, also eine bestimmte Menge von Befehlszählern,
die man kritischen Abschnitt nennt und wechselseitiger Ausschluss heißt,
die beiden dürfen da nie gleichzeitig in ihrem jeweiligen kritischen Abschnitt sein.
Das würde aber, wäre aber trivial zu erfüllen,
erfüllen, indem man das Programm überhaupt nicht ausführt.
Nicht man muss oder den entsprechenden kritischen Abschnitt gar nicht besucht.
Man braucht auch hier auch noch, um das Ganze ein
sinnvolles Problem sein zu lassen, auch noch die Bedingung,
wenn ein Prozess sich anmeldet für den kritischen Abschnitt,
dann muss er auch irgendwann mal reinkommen.
Und dieses Anmelden muss irgendwie operationalisiert sein,
da hat man Dann zum Beispiel die Variable One-P. dafür,
dass der Prozess oder das Programm P sich anmeldet und das entsprechende Fürku.
Nicht, dass wir sagen, eine Option auf die Zukunft,
wobei nicht gefordert wird, wann das der Fall sein soll.
Wenn ich es gebe, dann natürlich Lösungen, die mehr
oder weniger effektiv sind. Außerdem sind das nur zwei Forderungen,
nicht in der Literatur, sind also bis zu zehn Forderungen,
die dann vielleicht auch noch sinnvoll sind, formuliert worden.
Wir belassen uns jetzt aber mal bei den zwei.
Nicht und die beiden Forderungen haben auch eine klassische Bedeutung,
die bezeichnet man nämlich als Sicherheits- und Lebendigkeitseigenschaften oder Englisch Safety-Property oder Lifeness-Property,
eine Safety-Property ist eine Eigenschaft, die gewissermaßen in einem Zustand entschieden werden können.
Im Gegensatz zu einer Lebendigkeitseigenschaft, die erfordert,
dass man irgendwie in die Zukunft gucken muss,
was natürlich ein ziemlicher Unterschied ist und das wird sich auch später durch die sogenannten temporalen Operatoren oder Quantoren darstellen,
die dann heißt, es geht immer,
nicht in jedem Zustand gilt irgendwas und es gilt später einmal eine Option auf die Zukunft
So, und jetzt wollen wir jetzt verschiedene Lösungen betrachten.
Und dazu nehmen wir ein allgemeines Programmschema an. Also am
Anfang haben wir erst mal eine Initialisierung der betrachteten Variablen.
Und das Programm sieht dann eben so aus, Befehlszähler ist M.
Und dann haben wir hier das Co-Beginn Co-End-Klammer und
wir brachten jetzt nur mal wechselseitigen Ausschluss für zwei Programme.
Und das ist dann auch erweitert worden für eine endliche größere Zahl. Ja,
und die sehen jetzt so aus, das sind also Endlosschleifen,
so wie wir das bei Betriebssystemen oder Dienstprogrammen haben.
Und da haben wir irgendwann mal hier den kritischen Abschnitt
Und außerdem gibt es auch noch einen nicht kritischen Abschnitt,
das soll einfach ein Programmteil sein, wo dieser kritische Abschnitt nicht besucht wird,
wo es also zum Beispiel nur lokale Variatlen gibt. So,
und dann hinterher noch Platz für die Synchronisation zu haben,
spezifizieren wir hier ein Eintrittsprototokoll und ein Austrittsprotokoll,
also ein Protokoll ist ja nichts anderes als ein Algorithmus,
der regelt wann jetzt einer in den kritischen Abschnitt will,
nicht um damit er sozusagen auf der anderen Seite auch funktioniert,
muss dann manchmal eben auch beim Verlassen des kritischen Abschnittes
was getan werden
So, und wir kommen jetzt zu vier Lösungen,
die von den berühmten Informatiker Deixtra hervorgestellt worden sind,
die gleichzeitig noch dazu dienen, verschiedene Probleme,
die gerade bei der Programmierung in nebenläufigen Systemen eben auftreten.
Nee, Deixtra hat das also schon sehr früh gemacht an der technischen Universität
eingeworfen und er hat dann später sogar ein Betriebssystem dazu geschrieben,
was damals wegweisend war, das TUE-Operating-System,
TUE heißt Technical Universe,
Universität Eindhoven,
wo er Studentenübungen im Badge-Betrieb parallel verarbeitet hat und dann
gerade diesen wechselseitigen Ausschluss dann eben brauchte
So, und diese Lösung für den wechselseitigen Ausschluss,
die orientiert sich hier an dem Paradigma der Ampel,
nicht an der Kreuzung, haben wir ja auch wechselseitigen Ausschluss.
Nicht, wenn zwei Autos, die nicht beachten, gibt es
einen Zusammenschluss. Und wir haben dann hier unsere Ampel,
ist jetzt wie eben zu erwarten durch so eine Avade-Anweisung dargestellt.
Wir fangen also an, haben zunächst den nicht-kritischen Abschnitt,
haben dann unsere Avade-Anweisung, dass wir grün abwarten,
setzen dann die Ampel rot,
sozusagen für den anderen und gehen an die kritischen kritischen Abschnitt und verlassen dann den kritischen Abschnitt und setzen die dann für den anderen wieder grün.
Nicht so sehen, dass die Vorratsetzung dabei,
dass wir hier keine übergeordnete Verwaltungsinstanz durch ein Betriebssystem haben,
sondern nicht so wie das von Zeiten bei Deixtra war,
als es sowas in Betriebssystemen noch nicht gab.
Nicht und auf der anderen Seite dann entsprechend. So,
meinen Sie jetzt, dass das jetzt prima funktioniert?
Oder sehen Sie da einen Fehler da drin?
Wir waren gerade noch mal jemand anderes, sonst sie bitte.
Ja, die Antwort war, das geht schief,
weil sie sich, weil sie beide sich rot setzen können.
Dann heißt das dann, dass es eine Verklemmung gibt
Ja, und sie? Ja, die Antwort ist,
an die keine Verklemmung, aber die Eigenschaft des kritischen Abschnitts wird es nicht eingehalten.
Das sehen wir jetzt mal bei folgenden Animationen.
Also wenn nur einer das ausführt, dann funktioniert das natürlich.
Das muss man natürlich bei diesen Lösungen auch immer betrachten.
Man kann da komplizierte Lösungen machen und wenn man da nur einlaufen lässt,
dann ist der auch irgendwie total behindert, Gott, eine Verklemmung.
Aber wir betrachten jetzt mal eine Animation,
wo beide aktiv sind, also deren setzt jetzt die Ampel
Der wachtet bis grün, ist. Und am Anfang ist das
ja vielleicht grün. Ja, die Anfangsbedingung ist grün hier
. Die ist grün am Anfang. Kommt der Andere,
setzt das auch nochmal auf grün. Dann setzt ihr die
Ampel auf rot. Und dann setzt ihr auch die Ampel
auf rot. Aber das ist ja keine Erwähltanweisung.
Also können sie weitermachen. Also kommen sie beide in den
kritischen Abschnitt. Und wir haben keinen wechselseitigen Ausschluss.
Also der Exra hat jetzt also vier solche Vorschläge gemacht,
wo wir im ersten Fall in die Falle getappt sind und
unsere Pseudo-Lösung nicht die Bedingung des wechselseitigen Ausschlusses eben einhält
Diese Dinge, die Voraussetzung dabei ist, die,
dass die Anweisungen für sich alle gewissermaßen ungeteilt und Seitenbedingungen frei ausgeführt werden,
aber dass es keine übergeordnete Betriebssystem-Isteanz eben gibt.
So, die zweite Lösung nach Daixtra war jetzt da drin,
dass er jetzt nun sagt,
jeder bekommt jetzt ein Want P und meldet sich an.
Das heißt also, nachdem sie hier im nicht-kritischen Bereich waren,
setzen sie das Want P auf Tru und warten darauf oder fragen ab,
dass der andere nicht in den kritischen Abschnitt will,
sodass der dann also gewissermaßen frei ist und er in den kritischen Abschnitt kann.
Frage wieder an sie,
ist das jetzt in Ordnung
Ja, da, bitte. Okay, prima,
ja, also die Antwort war,
die können ja beide,
dieses One P auf True setzen und warten dann wechselseitig,
das würde dann jetzt in der Animation so sehen,
der Linke setzt das auf True,
der Recht ist jetzt aus Auftruh und da hängen sie jetzt also fest und kommen da nicht weiter.
Das heißt, die ganze Geschichte enthält eine Verklemmung und ist keine Lösung,
weil diese Lösung nicht verklemmungsfrei ist,
wenn ich das englische Wort für Verklemmung ist at Deadlock
So, auf dieser Lösung baut jetzt da extra auf,
bei seinem nächsten Lösungsversuch,
nicht für eine Verklemmung herrscht durch dieses starre Warten auf den anderen,
dann könnt ihr eine Lösung darin besteht, dass man sagt,
der andere will, hebt diese Blockade kurzzeitig auf,
um dem anderen die Möglichkeit reinzugeben und setzt sie dann wieder.
Das wäre dann jetzt hier der Lösungsversuch 3 nach Deixtra.
Und sie sehen, der durchläuft hier eine Schleife.
Am Anfang setzt er wieder das Rond P auf True und
dann durchläuft eine Schleife und setzt sein Wort P zwischendurch mal kurz auf Falls,
um dem anderen die Gelegenheit geben,
dann da rein zu können und hinterher wieder auf True,
weil er schließlich irgendwann mal selber in den kritischen Abschnitt hinein will
Ja, ich sagte ja schon vier Lösungen. Die Fürchte wird dann
die endgültige sein. Also erst wenn wir bei der dritten,
also ist da auch ein Haken drin und worin besteht der Haken her?
Wenn ich das kenne, ja, vernünftig. Der Leder lässt
jeden Mal die Gelegenheit, reinzugehen. Sie haben einen Versuch,
ja, ja, ja, die meine ich. Genau,
die Antwort ist, die ist sicher nicht zu erwarten,
dass der andere die Gelegenheit wahrnimmt, die er eben gibt.
Sie können das völlig parallel wieder machen. Das würde in der Animation so aussehen,
der setzt sein Mont P auf Tru,
der das Wort Clue auf Tru und nun geht er da rein Und jetzt setzte das auf Falls,
aber der andere nutzt die Gelegenheit nicht,
sondern er geht weiter und setzt es wieder auf True und dann sind die hinterher,
also schon wieder gesperrt und das Geld entsprechend dann immer wieder weiter.
Das heißt, wir haben jetzt die Situation,
dass die Prozesse nicht weiterarbeiten können, wir haben aber keine Verklemmung,
kein Deadlock, aber die Wirkung ist dieselbe und deswegen nennt man das gerne einen Live-Lock,
das heißt, eine Verklemmung aufgrund von Aktivität, nicht?
Das nennt man auch manchmal ein After-You-After-You-Effekt,
um in dem Bild zu bleiben,
wenn zwei Personen gleichzeitig durch eine enge Tür wollen,
dann können sie auf ihrem Vorrecht bestehen und zusammenknallen,
aber sie können dann auch sehr häufig, höflich sein und sagen,
nach ihnen,
nach ihnen und das machen sie unendlich lange,
weil sie beide super höflich sind und das wäre dann
auch eine Form von Live-Log
So, nun kommen wir zu der endgültigen Lösung nach Dirkser,
die dann später von Peterson verbessert worden ist.
Und die setzt jetzt nun eine Variable ein,
mit den Werten 1 und 2 und die heißt Last.
Und die bewirkt nun, dass sich derjenige,
der sich zuletzt anmeldet, warten muss. Das heißt,
diese eine Lösung baut jetzt auf der Lösung 2 auf,
hat aber jetzt einen Unterschied,
dass bevor sie zur Weltanweisung kommen, setzen sie Lars,
der setzt Last of 1 und last auf 2.
Und bei der Lösung 2 hatten wir hier nur diese Abfrage,
wohnt Kug gleich Fouls, ob der andere nicht hineinwünscht.
Aber im Falle, wenn sie beide hineinwollt,
sind ja diese beiden Want Kug und Want Petrus.
Dann gibt es eben die Möglichkeit, dass dieses Last
1 oder 2 ist und dann darf der eben herein,
der die entsprechende Bedingung hat. Und das ist also gerade der,
der zuerst dies gesetzt hat, der darf rein.
Das heißt, diese Lösung setzt jetzt also eine gemeinsame Variable voraus,
die jetzt auf beide zugreifen, nämlich dieses Lars.
Und da brauchen wir jetzt die Anweisung,
dass die einzelne Anweisung natürlich wechselseitigen Ausschluss schon benutzt wird,
was früher schon, also meistens so hardwaremäßig in den elektronischen Schaltkreisen gegeben worden ist.
Das Ganze sieht jetzt also so aus,
nehmen wir mal auch wieder so einen parallelen Ablauf.
Sie laufen also jetzt irgendwie da parallel. Der setzt zuerst
das Last auf 1, dann kommt der Last auf 2 und dann kommt der.
Jetzt seht ihr, dass Want P ist ja Tru,
gilt der erste Teil nicht, aber das Lars ist gleich zwei.
Also er darf herein in den kritischen Abschnitt,
auch wenn der jetzt dahin kommt, darf der in den kritischen Abschnitt.
Und wenn er rauskommt, dann lässt er,
setzt er wieder das Ganze auf Falt und geht dann an
den Anfang und dann darf der, der andere kommt dann auch hinein.
Ja, da wird behauptet, das ist okay,
aber naja, so ganz überzeugt ist man natürlich nicht,
nachdem man alle die Irrtümer vorher gesehen hat,
weil das ja ein kleines Programm ist, aber größeren Programmen potenzieren dich die Problematik.
Nicht, und das ist jetzt die Multifikation jetzt für das Model-Checking,
wir prüfen das jetzt durch Model-Checking und konstruieren dazu jetzt mal das Transaktionssystem und gucken,
wie das dort in dem Zusammenhang aussieht.
Das Transaktionssystem für dieses kleine Programm ist schon ziemlich unhandlich und deswegen benutze ich folgenden Trick. Ich streiche diese Anweisungen,
was unser Problem aber nicht modifiziert,
denn in diesen gestrichenen Anweisungen passiert nichts,
Wenn wir uns zum Beispiel nur für Verklemmung und Live-Log und dergleichen interessieren,
weil immer dann, wenn das Programm, das ursprüngliche Programm,
diese Anweisung ausführt, sehen wir, dass in dem Modifizierten,
dass wir dann hier NP1 sind und hier unten auch,
dass wir dann, wenn wir in P4 waren,
in P5,
das heißt,
diese Modifikation ist nur dazu notwendig,
unser Transitionssystem kleiner zu machen
Ja, da komme ich dann gleich nochmal drauf zurück,
aber zunächst nochmal einen kleinen Exkurs auf Deixtra.
Der hat also diese Lösung getroffen mit dem Programm,
was wir eben hatten, aber das ist natürlich keine Dauerlösung.
Und deswegen hat er den entsprechenden Mechanismus in sein Betriebssystem eingefügt
und das einen Simmer vorgenannt. Ich stelle mal vor,
das kommt von dem griechischen Wort für Signal, Zeichenträger.
Und das ist jetzt eine geschützte Variable, auf die nach der Initialisierung
nur durch geschützte Anweisung P und V zugegriffen werden darf.
Und P von M, also P von Sam,
setzt diesen Wert, der fuckt ab,
ob dieser Wert größer als null ist.
Und dann, wenn das der Fall ist,
dann zählt er 1,300. Nicht, sondern da der Wert am Anfang.
Eins ist beispielsweise, einfach der nie negativ. Nicht unter
das V, also andere Bezeichnungen dafür sind Wade oder Test and Z.
Und der Legende nachkommt das P von Sam von dem
niederländischen Wort probären, also testen.
Nicht, und das Duale dazu ist das Wiederhochsetzen.
Das ist das V von Sam,
das kommt angeblich vom Niederländischen verhogen und in anderen,
in englischen Büchern heißt das meistens Wade und Signal
Nicht und bemerkenswert, wenn jetzt hier noch diese Spitzen klammern,
diese Spitzenklammern bedeuten, dieser Test und diese Zuweisung, die müssen unteilbar ausgeführt werden.
Das heißt, der andere Prozess darf hier nicht zwischenfunken.
Und das war ja gerade das Problem bei den Lösungen vorher,
dass der eine den Test macht auf die Variable evont und der andere
dann einen Schritt macht und danach erst die Anweisung mit dem Sperren oder der gleichen Macht,
wo es schon zu spät wird.
Das heißt, Dikesram hat dann in seinem Betriebssystem die Möglichkeit eingeführt,
dass zwei solcher Anweisungen,
relativ elementar sind oder in Form dieser Prozedur ungeteilt ausgeführt werden und hat damit dann die Möglichkeit geschaffen,
den wechselseitigen Ausschluss zu lösen oder andere Probleme,
ohne dieses ganze Programmchen, was wir eben hatten,
dann eben ablaufen zu lassen.
Lechon in der abstrakten Schreibweise nimmt man da oft diese Spitzenklammern
für die ungeteilte Anwaltung, nicht wobei,
dass nach unseren Annahmen hier unten gar nicht so notwendig wäre.
Wenn ich dieses Test und Set,
das gab es in früheren IBM,
Großrechnern und drückt auch nicht,
also das Test und Set
unteilbar eben ausgeführt werden sollen
Ja, und nicht ohne unser Semmer,
unser wechselseitiges Ausschlussproblem würde dann eben so aussehen mit Silmaphoren.
Nicht, dass die am Anfang den Wert eins haben,
als sie immer Foren deklariert werden.
Und bevor dem kritischen Abschnitt macht jeder das P von Sam
und hinterher das V von Sam und wegen der Unteilbarkeit,
kann da nichts passieren.
Nämlich, wir haben uns das andere aber trotzdem angeguckt,
einfach um diese Möglichkeiten von Verklemmungen und Live-Log
und dergleichen
uns anzusehen
Ja, Sie wissen, heute benutzen wir natürlich auch keine Selma Fore,
mehr, nicht? Und in Java als objektorientierter Sprache,
da haben wir solche Anweisungen wie Synchronized und dergleichen.
Und durch eine Expression wird dann ein Objekt referenziert,
das während der Ausführung von Statement geschützt wird,
wie im anderen Zusammenhang haben wir hier so ein Beispiel für
den wechselseitigen Ausschluss auf den Zugriff eines Ringpuffers.
Und da sehen Sie, dass jetzt hier dieser Zugriff hier
beim Deposset und beim Store durch Synchronized geschützt werden,
nur damit sie den Bezug zur heutigen zu heutigen Möglichkeiten haben.
Und sowas gibt es praktisch in allen Programmsprachen, die Nebenläufigkeit oder Parallelität eben erlaufen.
Und dieses Model-Checking muss heute auch nicht mehr unbedingt auf Transitionssystemen
ausgeführt werden. Es gibt dann hier so ein Beispiel,
solche Tools, wie zum Beispiel den GPL-Frontime-Varifier,
der direkt auf Java-Programmen arbeitet und so weiter.
Also da ist eine enorme Entwicklung im Gange und wird weitergeführt.
Nicht schon zum Teil sind diese Programme, diese Model-Checker,
auch Firmengeheimnis, wenn nämlich einer einen guten Model-Checker hat,
dann ist das ein natürlich ein wirtschaftlicher Vorteil gegenüber der Konkurrenz.
Und deswegen klafft da manchmal der Stand der Wissenschaft und das,
was real existiert durchaus auseinander
Gut, wir kommen ja jetzt aber zurück zu
unserem Programmchen nach Dikestra und Decker mit den gestrichenen Anweisungen.
Und hier kommt jetzt die Darstellung dieses Programms als in der
logischen Schreibweise, wie wir das vorher gelernt haben.
Da wir das aber in der Vorlesung praktisch nie mehr benutzen,
sondern immer nur die Transitionssysteme, ist das gewissermaßen nur für Sie da,
um das sich mal anzuschauen.
Und das werde ich jetzt im Einzelnen auch nicht besprechen,
sondern gucke mir jetzt lieber das zugehörige Transaktionssystem eben an
Da habe ich hier rechts nochmal einen Teil,
und zwar das P, das Kuh habe ich weggelassen, aus Platzgründen.
Und in jedem Knoten habe ich den jeweiligen Zustand beschrieben,
und zwar die erste Zeile, sind die Brötchenwerte von PI und PI,
nicht die Wötchenwerte, sondern die Werte der Befehlszähler.
Nicht die haben wir ja P1, P2, P3,
P5. Und in dem anderen hatten wir Q1, Q2, Q3, Q5.
Und da steht dann immer hier 2, 5 und dergleichen.
Die zweite Zeile ist der Wert von Last,
also 1 und 2,
der hier gesetzt wird
Und die dritte Zeile ist jetzt der Bulje-Wert von Wantpe und Wantcue,
also Falls oder Droh. Das heißt, am Anfang sind wir hier,
haben wir zwei Anfangszustände, nämlich es kann so sein,
also das Wantpe und Wantcue sind beide Falls,
wie man hier sieht, das Last kann eins oder zwei sein.
Das heißt, hier haben wir mal ein sinnvolles Beispiel von
zwei Anfangszuständen. Und deswegen haben wir hier eins und zwei
und der Befehlszähler ist am Anfang hier immer auf dem P1.
Deswegen steht hier 1-
So, wenn wir jetzt die Anweisung P1 ausführen,
also hier runtergehen, dann sehen wir,
dann wird das Wond P auf Truh gesetzt.
Das heißt, sie haben ja den Wechsel von Wechsel von
F nach Truh. Wenn wir jetzt das P2 ausführen,
dann wird das Last auf 1 gesetzt.
Das war es zwar schon, einfach überschrieben.
Dann wird jetzt der Test ausgeführt und wir gehen den
kritischen Abschnitt und dann wieder raus und danach gehen wir dann
wieder in den Anfangszustand mit
Wenn ich dasselbe können wir jetzt dann auch mit dem
anderen Anfangszustand anfangen und dass sie dann aber genauso aus,
nur dass jetzt die Zuweisung von dem Lars wirklich eine Änderung ist,
aber das funktioniert.
Also das wäre zum Beispiel ein Ablauf,
wo nur das linke Programm, also das erste,
in den kritischen Abschnitt und herausgeht und das andere eben nichts tut.
So, jetzt betrachten wir mal die Situation,
wo das andere Teil, der jetzt hier nicht dargestellt ist,
schon einen Schritt gemacht hat mit Q1.
Wenn ich das bedeutet, der ist jetzt schon im Zustand in
der Zeile Q2 Und sonst hat sie, ah ja,
und er hat hier natürlich, das Wand auf Druck gesetzt.
Was passiert dann? Dann würde das, würde,
wenn der Erste jetzt weitermachen, dass so weitergehen,
ersetzt das Last jetzt auf eins.
Und er ist jetzt hier auf dem Welt.
Und er würde jetzt hier an dieser Stelle jetzt festhängen,
bis nämlich der andere einen Schritt macht,
weil er ja hier abfragt,
Wandkuh gleich falls oder Last gleich zwei.
Und beides gilt nicht
Das heißt also, er kommt hier nur heraus,
wenn der andere einen Schritt macht,
was hier durch diesen Ausgang Q2 dargestellt ist,
also mit seinen Anweisungen P kommt er nicht weiter.
Das heißt, wir müssen,
dieses Programm wäre also nicht robust gegen Ausfall,
wenn jetzt der andere ausgefallen wäre und der hier Q2 nicht ausführen würde,
dann käme der eben auch nicht weiter,
ja eine Frage.
Sie meinen diese Schleife hier
Dieser hier? Die hier. Da waren wir doch gar nicht, ne?
Wir kommen hier gar nicht raus aus dem jetzt markierten, ne?
Weil wir, beziehungsweise immer nur P3 ausführen können,
aber Q2, Q2 kann ausgeführt werden.
Aber wenn es das nicht tut, dann bleiben wir hier in diesem Zustand.
Das ist die Aussage, ne? Das ist nur für
den Fall, weil ich das nicht dargestellt habe.
Das heißt, wir brauchen immer, dass der andere auch kooperativ ist.
So, der nächste Punkt ist also der, dass wir,
ach so, jetzt komme ich nochmal zurück auf unser Model-Checking-Problem.
Und wir betrachten jetzt nochmal die erste Bedingung
Dass die Befehlszähler P und Kuni gleichzeitig im kritischen Abschnitt sind. Das heißt,
das war die Bedingung A. So, nehmen wir an,
unser Model-Checker würde uns dieses Bild liefern und ich müsste da drauf gucken,
wie könnte ich jetzt erkennen,
dass die Bedingung A gilt,
dass also nie die beiden Teile gleichzeitig im kritischen Abschnitt sind.
Woran kann ich das erkennen? Ja, bitte. Ja,
aber wie gesagt, Kripke-Strukturen liest man das jetzt gewissermaßen nur
in den Zuständen ab, in den Etiketten der Zustände.
Also nach welchem Metikett muss ich suchen
Ja, da ist noch eine Antwort, einer schneller,
ja? Genau, nicht, also ich muss suchen,
ob da P5 und Q5 der Fall ist,
was in der Darstellung, wie sie richtig sagen, 5,
5 ist, aber kommt nirgends vor, also okay, ja?
Okay, und sie haben da sozusagen mit Aktionen beschreiben wollen.
Das heißt, wir haben nie die Situation für einen 5,
der Modelchecker würde also alles durch rackern und würde das nicht erfinden.
So, fragen wir jetzt nach B,
B bedeutet ja, dass wenn er sich anmeldet,
tatsächlich in den kritischen Abschnitt kommt, wieder die Frage,
was, wie würde wir das jetzt untersuchen?
Das heißt, wir haben zwei Dinge.
Wir müssen erst sagen, er meldet sich an.
Woran kann man das sehen, ja?
Ja, bitte. NP1, nicht ist die Anmeldung,
in P1 und Q1. Bitte
Ja, ja. Also genau, aber P1 würde genügen. Das heißt,
wir müssten zum Beispiel prüfen, wenn P1 gilt,
ob wir dann später mal tatsächlich nach P5 kommen für den einen
und das Entsprechende mit Q1 später mal nach Q5 für den anderen Fall.
Und das würde eben bedeuten,
nicht wenn wir jetzt hier zum Beispiel dies und durchlaufen haben,
dann haben wir hier für den ersten ja hier P1 und
wir kommen tatsächlich später mal nach P5. Oder wenn wir mal hier das betrachten,
In diesem Falle, dann würden wir auch hier nach P5 kommen,
aber unter der Voraussetzung tatsächlich, dass die beiden eben aktiv sind.
Nicht in dem Fall, den wir eben hatten,
wenn der eine eben ausfällt, wo wir dann hier
diese Schleife hatten, würde das eben nicht gelten.
Das heißt, wir müssen in unserem Transitionssystem annehmen,
dass jeder, der Teile auch mal einen Schritt macht.
Nicht das ist sozusagen bei einem physikalischen Prozessor trivial oder selbstverständlich,
dass die immer weiterarbeiten, höchstens mal ausfallen,
was man hier vielleicht in einer besonderen Betrachtung macht.
Aber in den Transitionssystemen müssen wir diese Annahme machen.
Und später bei den Petri-Netzen nennt man das dann die verschleppungsfreie Schaltregel.
Das bedeutet, wenn eine Nebenläuferaktion ständig möglich ist,
dann muss sie auch irgendwann mal ausgeführt werden.
Nicht im Englischen heißt das, die sogenannte Finight-Delay-Propartie.
Nicht, das ist also eine Fairness-Annahme. Und auf diese
Art und Weise sind wir jetzt zur temporalen Logik gekommen.
Die temporale Logik hat nämlich diesen irgendwann mal Operator außer,
was soll ich sagen,
für die Liveen das wichtig ist und außerdem diesen Operator,
der wie so ein Kästchen, der die Bedeutung hat,
es gilt immer nicht und den können wir gewissermaßen noch davor setzen.
Nicht dieses, das heißt also immer gilt,
während das andere heißt, später gilt,
einmal nicht und das ist jetzt sozusagen der Einstieg in die temporale Logik,
mit der wir dann nächste Woche dann eben beginnen.
Also vielen Dank für heute