Seminar: Spezifikation und Verifikation verteilter Systeme 7.2 Conjoining Specifications Teil 2: Das Kompositions-Theorem Dirk Fahland 1 TLA & Komposition in TLA Jede TLA-Formel Mi lässt sich in eine äquivalente TLA-Formel M i in Normalform umschreiben: M i Init i [Next i ] vi F air i. Mit derartigen Formeln lassen sich besonders gut Beweise über die Implementation (Implikation) und Komposition (Konjunktion) von Systemen führen. Hinsichtlich der parallelen Komposition von Systemen gibt es drei grundsätzliche Kompositionsprinzipien: Komposition von Systemen mit disjunkten Variablen (M M 1 M 2 ): Die Abläufe von M 1 und M 2 sind jeweils völlig unabhängig voneinander. Komposition von Systemen mit nicht-disjunkten Variablemengen (M M 1 M 2 ): Wir beabsichtigen eine sequentialisierende parallele Komposition, d.h. wenn eine Komponente M i einen Schritt macht, stottern alle anderen Komponenten M j (j i) auf ihren Variablen. Die Abläufe einer Komponente unterscheiden sich bezüglich des Gesamtsystems nur anhand von Stotterschritten. Komposition von Systemen mit expliziter Synchronisation (M M 1 M 2 Σ): Eine explizite Synchronisationskomponente schränkt die möglichen Abläufe von M 1 und M 2 ein. Zusammen mit dem Implementation ist Implikation -Paradigma haben wir es eigentlich stets mit Implementationsformeln der Art M 1... M n N 1... N n (1) zu tun. Diese Art von Beweis kann bei nicht-trivialen Systemen ( (M i N i ), i = 1,..., n) sehr kompliziert werden. Dabei ist insbesondere die linke Seite der Implikation ein Problem. Wir müssen also die Komplexität der Formeln in der Prämisse senken. Der Ansatz, den wir nun weiterverfolgen ist, für die Implikation M 1... M n N i die Konjunktion der M j (j i) durch eine Umgebungsannahme E i zu ersetzen: M i E i N i. Diese Umgebungsannahme ist im Allgemeinen wesentlich weniger komplex als die Konjunktion aller Komponenten. Wie sieht ein Theorem aus, dass uns die Formel (1) mittels Zerlegung und Umgebungsannahmen beweist? 1
2 Theorem-Überlegungen Ein Theorem der Form M 1 E 1 N 1. M n E n N n M 1... M n N 1... N n hat eine ungenügende Prämisse. Die Umgebungsannahmen sind durch nichts gerechtfertigt. Da diese gerade die verbleibenden Systemkomponenten (vereinfacht) beschreiben sollen, wäre eine Absicherung der Form: i j M j E i zwar richtig, aber wiederum deutlich zu komplex für unser Anliegen. Nicht gerade naheliegend, aber auch nicht abwegig ist es, jede Umgebungsannahme E i durch die strukturell einfachere Spezifikation N 1... N n abzusichern. Wir gehen mit diesem Ansatz davon aus, dass jede Komponente M i nur Umgebungseigenschaften benötigt, die auch als essentielles Verhalten der anderen Komponenten in der High- Level -Spezifikation gesichert sind. Dann erhalten wir folgendes Theorem: N 1... N n E i (i = 1,..., n) M i E i N i (i = 1,..., n) M 1... M n N 1... N n Leider beinhaltet dieses Theorem einen Ringschluss. N 1... N n taucht in den Vorraussetzung als Prämisse auf und im Schluss auf der rechten Seite der Implikation. Dies fällt uns in einem sehr einfachen Fall bereits auf die Füsse: Seien M i und E i jeweils äquivalent: M i = E i. Dann reduziert sich das Theorem auf Wenn N 1... N n M i und M i N i (für alle i = 1,..., n), dann M 1... M n N 1... N n. Dieser Schluss setzt sich selbst voraus und ist damit nicht gültig. Das offensichtliche Problem liegt darin, dass wir äquivalentes Verhalten von E i und M i zulassen. Was das genau bedeutet, soll uns im folgenden interessieren. 3 Komponente und Umgebung Unser Theorem verfolgt den Ansatz eine Systemkomponente als offenes System zu betrachten. Dabei kann die Spezifikation einer Komponente nur gewisse Eigenschaften garantieren, wenn die Umgebung gewisse Voraussetzungen sichert. Doch was passiert, wenn diese Vorraussetzungen nicht erfüllt sind? Wir dürfen davon ausgehen, dass die Komponente nun ihre Eigenschaften nicht länger garantieren kann. Die interessante Frage ist, ab wann wir dies zulassen, so dass das Verhalten der Komponente immer noch ein gültiges bezüglich seiner Umgebung ist? Zwei abstrakte Beispiele: 2
σ 1 : s 0 s 1 s 2 s 3 s 4... E i : true true true false false... M i : true true true false false... σ 2 : s 0 s 1 s 2 s 3 s 4... E i : true true true false false... M i : true true true true false... Ablauf σ 1 und Ablauf σ 2 unterscheiden zwei grundsätzliche Verhalten. Im ersten Fall verletzen Komponente und Umgebung ihre Eigenschaften gleichzeitig, im letzteren Fall sieht die Komponente die Verletzung der Umgebungseigenschaft und geht erst danach in einen fehlerhaften Zustand. Wenn die Komponente tatsächlich nur über sich selbst redet und keine Eigenschaften der Umgebung mitspezifiziert, dann kann die Komponente nicht vorraussehen, dass die Umgebung einen Fehler machen wird. Der Fehler materialsiert sich für die Komponente erst im Folgezustand. Dieses Verhalten ist in σ 2 repräsentiert. σ 1 hingegen setzt entweder vorraus, dass die Komponente mehr von der Umgebung sieht, als für sie nötig wäre, oder die Komponente verletzt von ganz allein, ohne Einwirken der Umgebung seine Eigenschaften. σ 2 spiegelt die kausale Abhängigkeit der Komponente von der Umgebung korrekt wieder, σ 1 nicht. In unserem Theorem hat uns gerade das nicht-kausale Verhalten, wo Komponente und Umgebung gleichzeitig (äquivalent) die geforderten Eigenschaften verletzen, gestört. Wir werden also Forderungen an kausale Abhängigkeiten in unserem Theorem postulieren müssen. 4 Kausalität und Assumption/Guarantee-Spezifikationen Martin Abadi und Leslie Lamport haben für dieses Problem der kausalen Abhängigkeiten einige temporale Operatoren entworfen. Die beiden Operatoren und finden für Assumption/Guarantee-Spezifikationen Anwendung. Mit den obigen Abläufen σ 1 und σ 2 gilt: σ 1 = E i M i und σ 2 = E i M i, sowie σ 2 = E i Mi, jedoch σ 1 = E i Mi. Der Operator unterscheidet also gerade Abläufe anhand der kausalen Abhängigkeiten. Spezifikationen der Form E M sind damit die formale Fassung für Assumption/Guarantee- Spezifikationen. Sie formulieren die Aussage M gilt mindestens so lange, wie E gilt. Damit können wir für ein offenes System Beweise führen. Ein weiterer Operator ist der Operator. Angewandt auf eine Formel E: E v garantiert, dass, wenn E in einem Ablauf jemals falsch werden sollte, v ab dann für immer stottert. σ 3 : s 0 s 1 s 2 s 3 s 4 s 5... E : true true true false false false... v : 1 2 3 5 6 6... M : true true true true??... 3
E ist in σ 3 nicht erfüllt. E v hingegen ist erfüllt, da nachdem E seine Eigenschaft verletzt hat, v nur noch stottert. Der Operator verlängert gewissermaßen die Gültigkeit von E unter gewissen Annahmen. Interessant wird dies erst wieder, wenn wir E und M zusammenbringen. E M ist in σ 3 nicht erfüllt. E v M ist erfüllt. Durch das Stottern von v können wir keine allgemeinen Angaben über das korrekte Verhalten von M machen. Aber wir sind durch den Operator wiederum in der Lage die kausale Abhängigkeit zwischen E und M auszudrücken. Dass die diese Operatoren alle eng zusammenhängen zeigt sich auch in folgendem Satz: Wenn E und M Sicherheitseigenschaften sind und v alle (freien) Variablen von M beinhaltet, dann sind E M und E v M äquivalent. 5 Das Dekompositions-Theorem Es zeigt sich, dass wir für unser Theorem nicht alle Implikationen in voller Größe in der Prämisse beweisen müssen. Häufig genügt es die Beweise über Sicherheitseigenschaften zu führen, was die Beweisführung selbst entsprechend vereinfacht. Da wir nicht jeder TLA-Formel nur anhand ihres Namens M ansehen, ob sie auch Lebendigkeitseigenschaften beinhaltet, führen Abadi und Lamport einen weiteren Operator C ein. Zu einer gegebenen Formel M ist C(M) die stärkste Sicherheitseigenschaft, so dass gilt = M C(M). Aus dieser recht abstrakten Definition folgt, dass, wenn M Init [Next] v F air in Normalform vorliegt, C(M) = Init [Next] v ist. Wir wissen nun genug, um das Dekompositions-Theorem von Abadi und Lamport zu verstehen. Dekompositions-Theorem: Wenn für i = 1,..., n dann gilt (1) = C(N 1 )... C(N n ) E i (2)(a) = C(E i ) v C(M i ) C(N i ) (2)(b) = E i M i N i = M 1... M n N 1... N n In diesem Theorem sind mehrere Aspekte berücksichtigt. Zum einen eine Form der Prämissen, die den Beweisaufwand auf ein erträgliches Maß reduzieren. Zum anderen die Forderung nach kausaler Abhängigkeit zwischen Umgebung und Komponente. Dieses Theorem findet in all den Situationen Anwendung, wo die beiden Spezifikationen M 1... M n und N 1... N n als Dekomposition zweier großer Systeme M und N bereits als korrekt bewiesen wurden und nun die Implementation M N auf die Dekomposition zurückgeführt wird. Anstatt den Beweis über das gesamte System zu führen, wird er lokal an den einzelnen Komponenten (sh. Prämisse (2)(a) und (2)(b)) durchgeführt. Diese Vereinfachung ist bedeutsam. Die Trennung in (2)(a) und (2)(b) isoliert den Beweis der kausalen Abhängigkeit auf Sicherheitseigenschaften, da diese auch nur hier relevant sind. 4
Mit diesem Theorem geben Abadi und Lamport noch einige Sätze und ein Beweisverfahren an, die die Beweisführung der Prämissen unterstützen. 6 Das Kompositions-Theorem Ausgehend von Dekompositions-Theorem haben Abadi und Lamport noch ein weiteres Theorem bewiesen. Es beschäftigt sich mit der Komposition und Implementation von Assumption/Guarantee-Spezifikationen. Letztere beschreiben Eigenschaften offener System auf einem Niveau, dass nicht notwendigerweise die komplette Spezifikation des Systems beinhaltet, sondern vielmehr zugrunde legt. Die Formel E M wird in der Regel anhand einer Systemspezifikation M bewiesen. Da diese selbst nicht in der Formel auftaucht sind Implementationsbeweise über Assumption/Guarantee-Spezifikationen ebenfalls aufwändig zu führen. Gegeben seien E 1 M1,..., E n Mn und E M, die jeweils korrekt seien. Wie schon beim Dekompositions-Theorem möchten wir die Implikation n i=1 (E i M i ) (E M) beweisen. Das Hauptproblem dieser Implikation ist der Operator, der letztlich kausale Abhängigkeiten beschreibt. Das Kompositions-Theorem löst diesen auf. Kompositions-Theorem: Wenn für i = 1,..., n dann gilt (1) = C(E) C(M 1 )... C(M n ) E i (2)(a) = C(E i ) v C(M 1 )... C(M n ) C(M) (2)(b) = E i M 1... M n M = n (E i Mi ) (E M) i=1 Das Kompositions-Theorem erlaubt es uns direkt über Assumption/Guarantee-Spezifikation zu beweisen, ohne den Umweg über die Systemspezifiaktion zu nehmen. Für die Form und die Verwendung des Kompositions-Theorem gelten ähnliche Argumente, wie für das Dekompositions-Theorem. Literatur Abadi, Lamport: Conjoining Specifications, ACM Transactions on Programming Languages and Systems, vol.17, no.3, ACM Press, pp. 507 535, May 1995 Lamport: Composition: A Way to Make Proofs Harder, Lecture Notes in Computer Science, vol.1536, pp. 402 423, 1998 5