Ich bin mitten. So, einen schönen Tag. Wir
nehmen uns über den Prinzess nach einem Gras von Betrachtung.
Mittlerweile nimmt es andere Mittel voll bekraftet ein.
Der Puffer, der zwei Hinterleiter der Einzelnen und so weiter.
Das heißt, der erste NASA, der Oberkreis,
die Kleider dazwischen
Der zweite Hofer war nur Nachtritt, hat zwei hier auszugeben. Das heißt,
von links waren letztendlich Operationen wie Breeds, auf Kanal einzeln möglich,
ganz rechts kam das halt als Sent und ein Arzt nach raus.
Und die beiden Mittelaktionen, die erste,
das erste Mempool sendete auf der Lade 3,
das ist das zweite Empfinden, auf Kanal 3,
zu meinen Aktionen, Sent oder Pfarrer,
wurden gekoppelt zu der Kommunikationsaktionszene.
So, das sind also zwei Einzelpfiffer, die wir jetzt
in Seele scheiden können. Wir wollen zeigen, dass das Gesamtverhalten,
Das ist ein sehr, sehr gescheiter Langsam. Das heißt,
ich bin nicht vergröbere und die Kanal 3 nicht mehr betrachte oder nur auf das Verhalten,
das zwischen Keller einzuführen, wenn eine 2 stattfindet,
dass das dann einen Puffer entspricht, allerdings auch mit der Kapazität ins Zwei.
Und um das nachzudeuten, müssen wir das versagen.
Das heißt, ein Puffer, das heißt,
wir beschreiben die Linkebox, gut, eine Linkebox junge Spezifikation.
Wir sagen, die Linkebox holt uns um eins. Und die verhält sich,
oder bringt sie einmal etwas gelesen oder kann eine Reizung ab,
als es geschrieben hat, bis sieben Zentren,
Fans ist genauso wie der Weg für Mats.
Und die zweite Empfindung im Zwei ist ganz genauso von der Stimultur ja nur,
dass sie eben halt 3 ist und dann noch einmal so einfach selten wird,
wie daran, die Teleerwechsel und jetzt ist die Aufregung zusammen.
Und eigentlich interessiert uns gar nicht, was da gesendet wird.
Welches Daten in den Fehler gesendet wird, was wir jetzt machen und tun,
weil so als wäre das so eine Effekt,
das wäre jetzt gar nicht so alter Stufe betrachten müssen.
Also haben wir die Unbefreitung, da ist eine Tür eins
das Gleiche, ja, eins des Tests.
Und du zweifel ja, aber bestes war der Flusswert.
Das sieht meistens nicht meximal nicht aufeinander, bezogene Gleichungen,
sondern zwei war dieselbe Gleichheit wirklich vor eins,
also den einen als Transitionssystem beschrieben,
wenn im Alltag eine Lesung war zurück auf Truppen,
so eine Zwischenzustadt, Puffer als Feuer.
Und wenn ich das schreibe, dann wieder lerne,
also links ist der Pufferliga, rechts ist erfolgen.
Und genau das Gleiche auch nur mit dem Unterschied,
auf welchen Kanälen gelesen und geschrieben wird. Wir wollen jetzt zeigen,
dass die Komposition dieser beiden Systeme jetzt einem Zweierpuffer entspricht.
Und die Komposition dieser beiden Systeme, da muss ich noch was tun,
also als erstes muss ich nicht nur Q2,
Q1 parallel betrachten, sondern ich muss auch dafür sorgen,
dass die Aktionen zentral und Receiv 3 nicht mehr einzeln vorkommen.
Ich erzwinge das mit dem Verdeckungsoperator,
da sind diese beiden Aktionen nicht mehr ausführbar und es ist nur noch möglich,
die beiden Synchronen auszuführen und die Gamma-Funktion sagt mir,
dass die Synchrone-Operation von S3 und R3 jetzt C3 genannt werden soll
Und wenn ich jetzt noch den Tau-Operator auf diesen Thermen loslasse und sage,
man will gar nicht mehr sehen, dass C3 intern passiert,
also dieses Handshaking will man gar nicht mehr zur Kenntnis nehmen,
da soll eine Tau-Aktion, eine stille,
interne Aktion draus werden, dann macht das mir dieser Tau-Operator.
Das heißt, der vergröbert genau das interne Verhalten jetzt. Und dieser neue Therm,
was da rauskommt, von dem wollen wir zeigen,
dass er sich genauso wie ein Puffer der Kapazität 2 verhält,
das kann ich durch das gleiche System in XYZ beschreiben,
oder eben durch ein Transitionssystem was das gleiche Verhalten ist.
Wenn der Puffer ganz leer ist,
also im Zustand X, kann ich etwas lesen.
Jetzt auf der Seite 1. Und bin dann in einem Zustand Y,
der beschreibt, der Puffer ist genau mit einem Element voll,
also zur Hälfte gefüllt.
Wenn es halb voll ist, habe ich zwei Möglichkeiten.
Entweder ich sende das soeben empfangene Element wieder. Dann gehe ich
also zurück zu X, dann ist der Puffer wieder leer.
Oder ich empfange noch ein Element auf Kanal 1,
dann bin ich im Zustand Z,
der für Puffer ist ganz voll steht,
mit zwei Elementen.
Und in dem kann ich natürlich
nur noch ausliefern
Das heißt, von Z führt nur noch der Weg mit S2 zurück zu Y.
Und genau das steht auch links mit den Gleichungen da.
Da steht mich X, kann nur R1 machen und verhält
sich dann wie Y. Das ist die eine Kante.
Y hat zwei ausgehende Kanten, es verhält sich mich entweder
wie R1Z, dann gehe ich nach rechts.
Oder wie S2X, dann gehe ich nach links.
Und Z verhält sich so wie S2Y, also nur die Kante nach links.
Und jetzt sind wir schon relativ dicht dran.
Jetzt gucken wir mal nach, was ist denn mit unserem
neu erzeugten Therm
Im Tau Heiding Q2 parallel zu Q1. Was für ein Transitionssystem erzeugt der?
Und da gucken wir mal erstmal das Ganze an,
ohne den Tau-Operator. Wenn ich den jetzt weglasse,
dann sehe ich das System, was da beschrieben wird,
das erlaubt noch die interne synchrone Aktion, C3,
die kommt also genau in der Mitte vor.
Und wenn ich dort sage, C3 ist ja in Wirklichkeit eine Tau-Aktion.
Das heißt, da kann ich gar nicht beobachten.
Und eine Tau-Aktion, wo es auch keine Alternativen gibt,
Ja, das ist die einzige Kante, die aus diesem Zustand führt.
Und da haben wir schon gesehen, solche Aktionen,
die keinen Entscheidungscharakter haben, die sind wirklich überflüssig.
Ich kann das Ganze als einen Block betrachten und das hier
grob sehen. Und dann stellt man fest, Mensch,
das hat ja die gleiche Optik hier, habe ich es jetzt richtig rumgedreht?
Nee, verkehrt rum. Aber wenn man davon absieht,
also genau einmal andersrum drehen,
dann habe ich hier drei Zustände und die Pfeile gehen da
auch entsprechend weg.
Nee, musste andersrum. Gut,
also wir sind auf einem guten Weg vom Transitionssystem,
können wir es schon mal feststellen,
die beiden haben die beiden Therme, beschreiben Isomorphal, Prozessgrafen.
Also das gleiche Verhalten. Und jetzt wollen wir das nicht nur am Prozessgrafen sehen,
sondern wir wollen auch gucken, dass wir das nachrechnen können.
Also gehen wir jetzt das Ganze nochmal an und zeigen,
dass wir das jetzt auch tatsächlich ausrechnen können.
Ja, was kann man da machen? Da kann man erstmal ausrechnen,
wie verhält sich die Parallelkomposition von Q1 und Q2?
Und wir packen die Parallelkompositionen aus mit Left Merch und Communication Merch,
wenden dann das rekursive Definitionsprinzip an, nehmen also die rechten Seiten der definitorischen Gleichung.
Das heißt, Q2 wird ersetzt durch den rechten Thermen bei Q2,
also R3S 2Q2 und entsprechend für Q1 und entsprechend auch beim Communication Merch.
Und dann weiß ich, die ganzen Axome erlauben mir beim Left Merch,
die erste atomare Aktion auf der linken Seite abzuspalten und beim
Communication Merch werden die ersten beiden jeweils genommen und zu einer Kommunikationsaktion verschmolzen.
Wenn ich also so ausklammere, Dann kommt bei den ersten beiden Thermen
die atomare Aktion R3, beim zweiten der Eins zum Vorschein.
Der Rest mit jetzt parallel ausgeführt. Und der zweite Therm R3 R1,
wenn ich den kommunizieren lasse, kommt Deadlock raus,
weil die Kommunikation zwischen diesen beiden nicht vorgesehen ist,
also Äquivalent zu Deadlock definiert wurde.
Und da kann ich jetzt noch weiter rechnen, das Deadlock-Symbol,
das ist ein unnützer Therm da hinten, den kann ich also weglassen,
die Verklemmung, die brauche ich dann nicht,
kann also nur diese beiden ersten Thermen übrig behalten.
Gut, jetzt weiß ich also schon mal,
was die Parallelkomposition Zweiercues bedeutet, nämlich etwas,
das entweder eine R3 oder eine R1-Aktion ausführen kann.
Und jetzt geht das weiter. Jetzt packe ich dazu den Verdeckungsoperator.
Ich verdecke jetzt die Aktion S3R3. Und wenn du das auf
die Parallelkomposition von Q2 und Q1 an. Und das habe ich eben ausgerechnet,
was Parallelität von Q2 und Q1 sein soll,
das ist nämlich irgendwas, was R3 gefolgt von was,
oder er eins gefolgt von was anderem ist.
Und da ich jetzt feststelle, R3 soll ich verdecken und
ich dann noch weiß, dass es ein linearer Operator,
kann ich erstmal das über die Summe ziehen,
dann kann ich es über die Sequenzen ziehen.
Und dann stelle ich fest, Mensch,
da ist ein Verdeckungsopfer, ein Verdeckungsoperator auf R3 angewandt worden.
Und R3 kommt genau in eine Menge der zu verdeckten Elemente vor.
Also ist das doch dem Verklemmungssymbol gefolgt von irgendwas.
Und Verklemmung gefolgt von irgendwas ist eine Verklemmung und Verklemmung plus irgendwas,
das ist nur noch, dass irgendwas relevant.
Es bleibt also nur noch der zweite Therm übrig.
Und was haben wir da jetzt gezaubert? Wir haben gezaubert,
dass ich von dem ersten Therm mit eine R1-Aktion zu einem ähnlichen Therm werden kann,
nämlich wiederverdecken, aber jetzt steht da in den Argumenten was anderes.
Nämlich S3, Q1, parallel Q2. Und was haben wir
da gemacht? Das ist genau die Analogie zu diesem ersten Pfeil.
Die haben wir jetzt in den Gleichungssystemen nachgerechnet.
Da steht exakt das Gleiche. Diese Beziehung,
die einen Übergang mit R1 ist, ist jetzt als Gleichung
hier formuliert zwischen diesen beiden Lösungen von Gleichung.
Also hier ist eine kurze Notation verwendet worden,
anstatt immer Lösungen von Q2 in E zu schreiben,
wird hier nur Q2 geschrieben
In diesen ganzen Diagramm im folgenden Folien, wird immer nur die Variable
anstelle ihrer Lösung verwendet. Gut, wenn ich das habe,
jetzt kann ich weiterrechnen und kann mir andere Thermen anschauen, die dann noch so übrig sind. So,
der nächste Therm, den ich mir jetzt anschauen muss,
ist der, der Therm,
den ich da am Wickel hatte, als zweiten,
das war ja S3, Q1, parallel zu Q2. Naja,
und wenn ich das ausrechne, S3 steht da vorne,
das kann ich ausführen und da muss ich die rechte Seite auspacken,
da kommt was raus und da sieht man,
aha,
eine C3-Aktion wird ausgeführt
Und ich komme zu einem anderen Thermen. Genauso dem mittleren Block,
den kann man sich da auch anschauen und so weiter und so fort.
Die erste Zeile entspricht jetzt dieser mittleren Kantel mit C3.
Und was haben wir dort in ermittleren Gleichungen? Da habe ich
eine Summe, also zwei Kanten. Und das ist genau,
wenn man das vergleicht, der untere Thermen nach C3 kommt,
den kann ich ja mit R1 verlassen, gehe dann ganz nach unten.
Oder ich kann ihn mit S2 verlassen und gehe dann
ganz nach oben. Und die letzte Gleichung beschreibt mir,
Wenn ich ganz unten angekommen bin,
dass ich da mit S2 wieder nach oben gehen darf und komme zu dem zweiten Zustand von oben.
Das heißt, diese ganzen Kanten kann ich auch nachrechnen.
So, damit ist noch nicht zu viel gewonnen.
Das ist ja noch nicht der endgültige Therm. Ich muss jetzt,
wenn ich diese Gleichung habe, da kommt jetzt noch was hinzu.
Ich musste jetzt noch anfangen, nicht nur festzustellen,
dass das hier alles gleich ist und so schön passt,
sondern ich muss auch noch den Tau-Operator hinzufügen.
So, den Tau-Operator, wenn ich den jetzt auf den Initialthermen loslasse,
dann hatte ich das schon mal ausgerechnet, was dort in den Klammern steht.
Also Tau angewendet auf diesem Verdeckungsoperator. Da weiß ich,
das macht einen R1-Übergang und ist dann ein zweiter Therm.
Und dieser R1-Übergang wird nicht verdeckt. Und dann kann ich weiterrechnen,
dieser zweite Zustand nach einem R1, dann bin ich ja im Halbvollzustand gewissermaßen.
Und was kann ich da machen, nur noch intern kommunizieren,
dann findet nur noch eine C3-Aktion statt.
Wenn ich die unternehme, C3,
C3 ist gerade eine Aktion, die internalisiert werden soll.
Sie wird also zu einem stillen Tauschschritt. Das heißt,
der Tower-Parator macht aus C3 einmal einen Tau und das kommt außerhalb des Tauberates.
Das heißt, was übrig bleibt, wenn wir dann noch anwenden,
dass er eins mal tau das Gleiche ist wie R1. Das heißt,
eine tauchen Sequenz darf ich mit den Aktionen löschen.
Dann weiß ich, gut, diese interne Aktion sieht man gar nicht.
Mithilfe der Tauoperation verhält sie also der Staatterm genauso wie einmal
auf Kanal eins etwas lesen und sich danach so verhalten,
wie der dritte Zustand, den ich einnehmen kann.
Der zweite ist einfach nicht sichtbar mehr
Und was gucke ich, was ich da habe?
Da habe ich jetzt zwei Therme. Die unterscheiden sich jetzt
nur in den Argumenten, also was dort parallel gerade ausgeführt wird.
Und wenn ich jetzt diesen zweiten Thermen mal Y nenne und den ersten Therm X,
dann passt das haargenau zur ersten Gleichung. Das heißt,
ich finde hier etwas, das hat genau das Muster X,
ist gleich R1, Y. Also kriege ich das hin,
dass ich sage, Mensch,
diese beiden sind gute Kandidaten,
um eine Lösung zu sein für X und für Y.
Und sowas suche ich ja gerade
Aber ich muss sagen, ich war früher davor, auf 10 weitergekommen.
Da? Das muss man genauso wieder im Detail ausrechnen.
Ich muss jetzt Q2 auf der linken Seite noch einmal auspacken
mit der Gleichung. Q2 ist definiert, einmal auspacken,
dann kommt das, was kann der machen,
Re3 zum Beispiel
Ja, das ist die rechte Seite. Oder noch was
anderes. Und dann bleibt er übrig, S2Q2. Das,
was dort ein Parallelitätsopparat auf der rechten Seite steht, bleibt übrig.
Und dann steht links S3 und auf der rechten Seite R3
und die zusammenergebenen C3. Also es ist nicht eine atomare
Umformung,
sondern es sind
Gut. Und wenn man noch weiter rechnet, dann kann man auch ausrechnen,
was für die anderen Zustände gilt, die wir dann noch haben.
Also wir hatten dann noch Q1, parallel S2,
Q2 und wenn wir den Therm umrechnen,
dann stellen wir fest, dort haben wir ein Schema,
das sieht aus wie etwas,
was wir schon als Y kennengelernt haben
Und etwas, was wir jetzt Z nennen können und der
letzte hervorgehobene Therm, den hatten wir mal X genannt.
Also finden wir hier ein Muster,
dass wir Y ist gleich, R1Z plus S2X nennen können.
Und das ist genau die zweite Gleichung in unserer Spezifikation.
Und wenn wir bei der dritten Gleichung weiterrechnen,
dann stellen wir fest, Mensch, das kennen wir auch,
das haben wir eben gerade nämlich Z genannt.
Und auf der rechten Seite steht ein Therm,
wen haben wir schon mal Y genannt?
Also haben wir dort eine Gleichung,
die hat das Muster Z,
ist gleich erst zweimal
Was ich jetzt habe, ist also ein Satz von drei Gleichungen,
die genau auf diese Gleichungsspezifikation, diesen orangenen Kasten passen.
So, wenn ich aber drei Gleichungen habe,
die mir auf mein gleiches System eh per Muster passen,
dann weiß ich, ich habe eine Lösung dafür gefunden.
Das heißt, mit diesen drei Gleichungen weiß ich,
ich muss nur ablesen, was jetzt die Lösungen für X,
Y und Set sind, nämlich genau die hervorgehobenen Therme.
Das sind die Simultan-Lösungen für XY und Z. Das ist eine Lösung meines Gleichungssystems.
Das habe ich also bekommen. Ich weiß jetzt also,
Das X, die Lösung von X ist gleich,
dem einen Ausdruck, die Lösung von Y,
der zweite, Lösung von Z, der dritte.
Gut, und prinzipiell interessiert mich nur die Lösung von X
, weil das der Staatszustand sein soll.
Initial startet der Puffer mit leerer Kapazität. So,
Dreigleichung, passen auf einen Dreiersatz in der Spezifikation.
Also weiß ich, ja, das ist das Muster,
sie erfüllen musste, das habe ich getan.
Und das kann ich jetzt eben sagen,
ohne dass ich mir dieses Transitionssystem anschucken muss
Gut, das ist ein Zweierpuffer. Jetzt holen wir noch etwas nach.
Wir haben nämlich bislang bei den rekursiven Spezifikationen schlicht verboten,
dass rekursive Spezifikationen sich nur mit sich selbst beschäftigen.
Also, das ist eine unendliche Folge von Tau-Aktionen gibt,
die immer intern bleiben. Das wollten wir nicht haben. So,
und die Frage, kann man das eigentlich irgendwie wegkriegen,
auf natürlichere Weise, als dass man sagt,
will ich nicht betrachten, ist zu sagen, ja,
ich will es betrachten, sage aber,
wenn es noch eine Alternative gibt,
gewissermaßen aus diesem Teufelskreis nochmal rauszubrechen,
dann nehme ich an,
irgendwann komme ich mal raus
Ja, und das ist eine Frage von Fairness wieder.
Dass wenn ich immer unendlich auf die Möglichkeit hätte,
rauszukommen, dass dann irgendwann auch mal diese Möglichkeit genutzt wird.
Und Fairness gibt es jetzt auch für Prozessalgebracht. So,
wozu brauchen wir das? Wie kriege ich nur eine endliche Tauschleife?
Ich nehme einfach die Spezifation x, soll gleich AX sein.
Das ist ein Prozess, der immer nur A ausführt.
Und wenn ich da jetzt sage, A ist aber
eine interne Aktion.
Also ich verwende den Operator Tau
Subskriptmenge A, drauf an, dann werden alle Aktionen zu Taus.
Das heißt, das führt eine unendlich lange Taukette nur aus.
Gut, hier ist das nicht so schlimm. Hier habe
ich ja gar keine andere Möglichkeit. Interessant wird es,
wenn ich die Möglichkeit habe, da mal rauszubrechen. So,
formal wird man das jetzt so definieren, wenn ich eine geschützte,
lineare, rekursive Spezifikation E habe und eine Teilmenge C,
C für Cluster, der Variablen und eine Teilmenge E von Aktionen
Dann nenne ich jetzt zehn eine Fairness-Gruppe,
ein Cluster für diese Menge von Aktionen.
Falls Folgendes gilt, ich nehme mir zwei Rekussionsvariablen XY heraus.
Die sollen beide aus C sein und von der Lösung von X komme ich mit B1,
Punkt, Punkt, Punkt, immer weiter zu Y.
Und von Y komme ich nach einigen Schritten zu X. Das heißt,
mit diesen beiden Variablen X und Y kann ich in Prozessgrafen Mund am Kreis laufen.
Und diese Aktion B1 bis BM,
die ich dazwischendurch laufen muss und C1 bis CN,
Die sind entweder aus dieser Menge I, der internen Aktionen,
oder sie sind bereits internalisiert, also sind bereits Tauschschritte.
Das heißt, eine solche Gruppe ist interessant,
weil ich dort einen unendlichen Ablauf produzieren kann,
der nur aus internen Aktionen besteht.
Das heißt, da könnte ein Problem hinterstecken.
Ein Fairness-Cluster ist Sache, auf die man vielleicht aufpassen muss.
Und der zweite Punkt sagt, habe ich vielleicht die Chance,
da nochmal rauszukommen aus diesem unendlichen Durchlauf,
aus diesem Kreis?
Dafür gibt es das Konzept des Ausgangs-Exit. Ja,
eine atomare Aktion oder atomare Aktion gefolgt von X,
die war eine Ausgang nennen für einen solchen Cluster,
C, falls.
Erstens, dieses A oder AX ein Summant ist,
was auf der rechten Seite vorkommt.
Für irgendeine Rekursionsvariablen C. Das ist genau das,
was einen Ausgang ausmacht. Ich könnte das A auch
wählen oder das AX
Damit würde ich rauskommen. Ich würde mich die Rekursion verlassen.
Im ersten Fall, wenn ich nur ein A mache,
ist das klar. Damit terminiert das Ganze.
Also springe ich sofort raus. Wenn ich AX mache,
dann führe ich zwar eine atomare Aktion A aus,
aber dann ist zu fordern, dass dieses A eine Aktion ist,
die nicht intern ist.
Also eine sichtbare Aktion ist. Da passiert also tatsächlich mal
was. Variante 1. Oder ich springe zu einer Variable X,
die gar nicht problematisch ist, also nicht in diesem Cluster liegt.
Also eine Variable, die eh sich brav verhält und
keine teuflischen Kreisläufe beinhaltet
Dann machen wir da mal ein Beispiel zu zu so einer Gruppe.
Wir nehmen mal an, wir hätten so
ein Gleichungssystem und da haben wir so ein paar Variablen.
Und wenn ich dort gucke, X1 wird zu AX2 oder B1.
Und dann geht das immer so weiter bis zu XN,
ist A, X1. Also da fängt es wieder von vorn an, bis BN.
Und da sieht man schon, das Gleichungssystem kann,
wenn es das möchte, einen Ablauf produzieren,
wo ich von X1 mit einem ACX2 komme und immer so
weiter bis XN minus 1 von dort mit dem ACXN,
von XN wieder zurück auf A1,
mit lauter A-Schritten
Und wenn ich jetzt dummerweise den Abstraktionsoperator TOA davor setze,
dann weiß ich, ich kann einen Kreislauf produzieren,
der nur aus Tau-Aktionen besteht.
Von X1 komme ich zu X2 und wieder zurück zu X1.
Wenn das ein Petrin-Etz wäre, dann würde man sagen,
okay, das läuft hier durch die Variablen X1 X2 X3,
also N soll man hier 3 sein, läuft das einmal im Kreis.
Und diese Grünen-Transitionen sind die,
die mit dem Tau-Operator internalisiert werden,
also die sieht man dann nicht mehr
Und was jetzt passiert ist,
ich laufe da so munter durch und dann halt wieder zurück.
Ein kompletter Durchlauf durch das ganze System.
Und das sehe ich ja nicht, was da passiert.
Der Tauoperator ist davor und deswegen alle Aktionen sind still.
Das heißt, das System tut was, aber ich merke das nicht.
Und das ist das Problem. Und jetzt ist es gut,
wenn ich diese Gruppe habe, meine Fairness-Gruppe,
dann frage ich mich, komme ich aus diesem Kreislauf raus?
Und hier ist es sogar ganz brav.
Ich habe ja noch
meine Ausgänge
Ich habe sogar die Deluxe-Ausgänge. Ich komme an jedem Schritt
, egal welche Variable ich habe. Ich komme immer mit
einer B-Aktion, die nicht versteckt wird, raus.
Es gibt immer den Notausgang. Das sind im Petrinetz die Transitionen B-1,
B-2, B-3, die da außen drum liegen,
die mit F beschriftet sind, weil diese Transitionen fair schalten sollen.
Wenn ich für die fordere, dass es die faire Schalträge gilt,
dann sind die ja unendlich oft aktiviert.
Wenn das Netz den Kreis läuft, der unendlich ablaufen würde,
dann wird ja bei jedem XI immer mal eine Marke vorbeikommen.
Und das heißt, jede Transition BI wäre dann immer aktiviert.
Also nehmen wir mal B2, da kommt das Token ja
unendlich oft vorbei. Und die faire Schaltregel sagt,
wenn eine Transition unendlich oft aktiviert ist,
dann darf es nicht so sein, dass sie nur endlich oft schaltet.
So, das heißt, irgendwann schaltet sie mal.
Und wenn sie dann schaltet, dann habe ich ja den
Ausgang genommen und dann bin ich aus dem Teufelskreis raus.
Und das ist genau die Annahme. Wir glauben jetzt einfach,
dass es so ein Verhalten nicht geben kann.
Also irgendjemand sorgt schon dafür, entweder der Zufall,
Das heißt, es wird immer gewürfelt zwischen der Aktion A
und so einer Aktion B, was da gerade passieren soll.
Und irgendwann wird es halt unheimlich unwahrscheinlich,
dass das nicht passiert oder ein Skedular muss darauf aufpassen.
Aber das schieben wir jetzt raus. Wir sagen, das
muss einfach passieren. Irgendwann wird mal der Ausgang genommen.
Der ist ja da. Und wie er genommen wird,
interessiert uns nicht. Wir fordern das einfach. So,
und das Fordern heißt jetzt,
wir machen jetzt nicht einfach nur eine normale Appstraction,
sondern wir machen eine Färbeabstraktion
Und fordern einfach als Annahme, dass nicht immer,
unendlich oft wir in diesen Tauschschleifen gefangen bleiben,
sondern irgendwann kommen wir mal raus und machen eine richtige Aktion.
Das heißt, für dieses Beispiel wäre das, dass wir irgendwann mal ein BI ausführen. Das heißt,
wir fordern, dass die Abstraktion von A,
angewandt auf X1, wie sie Mila sein soll zu B1,
was der Ausgang ist, wenn ich ihn sofort nehme,
oder einem endlich oft initirierten Tau, Das heißt,
ich laufe dann irgendwie in diese Schleife rein, mache ganz viele Tauschschritte,
aber endlich viele und nehme irgendeinen der Ausgänge B1 bis BN.
Und ich muss nicht beliebig,
ich muss nicht diese endliche Anzahl von Taus schreiben,
denn die schnurren ja alle semantisch zu einem zusammen.
Deswegen steht da nur ein Tau davor. Zwei Alternativen,
ganz groß, entweder B1 sofort auszuführen. Da bin ich
sofort draußen, bin gar nicht erst in diesen Kreis gegangen.
Oder ich laufe da so ein bisschen drin rum und nach endlicher Zeit
gehe ich entweder bei API eins raus oder bei B2 oder,
oder,
oder BN
So, das sind alle möglichen Ausgänge, die auf der rechten Seite schieben.
Und diese Grundidee, die kodieren wir jetzt axomatisch.
Wir packen einfach ein neues Aktion hinzu. Wir sagen,
es gilt immer, wenn ich eine Variable X habe,
in so einer Fairness-Gruppe C mit internen Aktionen I,
und ich habe die Ausgänge V1, Y1 bis VM,
YM und W1 bis WN, dann gilt immer,
wenn ich da vorne einen V habe,
da brauche ich aber irgendwas,
weil ich ja initiale Verzweifungspissimulationen betrachte,
also rooted Brunching by Simulation
Und dann ein Tower-Operator mit dieser Index-Menge I betrachte,
bezüglich der Lösung von X,
dann ist das genauso wie V mit dem Tower-Operator auf V1,
Y1 bis VM, YM, diese ganzen Variablen,
die die Ausgänge haben, oder eben die direkten Ausgänge wie 1 bis WM.
Im Beispiel eben hatten wir nur die direkten Ausgänge,
B1 bis BN. Das heißt, wir hatten nur hier
einen Term, in dem
Ws vorkam
Im Allgemeinen Fall habe ich auch noch so Spezialausgänge,
V1, gefolgt von Lösung von Y1,
bis VM gefolgt von der Lösung von YNM.
Und das nehme ich jetzt einfach als Aktion hinzu. Das heißt,
ich fordere mehr, das heißt, das gilt auch nur,
wenn ich annehme, dass mein System sich tatsächlich fair verhält.
Aber diese Akzematisierung passt sehr gut dazu,
denn was man zeigen kann, ist,
wenn ich ACP,
ACPTA betrachte ich mit Abstraktion geschützter lineare Rekursion und Fairness-Regel
Also der Annahme,
dass ich nicht unendlich oft in solchen Durchläufen bleiben kann,
dann ist das korrekt und vollständig in Bezug auf initiale Verzweihungsvisionation.
Gut, also Fairness kriegen wir als Kurzform dadurch,
dass ich einfach noch eine Aktion hinzunehme.
Was kann man damit jetzt machen? Wir wollen uns das jetzt beispielhaften,
alles, was wir jetzt hatten,
in einem großen Beispiel angucken und das Beispiel ist,
dass Alternierbit-Protokoll.
Das Alternierbit-Protokoll,
was ist das
Das Alter-Nierbit-Protokoll ist so eine Situation,
die wir schon kennen, über Daten,
bei den Datenkanal A möchte jemand was senden und er möchte,
dass es beim Empfänger auf dem Kanal C wieder rauskommt.
Und dazwischen haben wir so zwei Hilfskanäle,
Sender und Empfänger, kommunizieren auf so einem technischen Zwischenmedium,
also auf den Kanälen B und dann gibt es noch einen Rückkanal D.
Und die Kapazität dieses Kanals soll jetzt eins betragen,
das heißt, sobald A gesendet hat, Muss er erst warten,
bis das Datum bei C ausgeliefert wird.
Erst dann kann wieder ein neues Datum von A akzeptiert werden.
Das heißt, zwischen linker Seite und ganz rechter Seite zwischen
A und C habe ich nur einen Puffer der Größe Eins.
So, woran sieht man das? Das kann man jetzt
an der Gleichungsspezifikation sehen. Da steht mich,
ich spezifiziere das Folgendes, das ganze Verhalten,
das ich gern hätte, ist Folgendes. Ja,
ich habe in den gewünschten Prozess X und der fällt sich so,
der kann jetzt verschiedene Daten aus einer Menge Groß-Delta senden.
Deswegen habe ich eine große Summe, eine Menge von Alternativen.
Und die sendet er, also erstmal wird auf A,
was entgegengenommen, dieses Datum, D nämlich,
dann soll es bei C ausgeliefert werden, wird also da losgesendet.
Und nachdem das einmal passiert ist,
sind wir wieder am Ausgangszustand X. Das heißt,
wieder die Spezifikation für einen Puffer der Größe 1,
nur dass jetzt explizit gesagt wird,
dass sich verschiedene Daten D senden kann
Und jetzt suche ich dafür eine Lösung. Ja, ich suche eine Implementation,
die die Eigenschaft hat, davon eine Lösung zu sein.
Das gewünschte Verhalten ist sehr einfach. Man beachte bitte,
es sagt nur etwas über den Kanal A und den Kanal C aus.
Der Kanal B und D, die beiden kommen nicht vor,
denn die gehören auch zur Implementationsseite.
Ja, die wissen, die sind technisch, sind die da.
Aber eigentlich interessiert uns nicht, wie das gemacht wird.
So, das kommt jetzt erst durchs Protokoll rein.
Das Alternierbit-Protokoll sagt jetzt, okay,
wie kann ich das sicherstellen, dass dieses Verhalten gewährleistet wird,
wenn dieser Kanal B
fehlerhaft ist
Wir nehmen also an, wir haben einen störanfälligen Kanal B.
Und das ist das Problem. Und die Aufgabe des Protokolls
ist es jetzt, dafür zu sorgen,
dass sich durch Wiederholung von Sendeaktionen diese Störung kompensieren kann.
Also ich sende im Zweifelsfall immer wieder.
Woran merke ich jetzt, dass ich nochmal senden muss?
Dafür gibt es einen Hilfsbit. Der Sender fügt jedem Datenelement
ein Bit hinzu, 0 oder 1. Und jetzt passiert Folgendes,
wenn der Empfänger das Datenelement korrekt erhalten hat,
Das merkt er, ob eine Störung vorlag,
dann sendet er genau dieses Bit wieder über den ebenfalls störenfälligen Kanal D zurück.
Er quittiert also das Bit. Kann auch schief gehen.
Falls es aber eine Störung gab, was macht er dann?
Dann sendet er das Bit der letzten Runde zurück.
Also das Bit, das er beim letzten Mal als irgendwas
durchbekommen ist, bekommen hat. So,
und der Sender versucht jetzt so lange zu senden,
solange er nicht das Bit B bekommt,
das er gerne als Quittung haben möchte.
Er sendet was hin mit einem Bit
Und er wartet jetzt auf die Quittung mit genau diesem Bit-B.
Erst dann, wenn er dieses wieder gesehen hat,
so lange sendet erneut. Erst wenn das gekommen ist,
dann sendet er das nächste Datenelement mit dem Komplementärbit oder dem Alternativ-Bit.
Deswegen Alternativ-Bit-Protokoll. Ja, also in der ersten,
die nächste Runde wird dann gestartet, aber mit dem Bit 1-B. Ja,
und das macht er wieder so lange,
bis er 1 minus B als Quittung erhält.
Dieses Protokoll ist also dazu da zu erkennen,
ob es eine Störung gab und auf beiden Kanälen
einen Übertragungsfehler versucht er
dadurch zu kompensieren
Gut. Wie spezifiziert man das jetzt? Also dieses Verhalten
kann ich in Thermform gießen? Ich spezifiziere erst mal
den Sender und der will das Ganze senden und er hat
gerade das Bit B am Wickel.
So, und was gibt es da jetzt? Da gibt es einmal
so drei Therme. Also es sind jetzt Abkürzungen für Therme.
Und der erste Senden mit Bit B ist ein Therm,
der sagt, okay, ich lese jetzt vom Kanal A
was, irgendein Datum D. Da steht eine große Summe davor,
also irgendein Datum D. Und dann übertrage ich dieses Datum?
Dafür gibt es dann den neuen Thermen Tee in DexDB.
Dieses Datum mit dem BitB gesendet. Gehen wir in die zweite Zeile.
Dort steht jetzt, okay, da gibt es jetzt zwei Möglichkeiten.
Entweder, ich bekomme irgendwann was hin,
also ich sende D tatsächlich mit diesem Bit,
das wäre der Fall, dass keine Störung vorliegt.
Oder ich sende auf B, aber das Ganze wird gestört.
Also ich übertrage das Datum Bottom,
was für einen Fehler
falsch steht
So nachdem ich irgendwie mal eine Nachricht abgesetzt habe,
entweder schön und gut oder gestört,
verhalte ich mich wie der Zustand UDB und da mache ich folgendes,
ich warte jetzt auf die Quittung.
Ich warte also darauf, dass auf dem Rückkanal D
mein Bit B wieder zurückkommt und dann gehe ich wieder zurück
in den Sendezustand, allerdings mit dem komplementären Bit 1-B.
Also dieser Thermenvolk dann und die Alternative dazu ist,
ich bekomme irgendwie ein Fehler signalisiert. Wenn ein Fehler signalisiert wird,
dann bekomme ich auf dem Kanal D entweder das falsche Bit,
ja, warum auch immer, der mir jetzt gerade das falsche Bit,
vielleicht hat er das gerade nicht bekommen und sendet da noch was.
Oder die Nachricht wird gestört. Ja,
das falsche Bit kann zum Beispiel passieren, wenn irgendwie die Nachricht
gar nicht angekommen ist bei ihm und er es nicht merkt,
dann sendet er noch die andere Quittung.
Gut, aber beide Fälle sind problematisch,
dann muss ich nochmal von vorne starten und muss nochmal in
den Transmissionsmodus TDB gehen,
also wieder von vorne starten
So ähnlich sieht das auf der Empfängerseite aus. Der will jetzt
was empfangen. Also der startet irgend über Irr eine große
Summe über die Daten D und dann eine große Summe, geschweifte Klammer.
Da passiert mich Folgendes. Entweder auf dem Kanal B kommt
ganz toll die Daten D richtig an mit dem richtigen Bit.
Dann kann ich sie sofort bei C ausliefern und gehe dann
in den Zustand Kube. Das wäre also das,
was schön ist. Da muss ich nur noch
die Quittierung nämlich machen
Oder? Alternative, was passieren kann.
Ich bekomme ein Datum, aber mit den Komplementären.
Ja, und dann quittiere ich das komplementäre Bit.
Oder der schlimme Fall, es hat eine Störung gegeben auf Kanal
B. Dann muss ich auch eins minus B quittieren. Das heißt,
bei einer Störung quittiere ich einfach mit dem anderen Bit,
um zu signalisieren, es hat eine Störung gegeben.
Irgendwie ein Fehlerfall
Und dequitierend, QB ist so definiert,
da wird auf dem Rückkanal D was gesendet.
Hoffentlich das Bit B. Es kann aber auch sein,
dass es auf dem Kanal denen eine Störung gab.
Dann sende ich SD von Bottom. Ja, dann habe ich
auf dem Rückkanal auch einen Fehler. Was ich dann aber mache,
dann gehe ich wieder in die nächste Runde und warte,
bin also wieder im Receive-Zustand, allerdings jetzt mit dem 1-B-B-Bit komplementär.
Mal ein Beispiel Durchlauf, wenn ich hier starte,
ich empfange also auf Kanal A irgendwie
ein Datum
Nehmen wir mal an, wir starten initial mit BitB gleich null.
Was mache ich dann? Ich sende hier auf dem Kanal
B das Datum D und das aktuelle Bit null.
Dann kommt das da, dann bin ich im Transmissionsmodus
und gehe dann hinterher in den Wartezustand.
Ich warte jetzt darauf, dass die Quittung irgendwann kommt.
Also bin im Zustand UD0. Jetzt kommt das auf der
anderen Seite an bei B, als RB D0.
Also es ist erfolgreich übertragen worden. Dann wird das ausgeliefert
, dieses Bit auf Kanal
Ja, und jetzt muss das jetzt noch zurücklaufen und quittiert
werden. Was aber auch alternativ passieren kann, ist,
beim Senden geschieht der Fehler,
also irgendwo ist die Störung auf B und ich sende Bottom.
Dann kommt das auch, als dieser Fehlerfall Bottom auf der Empfängerseite an.
Und was der macht, ist jetzt, das zu quittieren.
Also er quittiert jetzt mit dem anderen Bit.
Also das, was er sich zuletzt gemerkt hat.
Und da der im Zustand auch null startet,
sendet er jetzt eine Eins zurück.
Das andere Bit
Und wenn man Glück hat, kommt das tatsächlich auch an.
Und daran merkt denn der Sender, dass ein Fehler da war,
denn er erwartet, dass eine Quittung null zurückkommt.
Jetzt kommt aber eine Quittung 1 zurück. Ja,
und wo der Fehler war, das weiß man jetzt nicht so genau,
aber auf jeden Fall liegt ein Fehler vor,
wenn das falsche Bit vorkommt.
Und in diesem Fall, ja, der Fehlerfall führt ja dazu,
dass nicht wieder ein Neustart stattfindet,
sondern dann gehe ich erneut in den Transmissionsmodus und versuche nochmal zu senden.
Und offensichtlich ist es ein Verhalten eines Systems,
das nur mit Fairness funktionieren kann
Ja, denn der Transmissionsmodus TDB,
wenn ich da unendlich oft mich dafür entscheiden würde,
immer eine Störung zu haben, da hätte ich ein Problem,
dann komme ich da nie wieder raus.
Dann wird zwar ganz viel passieren,
aber ich habe nur Kommunikation auf den Kanälen B und D.
Da kommt nie bei dem Kanal C was raus. Von daher ist,
damit das überhaupt klappt, die Fairness-Annahme wichtig,
dass also beim TDB diese Alternative zwischen ein richtiges Datum
senden oder eine Störung senden,
dass die irgendwann mal auch zugunsten des richtigen Senden von D
aufgelöst wird
Da schlägt Fairness zu. Man kann sich das Ganze auch als Zustandsdiagramm aufmalen,
dann habe ich, wenn ich die Lösung betrachte,
tatsächlich ein paar Zustände noch halbwegs erträglich viele, hier eins bis zwölf.
Gut. Geht ja noch. Was aber auch im Umkehrschluss heißt,
dieses System wird ja beschrieben durch zwölf Rekursionsvariablen, die aufeinander bezogen sind.
Wenn ich die löse, diese ganzen zwölf Variablen,
die wir eben hatten, also wollen wir noch zurückgehen,
Denn haben wir ja für SB, das sind zwei,
TDB, auch zwei UDB,
auch zwei sind das also für den Sender, schon sechs Variablen.
Und für den Empfänger sind es dann auch nochmal,
sieht man hier RB, QB, auch nochmal eine ganze Menge Variablen,
auch mit zwei Bits, also vier.
Das macht also schon mal die zehn Dinger hier.
Und was machen wir jetzt? Wir wollen jetzt zeigen,
wir hatten ja die Spezifikation E. E sagte,
ich hätte gern ein Verhalten X,
das sich so verhält, will bei A was einlesen,
also Reed A machen und das gleiche Datum dann bei C ausliefern sind,
um mich dann wieder VX-Verhalten.
Also genau das Verhalten eines Puffers der Kapazität 1,
der zwischen A und C sendet.
Und meine Implementation soll jetzt sein, taui,
also ich verdecke alles, was bei B und D passiert.
Ich verdecke mit einer Menge Haaraktionen, die nicht einzeln stattfinden sollen.
Also ich erzwinge Synchronisation zwischen Sender und Empfänger und sage dann,
okay, und ich starte linke Seite Der Sender im Zustand,
Bitt ist gleich null und der Empfänger der Receiver,
der startet auch im Zustand B gleich null.
Das ist also meine Implementation des Ganzen Systems. Und ich
muss jetzt zeigen, das steht in den orangefarbenen Kasten,
dass meine Implementation eine Lösung der rekrusiven Spezifikation XRE ist.
Das heißt, X, die Lösung von X in dieser Spezifikation,
E ist taui, verdecken von R0 parallel S nun
Und als Korrektheitsbeweis kann man jetzt länglichst ableiten, dass dieser Therm-Tow-I verdecken,
H-R-0-S-0, gleich der Summe, über alle D,
Reep.de, Cent D, und dann das Gleiche nochmal verdecken.
Ja, null S-0 ist. Das heißt,
auf beiden Seiten so ein Thermen davor kommt und dazwischen,
ja, vor der Summe auf der rechten Seite haben wir noch Watt.
Und das ist genau das Muster, dass meine Gleichungsspezifikation eh hat.
Das heißt, wenn ich diese Gleichung da unten ableiten kann,
weiß ich sofort, Mensch, diese Gleichung sagt mir,
dass der Therm in diesem kleinen orangehabenen Kasten,
dass das die Lösung von X sein muss.
Das heißt, diese Gleichung einmal RSP angewendet,
sagt mir dann, ich habe jetzt eine Lösung.
Gut, was man da machen muss, geht über viele Seiten.
Wir gucken uns, dass man mehr so von der Stimmung her an.
Erstmal leitet man ab, wie die Parallelität von R0NS nur sich verhält.
Und da kriegt man raus, auch Mensch,
über Delta wird wieder summiert und dann kriege ich da einen schönen langen Ausdruck.
Ja, mehrere in der geschweiften Klammer,
wo irgendwas gesendet wird oder ein Fehlerfall wird gesendet
Oder, oder. Und wenn man da noch den Verdeckungsoperator
darauf anwendet, dann kann man das noch ein bisschen vereinfachen.
Dann sieht man, Mensch, das fällt sich schon mal so,
dass wenigstens als einzige initiale Aktion möglich ist, etwas bei A zu lesen.
Ist klar, wir wollen das nicht haben, dass,
was hier auch noch steht,
also im grünen Kasten sieht man noch,
als erste Aktion ist RB möglich.
Das heißt, ohne den Verdeckungsoperator ist es potenziell möglich,
sofort auf Kanal B etwas zu senden. Das wollen wir
natürlich nicht haben. Wir wollen natürlich erst auf A etwas
einlesen, bevor wir auf B was senden
Gut, also dafür ist der Verdeckungsopperator gut,
der erzwingt nämlich, dass auf Kanal B etwas synchron geschehen muss.
Und das sieht man an den beiden Gleichungen,
weil man darf ganz viel einsetzt und umformt über ein paar Zeilen,
dann sieht man R0 parallel S0,
wird dann irgendwann zu der etwas länglichen Summe da unten,
kann man sich da durcharbeiten,
durch die ganzen Therme und landet tatsächlich bei dem,
was im grünen Kasten stand.
Ein länglicher Therm, von dem er erstmal gar nicht
so genau vielleicht wissen wollen, was er bedeutet.
Und wenn wir da schon sind,
dann kann man da noch die Verdeckungsoperation darauf anwenden,
dann fallen eben die ersten Therme weg,
wo auf B als erstes eine Aktion ausgeführt wird.
Das heißt, es bleibt nur noch die letzte Summe übrig.
Ja, der orangefarbene Custom ist einfach der letzte Summant mit
der Summe über alle D. Das heißt, man kann da
schon ein bisschen ausrechnen, wie sich das zuerst verhält.
Es macht also eine A-Aktion. Und dann geht es weiter,
dann komme ich zum Transmissionsmodus, D0, parallel zu,
naja, auf der Empfängerseite hat sich nichts verändert,
das ist immer noch bei
Und deswegen rechnet man weiter mit diesem Therm,
was wir gerade ausgerechnet haben, war wieder ein Übergang,
aber wenn ich das weiter ausrechne, ja,
kann ich auch Transmissionen,
D-0 parallel zu R 0 ausrechnen und kann gucken,
was wird da alles besser,
wenn ich nur noch den Verdeckungsapparator drumherum packe und dann fallen wieder eine Menge Therme weg.
Und es bleibt der orangefarbene Kasten übrig.
Und da steht dann was drin von UD0 und einmal SCD Q0.
Also dafür muss ich jetzt wohl was ausrechnen. Und für
die untere Zeile, da steht was von UD 0 Q1.
Da muss ich wohl
auch weiterrechnen
Gut, wenn man das jetzt brav tut, Udin 0 Q1,
das kann ich vereinfachen. Und geht das so weiter,
udin 0 SC Q0, ja, kann ich auch vereinfachen.
Q0, Udin 0 kommt dann in dem Term wieder vor.
Kann ich auch vereinfachen. Dann bin ich bei R1 S1 und R1 TD
0. Kann ich auch vereinfachen, rechne ich auch kleiner.
Und ich rechne und rechne, ja, diese ganzen Therme
kann ich alles brav ausrechnen, was das ist.
Man hält so gewisse Übergänge durch dieses ganze Zustandsdiagramm,
alles ausgerechnet
Und hat dann zum Schluss für die linearen Spezifikationen,
sieht man denn bei den zwölf Gleichungen, ist schon mal verdecken,
in R0S-0 ist gleich der Lösung von X1, in dieser zwölfffachen Spezifikation.
Also das sind hier zwölf Gleichungen, die im Wesentlichen diesem
Transitionsdiagramm entsprechen. Und da sind wir schon ziemlich weit,
wir haben ja schon verdeckt, jetzt fehlt nur noch der Tau-Operator,
den müssen wir also auch noch dazu basteln.
Und wenn wir jetzt den Tau-Operator auf X1,
auf die Lösung von X1 loslassen,
Denn vereinfacht sich das auch ein bisschen, dann kommt ein Therm raus,
hinten der mit Y 1 was zu tun hat, nach vielen Umrechnungsschritten.
Und das ist ein Therm, der wieder auf X1 zurückführt.
Also die beiden zusammensetzen, kann ich jetzt einsetzen.
Wenn ich das mache, dann bekomme ich endlich raus,
dass Tau, also Verdecken der internen Aktionen von X1,
das Gleiche ist wie die Lösung von Z in der Spezifikation erst auf A lesen,
dann auf C schreiben, dann wieder Z sein.
Also genau das, was ich beweisen wollte, nämlich Gleichung herleiten,
dass mein Wunschtherm Taui und die Lösung von X1,
das hatten wir vorhin gezeigt, ist gerade Verdecken von H-Aktionen in R0S0,
ist gleich dieser großen Summe von Alternativen lesen auf A,
schreiben auf C und wieder dem gleichen Therm,
der auf der linken Seite steht.
Also genau das Muster, links steht X und rechts steht X. Gut,
damit haben wir jetzt eine ganze Menge getan,
hatten mal so ein größeres Beispiel, wenn ihr wollt,
könnt ihr euch das gedruckte durch Skript mal anschauen,
aber das ersparen wir uns jetzt mal als Gruppenübung,
das ist nicht
so spannend
Und was ich jetzt machen möchte, ist folgendes,
eine Überlegung, dass wir bislang Parallelität nicht so beschrieben haben,
wie wir es eigentlich so richtig gewollt hätten.
Hätten wir das richtig ausdrücken können, hätten wir Parallelität vielleicht nicht so ausgedrückt,
dass wir sagen, zwei Prozesse parallel bedeutet, naja,
entweder macht der eine eine Aktion oder der andere.
Wenn ich mir ein verteiltes System mal so aus dem Bauchgefühl heraus vorstelle,
also einen Rechner hier auf dem Campus, einen Rechner,
ein Stelling, und ich würde sagen,
die verschalte ich jetzt, nachdem ich sie modelliert habe,
mit einem Parallelitätsopperator, Und dann schicken die Nachrichtenpakete los.
Und dann sagt mir die Semantik, das ist,
also entweder wird in Stelling erst was gesendet oder erst auf dem Campus oder umgekehrt.
Da kann man sich doch denken, wieso ist das eine Reihenfolge?
Kann ich nicht so mehr oder weniger gleichzeitig auf beiden enden lossenden?
Also Gleichzeitigkeit ist da physikalisch problematisch, aber zumindest ist ja nicht einzusehen,
dass ich erst warten muss, dass Stelling gesendet hat,
aus Vogelperspektive, um dann am Campus was zu senden.
Also es macht eigentlich gar keinen Sinn, Von dem,
was man so haben möchte, zu sagen,
erst das eine und dann das andere oder umgekehrt.
Und wenn man da hinkommen will, dann muss man
das irgendwie so formulieren, dass nicht alles geordnet ist.
Also nicht mehr sowas sagen muss, wie erst A,
dann B oder umgekehrt, sondern dass ich sowas sagen kann,
nee, A und B sind nicht angeordnet.
Ich weiß nicht, welches zuerst kommt. Und wenn man
so eine Semantik entwickeln will, das heißt,
im Parsial Order-Symatik.
Da wollen wir
mal reingucken
So, Parsual Order Semantik oder Parsual Order Semantics. Ja,
wenn wir Prozesse mal mit dem Ordnungsbegriff versehen wollen,
dann gucken wir uns das mal am Beispiel an.
Wir haben ja so ein paar Aktionen. Zweifel hatten wir
schon mal, X kriegt den Wert 3,
Y den Wert 4 und Z ist dann die Summe von X und Y.
Wir haben also Aktionen, die sind gekennzeichnet durch so einen Bezeichner,
Namen C, also das sind die Aktionen,
die haben Namen und die Wirkung, ja, das,
was ich mir darunter vorstelle, was eine Zuweisung halt macht.
So ein Programm startet irgendwo und ist irgendwann zu Ende
Und wird dann so sequentiell ausgeführt. So kann ich das machen
. Was habe ich also? Ich habe folgende Eigenschaften.
Ich weiß also erst mal, Handlungen sind durch ihre Wirkung beschreibbar.
Ich muss nicht so genau wissen, wie das jetzt implementiert wird
auf der Samler-Ebene. Ich weiß, hinterher hat X den Wert
3. Dann weiß ich auch, sie sind unteilbar.
Ich stelle mir das so vor, auf der richtigen Maschine
ist die Zuweisung atomar. Kleiner will ich mich nicht mehr
nachgucken. Das soll jetzt eine Aktion sein.
Handlungen sollen unteilbar sein
Und so eine atomare Operation, die wird irgendwie ausgeführt.
Und wenn ich jetzt die Prozesse in der Anordnung so betrachte,
wie da oben, dann sehe ich das ja erst A,
dann B, dann C. Das heißt,
ich habe nur eine totale Ordnung auf diesen Aktionen A,
B, C. Ich habe also einen sequenziell operierenden Prozess,
was auch total in Ordnung ist,
wenn ich einen sequenziell arbeitenden Prozessor habe,
der kann eh nichts anderes tun.
So, wie sieht das jetzt aus? Wenn ich so
einen Prozess mir angucke und ich stelle mal fest,
Mensch, diese beiden Aktionen A und B,
die sind ja eigentlich unabhängig
Voneinander. Denn beim einen wird der Variablen X was zugewiesen,
beim anderen der Variable Y. Es gibt jetzt keinen Grund,
das irgendwie zusammenzupacken. Und die Grundidee, wenn ich sage,
ich packe das nicht zusammen, ist okay,
ich stelle mir vor, ich könnte jetzt zwei Prozesse haben.
Und der eine Prozess, nennen wir mal S,
der macht die Aktion A,
geht dann in Zwischenzustand S1 und mit C1 geht er zu S2.
Und ein zweiter Prozess, der ist für Beet zuständig,
Geht inzwischen Zustand R1 und macht dann die Aktion C2. C1 und C2 gibt es beide nicht.
Die sind nur dafür da, dass ich eine Synchronisationsoperation habe.
C1 und C2, sodass deren Kommunikation gleich meine Aktion C ist.
Also ich synchronisiere die beiden Aktionen. So,
wenn ich mir jetzt diese beiden Transitionssysteme als Produkt vorstelle,
also Paare von Zuständen bilde, was bekomme ich dann?
Dann bekomme ich ein solches System, das zusammenstartet,
das in S0R0,
kann dann entweder A oder B machen und dann das andere
und dann lande ich bei S1
Und dann mache ich, wenn ich in beiden Zwischenzuständen angekommen bin,
die gemeinsame synchrone Aktion 10. Das Synchronisierte ist diese eine Aktion,
die dann in den Finalzustand S2R2 überführt.
Sodass das eine, was immer viel spannender ist,
ist die Tatsache, dass sich hier die Möglichkeit habe,
A oder B auszuführen.
Und es ist nicht festgelegt, in welcher Reihenfolge.
Und diesem Produktsystem wird das dazu,
dass ich hier so
ein großes Rechteck habe
Oben lang gehen, ESA machen, runter B machen.
Oder ESB machen und dann A machen.
Ich habe also hier so ein wahlweisweise aufgespanntes Etwas,
da kann ich in irgendeiner Richtung rumgehen.
Und das ist jetzt ein bisschen blöd,
in dieser Formulierung muss ich also immer noch sagen,
dass es in der Reihenfolge zwischen A und B gibt.
Bislang habe ich nur gesagt, naja, jede tut's.
Ich sage nicht mehr SA dann B, so wie da oben.
In dem Ausgangsbeispiel war das ja fest verdrahtet,
dass ich erst A mache,
dann B mache,
dann C machen
In dieser Darstellung bin ich ein bisschen weitergekommen.
Ich sage, naja, es spielt keine Rolle.
Du kannst RSA machen und dann B oder RSB und dann A.
Aber es muss trotzdem so sein,
in dieser Darstellung muss ich bei S0 und R0 mich sofort entscheiden,
in welcher Reihenfolge ich das mache.
Dieser Semantik habe ich also immer noch eine Ordnung drin.
Ich habe jetzt gewissermaßen nur alle Alternativen, die ich sequenziell
ausführen kann. Alle sequenziellen Prozesse gleichzeitig in diesem System.
Genauso habe ich das auch im Prozess Algebra gemacht
Alle Alternativensequenzialisierungen waren da im Wesentlichen erlaubt. Und der nette
Gegensatz wäre doch, wenn ich nicht eine totale Ordnung hätte,
sondern eine Partiellordnung, wo ich nicht sequenzielle Prozesse beschreibe.
Das heißt, Prozesse, wo zeitlich oder besser kausal unabhängige
Handlungen möglich sind. Und was bietet sich da an?
Ja, für kausale Unabhängigkeit haben wir schon was kennengelernt.
Da haben wir Petrinnetze kennengelernt. Und wenn ich das da oben,
diese Unabhängigkeit von A und B als Petrinnetz darstellen will,
dann kann ich das so machen.
Ich sage, ich habe zwei Startpunkte
Und beim oberen Zweig, da führe ich A aus,
beim unteren B. Und wenn beides fertig ist,
dann liegen die Marken da ja zwei Marken in der Mitte
und dann kann ich C ausführen.
Und was jetzt ausgeführt wird, in welcher Reihenfolge,
das ist überhaupt nicht festgelegt, sondern ich stelle mir das so vor,
naja, irgendwas passiert, vielleicht das und das.
Das wird aber gewissermaßen, das muss ich nicht in
diese Mantik packen, das ist erst später der Fall.
Es gibt keine irgendwie geartete Codierung als Beziehung zwischen A und B,
wird einfach nur gesagt,
C findet auf jeden Fall nach A und nach B statt
Aber es gibt keine Beziehung zwischen A, B untereinander.
Und dieses Fehlen einer Beziehung zwischen A und B,
das ist genau die kausale Unabhängigkeit. Bei der Sequenzialisierung eben
im synchronen Produkt hatten wir A vor B und BVA,
beide Möglichkeiten waren da gegeben. Und hier sagen wir,
es gibt keine fest definierte Beziehung zwischen den beiden.
So, und das ist die partielle Ordnung.
Jetzt kann man sich nochmal angucken,
was ist da nochmal der Unterschied zwischen der sogenannten Inter-Living-Semantik und
der Parsial-Order-Semantik
Ja, ich kann dieses Netz nehmen und ich kann ihm,
und das haben wir auch bislang nur gemacht, so eine Aktionsfolgen-Semantik geben.
Ich kann sagen, wie kann dieses Netz schalten?
Naja, da kann ich die Schaltfolgen,
die Transitionsfolgen betrachten, die da möglich sind.
Und auch hier sind nur die Folgen ABC und BAC möglich.
Oder ich kann jetzt anschauen, dieser Prozess,
der da beschrieben wird, der ist ja irgendwie eine Ordnungbeziehung.
Und das kann ich als Striktordnung modellieren. Ja,
und dieser Graf deutet an,
A muss vor C kommen und B muss vor C kommen.
Es gibt aber keinerlei Beziehung zwischen A und B
So, und die linke Seite, das ist das,
was man als Inter-Leaving-Semantik, Folge-Semantik bezeichnet, da sagt man,
wenn A und B keine Kausalbeziehung haben,
dann ist da jegliche Permutation möglich.
Das heißt, alle Aktionsfolgen erlaube ich.
Und die rechte Seite, das ist dann die Parsial-Order-Semantik,
PO-Semantik, wo ich partielle Ordnung oder Striktordnung betrachte.
Und mathematisch gesehen ist die Parsial-Order-Semantik die elegantere.
Sie ist Dichte an dem, was ich haben möchte.
Ich will ausdrücken können im Modell, dass es keine Beziehung
zwischen A und B gibt. Und dann ist es blöd,
wenn mich meine Programmiersprache oder meine Spezifikationssprache, zum Beispiel Prozessalgebracht,
dazu zwingt, das so zu betrachten, als wären alle Interleaivings damit gemeint.
Und für manche ist es eben so,
dass sie sagen, nein, es ist nicht so.
Das Fehlen von Kausalität bedeutet nicht nur, dass alle Interleaivings möglich sind.
Das ist eine Folge. Aber ein Prozess, in dem
alle Interleaivings möglich sind, hat nicht immer die Eigenschaft,
dass die Aktionen kausal unabhängig sind. Also sprich,
wenn nicht eine Situation wie auf der rechten Seite habe,
eine solche Striktordnung, dann weiß ich,
aha, beide Anordnung, ABC und BAC sind möglich.
Das folgt sofort, wenn keine Kausalbeziehung, wie auf der rechten Seite dargestellt,
existiert, dann kann ich das irgendwie anordnen.
Nun ist es aber nicht so, wenn ich weiß,
ich habe in meinem System die Aktionsfolgen A, B,
C und B-A-C, dass ich dann sofort daraus schließen kann,
dass zwischen A, B und B-A keinerlei Kausalbeziehung besteht.
Das könnte zum Beispiel deswegen sein,
dass A und B im wechselseitigen Ausfluss stehen,
das könnte ja auch sein
Dann wäre mich nur möglich, dass erst ab und dann
B auftritt oder erst B und dann an.
Nehmen wir mal an, das sind unsere beide Rennwagen.
A bedeutet, der erste kommt erst durch den kritischen Abschnitt.
Und B heißt der zweite, kommt durch den kritischen Abschnitt.
Denn bedeutet A, B, dass der Rennwagen A führt
jetzt im Rennen. Und B-A führt, er bedeutet,
dass der Rennwagen B führt. Und offensichtlich ist es nicht so,
dass es eine kausale Unabhängigkeit zwischen diesen beiden Rennautos besteht.
Die streiten sich da gerade um die Ressource,
in diesen Engpass fahren zu dürfen
Das heißt, allein dadurch,
dass sich jede Permutation beobachten kann in meinem System,
darf ich leider noch nicht auf kausale Unabhängigkeit schließen.
So, in diesem Sinne ist also die Inter-Leaving-Semantik einfach schwächer.
Ich kann aus diesen Aktionsfolgen nicht mehr die kausale Unabhängigkeit rausholen.
Und wenn man das möchte, dann hat man die einzige Möglichkeit,
die dann noch übrig bleibt, ist Parsial Order Semantics zu gehen.
Die hat natürlich den Nachteil,
die ist nicht mehr ganz so glatt und einfach runterschreibbar,
da muss man noch ein bisschen was hinzufügen.
Zum Beispiel muss man erstmal definieren,
was ist eine partielle Ordnung
Und das ist,
wenn ich mir eine Aktionsmenge A vorstelle oder eine beliebige Menge A,
dann ist eine partielle Ordnung, eine Relation auf A,
also eine Teilmenge von A-Kreuz A.
Eine Menge von Paaren. Und es müssen Eigenschaften gelten,
damit A die Grundmenge A mit dieser Relation R eine partielle Ordnung bildet.
Die erste Eigenschaft ist, die partielle Ordnung ist immer reflexiv.
Das heißt, A steht immer mit A in Relation.
Ich habe die Eigenschaft der Antisemitrie
Das heißt,
wenn A und B in Relation stehen und B und A,
dann ist die einzige Möglichkeit, dass das möglich ist,
nur der Fall, dass sie sagt, A,
ist gleich B. Das ist,
wenn man bei partiellen Ordnungen in sowas wie kleiner gleich denkt,
auch logisch, A,
kleiner gleich B und B, kleiner gleich A. Das kann
nur dann der Fall sein, wenn A gleich B ist.
Zwei ungleiche Elemente können nicht kleiner sein. Und größer, gleichzeitig.
Und Transitivität ist etwas, woran wir uns auch gewöhnt haben,
also wenn A, kleiner B ist und B,
kleiner C, dann ist A, kleiner C.
Das sind die Eigenschaften
Und oftmals, wenn das endlich ist, die Grundmenge A,
dann kann man das auch als Diagramm malen.
Oder man kann die Relation auch aufmalen durch die Menge aller Paare,
die dazugehören. Im endlichen Fall geht auch das immer.
Beim solchen Diagramm wird man schon mal sehen,
es sind überall diese Öhrchen an den Kanten.
Denn die Relation ist ja eine partielle Ordnung, deswegen reflexiv.
Das heißt, an jedem Knoten gibt es eine Schleife zu sich selbst.
Und was es nicht geben kann, ist, aufgrund der Attentisemitrie,
es ist nicht möglich, dass es Zyklen gibt.
Denn wenn ich beispielsweise von B nach A komme,
Und von A nach C, wenn ich jetzt noch die Möglichkeit hätte,
von C wieder nach A zu kommen.
Ich hatte die Möglichkeit, dann von B nach C
zu kommen und von 10 nach B wieder zurück.
Das wird aber gerade in dem zweiten Punkt widersprechen,
wenn ich das denn einsetze von B nach C und von
10 nach B wieder zurückzukommen, dann weiß ich ja,
dass beide Knoten gleich sein sollen.
Das werden sie mal nicht. B und C sind verschiedene Knoten.
Das heißt, diesen Knoten darf es gerade nicht gehen.
Und er ist recht, wenn ich von B nach A komme,
darfst du auch das Recht nicht den Knoten direkt zurückgeben
Also von A nach B zurück darf es auch nicht sein.
Das ist eine partielle Ordnung. Und bei einer partiellen Ordnung
kann ich es immer schaffen, dass ich das so aufzeichne,
zumindest im endlichen Fall kann man das machen,
dass ich irgendwo die kleinsten Elemente habe.
Auf der einen Seite, auf der anderen Seite die größten Elemente.
Und dann kann ich die schön ansortieren, alle,
die unvergleichlich sind auf einer Höhe. Und so, dass dann immer,
das ist in eine Richtung zu oder abnimmt, konsequent.
Hier ist das nicht ganz so gemalt, aber man mal guckt,
alle Pfeile, bis auf die Schleifen,
Haben die Tendenz von oben nach unten zu laufen?
Ja, ich könnte durch leichtes Schieben, also den Zehknoten
ein bisschen höher, wenn ich den höher setzen würde,
so auf die Mitte, dann hätte ich das geschafft.
Da hätte ich nämlich A, B, F und H,
die haben alle keinen Knoten, der kleiner ist.
C ist denn so einsam in der Mitte und D,
E und G sind dann die Knoten, die maximal sind.
Da gibt es nichts Größeres. Aber was man auch sieht,
D und G, die sind unvergleichlich.
Ja, das heißt, es gibt kein Maximum,
das Maximum existiert nicht,
es gibt nur maximale Elemente
Wenn zwischen denen keine Ordnungsbeziehung existiert, dann habe ich halt mehrere davon.
So, bei einer partiellen Ordnung ist jetzt der Gleichheitsfall auch möglich.
Da steht kleiner gleich. Das heißt, es ist immer
eine Kombination aus einer Anordnungsbeziehung und der Identität gleich.
Und was passiert, wenn ich das Gleiche jetzt streiche?
Wenn ich das gleich streiche, dann wird aus dem Ganzen,
das ist dann eine Striktordnung.
Kleiner ist eine Striktordnung. Und bei einer Striktordnung,
da muss die Reflexivität streichen
Es kann ja nicht mehr sein, den Gleichheitsfall will ich nicht mehr haben.
Also müssen alle A, Koma A Pärchen raus.
Ja, A, kann ich kleiner als A sein.
Echt kleiner geht nicht. So, das heißt,
eine Striktordnung ist immer irreflexiv, kein paar A, Koma A ist in der Relation.
So, transitiv soll sie weiterhin sein, das kleine Symbol,
das hätte ich gern transitiv. So,
wenn ich aber eine Relation habe, die transitiv ist,
also Punkt 3 erfüllt, dann habe ich dort den Fall A,
B, Und BC, und jetzt nehme ich mal,
mache ich mal den Spezialfall wie einen zweitens.
Also ich nehme A, B und B,
A. Transitivität würde denn ergeben, dass dann auch A,
Komma A in Relation ist.
Wir wissen aber, das kann nie der Fall sein.
Da das nie der Fall sein kann,
es wird also etwas Unmögliches eintreten, wenn ich den Fall hätte,
dass A-Komma B in Relation ist und B-Komma A in Relation steht.
Intuitiv klar, A,
kleiner B und B,
Kann zum Glück nie auftreten. Aber wenn es doch
möglich wäre, dann wird es irgendwie inkonsistent werden.
So, weil also diese Vorbedingungen in zweitens,
da steht nämlich genau das, nicht sein kann,
müssen wir das auch nicht mehr aufführen.
Es ist nie der Fall, dass A,
B in Relation und B, A in Relation steht.
Und weil das so ist, weil ich das nicht habe,
kann ich das auch streichen.
Bei einer Striktordnung ist Antisemetrie sofort gegeben. Gut,
kann ich einen Aspekt sparen. Und natürlich gibt es auch
da weiterhin keine Zyklen
Zyklenfrei ist das weiterhin. Und die zweite Sache kann ich eben,
das Rote kann ich jetzt streichen,
ihr habt nur noch die Bedingung erstens und drittens.
Zweitens ist implizit. Ja, jetzt weiß ich,
was eine Parzelle und eine Striktordnung ist.
Wie hängen die so ein bisschen zusammen? Was kann ich
da machen? Wenn ich eine partielle Ordnung habe,
kriege ich da immer eine strikte Ordnung raus?
Also wie in dem Beispiel eben, weil die strikte Ordnung
kriege ich leicht raus. Ich muss einfach nur die Schleifen wegnehmen.
Ich muss also nur aus der Relation R
die Identitätsrelation it
Die Identity rausnehmen, also eher ohne Idee nehmen.
Und was da rauskommt, ist die strikte Ordnung S.
Lass ihn nicht mehr arg, Komma A, B,
Komma B, all das ist nicht mehr drin.
Das heißt, aus einer partiellen Ordnung kriege ich
immer sofort durch Entfernen der Identität meine strikte Ordnung.
In der umgekehrten Richtung, da packe ich einfach die Identität hinzu.
So mache ich aus kleiner, kleiner gleich. Das heißt,
wenn ich eine Striktordnung S habe und ich vereinige es mit
der Identität, dann kriege ich eine partielle Ordnung.
Das heißt, die beiden sind eigentlich kaum zu unterscheiden
Das heißt, wann immer ich eine partielle Ordnung habe,
kriege ich eine Striktordnung, wenn ich eine Striktordnung habe,
kriege ich immer eine partielle Ordnung.
Das heißt, wann immer ihr eine Aussage seht,
wenn ich eine partielle Ordnung habe, dann gilt,
dann wisst ihr, naja, ungefähr müsst ihr leicht anpassen,
gilt das auch immer für die jeweils andere Ordnung.
So, das Nächste ist, wenn ich jetzt eine strikte
Ordnung habe, dann will ich manchmal die Präzedenzrelation haben.
So wie in diesem Diagramm, da sieht man,
da sind eine ganze Menge Dinge überflüssig.
Zum Beispiel sieht man da, ich komme ja ganz oben
von meinem Knoten
B zu A
und von A
Und Transitivität ergibt mir dann,
dass ich direkt von A nach C auch kommen muss.
Diese Kante muss da sein. So, wenn ich aber weiß,
die Kante BA und die Kante AC ist da,
dann kann ich mir doch diese Zusatzkante,
die da diagonal einmal drüberläuft, die kann ich mir doch nun sparen.
Die ist doch redundant. Die folgt dadurch, dass die
anderen beiden da sind. Und die Präzedenzrelation ist einfach die Relation,
die entsteht, wenn nicht all diese Redundanten erkannten, streiche.
Also alle Kanten, die ich rekonstruieren könnte, die nehme ich raus.
So, was da denn rauskommt, ist der Präzedenzgraf,
Da sieht man, diese ganzen Kanten,
die da jetzt fehlen, die kann ich offenbar rekonstruieren.
Das heißt, die eigentliche tragende,
das tragende Gerüst von dem Ganzen ist der untere Graf.
Alles andere kann ich durch eins, zwei,
drei Schritte auch erreichen. Wenn man etwas aufmalt,
dann wird man meistens diesen Präzedenzgrafen aufmalen und sagen,
okay, alles, was sich da doch transitiv ergibt,
das hätte ich gern.
So, wie kriegt man jetzt diesen Präzedenzgrafen oder wie
sieht der überhaupt aus? Das soll ein Graf sein,
der die Eigenschaft hat
Dass keine Kante indirekt als Komposition folgt, sondern dass sich nur die unmittelbaren Bezüge habe.
Und was heißt das unmittelbare Bezüge? Dazu brauche ich erstmal
das Konzept, das B direkter Nachfolger von A ist.
Ein direkter Nachfolger soll so definiert sein,
und das möchte ich mit kleiner,
mit so einem Punkt da drin notieren,
A ist direkt kleiner als B,
wenn A erstmal kleiner als B ist,
und es nicht der Fall ist,
dass es ein C gibt,
das dazwischen liegt,
also das A kleiner C wäre und C kleiner
Es gibt also kein Element C, das dazwischen A und
B liegt, dann sind A und B direkt benachbart.
Dann ist B direkter Nachfolger. Keiner dazwischen ist die Aussage,
es gibt kein solches C. Und diese Grundrelation, kleiner mit
dem Punkt, das ist jetzt die Präzedenzrelation zu der Kleine.
Relation. So, da muss man mal gucken,
bei den reellen Zahlen ist das problematisch zwischen zwei reellen Zahlen
liegt nämlich immer einer dazwischen.
Auch bei den rationalen schon. Von daher wird es da
ziemlich schwierig, die direkten Nachfolger zu bestimmen.
Das geht nicht
Wann immer das geht, ja, bei endlichen wird es immer gehen,
wenn ich endliche Grundmengen habe, dann ist das kein Problem.
Da gibt es nur endlich viele Kandidaten, die dazwischen liegen könnten.
Da habe ich immer nur den einen direkten Nachfolger,
das kann ich denen immer bestimmen.
Dann kann ich aus der Präzedenzrelation einfach die Relation bekommen,
indem ich alles, was ich transitiv erschließen kann, wieder zurückbekomme.
Also, wenn ich die Präzedenzrel, Präzedenzordnung schon habe,
dann ermöglicht mir das die strikte Ordnung,
wieder zu rekonstruieren
Aus dem sehr einfachen Grafen bilde ich mich jetzt die transitive Hülle.
Ich füge also alle Kanten hinzu, die ich durch Verkettungen
jetzt bekommen kann. Und ich sehe zum Beispiel von B,
komme ich nach A, von A,
komme ich nach C. Also male ich auch die Kante BC hinein.
Und ich komme noch weiter als Kantenzug einmal von B nach D,
also male ich auch diese Kante ein.
Und so weiter. Wenn ich all das hinzufüge,
was in dieser transitiven Hülle enthalten ist,
dann bekomme ich den Ausgangsgrafen wieder.
Dann bekomme ich meine strikte Ordnung wieder. Ja,
und in die andere Richtung Wie mache ich das?
Wenn ich da runtergehen möchte, dann muss ich jetzt Paar wieder rausstreichen.
Ich muss alle die Indirektionen rausstreichen. Also alle kannten,
die ich irgendwie mir erschließen kann, die müssen raus.
Welche sind das? Das sind genau alle Kanten aus der Striktordnung.
Wenn ich davon das, was ich mit Zweier-Kompositionen erreichen kann,
abziehe. Also S-Quadradrat auf eine Ordnung bedeutet,
ich komponiere die Relation mit sich selbst.
Also kleiner quadriert ist kleiner
Relationenprodukt kleiner. Das ist also die Menge aller AB,
für die gilt, A ist kleiner,
C und C ist kleiner B für irgend so ein Zeh.
Das heißt, ich weiß A,
B sind über einen Pfad der Länge 2 miteinander verbunden.
Das ist dann in kleiner 2. Und wenn ich diese Menge,
also alles, was in zwei Schritten erreichbar ist,
da rausnehme, dann kriege ich erstaunlicherweise das komplette Sortiment.
Ja, alle Elemente sind dann draußen.
Das heißt, das geht in beide Richtungen.
Ich kriege aus einer Präzedenzordnung durch das Hinzufügen der transitiven Hülle
Und durch das Quadrat einer Relation kriege ich aus jeder
strikten Ordnung auch die entsprechende Präzedenzordnung rausgehen,
wie indirekt zu erreichende Elemente auch rausfallen.
Und dass auch die Elemente der Länge 3 rausfallen, ist auch ganz interessant.
Also es gibt ja ein Element der Länge 3 B-A-C-D,
ist ja eine Dreierkette. Die fliegt aber auch raus,
weil bei jeder Dreierkette gibt es ja eine Zweierkette.
Und eine Einerkette. Ich weiß,
wenn ich B-A-C-D laufen kann, dann kann ich auch
immer B-10
direkt laufen
Weil das der Fall sein muss, weiß ich,
es gibt auf dem gesamten Pfad,
gibt es alle Zwischenverbindungen und deswegen reicht immer auch eine Zweierkette.
Ich muss also gar nicht mehr die Ketten der Länge 3,
4, 5 und größer betrachten,
sondern wenn ich die der Länge 2 rausstreiche,
habe ich bereits alles rausgestrichen.
Gut, das noch als Anmerkung, dass das ausreicht.
Wenn ich das gemacht habe, dann habe ich ja eine
partielle Ordnung. Und da gibt es jetzt einen Spezialfall,
nämlich den der totalen,
manchmal auch lineare Ordnung genannt
Wenn ich mich in eine partielle Ordnung AR habe,
mit der Eigenschaft zweitens, nämlich das gilt für alle ungleichen Elemente,
AB, habe ich entweder in die Beziehung A,
kleiner B oder B, kleiner A.
Wenn man Vollständigkeit, je zwei ungleiche Elemente sind irgendwie angeordnet.
Ich kann immer sagen, welches Element größer ist.
Das heißt, es gibt gar keine Elemente,
die nicht irgendwie ansortiert werden. Bei dem Prozess,
bei dem ersten Sequenz, den wir betrachtet haben,
war das so, A, kleiner B, kleiner C.
Und wenn ich das noch transitiv abschließe,
habe ich so eine Striktordnung, dann noch die Identität hinzu.
Dann habe ich eine Totalordnung. Einmal schöne Sequenz. Das heißt,
deswegen lineare Ordnung, das kann ich mich tatsächlich dann in so eine Linie ansortieren.
Und was mache ich jetzt, wenn ich die eigentlich informativere Variante habe?
Ich habe gar keine totale Ordnung oder lineare Ordnung,
sondern ich habe so eine richtige partielle Ordnung.
So wie in unserem Beispiel, wo ich war zwischen A
und B, gibt es gar keine Beziehung.
Also tragende Elemente, das ist hier der Präzedenzgraf.
Er ist in diesem Fall identisch mit der Striktordnung selbst,
denn es gibt keinen transitiven Abschluss hier.
Und jetzt frage ich mich, Mensch,
was für Linearisierung gibt es jetzt, die damit verträglich sind?
Also kann ich diese Ordnung zu einer totalen Ordnung machen?
Kann ich das
Antwort ist ja. Nächste Frage, wie mache ich das?
Geist ist das Eiche, was wir für jeden erlebt haben.
Da haben wir sie auch nicht getan
Also hier gibt es einen einfachen Algorithmus, zum Anordnen.
Ich gucke mir zwei Elemente raus, die nicht angegeordnet sind.
Ich sortiere die irgendwie. Zum Beispiel AVB. Und dann
gucke ich nach, ist das jetzt eine totale Ordnung?
Und wenn nicht, dann mache ich weiter, wenn ja,
bin ich fertig. Dann sind mich alle paarweise angeordnet.
Gut, hier habe ich nicht so viel zu tun.
Es gibt nur zwei Möglichkeiten, was ich tun kann.
Entweder AVB oder BVA. Das heißt,
wenn ich das, was hier umgeordnet ist,
irgendwie anordne, bekomme ich genau den ABC-Fall in orangen und
den BAC-Fall in Grün
So, die beiden Varianten gibt es. Das heißt,
ich kann mich für eins entscheiden, zum Beispiel,
kann ich mich für den rangefrei entscheiden und dann füge ich ja eine neue Kante hinzu.
Also wie komme ich da rüber? Indem ich hier einfach
eine Anordnungsbeziehung hinzudefiniere. AVB. Ja,
dann sieht man da unten, wenn ich das AB hinzupacke,
dann muss hier aus Transitivitätsgründen eben auch noch diese Beziehung drin sein.
AVB VC muss natürlich auch AVC sein aus Transitivitätsgründen. Das heißt,
diese Ordnung ist jetzt also, Eine lineare Ordnung,
die ich aus meiner obigen partiellen Ordnung machen kann.
Das ist nicht die einzige. Natürlich gibt es sie
auch in Grün. Die grüne Ordnung ist eben,
BVAVC und dann eben transitiv auch BVC.
Also ich kann beide Anordnungsbeziehungen zupacken. Eventuell muss ich noch
bei der Transitivität einmal aufpassen. Und dann habe ich
beide möglichen Varianten. Das nutze ich jetzt aus,
weil das genau das ist, was mir interessiert.
Eigentlich sage ich nur, ich habe ein System,
da gibt es keine Ordnungsbeziehung zwischen A und
Lieber Benutzer, wenn du unbedingt eine Sequenz daraus brauchst,
dann bete ich dir da für ein Konzept an.
Ich mache daraus eine Linearisierung, deine Ordnung.
Alle Linearisierungen tun es jetzt. Und deswegen definiert man,
wenn ich eine Striktordnung schon habe,
dann definiere ich mir die Menge Lynn, also die Menge aller Linearisierung,
das ist die Menge aller Totalen oder linearen Ordnung,
kleiner Eins.
Kleiner Eins soll eine lineare Striktordnung sein. Mit der Eigenschaft,
alles, was vorher in der alten Relation kleiner war,
das ist jetzt auch in der neuen Ordnung kleiner Index
Ja, also, kleiner Eins ist eine größere Ordnung.
Alles, was vorher ansortiert war, ist immer noch ansortiert.
Es werden jetzt nur neue Beziehungen zugepackt. Also in dem Beispiel
war das jetzt die Kante AB, die hinzugefügt wurde.
Sieht man ja auch. Die neue Relation hat drei Elemente
, die alte Zwei. Das heißt, um ein Element
kommt da hinzu. Und es wird eben gleich gefordert,
dass Kleiner mit dem Index Eins,
das soll gleich eine Striktordnung sein und sie soll linear sein.
Das heißt, die ist automatisch mit den richtigen Eigenschaften
Transitivität etc. ausgestattet
Das ist die Menge der linearen Vervollständigung von dieser Parzellenordnung oder
eben genannt die Menge der Linearisierung der partiellen Ordnung.
Gucken wir uns dazu mal ein Beispiel an. Hier ist
ein bisschen mehr ungeordnet. Also zwischen B und D gibt es
keine Anordnungsbeziehung, aber auch zwischen B und E keine.
Und zwischen C und D und C und E
auch keine.
Wie sehen da
die Linearisierung aus
Irgendwie eine Ausführung in dieser Reihenfolge. Was muss ich
als erstes ausführen? Ja, A muss sein.
A ist das kleinste Element. Mit der gleichen Logik,
das letzte, was ich ausführe,
Und was passiert dazwischen? Eine fast beliebige Mischung,
nur mit der einzigen Nebenbedingung, dass BVC kommen muss und BVE.
Also es kann sowas passieren wie A, B-C, D-E-F. Oder umgekehrt.
A.de und dann B-C-F ist möglich. Oder A, B,
runter D, rauf C, runter E oder A,
B, D, E, C und so weiter.
Also alle Kombinationen, die da möglich sind. Dann sieht man,
Da wird irgendwie durchgetauscht ganz am Anfang, nach dem A,
kommt auf jeden Fall ein B oder ein D.
Das ist die erste Möglichkeit. Und dann weiß ich,
was danach kommt, naja, da habe ich immer noch
die Möglichkeit, das jeweils andere zu nehmen oder weiterzugehen.
Und was denn noch so übrig bleibt.
Und ganz zum Schluss steht auf jeden Fall immer F.
Und das ist auch das Konstruktionsprinzip dahinter.
Ich füge jetzt einfach eine Kante munter hinzu.
Also was ich hier gemacht habe ist,
welche Kante habe ich bei der ersten Zeile hinzugefügt
Da habe ich die Kante zwischen C und D gezogen. Ja,
wenn ich diese kannte, warum auch immer zuerst hinzufüge,
dann muss es so sein, A, B,
C, C habe ich jetzt neu,
4D gepackt und dann ist nur noch DEF möglich.
Das heißt, wenn ich zuerst diese Hauptdiagonale von rechts
oben nach links unten ansortieren, C und D,
da habe ich gar keine andere Möglichkeit.
Das legt dann schon alles fest. Würde ich nur sagen,
B soll kleiner als D sein,
dann weiß ich schon mal, das muss mit A,
B,
D anfangen
Aber dann habe ich immer noch die Wahl zwischen C und E. Das heißt,
da müsste ich wieder was festlegen und so weiter.
Gut, hier haben wir es noch einfach.
Hier haben wir mich eine endliche Menge,
also durch pure Ausdauer können wir da alles hinschreiben.
Schwieriger Witz bei solchen Sachen, wo ich unendlich viele Elemente habe.
Da habe ich oben eine beliebte Kette,
A1 oder 2, A3 immer so weiter.
Und in jedem Knoten kann ich ausbrechen zu einem BI.
Und da sieht man dann, naja, diese BIs,
die sind unberechenbar, die könnten also sich irgendwo dazwischen mogeln.
Hauptsache sie kommen, jedes BI muss nach einem AI kommen.
Aber ansonsten irgendwo. Und das konstruieren wird hier ziemlich schwierig,
weil ich natürlich unendlich viele Plätze haben.
Das B-1, das kann beliebig weit hinten kommen.
Es gibt da keine Schranke. Es gibt also unendlich viele
Linearisierungen. Gut, damit wollen wir es bewenden lassen.
Beim nächsten Mal geht es weiter mit Petrinetz-Prozessen. Das ist dann
zum einen im neuen Jahr und zum anderen mit Herrn Molt,
denn ich verabschiede mich von Ihnen an dieser Stelle.
Ich komme nicht wieder, mich sehen Sie frühestens wieder,
wenn Sie zu Klausur kommen.
Oder wer bei mir Übungsgruppe hat. Ab jetzt übernimmt Herr
Multi-Vorlesung. Von daher bleibt mir nur noch Ihnen ein schönes
Weihnachtsfest zu wünschen und einen guten Rutsch ins neue Jahr.
Bis dann