25.11.2014 Aufrufe

Verifikation reaktiver Systeme - Universität Kaiserslautern

Verifikation reaktiver Systeme - Universität Kaiserslautern

Verifikation reaktiver Systeme - Universität Kaiserslautern

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Verifikation</strong> <strong>reaktiver</strong><br />

<strong>Systeme</strong><br />

Seminar im Wintersemester 2003/2004<br />

W. Büttner, W. Kunz und K. Schneider


Vorwort<br />

Der Entwurf von komplexen digitalen <strong>Systeme</strong>n stellt nach wie vor eine<br />

enorme Herausforderung dar, da einerseits neue Anwendungen größere <strong>Systeme</strong><br />

erfordern und andererseits aufgrund wirtschaftlicher Zwänge die zur<br />

Verfügung stehende Entwicklungszeit immer kürzer wird. Zusätzlich übernehmen<br />

vor allem eingebettete <strong>Systeme</strong> zunehmend sicherheitskritsche Aufgaben<br />

in vielen Bereichen wie etwa der Luft- und Raumfahrt, der Automobilindustrie<br />

oder in Steuerungen von Produktionsanlagen.<br />

Ein großer Erfolg der Informatik ist die Entwicklung formaler Methoden<br />

und Werkzeuge mit deren Hilfe der Entwurf digitaler <strong>Systeme</strong> entscheidend<br />

automatisiert werden konnte. Gegenüber der Simulation konnte sich<br />

dabei die formale <strong>Verifikation</strong> in den letzten Jahren immer stärker durchsetzen.<br />

Die <strong>Verifikation</strong> kann einen wichtigen Beitrag zur Senkung der Entwicklungskosten<br />

leisten, indem bereits in frühen Entwurfsphasen nach<br />

Fehlern gesucht werden kann. Mit ihrer Hilfe lassen sich <strong>Systeme</strong> verifizieren,<br />

deren Zustandsraum mit den Methoden der Simulation nur noch<br />

unzureichend abgedeckt werden könnte.<br />

In den letzten Jahren wurden neben den älteren Ansätzen des automatischen<br />

Beweisens neue Verfahren entwickelt, welche sich gezielt mit der<br />

<strong>Verifikation</strong> temporaler Eigenschaften von endlichen Zustandsübergangssystemen<br />

befassen. In diesem Seminar, welches als integriertes Seminar zur<br />

gleichnamigen Vorlesung angeboten wurde, wurden aktuelle <strong>Verifikation</strong>sverfahren<br />

aus diesem Bereich betrachtet. Das Seminar wurde gemeinsam<br />

von Prof. W. Büttner (Infineon AG), Prof. W. Kunz (FB Elektro- und Informationstechnik,<br />

TU <strong>Kaiserslautern</strong>) und Prof. K. Schneider (FB Informatik,<br />

TU <strong>Kaiserslautern</strong>) veranstaltet.<br />

Klaus Schneider, Mai 2004


Inhaltsverzeichnis<br />

Grundlagen des ‘Bounded Model Checking’ ......................... 1<br />

Christian Allmann<br />

Interpolation and SAT-Based Model Checking ...................... 29<br />

Christian Schlosser<br />

Completeness of (BMC) Property Suite ............................. 43<br />

Sören Burmeister<br />

Automatische Abstraktion zur Modellprüfung großer <strong>Systeme</strong> ....... 78<br />

Tim Braun<br />

Konfliktanalyse in SAT-Implikationsgraphen auf ATPG ............. 101<br />

Thomas Fischer<br />

Formaler Äquivalenzvergleich ..................................... 139<br />

Florian Rothländer<br />

Übersetzung prädikatenlogischer Formeln in endliche Automaten .... 159<br />

Thomas Türk<br />

Symbolische lokale Modellprüfung ................................. 191<br />

Nico Mahlo<br />

Using Theorem Proving to Verify Arithmetic Hardware .............. 218<br />

Jens Brandt<br />

Modellierung von synchronen Sprachen mit<br />

Prozessersetzungssystemen ....................................... 274<br />

Rüdiger Grammes


1<br />

Grundlagen des bounded model checking<br />

Christian Allmann<br />

Technische Universität <strong>Kaiserslautern</strong><br />

Zusammenfassung: Zur Repräsentation von <strong>Systeme</strong>n wurde bisher<br />

auf die Darstellung mittels BDDs zurückgegriffen. Diese Ausarbeitung<br />

stellt die Grundzüge einer neuer Technik namens bounded<br />

model checking vor. Ziel von bounded model checking ist die Zustandsexplosion<br />

von BDDs zu verhindern. Dabei sollen Gegenbeispiele<br />

möglichst schnell und von minimaler Länge gefunden werden.<br />

Diese Methode hat sich in der Industrie als Verfikationstechnik etabliert.<br />

Ein Beispiel der Realisierung in der Praxis soll anhand der<br />

Temporallogik ITL vorgestellt werden.<br />

1 Einleitung<br />

Die Informatik ist eine Wissenschaft, die es wie keine andere vor ihr geschafft<br />

hat in so kurzer Zeit, ein so breites Spektrum an Wissen sich anzugeignen. Das<br />

Problem an jungen Wissenschaften ist, dass zu Beginn eine wahre Schwemme<br />

an neuen Erkenntsnissen gesammelt wird, deren Bedeutung man erst viele Jahre<br />

später zu schätzen weiss. Meist aus Selbsterfahrung oder dem Studium der<br />

Wissenschaft, die einen veranlasst über die Erkenntnisse der Vergangenheit nachzudenken,<br />

entdeckt man, dass die gemachten Fehler schon viele Jahre vor einem<br />

bekannt waren.<br />

Eine der wichtigsten Erkenntnisse verdanken wir Dijkstra. 1970 formulierte er<br />

die Regel, dass Testen nur die Anwesenheit von Fehlern, aber nicht deren Abwesenheit<br />

zeigen kann.<br />

Damit war das Ziel gleichsam vorgegeben. Der Wunsch des mathematischen<br />

Nachweis der Korrektheit eines Systems bezüglich der vorgegebenen Spezifikationen.<br />

Diese Technik bezeichnet man als formale <strong>Verifikation</strong>.<br />

<strong>Verifikation</strong>stechniken setzen dort auf, wo die Technik der Validation enden. Der<br />

Vorteil dieser Methoden gegenüber der traditionellen Simulation ist die breitere<br />

Abdeckung des Systemverhaltens, sowie die Möglichkeit der Auffindung raffiniertester<br />

Fehler. Der Druck auf gute <strong>Verifikation</strong>stechniken lässt sich sehr gut an<br />

der Prozessorevoulution erkennen. Prozessoren unterliegen einer Leistungssteigerung<br />

alle 18 Monate, dies wiederum bedeutet für die beteiligten Unternehmen,<br />

dass der Time-to-Market-Faktor extrem wichtig ist.<br />

Diese Ausarbeitung stellt eine Technik vor, die in der Industrie große Akzeptanz<br />

gefunden hat für die <strong>Verifikation</strong> digitaler <strong>Systeme</strong>.


2<br />

Der Aufbau der Arbeit ist in fünf Gesichtspunkte untergliedert. Die ersten Kapitel<br />

beschreiben die Kernideen des bounded model checking. In diesen Kapiteln<br />

werden auch die notwendigen semantische Änderungen am Beispiel der Temporallogik<br />

LTL erläutert. Diese Erklärungen sind jedoch für das wesentliche<br />

Verständnis von bounded model checking nicht notwendig. Die Ergänzungen<br />

hierzu lassen sich in der Überschrift des Kapitels als LTL spezifische erkennen.<br />

Ein ausführliches Beispiel zur Eigenschaftsprüfung mit LTL befindet sich im Anhang<br />

A. Neben der Vorstellung der Technik wird auch die industrielle Umsetzung<br />

in Kapitel 4 vorgestellt. Die Syntax der in diesem Kapitel verwendete Temporallogik<br />

ITL wird im Anhang B erläutert. Mit der Bewertung von bounded model<br />

checking endet die Ausarbeitung.<br />

2 Grundlagen<br />

2.1 Symbolische Modellprüfung<br />

Zur formalen <strong>Verifikation</strong> benötigt man ein mathematisches Modell des Systems,<br />

sowie eine Sprache zur Spezifizierung der gewünschten Eigenschaft. Darauf aufbauend<br />

eine Beweismethode um sicherzustellen, dass die gewünschte Eigenschaft<br />

spezifiziert wird [7]. Die dabei wirtschaftlich interessantesten sind die maschinell<br />

ausführbaren Algorithmen, die automatische <strong>Verifikation</strong> erlauben.<br />

Die eigentliche Modellprüfung (model checking) wird realisiert durch Algorithmen,<br />

die den Zustandsraum des Transitionssystems dahingehen untersuchen, ob<br />

Spezifikationen und Verhalten übereinstimmen [3].<br />

Die ersten Schritte der Symbolischen Modellprüfung wurden 1990 von Burch,<br />

Clarke, McMillan und Dill unternommen und unterlagen seit dem einer ständig<br />

fortschreitenden Entwicklung.<br />

Die bis dato übliche Methode der formalen <strong>Verifikation</strong> beruhte auf den Erkenntnissen<br />

der Automatentheorie. Systemmodell und Spezifikation wurden mit Hilfe<br />

einer passenden Logik beschrieben. Mit Hilfe dieser Beschreibung wurde aufbauend<br />

ein logischer Beweis geführt, der die Spezifikation bestätigte. Trotz seiner<br />

Mächtigkeit und Flexibilität bleibt das Verständnis und die Anwendbarkeit nur<br />

wenigen Anwendern vorbehalten, auf Grund der verwendeten mathematischen<br />

Formalismen.<br />

Das Systemmodell wird in den folgenden Betrachtungen als endlicher Automat<br />

verstanden. Die notwendige Spezifikation wird in aussagenlogischer Form mittels<br />

Temporallogik beschrieben. Ihr Vorteil ist die leichte Verständlichkeit und<br />

Kompaktheit. Zudem können die wichtigen Eigenschaften wie Sicherheit, Lebendigkeit,<br />

Fairness, ... damit ausgedrückt werden.<br />

Um das Problem der Zustandsexplosion bei großen <strong>Systeme</strong>n in den Griff zu bekommen<br />

entstand die symbolische Modellprüfung. Die Ersetzung der expliziten<br />

Zustandsrepräsentation durch Zustände mit booleschen Kodierungen erlauben<br />

der symbolischen Modellprüfung größere Designs zu bewältigen, als mittels statischer<br />

Modellprüfung. Meist liegt dabei die zugrundeliegende Implementation<br />

auf Basis von binären Entscheidungsdiagrammen (BDD). Diese erlaubten es erst<br />

die Breitensuche auf den Datenstrukturen effizient zu gestalten.


3<br />

Erste Erfolge mit Modellprüfer auf BDD-Basis zeigten sich bei der Überprüfung<br />

des Futurebus+ Cache Protokolls.<br />

Das von Ken McMillan an der Carnegie-Mellon Universität erstellte Programm<br />

SMV war das erste Werkzeug, dass sich bewährte. 1992 setze Clarke diese Tool<br />

ein, um das Cache-Kohärenz-Protokoll zu überprüfen. Die damit gefundenen<br />

Fehler zeigten, dass mit diesen formalen Methoden mehr erreicht werden konnte,<br />

als die seit 1988 auf den Futurebus+ angewendeten informellen Techniken.<br />

2.2 Temporale Logiken<br />

Um Eigenschaften wie Fairness, Lebendigkeit oder Sicherheit zu spezifizieren,<br />

haben sich temporallogische Aussagenlogiken bewährt. Unter temporaler Aussagenlogik<br />

versteht man die allgemeine Aussagenlogik, die um temporale Operatoren<br />

erweitert ist.<br />

Die verwendeten Zeitschematas unterteilt McMillan in drei Klassen lineare, diskrete<br />

und verzweigende Zeit [7].<br />

In dieser Ausarbeitung spielen insbesondere Temporallogiken auf linearer und<br />

diskreter Zeitebene eine Rolle. Die Besonderheiten der hier betrachteten Diskreten<br />

Temporallogik werden am Beispiel der Intervalltemproallogik ITL aufgezeigt.<br />

Um die Verständlichkeit und das Anwendungsspektrum genauer zu verstehen ist<br />

es wichtig die betrachtete Zeit genau zu unterscheiden. Die im Weiteren verwendete<br />

lineare Zeit ist definiert durch eine linear geordnete Menge von Zeitpunkten.<br />

Ein Zeitrahmen gilt hierbei als linear, wenn die Relation hierauf als total bezeichnet<br />

werden kann. Dies ist der Fall, wenn für zwei beliebige Zustände s, t entweder<br />

gilt s ≤ t, s = t oder t ≤ s.<br />

Um einen Eindruck für die Arbeitsweise von bounded model checking zu bekommen<br />

ist die Wahl der Temporallogik entscheidend. Für die im Folgenden<br />

auftretenden Betrachtungen spielt insbesondere die Logik LTL eine besondere<br />

Rolle, an der auch die notwendigen Änderungen in der Semantik vorgestellt<br />

werden. Zu LTL gehört jede Formel der Art Ap genau dann, wenn in p keine<br />

weiteren Pfadquantoren vorkommen. LTL ist also soweit beschränkt, dass man<br />

nur Aussagen über alle Abläufe machen kann und nicht über mögliche Alternativen.<br />

Die Logik ist auch dahingehend beschränkt, dass keine Aussagen über die<br />

Erreichbarkeit bestimmter Zustände AGEFp möglich sind.<br />

Neben dieser bekannten Temporallogik, die sich dazu auch leicht auf Logiken<br />

wie CTL* und Derivate erweitern lässt, wird die Logik ITL betrachtet. ITL ist<br />

deswegen eine Betrachtung wert, da sie nur im Hause Infineon verwendet wird<br />

für die Beschreibung von formalen Spezifikationen für das Tool gateprop. Die<br />

Funktionsweise von ITL wird in Kapitel 4 und Anhang B ausführlich besprochen.


4<br />

2.3 SAT<br />

Unter SAT versteht man das boolesche Erfüllbarkeitsproblem. Was bedeutet,<br />

dass bei einer gegebenen booleschen Funktion f entschieden werden muss, ob sie<br />

den Wert 1 hat oder nicht. SAT liegt in NP-complete. Was bedeutet, dass im<br />

worst-case Fall der Algorithmus exponentielle Laufzeit benötigt um das Problem<br />

zu lösen. Im Durchschnitt benötigt er weit aus weniger, daher auch sein verbreiteter<br />

Einsatz in der Industrie.<br />

Am Beispiel von Schaltungen lässt sich dies anschaulich erklären. Es soll untersucht<br />

werden, ob zwei Schaltungen die die Funktionen g und f realisieren,<br />

äquivalent sind. Diese beiden Funktionen werden mit einem XOR verknüpft und<br />

beschaltet. Falls nun XOR erfüllbar ist, so sind die beiden Funktionen und damit<br />

die Schaltungen nicht äquivalent.<br />

Der Aufbau allgemein erfolgt in Klauselform. Bedeutet, dass jede zu erfüllende<br />

Eigenschaft eine Klausel darstellt, die mit jeder anderen noch zu erfüllenden<br />

Eigenschaft konjungiert wird. Als Ergebnis erhält man eine Konjunktive Normalform<br />

(KNF). Die meisten modernen SAT-Solver arbeiten auf Basis des 1962<br />

eingeführten Davis-Logemann-Loveland (DLL)-Algorithmus. Dabei wird den Variablen<br />

der KNF schrittweise die Werte von 0 oder 1 zugewiesen. Dies wird so<br />

lange durchgeführt, bis alle Klauseln erfüllt sind. Falls eine Klausel verletzt wird,<br />

werden Backtracks vom aktuellen Knoten im Entscheidungsbaum durchgeführt.


5<br />

3 Bounded Model Checking<br />

3.1 Idee<br />

Dieser neue Ansatz im Bereich der formalen <strong>Verifikation</strong> beschäftigt sich, wie<br />

viele Ansätze davor, mit dem lösen von Problemen. Es handelt sich hierbei nicht<br />

um ein x-beliebiges Problem sondern um die Frage, ob die an das Design gestellten<br />

Eigenschaften von diesem erfüllt werden. Die Kernidee dieser Technik<br />

besteht nun darin Gegenbeispiele beliebiger Länge k zu finden, ohne den Zustandsraum<br />

des betrachteten Systems zu durchforsten. Dies wird dadurch gelöst,<br />

indem das zu untersuchende Verhalten des Systems durch eine aussagenlogische<br />

Formel ausgedrückt und anschließend ausgewertet wird. Da es sich hierbei um<br />

ein Erfüllbarkeitsproblem handelt, also ob ein Design eine Eigenschaft erfüllt,<br />

eignen sich zur Lösung solcher Formel SAT Methoden.<br />

Wenn man in diesem Zusammenhang von beliebiger Länge k spricht, so drückt<br />

k die Schranke (”bound”) aus, also die maximale Länge des Gegenbeispieles.<br />

Die zur Aufstellung der Formel benötigte Zeit wird in Kapitel 3.4 näher betrachtet.<br />

Der Einsatz von bounded model checking erlaubt die Spezifikation der<br />

elementaren Eigenschaften wie Lebendigkeit und Sicherheit, die anschließend auf<br />

ihre Erfüllbarkeit hin getestet werden. Hierbei ist es wichtig zu wissen was diese<br />

Eigenschaften eigentlich aussagen. So besagt die Sicherheitseigenschaft, dass<br />

überprüft werden muss, ob eine gegebene Menge von Zuständen erreichbar ist,<br />

inklusive der Verifizierung des Vorhandenseins etwaiger Schleifen im Zustandsgraphen<br />

des Systems.<br />

Vorteile dieses Ansatzes:<br />

1. Gegenbeispiele werden schnell gefunden<br />

Grund: Tiefensuche von SAT Prozeduren<br />

2. Gegenbeispiele sind von minimaler Länge<br />

Vorteil: Verständnis des Benutzers wird unterstützt<br />

3. es wird weniger Speicher benötigt<br />

Grund: keine üblichen BDD Ansätze<br />

4. keine Eingriffe seitens des Bedieners<br />

Vorteil: hoher Automatisierungsgrad<br />

3.2 Triviales Eingangsbeispiel<br />

Wenn man sich in die Lage eines Ingenieurs versetzen würde, so besteht seine<br />

primäre Aufgabe bei der Entwicklung neuer Produkte darin, dass das neue<br />

Produkt die aufgestellten Eigenschaften erfüllt. So gesehen könnte dieser hier<br />

betrachtete Zähler ein solches Produkt sein. Dieser Zähler soll aus drei Schieberegistern<br />

bestehen, die mit x[0], x[1] und x[2] gekennzeichnet sind.<br />

Mit den heutigen Entwicklungsmethoden wie Rapid Prototyping ist es meist<br />

nicht anders machbar, als an die Modellierung neuer Produkte zu gehen, ohne<br />

den unvollständigen Katalog mit Eigenschaften zu besitzen. Dieser Fall könnte<br />

exemplarisch auch an diesem Zähler vorgenommen werden, da hier nur eine


6<br />

Eigenschaft spezifiziert sein soll. Diese Eigenschaft besagt, der Zähler soll nach<br />

endlich vielen Zeitschritten leer sein. Diese Eigenschaft kann temporallogisch als<br />

AF(x = 0) formuliert werden.<br />

Würde man nun das Komplement dieser Eigenschaft annehmen und es untersuchen,<br />

was würde das Ergebnis aussagen? Würde ein Gegenbeispiel gefunden, so<br />

wäre die Annahme falsch, was wiederum die Richtigkeit der anfangs getroffenen<br />

Eigenschaft zeigt. Ergäbe sich allerdings kein Gegenbeispiel gefunden, so wäre<br />

die eigentliche Annahme falsch. Am Beispiel gesehen, besagt das Komplement<br />

der Annahme EG(x ≠ 0) , dass ein Pfad gesucht wird, auf dem nie x = 0 gilt.<br />

Um nun zu zeigen, ob diese Eigenschaft gilt, ist es notwendig das Design des<br />

Produktes zu besitzen, auf dem die Eigenschaft überprüft werden soll. Wie in<br />

Abbildung 1 zu erkennen handelt es sich dabei um eine noch unvollständige<br />

Modellierung. Zu sehen sind die Zustände des Zählers nach zwei Transaktionen.<br />

Der Zähler im Initialzustand (x 0 ) und die Überführung in Folgezustände. Da<br />

im Bereich der Reaktiven <strong>Systeme</strong> man von unendlich langen Pfaden ausgeht<br />

ist es wichtig, dass man mit Hilfe von Schleifen in einen schon besuchten, vorhergehenden<br />

Zustand gelangt, um das unendliche Verhalten sicherzustellen. Die<br />

Modellierung kommt diesem nach, indem sie die Möglichkeiten mit Hilfe von<br />

drei Schleifenkonstrukte wiederspiegelt (S i ). Die Übergänge zwischen aktuellem<br />

Zustand x und Folgezustand x’ werden durch die Transitionen T ausgedrückt.<br />

Die Eingangsbelegung sei im weiteren nicht näher spezifiziert.<br />

(x ′ [0] = x[1]) ∧ (x ′ [1] = x[2]) ∧ (x ′ [2] = 1)<br />

Abbildung 1. 3-Bit Shift Register<br />

Im Prinzip könnte man hier schon eine Aussage über die Erfüllbarkeit der Eigenschaft<br />

treffen, da man am dritten Register erkennt, dass dieses niemals Null<br />

wird und demnach der Zähler niemals den Leerzustand erreichen würde.<br />

Mit Hilfe von bounded model checking lässt sich dies jedoch auch formal als Formel<br />

aufstellen. Wie im oberen Teil bereits erwähnt wird nun ein Pfad gesucht,<br />

auf dem niemals x=0 gilt. Hierzu wird der Zähler entfaltet beziehungsweise aufgerollt.<br />

Das bedeutet, der Zähler wird (k+1)-mal hintereinander geschrieben.


7<br />

Damit beschränkt man sich auf k + 1 Zustände eines Pfades. Der Index des<br />

Zählers kennzeichnet dann, in welchem Zustand dieser sich befindet. Diese Anfangsschranke<br />

k kann frei gewählt werden, für das Beispiel würde sich für k =2<br />

eine aussagenlogische Formel wie folgt ergeben:<br />

1. (x 1 [0] = x 0 [1]) ∧ (x 1 [1] = x 0 [2]) ∧ (x 1 [2] = 1)∧<br />

2. (x 2 [0] = x 1 [1]) ∧ (x 2 [1] = x 1 [2]) ∧ (x 2 [2] = 1)<br />

Es ist wichtig auch das unendliche Verhalten mit einfließen zu lassen:<br />

(x i [0] = x 2 [1]) ∧ (x i [1] = x 2 [2]) ∧ (x i [2] = 1)<br />

Um die Eigenschaft aussagenlogisch zu erfassen muss gelten:<br />

(x i [0] = 1) ∨ (x i [1]=1)∨ (x i [2]=1):=E i<br />

In Kombination ergibt sich eine aussagenlogische Formel der Form:<br />

∨<br />

f M ∧ 2 ∧<br />

S i ∧ 2<br />

i=0<br />

E i<br />

i=0<br />

Diese Formel ist erfüllt genau dann, wenn es ein Gegenbeispiel der Länge 2 für<br />

die Ausgangsformel F(x = 0) gibt.


8<br />

3.3 LTL spezifisch: Semantische Grundlagen<br />

Um das Modell des Systems zu beschreiben werden Kripke-Strukturen<br />

K =(I, S, T , L) [9] als Grundlage angenommen. Im Prinzip kann jede endliche<br />

Automatendarstellung verwendet werden. Kripkestrukturen haben jedoch<br />

den Vorteil, dass sie von den Ein- und Ausgaben abstrahieren. Es kommen dabei<br />

nur Kripke-Strukturen in Betracht, die eine boolesche Kodierung erlauben<br />

(S = {0, 1} n ).<br />

Es werden zudem folgende aussagenlogische Formeln definiert:<br />

f I (s) := I(s) gdw. s ∈I<br />

f T (s, t) :=T (s, t) gdw. (s, t) ∈ T<br />

f p (s) := p(s) gdw. p ∈L(s)<br />

Es muss weiter gelten, dass jeder<br />

Zustand einen Vorgänger hat. Für alle s ∈Sexistiert ein t ∈S, so dass gilt<br />

(s, t) ∈T.Für eine unendliche Folge von Zuständen π =(s 0 ,s 1 , ...) gilt dabei,<br />

dass π(i) =s i und π i =(s i ,s i+1 , ...) für alle i ∈ N.<br />

Definition von LTL auf einer Kripke-Struktur<br />

Sei M eine Kripke-Struktur, π ein Pfad in M und f eine LTL Formel, dann gilt<br />

für π |= f:<br />

π |= p gdw. p ∈L(π(0)) π |= ¬p gdw. p/∈L(π(0))<br />

π |= f ∧ und<br />

∨<br />

g gdw. π |= f<br />

oder π |= g<br />

π |= Gf gdw. ∀.π i |= f π |= Ff gdw. ∃ i.π i |= f<br />

π |= Xf gdw. π 1 |= f<br />

π |= f U g gdw. ∃i [π i |= g und ∀j, j < i.π j |= f]<br />

Zur Erinnerung:<br />

Eine LTL Formel f ist auf einer Kripke-Struktur universell gültig<br />

(M |= Af), falls für alle Pfade π in M mit π(0) ∈I gilt.<br />

Eine LTL Formel f ist auf einer Kripke-Struktur existentiell gültig<br />

(M |= Ef), falls ein Pfad π in M existiert mit π(0) |= f und π(0) ∈I<br />

gilt.<br />

Im Folgenden werden nur existentielle Probleme betrachtet. Eine Umwandlung<br />

von einer universellen in ein existentiellen Formel ist in [9] beschrieben.


9<br />

3.4 Basis des bounded model checking<br />

Im Eingangsbeispiel wurde schon die grundlegende Idee dieses Ansatzes vorgeführt,<br />

die im Weiteren genauer vorgestellt werden soll. Wenn man von Gegenbeispielen<br />

spricht, so ist dem Anwender oft unklar was genau damit gemeint ist.<br />

Im Zusammenhang mit der vorgestellten Methode geht es nur um Gegenbeispiele<br />

einer bestimmten Länge. Diese Länge ist beschränkt, was damit zu tun hat,<br />

dass man nur eine endliche Menge von Präfixe eines Pfades betrachtet. Dabei<br />

hängt die Menge der Präfixe von der aktuell betrachteten Schranke k ab, diese<br />

beschränkt die Menge nach oben. Diese Menge ist nicht fest definiert, sie ändert<br />

sich je nach Betrachtung. Dies bedeutet, wenn auf einem betrachteten Pfad bis<br />

zur Schranke k kein Gegenbeispiel gefunden wurde, so wird die Schranke k sukzessiv<br />

erhöht.<br />

Diese Betrachtung nur bestimmter Mengen von Zuständen eines Pfades bringen<br />

Probleme mit sich, da dadurch das unendliche Verhalten des Systems untergraben<br />

wird. Dieses unendliche Verhalten wird dadurch sichergestellt, dass<br />

trotz einer nur endlichen Menge an Zuständen, unendlich lange Pfade existieren<br />

durch Transitionsübergänge mit Hilfe von Schleifen. Diese Übergänge führe vom<br />

aktuellen Zustand in einen früher schon besuchten Zustand, die Übergänge bezeichnet<br />

man als back loop (Abbildung 2 b). Das nun auftretende Problem ist,<br />

wenn vom letzten Zustand keine solche Schleife zu einem der vorhergehenden<br />

Zustände existiert, so kann keine Aussage über das unendliche Verhalten des<br />

Pfades getroffen werden. Folgerichtig kann nur dann ein Pfad die Formel Gf<br />

realisieren, wenn vom letzten Zustand, der durch k bestimmt wird, eine Schleife<br />

in einen der vormals besuchten Zustände existiert.<br />

Abbildung 2. Zwei Fälle für einen beschränkten Pfad<br />

Definition k-Schleife<br />

Für l ≤ k wird der Pfad π als (k,l)-Schleife bezeichnet, wenn π(k) → π(l) und<br />

π = u · ν ω mit u =(π(0), ..., π(l − 1)) und ν = π(l), ..., π(k)) erfüllt ist.<br />

Die im Folgenden benötigte begrenzte Semantik bei Temporallogiken wie LTL<br />

sei wiederum nur exemplarisch erwähnt.


10<br />

3.5 LTL spezifisch: Änderung der Semantik<br />

In der nun vorliegenden begrenzten Semantik werden nur die ersten k+1 Zustände<br />

s 0 , ..., s k eines Pfades auf ihre Erfüllbarkeit hinsichtlich der Formel überprüft.<br />

Dies bedeutet, wenn ein Pfad π eine k-Schleife enthält, dann ist eine LTL-Formel<br />

f auf diesem Pfad mit Schranke k erfüllt, wenn π |= f gilt. Für die begrenzte<br />

Semantik würde dies symbolisch mit einem Index k angezeigt π |= k f.<br />

Ein Problem ergibt sich allerdings bei der Formel Fp. Diese ist erfüllt, falls es<br />

ein i ∈ N gibt, so dass π i auf π gilt. In der begrenzten Semantik allerdings gibt<br />

es für den Zustand k+1 keinen Nachfolger. So ist eine rekursive Definition über<br />

Suffixe auf π nicht möglich. Aus diesem Grund wird in der Notation ein zusätzlicher<br />

Parameter i eingefügt |= i k<br />

. Dieser vermerkt die aktuelle Position des Präfix<br />

im Pfad. Aus dieser Betrachtung heraus ändert sich die Definition von LTL auf<br />

Kripke-Strukturen.<br />

Sei nun k ∈ N und π ein Pfad, der keine k-Schleife ist, dann ist eine LTL-Formel<br />

f auf einem Pfad π mit Schranke k gültig (π |= k f) genau dann, wenn π |= 0 k gilt.<br />

Die dabei auftretenden Änderungen sind:<br />

π |= i k p<br />

gdw. p ∈L(π(i))<br />

π |= i k f ∧ ∨ g gdw. π |=i k f und<br />

oder π |=i k g<br />

π |= i k Gf<br />

π |= i k Ff<br />

gdw. ist immer falsch<br />

gdw. ∃ j, i ≤ j ≤ k.π |=i k f<br />

π |= i k f U g gdw. ∃ j, i ≤ j ≤ k[π |=j k g und ∀n, i ≤ n


11<br />

3.6 Aussagenlogische Übersetzung<br />

Wesentlich ist nun das bounded model checking Problem auf aussagenlogische<br />

Erfüllbarkeit zu reduzieren. Dafür ist eine aussagenlogische Formel der Art M,f k<br />

notwendig. Die Größe dieser Formel ist polynomial zur Größe von f. Sie ist quadratisch<br />

in k und linear zur Größe der aussagenlogischen Formel für T , I und<br />

p ∈A. Damit ist es möglich existentielle bounded model checking Ausdrücke in<br />

polynomialer Zeit in die gewünschte Aussagenlogik zu reduzieren.<br />

Entfaltung des Transitionssystems:<br />

M k := I(s 0 ) ∧ k−1 ∧<br />

i=0<br />

T (s i ,s i+1 )<br />

Die Übersetzung von der temporalen Formel f hängt davon ab, ob eine k-Schleife<br />

(Notation “ l · i k ”) existiert oder nicht (Notation “·i k ”).<br />

3.7 LTL spezifisch: Aussagenlogische Übersetzung<br />

Es wird nun die Formel h := p U q auf einem Pfad π ohne k-Schleife näher betrachtet.<br />

Sie besagt, würde man im Zustand π i starten unter der Bedingung, dass<br />

i ≤ k gilt, dann ist diese Formel h gültig, falls es eine Position j mit i ≤ j ≤ k<br />

gibt und q in π j gültig ist. Es muss folglich für alle Zustände π(n) zwischen<br />

π(i) und π(j − 1) die Aussage p erfüllt sein. Die Übersetzung ist dabei denkbar<br />

einfach, es muss eine Disjunktion über alle möglichen Positionen j durchgeführt<br />

werden, auf denen q gilt. Auf jeder dieser Positionen muss eine Konjunktion<br />

durchgeführt werden, die erlaubt, dass p entlang des Pfades von π(i) bis π(j −1)<br />

gültig ist.<br />

Wenn man von der Formel · i k<br />

ausgeht, so werden die einzelnen Teilformeln<br />

rekursiv bearbeitet. Es ist dabei festzuhalten, dass sich die aktuelle Position i<br />

natürlich ändern kann, k hingegen nie.<br />

Für eine LTL-Formel f und k, i ∈ N, mit i ≤ k gilt:<br />

p i k<br />

:= p(s i ) ¬p i k := ¬p(s i)<br />

f ∧ ∨ gi k := fi k<br />

∧<br />

∨ gi k<br />

Gf i k<br />

:= false Ff i k := ∨ k<br />

j=i fj k<br />

Xf i k<br />

:= falls i


12<br />

von der Position aus der die Schleife startet.<br />

Das Problem des Nachfolgers wird wie folgt gelöst: Sei k, l, i ∈ N mit l, i ≤ k,<br />

dann ist der Nachfolger succ(i) von i in der (k,l)-Schleife definiert als:<br />

succ(i) :=i +1für i


3.8 Bestimmung der Schranke k<br />

Das Problem was bisher umgangen wurde ist die Wahl der Schranke k. Ausgehend<br />

von dem verwendeten Beispiel M |= k Ef wird für ein vorgegebenes<br />

k überprüft, ob die Bedingung erfüllt ist. Würde dann bei diesem k der Fall<br />

M ̸|= k Ef auftreten, so wird der Wert von k inkrementell erhöht. Dies kann<br />

potentiell zum Halteproblem führen, was bedeutet, die Prozedur terminiert nie.<br />

Diese Aussage würde zutreffen, wenn k potentiell unendlich groß werden könnte.<br />

Dies ist aber nicht möglich. Um nun aber Aussagen treffen zu können, ob<br />

die Schlussfolgerung M ̸|= k Ef zutrifft, also ob k nicht in dem ihm möglichen<br />

Intervall liegt, müssen Eingrenzungen für k getroffen werden.<br />

Die Behauptung, dass k in einem Intervall liegt ist relativ intuitiv. Die zugrundeliegende<br />

Struktur ist ein endlicher Automat mit endlich vielen Zuständen. Da<br />

nur endlich viele besucht werden können, kommen ab einer bestimmten Schranke<br />

k keine neuen Zustände mehr in die betrachtete Menge hinzu und es kann mit<br />

der Erhöhung der Schranke gestoppt werden. Also gilt als grobe Nährung, wenn<br />

M |= Ef gilt, dann muss die Schranke k ≤|M| sein. Hierbei ist |M| die Anzahl<br />

der Zustände der Kripke-Struktur. Das Problem was sich hierbei ergeben würde<br />

wäre, dass der Zustandsraum nicht bekannt ist und so auch nicht die betrachtete<br />

Anzahl an Zuständen. Auf Grund der booleschen Kodierung der Zustände ist es<br />

aber möglich die Anzahl an Zuständen nach oben zu begrenzen. Die maximale<br />

Anzahl an Zuständen einer Struktur wäre demnach 2 n , wobei n die Anzahl der<br />

booleschen Variablen darstellt.<br />

Bei Modellierung größerer <strong>Systeme</strong> ist es offensichtlich, dass diese Grenze zu<br />

groß gewählt ist (32-bit Register).<br />

Definition Diameter Ein Diameter einer Kripke-Struktur M ist die minimale<br />

Anzahl d ∈ N mit folgender Eigenschaft: Für jede Sequenz von Zuständen<br />

s 0 , ..., s d+1 mit (s i ,s i+1 ) ∈ T für i ≤ d, existiert eine Sequenz von Zuständen<br />

t 0 , ..., t l mit l ≤ d, so dass t 0 = s 0 , t l = s d+1 und (t j ,t j+1 ) ∈ T für j ≤ l gilt.<br />

Ist also ein Zustand v von einem Zustand u erreichbar, dann ist v auch über<br />

einen Pfad der Länge kleiner d ausgehend von u erreichbar.<br />

Für eine Formel f := EFp wäre dann M |= EFp erfüllt, wenn ein k ≤ d<br />

existiert, mit M |= k EFp.<br />

Der Diameter d ist die minimale Anzahl an zu untersuchenden Zuständen, die<br />

folgende Formel erfüllt:<br />

d∧<br />

∀s 0 , ..., s d+1 .∃t 0 , ..., t d . T (s i ,s i+1 ) → (t 0 = s 0 ∧ d−1 ∧<br />

∨<br />

T (t i ,t i+1 ∧ d t i = s d+1 )<br />

i=0<br />

13<br />

i=0<br />

i=0<br />

s i = s d+1<br />

i=0<br />

Definition Rekurrenz-Diameter Hierunter versteht man die kleinste Zahl<br />

d ∈ N mit folgender Eigenschaft. Für jede Sequenz von Zuständen s 0 , ..., s d+1<br />

mit (s i ,s i+1 ) ∈ T für i ≤ d existiert ein j ≤ d, so dass s d+1 = s j gilt.<br />

Sei nun eine Formel f mit Rekurrenz-Diameter d gegeben dann gilt M |= Ef<br />

genau dann, wenn ein k ≤ d existiert, mit M |= k Ef.<br />

Der Rekurrenz-Diameter d ist die minimale Anzahl die folgende Formel erfüllt:<br />

∀s 0 , ..., s d+1 .<br />

d∧<br />

∨<br />

T (s i ,s i+1 ) → d<br />

i=0


14<br />

4 Industrieller Einsatz<br />

Die Halbleiterindustrie musste schmerzlich feststellen, dass Fehler in der fertigen<br />

Implementierung sie teuer zu stehen kommen. Im Gegensatz zur Software können<br />

hier nicht einfach Updates durchgeführt werden um aufgetretene Fehler zu beseitigen.<br />

Der der Öffentlichkeit bekannteste Fall trug sich 1994 zu. Intel musste<br />

eine Rückrufaktion für seinen neuen P5 Chip starten, neben dem entstandenen<br />

Imageverlust kostetet dies das Unternehmen nach vorsichtigen Schätzungen<br />

mehr als 400 Millionen Dollar. Solche Fehler können schnell das Aus für ein<br />

Unternehmen bedeuten. Gerade in der Entwicklung von neuen Chips, wie für<br />

die neue Generation der UMTS-Handys, ist eine <strong>Verifikation</strong> unerlässlich. Die<br />

Kommunikations- und Transaktionsprotokolle sind so komplex geworden, oft auf<br />

Grund der Vielzahl der zu betrachtenden Parameter, dass eine Absicherung über<br />

Testfälle nicht mehr in Frage kommt. Aus diesem Grund entwickelte die Firma<br />

Infineon mit Siemes in den 90iger ein Tool namens CVE (circuit verification environment),<br />

dass neben einem Äquivalenzvergleicher auch einen Eigenschaftsprüfer<br />

auf Basis von bounded model checking beinhaltet.<br />

Die Arbeitsweise dieses Tools namens gateprop soll im Folgenden exemplarisch<br />

vorgestellt werden.<br />

Die Schaltung die nun verifziert werden soll stellt einen ATM-Error-Controller<br />

dar [8]. ATM ist die Abkürzung für asynchroner Transfer Modus und wir eingesetzt<br />

bei breitbandigen Weitverkehrsnetzen. Die Merkmale sind eine verbindungsorientierte<br />

Kommunikation mit Rahmen feste Länge, den sogenannten Zellen.<br />

Zur Überprüfung der Zellen wird ein Cyclic Redundancy Check angewendet.<br />

Da die Zellen eine Hämingdistanz von 4 besitzen ist es möglich 1-Bit-Fehler zu<br />

erkennen und gleichzeitig zu korrigieren.<br />

Die zu entwickelnde Schaltung soll hierbei die Aufgabe übernehmen zu entscheiden,<br />

ob eine Zelle korrigierbar ist oder ob sie verworfen und neu angefordert<br />

werden muss. Dieser ATM error controller (AEC) besitzt hierfür zwei Eingangsund<br />

Ausgangsleitungen. Der Zusammenhang wird in der Tabelle verdeutlicht.<br />

Eingänge<br />

multiple error alter<br />

Zustand<br />

Ausgänge<br />

correct it reject it<br />

0 0 0 0 0 0<br />

0 0 1 0 0 0<br />

0 1 0 1 0 1<br />

0 1 1 0 1 1<br />

1 0 0 0 0 0<br />

1 0 1 0 0 0<br />

1 1 0 0 1 1<br />

1 1 1 0 1 1<br />

neuer<br />

Zustand<br />

Die wesentliche Aussage des Controllers soll sein, wenn nur ein einfacher Fehler<br />

vorliegt (error = 1) dann soll er korrigiert werden und wenn ein mehrfacher


15<br />

Fehler vorliegt (multiple = 1) soll die Zelle verworfen werden. Die Entscheidung<br />

hängt dabei zusätzlich vom internen Zustand ab. Dies lässt sich nun als Schaltung<br />

darstellen (Abbildung 3).<br />

Abbildung 3. ATM error controller<br />

Der Zustand der sequentiellen Schaltung ist ’1’ genau dann, wenn ein fehlerhafter<br />

Block im vorangegangenen Schritt empfangen wurde.<br />

Der heutige Designentwurf läuft mit Hilfe von Hardwarebeschreibungssprachen<br />

(VHDL, Verilog) ab, daher stellt die Schaltung eigentlich nur eine visuelle<br />

Repräsentation des HDL-Codes da. Um mit dieser Schaltung weiter arbeiten<br />

zu können ist es wichtig den Flip-Flop zu entfernen, der den internen Zustand<br />

darstellt. Hierzu wird dieser Speicher durch eine interne Leitung ersetzt (Abbildung<br />

4). Diese interne Leitung wird zu den primären Leitungen als zusätzlicher<br />

Eingang beziehungsweise Ausgang gezählt. Der sich ergebende ATM wird als<br />

Com(AEC) bezeichnet.<br />

Abbildung 4. Com(AEC)


16<br />

Betrachtet man nun die Schaltung so könnte man sich die Schaltung als Black<br />

Box vorstellen, in die Eingangsleitungen münden und Ausgangsleitung austreten.<br />

Diese Box wäre nichts anderes als eine kombinatorische Schaltung. Für<br />

die Untersuchung dieser Schaltung und der Konstruktion des bounded model<br />

checking Problem müsste dieser kombinatorische Block aufgerollt werden. Wie<br />

oft wird mittels der Schranke k bestimmt. Die sich ergebende Konstruktion ist<br />

in (Abbildung 5) erkennbar. Hierbei ist zu erkennen, dass der Com(AEC) 3-mal<br />

hintereinander geschaltet wurde. Die Kombination spiegelt den zeitlichen Ablauf<br />

der Schaltung wieder.<br />

Abbildung 5. AEC 3 Zeiteinheiten hintereinander<br />

Was drückt dies eigentlich aus? Im Prinzip wurde nichts anders gemacht als die<br />

Schaltung in einen endlichen Automaten zu überführen. Dieser Automat wurde<br />

im nächsten Schritt aufgerollt. Dieser endliche Automat F n,m,k kann beschrieben<br />

werden als eine boolesche Funktion mit n+k Eingabevariablen und m+k<br />

Ausgabevariablen.<br />

Diese interne Darstellung der Schaltung als Automat ist jedoch nur der erste<br />

Schritt in der Konstruktion des bounded model checking Problem. Wichtig ist<br />

es nun die Eigenschaften zu spezifizieren. Hierzu wird die Intervalltemporallogik<br />

ITL verwendet (weiterführende Informationen in ”Gateprop Cookbook of Infineon<br />

Technologie AG”).<br />

Diese diskrete Temporallogik ist sehr einfach zu verstehen, also auch geeignet<br />

für Nichtformalisten. Der Aufbau der zu untersuchenden Eigenschaft besteht aus<br />

zwei Teilen:<br />

1. Annahme (eng. assumption) definiert die Arbeitsumgebung<br />

2. Verpflichtung (eng. commitment) zu erwartende Verhalten


17<br />

Der Aufbau der Syntax und der Semantik wird im Anhang B näher beleuchtet.<br />

Nachdem die Eigenschaften aufgestellt sind müssen diese überprüft werden. Hierzu<br />

muss untersucht werden, ob die Verpflichtung eine Konsequenz der Annahme<br />

ist, also ob die Annahme die Verpflichtung impliziert:<br />

Eigenschaft =(Annahme → V erpflichtung)<br />

dies entspricht:<br />

Eigenschaft =(Annahme ∨ V erpflichtung)<br />

Der Ablauf wird nun an einem Beispiel verdeutlicht:<br />

1 theorem T1 ist<br />

2 assume:<br />

3 at t: error = ’0’;<br />

4 prove:<br />

5 at t: correct_it = ’0’;<br />

6 at t: reject_it = ’0’;<br />

7 end theorem;<br />

In diesem Fall gilt für:<br />

Annahme = error (1)<br />

V erpflichtung = correct it (1) ∧ reject it (1)<br />

Die Ausgänge hängen kombinatorisch mit den Eingängen zusammen, dies lässt<br />

sich wiederum mit Hilfe einer aussagenlogischen Formel darstellen:<br />

correct it (1) = multiple (1) ∧ error (1) ∧ u (1)<br />

1<br />

reject it (1) =(multiple (1) ∨ u (1)<br />

1 ) ∧ error(1)<br />

Die exemplarische Berechnung würde wie folgt ablaufen:<br />

Eigenschaft 1 = error (1) ∨ correct it (1) ∧ reject it (1)<br />

= error (1) ∧ correct it (1) ∨ reject it (1)<br />

= (error (1) ∧ correct it (1) ) ∨ (error (1) ∧ reject it (1) )<br />

= (error (1) ∧ (multiple (1) ∧ error (1) ∧ u (1)<br />

1 ))<br />

∨(error (1) ∧ ((multiple (1) ∨ u (1)<br />

1 ) ∧ error(1) ))<br />

= 0 ∨ 0<br />

=1


18<br />

Diese einzelne Eigenschaft alleine würde jedoch nicht ausreichen um den Controller<br />

zu verifizieren. Es müssen noch weitere Eigenschaften aufgestellt werden.<br />

1 theorem T2 ist<br />

2 assume:<br />

3 at t: error = ’0’;<br />

4 at t+1: error = ’1’;<br />

5 at t+1: multiple = ’0’;<br />

6 prove:<br />

7 at t+1: correct_it = ’1’;<br />

8 end theorem;<br />

1 theorem T3 ist<br />

2 prove:<br />

3 at t+1: correct_it = ’0’ or reject_it = ’0’;<br />

4 end theorem;<br />

1 theorem T4 ist<br />

2 assume:<br />

3 during [t,t+1]: error = ’1’;<br />

4 at t+1: multiple = ’0’;<br />

5 prove:<br />

6 at t+1: reject_it = ’1’;<br />

7 end theorem;<br />

1 theorem T5 ist<br />

2 assume:<br />

3 at t: error = ’1’;<br />

4 at t: multiple = ’1’;<br />

5 prove:<br />

6 at t+1: reject_it = ’1’;<br />

7 end theorem;<br />

Die vorgenommenen Umformungen und Berechnungen werden in Abbildung 6<br />

als work flow des Tools gateprop noch einmal verdeutlicht. Die Übersetzung des<br />

HDL-Design in die interne Automatendarstellung wird automatisch vorgenommen.<br />

Aus der informellen Spezifikation eine formale Spezifikation zu fertigen<br />

bleibt allerdings dem Benutzer vor.<br />

Auch wenn die Benutzung dieses Tool sehr einfach erscheint und die kompliziertesten<br />

Schritte automatisiert sind, so ist die Frage, ob sich der Benutzer auf alle<br />

Ausgaben einfach so verlassen kann?


Abbildung 6. Arbeitsweise von gateprop als work flow [10]<br />

19


20<br />

5 Auseinandersetzung<br />

Nachdem nun das Tool gateprop vorgestellt wurde ist die Frage, ob der Benutzer<br />

den Ausgaben blindlings vertrauen kann? Diese Frage ist eindeutig mit<br />

nein zu beantworten. Der Grund liegt in der Aussagekraft der Ergebnisse. Nicht<br />

immer, wenn das Tool ein Gegenbeispiel präsentiert handelt es sich um einen<br />

Fehler im Design. Das hierbei zu erwähnende Schlagwort ist ”false negative”.<br />

Dies bedeutet, dass jedes Gegenbeispiel untersucht werden muss, ob es in einem<br />

erreichbaren oder unerreichbarem Zustand endet. Kommt letzteres vor, so ist der<br />

Fehler in den Anforderungen zu suchen. Der Benutzer ist beim Aufstellen der<br />

Eigenschaften von falschen Annahmen ausgegangen. Falsche Annahmen stammen<br />

aus dem assume-Teil der spezifizierten Eigenschaft. Würde dieser Fall nun<br />

auftreten, müssten dort die Änderungen vorgenommen werden.<br />

Ein reiner Designfehler wäre erst dann gefunden, wenn nach Überprüfung des<br />

Gegenbeispieles es sich herausstellt, dass dieser in einem erreichbaren Zustand<br />

mündet.<br />

Eine erste Schlußfolgerung wäre damit, dass die Aufstellung der Spezifikationen<br />

(informell und formell) nur von Fachleuten vorgenommen werden darf, die sich<br />

mit dem Verhalten des System auskennen und wissen welche kritischen Bedingungen<br />

in der Arbeitsumgebung zu berücksichtigen sind.<br />

Eine weiter wichtige Erfahrung im Umgang mit bounded model checking und<br />

dem Tool gateprop wurde in [5] erkannt. Die Autoren stellten sich die Aufgabe<br />

eine Brücke eines neuen Systembusses zu untersuchen und setzten dazu Testverfahren<br />

und das Tool gateprop ein. Die dabei entstandenen Ergebnisse sind in der<br />

folgenden Tabelle aufgeführt.<br />

Bug Type<br />

Property<br />

Checker<br />

Direct Testing<br />

Verletzungen des 11 4 8<br />

Busprotokolls<br />

interne Design 0 2 4<br />

Queue Probleme<br />

Livelock/ Deadlock 0 5 2<br />

andere Design Probleme<br />

7 3 8<br />

Gesamt 18 14 22<br />

Random<br />

Testing<br />

Die Frage die man sich nun stellen würde, warum findet der Eigenschaftsprüfer<br />

in einigen Fällen überhaupt keine Fehler, während die Test-Methoden mehrere<br />

Verletzungen der Spezifikationen aufzeigen? Zum einen liegt es daran, dass Fehler<br />

nur dann gefunden werden, wenn dafür auch Eigenschaften verletzt werden.<br />

Es ist daher erforderlich alle Eigenschaften, die die Schaltung erfüllen muss auch<br />

formal zu spezifizieren, da sonst Bugs im Design nicht vermieden werden können.<br />

Der andere weniger offensichtliche Fehler liegt in der Anwendung. Busprotokolle<br />

sind seltener zeitabhängig und können mit relativ geringer Zeitschranke spe-


21<br />

zifiziert und überprüft werden. Dem gegenüber stehen die Transaktionseigenschaften.<br />

Hier treten Fehler, insbesondere Deadlocks, erst nach gewissen zeitlichen<br />

Abläufen auf. Die Deadlockwahrscheinlichkeit ist in Fällen von überfüllten<br />

Queues besonders wahrscheinlich. Diese sind auch mit bounded model checking<br />

zu finden, allerdings müsste der Benutzer - in erster Betrachtung - hierfür viel<br />

Zeit und Geduld investieren, bis die Berechnung beendet ist. Würde man hingegen<br />

einen Spezialisten damit beauftragen mit sehr genaue Kenntnisse über<br />

das zu untersuchende System, so hätte dies einige Vorteile. Ihm ist es möglich,<br />

mit einem geringeren Risiko von false negative, den Startzustand des bounded<br />

model checking Problem zu variieren. Der Fehler der Autoren bezüglich der Verwendung<br />

von gateprop lag genau in diesem Punkt. Sie änderten den Zustand<br />

niemals und passten ihn damit nicht an die zu untersuchende Eigenschaft an.<br />

Jeder Erstbenutzer würde genau so handeln und sich den einfachsten Zustand als<br />

Initialzustand der Untersuchung aussuchen, in diesem Fall war es der Zustand<br />

nach dem RESET der Brücke.<br />

Denkbar wäre hier eine Kombination aus den Vorteilen von Testsuiten und den<br />

formalen Methoden. Testfälle könnte potentielle Deadlockfälle ausloten, die dann<br />

mittels gateprop untersucht würden. Der Vorteil wäre, dass man leichter den Initialzustand<br />

bestimmen könnte und zudem auch mit Sicherheit Aussagen über<br />

weitere Deadlocks in der Abfolge der Verarbeitung machen könnte.<br />

5.1 Vergleich mit etablierten Techniken<br />

An dem Tool gateprop konnte man erkennen, dass bounded model checking Probleme<br />

sich sehr gut mit SAT-Prozeduren kombinieren lassen. Eine weitere Technik,<br />

die in diesem Zusammenhang einer Erwähnung würdig wäre sind BDDs.<br />

BDDs eignen sich weniger gut in Kombination mit bounded model checking Problemen,<br />

da sie eine Repräsentation der zugrundeliegenden Datenstruktur darstellen.<br />

Ihr Problem ist nicht das Handling der Datenstruktur, sondern ihr Aufbau.<br />

Die guten Eigenschaften von BDDs kommen erst zur Geltung nach Aufbau der<br />

Struktur und erlauben dann die Anwendung von booleschen Operationen auf den<br />

Datenstrukturen. Diese Operationen sind ohne jeden Zweifel sehr effizient und<br />

können mit heutigen Implementierung sehr schnell ausgeführt werden. Da die<br />

Konstruktion von bounded model checking Problemen, in Abhängigkeit von der<br />

Grenze k und der Anzahl der booleschen Variablen des Systems, zu sehr komplexen<br />

Formeln führen kann, ist die Konstruktion dieser Entscheidungsdiagramme<br />

sehr kompliziert. Die notwendige kanonische Darstellung führt bei ungünstiger<br />

Variablenkonstruktion beziehungsweise ungünstigen Funktionen zu einer exponentiellen<br />

Speicherexplosion, die die Vorteile des Ansatzes mehr als aufhebt.<br />

SAT Prozeduren kommen ohne aufwendige Datenstruktur aus. Da sie eine kanonische<br />

Darstellung des Systems vermeiden, vermeiden sie auch mögliche exponentielle<br />

Speicherexplosionen. So müssen sie auch nicht den Zustandsraum<br />

durchsuchen, um ein mögliches Gegenbeispiel für das zu untersuchende Problem


22<br />

zu finden. Weitere Vorteile von SAT sind, dass die verwendeten SAT-Prover sehr<br />

effizient und schnell geworden sind, nicht zuletzt durch die Anwendungen im<br />

technischen Bereich. SAT erlaubt es neben dem eigentlichen Property Checking<br />

auch im Äquivalenzvergleich eingesetzt zu werden, um neue Schaltung auf Funktionsgleichheit<br />

mit bereits existierenden zu untersuchen. Die existierenden SAT<br />

Werkzeuge SATO (Davis und Putnam Algorithmus) oder PROVE (Stalmårck<br />

Methode) und darauf aufbauende Algorithmen schlagen hinsichtlich ihres Einsatzbereiches<br />

Methoden auf Basis von BDDs, die mit ihrer Breitensuche und<br />

dem Speichplatzproblem benachteiligt sind.<br />

Das wichtig, gerade im Einsatz in der Industrie, ist die Möglichkeit viele Schritte<br />

zu automatisieren, um so die Fehlerquelle Mensch auszuschließen und zum anderen<br />

Kosten zu senken. Auch hier haben BDDs wesentliche Nachteile gegenüber<br />

SAT-Prozeduren. Zwar existieren Heuristiken zur Sortierung der Variablenordnung,<br />

die einen wesentlichen Teil der Speicherexplosion mit zu verantworten haben,<br />

letztendlich wird die Variablenordnung immer noch erheblich vom Benutzer<br />

mitbestimmt [2]. Der hohe Automatisierungsgrad in der <strong>Verifikation</strong> lässt sich<br />

sehr gut am Tool gateprop erkennen. Hierbei wird der HDL-Code des Designs<br />

automatisch in eine interne Automatendarstellung übersetzt. Das einzige was<br />

hier vom Benutzer noch verlangt wird ist die Formalisierung der Spezifikation.<br />

Schlussendlich stellt sich nur noch die Frage nach der Anwendungsbreite und<br />

damit nach den Grenzen dieser neuen Technik.<br />

Die wichtigsten Eigenschaften die <strong>Systeme</strong> erfüllen müssen sind die bekannten<br />

Sicherheits- und Lebendigkeitseigenschaften die mittels Temporallogik spezifizierbar<br />

sind. Diese wesentlichen Eigenschaften können in ein bounded model<br />

checking Problem umgewandelt werden und auf dem Design untersucht werden.<br />

Die Grenzen zur Lösung dieser Probleme liegen in mehreren Faktoren. Zum einen<br />

ist aus den Formeln ableitbar, dass komplexe <strong>Systeme</strong> auch komplexe Transitionsübergänge<br />

mit sich ziehen. Dies bedeutet, je komplexer ein System, desto<br />

länger dauert die Berechnungszeit. Allerdings hängt die Berechnungszeit, wie in<br />

[5] aufgezeigt auch wesentlich von der spezifizierten Arbeitsumgebung ab, dem<br />

allgemeinen Startzustand. Somit ist die Laufzeit wesentlich von dem zu untersuchenden<br />

System und natürlich von der zu untersuchenden Eigenschaft abhängig.<br />

Wesentliche Fortschritte in der Verkürzung der Laufzeit zeigt der Übergang von<br />

den allgemeinen akademischen Problemen, die sich mit dem bekannten Temporallogiken<br />

(CTL, CTL*, ...) spezifizieren lassen zu den Problemen der Industrie.<br />

Wenn man sich die Intervalltemporallogik anschaut so ist offensichtlich,<br />

dass die Anzahl möglicher spezifizierbarer Eigenschaften geringer ist, als mit den<br />

oben vorgestellten Logiken möglich wäre. Das liegt zum einen in dem nur endlich<br />

großen Zeitintervall das betrachtet wird und zum anderen in der begrenzten<br />

Ausdrucksfähigkeit der temporalen Operatoren. Diese Logik ist hervorragend auf<br />

bounded model checking zugeschnitten und erlaubt zudem eine leichte Verständ-


23<br />

lichkeit. Die Begrenzung der zu untersuchenden Eigenschaften, wie am Beispiel<br />

des AEC vorgestellt, auf nur wenige Zeitschritte zeigt erst warum sich bounded<br />

model checking als hervorragende Technik im industriellen Alltag etabliert hat.<br />

In der Praxis kommen selten Eigenschaften mit Schranken größer zehn vor.<br />

Auch wenn bounded model checking sich in der Praxis schon bewährt hat, so<br />

befindet es sich immer noch in der Entwicklung seiner Fähigkeiten. So ist bisher<br />

nur eine begrenzte Anzahl an Eigenschaften spezifizierbar. Diese Unvollständigkeit<br />

hinsichtlich der Spezifizierungen wie Fairness- oder Persistenzeigenschaften<br />

scheint jedoch in der Industrie weniger von Bedeutung zu sein, als im akademischen<br />

Bereich. Es bleibt abzuwarten, ob es in naher Zukunft möglich ist Fixpunktoperationen<br />

in bounded model checking Probleme zu übertragen.<br />

Der für den Benutzer markanteste Nachteil ist die Aussagekraft des Ergebnisses.<br />

Am Beispiel des AEC wurde schon aufgezeigt, dass der Benutzer darauf achten<br />

muss, dass er bei der formalen Spezifikation nicht den Fehler begeht und false<br />

negative beschreibt. Hier liegt es also am Benutzer die Gegenbeispiele zu untersuchen,<br />

ob hier keine Zeugen gefunden wurden, die in einen unerreichbaren<br />

Zustand münden. Was für das Gegenbeispiel gilt muss natürlich auch für den<br />

Beweis gelten. Auch hier darf nicht einfach angenommen werden, dass bei dem<br />

Ergebnis ”die spezifizierte Eigenschaft ist erfüllt” dies auch automatisch gilt.<br />

Hier kann es immer noch sein, dass ein Fehler in der Annahme aufgetreten ist.<br />

So hängt schlussendlich ein korrekt spezifiziertes System von korrekt spezifizierten<br />

Eigenschaften ab. Wenn diese korrekt und vollständig sind, dann liefert auch<br />

bounded model checking in Kombination mit einem Eigenschaftsprüfer verlässliche<br />

Ergebnisse.<br />

Siehe hierzu “Tuning sat checkers für bounded model checking” von O.Shtrichman<br />

und “Combining decisions diagrams and sat procedures for efficient symbolic<br />

model checking” P.F.Williams, A.Biere sowie [3].


24<br />

A<br />

2-Bit Zähler<br />

Anhand des Zählers sollen verschiedene Eigenschaften mit Hilfe von bounded<br />

model checking überprüft werden. Die dabei abzuarbeitenden Phasen sind:<br />

1. Verhalten des Transitionssystems als aussagenlogische Formel kodieren<br />

2. Eingabe der Formel in einen Eigenschaftsprüfer<br />

Dazu werden benötigt:<br />

Transitionssystem M<br />

Eigenschaft als aussagenlogische Formel f<br />

Anfangsschranke k<br />

Die für das Transitionssystem benötigte aussagenlogische Formel wird durch<br />

folgende Parameter bestimmt:<br />

M k := I(s 0 ) ∧ k−1 ∧<br />

i=0<br />

T (s i ,s i+1 )<br />

Diese Formel in Kombination mit der zu untersuchenden Eigenschaft EFp und<br />

der Anfangsschranke k=2 führt zur Zielformel:<br />

M,f 2 := I(s 0 ) ∧ T (s 0 ,s 1 ) ∧ T (s 1 ,s 2 ) ∧ (p(s 0 ) ∨ p(s 1 ) ∨ p(s 2 ))<br />

Der letzte Maxterm drückt dabei die Eigenschaft EFp k aus.<br />

Der zu untersuchende 2-Bit Zähler ist dargestellt mit a als most significant Bit<br />

und b als least significant Bit. Daraus ergibt sich folgendes Transitionssystem:<br />

(a ′ ↔¬a) ∧ (b ′ ↔ a ⊕ b)<br />

Für den Startzustand (0, 0) soll überprüft werden, ob innerhalb zweier Zeitschritte<br />

der Zustand (1, 1) erreicht werden kann:<br />

I(s 0 ) ( ¬a 0 ∧¬b 0 )∧<br />

T (s 0 ,s 1 )((a 1 ↔¬a 0 ) ∧ (b 1 ↔ (a 0 ⊕ b 0 )) )∧<br />

T (s 1 ,s 2 )((a 2 ↔¬a 1 ) ∧ (b 2 ↔ (a 1 ⊕ b 1 )) )∧<br />

p(s 0 ): ( a 0 ∧ b 0 ∨<br />

p(s 1 ):<br />

a 1 ∧ b 1 ∨<br />

p(s 2 ): a 2 ∧ b 2 )<br />

Diese Formel ist unerfüllbar, wie erwartet.<br />

Der Zähler wird nun um eine weitere Transition ergänzt (Abbildung 7). Es wird<br />

eine Schleife vom Zustand (1, 0) zu sich selbst eingefügt. Es ergibt sich nachstehende<br />

Änderung:<br />

(a ′ ↔¬a) ∧ (b ′ ↔ a ⊕ b) ∨ (b ∧¬a ∧ b ′ ∧¬a ′ )


25<br />

Abbildung 7. 2-Bit Zähler mit Schleife<br />

Sollte der Zustand (1, 1) erreichbar sein, muss die Formel AF(b ∧ a) erfüllt sein.<br />

Offensichtlich ist dies nicht möglich. Es wird also ein Gegenbeispiel gesucht mit<br />

EGp mit p = ¬b ∨¬a. Diese Formel wird geprüft um den wahren Wert von<br />

AF(b ∧ a) zu erhalten. Die Zeitschranke k sei wiederum 2. Die zu beobachten<br />

Zustände werden mit s 0 ,s 1 und s 2 bezeichnet. Jeder dieser Zustände muss<br />

überprüft und erfüllt sein, um EGp zu entsprechen, andernfalls ist es ein Gegenbeispiel<br />

für AF(b ∧ a). Als Formel entsteht:<br />

M 2 := I(s 0 ) ∧ T (s 0 ,s 1 ) ∧ T (s 1 ,s 2 )<br />

T (s 2 ,s 3 ) ∧ (s 3 = s 0 ∨ s 3 = s 1 ∨ s 3 = s 2 )<br />

Die letzte Anforderung hat folgende Bewandtnis. In der Sequenz der Zustände<br />

s 0 ,s 1 ,s 2 muss eine Schleife enthalten sein. Eine Transition vom letzten Zustand<br />

s 2 zu s 0 ,s 1 oder zu sich selbst. Zusammenfassend:<br />

I(s 0 ) ( ¬a 0 ∧¬b 0 )∧<br />

T (s 0 ,s 1 )((a 1 ↔¬a0) ∧ (b 1 ↔ (a 0 ⊕ b 0 ))∨<br />

b 1 ∧¬a 1 ∧ b 0 ∧¬a 0 )∧<br />

T (s 1 ,s 2 )((a 2 ↔¬a1) ∧ (b 2 ↔ (a 1 ⊕ b 1 ))∨<br />

b 2 ∧¬a 2 ∧ b 1 ∧¬a 1 )∧<br />

T (s 2 ,s 3 )((a 3 ↔¬a2) ∧ (b 3 ↔ (a 2 ⊕ b 2 ))∨<br />

b 3 ∧¬a 2 ∧ b 2 ∧¬a 2 )∧<br />

s 3 = s 0 ( (a 3 ↔ a 0 ) ∧ (b 3 ↔ b 0 ) ∨<br />

s 3 = s 1 (a 3 ↔ a 1 ) ∧ (b 3 ↔ b 1 ) ∨<br />

s 3 = s 2 (a 3 ↔ a 2 ) ∧ (b 3 ↔ b 2 ) )∧<br />

p(s 0 ): ( ¬a 0 ∨¬b 0 )∧<br />

p(s 1 ): ( ¬a 1 ∨¬b 1 )∧<br />

p(s 2 ): ( ¬a 2 ∨¬b 2 )<br />

Diese Formel ist natürlich erfüllt. Von (0,0) zu (0,1) über (1,0) gefolgt von einer<br />

self-loop. Somit ist ein Gegenbeispiel zu AF(b∧a) gefunden. Die neue Transition<br />

(self-loop) findet sich in der Formel b i ∧¬a 1 ∧ b i−1 ∧¬a i−1 mit i ∈ 1, 2, 3 wieder.<br />

Es sei hier nur angemerkt das Lebendigkeitseigenschaften nur unter bestimmten<br />

Fairnis Bedingungen sinnvoll sind.


26<br />

B<br />

Temporallogik ITL<br />

Der Aufbau der Syntax sieht wie folgt aus:<br />

::=<br />

theorem is<br />

[asume:<br />

[]]<br />

prove: <br />

end theorem;<br />

Offensichtlich ist es nicht notwendig eine Arbeitsumgebung zu definieren, da<br />

auch Eigenschaften ohne Voraussetzung spezifizierbar sein müssen.<br />

::= ;{;}<br />

Hierunter versteht man die Darstellung eines kombinatorischen logischen Blockes,<br />

repräsentiert durch Eingaben, Zustände, Ausgaben, ... . Wichtig hierbei ist die<br />

Darstellung der Zeit.<br />

theorem test is<br />

prove: at t: ; end theorem;<br />

Es wird in diesem Fall nur ein Beobachtungsfenster [t,t] betrachtet, innerhalb<br />

dessen ein in HDL untersucht werden muss. Die Eigenschaft ist<br />

nur dann erfüllt, wenn wahr ist für alle betrachteten Eingaben,<br />

Zustände, Ausgaben, ... zum Zeitpunkt t .<br />

Auswahl an Temporaloperatoren:<br />

at<br />

::= at :<br />

::= t+ | t-<br />

::= | <br />

theorem test2 is<br />

assume:<br />

at t: ;<br />

prove:<br />

at t+1: ;<br />

at t+2: ;<br />

at t+3: ;<br />

end theorem;<br />

during<br />

::= during :<br />

::= [,]


27<br />

theorem test2new is<br />

assume:<br />

at t: ;<br />

prove:<br />

during[t+1,t+3]: ;<br />

end theorem;<br />

Sicherheitseigenschaften können somit mit during dargestellt werden.<br />

within<br />

::= within :<br />

::= [,]<br />

theorem test3 is<br />

assume:<br />

at t: ;<br />

prove:<br />

within[t+1,t+3]: ;<br />

end theorem;<br />

Mit Hilfe des Ausdrucks within können Lebendigkeitseigenschaften spezifiziert<br />

werden.


28<br />

Literatur<br />

1. Armin Biere, Alessandro Cimatti, Edmund Clarke, Yunshan Zhu: Symbolic Model<br />

Checking without BDDs, In TACAX’99, 1999<br />

2. Armin Biere, Alessandro Cimatti, Edmund Clarke, Yunshan Zhu: Symbolic Model<br />

Checking using SAT procedures instead of BDDs, In Design Automation Conference,<br />

DAC 1999<br />

3. Armin Biere, Alessandro Cimatti, Edmund Clarke, Yunshan Zhu: Bounded Model<br />

Checking Using Satisfiability Solving, Formal Methods in System Design, 2001<br />

4. Armin Biere: Bounded Model Checking Was kommt danach, 2000<br />

5. M. Bartley, D. Galpin, T. Blackmore: A Comparison of Three Verification Techniques:<br />

Directed Testing, Pseudo-Random Testing and Property Checking, DAC<br />

2002<br />

6. W. Kunz: Vorlesungsskirpt <strong>Verifikation</strong> Digitaler <strong>Systeme</strong>, 2003<br />

7. K. L. McMillan: Symbolic Model Checking, Kluwer Academic Publischers 5. Auflage,<br />

1998<br />

8. P. Molitor, S. Silvio: A Coverage Measure for Bounded Model Checking, 2003<br />

9. K. Schneider: Vorlesungsskript <strong>Verifikation</strong> <strong>reaktiver</strong> System, 2003<br />

10. K. Winkelmann: Property Checking Technology: The gateprop Tool, 2001


29<br />

Interpolation and SAT-based Model Checking<br />

Christian Schlosser<br />

Email: ChristianSchlosser@web.de<br />

Zusammenfassung. Moderne SAT - Algorithmen können durch einfache<br />

Modifikationen dazu benutzt werden, um einen Wiederspruchsbeweis für eine<br />

unerfüllbare Belegung eines Erfüllbarkeitsproblems zu liefern. Hier wird ein<br />

Algorithmus vorgestellt, der mit linearem Aufwand Interpolierende von so<br />

einem Beweis liefert. Mit Hilfe dieser Interpolation kann eine vollständige<br />

Erreichbarkeitsanalyse für die Finalzustände eines Automaten durchgeführt<br />

werden. Diese wiederum ermöglicht nun in linearer Zeit eine unbegrenzte<br />

Modellprüfung, die nur auf SAT basiert. Benchmarks haben gezeigt, dass diese<br />

Methode erheblich effizienter bei der Modellprüfung von industriellen<br />

<strong>Verifikation</strong>sproblemen ist als BDD-basierte symbolische Modellprüfung.<br />

Auch einen Vergleich mit anderen erst kürzlich entwickelten auf SATbasierenden<br />

Modellprüfern braucht das hier vorgestellte Verfahren nicht zu<br />

scheuen.<br />

1. Einführung<br />

Symbolische Modellprüfung ist eine Methode zur <strong>Verifikation</strong> von temporalen<br />

Logikbedingungen von endlichen Zustandsräumen. Für die Modellprüfung von<br />

finalen Zuständen haben sich in der Praxis binäre Entscheidungsbäume (BDDs) als<br />

gut geeignet erwiesen.<br />

Werden die <strong>Systeme</strong> aber größer, dann sind diese mit BDDs nicht mehr zu<br />

verifizieren. Hierfür wurde die begrenzte Modellprüfung entwickelt, die mit Hilfe von<br />

SAT - Algorithmen Gegenbeispiele mit einer maximalen Anzahl k an<br />

Zustandsübergängen findet. Der Nachteil dieses Verfahrens ist, dass nicht<br />

nachgewiesen werden kann, dass nicht doch ein Gegenbeispiel länger als k existiert<br />

und somit nur Fehler gefunden werden können, aber nicht gezeigt werden kann, dass<br />

keine Fehler vorhanden sind.<br />

Hier soll eine Methode vorgestellt werden, die unbegrenzte Modellprüfung<br />

ermöglicht und nur auf SAT basiert. Dabei wird ausgenutzt, dass SAT ein formales<br />

Gegenargument liefert, wenn die Logikbedingungen nicht erfüllbar sind. Dies<br />

entspricht bei einer begrenzten Modellprüfung dem Beweis, dass kein Gegenbeispiel<br />

mit Länge kleiner gleich k für eine Eigenschaft existiert. Trotzdem sagt dies noch<br />

nichts darüber aus, ob die Eigenschaft allgemein gültig ist oder nicht, wir werden aber<br />

sehen, dass dieser Beweis Aussagen über die erreichbaren Zustände des Modells<br />

macht, die bei der Modellprüfung ausgenutzt werden können. Genauer gesagt,<br />

gegeben eine Unterteilung der Klauselmenge in zwei Teilmengen A und B, und einem<br />

Beweis, dass diese Klauseln unerfüllbar sind (Wiederspruchsbeweis), ist es möglich,


30<br />

in linearer Zeit eine Interpolierende P der Teilmengen A und B zu generieren, die<br />

folgende Eigenschaften hat:<br />

A impliziert P,<br />

P B ist nicht erfüllbar und<br />

P verwendet nur die gemeinsamen Variablen von A und B.<br />

Dies ermöglicht es, die Finalzustände auf Erreichbarkeit zu überprüfen und<br />

darausfolgend eine unbegrenzte Modellprüfung durchzuführen.<br />

Im nächsten Kapitel wird gezeigt, wie man mit einem SAT-Algorithmus den<br />

benötigten Wiederspruchsbeweis erhält. In Kapitel 4 wird dann eine einfache<br />

Methode vorgestellt, die mit Hilfe von Interpolation eine unbegrenzte Modellprüfung<br />

durchführt. Ein Test dieser Methode in der Praxis an Hand von einigen Eigenschaften<br />

von kommerziellen Mikroprozessoren folgt in Kapitel 5.<br />

2. Extraktion von Beweisen aus SAT – Algorithmen<br />

Eine Klausel ist eine Disjunktion von beliebig vielen booleschen Variablen oder ihrer<br />

Negation. Wir nehmen an, dass die Klauseln nicht allgemeingültig sind, d.h. dass sie<br />

nicht gleichzeitig eine Variable und deren Negation enthalten. Eine Menge von<br />

Klauseln ist erfüllbar, wenn eine Variablenbelegung existiert, bei der alle Klauseln<br />

der Menge den Wert true liefern.<br />

Haben wir nun zwei Klauseln der Form c 1 = v A und c 2 = v B, dann<br />

definieren wir die Vereinigung der beiden Klauseln als A B, unter der<br />

Vorraussetzung, dass A B nicht allgemeingütig sind. Ist A B jedoch<br />

allgemeingütig, so existiert keine Vereinigung. Existiert eine Vereinigung von c 1 und<br />

c 2 , dann wird diese impliziert von c 1 c 2 .<br />

Definition Beweis der Unerfüllbarkeit:<br />

Für eine Menge von Klauseln C ist ein Beweis der Unerfüllbarkeit P ein<br />

gerichteter azyklischer Graph (V P ,E P ), bei dem V P eine Menge von<br />

Klauseln darstellt, so dass:<br />

Für jeden Knoten c V P gilt entweder<br />

o c C und c eine Wurzel oder<br />

o c hat genau zwei Vorgänger c 1 und c 2 , wobei c die<br />

Vereinigung von c 1 und c 2 ist<br />

Die leere Klausel ist das einzige Blatt.<br />

Existiert nun ein Beweis für eine Klauselmenge C, der besagt dass die Klauselmenge<br />

unerfüllbar ist, dann ist auch C unerfüllbar. Dies lässt sich durch Induktion über die<br />

Tiefe des Graphen und mit Hilfe der Transitivität der impliziten Verknüpfung leicht<br />

zeigen.<br />

Zum Erzeugen der Unerfüllbarkeitsbeweise wird ein DPLL – SAT-Algorithmus<br />

verwendet, was aber nicht zwingend erforderlich ist. Während der DPLL -<br />

Algorithmus nach einer erfüllenden Belegung sucht, muss er Entscheidungen treffen,<br />

bei denen er beliebigen Variablen den Wert true zuweist und daraus einen


31<br />

Folgerungsgraph ableitet. Dies ist ein gerichteter azyklischer Graph, dessen Knoten<br />

einer true – Zuweisung einer Variablen entsprechen. Eine Kante von v 1 zu v 2 besagt,<br />

dass durch die Annahme, dass v 1 erfüllt ist, aus einer Klausel folgt, dass v 2 auch<br />

erfüllt sein muss, um die Klausel erfüllen zu können.<br />

Zum Beispiel nehmen wir eine Klauselmenge {(a b), (b c d)} an. Des<br />

weiteren haben wir schon {a, c} als erfüllt angenommen. Daraus ergibt sich<br />

folgender möglicher Folgerungsgraph:<br />

a b<br />

c<br />

d<br />

Abbildung 1: Folgerungsgraph<br />

Das Symbol b wird impliziert von Knoten a und der Klausel (a b), während das<br />

Symbol d von den Konten b und c sowie der Klausel (b c d) impliziert wird.<br />

Eine Klausel ist in Konflikt mit dem Folgerungsgraph, wenn alle ihre Variablen als<br />

Negation in dem Graph vorkommen. Wenn nun so ein Konflikt bei einem SAT-<br />

Algorithmus auftaucht, generiert dieser eine Konfliktklausel, die von den vorhandenen<br />

Klauseln der Klauselmenge impliziert wird. Diese Konfliktklausel wird durch<br />

Vereinigung der in Konflikt stehenden Klausel mit Klauseln aus dem<br />

Folgerungsgraph generiert.<br />

Fügen wir zum Beispiel der Klauselmenge von oben die Klausel (b d) hinzu.<br />

Diese steht in Konflikt mit dem Folgerungsgraph. Die Variable d steht im Konflikt<br />

und wird von der Klausel (b c d) impliziert. Die Vereinigung von dieser Klausel<br />

und der Klausel im Konflikt lautet dann (b c), die auch im Konflikt mit dem<br />

Folgerungsgraph steht. Auch die Variable b vom Folgerungsgraph steht im Konflikt.<br />

Sie wird von der Klausel (a b) impliziert. Vereinigt man diese nun mit der vorhin<br />

erhaltenen Klausel (b c), so erhält man (a c) als eine weitere Konfliktklausel.<br />

Eine von diesen beiden implizierten Konfliktklauseln wird nun der Klauselmenge<br />

hinzugefügt.<br />

Um nun einen Beweis für den unerfüllbaren Fall zu finden muss man beobachten,<br />

welche Sequenzen von Klauseln zu den jeweiligen Konfliktklauseln vereinigt werden.<br />

Im unerfüllbaren Fall liefert ein modifizierter SAT-Algorithmus als Ergebnis eine<br />

leere Klausel, von der aus nun eine Tiefensuche gestartet wird, die nach den<br />

Bedingungen sucht, die ursprünglich diese Sequenz bedingt haben. Es ist im<br />

allgemeinen nicht nötig, alle vom SAT-Algorithmus generierten Konfliktklauseln zu<br />

durchsuchen, um eine leere Klausel ableiten zu können.<br />

3. Der Interpolationsalgorithmus<br />

Nehmen wir nun an, dass wir eine Partitionierung einer Klauselmenge C in eine<br />

indizierte Menge {C 1 ... C n } mit disjunkten Untermengen C i haben. Wir bezeichnen<br />

eine Variable in Beziehung auf als global, wenn sie in mehr als einem C i


32<br />

vorkommt, andernfalls als lokal. Ein Literal bezeichnet man als global (lokal), wenn<br />

die Variable, die es enthält global (lokal) ist. Des weiteren bezeichnen wir mit g(c) die<br />

Disjunktion aller globalen Literale einer Klausel c und mit l i (c) die Disjunktion aller<br />

Literale einer Klausel c, die lokal in C i sind.<br />

Definition -Wiederlegung:<br />

Eine -Wiederlegung von C ist eine indizierte Menge von booleschen<br />

Formeln {p 1 ,...,p n }, so dass:<br />

jedes p i ist impliziert von C i (C i => p i )<br />

die Konjunktion ist unerfüllbar<br />

<br />

<br />

i<br />

p i<br />

jedes p i bezieht sich ausschließlich auf globale Variablen (in<br />

Bezug auf )<br />

Definition Pivotvariable:<br />

Sei P ein Beweis der Unerfüllbarkeit der Klauselmenge C und c V P ein<br />

Konten der keine Wurzel ist, mit den Vorgängern c 1 und c 2 , dann ist die<br />

Pivotvariable von c die eindeutige Variable v für die gilt:<br />

c 1 beinhaltet v und c 2 beinhaltet v, oder<br />

c 1 beinhaltet v und c 2 beinhaltet v.<br />

Haben wir nun einen Beweis P, dass C nicht erfüllbar ist, möchten wir daraus eine<br />

-Wiederlegung ableiten. Dies kann in linearer Zeit mit Hilfe einer einfachen<br />

Vorschrift gemacht werden:<br />

Definition Beweispartitionierung (P):<br />

Sei P ein Beweis der Unerfüllbarkeit der Klauselmenge C, und sei<br />

= {C 1 ,...,C N } eine indizierte Partitionierung von C, dann ist (P) =<br />

{p 1 ,...,p n } so dass für alle Knoten c V P gilt:<br />

wenn c Wurzel ist, dann<br />

- wenn c C i dann p i (c) = g(c),<br />

- sonst p i (c) = true.<br />

sonst, wenn v die Pivotvariable von c ist und c 1 und c 2 die<br />

Vorgänger von c sind:<br />

- wenn v lokal zu C i ist, dann p i (c) = p i (c 1 ) p i (c 2 ),<br />

- sonst p i (c) = p i (c 1 ) p i (c 2 ).<br />

Theorem -Wiederlegung:<br />

Sei P ein Beweis der Unerfüllbarkeit der Klauselmenge C mit der Wurzel r<br />

(die eine leere Klausel ist), und sei = {C 1 ,...,C N } eine indizierte<br />

Partitionierung von C, sei {p 1 (r),...,p n (r)} die Menge der Formeln, dann ist<br />

(P) = {p 1 ,...p n } eine -Wiederlegung von C.


33<br />

Der Beweis dieses Theorems wird geführt, indem man eine Induktion über die<br />

Struktur von P durchführt und dabei zeigt, dass für jeden Knoten c gilt:<br />

C i impliziert pi(c) l i (c),<br />

(c) impliziert g(c) und<br />

i<br />

p i<br />

jedes p i (c) beinhaltet nur globale Variablen.<br />

Den eigentlichen Beweis kann man in [McMillan03] nachlesen.<br />

Jedes p i (r) kann in der Zeit von O(N + L) berechnet werden, wobei N die Anzahl<br />

der Knoten in dem Beweis V P ist und L die gesamte Anzahl der Literale in dem<br />

Beweis der Unerfüllbarkeit von C ist. Eine komplette -Wiederlegung kann in der<br />

Zeit O(nN + L) berechnet werden, wobei n für die Kardialität von steht (Anzahl der<br />

Untermengen in der Partition). Dies ist der Fall, weil p i (r) nur von den Pivotvariablen<br />

der Konten die nicht Wurzel sind abhängt und nur einmal berechnet werden muss.<br />

4. Modellprüfung basierend auf Interpolation<br />

Nun wollen wir zeigen, wie man -Wiederlegungen in einer vollständigen SATbasierten<br />

unbegrenzten Modellprüfung verwenden kann.<br />

Begrenzte Modellprüfung wird eingesetzt, um zu zeigen, dass ein<br />

Transitionssystem keine Übergangsfolge mit k oder weniger Schritten besitzt, die<br />

einer gegebenen Bedingung wiederspricht, wobei k eine feste Grenze ist. Dies kann<br />

als SAT-Problem mit der Grenze k formuliert werden. Für den Fall der<br />

Unerfüllbarkeit kann man aus einem Beweis-generierenden SAT-Algorithmus einen<br />

Beweis extrahieren, der die Nicht-Existenz eines Gegenbeispiels der Länge k zeigt.<br />

Interpoliert man nun diesen Beweis, so kann man eine obere Abschätzung von den in<br />

j Schritten erreichbaren Zuständen bestimmen (für alle 0 j k).<br />

Ein begrenztes Modellprüfungsproblem besteht aus einer Menge von<br />

Bedingungen, die in Initial-, Transitions- und Finalbedingungen unterteilt werden<br />

können. Diese Bedingungen werden nun in eine Konjunktive Normalform übersetzt<br />

und zu jedem Zeitpunkt 0...k instanziiert. Dies ist in Abbildung 2 dargestellt, wobei I<br />

die Initialbedingung, T die Transitionsbedingung und F die Finalbedingung<br />

repräsentiert.<br />

Abbildung 2: begrenzte Modellprüfung<br />

Nehmen wir nun an, dass wir die Klauseln so unterteilen, dass die initiale<br />

Bedingung und die erste Instanz der Transitionsbedingung in der Menge C 1 enthalten<br />

sind, während die finale Bedingung und die übrigen Instanzen der<br />

Transitionsbedingung in der Menge C 2 enthalten sind. Diese Situation ist in


34<br />

Abbildung 3 dargestellt. Die globalen Variablen bei dieser Unterteilung entsprechen<br />

genau den Instanzen der Zustandsvariablen zum Zeitpunkt 1. Mit Hilfe von einem<br />

SAT-Algorithmus zeigen wir nun die Unerfüllbarkeit der Klauselmenge und leiten<br />

von diesem Beweis eine -Wiederlegung {p 1 , p 2 } ab. Da p 1 von der Initialbedingung<br />

und der ersten Transitionsbedingung impliziert wird, folgt daraus, dass p 1 in jedem<br />

Zustand, der vom Initialzustand aus in einem Schritt erreichbar ist, erfüllt ist. Ebenso<br />

gilt, dass p 2 in jedem Zustand, der die Finalbedingung in k - 1 Schritten erreichen<br />

kann, erfüllt ist. Die Konjunktion von p 1 und p 2 ist unerfüllbar, was bedeutet, dass<br />

kein Zustand, der p 1 erfüllt, den Finalzustand in k - 1 Schritten erreichen kann. Nun<br />

wählen wir p 1 als die Initialbedingung und wiederholen den Prozess, so dass wir eine<br />

Bedingung erhalten, die nach zwei Schritten erfüllt sein muss, dann nach drei<br />

Schritten, u.s.w. bis die Disjunktion von p 1 und p 2 einen fixen Punkt erreichen oder<br />

das Problem lösbar wird. Im ersten Fall haben wir erfolgreich bewiesen, dass die<br />

Finalbedingung nicht erreichbar ist, im zweiten Fall müssen wir k erhöhen und noch<br />

mal von Vorne anfangen. Wir können aber zeigen, dass für k größer der reverse depth<br />

(siehe unten) des Zustandsraumes der Prozess zu einem fixen Punkt hin konvergiert.<br />

Somit muss der Prozess mit dem Erhöhen von k irgendwann terminieren.<br />

Abbildung 3: Sequenz von SAT-Problemen generiert von der Modellprüfung


35<br />

4.1. Sicherheitseigenschaften<br />

Sicherheitseigenschaften beschreiben Bedingungen, die nicht eintreffen sollen. Zur<br />

<strong>Verifikation</strong> dieser Eigenschaften beschreibt man das Problem mit einem endlichen<br />

Automaten, der genau dann einen akzeptierenden Zustand erreicht, wenn die<br />

Sicherheitseigenschaften verletzt werden.<br />

Analog zur symbolischen Modellprüfung wird dieser Automat wiederum mit<br />

booleschen Formeln repräsentiert. Der Zustandsraum des Automaten wird durch eine<br />

indizierte Menge von booleschen Variablen V = {v 1 ,...,v n } definiert. Ein Zustand S ist<br />

ein entsprechender Vektor (s 1 ,...,s n ) mit booleschen Werten. Eine Zustandseigenschaft<br />

P ist eine boolesche Formel über V. Der Einfachheit halber schreiben wir P(W) wenn<br />

wir in P[w i /v i ] die v i durch w i ersetzen. Des weiteren wird eine indizierte Menge<br />

„nächster Zustand“ angenommen V’ = {v’ 1 ,...v’ n }. der ungleich V ist. Eine<br />

Übergangsfunktion R ist eine boolesche Funktion über V und V’. Auch hier schreiben<br />

wir R(W,W’) wenn wir die Substitution R[w i /v i , w’ i /v’ i ] meinen.<br />

Für unser Problem beschreiben wir einen Automaten als Tripel M = (I, T, F),<br />

wobei I die Initialbedingung, T die Transitionsbedingung und F die Finalbedingung<br />

beschreibt. Ein Durchlauf von M der Länge k ist eine Sequenz von Zuständen S 0 ...S k<br />

so dass I(S 0 ) erfüllt ist, und für alle 0 i < k T(S i , S i+1 ) erfüllt ist, und F(S k ) erfüllt ist.<br />

Bei einer begrenzten Modellprüfung würden wir nun die Frage der Existenz eines<br />

Durchlaufs der Länge j i k in ein boolesches Erfüllbarkeitsproblem durch<br />

Einführung einer neuen indizierten Menge von Variablen W i = {w i1 ,...,w in } für 0 i <br />

k umformen. Ein Durchlauf der Länge j...k existiert genau dann wenn folgende<br />

Formel erfüllt ist:<br />

BMC<br />

k<br />

j<br />

T(<br />

W , W <br />

<br />

<br />

i<br />

)<br />

F(<br />

W )<br />

0 ik<br />

jik<br />

<br />

I( W ) <br />

0 i 1 i<br />

Diese Formel teilen wir nun in zwei Teile: eine Formel, die die möglichen Präfixe und<br />

eine, die die möglichen Suffixe eines Durchlaufs repräsentieren. Die möglichen<br />

Präfixe einer Länge l werden durch folgende Formel bestimmt:<br />

PREF M ) I(<br />

W ) T ( W , W )<br />

<br />

l<br />

(<br />

l<br />

i i1<br />

l<br />

i0<br />

Ein Präfix beginnt in Initialzustand W -l und endet in einem Zustand W 0 . Die<br />

möglichen Suffixe der Länge j...k werden durch folgende Formel beschrieben:<br />

k<br />

SUFF <br />

<br />

<br />

j<br />

( M ) T(<br />

Wi<br />

, W<br />

i1)<br />

F(<br />

Wi<br />

)<br />

0ik<br />

jik<br />

<br />

Ein Suffix beginnt in einem Zustand W 0 und endet in einem Finalzustand W i wobei j<br />

k<br />

k<br />

i k. Es gilt BMC PREF ( M ) SUFF ( ) und allgemeiner:<br />

BMC<br />

k l<br />

j l<br />

W<br />

/ W PREF ( M )<br />

il<br />

i<br />

l<br />

j<br />

<br />

0 j<br />

M<br />

SUFF k (M ) . Somit ist<br />

k<br />

j<br />

PREFl<br />

( M ) SUFFj<br />

( M )<br />

genau dann erfüllbar, wenn M einen Durchlauf im Längenbereich j + l...k + l hat.<br />

Zur Verwendung eines SAT-Algorithmus benötigen wir nun eine Konjunktive<br />

Normalform obiger Formeln. Wir nehmen an, dass eine Funktion die Übersetzung<br />

der Formeln f in eine Menge von Klauseln (f, U) vornimmt, wobei U eine Menge<br />

von „neuen“ Variablen ist, die nicht in f vorkommen. Die Funktion muss lediglich<br />

folgende Bedingung erfüllen: (U.(f, U)) f . Dies bedeutet, dass die erfüllenden


36<br />

Abbildung 4: Prozedur FiniteRun<br />

Belegungen von (f, U) gleich der denen von f sind, wenn wir die neuen Variablen<br />

ausblenden. Solch eine Funktion ist in linearer Zeit bestimmbar.<br />

Die Basisprozedur zur Überprüfung der Existenz eines endlichen Durchlaufs von<br />

M ist in<br />

Abbildung 4 dargestellt. Hier werden U 1 und U 2 als Mengen von neuen Variablen<br />

angenommen, die voneinander und von allen W i ’s disjunkt sind. Nun soll gezeigt<br />

werden, dass die Prozedur für ein groß genug gewähltes k immer terminiert, wobei zu<br />

sagen ist, dass die Prozedur auch für kleine k endet, allerdings ohne entscheiden zu<br />

können, ob ein Durchlauf von M existiert.<br />

Die Funktionsweise der Prozedur ist wie folgt: Zuerst wird überprüft, ob es einen<br />

Durchlauf der Länge null gibt. Für den Rest der Prozedur kann also angenommen<br />

werden, dass ein solcher nicht existiert. Initial wird die Abschätzung R von den<br />

erreichbaren Zuständen auf I, die Initialzustände, gesetzt.<br />

k<br />

Nun wird die Erfüllbarkeit von PREF geprüft. Ist dies der Fall,<br />

1( M ) SUFF0<br />

( M )<br />

dann gibt es einen Durchlauf der Länge 1...k+1, der bei R beginnt und mit F endet. Ist<br />

nun R = I, dann ist ein Durchlauf von M gefunden und wir terminieren, ist die nicht<br />

der Fall, dann bricht die Prozedur ab ohne entscheiden zu können, ob ein solcher<br />

k<br />

existiert oder nicht. Ist PREF<br />

aber nun nicht erfüllbar, dann<br />

1( M ) SUFF0<br />

( M )<br />

erstellen wir aus den beiden disjunkten Klauselmengen C1 und C 2 und dem Beweis<br />

für die Unerfüllbarkeit eine -Wiederlegung und erhalten zwei Formeln p 1 und p 2<br />

über W 0 . Es gilt zudem, dass p 1 von R(W -1 ) und T(W -1 , W 0 ) impliziert wird. Daraus<br />

folgt, dass p 1 in allen Zuständen von W 0 , die von R aus in einem Schritt erreichbar<br />

sind, erfüllt ist. Des weiteren ist p 2 in allen Zuständen von W 0 erfüllt, die in 0...k<br />

Schritten F erreichen können. Da p 1 p 2 nicht erfüllbar ist, kann kein Zustand der p 1<br />

erfüllt F in bis zu k Schritten erreichen. Somit erhalten wir eine neue (obere)


37<br />

Abschätzung R p 1 [V/W 0 ] der erreichbaren Zustände. Wenn wir nun einen Fixpunkt<br />

erreicht haben, dann ist R eine induktive Invariante und da kein Zustand in R F<br />

erfüllen kann (weder F in bis zu k Schritten erreichen kann), kann die Prozedur mit<br />

dem Ergebnis, dass kein Durchlauf existiert, terminieren. Ist dies noch nicht der Fall,<br />

dann wird die Prozedur mit der neuen Abschätzung für R wiederholt.<br />

Theorem FiniteRun:<br />

Für k > 0 gilt: wenn FINITERUN (M, k) terminiert, liefert die Prozedur<br />

TRUE zurück, wenn M einen Durchlauf hat.<br />

Beweis:<br />

Nehmen wir an, dass die Prozedur TRUE zurückliefert. Dann ist entweder I F<br />

erfüllbar, was bedeutet, dass M einen Durchlauf der Länge 0 hat, oder<br />

BMC k ist erfüllbar, woraus folgt, dass M einen Durchlauf der Länge 1...k hat.<br />

1<br />

( M )<br />

Nun nehmen wir an, dass die Prozedur FALSE zurückliefert. Dann können folgende<br />

drei Fakten gezeigt werden:<br />

I impliziert R. Trivial.<br />

R ist eine Invariante von T (R(S) und T(S, S’) implizieren R(S’)). Da C 1 p 1<br />

impliziert folgt, dass für alle Zustände S, S’, R(S) T(S, S’) => R’(S’) gilt.<br />

Somit impliziert R’ R und dann implizieren R(S) und T(S, S’) auch R(S’).<br />

R F ist nicht erfüllbar. An Anfang gilt R = I und I F ist unerfüllbar. Bei<br />

k<br />

jeder Iteration wissen wir, dass p1 SUFF0<br />

( M ')<br />

unerfüllbar ist und somit<br />

ist auch R’ F unerfüllbar.<br />

Aus diesen drei Fakten folgt mit Induktion, dass M keinen Durchlauf von jedweder<br />

Länge hat. .<br />

Es kann auch gezeigt werden, dass die Prozedur für ausreichend große k terminiert.<br />

Dazu definieren wir die reverse depth von M als die maximale Länge des kürzesten<br />

Pfades von einem beliebigen Zustand zu einem Finalzustand. Die reverse depth wird<br />

durch 2 |V| nach oben begrenzt, in den meisten praktischen Fällen ist sie aber viel<br />

kleiner. |V| steht für die Anzahl der booleschen Variablen, die den Zustandsraum<br />

beschreiben, was wiederum bedeutet, dass die reverse depth durch die Anzahl der<br />

Zustände des Zustandsraumes nach oben beschräkt ist.<br />

Theorem FiniteRun terminiert:<br />

Für jedes M existiert ein Wert k, für den gilt dass FINITERUN (M, k)<br />

terminiert.<br />

Beweis:<br />

Sei k die reverse depth von M. In der ersten Iteration terminiert der Algorithmus,<br />

wenn das SAT-Problem erfüllbar ist. Andernfalls wissen wir, dass R’ in k Schritten F<br />

nicht erreichen kann. Da k die reverse depth ist, folgt dass R’ mit keiner Anzahl von<br />

Schritten F erreichen kann. Bei der nächsten Iteration kann R nun F in bis zu k + 1<br />

Schritten nicht erreichen, so dass das SAT-Problem wiederum unlösbar ist. Fährt<br />

man nun mit der Iteration fort, lässt sich daraus schließen, dass in jeder Iteration R<br />

in bis zu k + 1 Schritten nicht in der Lage sein wird, F zu erreichen. Deshalb muss R<br />

immer größer werden, bis es einen Fixpunkt erreicht hat, bei dem die Prozedur


38<br />

dann terminieren wird.<br />

.<br />

Aus diesem Theorem folgt, dass wenn die Prozedur FiniteRun abbricht, der Wert von<br />

k nur immer wieder erhöht werden muss, sodass die Prozedur terminiert. Der Faktor,<br />

um den k erhöht wird, hat einen großen Einfluss auf die Performance der Prozedur.<br />

Wenn wir zu wenig erhöhen, dann muss die Prozedur unnötig oft ausgeführt werden,<br />

erhöhen wir zu viel, dann werden die darausfolgenden SAT-Probleme unnötig<br />

aufwendig.<br />

4.2. Optimierungen<br />

Für diesen Basisalgorithmus gibt es sehr viele Möglichkeiten, die Performance zu<br />

steigern. Als erstes sind hier die Formeln der Beweispartitionierung zu nennen, die<br />

typischer Weise hochredundant sind, und zwar in der Form, dass viele Subformeln<br />

syntaktisch verschieden aber semantisch identisch sind. Um diese Redundanzen zu<br />

eliminieren gibt es eine ganze Reihe von Algorithmen.<br />

k<br />

Weitere Effektivitätssteigerungen lassen sich erzielen, wenn man SUFF 0<br />

durch<br />

k<br />

SUFF j<br />

für j > 0 ersetzt (es werden nur die Zeitpunkte größer oder gleich j getestet).<br />

In den meisten Fällen scheint j = k die effektivste Wahl zu sein. Das ist auch nicht<br />

weiter verwunderlich, weil in diesem Fall der SAT-Algorithmus die Finalbedingung<br />

nur in einem Zustand wiederlegen muss, und nicht in allen. Dummerweise verlieren<br />

wir für j > 0 die Garantie, dass der Prozess terminiert. In der Praxis sind Divergenzen<br />

bei einigen Hardwaremodellen aufgetreten, die sich aber mit dem Setzen von j = k –1<br />

korrigieren ließen.<br />

Als letzte Optimierungsmöglichkeit soll hier die Invarianz der Formel<br />

SUFF k<br />

j<br />

(M ')<br />

von einer Iteration zur nächsten genannt werden. Sie erzeugt die<br />

meisten CNF - Formeln, die vom SAT-Algorithmus wiederlegt werden müssen. Es ist<br />

klar, dass es sehr uneffizient ist, diese bei jeder Iteration neu zu bestimmen. Besser<br />

wäre es, alle Klauseln von SUFF k<br />

j<br />

(M ')<br />

und die von ihr abgeleiteten von einem SAT-<br />

Aufruf für den nächsten zu speichern. Obwohl dies ein enormes<br />

Optimierungspotential darstellt, wurde es hier nicht implementiert, da dazu der SAT-<br />

Algorithmus modifiziert werden müsste.<br />

5. Praktische Erfahrungen<br />

Die Leistungsfähigkeit des Interpolations-basierten Modellprüfers wurde mit zwei<br />

verschiedenen Problemstellungen aus kommerziellen Mikroprozessordesigns getestet.<br />

Die erste Problemstellung ist eine Sammlung von Bedingungen, mit denen zwei<br />

Einheiten des PicoJava II Prozessors zusammen Verifiziert werden sollen. Von diesen<br />

Bedingungen wurden 20 repräsentative ausgewählt, die alle erfüllt sind, und als<br />

Benchmark verwendet. Alle diese Probleme sind Sicherheitseigenschaften der Form<br />

Gp, wobei p eine Formel ist, die sich meist nur auf den aktuellen Zeitpunkt bezieht,<br />

manchmal auch auf den nächsten Zeitpunkt. Die Anzahl der Zustandsvariablen


39<br />

bewegt sich bei diesen Problemen in etwa zwischen 50 und 350. Die Tests wurden auf<br />

einer Linux - Workstation mit einem 930MHz Pentium III Prozessor und 512MB<br />

Arbeitsspeicher ausgeführt.<br />

Aufgrund dieser relativ schwierigen Problemstellung war es mit einer Standard-<br />

Modellprüfung nicht möglich, auch nur eine der 20 Bedingungen innerhalb von 1800<br />

Sekunden (ein halbe Stunde!) zu verifizieren. (Hauptgrund für dieses Versagen<br />

scheint die kombinatorische Logik einer der beiden Einheiten zu sein, da diese in<br />

BDDs zu übersetzen eine sehr schwierige Aufgabe ist.) Der Interpolationsalgorithmus<br />

hingegen schafft es, 19 von 20 dieser Bedingungen erfolgreich zu verifizieren.<br />

Ein Vergleich der Laufzeiten des Interpolationsalgorithmus mit der Methode der<br />

beweisbasierten Abstraktion, die SAT-Algorithmen verwendet, um abstrakte Modelle<br />

zu konstruieren, die ihrerseits mit auf BDD-basierenden Modellprüfern verifiziert<br />

werden, ist in Abbildung 5 dargestellt. Diese Methode ist deutlich effizienter als eine<br />

einfache BDD-basierte Modelprüfung und verifiziert erfolgreich 18 von den 20<br />

Benchmarks. In der Abbildung repräsentiert jeder Punkt einen Benchmark, wobei der<br />

Wert auf der x-Achse die Zeit in Sekunden darstellt, die die Methode beweisbasierte<br />

Abstraktion benötigt und der Wert der y-Achse die Zeit angibt, die der<br />

Interpolationsalgorithmus benötigt. Allerdings muss man erwähnen, dass beim<br />

Interpolationsalgorithmus nur die Zeit die der SAT-Algorithmus benötigt gemessen<br />

wurde, da bei einer effizienten Implementierung die anderen Zeiten vernachlässigbar<br />

sein sollen. Des weiteren wurde bei diesen Benchmarks j = k gewählt. Ein Zeitwert<br />

von 1000 bedeutet, dass der Benchmark nach 1000 Sekunden abgebrochen wurde.<br />

Werte unter der Diagonalen zeigen einen Vorteil der hier vorgestellten Methode. Es<br />

ist somit zu erkennen, dass der Interpolationsalgorithmus in 16 Fällen besser und nur<br />

in drei Fällen schlechter abschneidet als die beweisbasierte Abstraktion. In einem Fall<br />

konnte das Problem von keinem der beiden Methoden gelöst werden. In einigen<br />

Fällen ist der Interpolationsalgorithmus sogar um zwei Größenordnungen besser.<br />

Abbildung 5: Laufzeiten der PicoJava Benchmarks


40<br />

Die zweite Problemstellung umfasst eine Menge von Modellprüfungsproblemen<br />

eines IBM Gigahertzprozessors (IBM Benchmarks). Hier wurde beim<br />

Interpolationsalgorithmus j = k – 1 gewählt, da ein Modellprüfungsproblem bei j = k<br />

divergiert. In Abbildung 6 werden die Laufzeiten des Interpolationsalgorithmus mit<br />

denen von Baumgartner et al. verglichen. Seine Methode verwendet eine<br />

Kombination aus SAT-basierter Modellprüfung, strukturellen Methoden zur<br />

Begrenzung der Tiefe des Zustandsraumes und Zielbereichsvergrößerung mit BDDs.<br />

Jeder Punkt repräsentiert die durchschnittliche <strong>Verifikation</strong>s- oder Wiederlegungszeit<br />

einer Sammlung von Bedingungen für ein bestimmtes Schaltungsmodell. Als<br />

Ergebnis erhalten wir 21 Fälle, in denen der Interpolationsalgorithmus besser ist und<br />

3, in der die Methode von Baumgartner et al. besser ist. Des weiteren konnte diese<br />

Methode 28 einzelne Bedingungen nicht lösen, der Interpolationsalgorithmus<br />

hingegen konnte alle außer einer lösen.<br />

Zuletzt werden der Interpolationsalgorithmus und die Methode der beweisbasierten<br />

Abstraktion mit Hilfe des IBM Benchmarks verglichen. Die Ergebnisse in Abbildung<br />

7 zeigen ein gemischtes Bild, wobei aber ein leichter Vorteil für die beweisbasierte<br />

Abstraktion auszumachen ist. Dies hängt mit der Tatsache zusammen, dass eine große<br />

Anzahl der Bedingungen in dem Benchmark nicht erfüllbar sind und die<br />

beweisbasierte Abstraktion Gegenbeispiele relativ schnell finden kann. In Abbildung<br />

8 werden diese beiden Methoden nur mit den erfüllten Bedingungen verglichen. Hier<br />

ist ein leichter Vorteil für den Interpolationsalgorithmus zu erkennen. Dies führt zu<br />

Einsicht, dass ein hybrider Algorithmus die wohl beste Lösung für beliebige<br />

Probleme ist.<br />

Abbildung 6: Laufzeiten der IBM Benchmarks mit Interpolation und<br />

Baumgartner et al.


41<br />

Abbildung 7: Laufzeiten des IBM Benchmarks mit Interpolation und<br />

beweisbasierter Abstraktion<br />

Abbildung 8: Laufzeiten der erfüllten Bedingungen des IBM Benchmarks mit<br />

Interpolation und Abstraktion


42<br />

6. Schussfolgerung<br />

Wir haben gesehen, dass Interpolation und begrenzte Modellprüfung kombiniert<br />

werden können um unbegrenzte Modellprüfung zu ermöglichen. Die Methode hat in<br />

zwei Mikroprozessor – Benchmark Studien gezeigt, dass sie effizienter als BDDbasierte<br />

Modellprüfer und einige erst kürzlich entwickelte SAT-basierte Methoden ist,<br />

wenn die Bedingungen erfüllt sind.<br />

Für die Zukunft ist es interessant zu untersuchen, welche weiteren Informationen<br />

aus einem Beweis der Unerfüllbarkeit gewonnen werden können. So ist es zum<br />

Beispiel möglich, mittels Interpolation eine Abstraktion der Transitionsrelationen zu<br />

gewinnen. Erste Studien haben gezeigt, dass diese Abstraktion mit bisherigen BDDbasierten<br />

Modellprüfern nur sehr schwer zu bewältigen ist, was an der speziellen<br />

Struktur der Formel der Transitionsrelation liegt. Wenn man diese überwinden<br />

könnte, dann würde dies zu einer Verbesserung der Methode der beweisbasierten<br />

Abstraktion beitragen. Des weitern ist denkbar, dass Interpolation in Theorien erster<br />

Ordnung ausgenutzt werden kann um Modellprüfung auf unendlichen Modellen zu<br />

ermöglichen.<br />

Quellenverzeichnis<br />

Interpolation and SAT-based Model Checking[McMillan03], K. L. McMillan 2003, Cadence<br />

Berkeley Labs


43<br />

Completeness of (BMC) Property Suite<br />

Sören Burmeister<br />

Technische Universität <strong>Kaiserslautern</strong><br />

Zusammenfassung. Für die Durchführung eines formalen Korrektheitsbeweises<br />

ist es von größter Wichtigkeit, die Anforderungen an das zu prüfende<br />

System vollständig zu spezifizieren, da ansonsten Teile der Funktionalität eines<br />

Programmes nicht von der <strong>Verifikation</strong> erfasst werden. In diesem Kapitel wird<br />

das Verfahren der Coverage Measure vorgestellt, das für eine Schaltung prüft,<br />

welche Signallinien von einer erstellten Spezifikation berücksichtigt werden<br />

und welche nicht. Obgleich dieses Verfahren nicht die Vollständigkeit einer<br />

Spezifikation beweisen kann, stellt es in seinen verschiedenen Erweiterungen<br />

ein Hilfsmittel für die Entwicklung einer Spezifikation dar, da es dem<br />

Entwickler mögliche Lücken in seiner property suite aufzeigen sowie ihm<br />

einen groben Überblick über den Fortschritt seiner Arbeit geben kann.<br />

1 Einführung<br />

Im letzten Kapitel wurde erläutert, wie man mittels BMC eine gegebene<br />

Implementierung eines Designs auf ihre Korrektheit überprüfen kann. Wie auch bei<br />

anderen Methoden zur <strong>Verifikation</strong> kann die Modellprüfung mittels BMC aber nur<br />

dann zuverlässige Ergebnisse liefern, wenn die property suite alle relevanten Aspekte<br />

des Designs beinhaltet. Erfüllt die property suite diese Eigenschaft, bezeichnet man<br />

diese auch als <strong>Verifikation</strong>splan.<br />

Eine der wesentlichen Aufgaben bei der <strong>Verifikation</strong> ist also die Sicherstellung,<br />

dass es sich bei der erstellten property suite tatsächlich um einen <strong>Verifikation</strong>splan<br />

handelt. Unglücklicherweise ist es nicht möglich, aus der informellen Definition eines<br />

solchen Planes formale Eigenschaften abzuleiten, mit denen eine mathematische<br />

Überprüfung einer property suite auf ihre Vollständigkeit durchführbar wäre. Daher<br />

wird versucht, dem Erzeuger der property suite Hilfsmittel zur Verfügung zu stellen,<br />

die es ihm ermöglichen, während des Entwicklungsprozesses Lücken in der property<br />

suite zu erkennen und zu lokalisieren.<br />

Eines dieser Hilfsmittel ist die Coverage Measure. Der Ansatz dieser Methode<br />

liegt darin, dass die syntaktische Vollständigkeit der property suite untersucht wird,<br />

das heißt, es wird geprüft, ob jeder Bestandteil der untersuchten Implementierung von<br />

der property suite abgedeckt wird.<br />

Im Folgenden soll nun die Vorgehensweise bei der Coverage Measure am Beispiel<br />

des bereits im letzten Kapitel vorgestellten ATM Error Controllers (AEC) erläutert<br />

werden. Dazu werden zunächst in einem ersten Ansatz die Vorgehensweisen bei den<br />

verschiedenen Arten von Signallinien (Eingängen, Ausgängen, interne und


44<br />

Zustandssignallinien) behandelt. Anschließend wird das Modell um die Aspekte der<br />

Zeit und der Signalwerte erweitert. Am Ende des Kapitels wird der Nutzen der<br />

coverage measure untersucht.<br />

2 Grundansatz der Coverage Measure<br />

Um zu überprüfen, welche Bestandteile der Implementierung von der property suite<br />

abgedeckt werden, wird jede Signallinie darauf untersucht, welchen Einfluss sie auf<br />

die property suite hat. Die Vorgehensweise bei der Überprüfung hängt dabei von der<br />

Art der betrachteten Signallinie ab.<br />

Ingesamt lassen sich 4 Arten von Signallinien unterscheiden: interne Signallinien,<br />

Zustandssignallinien, Eingänge und Ausgänge. Diese werde im Folgenden näher<br />

erläutert. Zur Verdeutlichung wird dabei die (aufgerollte) Schaltung des ATM – Error<br />

Controllers verwendet, die bereits im vorangegangenen Kapitel von Christian Allman<br />

vorgestellt wurde und daher in ihrer Funktionsweise sowie den an diese gestellten<br />

Eigenschaften als bekannt vorausgesetzt wird.<br />

Anmerkung<br />

Der Ansatz der Coverage Measure kann fälschlicherweise den Eindruck vermitteln,<br />

als würde die Spezifikation von der Implementierung verifiziert werden, was der<br />

Grundidee einer formalen <strong>Verifikation</strong> zuwiderlaufen würde. Bei der Coverage<br />

Measure wird aber zu keiner Zeit die Korrektheit einer Spezifikation in Frage gestellt,<br />

sonder lediglich deren Vollständigkeit.<br />

2.1 Untersuchung von internen Signallinien<br />

Bei der Betrachtung von internen Signallinien werden die Auswirkungen auf die<br />

<strong>Verifikation</strong> untersucht, die entstehen, wenn die betreffende Signallinie in ein<br />

zusätzliches externes Eingangssignal umgewandelt wird. Liefert die auf die so<br />

modifizierte Schaltung angewendete <strong>Verifikation</strong> nach wie vor das Ergebnis, dass die<br />

Schaltung korrekt ist, so wird die untersuchte Signallinie von der property suite nicht<br />

abgedeckt. Ist eine der Eigenschaften der property suite jedoch nicht mehr erfüllt, so<br />

wird die Signallinie von dieser Eigenschaft abgedeckt.<br />

Im folgenden wird die Vorgehensweise bei der Untersuchung der Signallinie s<br />

(vgl. Fig. 1) auf ihre Überdeckung durch P1 untersucht. Zu Vergleichszwecken wird<br />

dabei zunächst der <strong>Verifikation</strong>sbeweis für P1 aufgeführt, bevor die Untersuchung auf<br />

Überdeckung nach der beschriebenen Vorgehensweise durchgeführt wird.


Abb. 1. Schaltung des AEC<br />

1<br />

0<br />

0<br />

))<br />

)<br />

_<br />

((<br />

(<br />

))<br />

_<br />

(<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

state<br />

old<br />

error<br />

multiple<br />

error<br />

it<br />

reject<br />

error<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

p<br />

1<br />

))<br />

(<br />

(<br />

))<br />

)<br />

_<br />

((<br />

(<br />

))<br />

(<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

s<br />

s<br />

multiple<br />

error<br />

s<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

s<br />

multiple<br />

error<br />

it<br />

reject<br />

error<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

p<br />

NAND<br />

AND<br />

NOT<br />

NOT<br />

AND<br />

AND<br />

q(t)<br />

multiple(t)<br />

correct_it(t)<br />

error(t)<br />

s(t)<br />

old_state(t)<br />

r(t)<br />

t(t)<br />

reject_it(t)<br />

new_state(t)<br />

45


46<br />

s<br />

p 1<br />

Da keine Tautologie ist, wird die Signallinie s also von P1 abgedeckt. Die<br />

Untersuchung der anderen Eigenschaften/Signallinien verläuft analog und kann im<br />

Anhang nachgelesen werden.<br />

2.2 Untersuchung von Zustandssignallinien<br />

Da wir bei der <strong>Verifikation</strong> mit BMC nur die aufgerollten Schaltungen untersuchen,<br />

handelt es sich bei den Zustandssignallinien genauso genommen um gewöhnliche<br />

interne Signallinien, weshalb sie auf die gleiche Art und Weise wie diese untersucht<br />

werden.<br />

Die Vorgehensweise kann bei der Prüfung, ob p2 die Signallinie old_State abdeckt,<br />

betrachtet werden, wobei auch hier zunächst aus Vergleichsgründen die <strong>Verifikation</strong><br />

von p2 angegeben wird.<br />

p<br />

2<br />

error<br />

error<br />

error<br />

error<br />

<br />

<br />

error<br />

error<br />

error<br />

1<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

error<br />

( t)<br />

( t)<br />

( t)<br />

error<br />

error<br />

error<br />

( t1)<br />

error<br />

error<br />

error<br />

error<br />

( t1)<br />

( t1)<br />

( t1)<br />

( t1)<br />

multiple<br />

( t1)<br />

( t1)<br />

( t1)<br />

multiple<br />

multiple<br />

multiple<br />

multiple<br />

( t1)<br />

multiple<br />

multiple<br />

multiple<br />

( t1)<br />

( t1)<br />

( t1)<br />

( t1)<br />

old _ state<br />

( t1)<br />

( t1)<br />

( t1)<br />

correct _ it<br />

correct _ it<br />

correct _ it<br />

<br />

<br />

<br />

t1<br />

<br />

old _ state<br />

t<br />

t<br />

t<br />

t<br />

new _ state<br />

error<br />

t<br />

<br />

<br />

1<br />

<br />

1<br />

<br />

1<br />

<br />

t1


47<br />

p<br />

old _ state<br />

2<br />

1<br />

error<br />

( t)<br />

error<br />

( t1)<br />

multiple<br />

( t1)<br />

correct _ it<br />

( t)<br />

( t1)<br />

( t1)<br />

error error multiple correct _ it<br />

( t)<br />

( t1)<br />

( t1)<br />

<br />

error error multiple correct _ it<br />

( t)<br />

( t1)<br />

( t1)<br />

error error multiple <br />

( t1)<br />

( t1)<br />

t1<br />

error<br />

multiple old _ state <br />

( t)<br />

( t1)<br />

( t1)<br />

<br />

error error multiple old _ state<br />

<br />

<br />

t1<br />

<br />

t1<br />

<br />

t1<br />

t<br />

<br />

1<br />

Wie man sieht, wird old_state von p2 abgedeckt. Eine vollständige Untersuchung von<br />

old_state ist im Anhang zu finden.<br />

2.3 Untersuchung von Eingangssignalen<br />

Um zu prüfen, ob eine Signallinie von der property suite abgedeckt wird, werden die<br />

Auswirkungen auf die Korrektheit der Implementierung untersucht, wenn der Wert<br />

der Signallinie im Verpflichtungsteil (nicht in der Annahme) der Eigenschaften<br />

negiert wird. Diese Vorgehensweise kann man auch an folgendem Beispiel zur<br />

Untersuchung der Abdeckung des Eingangssignals multiple durch p5 erkennen, wo<br />

multiple nur in der Auflösung von reject_it (also im Verpflichtungsteil) negiert wird,<br />

nicht jedoch im Annahmeteil von p5. Eine vollständige Untersuchung der<br />

Eingangssignallinien ist im Anhang zu finden.<br />

p<br />

5<br />

error<br />

error<br />

error<br />

error<br />

error<br />

1<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

multiple<br />

multiple<br />

multiple<br />

multiple<br />

multiple<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

reject _ it<br />

reject _ it<br />

reject _ it<br />

<br />

<br />

multiple<br />

multiple<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

old _ state<br />

old _ state<br />

( t)<br />

( t)<br />

<br />

error<br />

( t)


48<br />

p<br />

multiple<br />

5<br />

error<br />

error<br />

error<br />

error<br />

1<br />

error<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

multiple<br />

multiple<br />

multiple<br />

multiple<br />

multiple<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

reject _ it<br />

reject _ it<br />

<br />

<br />

reject _ it<br />

multiple<br />

( t)<br />

( t)<br />

( t)<br />

old _ state<br />

old _ state<br />

( t)<br />

( t)<br />

( t)<br />

<br />

error<br />

( t)<br />

2.4 Untersuchung von Ausgangssignalen<br />

Bei der Überprüfung der Abdeckung von Ausgangssignallinien kann man sich<br />

zunutze machen, dass eine solche Signallinie genau dann von einer Eigenschaft der<br />

property suite abgedeckt ist, wenn sie in deren Verpflichtungssteil vorkommt. Im<br />

folgenden Beispiel kann man sehr leicht sehen, dass p1 sowohl correct_it als auch<br />

reject_it abdeckt, während p2 nur correct_it abdeckt.<br />

p<br />

( t)<br />

( t)<br />

1<br />

error correct _ it reject _<br />

it<br />

( t )<br />

p<br />

( t )<br />

( t1)<br />

( t1)<br />

2<br />

error error multiple correct _<br />

it<br />

<br />

<br />

t1<br />

Bei der Anwendung dieser einfachen Regel ist allerdings darauf zu achten, dass der<br />

zu untersuchende Ausgang tatsächlich funktionell im Verpflichtungsteil vorkommt.<br />

So deckt beispielsweise die Eigenschaft<br />

p<br />

x<br />

1 <br />

<br />

correct _ it<br />

<br />

( t)<br />

correct _ it<br />

reject _ it<br />

( t )<br />

( t)<br />

reject _ it<br />

natürlich nur das Ausgangssignal correct_it ab, nicht aber die Signallinie reject_it.<br />

<br />

<br />

( t)<br />

<br />

2.5 Zusammenfassung der Untersuchung<br />

Hat man alle Signallinien des ATM Error Controllers auf ihre Berücksichtigung durch<br />

die Eigenschaften der property suite untersucht, so ergibt sich folgende Tabelle


49<br />

Tabelle 1. Abdeckung der Eigenschaften der property Suite<br />

p1 p2 p3 p4 p5<br />

q - covered - covered covered<br />

r - - covered covered covered<br />

s covered covered covered - -<br />

t - covered - covered -<br />

old_state - covered - covered -<br />

multiple - covered - - covered<br />

error covered covered - covered covered<br />

reject_it covered - covered covered covered<br />

correct_it covered covered covered - -<br />

Betrachtet man sich diese Tabelle genauer, so fällt auf, dass bereits die Eigenschaften<br />

p2 und p3 sämtliche Signallinien abdecken. Der bisher verwendete Ansatz der<br />

Coverage Measure würde also beispielsweise dem Entwickler der property suite für<br />

den AEC den Eindruck vermitteln, er habe sämtliche Signallinien berücksichtigt,<br />

obwohl die Spezifikation möglicherweise noch sehr lückenhaft ist. Aus diesem Grund<br />

ist es sinnvoll, den bisherigen Ansatz zu verfeinern, um die Aussagekraft der<br />

coverage measure zu erhöhen. Im Folgenden wird daher der Grundansatz der<br />

Coverage Measure um Zeit- und Signalwertaspekte erweitert.


50<br />

3 Erweiterung um Zeitaspekte<br />

Bisher wurde nur geprüft, ob eine Signallinie von einer Eigenschaft abgedeckt ist,<br />

nicht jedoch, zu welchen Zeitpunkten dies der Fall ist. Es ist möglich und bei<br />

komplexeren Schaltungen häufig, dass eine Signallinie nur in bestimmten<br />

Zeitschritten von einer Eigenschaft abgedeckt wird, während sie in anderen<br />

Zeitschritten von dieser nicht berücksichtigt wird. Diesen Fall kann man im folgenden<br />

Beispiel beobachten<br />

p<br />

s<br />

2<br />

error<br />

error<br />

error<br />

error<br />

error<br />

1<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

error<br />

error<br />

error<br />

error<br />

error<br />

( t1)<br />

( t1)<br />

( t1)<br />

( t1)<br />

( t1)<br />

multiple<br />

multiple<br />

multiple<br />

multiple<br />

multiple<br />

( t1)<br />

( t1)<br />

( t1)<br />

( t1)<br />

( t1)<br />

correct _ it<br />

correct _ it<br />

correct _ it<br />

<br />

<br />

s<br />

s<br />

( t1)<br />

( t1)<br />

t<br />

t<br />

<br />

<br />

1<br />

<br />

1<br />

<br />

t1<br />

multiple<br />

( t1)<br />

<br />

p<br />

s<br />

3<br />

1 correct _ it<br />

correct _ it<br />

<br />

<br />

1<br />

( t)<br />

( t )<br />

reject _ it<br />

reject _ it<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

t<br />

s<br />

multiple <br />

<br />

multiple old _ state <br />

( t)<br />

( t)<br />

( t )<br />

t<br />

s<br />

multiple <br />

<br />

multiple old _ state <br />

error<br />

error<br />

( t )<br />

( t)<br />

<br />

<br />

Wie man leicht sehen kann, beeinflusst s im Zeitschritt 1 nicht die Eigenschaft p2,<br />

sondern nur die Eigenschaft p3, da die Korrektheit von P2 nur vom Wert abhängt, den<br />

s im darauf folgenden Zeitpunkt annimmt und nicht wie bei p3 von dem aktuellen<br />

Wert von s abhängt. Analog lassen sich die anderen Einträge für Tabelle 2 ermitteln.<br />

Dabei bedeutet ein *, dass die betrachtete Signallinie von der entsprechenden<br />

Eigenschaft in jedem Zeitschritt abgedeckt ist.


51<br />

Tabelle 2. Abdeckung unter Berücksichtigung der Zeitschritte<br />

p1 p2 p3 p4 p5<br />

q - t+1 - t+1 *<br />

r - - * * *<br />

s * t+1 * - -<br />

t - t+1 - t+1 -<br />

old_state - t+1 - t+1 -<br />

multiple - t+1 - - *<br />

error * * - * *<br />

reject_it * - * t+1 *<br />

correct_it * t+1 * - -<br />

Betrachtet man sich diese Tabelle genauer, so stellt man fest, dass die Eigenschaften<br />

p1 und p2 nicht mehr ausreichen, um alle Signallinien zu jedem Zeitpunkt<br />

abzudecken. Dennoch ist die Aussagekraft noch nicht sehr hoch; Die Coverage<br />

Measure würde beispielsweise im vorliegenden Fall das Fehlen einer der<br />

Eigenschaften p1-p4 nicht feststellen können (die Signallinien t und old_state können,<br />

da sie beide direkt vom alten Zustand abhängen, beide generell nicht zum<br />

Startzeitpunkt abgedeckt werden). Aus diesem Grund werden im nächsten Abschnitt<br />

in einem weiteren Verfeinerungsschritt die Signalwerte an Stelle der Signallinien<br />

betrachtet.<br />

4 Berücksichtigung der Signalwerte<br />

Bisher wurde davon ausgegangen, dass eine Signallinie durch eine Eigenschaft p<br />

abgedeckt wird, wenn eine Änderung des Signals Auswirkungen auf diese<br />

Eigenschaft hat. Dabei wurde jedoch nicht berücksichtigt, dass die Eigenschaft nur<br />

von einem einzelnen Wert einer Signallinie abhängt, nicht jedoch von allen<br />

möglichen Werten der Signallinie. Um diese Signalwertabhängigkeit berücksichtigen<br />

zu können, wird der Begriff der 1- bzw. 0-Coverage eingeführt, der wie folgt definiert<br />

wird:<br />

Definition 0- bzw. 1-Coverage<br />

Eine Signallinie sig ist genau dann in einem Zeitschritt t von einer Eigenschaft p 0-<br />

bzw. 1- covered, wenn sie von p im Sinne der bisher durchgeführten Untersuchung<br />

abgedeckt ist und eine der beiden folgenden Bedingungen erfüllt ist:<br />

Die Zuweisung des Wertes 0 (bzw. 1 für 1-coverage) zu der Signallinie sig<br />

impliziert das Erfülltsein der (für die Untersuchung der Coverage modifizierten)<br />

Eigenschaft<br />

Das Erfülltsein der (modifizierten) Eigenschaft p impliziert die Zuweisung des<br />

Wertes 0 (bzw. 1) zu der Signallinie sig


52<br />

Beispiel<br />

Prüft man die Signallinie Error und die Eigenschaft p2 auf 0- bzw. 1-coverage, so<br />

ergibt sich, dass die Eigenschaft sowohl für error(t)=1 als auch für error(t+1)=0<br />

immer erfüllt ist:<br />

p<br />

error<br />

2<br />

error<br />

error<br />

error<br />

<br />

<br />

error<br />

1<br />

error<br />

( t)<br />

( t)<br />

( t)<br />

error<br />

( t)<br />

( t)<br />

error<br />

error<br />

error<br />

( t1)<br />

error<br />

error<br />

( t1)<br />

( t1)<br />

( t1)<br />

( t1)<br />

( t1)<br />

multiple<br />

multiple<br />

multiple<br />

multiple<br />

multiple<br />

( t1)<br />

multiple<br />

( t1)<br />

( t1)<br />

( t1)<br />

old _ state<br />

( t1)<br />

( t1)<br />

correct _ it<br />

correct _ it<br />

correct _ it<br />

<br />

<br />

<br />

t1<br />

<br />

t<br />

t<br />

<br />

1<br />

<br />

1<br />

<br />

<br />

t1<br />

Daraus folgt, dass error in jedem Zeitschritt 1-covered und in jedem Zeitschritt (t+1)<br />

0-covered von P2 ist.<br />

Analog kann man die übrigen Einträge von Tabelle 3 ermitteln.<br />

Tabelle 3. Abdeckung durch 0/1-Coverage<br />

p1 p2 p3 p4 p5<br />

q - 1-covered - 0-covered 0-covered<br />

r - - 0-covered 1-covered 1-covered<br />

s 0-covered 1-covered 0-covered - -<br />

t - 1-covered - 0-covered -<br />

old_state - 0-covered - 1-covered -<br />

multiple - 1-covered - - 0-covered<br />

error 1-covered 1/0-covred - 0-covered 0-covered<br />

reject_it 0-covered - 0-covered 1-covered 1-covered<br />

correct_it 0-covered 1-covered 0-covered - -<br />

Es ist klar, dass eine Schaltung von der property suite nur dann abgedeckt ist, wenn<br />

jede Signallinie in jedem Zeitschritt sowohl 0- als auch 1-covered wird (von einer<br />

Initialisierungsphase mit fehlenden alten Zuständen einmal abgesehen). Ist eine<br />

Signallinie beispielsweise nur 0-covered, nicht aber 1-covered, so könnte der Wert der<br />

Signallinie fest auf 0 gesetzt werden, ohne dass sich das Erfülltsein der property suite


53<br />

ändert. So wäre die Signallinie s von einer property suite, welche nur die<br />

Eigenschaften p1, p3, p4 und p5 enthält, nicht jedoch p2, beispielsweise nicht 1-<br />

covered, weshalb die <strong>Verifikation</strong> die in Abb. 2 dargestellte Schaltung<br />

fälschlicherweise als richtig ansehen würde<br />

Abb. 2. Modifizierte Schaltung des AEC<br />

multiple(t)<br />

error(t)<br />

NOT<br />

0<br />

correct_it(t)<br />

AND<br />

old_State(t)<br />

NOT<br />

NAND<br />

reject it(t)<br />

AND<br />

new_state(t)<br />

Eine Überprüfung der Vollständigkeit der property suite mittels Coverage Measure<br />

würde diese Lücke in der Spezifikation erkennen und dem Entwickler somit eine<br />

Warnung geben können.<br />

5 Effektivitätsbetrachtung<br />

Wie man im vorangegangenen Abschnitt gesehen hat, kann eine Durchführung der<br />

Coverage Measure Lücken in der Spezifikation erkennen und lokalisieren. Je genauer<br />

die durchgeführte Überprüfung ist, desto mehr Lücken können erkannt werden. Da<br />

die Aufgabe des Entwicklers jedoch in der Erstellung eines <strong>Verifikation</strong>splanes, also<br />

der Erzeugung einer property suite, die alle relevanten semantischen Aspekte des<br />

Designs abdeckt, kann die Abdeckung aller Signallinien (also syntaktischen Aspekte)<br />

einer Implementierung die Vollständigkeit der property suite nicht garantieren.<br />

Betrachtet man sich die Tabellen 2 und 3, so fällt beispielsweise auf, dass die<br />

Eigenschaft p1 nicht benötigt wird, damit alle Signallinien zu jedem Zeitschritt<br />

sowohl 0- als auch 1-covered sind.<br />

Dies führt dazu, dass eine property suite, die nur aus den Eigenschaften p2 bis p5<br />

besteht, von der Coverage Measure als vollständig angesehen wird, was dazu führen<br />

würde, dass eine mit dieser unvollständigen property suite durchgeführte <strong>Verifikation</strong><br />

mit zusätzlicher Coverage Measure die in Abb. 3 dargestellte Schaltung fälschlich als<br />

richtig und die property suite als vollständig spezifiziert ansehen würde. Auf einen<br />

Beweis wird an dieser Stelle verzichtet.


54<br />

Abb. 3. AEC mit fehlerhafter Berechnung von reject_it<br />

multiple(t)<br />

error(t)<br />

NOT<br />

AND<br />

AND<br />

correct_it(t)<br />

old_State(t)<br />

NOT<br />

NAND<br />

reject_it(t)<br />

OR<br />

new_state(t)<br />

AND<br />

Insgesamt stellt die Coverage Measure also ein Hilfsmittel zum Erkennen und<br />

Lokalisieren von Lücken in der property suite dar, das aber nicht garantieren kann,<br />

dass es sich bei der untersuchten property suite um einen <strong>Verifikation</strong>splan handelt.<br />

Coverage Measure kann also nur zur Unterstützung während des Erstellens der<br />

property suite eingesetzt werden, um den Designer auf mögliche Schwachstellen<br />

hinzuweisen und ihm eine Abschätzung über die Vollständigkeit der bisher erzeugten<br />

property suite zu vermitteln, nicht jedoch, um die Vollständigkeit der property suite<br />

im Nachhinein zu verifizieren.


6 Anhang<br />

Property suite des AEC<br />

<br />

<br />

<br />

<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

5<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

4<br />

)<br />

(<br />

)<br />

(<br />

3<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

2<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

1<br />

_<br />

_<br />

_<br />

_<br />

1<br />

_<br />

_<br />

_<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

it<br />

reject<br />

multiple<br />

error<br />

p<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

p<br />

it<br />

reject<br />

it<br />

correct<br />

p<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

p<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

p<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

(1)<br />

<strong>Verifikation</strong> der Property Suite des AEC<br />

1<br />

0<br />

0<br />

))<br />

)<br />

_<br />

((<br />

(<br />

))<br />

_<br />

(<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

state<br />

old<br />

error<br />

multiple<br />

error<br />

it<br />

reject<br />

error<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

p<br />

(2)<br />

55


1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

error<br />

multiple<br />

error<br />

error<br />

state<br />

new<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

p<br />

(3)<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

state<br />

old<br />

state<br />

old<br />

multiple<br />

error<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

it<br />

reject<br />

it<br />

correct<br />

p<br />

(4)<br />

56


1<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

4<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

error<br />

multiple<br />

error<br />

error<br />

error<br />

error<br />

multiple<br />

multiple<br />

error<br />

error<br />

error<br />

oldstate<br />

multiple<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

p<br />

(5)<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

5<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

state<br />

old<br />

multiple<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

p (6)<br />

57


Untersuchung der Abdeckung der internen Signallinien<br />

Abb. 1. Schaltung des AEC<br />

1<br />

))<br />

(<br />

(<br />

))<br />

)<br />

_<br />

((<br />

(<br />

))<br />

(<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

s<br />

s<br />

multiple<br />

error<br />

s<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

s<br />

multiple<br />

error<br />

it<br />

reject<br />

error<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

p<br />

(7)<br />

s ist in jedem Zeitschritt 0-covered von P1<br />

NAND<br />

AND<br />

NOT<br />

NOT<br />

AND<br />

AND<br />

q(t)<br />

multiple(t)<br />

correct_it(t)<br />

error(t)<br />

s(t)<br />

old_state(t)<br />

r(t)<br />

t(t)<br />

reject_it(t)<br />

new_state(t)<br />

58


1<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

s<br />

s<br />

multiple<br />

error<br />

error<br />

multiple<br />

s<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

p<br />

(8)<br />

s ist in jedem Zeitschritt t+1 1-covered von P2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

s<br />

error<br />

state<br />

old<br />

multiple<br />

multiple<br />

s<br />

error<br />

state<br />

old<br />

multiple<br />

multiple<br />

s<br />

it<br />

reject<br />

it<br />

correct<br />

it<br />

reject<br />

it<br />

correct<br />

p<br />

(9)<br />

s ist in jedem Zeitschritt 0-covered von P3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

4<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

s<br />

error<br />

multiple<br />

error<br />

error<br />

error<br />

error<br />

multiple<br />

multiple<br />

error<br />

error<br />

error<br />

oldstate<br />

multiple<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

p<br />

(10)<br />

s ist not-covered von P4<br />

59


1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

5<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

s<br />

state<br />

old<br />

multiple<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

p (11)<br />

s ist not-covered von P5<br />

<br />

1<br />

0<br />

0<br />

))<br />

)<br />

_<br />

((<br />

(<br />

))<br />

_<br />

(<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

q<br />

error<br />

state<br />

old<br />

q<br />

error<br />

state<br />

old<br />

error<br />

q<br />

error<br />

it<br />

reject<br />

error<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

p<br />

(11)<br />

q ist not-covered von P1<br />

60


1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

q<br />

error<br />

multiple<br />

error<br />

error<br />

q<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

q<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

q<br />

error<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

p<br />

(12)<br />

q ist in jedem Zeitschritt t+1 1-covered von P2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

q<br />

state<br />

old<br />

state<br />

old<br />

q<br />

error<br />

q<br />

state<br />

old<br />

q<br />

error<br />

error<br />

state<br />

old<br />

q<br />

state<br />

old<br />

q<br />

error<br />

error<br />

state<br />

old<br />

q<br />

state<br />

old<br />

q<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

it<br />

reject<br />

it<br />

correct<br />

p<br />

(13)<br />

q ist not-covered von P3<br />

61


1<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

4<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

q<br />

error<br />

q<br />

multiple<br />

error<br />

error<br />

error<br />

error<br />

q<br />

multiple<br />

error<br />

error<br />

error<br />

oldstate<br />

q<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

p<br />

(14)<br />

q ist in jedem Zeitschritt t+1 0-covered von P4<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

5<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

q<br />

state<br />

old<br />

q<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

q<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

p (15)<br />

q ist in jedem Zeitschritt 0-covered von P5<br />

62


1<br />

0<br />

0<br />

))<br />

(<br />

(<br />

))<br />

_<br />

(<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

r<br />

error<br />

r<br />

error<br />

state<br />

old<br />

error<br />

multiple<br />

error<br />

it<br />

reject<br />

error<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

p<br />

(16)<br />

r ist not-covered von P1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

r<br />

error<br />

multiple<br />

error<br />

error<br />

state<br />

new<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

p<br />

(17)<br />

r ist not-covered von P2<br />

63


1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

r<br />

r<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

r<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

r<br />

state<br />

old<br />

multiple<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

it<br />

reject<br />

it<br />

correct<br />

p<br />

(18)<br />

r ist in jedem Zeitschritt 0-covered von P3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

4<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

r<br />

r<br />

multiple<br />

error<br />

error<br />

error<br />

r<br />

multiple<br />

error<br />

error<br />

error<br />

r<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

p<br />

(19)<br />

r ist in jedem Zeitschritt 1-covered von P4<br />

64


1<br />

_<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

5<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

r<br />

r<br />

multiple<br />

error<br />

error<br />

r<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

p (20)<br />

r ist in jedem Zeitschritt 1-covered von P5<br />

1<br />

0<br />

0<br />

))<br />

)<br />

((<br />

(<br />

))<br />

(<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

error<br />

t<br />

multiple<br />

error<br />

t<br />

error<br />

multiple<br />

error<br />

it<br />

reject<br />

error<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

p<br />

(21)<br />

t ist not-covered von P1<br />

65


1<br />

_<br />

_<br />

_<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

multiple<br />

error<br />

error<br />

t<br />

multiple<br />

error<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

p<br />

(22)<br />

t ist in jedem Zeitschritt (t+1) 1-covered von P2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

1<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

multiple<br />

error<br />

multiple<br />

t<br />

multiple<br />

error<br />

error<br />

t<br />

multiple<br />

t<br />

multiple<br />

error<br />

error<br />

t<br />

multiple<br />

t<br />

multiple<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

it<br />

reject<br />

it<br />

correct<br />

p<br />

(23)<br />

t ist not-covered von P3<br />

66


1<br />

_<br />

_<br />

_<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

4<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

multiple<br />

error<br />

error<br />

error<br />

t<br />

multiple<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

p<br />

(24)<br />

t ist in jedem Zeitschritt (t+1) 0-covered von P4<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

5<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

multiple<br />

multiple<br />

error<br />

error<br />

t<br />

multiple<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

p (25)<br />

t ist not-covered von P5<br />

67


Untersuchung der Zustandssignallinien<br />

1<br />

0<br />

0<br />

))<br />

)<br />

_<br />

((<br />

(<br />

))<br />

_<br />

(<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

_<br />

1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

state<br />

old<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

state<br />

old<br />

error<br />

multiple<br />

error<br />

it<br />

reject<br />

error<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

p<br />

(26)<br />

old_state ist not-covered von P1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

_<br />

2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

state<br />

old<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

p<br />

(27)<br />

old_state ist in jedem Zeitschritt (t+1) 0-covered von P2<br />

68


1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

_<br />

3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

state<br />

old<br />

state<br />

old<br />

state<br />

old<br />

multiple<br />

error<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

it<br />

reject<br />

it<br />

correct<br />

p<br />

(28)<br />

old_state ist not-covered von P3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

_<br />

4<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

state<br />

old<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

error<br />

oldstate<br />

multiple<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

p<br />

(29)<br />

old_state ist in jedem Zeitschritt (t+1) 1-covered von P4<br />

69


1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

_<br />

5<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

state<br />

old<br />

state<br />

old<br />

multiple<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

p (30)<br />

old_state ist not-covered von P5<br />

Untersuchung der Eingangssignallinien<br />

1<br />

0<br />

0<br />

))<br />

)<br />

_<br />

((<br />

(<br />

))<br />

_<br />

(<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

multiple<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

state<br />

old<br />

error<br />

multiple<br />

error<br />

it<br />

reject<br />

error<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

p<br />

(31)<br />

multiple ist not-covered von P1<br />

70


1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

multiple<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

p<br />

(32)<br />

multiple ist in jedem Zeitschritt (t+1) 1-covered von P2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

multiple<br />

state<br />

old<br />

state<br />

old<br />

multiple<br />

error<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

it<br />

reject<br />

it<br />

correct<br />

p<br />

(33)<br />

multiple ist not-covered von P3<br />

71


1<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

4<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

multiple<br />

error<br />

multiple<br />

multiple<br />

error<br />

error<br />

error<br />

error<br />

multiple<br />

multiple<br />

error<br />

error<br />

error<br />

oldstate<br />

multiple<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

p<br />

(34)<br />

multiple ist not-covered von P4<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

5<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

p (35)<br />

multiple ist in jedem Zeitschritt 0-covered von P5<br />

72


1<br />

))<br />

)<br />

_<br />

((<br />

(<br />

))<br />

_<br />

(<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

)<br />

_<br />

_<br />

(<br />

_<br />

_<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

state<br />

old<br />

error<br />

multiple<br />

error<br />

it<br />

reject<br />

error<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

error<br />

p<br />

(36)<br />

error ist in jedem Zeitschritt 1-covered von P1<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

2<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

error<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

error<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

it<br />

correct<br />

multiple<br />

error<br />

error<br />

p<br />

(37)<br />

error ist in jedem Zeitschritt 1-covered und in jedem Zeitschritt (t+1) 0-covered<br />

von P2<br />

73


1<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

_<br />

1<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

)<br />

(<br />

3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

error<br />

state<br />

old<br />

state<br />

old<br />

multiple<br />

error<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

error<br />

state<br />

old<br />

multiple<br />

state<br />

old<br />

multiple<br />

error<br />

it<br />

reject<br />

it<br />

correct<br />

it<br />

reject<br />

it<br />

correct<br />

p<br />

(38)<br />

error ist not-covered von P3<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

1<br />

_<br />

_<br />

_<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

1<br />

1)<br />

(<br />

1)<br />

(<br />

)<br />

(<br />

4<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

t<br />

error<br />

multiple<br />

error<br />

error<br />

error<br />

error<br />

multiple<br />

multiple<br />

error<br />

error<br />

error<br />

oldstate<br />

multiple<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

it<br />

reject<br />

multiple<br />

error<br />

error<br />

p<br />

(39)<br />

error ist in jedem Zeitschritt 0-covered von P4<br />

74


75<br />

error<br />

( t)<br />

( t)<br />

( t)<br />

p error multiple reject _ it<br />

(40)<br />

5<br />

error<br />

error<br />

error<br />

error<br />

1<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

multiple<br />

multiple<br />

multiple<br />

multiple<br />

( t)<br />

( t)<br />

( t)<br />

( t)<br />

reject _ it<br />

reject _ it<br />

<br />

<br />

multiple<br />

( t)<br />

( t)<br />

( t)<br />

old _ state<br />

( t)<br />

<br />

error<br />

( t)<br />

error ist in jedem Zeitschritt 0-covered von P5<br />

Untersuchung der Ausgangssignallinien<br />

p<br />

( t)<br />

( t)<br />

1<br />

error correct _ it reject _<br />

correct_it und reject_it sind in jedem Zeitschritt 0-covered von P1<br />

it<br />

( t)<br />

(41)<br />

p<br />

( t )<br />

( t1)<br />

( t1)<br />

2<br />

error error multiple correct _<br />

it<br />

<br />

<br />

t1<br />

(42)<br />

correct_it ist in jedem Zeitschritt (t+1) 1-covered und reject_it not-covered von<br />

P2<br />

p<br />

( t )<br />

3<br />

1 correct _ it reject _<br />

it<br />

( t )<br />

(43)<br />

correct_it und reject_it sind in jedem Zeitschritt 0-covered von P3<br />

p<br />

( t)<br />

( t1)<br />

( t1)<br />

4<br />

error error multiple reject _<br />

it<br />

t<br />

<br />

1<br />

(44)<br />

reject_it ist in jedem Zeitschritt (t+1) 1-covered und correct_it not-covered von<br />

P4


76<br />

p<br />

( t)<br />

( t)<br />

( t)<br />

5<br />

error multiple reject _ it<br />

(45)<br />

reject_it ist in jedem Zeitschritt 1-covered und correct_it not-covered von P5<br />

Tabelle 1. Abdeckung der Eigenschaften der property Suite<br />

p1 p2 p3 p4 p5<br />

q - covered - covered covered<br />

r - - covered covered covered<br />

s covered covered covered - -<br />

t - covered - covered -<br />

old_state - covered - covered -<br />

multiple - covered - - covered<br />

error covered covered - covered covered<br />

reject_it covered - covered covered covered<br />

correct_it covered covered covered - -<br />

Tabelle 2. Abdeckung unter Berücksichtigung der Zeitschritte<br />

p1 p2 p3 p4 p5<br />

q - t+1 - t+1 *<br />

r - - * * *<br />

s * t+1 * - -<br />

t - t+1 - t+1 -<br />

old_state - t+1 - t+1 -<br />

multiple - t+1 - - *<br />

error * * - * *<br />

reject_it * - * t+1 *<br />

correct_it * t+1 * - -


77<br />

Tabelle 3. Abdeckung durch 0/1-Coverage<br />

p1 p2 p3 p4 p5<br />

q - 1-covered - 0-covered 0-covered<br />

r - - 0-covered 1-covered 1-covered<br />

s 0-covered 1-covered 0-covered - -<br />

t - 1-covered - 0-covered -<br />

old_state - 0-covered - 1-covered -<br />

multiple - 1-covered - - 0-covered<br />

error 1-covered 1/0-covred - 0-covered 0-covered<br />

reject_it 0-covered - 0-covered 1-covered 1-covered<br />

correct_it 0-covered 1-covered 0-covered - -


£ ¥ § © £ £ © £ ¥ ! ¡ % ¥ ' ) ) + , - ¡ 0<br />

¡<br />

¥ 2 4 £ § <br />

0<br />

d e f g g i j k f e e d j p q S r s M F u w s F _ _ x V y z a K | | V w O O F V } O X F r F s a V H I z y I V ‚ \ V<br />

c<br />

a r \ H I F K … r a ˆ s M F ‰ K „ \ I _ s F V „ a a K X F V O a H I F K s F K u w s F _ _ „ a O X Y K s F s a V H I<br />

„<br />

: ¾ ³ C C Â µ ³ 9 C ³ C º ³ > Ã A µ A C ¹ ¹ > » þ ³ > ³ > ´ Ä Ã º ³ : ³ Ë A > ³ > ¸ ? A ½ ³ C Ñ : A þ ¾ 9 ³ ì A Á<br />

<br />

º ? C ¾ Ã ³ ¤ Ô ¸ Â Ã 9 Â C ¾ A > µ ¹ ³ ³ 9 ¹ C ³ º ³ 8 ³ µ C 9 À ³ C Ã Â ¼ ³ 9 º ¼ 9 ³ : » ¹ ¸ 9 µ ½ ³ ¹ > ³ C Ë º ¼ ³ > ¾ ³ C Å<br />

Ã<br />

78<br />

8 9 : < > ? A C<br />

E F H I K M O H I F S K M T F V O M X Y X Z \ M O F V O _ \ a X F V K<br />

F F M | K F X F E F H I K M ‹ F K O w O X \ V ‹ Ž M F r | _ M H I V F s a „ M F V X Ž F V s F K ’ “ M K O F I V F V ”<br />

|<br />

w _ | V F M H I F V ‰ K O \ X „ M K s M F O F r Z w K X F — X M O X s M F ‰ ‚ O X V \ ‹ X M w K … ‚ F M s F V z y V s M F<br />

z<br />

w s F _ _ x V y z a K | M V V F _ F T \ K X F ‰ O x F ‹ X F F M K F O } O X F r O M s F K X M › „ M F V X a K s \ a O s F r<br />

u<br />

w s F _ _ F K X z F V K X Ž F V s F K ’ œ M F F a V X F M _ a K | … Ž F _ H I F } O X F r X F M _ F Ž M H I X M | O M K s<br />

u<br />

K s Ž w T w K \ ‚ O X V \ I M F V X Ž F V s F K ‹ \ K K … M O X ¡ F s w H I K M H I X X V M T M \ _ a K s F V z w V s F V X<br />

a<br />

z X s M F “ M K ‚ M K s a K | r F K O H I _ M H I F K “ — x F V X F K Ž M O O F K O ’ ¢ K s M F O F V ‰ a O \ V ‚ F M X a K |<br />

w<br />

M V s F M K ‰ ‚ O X V \ ‹ X M w K O \ K O \ X „ T w V | F O X F _ _ X … s F V w I K F O w _ H I F O ¤ M O O F K \ a O ‹ w r r X<br />

Ž<br />

K s \ a X w r \ X M O H I F M K F | F F M | K F X F ‰ ‚ O X V \ ‹ X M w K | F K F V M F V X ’ œ \ „ a Ž M V s T w K F M ”<br />

a<br />

F V | V w ‚ F K ‰ ‚ O X V \ ‹ X M w K \ a O | F | \ K | F K a K s s M F O F M X F V \ X M T s a V H I ‰ K \ _ O F T w K<br />

K<br />

a z X V F X F K s F K § F I _ F V K ‚ M O „ a F M K F V \ a O V F M H I F K s F K ¨ a \ _ M X Y X T F V ‚ F O O F V X ’<br />

\<br />

© ª « ¬ ­ ® « ¯ ° ¬ ±<br />

9 ³ ´ A µ ³ C ? µ · ³ ¸ ³ > C ³ > ¸ ? C ¹ º ³ 9 C ³ C 9 : : ³ > » ³ > ³ C ´ º ³ ¸ ¸ ³ C ¼ ³ > º ½ ³ 9 ¾ ³ > ¿ C º ¼ 9 µ À Á<br />

²<br />

A C ¹ ³ ¸ ³ À º > Â C 9 Ã µ ³ > ´ Ä Ã º ³ : ³ Å ¿ 9 C Æ > A C ¾ ¾ ? Ç È > 9 Ã º Ã 9 µ ³ > ¸ 9 µ ¾ 9 ³ Ã º Ê C ¾ 9 ¹ Ë A C ³ : ³ C ¾ ³<br />

¸<br />

³ > ½ > ³ 9 º A C ¹ ¾ 9 ³ Ã ³ > ´ Ä Ã º ³ : ³ 9 C ? ¸ ¸ ³ C < ³ > ³ 9 µ ³ C ¾ ³ Ã º Ê ¹ ¸ 9 µ ³ C Í ³ ½ ³ C Ã A C ¾ ¾ ³ > Î C ¾ A Á<br />

Ì<br />

º > 9 ³ Å Ï A Ã Ã ³ > ¾ ³ : À » C C ³ C ¾ 9 ³ Ï A Ã ¼ 9 > À A C ¹ ³ C ³ 9 C ³ Ã · ³ ¸ ³ > Ã Ã Â ¹ > ? Ð 9 ³ > ³ C ¾ Â ¾ ³ > º ³ A ³ ><br />

Ã<br />

³ 9 C Ñ ¾ ? Ã Ã ³ 9 C ¹ > Â Ã Ã ³ > Ï A Ç ¼ ? C ¾ Ë A ¾ ³ Ã Ã ³ C Ì ³ > : ³ 9 ¾ A C ¹ ¹ ³ > ³ µ º Ç ³ > º 9 ¹ º ¼ 9 > ¾ Å ² 9 ³ Ã 9 Ã º<br />

Ã<br />

C Ã ½ ³ Ã Â C ¾ ³ > ³ ½ ³ 9 : ¿ 9 C Ã ? º Ë 9 C Ã 9 µ ³ > ³ 9 º Ã À > 9 º 9 Ã µ ³ C < ³ > ³ 9 µ ³ C ¼ 9 ³ Ë A : < ³ 9 Ã Ô 9 ³ ¸ 9 :<br />

9<br />

º ³ A ³ > Ã Ä Ã º ³ : ³ 9 C ³ Ã · ¸ A ¹ Ë ³ A ¹ ³ Ã ¾ ³ > · ? ¸ ¸ Å<br />

´<br />

Ê > ³ C ¾ ½ ³ 9 À ¸ ³ 9 C ³ > ³ C ´ Ä Ã º ³ : ³ ¾ ? Ã ¹ > È C ¾ ¸ 9 µ ³ 8 ³ Ã º ³ C ½ Ë ¼ Å ´ 9 : A ¸ 9 ³ > ³ C Ð ³ > Ã µ 9 ³ Á<br />

Ö<br />

³ C ³ > Ï ½ ¸ Ê A Ç ³ Â Ç º : ? ¸ Ã Ë A > ¿ > À ³ C C A C ¹ ¾ ³ > : ³ 9 Ã º ³ C · ³ ¸ ³ > ? A Ã > ³ 9 µ º Ñ Ã 9 C ¾ A : Ç ? C ¹ Á<br />

¾<br />

³ 9 µ ³ > ³ ´ Ä Ã º ³ : ³ ? A Ç ¾ 9 ³ Ã ³ Ö ³ 9 Ã ³ C 9 µ º : ³ > Ë A Ç > 9 ³ ¾ ³ C Ã º ³ ¸ ¸ ³ C ¾ Ë A A C º ³ > Ã A µ ³ C Å Î C<br />

><br />

³ C ¸ ³ º Ë º ³ C Ù ? > Ë ³ C º ³ C ? ½ ³ C Ã 9 µ ¾ ? ³ > ³ 9 C 9 ¹ ³ ¼ ³ 9 º ³ > ³ Ì ? ¸ 9 ¾ 9 ³ > A C ¹ Ã º ³ µ C 9 À ³ C ³ º ? Á<br />

¾<br />

¸ 9 ³ > º Ñ ¼ Â Ð Â C ¾ ? Ã Ì ³ > Ç ? > ³ C ¾ ³ > Ú Û Ü Ý Þ Þß à á â ã ä å æ ³ C ¹ ¸ Å è Â ¾ ³ ¸ é ³ µ À 9 C ¹ ê Ë A ¾ ³ C ? :<br />

½<br />

Ê A ë ¹ Ã º ³ C ³ 9 C ¹ ³ Ã ³ º Ë º ³ C ¹ ³ » > º Å ì A > è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ ¼ 9 > ¾ ³ 9 C Ú Û Ü Ý Þ Þ ¾ ³ Ã Ë A º ³ Ã º ³ C Á<br />

<br />

³ C ´ Ä Ã º ³ : Ã ½ ³ C » º 9 ¹ º Ñ ¾ ? Ã Â Ç º ? ¸ Ã ³ 9 C î > Â ¹ > ? : : Â ¾ ³ > ³ 9 C ì A Ã º ? C ¾ Ã ? A º Â : ? º ¹ ³ ¹ ³ ½ ³ C<br />

¾<br />

à º Å ² 9 ³ à ³ à è  ¾ ³ ¸ ¸ ¼ 9 > ¾ ¾ ? C C A C º ³ > ¿ 9 C à ? º Ë ³ 9 C ³ à é  : Ô A º ³ > à ? A º  : ? º 9 à µ ¾ ? > ? A Ç 9 C<br />

9<br />

½ ³ > Ô > È Ç º Ñ Â ½ ³ Ã ³ 9 C ³ 9 C ³ 9 C ³ > ½ ³ Ã º 9 : : º ³ C Í Â ¹ 9 À Ç Â > : A ¸ 9 ³ > º ³ ñ ß Ý ò ó ô õ ö ÷ ó Û ä ³ > Ç È ¸ ¸ º Å<br />

È<br />

? Ë A ¼ ³ > ¾ ³ C ? A Ã ¹ ³ ³ C ¾ Ð Â C ¾ ³ C Î C 9 º 9 ? ¸ Ë A Ã º Ê C ¾ ³ C ¾ ³ Ã è Â ¾ ³ ¸ ¸ Ã ? ¸ ¸ ³ ³ > > ³ 9 µ ½ ? > ³ C · Â ¸ Á<br />

²<br />

³ Ë A Ã º Ê C ¾ ³ ½ ³ Ã º 9 : : º A C ¾ ¾ 9 ³ Ã ³ Æ ³ Ã ? : º : ³ C ¹ ³ Ð Â C ì A Ã º Ê C ¾ ³ C ¾ ? > ? A Ç 9 C A C º ³ > Ã A µ º Ñ<br />

¹<br />

½ Ã 9 ³ ¾ 9 ³ ´ Ô ³ Ë 9 ë À ? º 9 Â C ³ > Ç È ¸ ¸ º Â ¾ ³ > C 9 µ º Å<br />

Â<br />

 ¸ ¸ ¾ 9 ³ è  ¾ ³ ¸ ¸ Ô > È Ç A C ¹ ? A Ç A : Ç ? C ¹ > ³ 9 µ ³ > ³ ´ Ä Ã º ³ : ³ ? C ¹ ³ ¼ ³ C ¾ ³ º ¼ ³ > ¾ ³ C Ñ ¼ ? Ã<br />

´<br />

Ë A :<br />

< ³ 9 Ã Ô 9 ³ ¸ Ç È > ¾ 9 ³ ù ? ¸ ½ ¸ ³ 9 º ³ > Á Î C ¾ A Ã º > 9 ³ Ã ³ > 9 C º ³ > ³ Ã Ã ? C º 9 Ã º Ñ Ã º ³ ¸ ¸ º ú ³ ¾ Â µ ¾ 9 ³ Ã Â ¹ ³ Á<br />

? C C º ³ û ã ü ÷ ö ä Ü ü Ý ý ß Þ Û ü ó Û ä ³ 9 C ¹ > Â þ ³ Ã î > Â ½ ¸ ³ : ¾ ? > Å è 9 º ¾ 9 ³ Ã ³ : < ³ ¹ > 9 ¼ 9 > ¾ ¾ ³ > ¿ Ç Á<br />

C<br />

³ À º ½ ³ Ë ³ 9 µ C ³ º Ñ ¾ ? Ã Ã ¾ 9 ³ ì ? ¸ ¾ ³ > : » ¹ ¸ 9 µ ³ C ì A Ã º Ê C ¾ ³ ³ 9 C ³ Ã ´ Ä Ã º ³ : Ã Ê A þ ³ > Ã º Ã µ C ³ ¸ ¸<br />

Ç<br />

: 9 º Ã ³ 9 C ³ > ¢ Â : Ô ¸ ³ ¤ 9 º Ê º ¼ Ê µ Ã º Å < ³ 9 Ã Ô 9 ³ ¸ Ã ¼ ³ 9 Ã ³ À ? C C ³ 9 C ´ Ä Ã º ³ : : 9 º C A > ³ 9 C ³ : ³ 9 C Ë ³ ¸ Á<br />

C ³ C ¦ ¨<br />

< 9 º ì Ê ¸ ³ > ½ ³ > ³ 9 º Ã ½ 9 Ã Ë A<br />

2 64 ≈ 2 · 10 19 Ð ³ > Ã µ 9 ³ ¾ ³ C ³ ì A Ã º Ê C ¾ ³ ? C C ³ : ³ C Ñ ¾ 9 ³<br />

³ 9 : C ? 9 Ð ³ C è Â ¾ ³ ¸ é ³ µ À 9 C ¹ ? ¸ ¸ ³ A C º ³ > Ã A µ º ¼ ³ > ¾ ³ C : È Ã Ã ³ C Å < ³ 9 A : Ç ? C ¹ > ³ 9 µ ³ > ³ C<br />

½<br />

Ä Ã º ³ : ³ ¼ 9 > ¾ ¾ ³ > Ï A Ç ¼ ? C ¾ Ç È > ³ 9 C ³ è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ ¾ ? ³ > Ã µ C ³ ¸ ¸ Ë A ¹ > Â þ Å<br />

´<br />

¿ 9 C ¼ 9 µ º 9 ¹ ³ > A C ¾ Ã ³ > ³ > Ç Â ¸ ¹ > ³ 9 µ ³ > Ï C Ã ? º Ë 9 C ¾ 9 ³ Ã ³ : ¢ Â C º ³ ¤ º 9 Ã º ¾ 9 ³ ü ÷ à ö õ ÷ ó Û ä Å


9 ³ Ã 9 µ 9 C º ³ > ¾ 9 ³ Ã ³ : < ³ ¹ > 9 Ð ³ > ½ ³ > ¹ ³ C ¾ ³ 8 ³ µ C 9 À ½ ? Ã 9 ³ > º ¾ ? > ? A Ç Ñ ¾ ? Ã Ë A È ½ ³ > Ô > È Á<br />

²<br />

³ C ¾ ³ è Â ¾ ³ ¸ ¸ ¾ A > µ ¿ C º Ç ³ > C ³ C Ð Â C 8 ³ 9 ¸ ? Ã Ô ³ À º ³ C Ñ ¾ 9 ³ ½ ³ Ë È ¹ ¸ 9 µ ¾ ³ > ´ Ô ³ Ë 9 ë À ? º 9 Â C C 9 µ º<br />

Ç<br />

9 µ º 9 ¹ Ã 9 C ¾ Ñ 9 C ³ 9 C ö ü ÷ à ö õ ÷ Ý ü Ú Û Ü Ý Þ Þ Ë A È ½ ³ > Ç È > ³ C Å ² 9 ³ Ã ³ Ã è Â ¾ ³ ¸ ¸ ? º ³ 9 C ³ C À ¸ ³ 9 C ³ Á<br />

¼<br />

³ C ì A Ã º ? C ¾ Ã > ? A : ? ¸ Ã ¾ ? Ã A > Ã Ô > È C ¹ ¸ 9 µ ³ Ñ Ã Â ¾ ? Ã Ã ³ 9 C ³ è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ ¾ ³ Ã ? ½ Ã º > ? À º ³ C<br />

><br />

 ¾ ³ ¸ ¸ à ³ 9 C Ç ? µ ³ > ¾ A > µ ¹ ³ Ç È > º ¼ ³ > ¾ ³ C À ? C C Å Î Ã º ¾ 9 ³ Ï ½ à º > ? À º 9  C ¹ ³ ³ 9 ¹ C ³ º ¹ ³ ¼ Ê ¸ º Ñ<br />

è<br />

» C C ³ C ? A Ã ¾ ³ : ¿ > ¹ ³ ½ C 9 Ã ¾ 9 ³ Ã ³ > Ï C ? ¸ Ä Ã ³ ¾ ³ C C Â µ Ï A Ã Ã ? ¹ ³ C È ½ ³ > ¾ ? Ã Ì ³ > ? ¸ º ³ C ¾ ³ Ã<br />

À<br />

> 9 ¹ 9 C ? ¸ Ã Ä Ã º ³ : Ã ? ½ ¹ ³ ¸ ³ 9 º ³ º ¼ ³ > ¾ ³ C Å < ³ 9 Ã Ô 9 ³ ¸ Ã ¼ ³ 9 Ã ³ À ? C C ½ ³ 9 ½ ³ Ã º 9 : : º ³ C Ï ½ Ã º > ? À º 9 Â Á<br />

¡<br />

³ C ¹ ³ Ã µ ¸ Â Ã Ã ³ C ¼ ³ > ¾ ³ C Ñ ¾ ? Ã ? ¸ ¸ ³ < ³ ¾ 9 C ¹ A C ¹ ³ C ¾ ³ > ´ Ô ³ Ë 9 ë À ? º 9 Â C Ñ ¾ 9 ³ Ð Â : ? ½ Ã º > ? À º ³ C<br />

C<br />

 ¾ ³ ¸ ¸ ³ > Ç È ¸ ¸ º ¼ ³ > ¾ ³ C Ñ ? A µ Ð Â : A > Ã Ô > È C ¹ ¸ 9 µ ³ C è  ¾ ³ ¸ ¸ ³ 9 C ¹ ³ ? ¸ º ³ C ¼ ³ > ¾ ³ C Å Ì ³ > ¸ ³ º Ë º<br />

è<br />

9 C Ã Â ¸ µ ³ > : ? þ ³ C ? ½ Ã º > ? 9 ³ > º ³ Ã ´ Ä Ã º ³ : À ³ 9 C ³ ¾ ³ > Ã Ô ³ Ë 9 ë Ë 9 ³ > º ³ C < ³ ¾ 9 C ¹ A C ¹ ³ C Ñ A C ¾ 9 Ã º<br />

³<br />

> 9 ¹ 9 C ? ¸ Ã Ä Ã º ³ : Ã ¹ ³ Ë ³ 9 ¹ º Å<br />

¡<br />

C ¾ 9 ³ Ã ³ > ´ ³ : 9 C ? > ? > ½ ³ 9 º ¼ 9 > ¾ ³ 9 C Ï C Ã ? º Ë Ë A > Ï ½ Ã º > ? À º 9 Â C Ð Â > ¹ ³ Ã º ³ ¸ ¸ º Ñ ¾ ³ > Ð Â C<br />

Î<br />

¸ ? > À ³ A C ¾ Æ > A : ½ ³ > ¹ Ð ³ > » ³ C º ¸ 9 µ º ¼ A > ¾ ³ ¢ ¤ ¦ Å ¿ > ? º ¾ ³ C ¹ > Â þ ³ C Ì Â > º ³ 9 ¸ Ñ Â C ³ : ? Á<br />

é<br />

A ³ ¸ ¸ ³ ì A Ã ? º Ë ? > ½ ³ 9 º ? A Ã Ë A À Â : : ³ C A C ¾ ¾ ³ C C Â µ ? A Ç ³ 9 C ½ > ³ 9 º ³ Ã · ³ ¸ ¾ Ð Â C ´ Ä Ã º ³ : ³ C º Á<br />

C<br />

È > Ç ³ C ? C ¼ ³ C ¾ ½ ? > Ë A Ã ³ 9 C Å ´ ³ 9 C ³ Ï > ½ ³ 9 º Ã ¼ ³ 9 Ã ³ ½ ³ > A º ¾ ? > ? A Ç Ñ ? A Ã ³ 9 C ³ : ¹ ³ ¹ ³ ½ ³ C ³ C<br />

¼<br />

 ¾ ³ ¸ ¸ Ë A C Ê µ à º ³ 9 C ³ à ³ > ¹ >  ½ ³ Ï ½ à º > ? À º 9  C Ë A ¹ ³ C ³ > 9 ³ > ³ C Å ² A > µ Ï C ? ¸ Ä Ã ³ Ð Â C<br />

è<br />

³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ³ C ¼ 9 > ¾ ¾ 9 ³ Ã ³ ¾ ? C C 9 º ³ > ? º 9 Ð 9 : : ³ > ¼ ³ 9 º ³ > Ð ³ > Ç ³ 9 C ³ > º Ñ ½ 9 Ã ¾ 9 ³ è Â ¾ ³ ¸ ¸ Á<br />

Æ<br />

> È Ç A C ¹ ³ 9 C ³ À Â C À > ³ º ³ Ï A Ã Ã ? ¹ ³ È ½ ³ > ¾ 9 ³ ¿ 9 C ? ¸ º A C ¹ ¾ ³ > ´ Ô ³ Ë 9 ë À ? º 9 Â C ¸ 9 ³ Ç ³ > C À ? C C Å<br />

Ô<br />

9 ³ Ð Â > ¸ 9 ³ ¹ ³ C ¾ ³ Ï A Ã ? > ½ ³ 9 º A C ¹ ¹ ¸ 9 ³ ¾ ³ > º Ã 9 µ 9 C Ð 9 ³ > Ï ½ Ã µ C 9 º º ³ Å Î : Ë ¼ ³ 9 º ³ C Ï ½ Á<br />

²<br />

µ C 9 º º ¼ ³ > ¾ ³ C Ë A C Ê µ Ã º ³ 9 C 9 ¹ ³ Æ > A C ¾ ¸ ? ¹ ³ C ½ ³ ? C ¾ ³ ¸ º Ñ ¾ 9 ³ ³ 9 C ³ Ç Â > : ? ¸ ³ < ? Ã 9 Ã Ç È > ¾ 9 ³<br />

Ã<br />

 ¸ ¹ ³ C ¾ ³ < ³ à µ > ³ 9 ½ A C ¹ ½ 9 ¸ ¾ ³ C Å Ï C à µ ¸ 9 ³ þ ³ C ¾ ¼ ³ > ¾ ³ C ¾ 9 ³ º ³  > ³ º 9 à µ ³ C Æ > A C ¾ ¸ ? ¹ ³ C<br />

Ç<br />

 C Ï ½ à º > ? À º 9  C ³ C ½ ³ º > ? µ º ³ º A C ¾ à µ ¸ 9 ³ þ ¸ 9 µ ¾ ³ > À  C À > ³ º ³ Ï ½ à º > ? À º 9  C à ? C à ? º Ë Ð Â C<br />

Ð<br />

A > è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ ³ 9 C ³ Ã ´ Ä Ã º ³ : Ã ¼ 9 > ¾ ³ 9 C Ú Û Ü Ý Þ Þ ¾ ³ Ã Ë A º ³ Ã º ³ C ¾ ³ C ´ Ä Ã º ³ : Ã A C ¾<br />

ì<br />

9 C ³ ñ ß Ý ò ó ô õ ö ÷ ó Û ä ¾ ³ Ã ¹ ³ ¼ È C Ã µ º ³ C è Â ¾ ³ ¸ ¸ Ð ³ > ? ¸ º ³ C Ã ½ ³ C » º 9 ¹ º Å < ³ 9 ¾ ³ ¢ Â : Ô Â C ³ C º ³ C<br />

³<br />

» C C ³ C ? A Ç Ð ³ > Ã µ 9 ³ ¾ ³ C ³ Ï > º ³ C Ç Â > : ? ¸ ½ ³ Ã µ > 9 ³ ½ ³ C ¼ ³ > ¾ ³ C Å<br />

À<br />

C Ï ½ Ã µ C 9 º º ¤ Å ¼ ³ > ¾ ³ C Ë A C Ê µ Ã º Ë ¼ ³ 9 è » ¹ ¸ 9 µ À ³ 9 º ³ C Ë A > Ï C ¹ ? ½ ³ ³ 9 C ³ Ã è Â ¾ ³ ¸ ¸ Ã<br />

Î<br />

 > ¹ ³ à º ³ ¸ ¸ º Å Ï C à µ ¸ 9 ³ þ ³ C ¾ ¼ 9 > ¾ 9 C Ï ½ à µ C 9 º º ¤ Å ¤ ¾ 9 ³ Û ß ã ÷ ö ÷ ó Û ä à Ý Ý Û å ó æ é 8 Í ê<br />

Ð<br />

9 C ¹ ³ Ç È > º Ñ : 9 º ¾ ³ > Ï C Ç Â > ¾ ³ > A C ¹ ³ C ? C ¾ ? Ã Ë ³ 9 º ¸ 9 µ ³ Ì ³ > ? ¸ º ³ C ¾ ³ Ã è Â ¾ ³ ¸ ¸ Ã Ã Ô ³ Ë 9 ë Ë 9 ³ > º<br />

³<br />

9 ³ ¸ ³ ¾ ³ > Ç È > ³ 9 C ³ è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ 9 C º ³ > ³ Ã Ã ? C º ³ C ´ Ä Ã º ³ : ³ Ã 9 C ¾ ½ Ë ¼ Å Ð ³ > ¼ ³ C ¾ ³ C ¾ 9 ¹ 9 Á<br />

Ì<br />

? ¸ ³ ´ µ ? ¸ º A C ¹ ³ C Ñ ¾ 9 ³ ¾ 9 Ã À > ³ º ³ Ö ³ > º ³ Ð ³ > ? > ½ ³ 9 º ³ C A C ¾ Ã Ô ³ 9 µ ³ > C Å ¿ 9 C Ë ³ ¸ C ³ ì A Ã º ? C ¾ Á<br />

º<br />

C ¾ ³ > A C ¹ ³ C Ã Â ¸ µ ³ > ´ Ä Ã º ³ : Ã ¸ ? A Ç ³ C Ã Â Ã µ C ³ ¸ ¸ ? ½ Ñ ¾ ? Ã Ã Ã 9 ³ Ô > Â ½ ¸ ³ : ¸ Â Ã ³ 9 C ³ : Ç ³ Ã º ³ C<br />

Ê<br />

³ 9 º Ô A C À º Ë A ¹ ³ Â > ¾ C ³ º ¼ ³ > ¾ ³ C À » C C ³ C A C ¾ C 9 µ º ? ¸ Ã À Â C º 9 C A 9 ³ > ¸ 9 µ ³ î > Â Ë ³ Ã Ã ³ È ½ ³ ><br />

ì<br />

9 ³ ì ³ 9 º : Â ¾ ³ ¸ ¸ 9 ³ > º ¼ ³ > ¾ ³ C : È Ã Ã ³ C Å ² ? ³ > : A þ ¾ 9 ³ < ³ Ã µ > ³ 9 ½ A C ¹ ¾ ³ Ã ¹ ³ Ã ? : º ³ C ´ Ä Á<br />

¾<br />

º ³ : Ã ³ ½ ³ C Ç ? ¸ ¸ Ã C 9 µ º À Â C º 9 C A 9 ³ > ¸ 9 µ 9 C ¾ ³ > ì ³ 9 º ³ > Ç Â ¸ ¹ ³ C Ñ Ã Â C ¾ ³ > C À ? C C ? A Ç ¾ 9 Ã À > ³ º ³<br />

Ã<br />

t i<br />

½ ³ Ã µ > Ê C À º ¼ ³ > ¾ ³ C Ñ Ë ¼ 9 Ã µ ³ C ¾ ³ C ³ C À ³ 9 C ³ ì A Ã º ? C ¾ Ã Ê C ¾ ³ > A C ¹ ³ C ? A Ç Á<br />

t i+1<br />

³ > ¹ 9 ½ º Å<br />

: · Â ¸ ¹ ³ C ¾ ³ C ¼ ³ > ¾ ³ C : 9 º ¾ ³ : . à Û å à ö A C ¾ ¾ ³ > 1 à ó ß õ Ý 3 ñ ÷ à ã õ ÷ ã à Ë ¼ ³ 9 è 9 º º ³ ¸<br />

Î<br />

A > è Â ¾ ³ ¸ ¸ 9 ³ > A C ¹ Ã Â ¸ µ ³ > à ö ä ü ó ÷ ó Û ä ü ü 5 ü ÷ Ý Ý Ð Â > ¹ ³ Ã º ³ ¸ ¸ º Å<br />

Ë<br />

P Ã ³ º A ³ C > C ¸ µ ³ è C ³ Â Ì > ? ¸ C<br />

V = {v 1 ,...,v n ? Ã 9 ³ ³ ¾ 9 C ³ ¹ Ð C ? 9 ½ ³ } ½ ³ º > ú ³ ¾ ³ Ì ? > 9 ? ½ ¸ ³ Å Ù ³ ¾ ³ Ì ? > 9 Ç ? È ½ ¸ ³<br />

T i v i À µ Â ¸ ½ Ã C Â 9 º 9 Ã C ? > 8 : ³ C 9 ³ ¾ C A<br />

79<br />

¾ 9 ³ ´ Ô ³ Ë 9 ë À ? º 9 Â C<br />

à ³ ¸ ½ à º Ç ³ ¸ ³ > Ç > ³ 9 æ ¼ ? à Р > ? A à ¹ ³ à ³ º Ë º ¼ 9 > ¾ ê Ñ 9 à º ¾ 9 ³ · ³ ¸ ³ > Ç > ³ 9 ³ 9 º ¾ ³ Ã<br />

é ¸ ? > À ³ Ð Â > ¹ ³ Ã º ³ ¸ ¸ º Å<br />

¨ © ° ¬ ­ ± ® ¬<br />

¼ ³ > ¾ ³ C À » C C ³ C Å ² ³ C Ï ½ Ã µ ¸ A Ã Ã ½ 9 ¸ ¾ ³ º ³ 9 C ³ Ç Â > : ? ¸ ³ < ³ Ã µ > ³ 9 ½ A C ¹ Ð Â C é 8 Í Å<br />

! " # % & ( (<br />

ì ³ 9 º Ô A C À º ³<br />

> º ³ C Å ² ? Ã ´ Ä Ã º ³ : Ð ³ > ? ¸ º ³ C ¼ 9 > ¾ ¾ ? Ë A Ê A ë ¹ ¾ A > µ Ï C ¹ ? ½ ³ ¾ ³ > Î C 9 º 9 ? ¸ Ë A Ã º Ê C ¾ ³<br />

º ³<br />

à ´ Ä Ã º ³ : Ã Ë A : ì ³ 9 º Ô A C À º<br />

¾ A ³ C ¾ ³ 9 C ³ > + ³ 9 ³ Ð Â C 8 > ? C Ã 9 º 9 Â C Ã > ³ ¹ ³ ¸ C ½ ³ Ã µ > 9 ³ ½ ³ C Å<br />

t 0<br />

t i<br />

¾ ³ ><br />

² 9 ³ Ã ³ + ³ ¹ ³ ¸ C ¾ ³ ë C 9 ³ > ³ C Ñ ¼ 9 ³ Ã 9 µ ? A Ã ³ 9 C ³ : ´ Ä Ã º ³ : Ë A Ã º ? C ¾ Ë A : ì ³ 9 º Ô A C À º<br />

· Â ¸ ¹ ³ Ë A Ã º ? C ¾ Ë A > ì ³ 9 º<br />

8 9 # : 9 < = = ¿ 9 C î > Â ¹ > ? : :


v i<br />

À ? C C Ö ³ > º ³ ? A Ã 9 > ³ > ¢ ö ä Ý<br />

D vi<br />

? C C ³ : ³ C Å ¿ 9 C . à Û å à ö ò ã ü ÷ ö ä Ü<br />

d Ë A ³ 9 C ³ :<br />

³ ¹ ³ ½ ³ C ³ C ì ³ 9 º Ô A C À º 9 Ã º ¾ A > µ Ï C ¹ ? ½ ³ ? ¸ ¸ ³ > Ì ? > 9 ? ½ ¸ ³ C ¼ ³ > º ³ Ë A ¾ 9 ³ Ã ³ : ì ³ 9 º Ô A C À º<br />

¹<br />

³ Ã º 9 : : º A C ¾ ¿ ¸ ³ : ³ C º ¾ ³ > è ³ C ¹ ³ ? ¸ ¸ ³ > : » ¹ ¸ 9 µ ³ C î > Â ¹ > ? : : Ë A Ã º Ê C ¾ ³<br />

½<br />

d vi<br />

½ Ë ¼ Å<br />

d i<br />

½ ³ Ë ³ 9 µ C ³ º Å<br />

 > ¾ ³ > < ³ à µ > ³ 9 ½ A C ¹ ¾ ³ > 8 > ? C à 9 º 9  C à ½ ¸ » µ À ³ ¼ ³ > ¾ ³ C C  µ ³ 9 C 9 ¹ ³ ¼ ³ 9 º ³ > ³ < ³ ¹ > 9 ³<br />

Ì<br />

 > ¹ ³ à º ³ ¸ ¸ º ¤ Ð<br />

V Â Ã ? º C A A ¾ A Ç ¾ ³ C C ? Ï C Á<br />

D vi ¢ C º C ³ ? Ã Ñ º<br />

D<br />

> ³ 9 C ë ³ ¾<br />

vi<br />

D vi = N ³ Ã 9 ¸ ¼ 9 ³ > º : º Ã · C À º 9 Â C ³ C ¼ 9 ³<br />

+ Ã − ∗ 9 / v 1 C +3 ¾ ½ 9 Ô ³ Ã ³ Ã ? 9 ³ 9 µ ³ A » ¹ ¸ 9 µ ³ Ï A Â Ã ¾ ¾ ³ > ><br />

È : µ À ³ Å<br />

v 2 − v 1 v 3 /3+v 1 Ñ ¾ C A > ? ½ À C ³ ¾ Ñ Ñ Ñ<br />

? C C ? ½ Ê C ¹ 9 ¹ Ð Â C ¾ ³ > < ³ ¸ ³ ¹ A C ¹ ¾ ³ > Ì ? > 9 ? ½ ¸ ³ C ³ C º ¼ ³ ¾ ³ > Â ¾ ³ > ! " Ã ³ 9 C Ñ<br />

À<br />

9 ³ Ç ³ > º ? ¸ Ã Â ³ 9 C ³ C ½ Â Â ¸ ³ Ã µ ³ C Ö ³ > º Å<br />

¸<br />

v i<br />

9 C<br />

p Ñ ½ ³ Ë ³ 9 µ C ³ º § # = & ( p*<br />

p ¾ A > µ d i<br />

³ C º Ã º ³ º Ñ Ë A : ½ Â Â ¸ ³ Ã µ ³ C Ö ³ > º ? A Ã ¹ ³ ¼ ³ > º ³ º<br />

³ 9 º Ô A C À º ? C C ³ : ³ C ¼ 9 > ¾ Å Î C ¼ 9 > ¾ Ç È > ¾ 9 ³ ´ Ä C º ? ¤ A C ¾ ´ ³ : ? C º 9 À ³ 9 C ³ Ã 8 > ? C Á<br />

ì<br />

9 º 9 Â C Ã ½ ¸ Â µ À ³ Ã ³ 9 C ³ ? C ¾ ³ C ´ è Ì è Â ¾ ³ ¸ é ³ µ À ³ > ? C ¹ ³ ¸ ³ C º ³ Ì ? > 9 ? C º ³ Ð Â > ¹ ³ Ã º ³ ¸ ¸ º Ñ<br />

Ã<br />

9 ³ ú ³ ¾ Â µ ½ Ë ¹ ¸ Å & 9 µ º Á ² ³ º ³ > : 9 C 9 Ã : A Ã A C À ¸ ? > ¾ ³ ë C 9 ³ > º 9 Ã º A C ¾ ¾ ³ Ã ? ¸ ½ 9 ³ > C 9 µ º<br />

¾<br />

³ Ã µ > 9 ³ ½ ³ C ¼ 9 > ¾ Å ´ º ? º º ¾ ³ Ã Ã ³ C ¼ 9 > ¾ 9 C Ï ½ ½ Å ? ³ 9 C ³ ¸ ³ 9 µ º ? ½ ¹ ³ ¼ ? C ¾ ³ ¸ º ³ ´ Ä C º ? ¤<br />

½<br />

8 > = ; C<br />

4<br />

‰ ‚ ‚ ’ E<br />

8 > = ; C<br />

4<br />

…<br />

…<br />

…<br />

…<br />

…<br />

…<br />

…<br />

…<br />

80<br />

D v1 × D v2 ×···×D vn<br />

Å ² ³ > Ö ³ > º ¾ ³ > Ì ? > 9 ? ½ ¸ ³<br />

v i<br />

9 : î > Â ¹ > ? : : Ë A Ã º ? C ¾<br />

D D =<br />

d : 9 º ¾ ? A µ > 9 ¼<br />

: 9 º<br />

¦ § © % 9 & ¼ ³ > ¾ ³ C ? A Ã Ì ? > 9 ? ½ ¸ ³ C 9 C<br />

¼ ³ C ¾ A C ¹ Ã Ç ? ¸ ¸ ½ ³ Ë Â ¹ ³ C Ã 9 C C Ð Â ¸ ¸ ³ C · A C À º 9 Â C ³ C Ñ ¾ 9 ³ ? A Ç ¾ ³ C è ³ C ¹ ³ C<br />

à 9 C ¾ Ñ ¹ ³ ½ 9 ¸ ¾ ³ º Å · È ><br />

§ # < & © < : & ¼ ³ > ¾ ³ C ? A Ã Ï A Ã ¾ > È µ À ³ C A C ¾ ³ ½ ³ C Ç ? ¸ ¸ Ã Ô ? Ã Ã ³ C ¾ Ë A > Ï C Á<br />

= 9<br />

C ¾ A C ¹ ¾ ³ ë C 9 ³ > º ³ C + ³ ¸ ? º 9 Â C ³ C ¹ ³ ½ 9 ¸ ¾ ³ º Å · È > ¾ ? Ã ³ ½ ³ C ¹ ³ ¹ ³ ½ ³ C ³ < ³ 9 Ã Ô 9 ³ ¸ 9 Ã º ¾ 9 ³<br />

¦ <br />

¼ ³<br />

§ <br />

¾ A C ¹ ¾ ³ > + ³ ¸ ? º 9 Â C ³ C<br />

Ì ³ > ¼ ³ C<br />

< > = ≤ ≥ v 1 +3 < 5 ¹ ¸ 9 µ Å ² ? C C Ã 9 C ¾ Ñ<br />

v 2 − v 1 =0 Ñ v 3 Ñ Ñ /3+v 1 Ñ = v 1 +3 : » Â : ? > ³ Ï A Ã Ã ? ¹ ³ C Å Ù ³ ¾ ³ ? º Â : ? > ³ Ï A Ã Ã ? ¹ ³<br />

º ? > ³ ¾ Â<br />

8 $ % % < & Ã 9 C ¾ ³ 9 C Ë ³ ¸ C ³ ? º Â : ? > ³ Ï A Ã Ã ? ¹ ³ C A C ¾ Ì ³ > À C È Ô Ç A C ¹ ³ C Ð Â C ? º Â : ? > ³ C<br />

9<br />

A Ã Ã ? ¹ ³ C : 9 º º ³ ¸ Ã ¾ ³ C ½ Â Â ¸ ³ Ã µ ³ C · A C À º 9 Â C ³ C & ³ ¹ ? º 9 Â C æ<br />

¦<br />

Ï<br />

¬ ∧ ¢ Â C ú A C À º 9 Â C æ ê<br />

ê Ñ ¾ ² 9 Ã ú A C À º 9 Â C æ A C<br />

∨ Å ê<br />

³ 9 C ³ è ³ C ¹ ³ : 9 º ¹ ³ C ? A ? ¸ ¸ ³ C<br />

º Â : ? > ³ C Ï A Ã Ã ? ¹ ³ C Ñ ¾ 9 ³ 9 C<br />

?<br />

Æ ³ ¹ ³ ½ ³ C ³ 9 C î > Ê ¾ 9 À ? º<br />

¦<br />

p > Â : C<br />

p Ð V Â d À ∈ : D ³ =<br />

Å<br />

9 ? ½ ¸ ³ C ? A Ã A C ¾ ³ 9 C î > Â ¹ > ? : : Ë A Ã º ? C ¾ > ? Ì º 9 :<br />

(d 1 ,...,d n ) Å ² ? C C ½ ³ ¾ ³ A º ³ º d |= p Ñ ¾ ? Ã Ã ¾ ? Ã î > Ê ¾ 9 À ? º Ñ ¼ ³ ¸ µ ³ Ã ¾ A > µ ¿ > Ã ³ º Ë ³ C<br />

¦<br />

Æ ³ ¹ ³ ½ ³ C ³ 9 C î > Ê ¾ 9 À ? º<br />

ú ³ ¾ ³ > Ì ? > 9 ? ½ ¸ ³<br />

¼ 9 > ¾ Å<br />

³ 8 > ? C Ã 9 º 9 Â C Ã ½ ¸ Â µ À ³ 9 C ³ > Ì ? > 9 ? ½ ¸ ³ ¹ 9 ½ º ? C Ñ ¼ 9 ³ ¾ ³ > Ö ³ > º ¾ ³ > Ì ? > 9 ? ½ ¸ ³ Ë A : ì ³ 9 º Á<br />

² ><br />

C À º Ô ½ A ³ Ã º 9 : : º 9 Ã º A C ¾ ¼ ³ ¸ µ ³ C Ö ³ > º ¾ 9 ³ Ì ? > 9 ? ½ ¸ ³ ½ ³ 9 : Ö ³ µ Ã ³ ¸ Ë A : C Ê µ Ã º ³ C<br />

t 0<br />

Ð Â > ¹ ³ Ã º ³ ¸ ¸ º Ñ : 9 º ¾ ³ > C A > > ³ 9 C ¾ ³ º ³ > : 9 C 9 Ã º 9 Ã µ ³ ´ Ä Ã º ³ : ³ : Â ¾ ³ ¸ ¸ 9 ³ > º ¼ ³ > ¾ ³ C À » C C ³ C Å<br />

Ci<br />

1<br />

Ci<br />

2<br />

/ . 1 3<br />

v i4 5 7 i<br />

.<br />

i<br />

8 9 1 3<br />

v i4 5 7 ; = > 8 /<br />

A 1 i 5<br />

A 2 i 5<br />

5 ... ...<br />

Ci<br />

k A k i 5<br />

A B 8 5 A k+1<br />

i<br />

@<br />

Ci<br />

1<br />

Ci<br />

2<br />

A ′1 i<br />

A ′2 i<br />

/ . 1 3<br />

v i4 5 7 I<br />

.<br />

i<br />

8 9 1 3<br />

v i4 5 7 ; = > 8 /<br />

A 1 i 5<br />

A 2 i 5<br />

5 ... ...<br />

Ci<br />

k A k i 5<br />

A B 8 5 A k+1<br />

i<br />

@<br />

A ′k i<br />

...<br />

...<br />

...<br />

A ′k+1<br />

i<br />

...<br />

3 \<br />

s F X F V r<br />

K M H I X ” s F X F V r<br />

M K M O X M O H I<br />

M K M O X M O H I<br />

3 ‚<br />

z y V E V \ K O M X M w K O ‚ _ H ‹ F<br />

Ž F M H \ V M \ K X F K<br />

5 F<br />

i i<br />

¿ ¸ ³ : ³ C º Ð Â C<br />

D vi<br />

Ñ<br />

C j i<br />

A j i<br />

9 ³ C<br />

9 Ã º<br />

T i<br />

³ 9 C î > Ê ¾ 9 À ? º æ ¾ 9 ³ J Ý Ü ó ä å ã ä å ê A C ¾<br />

ù 9 ³ > ½ ³ 9 9 Ã º<br />

Ï A Ã ¾ > A µ À Ñ ¾ ³ > û ã L Ý ó ü ã ä å ¹ ³ C ? C C º ¼ 9 > ¾ Å ² 9 ³ ´ ³ : ? C º 9 À ¾ ³ Ã 8 > ? C Ã 9 º 9 Â C Ã ½ ¸ Â µ À ³ Ã


v i<br />

Ë A : ì ³ 9 º Ô A C À º<br />

t 0<br />

: 9 º ¾ ³ : Ö ³ > º<br />

i i<br />

½ ³ ¸ ³ ¹ º 9 Ã º Å < ³ 9<br />

> Ê ¸ º 9 : C Ê µ Ã º ³ C ì ³ 9 º Ã µ > 9 º º ¾ ³ C Ö ³ > º ¾ ³ Ã À Â > > ³ Ã Ô Â C ¾ 9 ³ > ³ C ¾ ³ C Ï A Ã ¾ > A µ À ³ Ã ³<br />

A k Å<br />

i<br />

8<br />

= ; C ><br />

\ 3<br />

4<br />

5<br />

9 ³ è Â ¾ ³ ¸ ¸ 9 ³ > A C ¹ Ð Â C & 9 µ º Á ² ³ º ³ > : 9 C 9 Ã : A Ã A C ¾ ´ Ä Ã º ³ : ³ C : 9 º : ³ > ³ > ³ C ´ º ? > º Á<br />

²<br />

A Ã º Ê C ¾ ³ C À ? C C ¾ ? ¾ A > µ ³ > : » ¹ ¸ 9 µ º ¼ ³ > ¾ ³ C Ñ ¾ ? Ã Ã ? C Ã º ³ ¸ ¸ ³ ³ 9 C ³ Ã ³ 9 C Ë ³ ¸ C ³ C Î C 9 º 9 ? ¸ ¼ ³ > º Ã<br />

Ë<br />

C ¾ ³ 9 C ¾ ³ A º 9 ¹ ½ ³ Ã º 9 : : º ³ C · Â ¸ ¹ ³ ¼ ³ > º ³ C ú ³ ¼ ³ 9 ¸ Ã ¢ Ý à ÷ Ý ä å Ý ä Ð ³ > ¼ ³ C ¾ ³ º ¼ ³ > ¾ ³ C Å Î C<br />

A<br />

½ ½ Å ½ ¼ 9 > ¾ ¾ ? Ë A ³ 9 C ³ ³ > ¼ ³ 9 º ³ > º ³ ´ Ä C º ? ¤ Ð Â > ¹ ³ Ã µ ¸ ? ¹ ³ C Å ´ º ? º º ³ 9 C ³ : ³ 9 C Ë ³ ¸ C ³ C Î C Á<br />

Ï<br />

8<br />

4<br />

r<br />

I i<br />

Ð Â C Î C 9 º 9 ? ¸ ¼ ³ > º ³ C Ë A ¸ Ê Ã Ã 9 ¹ Ñ A C ¾ ? C Ã º ? º º C A > ³ 9 C ³ C<br />

? Ã Ç È > ú ³ ¾ ³ Ì ? > 9 ? ½ ¸ ³ C Ë A ¼ ³ 9 Ã A C ¹ : 9 º : ³ > ³ > ³ C è » ¹ ¸ 9 µ À ³ 9 º ³ C C 9 µ º ¾ ³ º ³ > : 9 C 9 Ã º 9 Ã µ <br />

¾<br />

9 C ³ Ö ? ¸ ¹ ³ º > Â ³ C A C ¾ ¾ 9 ³ Ã ³ > Ã Â ¹ ³ ¼ Ê ¸ º ³ Ö ³ > º ¾ ³ > Ì ? > 9 ? ½ ¸ ³ Ë A ¹ ³ Â > ¾ C ³ º ¼ 9 > ¾ Å Î C<br />

³<br />

½ ½ Å 9 Ã º ³ 9 C < ³ 9 Ã Ô 9 ³ ¸ Ô > Â ¹ > ? : : : 9 º Ë ¼ ³ 9 Ì ? > 9 ? ½ ¸ ³ C ¹ ³ Ë ³ 9 ¹ º Å ² ³ > Ã µ Â C Ð Â > ¹ ³ Ã º ³ ¸ ¸ º ³<br />

Ï<br />

³ Ë ³ 9 µ C ³ > Ï º Â : ³ æ ê ¼ 9 > ¾ Ç È > î > Â ¹ > ? : : ³ ? ¸ Ã è ³ C ¹ ³ ? ¸ ¸ ³ > ? º Â : ? > ³ C Ï A Ã Ã ? ¹ ³ C ¾ ³ ë Á<br />

<<br />

9 ³ > º Ñ ¾ 9 ³ 9 C ¾ ³ C J Ý Ü ó ä å ã ä å Ý ä ¾ ³ > 8 > ? C Ã 9 º 9 Â C Ã ½ ¸ » µ À ³ Ð Â > À Â : : ³ C Å ² 9 ³ Ï A Ã Ã ? ¹ ³ C ¾ ³ ><br />

C<br />

A ¼ ³ 9 Ã A C ¹ ³ C ¼ ³ > ¾ ³ C ä ó ¤ ÷ ³ 9 C ½ ³ Ë Â ¹ ³ C Å Ö ³ 9 º ³ > 9 C ¼ 9 > ¾ Ï º Â : ³ æ ê ? A Ç ´ Ô ³ Ë 9 ë À ? º 9 Â C ³ C<br />

ì<br />

9 % § & © <br />

9 <br />

9 Ï A Ã Ã ³ > ? ¸ Ã î > Â ¹ > ? : : À ? C C ³ 9 C 8 > ? C Ã 9 º 9 Â C Ã Ã Ä Ã º ³ : : 9 º ³ C ¾ ¸ 9 µ <br />

¦<br />

9 ³ ¸ ³ C ì A Ã º Ê C ¾ ³ C ? A µ 9 C · Â > : ³ 9 C ³ > ¢ > 9 Ô À ³ Á ´ º > A À º A > : Â ¾ ³ ¸ ¸ 9 ³ > º ¼ ³ > ¾ ³ C Å<br />

Ð<br />

S ó ü ÷ Ý ó ä Ý Ý ä Ü Þ ó ¤ Ý Ú Ý ä å Ý - Û ä / 1 3 4 6 4 9<br />

<br />

I ⊆ S ó ü ÷ Ü ó Ý Ú Ý ä å Ý Ü Ý à 4 : ; 4 / 1 3 4 6 Ü Ý ü ñ 5 ü ÷ Ý ü 9<br />

<br />

T ⊆ S × S ó ü ÷ Ý ó ä Ý > : 4 1 A 4 1 ; : A 4 )<br />

<br />

)<br />

ü ÷ 9 ó<br />

P ó ü ÷ Ý ó ä Ý Ú Ý ä å Ý - Û ä : A J : 4 K 1 1 : N 4 9<br />

<br />

L ⊆ S ×2 P ó ü ÷ Ý ó ä Ý P : 4 N 1 S 4 A 4 )<br />

<br />

)<br />

s ∈ S Ý ý ó ü ÷ ó Ý à ÷<br />

³ > ¾ ³ C ¾ 9 ³ Î C 9 º 9 ? ¸ Ë A Ã º Ê C ¾ ³ ¾ ³ > ¢ > 9 Ô À ³ Á ´ º > A À º A > ? ¸ Ã Ö A > Ë ³ ¸ À C Â º ³ C ³ 9 C ³ Ã < ? A Á<br />

Ö<br />

³ Ã A C ¾ ¾ 9 ³ Ð Â C ú ³ ¾ ³ : ì A Ã º ? C ¾ ? A Ã ¾ A > µ 8 > ? C Ã 9 º 9 Â C ³ C ³ > > ³ 9 µ ½ ? > ³ C ì A Ã º Ê C ¾ ³ ? ¸ Ã<br />

:<br />

81<br />

 ³ C ³ > º Ñ ¾ ? à à ¾ 9 ³ Ì ? > 9 ? ½ ¸ ³<br />

à ¾ ë 9<br />

: ì ³ 9 º Ã µ > 9 º º ¼ 9 > ¾ ¾ 9 ³ À ¸ ³ 9 C Ã º ³ ì ? ¸<br />

ú ³ ¾ ³<br />

k d |= C ³ ¼ Ê ¸ º Ñ Ç È > ¾ 9 ³ i<br />

k ¹ Ã A ?<br />

¹ 9 ¸ º Ñ A C ¾<br />

v i<br />

=35 x 0<br />

y = 5 1 x + 1<br />

x 5<br />

/ . 1 3 x4 5 7 1<br />

.<br />

8 9 1 3 x4 5 7 ; = ><br />

8 /<br />

y = 0 5 1<br />

/ . 1 3 y4 5 7 {0, 1}<br />

.<br />

8 9 1 3 y4 5 7 ; = ><br />

8 /<br />

@ A B 8<br />

5 0 … 1<br />

@ A B 8<br />

> = ; C<br />

H \ V M \ ‚ _ F —<br />

3 ‚<br />

H \ V M \ ‚ _ F <br />

‰ ‚ ‚ ’<br />

F M O x M F _ x V w | V \ r<br />

9 º 9 ? ¸ ¼ ³ > º 9 Ã º 9 ³ > ³ 9 C ³ è ³ C ¹ ³<br />

9 Ë ³ ¸ C ³ C Ï A Ã ¾ > A µ À Ë A ¹ ³ ¼ 9 ³ Ã ³ C Ë A ½ ³ À Â : : ³ C Ñ À » C C ³ C ³ 9 C ³ > Ì ? > 9 ? ½ ¸ ³ Ý ¤ à Ý à Ý Ï A Ã Á<br />

³ C<br />

È µ À ³ ¾ ><br />

A A ... Ë A ¹ ³ ¼ 9 ³ Ã ³ C ¼ ³ > ¾ ³ C Å ² 9 ³ ´ ³ : ? C º 9 À ¾ 9 ³ Ã ³ > Ì ? > 9 ? C º ³ 9 Ã º Ã Â ½ ³ Ã º 9 : : º Ñ<br />

′Ñ Ñ<br />

φ ³ > ¼ ³ 9 º ³ > º Å Ï º Â : ³ æ φ ê ½ ³ Ë ³ 9 µ C ³ º ¾ 9 ³ è ³ C ¹ ³ : 9 º ? ¸ ¸ ³ C ? º Â : ? > ³ C Ï A Ã Ã ? ¹ ³ C Ñ ¾ 9 ³ 9 C φ<br />

Ð Â > À Â : : ³ C Å<br />

& % % # ! $ ó ä Ý & ö à õ ó Ý à ÷ Ý ' 1 à ó ß õ Ý 3 ñ ÷ à ã õ ÷ ã à ó ü ÷ Ý ó ä ã ß Ý Þ<br />

M =(S, I, T, P, L))<br />

L Û Ý ó å ó Þ ÷ *<br />

Ü ó Ý å Þ ó ¤ Ý û ã ü ÷ ö ä Ü ü á Ý à å C ä å Ý Ü Ý ü<br />

s ′ H Û Þ å Ý ä Ü Ý ä ö ã ¤ Ü ó Ý ñ ¤ à Ý ó L Ý ó ü Ý<br />

)<br />

(s, s ′ ) ∈ T Ý ó ä â ö ¤ ã ä å L ó à Ü ó <br />

T (s, s ′ ) 9 û ã à I Ý à ó Ý å Þ Ý Ü ó ¤ L Ý à ÷ ó å ò ã<br />

(s, s ′ ) ∈ T<br />

)<br />

÷ ò ÷ ã ä Ý<br />

ñ 5 ü ÷ Ý ü Ý ü ¤ à Ý ó ÷ 9 ó ü ÷ º Â º ? ¸<br />

Ü ö ü ¤ Ý ó E ÷ ò ã F Ý Ü Ý û ã ü ÷ ö ä Ü<br />

ó ä Ü Ý ü ÷ Ý ä ü Ý ó ä H Û Þ å Ý ò ã ü ÷ ö ä Ü<br />

ü Û<br />

Ü ö E<br />

Ü ó Ý F Ý Ü Ý û ã ü ÷ ö ä Ü å Ý ä ö ã Ü ó Ý F Ý ä ó å Ý<br />

Ú Ý ä å Ý - Û ä ö ÷ Û ö à Ý ä ã ü ü ö å Ý ä ò ã Û à Ü ä Ý ÷<br />

Ü ó Ý ó ä Ü ó Ý ü Ý û ã ü ÷ ö ä Ü å Ý Þ ÷ Ý ä 9<br />

Î C Ï ½ ½ 9 ¸ ¾ A C ¹ T ? 9 Ã º ³ 9 C < ³ 9 Ã Ô 9 ³ ¸ Ç È > ³ 9 C ³ ¢ > 9 Ô À ³ Á ´ º > A À º A > : 9 º<br />

S = {1, 2, 3, 4} Ñ I =<br />

{1} Ñ T = {(1, 2) Ñ (2, 3) Ñ (3, 1) Ñ (3, 4) Ñ (4, 4)},P = {a, b, c} A C ¾ L = {{1, {a, c}} Ñ {2, {b}} Ñ<br />

{3, {a}} Ñ {4, {c}}} ¹ ³ ¹ ³ ½ ³ C Å


4<br />

5<br />

\<br />

4<br />

H<br />

‚<br />

¡<br />

4<br />

9 C ¾ ³ > ¾ ³ Ã ú ³ ¼ ³ 9 ¸ 9 ¹ ³ C ¢ C Â º ³ C ¾ ? > ¹ ³ Ã º ³ ¸ ¸ º Ñ Ã Â ³ > ¹ 9 ½ º Ã 9 µ æ Ô > Â Î C 9 º 9 ? ¸ Ë A Ã º ? C ¾ ê ³ 9 C<br />

¢<br />

Ý à Ý ¤ ä ã ä å ü ö ã æ Ï ½ ½ Å T ½ ê Å ¿ > ³ C º Ã º ³ º ¢ A ? Ã 9 ¾ A > µ Ï ½ > Â ¸ ¸ ³ C ¾ ³ > 8 > ? C Ã 9 º 9 Â C Ã Á<br />

J<br />

\<br />

π M ó Ý 1 ó õ 3 ÷ ã ÷ à ó ü ÷ Ý ó ä Ý ã ä Ý ä Ü Þ ó ¤ Ý<br />

π =(s 0 ,s 1 ,s 2 ,...) ó ∀ ä Ý ä à à ß Ý ñ à õ ã ÷ ó Ý ä E 3 ¤<br />

i≥0 : s i ∈ S ∧T (s i ,s i+1 ) s 0<br />

i π ó i<br />

÷ 9 ó ä Ý ü . â ö Ü Ý ü L ó à Ü ö ã ¤ ó ÷ Ý ò Ý ó ¤ ä Ý ÷ 9<br />

Ý Ü ä ö ÷ ü ã û Ý ÷ 3 )<br />

‚<br />

¡<br />

H<br />

¡<br />

E<br />

\<br />

H<br />

4<br />

‚<br />

¡<br />

H<br />

¡<br />

E<br />

H<br />

R Ñ<br />

82<br />

\ … H<br />

\ … H<br />

\ … H<br />

E<br />

3 ‚<br />

3 \<br />

F M O x M F _ z y V F M K F Z V M x ‹ F O X V a ‹ X a V 3 \<br />

a K s s F K ‹ w V V F O x w K s M F V F K s F K<br />

F V F H I K a K | O ‚ \ a r<br />

‰ ‚ ‚ ’<br />

3 ‚<br />

³ ¸ ? º 9 Â C A C ¾ ½ ³ 9 C ? ¸ º ³ º ? ¸ ¸ ³ ³ > Ë ³ A ¹ ½ ? > ³ C ì A Ã º ? C ¾ Ã Ç Â ¸ ¹ ³ C ¾ ³ > ´ º > A À º A > Å Ù ³ ¾ ³ Ã Â ¸ µ ³<br />

><br />

 ¸ ¹ ³ ³ 9 þ º . â ö Ü 9 C<br />

·<br />

M · Â > : ? ¸ ½ ³ ¾ ³ A º ³ º ¾ 9 ³ Ã <br />

Å<br />

& % % # ¤ S : 6 $ ó ä . â ö Ü<br />

H Û Þ å Ý - Û ä û ã ü ÷ C ä Ü Ý ä<br />

â ö ä å ü ò ã ü ÷ ö ä Ü<br />

Ü Ý ü . â ö Ü Ý ü<br />

Ü Ý à<br />

¦ = § < % ( : & % & <br />

8 9 # : 9 < = =<br />

% & % & ¦ 9 % § & © <br />

9 <br />

9 ¿ 9 C î > Â ¹ > ? : :<br />

? Ã ¼ 9 ³ 9 C Ï ½ Ã µ C 9 º º Å ? C ¹ ³ ¹ ³ ½ ³ C ¾ ³ ë C 9 ³ > º ¼ A > ¾ ³ Ñ À ? C C ¾ A > µ ¾ 9 ³ Ç Â ¸ ¹ ³ C ¾ ³ C · ³ Ã º Á<br />

¾<br />

³ ¹ A C ¹ ³ C 9 C ³ 9 C ³ : ? > À 9 ³ > º ³ ¢ > 9 Ô À ³ Á ´ º > A À º A ><br />

¸<br />

M =(S, I, T, P, L) ½ ³ > Ã ³ º Ë º ¼ ³ > ¾ ³ C <br />

È<br />

S = D <br />

I = {s ∈ D |∀v ∈ V : s v = i v }<br />

T (s, t) ∀v ∈ V : ∃n : s |= Cv n ∧ t v = A n v (s) ∧∀m : s |= Cv m ⇒ m ≥ n<br />

¹ ¾ ¼ Å Â : ³ æ º Ï<br />

P R ∪ φ Â : ³ æ ê º Ï ©<br />

ê <br />

L(d ∈ S) ={f ∈ P | d |= f}<br />

A n v (s) A n ¾ C ³ Ï Ã > µ C µ ¿ 9 C Ã ³ º Ë ³ C ¾ ³ > Ì ? > 9 ? ½ ¸ ³ C ? ¼ ³ > º ³<br />

v<br />

½ ³ Ë ³ 9 µ C ³ º ¾ ³ C Ö ³ > º Ñ ³ ¾ > A ¾ A À<br />

s 9 C 9 Ã º 9 Ã µ ³ ´ Ä C º ? ¤ æ Ð ¹ ¸ Å Ï ½ ½ Å<br />

: > ³ º ³ ¾ º µ 9 C ³ 9 ¾ Ã ¸ ¸ ? · Å º ¸ Ê > ³<br />

¾ ³ Ã î > Â ¹ > ? : : Ë A Ã º ? C ¾ ³ Ã<br />

½ Ð > ³ ¾ º ¼ 9 > ¾ Ñ : A Ã Ã ½ ³ 9 ¾ ³ > · ³ Ã º ¸ ³ ¹ A C ¹ Ð Â C<br />

ê ³ ¼ C ³<br />

T º ¸ ³ > ³ 8 ³ 9 ¸ ¾ ³ > · Â > : ³ ¸ ? A Ç<br />

...∧ (t v = A n v (s)∨t v = A ′ n<br />

v (s) ∨ A′′ ...) ¾ I ³ I > = : {s 9 ∈<br />

º ³ > º ¼ ³ > ¾ ³ C Å · È > ¹ 9 ¸ º ¾ ? C C<br />

D |∀v ∈ V : s v ∈ I v } ³ º 9 ³ ¼ > Å<br />

C ½ Å 9 º 9 ¢ 9 À ³ Á ´ º > A À º A > ¹ ³ Ë ³ 9 ¹ º Ñ ? A Ç ¾ 9 ³ ¾ ? Ã 9 C Ï ½ ½ Å ³ 9 C ¹ ³ Ç È > º ³<br />

Î Ï ½ ¨ Ã ¾ ³ > Ô<br />

> Â ¹ > ? : : ? ½ ¹ ³ ½ 9 ¸ ¾ ³ º ¼ 9 > ¾ Å Î > ³ ì A Ã º Ê C ¾ ³ Ã 9 C ¾ ¿ ¸ ³ : ³ C º ³ Ð Â C<br />

< ³ 9 Ã Ô 9 ³ ¸ Ô<br />

S = D =<br />

(D x × D y ) P {x =3y =0y =1 } ¾ ³ > ? º Â : ? > ³ C Ï A Ã Ã ? ¹ ³ C 9 Ã º Ñ Ñ Ñ Å ² 9 ³<br />

Ñ ¾ 9 ³ è ³ C ¹ ³ Ã Ã ? ¹ ³ ¹ 9 ¸ º 9 C ? ¸ ¸ ³ C ì A Ã º Ê C ¾ ³ C A C ¾ 9 Ã º C 9 µ º ¹ ³ Ã Â C ¾ ³ > º ¾ ? > ¹ ³ Ã º ³ ¸ ¸ º Å<br />

A Ï ³ > ? : Â º ?


5<br />

<br />

7<br />

<br />

<br />

<br />

7<br />

7<br />

7<br />

7<br />

…<br />

…<br />

…<br />

C ³ 9 C ³ > ¢ > 9 Ô À ³ Á ´ º > A À º A > Ã 9 C ¾ Ë ¼ ? > ? ¸ ¸ ³ : » ¹ ¸ 9 µ ³ C ì A Ã º ? C ¾ Ã È ½ ³ > ¹ Ê C ¹ ³ Ð ³ > : ³ > À º Ñ<br />

Î<br />

½ ³ > ¾ 9 ³ ú ³ ¼ ³ 9 ¸ 9 ¹ ³ C Ì Â > ? A Ã Ã ³ º Ë A C ¹ ³ C Ç È > ³ 9 C ³ 8 > ? C Ã 9 º 9 Â C Ã 9 C ¾ C 9 µ º Ç ³ Ã º ¹ ³ ¸ ³ ¹ º Å Î :<br />

?<br />

³ ¹ ³ C Ã ? º Ë ¾ ? Ë A 9 Ã º 9 C ³ 9 C ³ : î > Â ¹ > ? : : ¹ ³ C ? A Ã Ô ³ Ë 9 ë Ë 9 ³ > º Ñ ¼ ? C C ¼ ³ ¸ µ ³ > ì A Ã º ? C ¾ Ã Á<br />

Æ<br />

½ ³ > ¹ ? C ¹ ³ > ¸ ? A ½ º 9 Ã º Å ² ? ³ > 9 Ã º ¾ 9 ³ Ï ½ ½ 9 ¸ ¾ A C ¹ ³ 9 C ³ Ã î > Â ¹ > ? : : ³ Ã 9 C ³ 9 C ³ ¢ > 9 Ô À ³ Á<br />

È<br />

º > A À º A > : 9 º ³ 9 C ³ : Î C Ç Â > : ? º 9 Â C Ã Ð ³ > ¸ A Ã º Ð ³ > ½ A C ¾ ³ C A C ¾ ¾ 9 ³ A : ¹ ³ À ³ > º ³ Ï ½ ½ 9 ¸ ¾ A C ¹<br />

´<br />

9 µ º Â C ³ ¼ ³ 9 º ³ > ³ Ã : » ¹ ¸ 9 µ Å<br />

C<br />

A Ã Ã ? ¹ ³ C È ½ ³ > ¾ ? Ã Ë ³ 9 º ¸ 9 µ ³ Ì ³ > ? ¸ º ³ C ¾ ³ Ã è Â ¾ ³ ¸ ¸ Ã : ? µ ³ C Ë A À » C C ³ C Ñ ¼ 9 > ¾ ¾ ? Ë A<br />

Ï<br />

: Ï ¸ ¸ ¹ ³ : ³ 9 C ³ C ³ 9 C ³ Ã Â ¹ ³ C ? C C º ³ 8 ³ : Ô Â > ? ¸ ¸ Â ¹ 9 À Ð ³ > ¼ ³ C ¾ ³ º Å ¿ Ã ¹ 9 ½ º ³ 9 C ³ + ³ 9 ³ Ð Â C<br />

9<br />

³ : Ô Â > ? ¸ ¸ Â ¹ 9 À ³ C æ Í 8 Í Ñ é 8 Í Ñ Å Å Å ê : 9 º A C º ³ > Ã µ 9 ³ ¾ ¸ 9 µ ³ > Ï A Ã Ã ? ¹ ³ À > ? Ç º Å Î : · Â ¸ ¹ ³ C ¾ ³ C<br />

8<br />

³ > ¾ ³ C ¾ 9 ³ é 8 Í Á Í Â ¹ 9 À ¦ A C ¾ 9 > ³ 8 ³ 9 ¸ : ³ C ¹ ³ Ï é 8 Í Ð Â > ¹ ³ Ã º ³ ¸ ¸ º Å<br />

¼<br />

( ( : & = & % & £ & ¥ 9 & % § : Ï ¸ ¸ ³ : » ¹ ¸ 9 µ ³ C ì A Ã º ? C ¾ Ã Ç Â ¸ ¹ ³ C ³ 9 C ³ > ¹ ³ ¹ ³ ½ ³ C ³ C ¢ > 9 Ô Á<br />

<br />

³ Á ´ º > A À º A > Ã 9 C ¾ ? ¸ Ã î Ç ? ¾ ³ 9 C 9 > ³ : À Â > > ³ Ã Ô Â C ¾ 9 ³ > ³ C ¾ ³ C < ³ > ³ µ C A C ¹ Ã ½ ? A : ³ C º ? ¸ º ³ C<br />

À<br />

Ð ¹ ¸ Å Ï ½ Ã µ C 9 º º Å ê Å ² ? ú ³ ¾ ³ > ì A Ã º ? C ¾ 9 : < ? A : : 9 º ¾ ³ C ú ³ ¼ ³ 9 ¸ Ã ¹ È ¸ º 9 ¹ ³ C ? º Â : ? Á<br />

æ<br />

³ C Ï A Ã Ã ? ¹ ³ C : ? > À 9 ³ > º 9 Ã º Ñ ¸ 9 ³ Ç ³ > º ¾ ³ > < ³ > ³ µ C A C ¹ Ã ½ ? A : ? A Ã Ã ³ > ¾ ³ : ? A µ ? ¸ ¸ ³ · Â ¸ ¹ ³ C<br />

><br />

 C ? º  : ? > ³ C Ï A à à ? ¹ ³ C Ñ ¾ 9 ³ ¾ 9 ³ ´ º > A À º A > ³ > Ë ³ A ¹ ³ C À ? C C Å è 9 º é 8 Í À » C C ³ C C A C<br />

Ð<br />

9 ¹ ³ C Ã µ ? Ç º ³ C ¾ 9 ³ Ã ³ > · Â ¸ ¹ ³ C Ð Â C ? º Â : ? > ³ C Ï A Ã Ã ? ¹ ³ C ½ ³ Ã µ > 9 ³ ½ ³ C ¼ ³ > ¾ ³ C Å<br />

¿<br />

? ½ ³ 9 ¹ 9 ½ º ³ Ã Ë ¼ ³ 9 A C º ³ > Ã µ 9 ³ ¾ ¸ 9 µ ³ Ï > º ³ C Ð Â C ¿ 9 ¹ ³ C Ã µ ? Ç º ³ C Ñ ¾ 9 ³ ½ ³ ? C ¾ ³ ¸ º ¼ ³ > Á<br />

²<br />

³ C À » C C ³ C Å ì A : ³ 9 C ³ C À ? C C Ç È > ú ³ ¾ ³ C ³ 9 C Ë ³ ¸ C ³ C î Ç ? ¾ ¾ 9 ³ Ë ³ 9 º ¸ 9 µ ³ Ï ½ Ç Â ¸ ¹ ³ ¾ ³ ><br />

¾<br />

º Â : ? > ³ C Ï A Ã Ã ? ¹ ³ C ½ ³ Ã µ > 9 ³ ½ ³ C ¼ ³ > ¾ ³ C Å ì A : ? C ¾ ³ > ³ C Ã 9 C ¾ ? A µ © A ? C º 9 ë Ë 9 ³ > A C Á<br />

?<br />

³ C È ½ ³ > è ³ C ¹ ³ C Ð Â C î Ç ? ¾ ³ C : » ¹ ¸ 9 µ Ñ ¾ 9 ³ Ð Â C ³ 9 C ³ : ì A Ã º ? C ¾ ? A Ã ¹ ³ ³ C Å Ö Ê > ³ C ¾<br />

¹<br />

: ³ > Ã º ³ C · ? ¸ ¸ ? ¸ Ã Â Ï A Ã Ã ? ¹ ³ C È ½ ³ > ³ 9 C ³ C À Â C À > ³ º ³ C î Ç ? ¾ 9 : < ³ > ³ µ C A C ¹ Ã ½ ? A : ¹ ³ Á<br />

9<br />

? µ º ¼ ³ > ¾ ³ C Ñ ¼ ³ > ¾ ³ C 9 : Ë ¼ ³ 9 º ³ C · ? ¸ ¸ ¿ 9 ¹ ³ C Ã µ ? Ç º ³ C ¹ ? C Ë ³ > 8 ³ 9 ¸ ½ Ê A : ³ ½ ³ Ã µ > 9 ³ Á<br />

:<br />

³ C Å ² 9 ³ ¢ Â : ½ 9 C ? º 9 Â C ¾ 9 ³ Ã ³ > ½ ³ 9 ¾ ³ > < ³ Ã µ > ³ 9 ½ A C ¹ Ã : » ¹ ¸ 9 µ À ³ 9 º ³ C ³ > ¸ ? A ½ º ³ 9 C ³ Ã Ã ³ ><br />

½<br />

³ ¤ 9 ½ ¸ ³ A C ¾ A : Ç ? Ã Ã ³ C ¾ ³ ´ Ô ³ Ë 9 ë À ? º 9 Â C ¾ ³ Ã ¹ ³ ¼ È C Ã µ º ³ C è Â ¾ ³ ¸ ¸ Ð ³ > ? ¸ º ³ C Ã Å ¿ Ã ¹ 9 ½ º<br />

<br />

<br />

<br />

<br />

<br />

7<br />

7<br />

7<br />

7<br />

E<br />

E<br />

E<br />

7<br />

83<br />

E … E<br />

E …<br />

… E<br />

… E E … —<br />

… —<br />

… E<br />

‚ ’ ¡ Z V M x ‹ F ” } X V a ‹ X a V s F O F M O x M F _ x V w | V \ r r O \ a O ‰ ‚ ‚ ’<br />

‰ ‚<br />

§ & ¡ % < % # <br />

<br />

½ ³ C ³ 9 C ³ > ³ ¤ ? À º ³ C < ³ Ã µ > ³ 9 ½ A C ¹ ¾ ³ Ã ´ Ä Ã º ³ : Ã : 9 º º ³ ¸ Ã ³ 9 C ³ Ã è Â ¾ ³ ¸ ¸ Ã : A Ã Ã ? A µ ¾ ? Ã<br />

& ³<br />

C 9 : ³ > ¼ ? > º ³ º ³ Ì ³ > ? ¸ º ³ C 9 C · Â > : ³ 9 C ³ > ñ ß Ý ò ó ô õ ö ÷ ó Û ä<br />

Ð Â<br />

φ ¹ ³ ¹ ³ ½ ³ C ¼ ³ > ¾ ³ C Å :<br />

? C<br />

¾ Â µ C Â µ : Ê µ º 9 ¹ ³ > ³ Í Â ¹ 9 À ³ C : 9 º : ³ > Ï A Ã ¾ > A µ À Ã : » ¹ ¸ 9 µ À ³ 9 º ³ C Ñ ¼ 9 ³ Ë Å < Å ¾ ? Ã<br />

ú ³<br />

µ ? ¸ À È ¸ ¦ Ñ ? ½ ³ > é 8 Í 9 Ã º Ë A > ´ Ô ³ Ë 9 ë À ? º 9 Â C Ð 9 ³ ¸ ³ > è Â ¾ ³ ¸ ¸ ³ 9 ¹ ³ C Ã µ ? Ç º ³ C ? A Ã > ³ 9 µ ³ C ¾ Å ¢ Á


 > ¾ ³ > Ç Â > : ? ¸ ³ C ² ³ ë C 9 º 9  C Ð Â C é 8 Í 9 : C Ê µ à º ³ C Ï ½ à µ C 9 º º ¼ ³ > ¾ ³ C Ë A C Ê µ à º<br />

Ì<br />

9 ³ A : ¹ ? C ¹ Ã Ã Ô > ? µ ¸ 9 µ ³ < ³ ¾ ³ A º A C ¹ ¾ ³ > ³ 9 C Ë ³ ¸ C ³ C Ô ³ > ? º Â > ³ C A C ¾ ³ 9 C 9 ¹ ³ < ³ 9 Ã Ô 9 ³ ¸ ³<br />

¾<br />

È > ¹ È ¸ º 9 ¹ ³ Ï A Ã ¾ > È µ À ³ ½ ³ º > ? µ º ³ º Å Ï A Ã ¾ > È µ À ³ 9 C é 8 Í Ã ³ º Ë ³ C Ã 9 µ ? A Ã ? º Â : ? > ³ C<br />

Ç<br />

A Ã Ã ? ¹ ³ C Ë A Ã ? : : ³ C Ñ ¾ 9 ³ Ç È > ³ 9 C ³ C À Â C À > ³ º ³ C ì A Ã º ? C ¾ Â ¾ ³ > î Ç ? ¾ ³ C º ¼ ³ ¾ ³ > ¹ ³ ¸ º ³ C<br />

Ï<br />

8 ³ 9 ¸ ? A Ã ¾ > A µ À ê ¤<br />

² 9 ³ ? C ¾ ³ > ³ C ´ Ä : ½ Â ¸ ³ ½ ³ Ë ³ 9 µ C ³ C ¾ 9 ³ Ï ½ Ç Â ¸ ¹ ³ Ð Â C Ï A Ã Ã ? ¹ ³ C ³ C º ¸ ? C ¹ ³ 9 C ³ Ã î Ç ? ¾ ³ Ã ¤<br />

f f 9 ¸ º 9 > ¹ ³ C ¾ ¼ ? C C ? A Ç ¾ 9 ³ Ã ³ : î Ç ? ¾ Å æ ¦ ¢ A º A > ³ ¦ ê<br />

f f ¹ ¹ 9 ¸ º 9 : : ³ > ? A Ç ¾ 9 ³ Ã ³ : î Ç ? ¾ Å æ ¦ £ ¸ Â ½ ? ¸ ¦ ê<br />

f ¤ f ¹ 9 ¸ º 9 : C Ê µ Ã º ³ C ì A Ã º ? C ¾ ? A Ç ¾ 9 ³ Ã ³ : î Ç ? ¾ Å æ ¦ C ³ ¥ º ¦ ê<br />

¤ ¤<br />

error C 9 ³ ¹ 9 ¸ º ¾ 9 ³ Ã ³ Ã ¢ Â C Ã º > A À º ¼ 9 > ¾ Â Ç º ³ 9 C ¹ ³ Ã ³ º Ë º Ñ A : A C ³ > ¼ È C Ã µ Á<br />

³ Ã Ì ³ > ? ¸ º ³ C ³ 9 C ³ Ã è Â ¾ ³ ¸ ¸ Ã ? A Ã Ë A Ã µ ¸ 9 ³ þ ³ C Å<br />

º<br />

& 9 µ º Á < ¸ Â µ À 9 ³ > ³ C ¤ §<br />

£ (<br />

request →§<br />

¢<br />

¦<br />

C ? ¸ ¸ ³ C ì A Ã º Ê C ¾ ³ C ú ³ ¾ ³ Ã î Ç ? ¾ ³ Ã ¹ 9 ¸ º Ñ ¾ ? Ã ? A Ç ³ 9 C ¦ Î<br />

request 9 : : ³ > 9 > ¹ ³ C ¾ ¼ ? C C<br />

¦ ? A Ç ú ³ ¾ ³ : î Ç ? ¾ 9 > ¹ ³ C ¾ ¼ ? C C 9 C ¾ ³ > ì A C À A C Ç º ê ³ 9 C ¦ æ<br />

grant ³ > Ç Â ¸ ¹ º Å ¦<br />

æ<br />

©<br />

state = reset ê ³ > > ³ 9 µ º<br />

? µ ¾ 9 ³ Ã ³ > 9 C Ç Â > : ³ ¸ ¸ ³ C < ³ Ã µ > ³ 9 ½ A C ¹ ¼ 9 > ¾ 9 C ¾ ³ C C Ê µ Ã º ³ C Ë ¼ ³ 9 Ï ½ Ã µ C 9 º º ³ C ¾ 9 ³<br />

&<br />

Ä C º ? ¤ A C ¾ ¾ 9 ³ ´ ³ : ? C º 9 À Ð Â C é 8 Í Ç Â > : ? ¸ ¾ ³ ë C 9 ³ > º Å<br />

´<br />

C ¾ A À º 9 Ð ? A Ã ³ 9 C Ç ? µ ³ > ³ C ì A Ã º ? C ¾ Ã Ç Â > : ³ ¸ C A C ¾ ³ 9 C ³ > Ë ¼ ³ 9 º ³ C è ³ C ¹ ³ Ð Â C · Â > : ³ ¸ C Ñ<br />

9<br />

³ C . â ö Ü â Û à Ý Þ ä Ñ ? A Ç ¹ ³ ½ ? A º ¤<br />

¾<br />

Æ È ¸ º 9 ¹ ³ ì A Ã º ? C ¾ Ã Ç Â > : ³ ¸ C Ã 9 C ¾ ¤<br />

ϕ Ñ Ç ? ¸ ¸ Ã ϕ ³ 9 C ³ î Ç ? ¾ Ç Â > : ³ ¸ 9 Ã º Å<br />

ϕ 1<br />

A C ¾<br />

ϕ 2<br />

ì A Ã º ? C ¾ Ã Ç Â > : ³ ¸ C Ã 9 C ¾ Å<br />

9 ³ ¾ > ³ 9 ´ Ä : ½ Â ¸ ³ ¿ Ñ · A C ¾ Æ À » C C ³ C Ð Â C ¾ ³ C ½ ³ > ³ 9 º Ã ³ 9 C ¹ ³ Ç È > º ³ C Ô ³ > ? º Â > ³ C<br />

²<br />

½ ¹ ³ ¸ ³ 9 º ³ º ¼ ³ > ¾ ³ C ¤<br />

?<br />

84<br />

¾ ³ > C 9 µ º ¹ ³ ¸ º ³ C Å ² 9 ³ Ã ³ Ï A Ã Ã ? ¹ ³ C Ã 9 C ¾ : 9 º ¾ ³ C ´ Ä : ½ Â ¸ ³ C<br />

§<br />

Ñ Ñ ¢ Ñ £ Ñ ¥ Ñ A C ¾ ¦<br />

Â<br />

³ > À C È Ô Ç º Å Ï A C ¾ ¿ ¢ A ? C º 9 ë Ë 9 ³ > ³ C È ½ ³ > î Ç ? ¾ ³ A C ¾ ½ ³ ¾ ³ A º ³ C æ<br />

Ð<br />

f à º ¾ ³ > C ? µ Ç Â ¸ ¹ ³ C ¾ ³<br />

9<br />

§ f f ¹ 9 ¸ º Ç È > ö Þ Þ Ý î Ç ? ¾ ³ Å æ ¦ §<br />

¸ ¸ ¦ ê<br />

¦<br />

f f ¤ ¹ 9 ¸ º Ç È > Ý ó ä Ý ä î Ç ? ¾ Å æ ¦ ¤ 9 Ã º Ã ¦ ê<br />

¤ ¦<br />

¦<br />

¢<br />

¦<br />

£<br />

¦<br />

¥<br />

f g f g ¹ 9 ¸ º : 9 C ¾ Å Ã Â ¸ ? C ¹ ³ ? A Ç ¾ 9 ³ Ã ³ : î Ç ? ¾ Ñ ½ 9 Ã ¹ 9 ¸ º Å æ ¦ ¦ C º 9 ¸ ¦ ê<br />

¦ ¦ C 9 ¹ ³ < ³ 9 Ã Ô 9 ³ ¸ ³ Ç È > Ê A ë ¹ Ð ³ > ¼ ³ C ¾ ³ º ³ é 8 Í Á Ï A Ã ¾ > È µ À ³ Ã 9 C ¾ ¤ ¤<br />

9 ¿<br />

¦<br />

Î C Ð ? > 9 ? C º ³ ¤ §<br />

£<br />

¬error<br />

¬error 9 ¸ º 9 C ? ¸ ¸ ³ C ì A Ã º Ê C ¾ ³ C ú ³ ¾ ³ Ã î Ç ? ¾ ³ Ã Å ² ? Ã 9 Ã º ¹ ¸ ³ 9 µ ½ ³ ¾ ³ A º ³ C ¾<br />

¹<br />

² 9 ³ Ï A Ã Ã ? ¹ ³<br />

¾ ? :<br />

9 º Ñ ¾ ? þ<br />

grant*<br />

Î C ? ¸ ¸ ³ C ì A Ã º Ê C ¾ ³ C ú ³ ¾ ³ Ã î Ç ? ¾ ³ Ã ¹ 9 ½ º ³ Ã ³ 9 C ³ : » ¹ ¸ 9 µ ³ · Â > º Ã ³ º Ë A C ¹ ¾ ³ > < ³ > ³ µ Á<br />

¦<br />

¿ > > ³ 9 µ ½ ? > À ³ 9 º ³ 9 C ³ Ã ì A Ã º ? C ¾ ³ Ã ¤ §<br />

£ ¢ (<br />

state = reset*<br />

C A C ¹<br />

î Ç ? ¾ ê Ñ ½ ³ 9 ¾ ³ > 9 > ¹ ³ C ¾ ¼ ? C C ³ 9 C + ³ Ã ³ º Á ì A Ã º ? C ¾ æ<br />

¼ 9 > ¾ Å<br />

< # Æ È ¸ º 9 ¹ ³ Ï A Ã ¾ > È µ À ³ 9 C é 8 Í Ã 9 C ¾ Ç È > ³ 9 C ³ ¹ ³ ¹ ³ ½ ³ C ³ è ³ C ¹ ³ Ð Â C<br />

<br />

º Â : ? > ³ C Ï A Ã Ã ? ¹ ³ C<br />

?<br />

P ¸ Ã ³ 9 C ³ è ³ C ¹ ³ Ð Â C û ã ü ÷ ö ä Ü ü â Û à Ý Þ ä ¾ ³ ë C 9 ³ > º Å ² 9 ³ Ã ³ ¼ 9 > ¾<br />

?<br />

¦ Ñ ! " Ñ<br />

p Ç ? ¸ ¸ Ã<br />

ϕ 1 ∨ ϕ Ñ A C ¾<br />

2<br />

p ∈<br />

Ñ<br />

P<br />

Ç ? ¸ ¸ Ã<br />

¬ϕ 1<br />

¦ ϕ 1 ∧ ϕ 2<br />

Ñ<br />

Ï<br />

¦<br />

Ç ? ¾ Ç Â > : ³ ¸ C Ã 9 C ¾ ¾ A > µ ¾ 9 ³ Ã ³ + ³ ¹ ³ ¸ C ¾ ³ ë C 9 ³ > º ¤<br />

î<br />

Î º ¦ Ã "<br />

9 C A ¾ Ñ<br />

î C Ç<br />

¦<br />

? ¾<br />

¾ Ç Â > : ³ Ñ ¸ Ñ<br />

C Ñ <br />

Ç Ã ? ¸ ¸ Ã<br />

ϕ 2 ¬ϕ 1 ϕ 1 ∧ ϕ 2 ϕ 1 ∨ ϕ 2 ϕ 1<br />

ϕ ϕ<br />

ϕ 2<br />

ϕ 1<br />

ϕ 2<br />

A C ¾<br />

î Ç ? ¾ Ç Â > : ³ ¸ C Ã 9 C ¾ Å<br />

¿<br />

¦<br />

·<br />

¦<br />

Æ<br />

¦<br />

ϕ ≡¬ ¬ϕ<br />

ϕ Ï ≡ ϕ<br />

<br />

ϕ ≡¬·<br />

¬ϕ


& < % # Î Ã º ³ 9 C ³ ¢ > 9 Ô À ³ Á ´ º > A À º A ><br />

= <br />

M ³ ½ ³ C Ñ À ? C C Ç È > ú ³ ¾ ³ C ì A Ã º ? C ¾<br />

s ¹ M ³ ϕ ¹ È ½ ³ > Ô > È Ç º ¼ ³ > ¾ ³ C Ñ Â ½ ³ 9 C ³ é 8 Í Á ì A Ã º ? C ¾ Ã Ç Â > : ³ ¸ Ý à â á Þ Þ ÷ 9 Ã º æ ¹ ³ Ã µ > 9 ³ Á<br />

M,s |= ϕ Ð M Â C ³ > C 9 µ º Å · Â ¸ ¹ ³ C ¾ ³ + ³ ¹ ³ ¸ C ½ ³ Ã º 9 : : ³ C ¾ 9 ³ Ã Ç Â > : ? ¸ æ ¼ 9 > ¾ ¾ ³ ><br />

¾ Â ê<br />

é 8 Í Á î Ç ? ¾ Ç Â > : ³ ¸ C ê <br />

<br />

<br />

s |= Å<br />

s ̸|= ! " Å <br />

¹ ¾ Å ¼ Å<br />

Å Å<br />

s |= ϕ ϕ ∈ L(s)<br />

s |= ¬ϕ s ̸|= ϕ<br />

A C ¾<br />

s |= ϕ 1<br />

 ³ ¾ ><br />

s |= ϕ 1<br />

Å<br />

s |= ϕ 2<br />

Å<br />

s |= ϕ 2<br />

s ¹ 9 ¸ º π i |= ν Å<br />

π M ³ C ³ é 8 Í Á î Ç ? ¾ Ç Â > : ³ ¸<br />

ν Ð M,π Â |= C ν 9 ¸ ¸ º Ñ ¼ ? Ã ¾ A > µ ? A Ã ¹ ³ ¾ > È µ À º ¼ 9 > ¾ Å ² ? Ç È > 9 Ã º ¾ 9 ³ ´ ³ : ? C º 9 À ¼ 9 ³ Ç Â ¸ ¹ º<br />

È Ç > ³<br />

¾ ³ ë C 9 ³ > º <br />

π |= ν 1<br />

A C ¾<br />

π |= ν 2<br />

Å<br />

M ³ > Ç È ¸ ¸ º ¾ 9 ³ ì A Ã º ? C ¾ Ã Ç Â > : ³ ¸ ϕ ¹ ³ C ? A ¾ ? C C Ñ ¼ ³ C C Ç È > ú ³ ¾ ³ C Î C 9 º 9 ? ¸ Á<br />

s ∈ I ¹ 9 ¸ º M,s |= ϕ Å<br />

& 9 = & : & # ¿ Ã ¹ 9 ½ º C ³ ½ ³ C ¾ ³ C : Ê µ º 9 ¹ ³ > ³ C Í Â ¹ 9 À ³ C ? A µ ³ 9 C ³<br />

¦<br />

? C Ë ³ + ³ 9 ³ Ð Â C 8 ³ : Ô Â > ? ¸ ¸ Â ¹ 9 À ³ C Ñ ¾ 9 ³ C A > ³ 9 C ³ C 8 ³ 9 ¸ ¾ ³ > Ï A Ã Ã ? ¹ ³ À > ? Ç º Ð Â C é 8 Í <br />

¹<br />

5<br />

³ : Ô Â > ? ¸ ¸ Â ¹ 9 À ³ C : 9 º ³ 9 C ? C ¾ ³ > 9 C < ³ Ë 9 ³ A C ¹ Ã º ³ º Å ¿ 9 C ³ 8 ³ 9 ¸ ¸ Â ¹ 9 À Ñ ¾ 9 ³ Ç È > ¾ ? Ã 9 :<br />

8<br />

Ê µ Ã º ³ C ¢ ? Ô 9 º ³ ¸ Ð Â > ¹ ³ Ã º ³ ¸ ¸ º ³ Ï ½ Ã º > ? À º 9 Â C Ã Ð ³ > Ç ? > ³ C Ð Â C ½ ³ Ã Â C ¾ ³ > ³ > < ³ ¾ ³ A º A C ¹ 9 Ã º Ñ<br />

C<br />

85<br />

³ ½ C<br />

C Ç ? µ ³ 9 º ? ¸ ½ ³ > ¼ ³ ¹ ¹ ³ ¸ ? Ã Ã ³ C Ñ<br />

¿ ½ 9 ³ Ë ³ 9 µ C ³ C ú ³ ¼ ³ 9 ¸ Ã é 8 Í Á ì A Ã º ? C ¾ Ã Ç Â > : ³ ¸ C Ñ<br />

ϕ i<br />

ν i<br />

s |= ϕ 1 ∧ ϕ 2<br />

¹ ¾ ¼ Å<br />

s |= ϕ 1 ∨ ϕ 2<br />

¹ ¾ ¼ Å<br />

s |= Ï ν ¹ ¾ ¼ Å Ç È > ? ¸ ¸ ³ î Ç ? ¾ ³ π i<br />

: 9 º Ï C Ç ? C ¹ Ã Ë A Ã º ? C ¾<br />

π |= ϕ ¹ ¾ ¼ Å π 0 |= ϕ Å<br />

Ï C ? ¸ Â ¹ À ? C C A C º ³ > Ã A µ º ¼ ³ > ¾ ³ C Ñ Â ½ ³ 9 C î Ç ? ¾<br />

π |=<br />

¹ ¾ ¼ Å<br />

ν 1 ∧ ν 2<br />

Å Â ¹ ¾ ¾ ³ ¼ ><br />

Å<br />

π |= ν 1 ∨ ν 2 π |= ν 1 π |= ν 2<br />

π |= Xν π 1 |= ν<br />

¹ ¾ ¼ Å ¹ ¼ Å<br />

¾<br />

π |= ν 1 Uν 2 ∃n ≥ 0.π n |= ν 2 ∧∀i ¹ ³ Ã º ³ ¸ ¸ º Ñ ¼ 9 ³ ¾ 9 ³ Ï A Ã Ã ? ¹ ³ À > ? Ç º Ð ³ > Ã µ 9 ³ ¾ ³ C ³ ><br />

CTL*<br />

ACTL*<br />

LTL<br />

ACTL<br />

CTL<br />

‰ ‚ ‚ ’ ¢<br />

‰ a O O \ | F ‹ V \ z X T F V O H I M F s F K F V E F r x w V \ _ _ w | M ‹ F K<br />

9 Ã º <br />

¤ Å Ï é 8 Í 9 Ã º ¾ 9 ³ 8 ³ 9 ¸ : ³ C ¹ ³ Ð Â C é 8 Í Ñ 9 C ¾ ³ > C A > Ï A Ã Ã ? ¹ ³ C È ½ ³ > ? ¸ ¸ ³


Ç ? ¾ ³ ³ > ¸ ? A ½ º Ã 9 C ¾ Å ² 9 ³ Ã ½ ³ ¾ ³ A º ³ º Ñ ¾ ? þ ¾ ³ > ¿ Á ¡ Ô ³ > ? º Â > C 9 µ º ³ 9 C ¹ ³ Ã ³ º Ë º ¼ ³ > ¾ ³ C À ? C C Å<br />

î<br />

? : 9 º ¾ 9 ³ Ã ³ 9 C ³ º ? º Ã Ê µ ¸ 9 µ ³ ¿ 9 C Ã µ > Ê C À A C ¹ ¾ ? > Ã º ³ ¸ ¸ º Ñ ¼ 9 > ¾ ¼ ³ 9 º ³ > 9 C ¹ ³ Ç Â > ¾ ³ > º Ñ ¾ ? Ã Ã<br />

²<br />

9 ³ Ï ½ Ã º > ? À º 9 Â C 9 Ã º ³ 9 C ³ 9 C ¾ ³ > è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ ³ 9 C ¹ ³ Ã ³ º Ë º ³ 8 ³ µ C 9 À Ë A > + ³ ¾ A À º 9 Â C<br />

²<br />

³ > è Â ¾ ³ ¸ ¸ À Â : Ô ¸ ³ ¤ 9 º Ê º Å ´ 9 ³ ½ ? Ã 9 ³ > º ¾ ? > ? A Ç Ñ ³ 9 C Ë A : < ³ 9 Ã Ô 9 ³ ¸ ? ¸ Ã î > Â ¹ > ? : : Â ¾ ³ ><br />

¾<br />

> 9 Ô À ³ Á ´ º > A À º A > ¹ ³ ¹ ³ ½ ³ C ³ Ã ¡ > 9 ¹ 9 C ? ¸ : Â ¾ ³ ¸ ¸ æ ? A µ À Â C À > ³ º ³ Ã è Â ¾ ³ ¸ ¸ ¹ ³ C ? C C º ê ? A Ç ³ 9 C<br />

¢<br />

½ Ã º > ? À º ³ Ã è Â ¾ ³ ¸ ¸ : 9 º ³ 9 C ³ C À ¸ ³ 9 C ³ > ³ C ì A Ã º ? C ¾ Ã > ? A : ? ½ Ë A ½ 9 ¸ ¾ ³ C A C ¾ C A > ³ 9 C ³ î > È Á<br />

?<br />

A C ¹ ¾ 9 ³ Ã ³ Ã ³ 9 C Ç ? µ ³ > ³ C è Â ¾ ³ ¸ ¸ Ã ¾ A > µ Ë A Ç È > ³ C Å ² ? ¾ 9 ³ Ï ½ ½ 9 ¸ ¾ A C ¹ ? A Ç Ð 9 ³ ¸ Ç Ê ¸ º 9 ¹ ³<br />

Ç<br />

³ 9 Ã ³ ¾ A > µ ¹ ³ Ç È > º ¼ ³ > ¾ ³ C À ? C C A C ¾ Ã 9 µ ¾ ? > ? A Ã ú ³ C ? µ Ï C ¼ ³ C ¾ A C ¹ Ð ³ > Ã µ 9 ³ ¾ ³ C ³<br />

Ö<br />

 > Á A C ¾ & ? µ º ³ 9 ¸ ³ ³ > ¹ ³ ½ ³ C Ñ ³ ¤ 9 à º 9 ³ > º ³ 9 C ³ ¹ ? C Ë ³ + ³ 9 ³ A C º ³ > à µ 9 ³ ¾ ¸ 9 µ ³ > Ï ½ à º > ? À º 9 Á<br />

Ì<br />

C Ã Ð ³ > Ç ? > ³ C Å Î C ¢ ¦ ¼ 9 > ¾ ³ 9 C ³ ½ ³ > Ã 9 µ º È ½ ³ > ¾ 9 ³ Ð ³ > Ã µ 9 ³ ¾ ³ C ³ C Ï C Ã Ê º Ë ³ ¹ ³ ¹ ³ ½ ³ C Ñ<br />

Â<br />

9 C ³ < ³ Ã µ > ³ 9 ½ A C ¹ ¾ ³ > Æ > A C ¾ 9 ¾ ³ ³ ¹ ? ½ ³ Ã ½ ³ > ³ 9 º Ã 9 : Ù ? > ³ ¢ ¡ ¦ Å<br />

³<br />

9 C ³ å ã ÷ Ý Ï ½ Ã º > ? À º 9 Â C Ç È > º ³ 9 C ³ > Ã ³ 9 º Ã Ë A ³ 9 C ³ > : » ¹ ¸ 9 µ Ã º Ã º ? > À ³ C Ì ³ > ³ 9 C Ç ? µ A C ¹<br />

¿<br />

æ<br />

©<br />

9 µ º 9 ¹ 9 Ã º ¾ ? ½ ³ 9 Ñ ¾ ? Ã Ã Ã 9 µ ¾ 9 ³ Ï ½ Ã º > ? À º 9 Â C C 9 µ º ? A Ç ¾ ? Ã Ì ³ > ? ¸ º ³ C ? A Ã ¼ 9 > À º Ñ ¾ ³ Ã Ã ³ C<br />

¼<br />

9 ¹ ³ C Ã µ ? Ç º ³ C ó ä Ü Ý à ñ ß Ý ò ó ô õ ö ÷ ó Û ä Ý ü ¤ à ó Ý Ý ä ¼ 9 > ¾ Å Ï C Ã Â C Ã º ³ C À ? C C ³ 9 C ³ î > È Ç A C ¹<br />

¿<br />

³ Ã ? ½ Ã º > ? À º ³ C è Â ¾ ³ ¸ ¸ Ã ³ Ð ³ C º A ³ ¸ ¸ À ³ 9 C ³ Î C Ç Â > : ? º 9 Â C ³ C : ³ > ¾ ? > È ½ ³ > ¸ 9 ³ Ç ³ > C Ñ ¼ 9 ³ Ã 9 µ <br />

¾<br />

? Ã À Â C À > ³ º ³ è Â ¾ ³ ¸ ¸ ½ ³ Ë È ¹ ¸ 9 µ ¾ ³ > ´ Ô ³ Ë 9 ë À ? º 9 Â C Ð ³ > Ê ¸ º A C ¾ ¾ ? Ã ì 9 ³ ¸ ¾ ³ > Ï ½ Ã º > ? À Á<br />

¾<br />

9 Â C ¼ Ê > ³ Ð ³ > Ç ³ ¸ º Å<br />

º<br />

¼ ³ 9 ¢ ¸ ? Ã Ã ³ C Ð Â C Ï ½ Ã º > ? À º 9 Â C ³ C Ã 9 C ¾ ¾ 9 ³ Ã ½ ³ Ë È ¹ ¸ 9 µ ½ ³ Ã Â C ¾ ³ > Ã 9 C º ³ > ³ Ã Ã ? C º ¾ 9 ³<br />

ì<br />

M ò å Þ W Ü Ý à ñ ß Ý ò ó ô õ ö ÷ ó Û ä φA<br />

ˆM |= φ ⇔ M |= φ W<br />

ˆM |= φ ⇒ M |= φ W<br />

M ò å Þ W Ü Ý à<br />

³ 9 ³ ¤ ? À º ³ C Ï ½ Ã º > ? À º 9 Â C ³ C ¸ 9 ³ Ç ³ > C è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ ³ C ¾ ³ Ã À Â C À > ³ º ³ C A C ¾ ¾ ³ Ã ? ½ Ã º > ? À Á<br />

<<br />

³ C è Â ¾ ³ ¸ ¸ Ã Ã º ³ º Ã ¾ ? Ã Ã ³ ¸ ½ ³ ¿ > ¹ ³ ½ C 9 Ã Å ² ? ¹ ³ ¹ ³ C À » C C ³ C A C º ³ > Ì ³ > ¼ ³ C ¾ A C ¹ ³ 9 C ³ > À Â C Á<br />

º<br />

³ > Ð ? º 9 Ð ³ C Ï ½ Ã º > ? À º 9 Â C C A > Ô Â Ã 9 º 9 Ð ³ ¿ > ¹ ³ ½ C 9 Ã Ã ³ ½ ³ 9 ¾ ³ > ½ ³ > Ô > È Ç A C ¹ ¾ ³ Ã ? ½ Ã º > ? À º ³ C<br />

Ã<br />

 ¾ ³ ¸ ¸ à ? A Ç ¾ ? à ¡ > 9 ¹ 9 C ? ¸ :  ¾ ³ ¸ ¸ È ½ ³ > º > ? ¹ ³ C ¼ ³ > ¾ ³ C Å ´ µ ¸ Ê ¹ º ¾ 9 ³ î > È Ç A C ¹ ¾ ³ > ´ Ô ³ Á<br />

è<br />

9 ë À ? º 9 Â C 9 : ? ½ Ã º > ? À º ³ C è Â ¾ ³ ¸ ¸ Ç ³ ¸ Ñ 9 Ã º À ³ 9 C ³ Ï A Ã Ã ? ¹ ³ : » ¹ ¸ 9 µ Å ¡ ³ C Ã 9 µ º ¸ 9 µ Ã 9 C ¾<br />

Ë<br />

¤ ? À º ³ Ï ½ Ã º > ? À º 9 Â C ³ C ? A Ã ¾ > A µ À Ã Ã º Ê > À ³ > ? ¸ Ã À Â C Ã ³ > Ð ? º 9 Ð ³ Ñ Ã 9 ³ ³ > ¸ ? A ½ ³ C ú ³ ¾ Â µ : ³ 9 Ã º<br />

³<br />

A µ C A > ³ 9 C ³ ¹ ³ > 9 C ¹ ³ > ³ + ³ ¾ A À º 9 Â C ¾ ³ Ã ì A Ã º ? C ¾ Ã > ? A : ³ Ã Å Ï A Ã ¾ 9 ³ Ã ³ C Æ > È C ¾ ³ C ¼ 9 > ¾<br />

?<br />

C ¾ ³ : 9 C Ï ½ Ã µ C 9 º º „ Ð Â > ¹ ³ Ã º ³ ¸ ¸ º ³ C Ì ³ > Ç ? > ³ C ? A µ Ë A C Ê µ Ã º Ð Â C ³ 9 C ³ > Ã º Ê > À ³ > > ³ Á<br />

9<br />

A Ë 9 ³ > ³ C ¾ ³ C Ñ À Â C Ã ³ > Ð ? º 9 Ð ³ C Ï ½ Ã º > ? À º 9 Â C ? A Ã ¹ ³ ¹ ? C ¹ ³ C A C ¾ ¾ 9 ³ Ã ³ ¾ ? C C Ñ Ç ? ¸ ¸ Ã C » º 9 ¹ Ñ<br />

¾<br />

µ > 9 º º ¼ ³ 9 Ã ³ Ë A ³ 9 C ³ > ³ ¤ ? À º ³ C Ï ½ Ã º > ? À º 9 Â C Ð ³ > Ç ³ 9 C ³ > º Å<br />

Ã<br />

: Ë A À ¸ Ê > ³ C Ñ A C º ³ > ¼ ³ ¸ µ ³ C : Ã º Ê C ¾ ³ C ³ 9 C ¹ ³ ¹ ³ ½ ³ C ³ Ã è Â ¾ ³ ¸ ¸ ³ 9 C ³ À Â C Ã ³ > Ð ? º 9 Ð ³<br />

<br />

½ Ã º > ? À º 9 Â C ³ 9 C ³ Ã ? C ¾ ³ > ³ C è Â ¾ ³ ¸ ¸ Ã 9 Ã º Ñ ³ > ¼ ³ 9 Ã º Ã 9 µ ¾ ³ > < ³ ¹ > 9 ¾ ³ > ñ ó ã Þ ö ÷ ó Û ä ¢ ¦<br />

Ï<br />

=(Ŝ,Î, ˆT, ˆP, ˆL)A<br />

M A C ¾ ˆM<br />

9 C · Â > : Ð Â C : ? > À 9 ³ > º ³ C ¢ > 9 Ô À ³ Á<br />

H ⊆ S × Ŝ ó ü ÷ Ý ó ä Ý ñ ó ã Þ ö 3<br />

86<br />

A > C Â µ ¿ ¸ ³ : ³ C º ? > ? A Ã Ã ? ¹ ³ C C ³ ¹ 9 ³ > º ¼ ³ > ¾ ³ C À » C C ³ C A C ¾ À ³ 9 C ³ ¡ Ô ³ > ? º Â > ³ C Ñ ¼ 9 ³ ¾ ? Ã<br />

C<br />

³ 9 é 8 Í C Â µ : » ¹ ¸ 9 µ 9 Ã º Å Ï C Ã Â C Ã º ³ C À » C C º ³ ¾ ³ > ¿ Á ¡ Ô ³ > ? º Â > ¾ A > µ ¿<br />

½<br />

ϕ ≡¬ ¬ϕ<br />

Ï<br />

? A Ã ¹ ³ ¾ > È µ À º ¼ ³ > ¾ ³ C Å<br />

¡ ¢ ¤ ¯ ¦ ¯ « ¨ ¬<br />

¾ ³ Ã À Â C À > ³ º ³ C è Â ¾ ³ ¸ ¸ Ã Å Ï C ¾ ³ > ³ > Ã ³ 9 º Ã ³ > Ê ¸ º Ã 9 ³ º > Â º Ë Ì ³ > ³ 9 C Ç ? µ A C ¹ ¾ ? Ã µ ? > ? À º ³ > 9 Ã º 9 Á<br />

à µ ³ Ì ³ > ? ¸ º ³ C<br />

¾ 9 ³ : » ¹ ¸ 9 µ ³ C î Ç ? ¾ ³ ê ¾ ³ Ã è Â ¾ ³ ¸ ¸ Ã Ã Â ¼ ³ 9 º ¼ 9 ³ : » ¹ ¸ 9 µ Å < ³ Ã Â C ¾ ³ > Ã<br />

ý õ Ý A ¾ 9 õ ä Ý E ÷ E ä ½ º ? º Â ³ C Å ´ ³ 9 9 : · Â ¸ ¹ ³ C ¾ ³ C ¾ ? Ã ¡ > 9 ¹ 9 C ? ¸ : Â ¾ ³ ¸ ¸<br />

Ý ö ÷ ä C ¾ ³ Û ü à ö ó Ý Ï Ã > À 9 C<br />

9 º :<br />

M ¸ ¸ : 9 º ½ ³ Ë ³ 9 µ C ³ º Å ¿ Ã ¹ 9 ¸ º <br />

ˆM ³ ¾ Â è ³ º À ? > º Ã ½ ? Ã ? ¾ ¾ C A<br />

& % % # X # ) % u I ) X # ) e R ˆM<br />

¤ Ý ó i ÷ Ý ý ö õ ÷ Ý ü ÷ à ö õ ÷ ó Û ä E Û ä<br />

ñ ß Ý ò ó ô õ ö ÷ ó Û ä<br />

L Ý ä ä<br />

å ó Þ ÷ B<br />

φA<br />

& % % # e R I % X ) % u I ) X # ) e R ˆM<br />

¤ Ý ó i ÷ õ Û ä ü Ý à E ö ÷ ó E Ý ü ÷ à ö õ ÷ ó Û ä E Û ä<br />

L Ý ä ä<br />

å ó Þ ÷ B<br />

! % = ( < % # <br />

? ¸ Ã Ã ³ > C È º Ë ¸ 9 µ Å ´ ³ 9 ³ C Ë ¼ ³ 9 è Â ¾ ³ ¸ ¸ ³<br />

´ º > A À º A > ³ C ¹ ³ ¹ ³ ½ ³ C Å ì A C Ê µ Ã º ¼ 9 > ¾ ¾ ³ > < ³ ¹ > 9 ¾ ³ > ´ 9 : A ¸ ? º 9 Â C Ã > ³ ¸ ? º 9 Â C ¾ ³ ë C 9 ³ > º Å<br />

ˆM<br />

M =(S, I, T, P, L) ä Ü Ý ó ä Ý à ò L Ý ó ÷ Ý ä<br />

(s, ŝ) ∈ H ã ó Þ ÷ B å<br />

& % % # ( t 2 Y X ) e R I % Y X ) e R 6 ó ä Ý Ý Þ ö ÷ ó Û ä<br />

÷ ó Û ä ü à Ý Þ ö ÷ ó Û ä ò L ó ü ¤ Ý ä Ü Ý à 1 à ó ß õ Ý 3 ñ ÷ à ã õ ÷ ã à<br />

1 à ó ß õ Ý 3 ñ ÷ à ã õ ÷ ã à<br />

L Ý ä ä â á à ö Þ Þ Ý


H<br />

‚<br />

H<br />

)<br />

\<br />

‚<br />

s<br />

³ C C ³ 9 C è Â ¾ ³ ¸ ¸ ³ 9 C ? C ¾ ³ > ³ Ã Ã 9 : A ¸ 9 ³ > º Ñ ¹ 9 ½ º ³ Ã Ç È > ú ³ ¾ ³ : » ¹ ¸ 9 µ ³ < ³ > ³ µ C A C ¹ Ã Ç Â ¸ Á<br />

Ö<br />

³ ¾ ³ Ã Ã 9 : A ¸ 9 ³ > º ³ C è Â ¾ ³ ¸ ¸ Ã ³ 9 C ³ ³ C º Ã Ô > ³ µ ³ C ¾ ³ · Â ¸ ¹ ³ 9 : Ã 9 : A ¸ 9 ³ > ³ C ¾ ³ C è Â ¾ ³ ¸ ¸ Å :<br />

¹<br />

<br />

<br />

¨<br />

‚<br />

H<br />

\<br />

s<br />

)<br />

‚<br />

s<br />

87<br />

9<br />

L(s) ∩ ˆP = ˆL(ŝ) Ý û ü ö Ü<br />

9 á F Ü ã ä H Ý ÷ à ¡ ä<br />

t T (s, t) ˆt T (ŝ, ˆt) H(t, ˆt) ó ÷ Ý ü Ý ó ä Ý ä û ã ü ÷ ö ä Ü ó ÷ ã ä Ü 9<br />

ó ÷ å<br />

¸ ? º 9 Â C Ã > ³ ¸ ? º 9 Â C ? ¸ Ã Â ì A Ã º Ê C ¾ ³<br />

Î C 9 C<br />

Ç Â > : ³ ¸ ¸ ½ ³ Ã µ > 9 ³ ½ ³ C : A Ã Ã ³ 9 C ³ ´ 9 : A<br />

s i M º ì A Á : 9 ³ C Ã º 9 C Ê C ¾<br />

ŝ i<br />

ˆM ³ C ¾ 9 ³ ? º Â : ? > ³ C Ï A Ã Ã ? ¹ ³ C<br />

9 C < ³ Ë 9 ³ A C ¹ Ã ³ º Ë ³ C Ñ ½ ³ 9 ¾ ³ C ³ C Ë A : ³ 9 C : A Ã Ã Ç È > ú ³ ¾ ³ C & ? µ Ç Â ¸ ¹ ³ > Ð Â C ? A µ Â <br />

? ³ 9 C<br />

A µ 9 C ¹ C<br />

³ Ð ¸ º ³ C Å Ï C ¾ ³ > ³ > Ã ³ 9 º Ã<br />

ŝ i s i s i<br />

½ ³ 9 ¾ ³ : 9 º ³ 9 C ? C ¾ ³ > 9 C ´ 9 : A ¸ ? º 9 Â C Ã > ³ ¸ ? º 9 Â C Ã º ³ Á<br />

µ Ç Â ¸ ¹ ³ > Ð Â C<br />

? ³ & 9 Ã º 9 ³ > ³ C Ñ Ã Â ¾ ? Ã Ã<br />

ŝ i<br />

º ¾ 9 ³ ² ³ ë C 9 º 9 Â C ¾ ³ > ´ 9 : A ¸ ? º 9 Â C Ã ³ ¸ ½ Ã º ? A Ç <br />

³ C Å Ï A Ç ¾ 9 ³ ´ 9 : A ¸ ? º 9 Â C Ã > ³ ¸ ? º 9 Â C ½ ? A<br />

÷ à ã õ ÷ ã à<br />

& # ¢ J ; : A 4 $ ó ä Ý 1 à ó ß õ Ý 3 ñ<br />

ˆM ó % % ã Þ ó Ý à ÷ Ý ó ä Ý ö ä Ü Ý à Ý 1 à ó ß õ Ý 3<br />

ü<br />

ñ ÷ à ã õ ÷ ã à<br />

M M ≼ ˆM Û ä ü à Ý Þ ö ÷ ó Û ä ¤ ò L ó ü Ý ä<br />

Ý & å Ý ü à ó Ý Ý ä ' L ä ä Ý ü Ý ó ä Ý ñ ó ã Þ ö ÷ ó<br />

ã ü ÷ ö ä Ü<br />

ó å ÷ ü Û Ü ö ü ü<br />

)<br />

â á à F Ý Ü Ý ä ¦ ä ó ÷ ó ö Þ ò<br />

M ˆM s 0 ∈ I ŝ 0 ∈ Î ó ÷ ó ö Þ ò ã ü ÷ ö ä Ü ó ÷<br />

H(s ã ä Ü Ý ó ä ¦ ä 0 , ŝ 0 ) ó ü ÷ ó Ý à ÷ 9 Ý ý 1<br />

ˆ1<br />

2<br />

3<br />

ˆ2<br />

ˆ3<br />

4 5<br />

6<br />

ˆ4<br />

ˆ5 ˆ6<br />

M<br />

ˆM<br />

’ © Ž F M<br />

5 F<br />

Z V M x ‹ F O X V a ‹ X a V F K r M X<br />

‰ ‚ ‚<br />

M ≼ ˆM<br />

¸ ? º 9 Â C ¹ ³ ¹ ³ ½ ³ C Å ¿ 9 C ³ ´ 9 : A ¸ ? º 9 Â C Ã > ³ ¸ ? º 9 Â C<br />

Î C Ï ½ ½ Å 9 Ã º ³ 9 C < ³ 9 Ã Ô 9 ³ ¸ Ç È > ³ 9 C ³ ´ 9 : A<br />

H C ³ > Ç È ¸ ¸ º Ñ 9 Ã º ¾ A > µ î Ç ³ 9 ¸ ³ ? C ¹ ³ ¾ ³ A º ³ º Å<br />

Ñ ¾ 9 ³ ¾ 9 ³ ? C Ã 9 ³ ¹ ³ Ã º ³ ¸ ¸ º ³ C < ³ ¾ 9 C ¹ A C ¹ ³ » ¹ ¸ 9 µ ³ C î Ç ? ¾ ³ ? > ¹ A : ³ C º 9 ³ > º Å<br />

¾ 9 ³ Ã Ë A Ë ³ 9 ¹ ³ C Ñ ¼ 9 > ¾ È ½ ³ > ¾ 9 ³ ú ³ ¼ ³ 9 ¸ Ã :<br />

û L Ý ó . â ö Ü Ý<br />

& # % % A 1 A 4 6 4 6 ¤ S : 6<br />

π =(s 0 ,s 1 ,s 2 ,...) M<br />

ó ä<br />

ó Ý à Ý ä Ü å Ý ä ö ã Ü ö ä ä L Ý ä ä â á à ö Þ Þ Ý<br />

Ý Ü<br />

ä Ý õ ã Û ó à ä à E Ý ü ß Û ä Ü<br />

ˆπ =(ŝ 0 , ŝ 1 , ŝ 2 ,...) ˆM<br />

i ≥ 0 ó ä H(s i , ŝ i ) Þ ÷ * 9<br />

å ó<br />

Ý Þ ÷ Ý<br />

& = = < ! <br />

M ≼ ˆM s ŝ H(s, ŝ) Ü ü Ý ó Ý ä ã ä Ü ò Ý ó û ã ü ÷ C ä Ü Ý ó ÷ 9 ö ä ä<br />

ã ä â ö Ü<br />

å ó ÷ Ý ü ò ã F Ý Ü Ý .<br />

π s ˆπ Ü ó Ý à Ý ä Ü Ý ä . â ö Ü ó ÷<br />

ó ÷ ä â ö ä å ü ò ã<br />

L ü ÷ ö ä Ü Ý ó ä Ý ä õ Û à à Ý ü ß Û ä ò ã ü ÷ ö ä Ü<br />

ä â ö ä å ü<br />

ŝ 9<br />

º ³<br />

Ý J L Ý ó ü 9 Æ ³ ¸<br />

H(s, ŝ) π =(s 0 ,s 1 ,s 2 ,...) M 9 ³ 9 C î Ç ? ¾ 9 C : 9 º Ï C Ç ? C ¹ Ã Ë A Ã º ? C ¾<br />

³ Ã Ï C : ¹ C Ã º Ë Ç A Ã 9 º ? ? C ¾<br />

s 0 = s ˆπ =(ŝ 0 , ŝ 1 , ŝ 2 ,...) ˆM ŝ 0 = ŝ<br />

? ¾ 9 C Å ² ? C C À ? C C ³ 9 C î Ç I Ý à ö ä õ Ý à ã ä å * ´ ³ º Ë ³<br />

¾ A > µ Î C ¾ A À º 9 Â C À Â C Ã º > A 9 ³ > º ¼ ³ > ¾ ³ C Å<br />

ŝ 0 = ŝ Ì Â > ? A Ã Ã ³ º Á<br />

Å ? µ º Ë A C ¹ ¹ 9 ¸<br />

H(s 0 , ŝ 0 ) H(s i , ŝ i ) i & ? µ ² ³ ë C 9 º 9 Â C <br />

Å & ñ à ó ÷ ÷ * Æ ³ ¸ º ³ Ç È > ³ 9 C ½ ³ Ã º 9 : : º ³ Ã Å ³ :<br />

¸ º Ç È > ¹ 9 ? A Ã Ã ³ > ¾<br />

s i+1 T (s i ,s i+1 ) ˆt T (ŝ i , ˆt)<br />

Å ² ? ³ > ¹ 9 ½ º ³ Ã C ? µ ² ³ ë º 9 : C 9 ³ ¡ C Â 9 º 9 C A ¾ C<br />

H(s i+1 , ˆt) s i+1 ˆ = ˆt Å ³ Ë º ³ ´ Å


? Ã C ? µ Ç Â ¸ ¹ ³ C ¾ ³ 8 ³ Â > ³ : Ë ³ 9 ¹ º Ñ ¾ ? Ã ¾ 9 ³ Ã ³ Î C º A 9 º 9 Â C 9 C ¾ ³ > 8 ? º À Â > > ³ À º 9 Ã º Ñ Ç ? ¸ ¸ Ã<br />

²<br />

9 ³ ½ ³ 9 ¾ ³ > è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ A C º ³ > Ã A µ º ³ ´ Ô ³ Ë 9 ë À ? º 9 Â C 8 ³ 9 ¸ ¾ ³ > Ï é 8 Í Á Í Â ¹ 9 À 9 Ã º Å<br />

¾<br />

¥ & # 9 & = ! ó Þ ÷ â á à ò L Ý ó 1 à ó ß õ Ý 3 ñ ÷ à ã õ ÷ ã à Ý ä<br />

M ã ä Ü ˆM<br />

*<br />

M ≼ ˆM )<br />

Ý L Ý ó ü 9 ² ³ > < ³ ¼ ³ 9 Ã ¼ 9 > ¾ ¾ A > µ Î C ¾ A À º 9 Â C È ½ ³ > ¾ ³ C Ï A Ç ½ ? A Ð Â C Ï é 8 Í Á · Â > : ³ ¸ C<br />

J<br />

³ Ç È > º Å ² ? Ë A ¼ ³ > ¾ ³ C ¾ 9 ³ Ð Â C ¾ ³ > ´ Ä C º ? ³ > ¸ ? A ½ º ³ C Â C Ã º > A À º ³ C ? µ ³ 9 C ? C ¾ ³ > ½ ³ Á<br />

¹<br />

¤<br />

<br />

<br />

f = ¬p :<br />

s ŝ H(s, ŝ) π ˆπ ³ 9 ì A Ã º Ê C ¾ ³ : 9 º Å Ö ³ 9 º ³ > 9 C Ã ³ 9 ³ C A C ¾ À Â > > ³ Á<br />

M A C ¾ Ë ¼ È Å > ú ³ ¾ ³ ì A Ã º ? C ¾ Ã Ç Â > : ³ ¸<br />

·<br />

ˆM f :<br />

¾ C A<br />

f :<br />

³ 9 > ³ Ç ¾ Â : ¸ ¼ > ¾ ³ C ? C ? ¸ Â ¹ ½ ³ ? C ¾ ³ ¸ º Å<br />

& ¹ ³ º î ? Ç > ³ C ³<br />

A C Ã º ? C Ñ ¾ A Ã Ç ì Â ¾<br />

> :<br />

f = f 1 ∧ f 2 f 1 f 2<br />

f = f 1 ∨ f 2<br />

? C ? ¸ Â ¹ Ñ î Ç ? ¾ Ç Â > : ³ ¸ C ? C ? ¸ Â ¹ Å<br />

88<br />

M ˆM<br />

³ À > ³ Ô Â C ¾ 9 ³ > ³ C ¾ ³ C î Ç ? ¾ 9 C<br />

M ¢<br />

³ 9 C C Â > Ã ³ C º ? ¸ º ³ C <br />

ˆM C 9 9 Ã ? A<br />

² 9 ³ 8 ? º Ã ? µ ³ Ñ ¾ ? Ã Ã ³ Ã Ç È > ú ³ ¾ ³ C î Ç ? ¾ Ð Â C<br />

¹ 9 ½ º Ñ ½ ³ Ã º Ê º 9 ¹ º Ñ ¾ ? Ã Ã ¾ ? Ã ¹ ³ Ã ? : º ³ : » ¹ ¸ 9 µ ³ Ì ³ > ? ¸ º ³ C Ð Â C<br />

à ŠC º A º 9 º 9 Ð ¼ Ê > ³ ? ¸ à  ? A µ Ë A ³ > ¼ ? > º ³ C Ñ ¾ ? à à ³ 9 C ³ ³ > Ç Â ¸ ¹ > ³ 9 µ ³ è  ¾ ³ ¸ ¸ Ô > È Ç A C ¹ Ð Â C<br />

9 º Î<br />

ˆM M M ³ ³ > Ç Â ¸ ¹ > ³ 9 µ ³ î > È Ç A C ¹ Ð Â C 9 : Ô ¸ 9 Ë 9 ³ > º Ñ ¾ ? ¾ ? Ã Ì ³ > ? ¸ º ³ C Ð Â C ú ? ½ ³ > ³ 9 º Ã<br />

C 9 ³<br />

ˆM æ ³ > Ç Â ¸ ¹ > ³ 9 µ ê :<br />

½ ³ 9 ¾ ³ > C º ³ > Ã A µ A C ¹ Ð Â C<br />

9 º ¹ ³ Ô > È Ç º ¼ 9 > ¾ Å<br />

Ü ö ä ä<br />

å ó Þ ÷ â á à<br />

F Ý Ü Ý ¡ 3 H Û à Ý Þ<br />

φ * ˆM |= φ ⇒ M |= φ<br />

æ ê<br />

º > ? µ º ³ º Å ´ ³ 9 ³ C<br />

ˆM,ŝ |= f ⇒ M,s |= f<br />

Ã Ô Â C ¾ 9 ³ > ³ C ¾ ³ î Ç ? ¾ ³ 9 C<br />

A Ã Ã ¹ ³ ¸ º ³ C <br />

æ ê<br />

ˆM,ˆπ |= f ⇒ M,π |= f<br />

· È > ú ³ ¾ ³ î Ç ? ¾ Ç Â > : ³ ¸<br />

A Ã Ã ¹ ³ ¸ º ³ C <br />

æ T ê<br />

< ³ ¼ ³ 9 Ã ¾ A > µ Î C ¾ A À º 9 Â C ¢ <br />

<br />

I Ý à ö ä õ Ý à ã ä å * ´ ³ 9<br />

f = p :<br />

9 º p ∈ ˆP Å ¿ Ã ¹ 9 ¸ º <br />

ˆM,ŝ |= p Sem.<br />

⇔<br />

Def.5<br />

⇔<br />

p∈ ˆP<br />

⇔<br />

Sem.<br />

⇔<br />

p ∈ ˆL(ŝ)<br />

p ∈ L(s) ∩ ˆP<br />

p ∈ L(s)<br />

M,s |= p<br />

ˆM,ŝ |= ¬p Sem.<br />

⇔<br />

Def.5<br />

⇔<br />

p∈ ˆP<br />

⇔<br />

p ∉ ˆL(ŝ)<br />

p ∉ L(s) ∩ ˆP<br />

p ∉ L(s)<br />

Sem.<br />

⇔ M,s |= ¬p<br />

´ ³ 9<br />

9 º p ∈ ˆP Å ¿ Ã ¹ 9 ¸ º <br />

ˆM,ŝ |= f<br />

Sem.<br />

⇔<br />

Ind.Hyp.<br />

⇒<br />

Sem.<br />

⇒<br />

ˆM,ŝ |= f 1<br />

A C ¾<br />

M,s |= f 1<br />

A C ¾<br />

M,s |= f<br />

ˆM,ŝ |= f 2<br />

M,s |= f 2<br />

ñ à ó ÷ ÷ * ´ ³ 9<br />

³ ¸ C Å ¿ Ã ¹ 9 ¸ º <br />

æ ê<br />

Sem. ‚ F „ F M H I K F X ¡ F Ž F M _ O } H I V M X X F … s M F r M X s F V } F r \ K X M ‹ T w K ‰ ¥ E § © ‚ F | V y K s ‚ \ V O M K s …<br />

Ind.Hyp. s M F ‰ K Ž F K s a K | s F V ¢ K s a ‹ X M w K O I x w X I F O F ’


¦<br />

¦<br />

ˆπ 9 C ˆM<br />

C 9 µ º Ë ¼ ? C ¹ Ã ¸ Ê A ë ¹ ³ 9 C ³ C À Â > > ³ Ã Ô Â C ¾ 9 ³ > ³ C ¾ ³ C î Ç ? ¾ 9 C<br />

M ¹ ³ ½ ³ C<br />

A Ã Ã æ C A > A : ¹ ³ À ³ > º ê Å Ï A Ã ¾ 9 ³ Ã ³ : Æ > A C ¾ ¹ 9 ¸ º 8 ³ Â > ³ : ? A µ C 9 µ º Ç È > é 8 Í Ñ<br />

:<br />

 C ¾ ³ > C C A > Ç È > ¾ ³ > ³ C C º ³ > : ³ C ¹ ³ Ï é 8 Í Å<br />

Ã<br />

ˆM Ñ ¼ ³ ¸ µ ³ Ã ³ 9 C<br />

M C ¹ ³ Ã ³ ³ C ¼ ³ > ¾ ³ C À ? C C Å ² 9 ³ Ã ¸ 9 ³ Ç ³ > º ¾ 9 ³ Æ > A C ¾ ¸ ? ¹ ³ C Ç È > ¾ 9 ³ ? A º Â : ? º 9 Ã µ ³<br />

¢ ? C Ã º > A À º 9 Â C ³ 9 C ³ Ã ? ½ Ã º > ? À º ³ C è Â ¾ ³ ¸ ¸ Ã ? A Ã ³ 9 C ³ : ¹ ³ ¹ ³ ½ ³ C ³ C ¡ > 9 ¹ 9 C ? ¸ : Â ¾ ³ ¸ ¸ Ñ ¾ 9 ³ 9 :<br />

Â<br />

ü ÷ à ö õ ÷ ó Û ä Ð Â C<br />

π 9 C M ? º Å · ? ¸ ¸ Ã ¾ ? Ã Ë A º > 9 º Ñ Ð ³ > ¸ ³ º Ë º M ¹ ³ C ? A Ã Â ¼ 9 ³ ˆM<br />

¾ 9 ³<br />

89<br />

f = Af 1<br />

Å ¿ Ã ¹ 9 ¸ º ¤<br />

Ç È > ? ¸ ³ î Ç ? ¾ ³ : 9 º Ï C ¸ Ç ? C ¹ Ã Ë A Ã º ? C ¾ ¹ 9 ¸ º ¤ ˆM,ŝ |= f Sem.<br />

⇔ ˆπ ŝ ˆM, ˆπ |= f1 .<br />

´ ³ 9<br />

π ³ 9 C ½ ³ ¸ 9 ³ ½ 9 ¹ ³ > î Ç ? ¾ 9 C M : 9 º Ï C Ç ? C ¹ Ã Ë A Ã º ? C ¾ s.<br />

³ ¾ ³ > ¾ 9 ³ Ã ³ > î Ç ? ¾ ³ ? º ³ 9 C ³ C À Â > > ³ Ã Ô Â C ¾ 9 ³ > ³ C ¾ ³ C î Ç ? ¾ 9 C<br />

Ù<br />

È > ? ¸ ¸ ³ ¾ 9 ³ Ã ³ î Ç ? ¾ ³ ¹ 9 ¸ º ¤<br />

·<br />

ˆM,ˆπ |= f 1 .<br />

? : 9 º ¹ 9 ¸ º C ? µ Î C ¾ Å ù Ä Ô Å ? A µ Ç È > ? ¸ ¸ ³<br />

²<br />

Sem.<br />

⇒ M,s |= f<br />

π : M,π |= f 1 .<br />

ˆM.<br />

¦<br />

´ ³ 9<br />

f = f 1<br />

Ñ<br />

f ³ 9 C ³ î Ç ? ¾ Ç Â > : ³ ¸ A C ¾ f 1<br />

³ 9 C ³ ì A Ã º ? C ¾ Ã Ç Â > : ³ ¸ Å ¿ Ã ¹ 9 ¸ º ¤<br />

æ ¡ ê<br />

ˆM,ˆπ |= f<br />

Sem.<br />

⇔ ˆM, ˆπ 0 |= f 1<br />

Ind.Hyp.<br />

⇒ M,π 0 |= f 1<br />

Sem.<br />

⇒<br />

M,π |= f<br />

´ ³ 9<br />

f = Xf 1<br />

³ 9 C ³ î Ç ? ¾ Ç Â > : ³ ¸ Å ¿ Ã ¹ 9 ¸ º ¤<br />

ˆM,ˆπ |= f<br />

Sem.<br />

⇔ ˆM, ˆπ 1 |= f 1<br />

? ²<br />

Ind.Hyp.<br />

⇒ M,π 1 |= f 1<br />

Sem.<br />

⇒<br />

π A C ¾ ˆπ À Â > > ³ Ã Ô Â C ¾ 9 ³ > ³ C Ñ ¹ 9 ¸ º H(π 1 , ˆπ 1 ).<br />

M,π |= f<br />

´ ³ 9<br />

æ ¦ ê<br />

Ï C ? ¸ Â ¹ Ç È > ¾ ³ C Á ¡ Ô ³ > ? º Â > Å<br />

¿ 9 C < ³ ¼ ³ 9 Ã Ç È > ¾ ³ C ¿ Á ¡ Ô ³ > ? º Â > 9 Ã º ¸ ³ 9 ¾ ³ > C 9 µ º Ë A Ç È > ³ C Ñ ¾ ? ³ Ã Ë A ³ 9 C ³ : ¹ ³ ¹ ³ Á<br />

½ ³ C ³ C<br />

î Ç ? ¾<br />

M Ã 9 : A ¸ 9 ³ > º Ñ 8 ³ Â > ³ : ³ > Ç È ¸ ¸ º A C ¾ ¾ ? : 9 º ? ¸ Ã À Â C Ã ³ > Ð ? º 9 Ð ³ Ï ½ Ã º > ? À º 9 Â C<br />

² 9 ³ ¢ ³ > C ? A Ã Ã ? ¹ ³ ¾ 9 ³ Ã ³ Ã Ï ½ Ã µ C 9 º º 9 Ã º ? ¸ Ã Â Ñ ¾ ? Ã Ã ³ 9 C è Â ¾ ³ ¸ ¸<br />

? C ¾ ³ Á<br />

> ³ Ã è Â ¾ ³ ¸ ¸<br />

Ð Â C<br />

Ç Â ¸ ¹ ³ C ¾ ³ C<br />

Ï ½ Ã µ C 9 º º ½ ³ º > ? µ º ³ º ¼ 9 > ¾ Å<br />

¡ ¢ ¤ ¯ ¦ ¯ « ¨ ¬ ¤ ¡ ® £ ¥ ® ¬ ¡ ¨ ¬ ¨ ­ ¦ ®<br />

² ? Ã Ì ³ > Ç ? > ³ C Ð Â C é ¸ ? > À ³ A C ¾ Æ > A : ½ ³ > ¹ ¢ ¤ ¦ ³ > Ê ¸ º ? ¸ Ã ¿ 9 C ¹ ? ½ ³ ³ 9 C î > Â ¹ > ? : :<br />

P<br />

½ ³ C Å ¿ Ã ¼ ? C ¾ ³ ¸ º<br />

φ ³ C ½ µ C º ¤ C Ï Ã 9 º Å ½ ³ Ã µ > 9 ³ Á<br />

P ¼ M 9 M<br />

9 Ï Ã 9 º Å A ¾ ½ µ C º<br />

¢<br />

¤ ¤ Ô À ³ Á ´ º > A À º A > A : A C ¾ ¹ ³ C ³ > 9 ³ > º ? A Ã<br />

ˆM 9 C ³ 9 C ³ : ? > À 9 ³ > º ³ > 9 Ñ ¾ ? Ã Ã ³ 9 C ³ õ Û ä ü Ý à - ö ÷ ó - Ý<br />

ˆM º ¸ Ê ¼ ³ ¹ Â Ã ¾ > 9 ¼ ³ 9 ´ Å<br />

A C ¾ ³ 9 C ³ Ï é 8 Í Á ´ Ô ³ Ë 9 ë À ? º 9 Â C<br />

M ½ ³ Ë È ¹ ¸ 9 µ ¾ ³ > ´ Ô ³ Ë 9 ë À ? º 9 Â C 9 Ã º æ Ð ¹ ¸ Å Ï ½ Ã µ C 9 º º T Å ê Å Î : Ë ¼ ³ 9 º ³ C<br />

Ë A C Ê µ Ã º ³ 9 C ³ 9 C 9 º 9 ? ¸ ³ Ï ½ Ã º > ? À º 9 Â C<br />

µ > º ¾ ³ Ã Ì ³ > Ç ? > ³ C Ã ¼ 9 > ¾ : 9 º ³ 9 C ³ : è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ Ã ? ¸ ¹ Â > 9 º : A Ã A C º ³ > Ã A µ º Ñ Â ½<br />

´ 9 º<br />

ˆM φ M P<br />

Ô ³ Ë 9 ë À ? º 9 Â C ³ > Ç È ¸ ¸ º Å · ? ¸ ¸ Ã ú ? Ñ ³ > Ç È ¸ ¸ º C ? µ ² ³ ë C 9 º 9 Â C ¨ ? A µ A C ¾ ¾ ? : 9 º ´ ³ 9 ¾<br />

9 ´ Ô ³ Ë 9 ë À ? º 9 Â C Å Î C ¾ 9 ³ Ã ³ : · ? ¸ ¸ À ? C C ¾ ? Ã Ì ³ > Ç ? > ³ C : 9 º Ô Â Ã 9 º 9 Ð ³ : + ³ Ã A ¸ º ? º ½ ³ ³ C ¾ ³ º<br />

¾ ³<br />

> ¾ ³ C Å Ì ³ > ¸ ³ º Ë º<br />

¼ ³<br />

ˆM ˆπ<br />

¾ Â µ ¾ 9 ³ ´ Ô ³ Ë 9 ë À ? º 9 Â C Ñ ¸ 9 ³ Ç ³ > º ¾ ³ > è Â ¾ ³ ¸ ¸ Ô > È Ç ³ > ³ 9 C ³ C î Ç ? ¾ ú ³ Ã Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ Å ² ³ ë C 9 º 9 Â C ¨ Ã ? ¹ º ½ ³ 9 ³ 9 C ³ > Ð ³ > ¸ ³ º Ë º ³ C ´ Ô ³ Ë 9 ë À ? º 9 Â C C 9 µ º Ã È ½ ³ ><br />

? ¸<br />

M<br />

ˆπ C ³ C 9 ³<br />

? A Ã Å ² ? ³ > ¼ 9 > ¾ 9 : ¾ > 9 º º ³ C Ì ³ > Ç ? > ³ C Ã Ã µ > 9 º º A C º ³ > Ã A µ º Ñ Â ½ ¾ ³ > î Ç ? ¾<br />

À Â > Á<br />

> ³ Ã Ô Â C ¾ 9 ³ > ³ C ¾ ³ C î Ç ? ¾


Ô Ë 9 ë À ? º 9 Â C A C ¾ ¾ ? Ã Ì ³ > Ç ? > ³ C ¼ 9 > ¾ : 9 º C ³ ¹ ? º 9 Ð ³ : + ³ Ã A ¸ º ? º ½ ³ ³ C ¾ ³ º Å Ï C ¾ ³ > C Ç ? ¸ ¸ Ã<br />

´ ³<br />

> ¼ ?<br />

ˆπ M C Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ Ñ ¾ ? Ã 9 C ¹ ? > C 9 µ º : » ¹ ¸ 9 µ ¹ ³ ¼ ³ Ã ³ C ¼ Ê > ³ A C ¾ C A > ¾ A > µ <br />

ˆM ³ 9 9 C ³ 9 C ¹ ³ > A º Ã µ º 9 Ã º Å ´ Â ¸ µ ³ Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ³ ³ 9 Ã Ã ³ C<br />

<br />

9 > ¾ ¾ ? Ã Ì ³ > Ç ? > ³ C ¼ 9 ³ ¾ ³ > Â ¸ º Å Ï ½ ½ Å Ã º ³ ¸ ¸ º ¾ 9 ³ Ã ³ C Ï ½ ¸ ? A Ç C Â µ ³ 9 C : ? ¸ ¹ > ? Ô 9 Ã µ <br />

¼<br />

? > Å ¾<br />

5<br />

‚ F V x V y z F ¡<br />

| F K ‚ F M O x M F _ F<br />

9 ³ C Ê µ Ã º ³ C Ï ½ Ã µ C 9 º º ³ ½ ³ Ã µ > ³ 9 ½ ³ C ¾ 9 ³ ³ 9 C Ë ³ ¸ C ³ C ´ µ > 9 º º ³ ¾ ³ Ã Ì ³ > Ç ? > ³ C Ã ¹ ³ Á<br />

²<br />

? A ³ > Å ì A ³ > Ã º ¼ 9 > ¾ ¾ 9 ³ ¿ > Ë ³ A ¹ A C ¹ ¾ ³ > 9 C 9 º 9 ? ¸ ³ C Ï ½ Ã º > ? À º 9 Â C ³ > ¸ Ê A º ³ > º Ñ ¾ ? C C ? A Ç ¾ 9 ³<br />

C<br />

A > µ Ç È > A C ¹ ¾ ³ Ã è Â ¾ ³ ¸ é ³ µ À 9 C ¹ A C ¾ ¾ 9 ³ ¿ > À ³ C C A C ¹ Ð Â C A C ³ µ º ³ C Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ Á<br />

²<br />

³ C ³ 9 C ¹ ³ ¹ ? C ¹ ³ C A C ¾ Ë A ¸ ³ º Ë º ¾ 9 ³ Ì ³ > Ç ³ 9 C ³ > A C ¹ ¾ ³ > Ï ½ Ã º > ? À º 9 Â C ½ ³ Ã µ > 9 ³ ½ ³ C Å<br />

¸<br />

µ > ³ 9 ½ A C ¹ ¾ ³ > Ï ½ Ã º > ? À º 9 Â C Ã ? ½ ½ 9 ¸ ¾ A C ¹ ³ 9 C ³ · A C À º 9 Â C Ñ ¾ 9 ³ ? A Ç è Â ¾ ³ ¸ ¸ Ë A Ã º Ê C ¾ ³ C ¾ ³ Á<br />

Ã<br />

C 9 ³ > º 9 Ã º Å ´ 9 ³ ½ 9 ¸ ¾ ³ º ú ³ ¼ ³ 9 ¸ Ã ì A Ã º Ê C ¾ ³ ¾ ³ Ã ? ¸ Ã î > Â ¹ > ? : : ¹ ³ ¹ ³ ½ ³ C ³ C > 9 ¹ 9 C ? ¸ : Â ¾ ³ ¸ ¸ Ã<br />

ë<br />

A Ç ¹ ¸ ³ 9 µ Ð 9 ³ ¸ ³ Â ¾ ³ > ¼ ³ C 9 ¹ ³ > ³ ì A Ã º Ê C ¾ ³ 9 : ? ½ Ã º > ? À º ³ C è Â ¾ ³ ¸ ¸ ? ½ A C ¾ > ³ ¾ A Ë 9 ³ > º Ã Â ¾ 9 ³<br />

?<br />

 : Ô ¸ ³ 9 º Ê º ¾ ³ à è  ¾ ³ ¸ ¸ à Š² 9 ³ · A C À º 9  C ¼ 9 > ¾ ? ¸ à ü ÷ à ö õ ÷ ó Û ä ü â ã ä õ ÷ ó Û ä ½ ³ Ë ³ 9 µ C ³ º Å<br />

<br />

h ó ü ÷ Ý ó ä Ý ü ã à 3<br />

h D ë C 9 ³ > º ? A µ ³ 9 C ³ § ¢ A 9 Ð ? ¸ ³ C Ë > ³ ¸ ? º 9 Â C ? A Ç Ñ ¾ 9 ³ ¾ 9 ³ ú ³ C 9 ¹ ³ C ì A Ã º Ê C ¾ ³ ¹ ¸ ³ 9 µ Ã ³ º Ë º Ñ<br />

h ¾ ³ Ç ¾ ³ C ¹ ¸ ³ 9 µ ³ C ? ½ Ã º > ? À º ³ C ì A Ã º ? C ¾ ? ½ ¹ ³ ½ 9 ¸ ¾ ³ º ¼ ³ > ¾ ³ C Å ² 9 ³ + ³ ¸ ? º 9 Â C<br />

≡ ? A Ë ³ 9 µ C ³ º A C ¾ ³ > ¹ 9 ½ º Ã 9 µ ? A Ã ¾ ³ > Ç Â ¸ ¹ ³ C ¾ ³ C Æ ¸ ³ 9 µ A C ¹ ¤<br />

³ ½<br />

ˆD 9<br />

90<br />

¾ 9 ³ 9 C 9 º 9 ? ¸ ³ Ï ½ Ã º > ? À º 9 Â C 9 C<br />

& ¥<br />

<br />

& Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ³ æ ³ C ¹ ¸ Å Ã Ô A > 9 Â A Ã µ Â A C º ³ > ³ ? : Ô ¸ ³ Ã ê Å Î C ¾ 9 ³ Ã ³ : · ? ¸ ¸ ¼ 9 > ¾ ¾ 9 ³<br />

©<br />

½ Ã º > ? À º 9 Â C Ð ³ > Ê C ¾ ³ > º æ Ð ³ > Ç ³ 9 C ³ > º ê Ñ Ã Â ¾ ? Ã Ã<br />

Ï<br />

ˆπ 9 µ º : ³ > ? A Ç º > ³ º ³ C À ? C C Å ² ? C ? µ <br />

C<br />

M … φ<br />

K F V M F V F F<br />

K M X M \ _ F ‰ ‚ O X V \ ‹ X M w K<br />

M<br />

ˆM<br />

ˆM |= φ<br />

u w s F _ _ x V y z a K |<br />

ˆM<br />

ˆM ̸|= φ<br />

M |= φ<br />

H F V z F M K F V F ‰ ‚ O X V \ ‹ X M w K<br />

“ V „ F a | F F | F K ‚ F M O x M F _<br />

} X w x<br />

ˆπ<br />

M ̸|= φ<br />

ˆπ F — M O X M F V X K M H I X M K<br />

M<br />

ˆπ F — M O X M F V X M K<br />

M<br />

‰ ‚ _ \ a z s F O H F V z \ I V F K O T w K ¥ _ \ V ‹ F<br />

‰ ‚ ‚ ’ ¢<br />

! ¤ % % < ( &<br />

§<br />

§<br />

<br />

9 < % # <br />

<br />

9 ³ Ð Â C é ¸ ? > À ³ A C ¾ Æ > A : ½ ³ > ¹ ³ 9 C ¹ ³ Ã ³ º Ë º ³ Ï ½ Ã º > ? À º 9 Â C Ã º ³ µ C 9 À Ð ³ > ¼ ³ C ¾ ³ º Ë A > < ³ Á<br />

²<br />

D Ý ó ä Ý ü . à Û å à ö ü ö ã â<br />

& % % # ¥ K 1 : A 4 1 S 4 A 4 $ ó ä Ý ü ÷ à ö õ ÷ ó Û ä ü â ã ä õ ÷ ó Û ä<br />

F Ý õ ÷ ó - Ý . à Û F Ý õ ÷ ó Û ä - Û ä Ü Ý à Ú Ý ä å Ý ö Þ Þ Ý à . à Û å à ö ò ã ü ÷ C ä Ü Ý<br />

Ý ó ä Ý Ú Ý ä å Ý - Û ä ö ü ÷ à ö õ ÷ Ý ä . à Û å à ö ò ã ü ÷ C ä Ü Ý ä<br />

¼ ³ ¸ µ ³<br />

Ð Â C<br />

d ≡ e ¹ ¾ ¼ Å h(d) =h(e) : 9 º d, e ∈ D<br />

æ ê<br />

¼ 9 > ¾ : 9 º


C ³ 9 C ³ > Ç > È ³ > ³ C Ï > ½ ³ 9 º Ð Â C é ¸ ? > À ³ ¼ A > ¾ ³ ¾ 9 ³ Ã ³ è » ¹ ¸ 9 µ À ³ 9 º ? A µ > ³ ? ¸ 9 Ã 9 ³ > º T Å<br />

Î<br />

9 º ³ 9 C ³ > ? A Ç ¾ 9 ³ Ã ³ Ö ³ 9 Ã ³ ¾ ³ ë C 9 ³ > º ³ C · A C À º 9 Â C À » C C ³ C ú ³ ¾ Â µ ½ ³ 9 ¼ ³ 9 º ³ : C 9 µ º ? ¸ ¸ ³<br />

è<br />

> ³ ½ ¸ 9 µ ¹ ³ > 9 C ¹ ³ > ³ Ï A Ã ¼ ? ¸ ? C ¾ ? > Ã º ³ ¸ ¸ ½ ? > ³ C Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C ³ C Å é ¸ ? > À ³ A C ¾<br />

³<br />

> A : ½ ³ > ¹ Ð ³ > Ã A µ ³ C ¾ ? ³ > 9 : 9 ³ > Ð Â > ¹ ³ Ã º ³ ¸ ¸ º ³ C Ñ C ³ A ³ > ³ C Ï C Ã ? º Ë Ë A C Ê µ Ã º Ñ ½ ³ 9 ¾ ³ ><br />

Æ<br />

? ¸ ¾ ³ > 9 C 9 º 9 ? ¸ ³ C Ï ½ Ã º > ? À º 9 Â C ³ 9 C ³ C ¹ A º ³ C ¢ Â : Ô > Â : 9 þ Ë ¼ 9 Ã µ ³ C Ì ³ > ³ 9 C Ç ? µ A C ¹ A C ¾<br />

Ö<br />

A Ã ¾ > A µ À Ã Ã º Ê > À ³ ¾ ³ > Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C Ë A ë C ¾ ³ C Å<br />

Ï<br />

? Ë A ¼ ³ > ¾ ³ C Ì ? > 9 ? ½ ¸ ³ C Ñ ¾ 9 ³ 9 : î > Â ¹ > ? : : : 9 º ³ 9 C ? C ¾ ³ > ¾ A > µ Ï A Ã Ã ? ¹ ³ C Ð ³ > Á<br />

²<br />

C È Ô Ç º Ã 9 C ¾ Ñ Ë A ¢ < 9 % < § ( & : 9 § § & Ë A Ã ? : : ³ C ¹ ³ Ç ? Ã Ã º Å Ù ³ ¾ ³ ¾ 9 ³ Ã ³ > Æ > A Ô Ô ³ C ¼ 9 > ¾<br />

À<br />

C º Ã Ô > 9 µ º Å Î C C ³ > ? ¸ ½ ¾ ³ > Æ > A Ô Ô ³ ½ ¸ ³ 9 ½ º Ã Â ¾ 9 ³ Ð Â ¸ ¸ ³ Ï A Ã ¼ ? ¸ ? C : » ¹ ¸ 9 µ ³ C Ï ½ ½ 9 ¸ Á<br />

³<br />

A C ¹ ³ C ³ > ? ¸ º ³ C ³ Ã 9 Ã º : » ¹ ¸ 9 µ Ñ ¾ 9 ³ Ö ³ > º ³ ³ 9 C ³ > Æ > A Ô Ô ³ C Ð ? > 9 ? ½ ¸ ³ ? ½ Ê C ¹ 9 ¹ Ð Â C ¾ ³ C<br />

¾<br />

³ > º ³ C ? C ¾ ³ > ³ > Æ > A Ô Ô ³ C Ð ? > 9 ? ½ ¸ ³ C ? A Ç Ð ³ > Ã µ 9 ³ ¾ ³ C ³ ? ½ Ã º > ? À º ³ Ö ³ > º ³ ? ½ Ë A ½ 9 ¸ ¾ ³ C Å<br />

Ö<br />

? ¹ ³ ¹ ³ C ¼ ³ > ¾ ³ C Ð Â C ³ 9 C ? C ¾ ³ > A C ? ½ Ê C ¹ 9 ¹ ³ Ì ? > 9 ? ½ ¸ ³ C 9 C A C º ³ > Ã µ 9 ³ ¾ ¸ 9 µ ³ Ì ? > 9 ? ½ ¸ ³ C Á<br />

²<br />

> A Ô Ô ³ C ³ 9 C ¹ ³ º ³ 9 ¸ º A C ¾ ¾ A > µ A C º ³ > Ã µ 9 ³ ¾ ¸ 9 µ ³ · A C À º 9 Â C ³ C ? ½ ¹ ³ ½ 9 ¸ ¾ ³ º Å ² ³ > ³ 9 C º > ³ º ³ C Á<br />

¹<br />

³ Ì ³ > ¸ A Ã º Ð Â C Ï A Ã Ã ? ¹ ³ À > ? Ç º 9 Ã º 9 ³ > ú ³ ¾ Â µ C 9 µ º Ô > Â ½ ¸ ³ : ? º 9 Ã µ Ñ ¾ ? ú ? ? A µ À ³ 9 C ³<br />

¾<br />

A : 9 C ¾ ³ Ã º º ³ 9 ¸ ¼ ³ 9 Ã ³ ? A Ã ³ 9 C Ç ? µ ³ > ³ C 8 ³ 9 ¸ Ç A C À º 9 Â C ³ C ? A Ç ¹ ³ ½ ? A º ¼ ³ > ¾ ³ C Å<br />

Ë<br />

9 ³ < ³ Ã º 9 : : A C ¹ ¾ ³ > Ì ? > 9 ? ½ ¸ ³ C ¹ > A Ô Ô ³ C ¸ Ê A Ç º À Â C À > ³ º 9 C Ç Â ¸ ¹ ³ C ¾ ³ > Ö ³ 9 Ã ³ ? ½ ´ ³ 9 Á<br />

²<br />

& 9 & 9 % & 9 & Ñ ¼ ³ C C Ã 9 ³ : 9 C ¾ ³ Ã º ³ C Ã ³ 9 C ³ ¹ ¸ ³ 9 µ ³ Ì ? > 9 ? ½ ¸ ³ ³ C º ? ¸ º ³ C Å ² 9 ³ Ã ³ Î C º ³ > Ç ³ Á<br />

%<br />

³ C Ë > ³ ¸ ? º 9 Â C 9 Ã º > ³ ³ ¤ 9 Ð A C ¾ Ã Ä : : ³ º > 9 Ã µ Å Î > º > ? C Ã 9 º 9 Ð ³ > Ï ½ Ã µ ¸ A þ ½ 9 ¸ ¾ ³ º ? ¸ Ã Â ³ 9 C ³<br />

><br />

¢ A 9 Ð ? ¸ ³ C Ë > ³ ¸ ? º 9 Â C Ñ ¾ 9 ³ § ¢ A 9 Ð ? ¸ ³ C Ë À ¸ ? Ã Ã ³ C Ð Â C ? º Â : ? > ³ C Ï A Ã Ã ? ¹ ³ C ³ > Ë ³ A ¹ º Ñ ¼ ³ ¸ µ ³<br />

§<br />

A > µ ¹ ³ : ³ 9 C Ã ? : ³ Ì ? > 9 ? ½ ¸ ³ C Ð ³ > À C È Ô Ç º Ã 9 C ¾ Å ² 9 ³ Ã Â ¹ ³ ½ 9 ¸ ¾ ³ º ³ C ¢ ¸ ? Ã Ã ³ C Ð Â C Ï A Ã Á<br />

¾<br />

? ¹ ³ C ³ 9 Ã Ã ³ C # 9 = & ( : 9 § § & A C ¾ ¾ 9 ³ ú ³ ¼ ³ 9 ¸ Ã 9 C 9 C ³ C Ð Â > À Â : : ³ C ¾ ³ C Ì ? > 9 ? ½ ¸ ³ C<br />

Ã<br />

9 C ¾ ¹ ³ C ? A ¾ 9 ³ ¹ ³ Ã A µ º ³ C Ì ? > 9 ? ½ ¸ ³ C ¹ > A Ô Ô ³ C Å<br />

Ã<br />

ê<br />

# = § # % % # % & 9 <br />

§<br />

9 < % # % # ² 9 ³ ¢ Â C Ã º > A À º 9 Â C ³ 9 C ³ > · A C À º 9 Â C : 9 º<br />

¦<br />

9 C ³ : Ã Â Â µ ¾ 9 : ³ C Ã 9 Â C ? ¸ ³ C ² ³ ë C 9 º 9 Â C Ã ½ ³ > ³ 9 µ ¼ 9 ³ ¾ ³ > ì A Ã º ? C ¾ Ã : ³ C ¹ ³<br />

³<br />

D ³ Ã ¿ 9 C Á ¾<br />

¹ ? ½ ³ Ô > Â ¹ > ? : : ³ Ã 9 Ã º > ³ ¸ ? º 9 Ð ? A Ç ¼ Ê C ¾ 9 ¹ Å ² ?<br />

D ? ¸ Ã À ? > º ³ Ã 9 Ã µ ³ Ã î > Â ¾ A À º À ¸ ³ 9 C ³ > ³ ><br />

³ ¹ C ³ C ³ º Ã º æ è ê C Ñ ³ ¸ ¾ 9 ë ³ 9 ¹ > º 9 ³ Ã C ? ³ Ñ Ë A > Ì ³ > ³ 9 C Ç ? µ A C ¹ ¾ ³ ><br />

D = D 1 × ...× D n<br />

º 9 Â C ? A µ ¾ 9 ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C<br />

¢ Â C Ã º > A À<br />

h > ³ C À ¸ ³ 9 C ³ > ³ C · A C À º 9 Â C ³ C<br />

? A Ã : ³ > ³ Ë A Ã ³ º Ë ³ C Å ¿ 9 C ³ ³ 9 C Ç ? µ ³ è » ¹ ¸ 9 µ À ³ 9 º 9 ³ > Ë A 9 Ã º ¾ 9 ³ Ì ³ > ¼ ³ C ¾ A C ¹ Ð Â C<br />

Ë A Ã ? : : ³ C<br />

n à A > Á<br />

· A C À º 9 Â C ³ C<br />

ú ³ À º 9 Ð ³ C<br />

h i : D i → ˆD ³ C ¾ 9 ³ À Â : Ô ¸ ³ º º ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C<br />

Ñ : 9 º ¾ ³ C<br />

i<br />

h º ¼ 9 > ¾ A ? ½ ³ ¹ Ç A ?<br />

h(d ∈ D) =h((d 1 ,...,d n )) = (h 1 (d 1 ),...,h n (d n ))<br />

9 ³ § ¢ A 9 Ð ? ¸ ³ C Ë > ³ ¸ ? º 9 Â C<br />

²<br />

³ ¸ C ³ C ² Â : Ê C ³ C ³ > Ë ³ A ¹ º ³ C § ¢ A 9 Ð ? ¸ ³ C Ë > ³ ¸ ? º 9 Â C ³ C<br />

Ë<br />

91<br />

æ ¤<br />

: 9 º ³ 9 C ³ : ² ³ Á<br />

h i<br />

h(d) =(h 1 ,h 2 ,...) Å<br />

≡ ¼ 9 > ¾ ¾ ? C C Ð Â C ¾ ³ C ¾ A > µ ¾ 9 ³ · A C À º 9 Â C ³ C h i<br />

? A Ç ¾ ³ C ³ 9 C Á<br />

≡ i<br />

¹ ³ ½ 9 ¸ ¾ ³ º <br />

(d 1 ,...,d n ) ≡ (e 1 ,...,e n ) ⇔ d 1 ≡ 1 e 1 ∧ ...∧ d n ≡ n e n<br />

æ ê<br />

» ¸ µ ³ Ï ½ ¸ A ¹ C ³ µ > 9 ³ ½ ³ C ¼ ³ > ¾ ³ C Å ² 9 ³ Ã ¸ Ê Ã Ã º Ã 9 µ ¸ ³ 9 µ º ? C ³ 9 C ³ : < ³ 9 Ã Ô 9 ³ ¸<br />

: ¹ 9 C ½ 9 ¾ C ³ ½ Ã<br />

µ ³ C Å ´ 9 C ¾<br />

Ð ³ > Ð ? Â C > Ã ¹ µ ³ ¹ ? ³ A ½ ³ C ¸ Ñ<br />

9<br />

D = {0, 1, 2}×{0, 1, 2} ˆD = {0, 1}×{0, 1} A C ¾<br />

? : º<br />

¹ 9 ½ º ³ Ã 9 C Ã ¹ ³ Ã<br />

(2 2 )ˆ(3 2 )=4 9 = 262144 9 µ ³ Ï ½ ½ 9 ¸ ¾ A C ¹ Ã Ç A C À º 9 Â C ³ C<br />

A C º ³ > Ã µ 9 ³ ¾ ¸ C Ð Ö Â 9 > ¾<br />

D h h ˆDÅ =(h 1 ,h 2 )<br />

9 ³ 9 C · Â > : ³ ¸ ¤ ? C ¹ ³ ¹ ³ ½ ³ C ¾ A > µ C ? µ ¾ ? ¹ ³ ¹ ³ C ¼ º Ë º Ñ 9 Ã º ú ³ ¾ ³ Ã<br />

Ë ³ A 9 C ³ Ð Â C<br />

à ? : : ³ C ¹ ³ à ³<br />

h i 2 3 =8 {0, 1, 2} →<br />

9 ¸ ¾ A C ¹ ³ C<br />

{0, 1} : » ¹ ¸ 9 µ ¢ ³ C Ï ½ ½ º 9 Â C ¾ 9 ³ Ã ³ > ½ ³ 9 ¾ ³ C 8 ³ 9 ¸ Ç A C À º 9 Â C ³ C Ã 9 C ¾ C A > C Â µ : ? ¤ 9 : ? ¸<br />

8 2 =64 Å h ² A > µ Â : Ô Â Ã 9 9 µ ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C ³ C ¾ ? > Ã º ³ ¸ ¸ ½ ? > Å<br />

¸ ¾ ³ 9 µ Ã > ³ º C A<br />

9 º ¾ ³ > Ï A Ç º ³ 9 ¸ A C ¹ ¾ ³ > Ï ½ ½ 9 ¸ ¾ A C ¹ ? A Ç : ³ > ³ > ³ 8 ³ 9 ¸ Ç A C À º 9 Â C ³ C 9 Ã º ? ¸ Ã Â Ë ¼ ? > ¾ 9 ³<br />

è<br />

 C à º > A À º 9  C Ð Â C<br />

¢<br />

h ³ Ã ³ C º ¸ 9 µ Ð ³ > ³ 9 C Ç ? µ º Ñ ¾ ³ : ¹ ³ ¹ ³ C È ½ ³ > Ã º ³ º ú ³ ¾ Â µ ? A µ ³ 9 C ³<br />

¼<br />

: 9 º ³ 9 C ³ > ³ 9 C Ë ³ ¸ C ³ C · A C À º 9 Â C<br />

h i<br />

? ½ ¹ ³ ½ 9 ¸ ¾ ³ º Ñ ¾ ³ > ³ C ´ º ³ ¸ ¸ 9 ¹ À ³ 9 º ¾ ³ > Æ > » þ ³ ¾ ³ > Æ > A Ô Ô ³<br />

½ Ê C ¹ 9 ¹ À ³ 9 º ³ C Ë ¼ 9 Ã µ ³ C ¾ ³ C ³ 9 C Ë ³ ¸ C ³ C Ì ? > 9 ? ½ ¸ ³ C ½ ³ Ã º ³ ³ C Å ² ? ³ > ¹ ³ º ¾ A > µ ¾ 9 ³ Ã ³<br />

Ï<br />

 C à º > A À º 9  C À ³ 9 C ³ à 9 C C Ð Â ¸ ¸ ³ Ï ½ à º > ? À º 9  C à : » ¹ ¸ 9 µ À ³ 9 º Ð ³ > ¸  > ³ C A C ¾<br />

¢<br />

h ? C C º > Â º Ë ¾ ³ :<br />

À<br />

C 9 î Â > : :<br />

³ ³ C > ¹ ?<br />

P φ ³ ´ Ô ³ Ë 9 ë À ? º 9 Â C ¹ ³ ¹ ³ ½ ³ C Å ² 9 ³ è ³ C ¹ ³ ? ¸ ¸ ³ > ³ C º ? ¸ º ³ Á<br />

A C ¾ ³ 9 C : ? > ³ C Ï A Ã Ã ? ¹ ³ C 9 Ã º Ï º Â : ³ æ<br />

C ³ C ? º Â<br />

P ∪ φ f 1 ,f 2<br />

æ ê Å ì ¼ ³ 9 ? º Â : ? > ³ Ï A Ã Ã ? ¹ ³ C ³ : Â º Ï ê<br />

È ú ¾ Ì > 9 ? ½ ¸ ³ C ¹ > A Ô Ô ³<br />

· ¼ > 9 > ¾ ³ 9 C ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C<br />

³ ³ ?<br />

VG i<br />

 C à ½ ³ > ³ 9 µ Ð Â C<br />

ë C 9 º 9<br />

D VGi = ∏ ë ³ C ¾ 9 ³ > º Å ² 9 ³ Ð Â ¸ ¸ Ã º Ê C ¾ 9 ¹ ³ Ï ½ Ã º > ? À º 9 Â C Ã Á<br />

v∈V G i<br />

D v<br />

Ç A C À º 9 Â C ³ > ¹ 9 ½ º Ã 9 µ ? A Ã ¾ ³ > ¢ Â : ½ 9 C ? º 9 Â C ¾ ³ > 8 ³ 9 ¸ Ç A C À º 9 Â C ³ C


8<br />

= ; C ><br />

\ 3<br />

4<br />

5<br />

8<br />

4<br />

P : 9 º ¾ > ³ 9 Ì ? > 9 ? ½ ¸ ³ C x, y ∈{0, 1, 2} Ñ reset ∈{True Ñ<br />

False} ¾ ³ 8 ? Ã º Â Ã ¸ » µ À ³ C ? A Ã Ï ½ ½ Å ¤ ¹ ³ ¹ ³ ½ ³ C Å ² 9 ³ è ³ C ¹ ³ ¾ ³ > ? º Â : ? Á<br />

A C ¾ C > C 9 9 C ½ C Ï º Â : ³ æ > ³ C Ï A Ã Ã ? ¹ ³<br />

P {reset = True,x < y,x = y, ¬(y =2), True} Å<br />

µ 9 ³ ¸ ¹ º Ã 9 ê<br />

9 ³ Ï A Ã Ã ? ¹ ³ 9 Ã º Ç È > ¾ 9 ³ Ö ? ¸ ¾ ³ > Ì ? > 9 ? ½ ¸ ³ C ¹ > A Ô Ô ³ C A C 9 C º ³ > ³ Ã Ã ? C º A C ¾ ¼ 9 > ¾<br />

²<br />

9 µ º ¼ ³ 9 º ³ > ½ ³ º > ? µ º ³ º Å Ì Â C ¾ ³ C > ³ Ã º ¸ 9 µ ³ C Ï A Ã Ã ? ¹ ³ C 9 C º ³ > Ç ³ > 9 ³ > ³ C<br />

C<br />

³ Ï Ã A ³ º º ³ C Ë ¼ ³ 9 · Â > : ³ ¸ ¹ > A Ô Ô ³ C <br />

Ð C ½ µ ¸ þ C Ã ³<br />

FG 1 = {x 9 ? ½ ¸ ³ C ½ 9 ¸ ¾ ³ C ú ³ ¼ ³ 9 ¸ Ã ¾ 9 ³<br />

VG Å VG ² 9 ³ 9 C ¾ ³ C 1 = {x, y} VG 2 = {reset} A C ¾ Å Î : ½ ³ º > ? µ º ³ º ³ C<br />

º ¸ 9 ¹ Â Ã ¸ ? Ñ<br />

A C ? ¾ ½ ½ ¸ ³ º Ñ ¼ Â ½ ³ 9<br />

¹ ³ 9 ¾<br />

h 1 h 2<br />

³ º C ³ 9 ¸ Ã ¸ 9 ¹ Å<br />

h 2 : D reset → ̂D reset<br />

8<br />

D =(D x × D y × D reset ) A > µ Ë ¼ ³ 9<br />

h ¾ 1 : D x × D y → ̂D ³ 9 C ³ Ë ¼ ³ 9 Ã º ³ ¸ ¸ 9 ¹ ³<br />

xy<br />

% % < ( &<br />

<br />

§<br />

<br />

9 < % # % # & ? µ ¾ ³ : ¾ 9 ³ ´ 9 ¹ C ? º A > ³ C ¾ ³ > Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À Á<br />

¤<br />

9 Â C ³ C Ç ³ Ã º ¹ ³ ¸ ³ ¹ º Ã 9 C ¾ Ñ ¼ ³ > ¾ ³ C ¾ 9 ³ · A C À º 9 Â C ³ C Ã ³ ¸ ½ Ã º ½ ³ Ã º 9 : : º Å < ³ 9 ¾ ³ > 9 C 9 º 9 ? ¸ ³ C<br />

º<br />

½ Ã º > ? À º 9 Â C ¼ ³ > ¾ ³ C Ë A C Ê µ Ã º ? ¸ ¸ ¾ 9 ³ ú ³ C 9 ¹ ³ C Ö ³ > º ½ ³ ¸ ³ ¹ A C ¹ ³ C ³ 9 C ³ > Ì ? > 9 ? ½ ¸ ³ C ¹ > A Ô Á<br />

Ï<br />

³ ? A Ç ³ 9 C ³ C ³ 9 C Ë ³ ¸ C ³ C ? ½ Ã º > ? À º ³ C Ö ³ > º ? ½ ¹ ³ ½ 9 ¸ ¾ ³ º Ñ ¾ 9 ³ : 9 º ¾ ³ C Ï A Ã Ã ? ¹ ³ C 9 C ¾ ³ ><br />

Ô<br />

 > > ³ Ã Ô Â C ¾ 9 ³ > ³ C ¾ ³ C ·  > : ³ ¸ ¹ > A Ô Ô ³ ä ó ÷ ã ä ÷ Ý à ü ó Ý Ü Ý ä ¼ ³ > ¾ ³ C À » C C ³ C Å ·  > : ? ¸ ½ ³ Á<br />

À<br />

µ > 9 ³ ½ ³ C ³ 9 þ º ¾ ? Ã <br />

Ã<br />

9 ³ Î ¾ ³ ³ 9 C º ³ > ¾ 9 ³ Ã ³ : Ï C Ã ? º Ë 9 Ã º Ñ ¾ ? Ã Ã ¾ 9 ³ ì A Ã ? : : ³ C Ç ? Ã Ã A C ¹ ? A Ç ¾ 9 ³ Ã ³ Ö ³ 9 Ã ³ À ³ 9 C ³ C<br />

²<br />

9 C A þ ? A Ç ¾ ³ C ¢ Â C º > Â ¸ ¸ A þ ¾ ³ Ã î > Â ¹ > ? : : Ã ? ½ ³ C À ? C C Å ´ µ ¸ 9 ³ þ ¸ 9 µ À » C C ³ C ¾ 9 ³<br />

¿<br />

C ¾ ³ C < ³ ¾ 9 C A C ¹ A C ¹ ³ C ¾ ³ > 8 > ? C Ã 9 º 9 Â C Ã ½ ¸ » µ À ³ ? C ¹ ³ ¹ ³ ½ ³ C ³ C Ï A Ã Ã ? ¹ ³ C ¾ 9 ³ ³ 9 C Ë ³ ¸ C ³ C<br />

9<br />

³ > º ³ ¹ ? > C 9 µ º A C º ³ > Ã µ ³ 9 ¾ ³ C Å Ï A µ ¾ 9 ³ ´ Ô ³ Ë 9 ë À ? º 9 Â C À ? C C ¾ 9 ³ Ë A Ã ? : : ³ C ¹ ³ Ç ? Ã Ã º ³ C<br />

Ö<br />

Ý ü ó Þ 9 ² ? Ã î > Â ¹ > ? : : ? A Ã < ³ 9 Ã Ô 9 ³ ¸ ³ C º Ê ¸ º ¼ 9 ³ ½ ³ > ³ 9 º Ã ¹ ³ Ã µ 9 ¸ ¾ ³ > º Ë ¼ ³ 9 Ì ? > 9 ? Á<br />

J ó ß Ý ¡<br />

½ Ë ¼ Å · Â > : ³ ¸ ¹ > A Ô Ô ³ C Å Ì ? > 9 ? ½ ¸ ³ C ¹ > A Ô Ô ³<br />

½ ¸ ³ C Á<br />

1 x y à º ¾ 9 ³ Ì ? > 9 ? ½ ¸ ³ C A C ¾ Ñ ¾ 9 ³<br />

1 A {x ¹ 9 ½ º Ã 9 µ Ñ ¾ ? Ã<br />

Ê º C ³<br />

(0, 0) A C ¾ (1, 1) ? A Ç ¾ ³ C Ã ³ ¸ ½ ³ C ? ½ Ã º > ? À º ³ C<br />

¹ ¸ ³ 9 µ <br />

FG 1<br />

∀f ∈ FG 1 :(0, 0) |= f ⇔ (1, 1) |= f C Ã ¹ ³ Ã ? : º ³ > ¹ ³ ½ ³ C Ã 9 µ ¡<br />

Î Å<br />

¢ ¸ ? Ã Ã ³ C Ð Â C Ö ³ > º ³ C Ñ ¾ 9 ³ ? A Ç ¾ 9 ³ ? ½ Ã º > ? À º ³ C Ö ³ > º ³<br />

4<br />

ê<br />

92<br />

/ . 1 3 x4 5 7 0<br />

.<br />

8 9 1 3 x4 5 7 ; = ><br />

8 /<br />

/ . 1 3 y4 5 7 1<br />

.<br />

8 9 1 3 y4 5 7 ; = ><br />

8 /<br />

/ . 1 3<br />

reset4 5 7 0<br />

.<br />

8 9 1 3<br />

reset4 5 7 ; = ><br />

8 /<br />

True5<br />

5<br />

5<br />

reset = 0<br />

x<br />

5 0 … 1<br />

x<br />

y<br />

reset<br />

> = ; C<br />

H \ V M \ ‚ _ F<br />

3 H<br />

H \ V M \ ‚ _ F<br />

H \ V M \ ‚ _ F<br />

3 ‚<br />

‰ ‚ ‚ ’<br />

F M O x M F _ x V w | V \ r r r M X s V F M H \ V M \ ‚ _ F K<br />

J Ý ó ü ß ó Ý Þ 9 ´ ³ 9 ³ 9 C î > Â ¹ > ? : :<br />

x Ñ ¾ ? Ã 9 ³ ¹ ³ : ³ 9 C Ã ? : ³ Ì ? > 9 ? ½ ¸ ³ C ³ C º ? ¸ º ³ C Å ² A > µ º > ? C Ã 9 º 9 Á<br />

A C ¾<br />

Ì ? > 9 ? ½ ¸ ³ C ¹ > A Ô Ô ³ C<br />

· ? ¸ ¸ ¼ 9 > ¾ Ç Â ¸ ¹ ¸ 9 µ ³ 9 C î > Â ¹ > ? : : Ë A Ã º ? C ¾ ? A Ã<br />

8 ³ 9 ¸ Ç A C À º 9 Â C ³ C<br />

· A C À º 9 Â C 9 Ã º A C ¾<br />

h i (d 1 ,...,d k )=h i (e 1 ,...,e k ) ⇔∀f ∈ FG i :(d 1 ,...,d k ) |= f ⇔ (e 1 ,...,e k ) |= f<br />

æ <br />

ì A Ã º Ê C ¾ ³<br />

C 9 µ º Ð Â C ³ 9 C ? C ¾ ³ > A C º ³ > Ã µ ³ 9 ¾ ³ C Å<br />

· Â > : ³ ¸ ¹ > A Ô Ô ³<br />

½ ³ 9 Ã Ô 9 ³ ¸ Ã ¼ ³ 9 Ã ³ ¾ 9 ³ Ì ? > 9 ? ½ ¸ ³ C ½ ³ ¸ ³ ¹ A C ¹ ³ C<br />

Ö ³ > º ? ½ ¹ ³ ½ 9 ¸ ¾ ³ º ¼ ³ > ¾ ³ C Ñ ¾ ? Ã 9 ³ Ã 9 µ ½ ³ Ë È ¹ ¸ 9 µ ¾ ³ > Ï A Ã Ã ? ¹ ³ C 9 C<br />

Ð ³ > ? ¸ Á<br />

º ³ C Ñ ¾ Å Å ³ Ã ¹ 9 ¸ º <br />

ˆ0, ˆ1, ˆ2, ˆ3, ˆ4 ? ½ ¹ ³ ½ 9 ¸ ¾ ³ º ¼ ³ > ¾ ³ C Å<br />

² ? ³ > ¼ 9 > ¾<br />

? ¸ Ã ¾ 9 ³ Ç Â ¸ ¹ ³ C ¾ ³ Ã A > ú ³ À º 9 Ð ³ Ï ½ ½ 9 ¸ ¾ A C ¹ ¾ ³ ë C 9 ³ > º <br />

h 1<br />

{(0, 0), (1, 1)} → ˆ0 Ñ<br />

Ñ<br />

{(0, 1)} → ˆ1<br />

{(0, 2), (1, 2)} → ˆ2<br />

{(1, 0), (2, 0), (2, 1)} →ˆ3<br />

{(2, 2)} → ˆ4


# ( ( $ % % : & <br />

§ § % ( % : Ï A Ã Ã ³ > ¾ ³ > Ï ½ ½ 9 ¸ ¾ A C ¹ ¾ ³ > è Â ¾ ³ ¸ ¸ Ë A Ã º Ê C ¾ ³ ¾ A > µ ¾ 9 ³<br />

¢<br />

½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C 9 Ã º ? A µ ³ 9 C ³ Ï ½ ½ 9 ¸ ¾ A C ¹ ¾ ³ > ì A Ã º ? C ¾ Ã È ½ ³ > ¹ Ê C ¹ ³ A C ¾ ¾ ³ > 9 C<br />

Ï<br />

º > A À º A > Ë A º > ? C Ã Ç Â > : 9 ³ > ³ C Ñ ¾ ? 9 ³ > ¾ 9 ³ 8 > ? C Ã 9 º 9 Â C Ã > ³ ¸ ? º 9 Â C ³ ¤ Ô ¸ 9 Ë 9 º ? C ¹ ³ ¹ ³ ½ ³ C 9 Ã º Å<br />

´<br />

C ¾ 9 ³ Ã ³ > ´ 9 µ º ¼ ³ 9 Ã ³ ¼ 9 > ¾ ¾ A > µ ¾ 9 ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C<br />

Î<br />

è<br />

<br />

<br />

M =(S, I, T, P, L) Ü ã à Ü ó Ý ó ä Þ Ý ó ã ä å ¢<br />

< ¥ § & % % & 9 # & 9 < % & % : & ¥ < ì A : & ? µ ¼ ³ 9 Ã Ñ ¾ ? Ã Ã ¾ ? Ã Ã Â ¾ ³ ë C 9 ³ > Á<br />

¤ <br />

ˆM M º Ã Ê µ ¸ 9 µ ³ 9 C ³ À Â C Ã ³ > Ð ? º 9 Ð ³ Ï ½ Ã º > ? À º 9 Â C Ð Â C 9 Ã º Ñ ¼ 9 > ¾ ¹ ³ Ô > È Ç º Ñ<br />

? º<br />

³ C Ã µ ? Ç º Å < ³ 9 : & ? µ ¼ ³ 9 Ã ¾ ³ > ´ 9 : A ¸ ? º 9 Â C ¼ 9 > ¾ ú ³ ¾ Â µ ³ 9 C ³ ¼ 9 µ º 9 ¹ ³ ¿ 9 C Ã µ > Ê C À A C ¹<br />

¹<br />

 > ¹ ³ C  : : ³ C ¿ à ¼ 9 > ¾ Ð Â > ? A à ¹ ³ à ³ º Ë º Ñ ¾ ? à à ? º  : ? > ³ Ï A à à ? ¹ ³ C ¿ ¸ ³ : ³ C º ³ Ð Â C<br />

Ð<br />

P Ë ¼ Å<br />

ˆP ½ 9 C ¾ Å ² ? > ? A Ã Ç Â ¸ ¹ º Ñ ¾ ? Ã Ã ¾ 9 ³ À Â C Ã ³ > Ð ? º 9 Ð ³ Ï ½ Ã º > ? À º 9 Â C Ã ³ 9 ¹ ³ C Ã µ ? Ç º C 9 µ º â á à ö Þ Þ Ý<br />

à ³ ¸ 9 ³ ½ 9 ¹ ³ C Ï é 8 Í Á ·  > : ³ ¸ C ¹ ³ Ë ³ 9 ¹ º ¼ ³ > ¾ ³ C À ? C C Ñ Ã Â C ¾ ³ > C C A > Ç È > ·  > : ³ ¸ C Ñ ¾ 9 ³ ? A Ã<br />

½<br />

C ¾ ³ > ´ Ô ³ Ë 9 ë À ? º 9 Â C Ð Â > À Â : : ³ C ¾ ³ C Ï A Ã Ã ? ¹ ³ C ¹ ³ ¾ ? µ º 9 Ã º Ñ 9 Ã º ¾ 9 ³ Ã ³ ¿ 9 C Ã µ > Ê C À A C ¹<br />

9<br />

½ ³ > ? A Ô º C 9 µ º Ã º » > ³ C ¾ Ñ Ã Â C ¾ ³ > C ³ > ¸ ? A ½ º 9 : Æ ³ ¹ ³ C º ³ 9 ¸ Ã º Ê > À ³ > ³ Ï ½ Ã º > ? À º 9 Â C ³ C Å<br />

È<br />

h C ´ : A ¸ ? º 9 Â C Ã > ³ ¸ ? º 9 Á<br />

M ³ 9 ³ 9 Ã º 9 Å ² ? Ë A Ã 9 C ¾ ¾ 9 ³ Ë ¼ ³ 9 < ³ ¾ 9 C ¹ A C ¹ ³ C ? A Ã ² ³ ë C 9 º 9 Â C ¡ Ë A<br />

ˆM ¾ C A<br />

s, ŝ : 9 º h(s) =ŝ : A Ã Ã ¹ ³ ¸ º ³ C <br />

ˆP = P A C ¾ ? A Ã Ï ½ Ã µ C 9 º º Å Ç Â ¸ ¹ º L(s) ⊆ P Å ² ? ³ > À ? C C ¾ 9 ³<br />

s, d A C ¾ ³ 9 C ³<br />

93<br />

³ ¾ ³ : ì A Ã º ? C ¾ ¹ ³ ¸ º ³ C ³ C ? º Â : ? > ³ C Ï A Ã Ã ? ¹ ³ C ? A Ç ¾ ? Ã ? ½ Ã º > ? À º ³ è Â ¾ ³ ¸ ¸ C » º 9 ¹ Å ² ? Ë A<br />

ú<br />

à º ³ à à 9 C C Ð Â ¸ ¸ Ñ<br />

9<br />

P Â C ¾ ³ > ² ? > Ã º ³ ¸ ¸ A C ¹ ? ¸ Ã î > Â ¹ > ? : : 9 C ¾ 9 ³ · Â > : ³ 9 C ³ > ¢ > 9 Ô À ³ Á<br />

Ð<br />

h ¾ 9 ³ ì A Ã º ? C ¾ Ã : ³ C ¹ ³ S<br />

ˆM<br />

M =(S, I, T, P, L) ? A Ç ¾ 9 ³ ì A Ã º ? C ¾ Ã : ³ C ¹ ³ Ŝ ¾ ³ Ã ? ½ Ã º > ? À º ³ C<br />

? ½ ¹ ³ ½ 9 ¸ ¾ ³ º Å<br />

=(Ŝ,Î, ˆT, ˆP, ˆL)<br />

ˆM ½ ³ C Ã 9 µ ? A Ã ¾ ³ > Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C ? A Ç ¾ 9 ³<br />

³ ¹ > ³<br />

¾ ³ Ã À Â C À > ³ º ³ C è Â ¾ ³ ¸ ¸ Ã<br />

 ¾ ³ ¸ ¸ Ã<br />

² 9 ³ ¼ ³ 9 º ³ > ³ C ¿ ¸ ³ : ³ C º ³ Ð Â C<br />

 ¸ ¹ ³ C ¾ ³ Ö ³ 9 à ³ <br />

Ç<br />

& % % # K 1 : 1 P A 6 ; ; ö ü ö ü ÷ à ö õ ÷ Ý Ú Û Ü Ý Þ Þ<br />

<br />

ˆM<br />

=(Ŝ,Î, ˆT, ˆP, ˆL)<br />

Ý à 3<br />

h : D → ˆD ã ä Ü Ü Ý ä â Û Þ å Ý ä Ü Ý ä H Ý ü ÷ Þ Ý å ã ä å Ý ä *<br />

Ü Ý ô ä ó Ý à ÷ Ý ü ÷ à ö õ ÷ ó Û ä ü â ã ä õ ÷ ó Û ä<br />

å ó ÷ ü ó ö ã ü Ü Ý õ Û ä õ à Ý ÷ Ý ä Ú Û Ü Ý Þ Þ<br />

Ŝ = ˆD<br />

ˆP = P<br />

ˆd ∈ Î ∃d : h(d) = ˆd ∧ d ∈ I<br />

å<br />

ˆT Ü L 9 ( ˆd1 , ˆd 2 ) ∃d 1 ∃d 2 : h(d 1 )= ˆd 1 ∧ h(d 2 )= ˆd 2 ∧ T (d 1 ,d 2 )<br />

9 L Ü å<br />

ˆL( ˆd) =<br />

⋃h(d)= ˆd<br />

L(d)<br />

M Ð Â C ˆM<br />

à 9 : A ¸ 9 ³ > º ¼ 9 > ¾ Å ² ? > ? A Ã Ç Â ¸ ¹ º C ? µ 8 ³  > ³ : ¾ 9 ³ ¹ ³ ¼ È C à µ º ³ ¿ 9 Á<br />

º ³ è Â ¾ ³ ¸ ¸<br />

 ½<br />

¸ ³ : ³ C º ? > ? A Ã Ã ? ¹ ³ C ¾ ³ Ã î > Â ¹ > ? : : ³ Ã A C ¾ ¾ ³ > ´ Ô ³ Ë 9 ë À ? º 9 Â C æ ³ ½ ³ C ¿ ¸ ³ : ³ C º ³ C Ð Â C<br />

¿<br />

P Ë A Ã ? : : ³ C ¹ ³ Ã ³ º Ë º Ã 9 C ¾ Å ² ? ¾ 9 ³ Ï ½ Ã º > ? À º 9 Â C ? ½ ³ > ? A µ C A > Ë A : ½ ³ > Ô > È Ç ³ C ¾ ³ ><br />

ê<br />

ì A C Ê µ Ã º ¼ 9 > ¾ ¹ ³ Ë ³ 9 ¹ º Ñ ¾ ? Ã Ã ¾ 9 ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C<br />

 C<br />

Ë ¼ 9 Ã µ ³ C<br />

A C º ³ > Ã A µ ³ C <br />

Å · È > ? ¸ ¸ ³<br />

L(s) ∩ ˆP = ˆL(ŝ)<br />

ˆP ¹ ³ Ã µ > 9 ³ ½ ³ C<br />

Ï A Ã ² ³ Ç Å Ç Â ¸ ¹ º<br />

L(s) = ˆL(ŝ)<br />

· Â > : ³ ¸ Â C ³<br />

¼ ³ > ¾ ³ C <br />

¿ 9 C Ã ³ º Ë ³ C ¾ ³ > ² ³ ë C 9 º 9 Â C ³ C ¸ 9 ³ Ç ³ > º<br />

{f ∈ P | s |= f} = ⋃<br />

h(d)=ŝ<br />

= ⋃<br />

h(d)=ŝ<br />

L(d)<br />

{f ∈ P | d |= f}<br />

æ ê<br />

< ³ ¼ ³ 9 Ã ¾ A > µ Ö 9 ¾ ³ > Ã Ô > A µ Ï C ¹ ³ C Â : : ³ C Ñ ³ Ã ¹ 9 ½ º Ë ¼ ³ 9 ì A Ã º Ê C ¾ ³<br />

Ï A Ã Ã ? ¹ ³<br />

f ? A Ã P Ñ Ç È > ¾ 9 ³ s |= f ∧ d ̸|= f ∧ h(d) =ŝ<br />

æ ê


h 9 C Æ ¸ Å Å Ï C ? ¸ Â ¹ ¼ 9 > ¾ ¾ 9 ³ C : » ¹ Á<br />

L(s) =ˆL(ŝ) A C ¾<br />

h ? A Ç ? ¸ ¸ ³ C ì A Ã º Ê C ¾ ³ C ¾ ³ ë C 9 ³ > º 9 Ã º Ñ ¹ 9 ½ º ³ Ã ³ 9 C ˆt : 9 º h(t) =ˆt Å T (ŝ, ˆt) Ç Â ¸ ¹ º<br />

M Å<br />

¦ & 9 © ¥<br />

© : # & : & § & % % & ( & <br />

h ³ 9 C ³ ´ 9 : A ¸ ? º 9 Â C Ã > ³ ¸ ? º 9 Â C Ë ¼ 9 Ã µ ³ C M A C ¾ ˆM<br />

9 Ã º Å ² 9 ³<br />

? Ã ? ½ Ã º > ? 9 ³ > º ³ è Â ¾ ³ ¸ ¸ ¼ 9 > ¾ C A C ¾ A > µ ³ 9 C ³ C è Â ¾ ³ ¸ Á é ³ µ À 9 C ¹ Ï ¸ ¹ Â > 9 º : A Ã æ ¼ 9 ³<br />

²<br />

Å < Å 9 C Ð Â > ¹ ³ Ã º ³ ¸ ¸ º ê ¾ ? > ? A Ç 9 C È ½ ³ > Ô > È Ç º Ñ Â ½ ³ Ã ¾ 9 ³ ¹ ³ ¹ ³ ½ ³ C ³ ´ Ô ³ Ë 9 ë À ? º 9 Â C ³ 9 C Ê ¸ º Å<br />

Ë<br />

A > µ Ã µ > 9 º º ¼ ³ 9 Ã ³ Ã ì A > È µ À Ç È > ³ C Ð Â C ? ½ Ã º > ? À º ³ C ì A Ã º Ê C ¾ ³ C ? A Ç À Â C À > ³ º ³ ì A Ã º Ê C Á<br />

¾<br />

³ ¾ A > µ Ç È > ³ C Å · A C À º 9 Â C ½ ³ Ã µ > ³ 9 ½ º ¾ ³ C ¾ ? Ë A Ð Â C é ¸ ? > À ³ Ð ³ > ¼ ³ C ¾ ³ º ³ C Ï ¸ ¹ Â > 9 º Á<br />

¾<br />

T Ñ ¾ Å Å Img(S, T )={s ′ |s ∈ S ∧ T (s, s ′ )} Å<br />

u M X s F r F M K F K s a V H I s \ O F | F K ‚ F M O x M F _ ‚ F „ F M H I K F X F K \ ‚ O X V \ ‹ X F K z \ s ‹ K K F K r F I V F V F<br />

<br />

w K ‹ V F X F z \ s F ‹ w V V F O x w K s M F V F K ’<br />

‹<br />

94<br />

9 ¸ º Å Î C ¾ 9 ³ Ã ³ : · ? ¸ ¸ À » C C º ³ Æ ¸ ³ 9 µ A C ¹ Ð ³ > ¸ ³ º Ë º Ã ³ 9 C Å ² ? Ã À ? C C ? ½ ³ > C 9 µ º<br />

¹<br />

9 C º > ³ º ³ C Ñ ¾ ?<br />

³<br />

ŝ = h(s) C ¾ ¾ ? : 9 º A<br />

s |= f ∧ d ̸|= f ∧ h(d) =ŝ ⇔<br />

s |= f ∧ d ̸|= f ∧ h(d) =h(s)<br />

æ T ê<br />

² 9 ³ Ã ¼ 9 ¾ ³ > Ã Ô > 9 µ º ¾ ³ > ¢ Â C Ã º > A À º 9 Â C Ð Â C<br />

¸ 9 µ À ³ 9 º Ð Â C<br />

s ̸|= f ∧ d |= f ∧ h(d) =ŝ<br />

æ ê<br />

¹ ³ Ë ³ 9 ¹ º Å Ï A Ã ¾ ³ > C ³ > Ç È ¸ ¸ ½ ? > À ³ 9 º Ð Â C Æ ¸ Å A C ¾ Æ ¸ Å Ç Â ¸ ¹ º<br />

? 9 Ñ ¾ ? Ã Ã ¾ 9 ³ Ë A Ë ³ 9 ¹ ³ C ¾ ³ < ³ ¾ 9 C ¹ A C ¹ ³ > Ç È ¸ ¸ º 9 Ã º Å<br />

¾ : º<br />

È > ? ¸ ¸ ³ Å ·<br />

s, ŝ h(s) =ŝ : A Ã Ã ¹ ³ ¸ º ³ C ¤<br />

º 9 :<br />

t : 9 º T (s, t) ¹ 9 ½ º ³ Ã ³ 9 C ³ C ì A Ã º ? C ¾ ˆt : 9 º T (ŝ, ˆt) A C ¾ h(t) =ˆt Å<br />

· È > ú ³ ¾ ³ C ì A Ã º ? C ¾<br />

² ?<br />

¾ 9 > ³ À º ? A Ã ¾ ³ > ² ³ ë C 9 º 9 Â C Å<br />

´ Â : 9 º 9 Ã º ¹ ³ Ë ³ 9 ¹ º Ñ ¾ ? Ã<br />

³ º Ë º ³ C ? µ Ë A ¼ ³ 9 Ã ³ C ¾ ³ < ³ ¾ 9 C ¹ A C ¹ ? A Ã ² ³ ë C 9 º 9 Â C Ç Â ¸ ¹ º ³ ½ ³ C Ç ? ¸ ¸ Ã ¾ 9 > ³ À º ? A Ã ¾ ³ ><br />

¸<br />

 C à º > A À º 9  C ¾ ³ à ? ½ à º > ? À º ³ C è  ¾ ³ ¸ ¸ à 9 C ² ³ ë C 9 º 9  C Å Ï ¸ à  9 à º<br />

<br />

ˆM C ¾ ³ > 8 ? º ³ 9 C ³<br />

9<br />

´ 9 : A ¸ ? º 9 Â C Ð Â C<br />

³ C º ¼ ³ ¾ ³ > Ã µ ¸ ³ 9 Ç ³ C Ç > ³ 9 Ã ³ 9 C Ñ ¾ ? C C 9 Ã º<br />

Ĝ Ĝ È À À ? C C<br />

Ĝ Ë A > µ Å ¾ ¸ 9 µ ³ > . â ö Ü ¾ ³ > · Â > : Ñ Ñ<br />

(ŝ 1 ŝ 2 ... sˆ<br />

n ) Ñ Å<br />

C ³ C 9 ³<br />

Î Ã º ¾ ? Ã C 9 µ º ¾ ³ > · ? ¸ ¸ Ñ ¸ 9 ³ Ç ³ > º ¾ ³ > è Â ¾ ³ ¸ é ³ µ À ³ > ³ 9 C Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸<br />

· Â > :<br />

Ĝ C ³ ñ Þ Ý ó â Ý Ñ 9 Ã º ¾ ? Ã Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ Ô > 9 C Ë 9 Ô 9 ³ ¸ ¸ A C ³ C ¾ ¸ 9 µ ¸ ? C ¹ A C ¾ ? º ¾ 9 ³<br />

(ŝ 1 ³ 9 Ñ Ñ<br />

Ñ<br />

ŝ 2 ... ŝ i )( s i+1 ˆ ... sˆ<br />

n ) ω Å<br />

Ĝ Ñ Ñ C ³ µ º ³ Ã Â ¾ ³ > ³ 9 C A C ³ µ º ³ Ã Æ ³ ¹ ³ C ½ ³ 9 Á<br />

9 ³<br />

¿ C º Ê ¸ º<br />

Ï ¸ Ã C Ê µ Ã º ³ Ã :<br />

A Ã Ã ³ > À ? C C º ¼ ³ > ¾ ³ C Ñ Â ½<br />

Ã Ô 9 ³ ¸ 9 à º Å ù 9 ³ > ½ ³ 9 ¼ 9 > ¾ Ë A C Ê µ à º Ð Â C Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ³ C  C ³ ´ µ ¸ ³ 9 Ç ³ C ? A à ¹ ³ ¹ ? C ¹ ³ C Å<br />

& : & § & % % & ( & # ¥ & ¥ ( & % & ¿ 9 C Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ Â C ³ ´ µ ¸ ³ 9 Ç ³ 9 Ã º ¾ ? C C ³ 9 C A C Á<br />

<br />

µ º ³ Ã Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ Ñ ¼ ³ C C ³ Ã Ë A ¾ ³ : ¹ ³ ¸ 9 ³ Ç ³ > º ³ C î Ç ? ¾<br />

³<br />

(ŝ 1<br />

Ñ<br />

Ñ<br />

ŝ 2 ... sˆ<br />

n ) Â C Ð Ñ<br />

? ½ Ã º > ? À º ³ C<br />

A Ã º Ê C ¾ ³ C õ Ý ó ä Ý ä À Â > > ³ Ã Ô Â C ¾ 9 ³ > ³ C ¾ ³ C î Ç ? ¾ : 9 º A C ? ½ Ã º > ? 9 ³ > º ³ C ì A Ã º Ê C ¾ ³ C ¹ 9 ½ º Å<br />

ì<br />

9 ³ è ³ C ¹ ³ ? ¸ ¸ ³ > î Ç ? ¾ ³ ¾ ³ Ã A C ? ½ Ã º > ? 9 ³ > º ³ C è Â ¾ ³ ¸ ¸ Ã Ñ ¾ 9 ³ Ë A ³ 9 C ³ : î Ç ? ¾<br />

²<br />

(ŝ 1 ŝ 2 ... sˆ<br />

n )<br />

h −1 (ŝ 1 , ŝ 2 ,..., sˆ<br />

n )=<br />

{<br />

(s 1 ,s 2 ,...,s n )|<br />

n∧<br />

i=1<br />

}<br />

n−1<br />

∧<br />

h(s i )=ŝ i ∧ I(s 1 ) T (s i ,s i+1 )<br />

i=1<br />

æ ¡ ê<br />

? ½ Ã º > ? 9 ³ > º ¼ ³ > ¾ ³ C Ñ 9 Ã º ¹ ³ ¹ ³ ½ ³ C ¾ A > µ <br />

: 9 º ³ 9 C ³ : 8 ³ Ã º ? A Ç<br />

Ĝ 9 º 9 º ¸ Â ¸ 9 ³ ³ º C<br />

h −1 ³ (Ĝ) µ º Ã Ñ Ã ? Ã ¹ ³ µ ½ ¾ A ³ ¾<br />

≠ ¸ Ê Ã Ã º Ã 9 µ ³ 9 C Ç ? µ <br />

−1<br />

h (Ĝ) C Â Ð ¹ C A C µ ³ > ³ < ³ 9 ² ∅Å<br />

² 9 ³ C º ³ > Ã A µ A C ¹ Ñ Â ½ ³ 9 C Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸<br />

º 9 Â C Ã Ç A C À º 9 Â C<br />

h −1 (ŝ) Ã : À ³ > Ç A C À º 9 Â C ¾ ³ > Ï ½ Ã º > ? À Á<br />

h(s) ? h<br />

¸ ë C 9 ³ > º Ñ ¾ 9 ³ ? A Ç ¹ > A C ¾ ¾ ³ > Ë A Ã ? : : ³ C Ç ? Ã Ã ³ C ¾ ³ C Ö 9 > À A C ¹ Ð Â C<br />

h −1 (ŝ) ={s|h(s) =ŝ} ¾ Img(S, T )<br />

³ Å<br />

S Ë Â ¹ ³ C ³ ½<br />

: A Ã ¢ ¤ ! ¦ § © § 9 C î Ã ³ A ¾ Â µ Â ¾ ³ Å ² ? ½ ³ 9 9 Ã º<br />

ú ³ ¼ ³ 9 ¸ Ã ³ 9 C ³ è ³ C ¹ ³ Ð Â C ì A Ã º Ê C ¾ ³ C ¸ 9 ³ Ç ³ > C À ? C C ¤<br />

9 Ã º ¾ ? Ã ¢ # 9 § $ 9 <br />

§ % ( % Ð Â C ¾ ³ > ì A Ã º ? C ¾ Ã : ³ C ¹ ³<br />

? A Ç ¾ 9 ³ 8 > ? C Ã 9 º 9 Â C Ã > ³ ¸ ? º 9 Â C


S j ≠ © ¡ i j<br />

w a X x a X “ H I X F O<br />

∅<br />

X w x O<br />

¥ e i i<br />

F | F K ‚ F M O x M F _ | F z a K s F K ’ <br />

³ C è Â ¾ ³ ¸ ¸ Ã Ñ ¾ 9 ³ Ð Â C ¾ ³ C Î C 9 º 9 ? ¸ Ë A Ã º Ê C ¾ ³ C ? A Ã ¹ ³ ³ C ¾ ? A Ç ¾ ³ C : 9 º ¾ ³ : Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸<br />

º<br />

 > > ³ Ã Ô Â C ¾ 9 ³ > ³ C ¾ ³ C À  C À > ³ º ³ C î Ç ? ¾ ³ C 9 C<br />

À<br />

i µ > 9 º º ³ C ³ > > ³ 9 µ º ¼ ³ > ¾ ³ C À » C C ³ C Å Î Ã º 9 C<br />

S i ´ ³ ³ > Ñ ½ ³ ¾ ³ A º ³ º ¾ ? Ã ³ 9 C ³ > Ã ³ 9 º Ã Ñ ¾ ? Ã Ã ³ Ã À ³ 9 C À Â C À > ³ º ³ Ã Æ ³ ¹ ³ C Ã º È µ À Ë A<br />

¸<br />

³ : ? ½ Ã º > ? À º ³ C î Ç ? ¾ ¹ 9 ½ º A C ¾ ¾ ? : 9 º ³ 9 C A C ³ µ º ³ Ã Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ Ð Â > ¸ 9 ³ ¹ º Å Ï C ¾ ³ > ³ > Á<br />

¾<br />

³ 9 º Ã ¸ 9 ³ Ç ³ > º ¾ 9 ³ Ã ³ > ´ µ > 9 º º ? A µ Î C Ç Â > : ? º 9 Â C ³ C ¾ ? > È ½ ³ > Ñ ¼ 9 ³ ¾ 9 ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C<br />

Ã<br />

³ > Ç ³ 9 C ³ > º ¼ ³ > ¾ ³ C À ? C C Ñ A : ¾ ? Ã A C ³ µ º ³ Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ 9 C ì A À A C Ç º Ë A Ð ³ > : ³ 9 ¾ ³ C Å ² ? Á<br />

Ð<br />

³ > ¼ 9 > ¾ ¾ 9 ³ & A : : ³ > ¾ ³ Ã ´ µ > 9 º º ³ Ã A C ¾ ¾ 9 ³ Ð Â > ? C ¹ ³ ³ C ¾ ³ æ C 9 µ º ¸ ³ ³ > ³ ê è ³ C ¹ ³ Ð Â C<br />

<br />

 C À > ³ º ³ C ì A à º Ê C ¾ ³ C Ë A > È µ À ¹ ³ ¹ ³ ½ ³ C A C ¾ 9 C Ï ½ à µ C 9 º º ¨ Å T Ë A > Ì ³ > ½ ³ à à ³ > A C ¹ ¾ ³ ><br />

À<br />

½ Ã º > ? À º 9 Â C Ð ³ > ¼ ³ C ¾ ³ º Å<br />

Ï<br />

P x º Ê ¸ º C A > ³ 9 C ³ ³ 9 C Ë 9 ¹ ³ Ì ? > 9 ? ½ ¸ ³ : 9 º<br />

D x = {1,...,12} ³ T C 9 ³ 8 > ? C Ã 9 º 9 Â C Ã > ³ ¸ ? º 9 Â C 9 Ã º ¼ 9 ³ 9 C Ï ½ ½ Å ? A Ç ¹ ³ ½ ? A º Ñ ¾ 9 ³ ´ Ô ³ Ë 9 Á<br />

φ Å ² º Ê ¸ º ? ¸ Ã ³ 9 C Ë 9 ¹ ³ < ³ ¾ 9 C ¹ A C ¹ §<br />

£<br />

x ≠12 Å ² 9 ³ è ³ C ¹ ³ ? C Î C 9 º 9 ? ¸ Ë A Ã º Ê C ¾ ³ C<br />

C ³<br />

5<br />

©<br />

¢<br />

³ Ë ³ 9 ¹ º ³ · Â > : Å<br />

¹<br />

: ? ½ Ã º > ? 9 ³ > º ³ C è Â ¾ ³ ¸ ¸ ¹ 9 ½ º ³ Ã ³ 9 C ³ C î Ç ? ¾ Ñ ¾ ³ > ¾ 9 ³ ´ Ô ³ Ë 9 ë À ? º 9 Â C<br />

§<br />

£<br />

Î<br />

F<br />

<br />

¢<br />

E<br />

E<br />

95<br />

© % # ! ¤ ´ Ô ¸ 9 º î ? º æ<br />

¢<br />

(ŝ 1 ŝ 2 ... sˆ<br />

n ),I,T ê<br />

S 0 := h −1 (ŝ 1) ∩ I<br />

j := 0<br />

£ ¥ i<br />

S<br />

¡<br />

j ∅∧j ½ ³ 9 º ³ º ¾ ³ C ¹ ³ ¹ ³ ½ ³ C ³ C ? ½ Ã º > ? À º ³ C î Ç ? ¾ ì A Ã º ? C ¾ Ç È ><br />

² ³<br />

à º ? C ¾ ? ½ Å Î C ú ³ ¾ ³ : ´ µ > 9 º º ¼ 9 > ¾ ¾ 9 ³ è ³ C ¹ ³<br />

ì Ð A Â C À Â C À > ³ º ³ C ì A Ã º Ê C ¾ ³ C ½ ³ > ³ µ C ³ º Ñ<br />

S i<br />

9 : º ³ ? º ³ ¸ C ½ º ? º C A º C À > ³ Ô C 9 ³ > ³ C A C ¾ ? A þ ³ > ¾ ³ : Æ ¸ ³ 9 µ A C ¹<br />

¾ ³ 9 ¾ : À A ¸ ³ ? Ã > À ³ ì Ã ? ¾ Â > Ã Â ¾<br />

º ¡ æ : 9<br />

n = i > 9 ³ ½ ³ C ³ C º Ê ¸ º ? ¸ ¸ ³ ì A Ã º Ê C ¾ ³ ¾ ³ Ã À Â C À > ³ Á<br />

S i µ Ã ³ ½ ¸ ¸ ³ : > Â Ç C Î Å C ³ ¸ ¸ È Ç > ³ ê<br />

³ 9 C ³ : ´ µ > 9 º º<br />

I 9 Ã º ¾ A > µ {1, 2, 3} ¾ ³ ë C 9 ³ > º Å ³ C Ã 9 µ º ¸ 9 µ ³ > Ç È ¸ ¸ º ¾ ? Ã î > Â ¹ > ? : : ¾ 9 ³ ´ Ô ³ Ë 9 ë À ? º 9 Â C Ñ<br />

J Ý ó ü ß ó Ý Þ 9 Ï C ¹ ³ C Â : : ³ C Ñ ³ 9 C î > Â ¹ > ? : :<br />

ë À ? º 9 Â C<br />

¾ ? À ³ 9 C ³ > ¸ ³ 9 î Ç ? ¾ ³ Ð Â C ³ 9 C ³ : Î C 9 º 9 ? ¸ Ë A Ã º ? C ¾ Ë A ì A Ã º ? C ¾ Ç È > ³ C Å<br />

E ¡<br />

E E<br />

‰ ‚ ‚ ’ <br />

E V \ K O M X M w K O V F _ \ X M w K s F O F M O x M F _ x V w | V \ r r F O<br />

‰ a O | F z y _ _ X F Z V F M O F ‚ F „ F M H I K F K T w K s F K ¢ K M X M \ _ „ a O X Y K s F K \ a O F V V F M H I ‚ \ V F … _ F F V F Z V F M O F<br />

a K F V V F M H I ‚ \ V F<br />

a O X Y K s F ’<br />

² 9 ³ 9 C 9 º 9 ? ¸ ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C<br />

h à ³ 9 æ ¼ 9 ¸ ¸ À È > ¸ 9 µ ê ¾ A > µ <br />

h(x) =⌊(x − 1)/3⌋+1<br />

³ Ã º 9 : : º Å ² ? : 9 º ¼ ³ > ¾ ³ C ¾ 9 ³ : » ¹ ¸ 9 µ ³ C Ñ À Â C À > ³ º ³ C ì A Ã º Ê C ¾ ³ Ë A ¨ ? ½ Ã º > ? À º ³ C<br />

½<br />

A Ã º Ê C ¾ ³ ì<br />

ˆ1, ˆ2, ˆ3, ˆ4 A Ã ? : : ³ C ¹ ³ Ç ? Ã Ã º A C ¾ ¾ ? Ã ? ½ Ã º > ? À º ³ è Â ¾ ³ ¸ ¸ ³ > Ê ¸ º ¾ 9 ³ 9 C Ï ½ ½ Å <br />

Ë<br />

x ≠12<br />

æ<br />

≡ §<br />

£<br />

ˆx ≠ ˆ4 ê Ð ³ > ¸ ³ º Ë º Ñ C Ê : ¸ 9 µ ¾ ³ C î Ç ? ¾ (ˆ1 Ñ ˆ2 Ñ ˆ3 Ñ ˆ4) Å ² 9 ³ è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ ¼ 9 > ¾ ? ¸ Ã Â<br />

¾ 9 ³ Ã ³ C î Ç ? ¾ ? ¸ Ã Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ¸ 9 ³ Ç ³ > C Å ¢ ¤ ! ¦ § © § ½ ³ > ³ µ C ³ º ¾ ? > ? A Ã ¾ 9 ³ 9 C 8 ? ½ ³ ¸ ¸ ³


5<br />

S Å ² ? S 3 = ∅ Ñ ¼ 9 > ¾ ¾ ? Ã Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ À Â > > ³ À º ? ¸ Ã A C ³ µ º ³ Ã<br />

E<br />

5<br />

=<br />

& : & § & % § % & ( & = % ¥ ( & % & Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ³ : 9 º ´ µ ¸ ³ 9 Ç ³ C ¼ ³ > ¾ ³ C Ê C ¸ 9 µ A C Á<br />

£<br />

³ > Ã A µ º ¼ 9 ³ Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ³ Â C ³ ´ µ ¸ ³ 9 Ç ³ C Å ² ? Ë A ¼ 9 > ¾ ¾ ? Ã Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ : 9 º ³ 9 C ³ ><br />

º<br />

A C À º 9 Â C ¢ ¤ ! ¦ § ¤ A C º ³ > Ã A µ º Ñ ¾ 9 ³ ¾ ? Ã Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ? A Ç > Â ¸ ¸ º æ Ð ³ > ¹ ¸ ³ 9 µ ½ ? > : 9 º<br />

·<br />

³ : < ³ > ³ µ C A C ¹ Ã ½ ? A : ½ ³ 9 ¾ ³ > ¢ > 9 Ô À ³ Á ´ º > A À º A > ê A C ¾ ¾ ? C C ? C ? ¸ Â ¹ Ë A ¢ ¤ ! ¦ § © § <br />

¾<br />

Ð Â C ³ > > ³ 9 µ ½ ? > ³ C ì A Ã º Ê C ¾ ³ C ½ ³ > ³ µ C ³ º Å Ö 9 > ¾ 9 C ³ 9 C ³ : ´ µ > 9 º º<br />

S i<br />

½ ³ Ã º 9 : : º Ñ 9 Ã º ¹ ³ C ? A ¼ 9 ³ ½ ³ 9 ¢ ¤ ! ¦ § © § ³ 9 C A C ³ µ º ³ Ã Æ ³ ¹ ³ C Á<br />

S i<br />

³ 9 Ã Ô 9 ³ ¸ ³ > À ? C C º A C ¾ ¾ 9 ³ Ï ½ Ã º > ? À º 9 Â C ¼ 9 > ¾ Ð ³ > Ç ³ 9 C ³ > º Å Î : + ? : ³ C ¾ ³ > Ï A Ã ? > ½ ³ 9 º A C ¹<br />

½<br />

9 > ¾ ? A Ç ¾ ³ C ¹ ³ C ? A ³ C Ï A Ç ½ ? A A C ¾ Ï ½ ¸ ? A Ç Ð Â C ¢ ¤ ! ¦ § ¤ C 9 µ º ¼ ³ 9 º ³ > ³ 9 C ¹ ³ ¹ ? C ¹ ³ C Ñ<br />

¼<br />

¢ & 9 & % & 9 : % & 9 <br />

§<br />

9 < % # <br />

9 > ¾ ³ 9 C ³ Ì ³ > Ç ³ 9 C ³ > A C ¹ ¾ ³ > Ï ½ Ã º > ? À º 9 Â C C » º 9 ¹ Ñ ? º ¾ 9 ³ A > Ã Ô > È C ¹ ¸ 9 µ ³ Ï ½ Ã º > ? À º 9 Â C Ã Á<br />

Ö<br />

½ ½ 9 ¸ ¾ A C ¹ Ë A > ¿ C º Ã º ³ A C ¹ ³ 9 C ³ Ã A C ³ µ º ³ C Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ Ã ¹ ³ Ç È > º Å ² A > µ ¾ 9 ³ ì A Ã ? : Á<br />

?<br />

³ C Ç ? Ã Ã A C ¹ Ð Â C ì A Ã º Ê C ¾ ³ C : È Ã Ã ³ C ? ¸ Ã Â C ³ A ³ ì A Ã º ? C ¾ Ã È ½ ³ > ¹ Ê C ¹ ³ ³ C º Ã º ? C ¾ ³ C Ã ³ 9 C Ñ<br />

:<br />

9 ³ 9 : > 9 ¹ 9 C ? ¸ : Â ¾ ³ ¸ ¸ C 9 µ º ³ C º ? ¸ º ³ C Ã 9 C ¾ Å < ³ 9 ¾ ³ : 9 C < ³ 9 Ã Ô 9 ³ ¸ T ¹ ³ Ë ³ 9 ¹ º ³ C è Â Á<br />

¾<br />

Æ<br />

(ˆ1 Ñ ˆ2 Ñ ˆ3 Ñ ˆ4) Å<br />

12 ³ ¤ 9 Ã 9 º 9 ³ > º Ñ Ð ³ > ³ 9 C 9 ¹ º ¾ 9 ³ ì A Á<br />

96<br />

M<br />

1<br />

2<br />

4<br />

5<br />

7<br />

8<br />

10<br />

11<br />

3<br />

6<br />

9<br />

12<br />

h :<br />

ˆM<br />

ˆ1 ˆ2 ˆ3 ˆ4<br />

‰ ‚ ‚ ’ E<br />

‰ ‚ O X V \ I M F V X F O u w s F _ _ \ a O ‰ ‚ ‚ ’ <br />

? C ¹ ³ ¹ ³ ½ ³ C ³ C è ³ C ¹ ³ C<br />

³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ³ > À ? C C º Å · È > ¾ 9 ³ C A C ³ > Ç Â ¸ ¹ ³ C ¾ ³ Ì ³ > Ç ³ 9 C ³ > A C ¹ ¾ ³ > Ï ½ Ã º > ? À º 9 Â C ¼ 9 > ¾<br />

Æ<br />

9 ³ ¸ ³ º Ë º ³ C 9 µ º ¸ ³ ³ > ³ ì A Ã º ? C ¾ Ã : ³ C ¹ ³<br />

¾<br />

S 2 = {9} C ¾ ¾ 9 ³ & A : : ³ > ¾ ³ Ã Ë A : · ³ ¸ ³ ><br />

A<br />

i =3 ½ ³ > ³ 9 º ¹ ³ Ã º ³ ¸ ¸ º Å<br />

Ç È > ³ C ¾ ³ C<br />

´ µ > 9 º º ³ Ã<br />

i ŝ i h −1 (ŝ i) S i Img(S i,T)<br />

0 ˆ1 {1, 2, 3} {1, 2, 3} {4, 5, 6}<br />

1 ˆ2 {4, 5, 6} {4, 5, 6} {9}<br />

2 ˆ3 {7, 8, 9} {9} ∅<br />

3 ˆ4 {10, 11, 12} ∅ ∅<br />

H w K ¢ ¤ . 1 ¦<br />

E \ ‚ F _ _ F<br />

1 ¨ ‚ F V F H I K F X F u F K | F K<br />

ì A Ã º ? C ¾ Ã :<br />

³ C ¹ ³ C<br />

³ 9 C ³ ¸ ³ ³ > ³ è ³ C ¹ ³<br />

à  C ¾ ³ > C<br />

? A Ç Ð ³ > ¼ 9 ³ Ã ³ C Å<br />

³ ¸ ³ C º Ã º ³ º ³ 9 C Ã Â ¸ µ ³ > C ³ A ³ > ½ ³ > ¹ ? C ¹ ¾ A > µ ¾ 9 ³ ì A Ã ? : : ³ C Ç ? Ã Ã A C ¹ ¾ ³ > À Â C À > ³ º ³ C<br />

¾ ¸<br />

à º Ê C ¾ ³ ì A<br />

7, 8, 9 ˆ3 ¾ ³ : ? ½ Ã º > ? À º ³ C ì A Ã º ? C ¾ æ Ð ¹ ¸ Å Ï ½ ½ Å ê Å Ö Ê > ³ C ¾ 9 : À Â C À > ³ Á<br />

A Ë<br />

7 A C ¾ 9 ½ ³ Ã º ³ º A C ¾ ¾ ? : 9 º À ³ 9 C<br />

º ³ C è Â ¾ ³ ¸ ¸ À ³ 9 C ³ Ì ³ > ½ 9 C ¾ A C ¹ Ë ¼ 9 Ã µ ³ C ì A Ã º ? C ¾<br />

î Ç ? ¾ Ë A ¾ ³ : ? ¸ Ã A C ³ > ¼ È C Ã µ º Ã Ô ³ Ë 9 ë Ë 9 ³ > º ³ C ì A Ã º ? C ¾<br />

à ? : : ³ C Ç ? à à A C ¹ ¾ 9 ³ à ³ ì A à º Ê C ¾ ³ A C ¾ 9 > ³ 8 > ? C à 9 º 9  C ³ C A C ¾ ³ > Ë ³ A ¹ º à  ¾ ? à A C ³ µ º ³<br />

³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸


ˆ3 Ñ ¾ ³ > ¾ ³ Ã ? ¸ ½<br />

A µ ? ¸ Ã ¢ & ¥ ( & 9 ¡<br />

© < % ½ ³ Ë ³ 9 µ C ³ º ¼ 9 > ¾ Å ² 9 ³ ¹ ³ C ? A ³ > ³ < ³ º > ? µ º A C ¹ ¾ ³ > ? A Ç ¾ ³ C<br />

?<br />

³ ¸ ³ > Ë A Ã º ? C ¾ ? ½ ¹ ³ ½ 9 ¸ ¾ ³ º ³ C À Â C À > ³ º ³ C ì A Ã º Ê C ¾ ³ Ë ³ 9 ¹ º Ñ ¾ ? Ã Ã 9 ³ 9 C ¾ > ³ 9 Ð ³ > Ã µ 9 ³ ¾ ³ C ³<br />

·<br />

Ä Ô ³ C ³ 9 C ¹ ³ º ³ 9 ¸ º ¼ ³ > ¾ ³ C À » C C ³ C ¤<br />

8<br />

9 Ã º Ð Â C ¾ ³ C Î C 9 º 9 ? ¸ Ë A Ã º Ê C ¾ ³ C ? A Ã ³ > > ³ 9 µ ½ ? > Ñ ? º ? ½ ³ ><br />

9<br />

? Ã Ã ¾ 9 ³ ¿ 9 C ¹ ? C ¹ Ã Á A C ¾ ¾ 9 ³ Ï A Ã ¹ ? C ¹ Ã Ë A Ã º Ê C ¾ ³ C 9 µ º : ³ > ? A Ç ¾ ³ C Ã ³ ¸ ½ ³ C ? ½ Ã º > ? À º ³ C<br />

¾<br />

A Ã º ? C ¾ ? ½ ¹ ³ ½ 9 ¸ ¾ ³ º ¼ ³ > ¾ ³ C Å ² ? ¾ A > µ ¼ 9 > ¾ ¾ ³ > Ë A Ã Ê º Ë ¸ 9 µ ³ ì A Ã º ? C ¾ Ã È ½ ³ > ¹ ? C ¹ ³ ¸ 9 : 9 Á<br />

ì<br />

9 ³ > º A C ¾ ¾ ? Ã A C ³ µ º ³ Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ À ? C C C 9 µ º : ³ > ? A Ç º > ³ º ³ C Å ² 9 ³ 9 > > ³ ¸ ³ Ð ? C º ³ C<br />

C<br />

A Ã º Ê C ¾ ³ À » C C ³ C ½ ³ 9 ¾ 9 ³ Ã ³ > Ï A Ç º ³ 9 ¸ A C ¹ ½ ³ ¸ 9 ³ ½ 9 ¹ Ð ³ > º ³ 9 ¸ º ¼ ³ > ¾ ³ C Å : ¾ ? Ã è Â ¾ ³ ¸ ¸ ½ ³ 9<br />

ì<br />

³ > Ì ³ > Ç ³ 9 C ³ > A C ¹ C 9 µ º A C C » º 9 ¹ À Â : Ô ¸ ³ ³ > Ë A : ? µ ³ C Ñ Ã Â ¸ ¸ ¾ 9 ³ Ï A Ç º ³ 9 ¸ A C ¹ : » ¹ ¸ 9 µ Ã º<br />

¾<br />

à Û Ã ³ 9 C Ñ ¾ Å Å Ë A > ¿ C º Ã º ³ A C ¹ : » ¹ ¸ 9 µ Ã º ¼ ³ C 9 ¹ ³ > Ñ C ³ A ³ > ? ½ Ã º > ? À º ³ > ì A Ã º Ê C ¾ ³ Ç È > ³ C Å<br />

å<br />

C Ï ½ ½ Å Å T Ã 9 C ¾ Ë ¼ ³ 9 è » ¹ ¸ 9 µ À ³ 9 º ³ C ¹ ³ Ë ³ 9 ¹ º Ñ ¼ 9 ³ ¾ ? Ã ? ½ Ã º > ? À º ³ è Â ¾ ³ ¸ ¸ ? A Ã < ³ 9 Ã Ô 9 ³ ¸<br />

Î<br />

Ð ³ > Ç ³ 9 C ³ > º ¼ ³ > ¾ ³ C À ? C C Ñ A : ¾ ? Ã Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ Ë A ³ C º Ç ³ > C ³ C Å < ³ 9 ¾ ³ Ì ³ > Ç ³ 9 C ³ > A C ¹ ³ C<br />

T<br />

4<br />

‚ ‚ ’ E E ‰<br />

9 ³ ´ A µ ³ C ? µ ¾ ³ > ¹ > » ½ Ã º ³ C Ì ³ > Ç ³ 9 C ³ > A C ¹ Ñ ¼ ³ ¸ µ ³ ¾ 9 ³ ¿ 9 C ¹ ? C ¹ Ã Ë A Ã º Ê C ¾ ³ ¾ ³ Ã<br />

²<br />

³ ¸ ³ > Ë A Ã º ? C ¾ ³ Ã Ð Â ¸ ¸ Ã º Ê C ¾ 9 ¹ Ð Â C ¾ ³ C Ï A Ã ¹ ? C ¹ Ã Ë A Ã º Ê C ¾ ³ C º > ³ C C º Ñ 9 Ã º ú ³ ¾ Â µ À ³ 9 C ³ Ã Á<br />

·<br />

³ ¹ Ã ³ 9 C ³ º > 9 Ð 9 ? ¸ ³ Ï A Ç ¹ ? ½ ³ Å Î C ¼ 9 > ¾ Ã Â ¹ ? > C ? µ ¹ ³ ¼ 9 ³ Ã ³ C Ñ ¾ ? Ã Ã ¾ ? Ã î > Â ½ ¸ ³ : ¾ ³ ><br />

¼<br />

î ? > º 9 º 9 Â C 9 ³ > A C ¹ 9 C é ¸ 9 ¢ A ³ C ? A Ç ¾ 9 ³ Ã ³ Ã î > Â ½ ¸ ³ : > ³ ¾ A Ë 9 ³ > º ¼ ³ > ¾ ³ C À ? C C A C ¾ Ã Â : 9 º<br />

<br />

A Ã Ã ³ > ¾ ³ C ¿ 9 C Á A C ¾ Ï A Ã ¹ ? C ¹ Ã Ë A Ã º Ê C ¾ ³ C ? A µ C Â µ ¾ 9 ³ 9 > > ³ ¸ ³ Ð ? C º ³ C ì A Ã º Ê C ¾ ³ ½ ³ Á<br />

?<br />

È µ À Ã 9 µ º 9 ¹ ³ C : A Ã Ã Å ² ? ¾ 9 ³ Ã ³ > ì A Ã º ? C ¾ Ã º Ä Ô Ã Â ¼ Â ¸ Ë A Ã ? : : ³ C : 9 º ¿ 9 C ¹ ? C ¹ Ã Ë A Ã º Ê C Á<br />

><br />

³ C ? ¸ Ã ? A µ : 9 º Ï A Ã ¹ ? C ¹ Ã Ë A Ã º Ê C ¾ ³ C ? A Ç º > ³ º ³ C ¾ ? > Ç A C ¾ Ã 9 C ¾ ú ³ C ? µ ¾ ³ > À Â C À > ³ º ³ C<br />

¾<br />

9 C º ³ 9 ¸ A C ¹ A C º ³ > Ã µ 9 ³ ¾ ¸ 9 µ Ð 9 ³ ¸ ³ ? ½ Ã º > ? À º ³ ì A Ã º Ê C ¾ ³ ³ > ¹ ³ ½ ³ C À » C C ³ C Ñ : A Ã Ã Ô > 9 C Ë 9 Ô 9 Á<br />

¿<br />

¸ ¸ ú ³ ¾ ³ : » ¹ ¸ 9 µ ³ Ï A Ç º ³ 9 ¸ A C ¹ ¾ ³ > 9 > > ³ ¸ ³ Ð ? C º ³ C ì A Ã º Ê C ¾ ³ ½ ³ º > ? µ º ³ º ¼ ³ > ¾ ³ C Å ² 9 ³ Ã 9 Ã º<br />

³<br />

³ ¾ Â µ Ë A ? A Ç ¼ Ê C ¾ 9 ¹ Ñ A : Ô > ? À º 9 À ? ½ ³ ¸ Ë A Ã ³ 9 C Å é ¸ ? > À ³ A C ¾ Æ > A : ½ ³ > ¹ Ã µ ¸ ? ¹ ³ C ¾ ? ³ ><br />

ú<br />

4<br />

h à Â<br />

97<br />

² 9 ³ > Ã ? µ ³ Ç È > ¾ ? Ã Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ¸ 9 ³ ¹ º ? ¸ Ã Â 9 : ? ½ Ã º > ? À º ³ C ì A Ã º ? C ¾<br />

Å ² ³ > % : < : <br />

©<br />

© < %<br />

³ 9 C ³ ½ ³ > ¹ Ê C ¹ ³ Ë A ¾ ³ : C Ê µ Ã º ³ C ? ½ Ã º > ? À º ³ C ì A Ã º ? C ¾ 9 : Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ Å<br />

À<br />

Å ² ³ ><br />

§ © : < : <br />

©<br />

© < %<br />

<br />

7 Ã º C 9 µ º ³ > > ³ 9 µ ½ ? > Ñ ? º ú ³ ¾ Â µ ½ ³ > ¹ Ê C ¹ ³ Ë A :<br />

9<br />

Ê µ Ã º ³ C ? ½ Ã º > ? À º ³ C ì A Ã º ? C ¾ 9 : Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ Å<br />

C<br />

Å ² ³ > % 9 9 & ( & < & © < %<br />

T<br />

8 Ã º ¼ ³ ¾ ³ > ¿ 9 C ¹ ? C ¹ Ã Á C Â µ Ï A Ã ¹ ? C ¹ Ã Ë A Ã º ? C ¾ A C ¾<br />

9<br />

Ã Ô 9 ³ ¸ º Ç È > ¾ 9 ³ ¿ 9 à º ³ C Ë ¾ ³ Ã Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ à À ³ 9 C ³ +  ¸ ¸ ³ Å<br />

² ? Ã ì 9 ³ ¸ ¾ ³ > Ì ³ > Ç ³ 9 C ³ > A C ¹ : A Ã Ã ? ¸ Ã Â Ã ³ 9 C Ñ ¾ 9 ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C<br />

? ½ Ë A Ê C ¾ ³ > C Ñ<br />

> ³ A ¹ ³ C ¾ ? ½ ³ 9 C A > ³ 9 C ³ C Ë A Ã Ê º Ë ¸ 9 µ ³ C ? ½ Ã º > ? À º ³ C ì A Ã º ? C ¾ A C ¾ Ã 9 C ¾ ¾ ? ³ > Ã Â ¹ > Â ½<br />

³ Ë<br />

³ C A > 9 > ¹ ³ C ¾ : » ¹ ¸ 9 µ Å ¿ 9 C ³ ¾ > 9 º º ³ Ð Â > Ã º ³ ¸ ¸ ½ ? > ³ Ì ³ > Ç ³ 9 C ³ > A C ¹ À » C C º ³ ¾ 9 ³ ì A Ã º ? C ¾ ³<br />

¼ 9<br />

7 Ñ<br />

8 9 ¾ ú ³ ¼ ³ 9 ¸ Ã Ë A ³ 9 C Ë ³ ¸ C ³ C ? ½ Ã º > ? À º ³ C ì A Ã º Ê C ¾ ³ C ? ½ ½ 9 ¸ ¾ ³ C Á 9 C ¾ 9 ³ Ã ³ : · ? ¸ ¸ ¼ È > ¾ ³ C<br />

C A<br />

ú ³ ¾ Â µ Ë ¼ ³ 9 C ³ A ³ ì A Ã º Ê C ¾ ³ ³ C º Ã º ³ ³ C Ñ ¼ ? Ã A C C » º 9 ¹ 9 Ã º Å<br />

1<br />

4<br />

7<br />

10<br />

1<br />

4<br />

7<br />

10<br />

2<br />

3<br />

5<br />

6<br />

9<br />

8<br />

11<br />

12<br />

2<br />

3<br />

5<br />

6<br />

8<br />

9<br />

11<br />

12<br />

ˆ1 ˆ2 ˆ3a ˆ3b ˆ4<br />

ˆ1 ˆ2 ˆ3a ˆ3b ˆ4<br />

3 ‚<br />

3 \<br />

Ž F M u | _ M H I ‹ F M X F K „ a V H F V z F M K F V a K | F K s F V ‰ ‚ O X V \ ‹ X M w K<br />

5 F<br />

9 ³ ´ A µ ³ C ? µ ¾ ³ > ¹ > » ½ Ã º ³ C Ì ³ > Ç ³ 9 C ³ > A C ¹ & î Á ? > º 9 Ã º Å ² ? Ë A º > Ê ¹ º ? A Ã Ã ³ > ¾ ³ > : ³ > Á<br />

¾<br />

9 : ³ C Ã 9 Â C ? ¸ ³ C Â C Ã º > A À º 9 Â C Ð Â C<br />

¾<br />

h  > ? ¸ ¸ ³ : ¾ 9 ³ 8 ? º à ? µ ³ ½ ³ 9 Ñ ¾ ? à ¾ 9 ³ Ï A Ç º ³ 9 ¸ A C ¹<br />

Ð


¸ Ã ù ³ A > 9 Ã º 9 À Ð Â > Ñ ? ¸ ¸ ³ 9 > > ³ ¸ ³ Ð ? C º ³ C ì A Ã º Ê C ¾ ³ ³ ½ ³ C Ç ? ¸ ¸ Ã ? ¸ Ã Ï A Ã ¹ ? C ¹ Ã Ë A Ã º Ê C ¾ ³ Ë A ½ ³ Á<br />

?<br />

> ? µ º ³ C A C ¾ ³ 9 C ³ ¾ ? ¾ A > µ C 9 µ º ¹ ? C Ë : ? ¤ 9 : ? ¸ ¹ > Â ½ ³ Í » Ã A C ¹ 9 C ¢ ? A Ç Ë A C ³ : ³ C Å<br />

º<br />

9 º ¾ 9 ³ Ã ³ > ù ³ A > 9 Ã º 9 À > ³ ¾ A Ë 9 ³ > º Ã 9 µ ¾ 9 ³ ´ A µ ³ C ? µ ³ 9 C ³ > Ï A Ç º ³ 9 ¸ A C ¹ ? A Ç ¾ 9 ³ 8 > ³ C C A C ¹<br />

è<br />

 C ò L Ý ó Æ > A Ô Ô ³ C Ñ ¾ ³ C ¿ 9 C ¹ ? C ¹ Ã Ë A à º Ê C ¾ ³ C ? A Ç ¾ ³ > ³ 9 C ³ C ´ ³ 9 º ³ A C ¾ ¾ ³ C 9 > > ³ ¸ ³ Ð ? C º ³ C<br />

Ð<br />

C ¾ Ï A Ã ¹ ? C ¹ Ã Ë A Ã º Ê C ¾ ³ C ? A Ç ¾ ³ > ? C ¾ ³ > ³ C ´ ³ 9 º ³ æ ¼ 9 ³ 9 C Ï ½ ½ Å ? ê Å<br />

A<br />

9 ³ Ã ³ Ã Ð ³ > ³ 9 C Ç ? µ º ³ î > Â ½ ¸ ³ : 9 Ã º 9 C Ô Â ¸ Ä C Â : 9 ³ ¸ ¸ ³ > ì ³ 9 º ¸ » Ã ½ ? > Å ² ? Ë A ¼ 9 > ¾ Ð Â C ¾ ³ :<br />

²<br />

ŝ ? A Ã ¹ ³ ¹ ? C ¹ ³ C Ñ ¾ ³ > Ð Â C ¾ ³ > · A C À º 9 Â C ¢ ¤ ! ¦ § ¤ § Ë A > È µ À Á<br />

 ¸ Ä C  : 9 ³ ¸ ¸ ³ > Í ? A Ç Ë ³ 9 º 9 C î à ³ A ¾  µ  ¾ ³ 9 à º 9 C T A C ¾ ¹ ³ ¹ ³ ½ ³ C Ñ 9 : + ? : ³ C ¾ ³ > Ï A à Á<br />

Ô<br />

> ½ ³ 9 º A C ¹ ¼ 9 > ¾ Ã ³ 9 C ³ ² ? > Ã º ³ ¸ ¸ A C ¹ ? A Ç ¾ 9 ³ ´ µ 9 ¸ ¾ ³ > A C ¹ ¾ ³ > Æ > A C ¾ 9 ¾ ³ ³ ½ ³ Ã µ > Ê C À º Å<br />

?<br />

A > µ ¾ 9 ³ Ì ³ > Ç ³ 9 C ³ > A C ¹ ¼ 9 > ¾ ? ¸ Ã Â ¾ 9 ³ ì A Ã ? : : ³ C Ç ? Ã Ã A C ¹ Ð Â C ì A Ã º Ê C ¾ ³ C Ñ ¾ 9 ³ ½ ³ 9<br />

²<br />

³ > Ö ? ¸ ¾ ³ > 9 C 9 º 9 ? ¸ ³ C Ï ½ Ã º > ? À º 9 Â C ³ 9 C ¹ ³ Ç È > º ¼ A > ¾ ³ Ñ Ã µ > 9 º º ¼ ³ 9 Ã ³ ¼ 9 ³ ¾ ³ > ? A Ç ¹ ³ Â Á<br />

¾<br />

³ C Å ² 9 ³ Ã ³ Ï A Ç ³ ½ A C ¹ ³ > Ç Â ¸ ¹ º Ã ³ ¸ ³ À º 9 Ð ? C ¾ ³ C ú ³ C 9 ¹ ³ C ´ º ³ ¸ ¸ ³ C ¾ ³ Ã è Â ¾ ³ ¸ ¸ Ã Ñ ? C ¾ ³ C ³ C<br />

½<br />

9 ³ ì A Ã ? : : ³ C Ç ? Ã Ã A C ¹ Ë A A C ³ µ º ³ C Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ³ C ¹ ³ ¹ ³ C ¾ 9 ³ ´ Ô ³ Ë 9 ë À ? º 9 Â C Ç È > º Å<br />

¾<br />

9 º ¾ 9 ³ Ã ³ > ´ 9 µ º ¼ ³ 9 Ã ³ ¼ 9 > ¾ À ¸ ? > Ñ ¾ ? Ã Ã ¾ 9 ³ Ì ³ > Ç ³ 9 C ³ > A C ¹ ¾ ³ Ã è Â ¾ ³ ¸ ¸ Ã C 9 µ º ½ ³ ¸ 9 ³ ½ 9 ¹<br />

è<br />

Ç º ³ > Ç Â ¸ ¹ ³ C À ? C C Ñ ¾ ³ C C 9 > ¹ ³ C ¾ ¼ ? C C Ã 9 C ¾ ö Þ Þ Ý Ë A Ã ? : : ³ C ¹ ³ Ç ? Ã Ã º ³ C ì A Ã º Ê C ¾ ³ ¼ 9 ³ ¾ ³ ><br />

Â<br />

h 9 Ã º 9 Ã Â : Â > Ô Ë A > Î ¾ ³ C º 9 º Ê º Ã Ç A C À º 9 Â C A C ¾ ¾ ? Ã<br />

Ô ³ Ë 9 ë À ? º 9 Â C ³ > Ç È ¸ ¸ º Â ¾ ³ > C 9 µ º Å ² ? Ã Ì ³ > Ç ? > ³ C Ð Â C é ¸ ? > À ³ 9 Ã º ¾ ? ³ > - Û Þ Þ ü ÷ C ä Ü ó å Ñ ¾ Å Å<br />

´<br />

à º ³ > : 9 C 9 ³ > º ? A Ç ú ³ ¾ ³ C · ? ¸ ¸ A C ¾ ¸ 9 ³ Ç ³ > º æ ? A à > ³ 9 µ ³ C ¾ + ³ à à  A > µ ³ C Ð Â > ? A à ¹ ³ à ³ º Ë º ê 9 : Á<br />

³<br />

³ > ³ 9 C À Â > > ³ À º ³ Ã ¿ > ¹ ³ ½ C 9 Ã Å Î C ¾ ³ C : ³ 9 Ã º ³ C · Ê ¸ ¸ ³ C À ? C C ? A µ Ã µ Â C ¼ ³ Ã ³ C º ¸ 9 µ Ð Â ><br />

:<br />

³ > Ð Â ¸ ¸ Ã º Ê C ¾ 9 ¹ ³ C Ì ³ > Ç ³ 9 C ³ > A C ¹ ¾ ³ Ã ? ½ Ã º > ? À º ³ C è Â ¾ ³ ¸ ¸ Ã ³ 9 C ³ Ï A Ã Ã ? ¹ ³ È ½ ³ > ¾ ? Ã > 9 Á<br />

¾<br />

9 C ? ¸ : Â ¾ ³ ¸ ¸ ¹ ³ ¸ 9 ³ Ç ³ > º ¼ ³ > ¾ ³ C A C ¾ ¾ 9 ³ è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ ³ > Ç Â ¸ ¹ º ¼ 9 ³ ½ ³ ? ½ Ã 9 µ º 9 ¹ º C A > ? A Ç<br />

¹<br />

9 C ³ : Ã º ? > À Ð ³ > ³ 9 C Ç ? µ º ³ C ? ½ Ã º > ? À º ³ C è Â ¾ ³ ¸ ¸ Å<br />

³<br />

¡ ¥ ­ « ® £ ® ¬ ® ¥ ® ¯ ¡ ¥ ¯ ° ¬ ±<br />

C ¾ ³ > Ð Â > ¸ 9 ³ ¹ ³ C ¾ ³ C Ï A Ã ? > ½ ³ 9 º A C ¹ ¼ A > ¾ ³ ¾ 9 ³ 9 C ¾ ³ > è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ ¼ ³ 9 º Ð ³ > ½ > ³ 9 º ³ Á<br />

Î<br />

³ 8 ³ µ C 9 À ¾ ³ > Ï ½ Ã º > ? À º 9 Â C Ð Â > ¹ ³ Ã º ³ ¸ ¸ º A C ¾ ³ 9 C 9 ¹ ³ ¾ ³ > Ë A ¹ ³ » > 9 ¹ ³ C º ³ Â > ³ º 9 Ã µ ³ C<br />

º<br />

³ Ã µ > 9 ³ ½ ³ C Å Ï C ? C ¾ ³ 9 C ³ Ã À Â C À > ³ º ³ C Ì ³ > Ç ? > ³ C Ã ¼ A > ¾ ³ ¹ ³ Ë ³ 9 ¹ º Ñ ¼ 9 ³ ¾ 9 ³ Ï ½ Ã º > ? À º 9 Á<br />

½<br />

C Ë A > ? A º Â : ? º 9 Ã µ ³ C î > È Ç A C ¹ ¹ > » þ ³ > ³ > ´ Ä Ã º ³ : ³ ³ 9 C ¹ ³ Ã ³ º Ë º ¼ ³ > ¾ ³ C À ? C C Å ² ? Ã ¾ ? ½ ³ 9<br />

Â<br />

³ ? C ¾ ³ ¸ º ³ Ì ³ > Ç ? > ³ C Ð Â C é ¸ ? > À ³ A C ¾ Æ > A : ½ ³ > ¹ ¼ A > ¾ ³ ? A Ã ¹ ³ ¼ Ê ¸ º Ñ ¾ ? ³ Ã ³ 9 C 9 ¹ ³ Ç È ><br />

½<br />

³ C ¿ 9 C Ã ? º Ë 9 : < ³ > ³ 9 µ ¾ ³ > è Â ¾ ³ ¸ ¸ Ô > È Ç A C ¹ Ã ³ > 9 C º ³ > ³ Ã Ã ? C º ³ ¿ 9 ¹ ³ C Ã µ ? Ç º ³ C ? A Ç ¼ ³ 9 Ã º Å<br />

¾<br />

9 C ¹ > Â Ã Ã ³ > Ì Â > º ³ 9 ¸ ¾ ³ Ã Ð ³ > ¼ ³ C ¾ ³ º ³ C Ï C Ã ? º Ë ³ Ã 9 Ã º ½ ³ 9 Ã Ô 9 ³ ¸ Ã ¼ ³ 9 Ã ³ ¾ ? > 9 C Ë A Ã ³ ³ C Ñ ¾ ? Ã Ã<br />

¿<br />

9 ³ Ï ½ Ã º > ? À º 9 Â C ¾ ³ Ã > 9 ¹ 9 C ? ¸ : Â ¾ ³ ¸ ¸ Ã Ð Â ¸ ¸ ? A º Â : ? º 9 Ã µ ? ½ ¸ Ê A Ç º Å ² 9 ³ 9 C 9 º 9 ? ¸ ³ Ï ½ Ã º > ? À Á<br />

¾<br />

9 Â C ¼ 9 > ¾ ¾ 9 > ³ À º ¾ A > µ Ï C ? ¸ Ä Ã ³ ¾ ³ Ã è Â ¾ ³ ¸ ¸ Ô > Â ¹ > ? : : Ã ¹ ³ C ³ > 9 ³ > º Ñ ¼ ³ ¸ µ ³ Ã Â C ³ 9 C<br />

º<br />

 : ¿ C º ¼ 9 µ À ¸ ³ > ¹ ³ ¸ 9 ³ Ç ³ > º ¼ ³ > ¾ ³ C : A þ ³ à 9 à º ? ¸ à  À ³ 9 C ³ : ? C A ³ ¸ ¸ ³ ì A à ? º Ë ? > ½ ³ 9 º C » º 9 ¹ Å<br />

Ð<br />

9 ³ ³ Ð ³ C º A ³ ¸ ¸ C ? µ Ç Â ¸ ¹ ³ C ¾ ³ Ì ³ > Ç ³ 9 C ³ > A C ¹ ¾ ³ > Ï ½ Ã º > ? À º 9 Â C ³ > Ç Â ¸ ¹ º ¾ A > µ C º ³ > Ã A Á<br />

²<br />

A C ¹ Ð Â C Æ ³ ¹ ³ C ½ ³ 9 Ã Ô 9 ³ ¸ ³ C Ñ ³ > Ç Â > ¾ ³ > º ? ¸ Ã Â ³ ½ ³ C Ç ? ¸ ¸ Ã À ³ 9 C : ³ C Ã µ ¸ 9 µ ³ Ã ¿ 9 C ¹ > ³ 9 Ç ³ C Å<br />

µ<br />

9 C ¼ ³ 9 º ³ > ³ > Ì Â > º ³ 9 ¸ ¾ ³ Ã Ì ³ > Ç ? > ³ C Ã 9 Ã º Ñ ¾ ? Ã Ã ¾ 9 ³ Ð ³ > ¼ ³ C ¾ ³ º ³ Ï ½ Ã º > ? À º 9 Â C 9 : Ì ³ > Á<br />

¿<br />

¸ ³ 9 µ Ë A ? C ¾ ³ > ³ C Ï C Ã Ê º Ë ³ C Ñ ¼ 9 ³ Ë A : < ³ 9 Ã Ô 9 ³ ¸ ¾ ³ > µ Â C ³ Â Ç 9 C A ³ C µ ³ > ³ ¾ A µ º 9 Â C <br />

¹<br />

98<br />

? ½ Ã º > ? À º ³ C · ³ ¸ ³ > Ë A Ã º ? C ¾<br />

³ ¸ 9 ³ Ç ³ > º ¼ 9 > ¾ Å ² A > µ ¹<br />

ĥ(ŝ) −1 9 > ¾ ¾ 9 ³ è ³ C ¹ ³ ? ¸ ¸ ³ > À Â C À > ³ º ³ C ì A Ã º Ê C ¾ ³ ½ ³ Ã º 9 : : º Ñ<br />

¼ 9 ³ ? A Ç ¾<br />

ŝ ½ ¹ ³ ½ 9 ¸ ¾ ³ º ¼ ³ > ¾ ³ C Å ² 9 ³ ¿ 9 C º ³ 9 ¸ A C ¹ ¾ 9 ³ Ã ³ > è ³ C ¹ ³ 9 C ¿ 9 C ¹ ? C ¹ Ã Ë A Ã º Ê C ¾ ³ A C ¾<br />

?<br />

A ¹ ? C ¹ Ã Á ½ Ë ¼ Å 9 > > ³ ¸ ³ Ð ? C º ³ ì A Ã º Ê C ¾ ³ ¼ 9 > ¾ ¾ A > µ ¢ ¤ ! ¦ § ¤ § ¹ ¸ ³ 9 µ : 9 º ½ ³ Ã º 9 : : º <br />

Ï Ã<br />

³ ¿ 9 C ¹ ? C ¹ Ã Ë A Ã º Ê C ¾ ³ Ã 9 C ¾ ¹ ³ C ? A 9 C ¾ ³ > Ë A > È µ À ¹ ³ ¸ 9 ³ Ç ³ > º ³ C è ³ C ¹ ³<br />

² ³ 9 C º ? ¸ º ³ C Ñ 9 ><br />

S i<br />

Â Ô ³ : ³ C º ¢ : ¸<br />

ĥ(ŝ) −1 C ³ º Ê ¸ º ¾ 9 ³ ½ ³ 9 ¾ ³ C ? C ¾ ³ > ³ C ì A Ã º ? C ¾ Ã º Ä Ô ³ C Å ì A > 8 > ³ C C A C ¹<br />

− S i<br />

à ³ > Æ > A Ô Ô ³ C ¼ ³ > ¾ ³ C C A C ¾ 9 ³ 9 C Æ ¸ ³ 9 µ A C ¹ ¾ ³ ë C 9 ³ > º ³ C 8 ³ 9 ¸ Ç A C À º 9  C ³ C<br />

¾ ? 9 C ¹ ³ Á<br />

³<br />

h i<br />

h i<br />

½ 9 Ã ³ > ? A Ç ¾ ³ C Ã ³ ¸ ½ ³ C Ö<br />

³ ¾ ³ C C A C ? A Ç Ð ³ > Ã µ 9 ³ ¾ ³ C ³ Ö ³ > º ³ ? ½ ¹ ³ ½ 9 ¸ ¾ ³ º Ñ ¼ ³ C C ³ 9 C ³ > ¾ ³ > ì A Ã º Ê C ¾ ³ ¿ ¸ ³ : ³ C º<br />

¼ ><br />

C Ð 9 Â Ã º A C ¾ ¾ ³ > ? C ¾ ³ > ³ C 9 µ º Å ² 9 ³ ¾ ³ º ? 9 ¸ ¸ 9 ³ > º ³ < ³ Ã µ > ³ 9 ½ A C ¹ ³ 9 C ³ Ã Ì ³ > Ç ? > ³ C Ã : 9 º<br />

S i<br />

Ô ? Ã Ã º Å ì A Ã º ? C ¾ Ã Ô ? ? > ³ Ñ ¾ 9 ³ Ð Â C ¾ ³ C<br />

³ > º ³ ? ½ ¹ ³ ½ 9 ¸ ¾ ³ º ¼ A > ¾ ³ C Ñ<br />

¹ ³ º > ³ C C º Ñ ¾ 9 ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C<br />

½ Ã º > ? À º ³ è Â ¾ ³ ¸ ¸ 9 Ã Â : Â > Ô Ë A : > 9 ¹ 9 C ? ¸ : Â ¾ ³ ¸ ¸ Å ´ Ô Ê º ³ Ã º ³ C Ã ¾ ? C C 9 Ã º ? ½ ³ > ? A Ã ¾ ³ ><br />

?<br />

ˆM 9 C ³ ³ ¤ ? À º ³ Ï ½ Ã º > ? À º 9 Â C ¹ ³ ¼ Â > ¾ ³ C Ñ A C ¾ ¾ 9 ³ è Â ¾ ³ ¸ ¸ Á<br />

ˆM ³ 9 ³ Ç ³ > º ³ 9 C ³ ¾ ³ ë C 9 º 9 Ð ³ Ï A Ã Ã ? ¹ ³ ¾ ? > È ½ ³ > Ñ Â ½ ¾ ? Ã > 9 ¹ 9 C ? ¸ : Â ¾ ³ ¸ ¸ ¾ 9 ³<br />

¸<br />

À Â C Ã ³ > Ð ? º 9 Ð ³ C<br />

Ï ½ Ã º > ? À º 9 Â C<br />

Ô > È Ç A C ¹<br />

Ð Â C<br />

Æ > A C ¾ ¸ ? ¹ ³ C 9 C À ¸ A Ã 9 Ð ³ ¾ ³ > < ³ ¹ > 9 ³ ¾ ³ Ã è<br />

 ¾ ³ ¸ ¸ Ã Ñ ¾ ³ > ´ Ô ³ Ë 9 ë À ? º 9  C A C ¾ ¾ ³ > ´ 9 : A ¸ ? º 9  C<br />

æ é Î ê Â ¾ ³ > ³ 9 C ³ > Ç > È > ³ > ³ C Ì ? > 9 ? C º ³ ¾ ³ Ã 9 ³ > ¹ ³ Ë ³ 9 ¹ º ³ C Ï C Ã ? º Ë ³ Ã T Ñ 9 C ½ ³ Ã Â C ¾ ³ > Ã


³ 9 C ³ C Ï ½ Ã º A Ç A C ¹ ³ C ¹ ³ ¼ Ê ¸ º ¼ ³ > ¾ ³ C À ? C C Å Ö Ê > ³ C ¾ ½ ³ 9 é ¡ Î ³ 9 C Ë ³ ¸ C ³ Ì ? > 9 ? ½ ¸ ³ C C A ><br />

Ç<br />

C º ¼ ³ ¾ ³ > Ð Â ¸ ¸ Ã º Ê C ¾ 9 ¹ ³ > ? ¸ º ³ C Â ¾ ³ > Ð Â ¸ ¸ Ã º Ê C ¾ 9 ¹ ? ½ Ã º > ? 9 ³ > º ¼ ³ > ¾ ³ C À » C C ³ C A C ¾ ¾ 9 ³ 9 C<br />

³<br />

T ¦ ³ 9 C ¹ ³ Ã ³ º Ë º ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C À ³ 9 C ³ Ï ½ Ê C ¹ 9 ¹ À ³ 9 º ³ C Ë ¼ 9 Ã µ ³ C : ³ > ³ > ³ C Ì ? Á<br />

¢<br />

9 ? ½ ¸ ³ C ½ ³ > È µ À Ã 9 µ º 9 ¹ º Ñ 9 Ã º ¾ ? Ã 9 ³ > ¹ ³ Ë ³ 9 ¹ º ³ Ì ³ > Ç ? > ³ C 9 C ¾ ³ > Í ? ¹ ³ Ñ ³ 9 C Ë ³ ¸ C ³ ¿ ¸ ³ : ³ C º ³<br />

><br />

A Ã ¾ ³ : Ö ³ > º ³ ½ ³ > ³ 9 µ Ð Â C Ì ? > 9 ? ½ ¸ ³ C ú ³ C ? µ ¾ ³ C ¿ > Ç Â > ¾ ³ > C 9 Ã Ã ³ C Ë A Ã ? : : ³ C Ë A Ç ? Ã Ã ³ C<br />

?<br />

¾ ³ > ¹ ³ º > ³ C C º Ë A ? ¸ º ³ C Å ² ? ½ ³ 9 À » C C ³ C ? A Ã Ã ³ > ¾ ³ : Ï ½ Ê C ¹ 9 ¹ À ³ 9 º ³ C Ë ¼ 9 Ã µ ³ C Ì ? Á<br />

Â<br />

9 ? ½ ¸ ³ C ¾ A > µ ¾ 9 ³ ³ ¤ 9 ½ ¸ ³ ¢ Â : Ô Â Ã 9 º 9 Â C ¾ ³ > Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C ? A Ã : ³ > Ã º ³ ¸ ¸ 9 ¹ ³ C<br />

><br />

³ 9 ¸ Ç A C À º 9 Â C ³ C ½ ³ > È µ À Ã 9 µ º 9 ¹ º ¼ ³ > ¾ ³ C Å Î C Ã ¹ ³ Ã ? : º 9 Ã º Ã Â ³ 9 C ³ ¹ ³ ¹ ³ C È ½ ³ > ¾ ³ C ? C ¾ ³ > ³ C<br />

8<br />

C Ã Ê º Ë ³ C Ð ³ > ½ ³ Ã Ã ³ > º ³ Ï C Ô ? Ã Ã A C ¹ ¾ ³ > Ï ½ Ã º > ? À º 9 Â C ? C ¾ 9 ³ ½ ³ Ã Â C ¾ ³ > ³ C ¿ 9 ¹ ³ C Ã µ ? Ç º ³ C<br />

Ï<br />

³ Ã ¡ > 9 ¹ 9 C ? ¸ : Â ¾ ³ ¸ ¸ Ã ³ > > ³ 9 µ ½ ? > Ñ ¼ ? Ã Ë A À ¸ ³ 9 C ³ > ³ C ? ½ Ã º > ? À º ³ C è Â ¾ ³ ¸ ¸ ³ C Ç È > º Å ² 9 ³ Ã<br />

¾<br />

³ 9 ¹ º Ë A : < ³ 9 Ã Ô 9 ³ ¸ ¾ 9 ³ 9 C ¢ ¤ ¦ ½ ³ Ã µ > 9 ³ ½ ³ C ³ Ñ ³ > Ç Â ¸ ¹ > ³ 9 µ ¾ A > µ ¹ ³ Ç È > º ³ è Â ¾ ³ ¸ ¸ Ô > È Á<br />

Ë<br />

A C ¹ ³ 9 C ³ Ã À Â : Ô ¸ ³ ¤ ³ C è A ¸ º 9 : ³ ¾ 9 ? Á é 9 Ô Ã Ñ ¾ 9 ³ : 9 º ³ 9 C ³ : ? A Ç ¾ ³ : µ Â C ³ Â Ç 9 C A ³ C µ ³ <br />

Ç<br />

½ Ã º > ? À º 9 Â C Ã Ð ³ > Ç ? > ³ C ½ ? Ã 9 ³ > º ³ C è Â ¾ ³ ¸ ¸ Ô > È Ç ³ > C A > : 9 º ³ > ³ ½ ¸ 9 µ ¹ > » þ ³ > ³ > Í ? A Ç Ë ³ 9 º<br />

Ï<br />

³ ¸ ³ 9 Ã º ³ º ¼ ³ > ¾ ³ C À Â C C º ³ Å < ³ Ë È ¹ ¸ 9 µ ¾ ³ Ã ´ Ô ³ 9 µ ³ > Ô ¸ ? º Ë ½ ³ ¾ ? > Ç ³ Ã Ë ³ 9 ¹ º Ã 9 µ Ñ ¾ ? Ã Ã ¾ ? Ã<br />

¹<br />

³ > Ç ? > ³ C Ð Â C é ¸ ? > À ³ Ë ¼ ? > ½ ³ 9 : Ï A Ç ½ ? A ¾ ³ Ã ? ½ Ã º > ? À º ³ C è Â ¾ ³ ¸ ¸ Ã ³ º ¼ ? ¡ : ³ ><br />

Ì<br />

¸ ? º Ë ½ ³ C » º 9 ¹ º ? ¸ Ã ³ 9 C é ¡ Î Á Ì ³ > Ç ? > ³ C Ñ ú ³ ¾ Â µ ¼ Ê > ³ C ¾ ¾ ³ : Ï ½ ¸ ? A Ç ¾ ³ > è Â ¾ ³ ¸ ¸ Ô > È Á<br />

î<br />

A C ¹ ¾ ³ A º ¸ 9 µ ¼ ³ C 9 ¹ ³ > Ë A Ã Ê º Ë ¸ 9 µ ³ C ´ Ô ³ 9 µ ³ > Ô ¸ ? º Ë C ? µ Ç Â > ¾ ³ > C : A Ã Ã Å Î C Ã ¹ ³ Ã ? : º ³ > ¹ 9 ½ º<br />

Ç<br />

9 µ Ã Â ? A µ ½ ³ 9 ¾ ³ > < ³ º > ? µ º A C ¹ ¾ ³ Ã î ¸ ? º Ë ½ ³ ¾ ? > Ç Ã ³ 9 C À ¸ ? > ³ > Ì Â > º ³ 9 ¸ Å ¿ 9 C ³ ¼ ³ 9 º ³ > ³<br />

Ã<br />

³ > ½ ³ Ã Ã ³ > A C ¹ 9 C ¾ 9 ³ Ã ³ > ù 9 C Ã 9 µ º Ñ ¾ 9 ³ 9 : + ? : ³ C ¾ ³ > Ï A Ã ? > ½ ³ 9 º A C ¹ ½ 9 Ã ³ > C 9 µ º ? C Á<br />

Ì<br />

³ Ã Ô > Â µ ³ C ¼ A > ¾ ³ Ñ 9 Ã º ¾ 9 ³ è » ¹ ¸ 9 µ À ³ 9 º Ñ C 9 µ º C A > ¾ 9 ³ Ï ½ Ã º > ? À º 9 Â C Ã Ç A C À º 9 Â C Ñ Ã Â C ¾ ³ > C<br />

¹<br />

? Ã À Â : Ô ¸ ³ º º ³ ? ½ Ã º > ? À º ³ è Â ¾ ³ ¸ ¸ ¾ 9 > ³ À º ? A Ã ¾ ³ : î > Â ¹ > ? : : ³ > Ë ³ A ¹ ³ C Ë A À » C C ³ C æ ¢ T ¦ ê Å<br />

¾<br />

A Ç ¾ 9 ³ Ã ³ Ö ³ 9 Ã ³ À ? C C ¾ 9 ³ Æ ³ C ³ > 9 ³ > A C ¹ ¾ ³ Ã ¡ > 9 ¹ 9 C ? ¸ : Â ¾ ³ ¸ ¸ Ã A : ¹ ? C ¹ ³ C ¼ ³ > ¾ ³ C Ñ ¾ 9 ³<br />

Ï<br />

A Ç ¹ > A C ¾ ¾ ³ > è Â ¾ ³ ¸ ¸ ¹ > » þ ³ Ð 9 ³ ¸ : ? ¸ Ã È ½ ³ > ? A Ô º ¹ ? > C 9 µ º ³ > Ã º ¾ A > µ Ç È > ½ ? > 9 Ã º Å ½ ³ ><br />

?<br />

9 C ³ Ï C ¼ ³ C ¾ A C ¹ ¾ 9 ³ Ã ³ > Î ¾ ³ ³ ? A Ç 8 ³ Ã º Ç Ê ¸ ¸ ³ ¼ 9 > ¾ 9 C ¢ T ¦ C 9 µ º ½ ³ > 9 µ º ³ º ¾ 9 ³ Ã Ã º ³ ¸ ¸ º ³ 9 C ³ C<br />

³<br />

½ ³ C Ã Â 9 C º ³ > ³ Ã Ã ? C º ³ C Ï C Ã ? º Ë Ô A C À º Ç È > Ç Â > º Ç È > ³ C ¾ ³ C º ³ > Ã A µ A C ¹ ³ C ¾ ? > ¼ 9 ³ ³ 9 C Ì ³ > Á<br />

³<br />

¸ ³ 9 µ Ð Â C ¾ ³ : Ð Â > ¹ ³ Ã º ³ ¸ ¸ º ³ C Ì ³ > Ç ? > ³ C : 9 º ¼ ³ 9 º ³ > ³ C Ï ½ Ã º > ? À º 9 Â C Ã : ³ º Â ¾ ³ C C ³ ½ ³ C<br />

¹<br />

99<br />

¾ ³ > µ Â C ³ Á Â Ç Á 9 C A ³ C µ ³ è ³ º Â ¾ ³ Å


3 ¡<br />

4 5<br />

¡ E 5 ¡ ¢ … ’<br />

“ ’ u ’ ¥ _ \ V ‹ F … 6 ’ V a r ‚ F V | … } ’ 7 I \ … 9 ’ § a … \ K s ¨ ’ H F M X I ’ ¥ w a K X F V F — \ r x _ F ” | a M s F s<br />

’<br />

‚ O X V \ H X M w K V F › K F r F K X ’ ¢ K ; = > © @ C C E G - © § … x \ | F O E ¢ ¡ 5 E © … ’<br />

\<br />

5<br />

4 5<br />

E ¢ E 5 E ¢ ¡ … } F x X F r ‚ F V<br />

¡ ’ E<br />

’ “ ’ u ’ ¥ _ \ V ‹ F … 7 V ’ … 6 ’ V a r ‚ F V | … \ K s œ ’ ‰ ’ F _ F s ’ K C - / - X § 1 ’ u ¢ E V F O O … E ’<br />

¡<br />

¢ ’ ’ ¥ w a O w X \ K s ¡ ’ ¥ w a O w X ’ ‰ ‚ O X V \ H X M K X F V x V F X \ X M w K<br />

K \ _ O M O w z x V w | V \ r O ‚ H w K O X V a H X M w K w V \ x x V w — M r \ X M w K w z › — x w M K X O ’ ¢ K ; § § - <br />

\<br />

- C © / ^ © / @ § § @ ; K ¥ a O S @ b c ¥ a @ ; % 2 = > ( = § O § - > ( <br />

Z<br />

1 = = § 1 S § 1 1 ( … x \ | F O 5 ¢ … § w O ‰ K | F _ F O … ¥ \ _ M z w V K M \ … E ¢ ¢ ’ ‰ ¥ u V F O O …<br />

O<br />

F Ž 9 w V ‹ … £ 9 ’<br />

£<br />

’ “ ’ “ r F V O w K \ K s ¥ ’ § F M ’ “ j H M F K X r w s F _ H I F H ‹ M K | M K z V \ | r F K X O w z X I F x V w x w O M X M w K \ _ r a 5<br />

©<br />

\ _ H a _ a O ’ 2 = > ( § § S 1 - § ; = > © - § - l ¥ m m m ; = > © - © 2 O ( ( …<br />

H<br />

\ | F O © ¢ 5 ¢ … 7 a K F E © ’<br />

x<br />

’ 6 ’ V a r ‚ F V | ’ ‰ ‚ O X V \ H X M w K O \ K s V F s a H X M w K O M K r w s F _ H I F H ‹ M K | ’ ¢ K b @ % s - § - <br />

¢<br />

( … T w _ a r F © … E ’<br />

<br />

6 ’ V a r ‚ F V | \ K s œ ’ “ ’ § w K | ’ u w s F _ H I F H ‹ M K | \ K s r w s a _ \ V T F V M › H \ X M w K ’ @ ; K % § c<br />

’<br />

5<br />

¡ 5 ¢ E … u \ E ¡ ’<br />

’ ¡ ’ ’ Z a V O I \ K ’ ; = > © c C C w G - © § - C § © § 1 > - ( ( ( y © / © = © c<br />

<br />

/ © - > > - / ’ V M K H F X w K S K M T F V O M X V F O O … E ¡ ’<br />

©<br />

© = ( ’ I œ X I F O M O … S K M T F V O M X w z ¥ w _ w V \ s w \ X w a _ s F V … œ F x X ’ w z ¥ w r x a X F V } H M F K H F …<br />

(<br />

a | a O X E ¢ ’<br />

‰<br />

100<br />

« ¯ ® ¯ ° <br />

E ’ ‰ ’ ¥ M r \ X X M … “ ’ u ’ ¥ _ \ V ‹ F … § ’ M a K H I M | _ M \ … \ K s u ’ ¡ w T F V M ’ £ S } u H<br />

‰ K F Ž O r ‚ w ”<br />

_ M H r w s F _ H I F H ‹ F V ’ ¥ § © § © § § § © " % ( % - / § 1 2 % § ( …<br />

’ “ ’ u ’ ¥ _ \ V ‹ F … 6 ’ V a r ‚ F V | … \ K s œ ’ “ ’ § w K | ’ u w s F _ H I F H ‹ M K | \ K s \ ‚ O X V \ H X M w K ’ @ ; K<br />

% § ( - © § ( § O 1 = = § 1 S § 1 1 ( § C 2 ( © = ( … E © 3 ¢<br />

\ a K M › F s _ \ X X M H F r w s F _ z w V O X \ X M H<br />

( - © § ( § O 1 = = § 1 S § 1 1 ( § C 2 ( © = ( … E © 3<br />

4 5<br />

’ ¡ ’ u M _ K F V ’ ‰ K \ _ | F ‚ V \ M H s F › K M X M w K w z O M r a _ \ X M w K ‚ F X Ž F F K x V w | V \ r O ’ ¢ K O - { © / <br />

E<br />

§ C ¥ ; @ ¥ … x \ | F O ¡ E 5 ¡ … § w K s w K … S Z … E ¢ E ’<br />

|<br />

E ’ ‰ ’ \ V s w ’ @ © = © - @ } ( © - © § % - / § ( ^ = E G - © § 1 © 2 c<br />

E


101<br />

Konfliktanalyse in SAT – Implikationsgraphen<br />

auf ATPG<br />

Thomas Fischer<br />

fischer@informatik.uni-kl.de<br />

Technische Universität <strong>Kaiserslautern</strong><br />

Zusammenfassung. Das SAT-Problem ist die Grundlage der kombinatorischen<br />

Erfüllbarkeitsprobleme. Für dessen Lösung existieren SAT-<br />

Solver, deren Konfliktanalyse sich durch Implikationsgraphen modellieren<br />

lässt. Mit dem ATPG-Problem wird ein Verfahren zur <strong>Verifikation</strong><br />

von Gatternetzen bezeichnet. Beide Probleme besitzen unterschiedliche<br />

Hintergründe, können aber in einigen Bereichen ineinander überführt<br />

werden.<br />

Diese Ausarbeitung betrachtet eine mögliche Übertragung von SAT-Implikationsgraphen<br />

auf ATPG-Probleme. Die ATPG-Implikationsgraphen<br />

werden parallel mit einem D-Kalkül aufgebaut und besitzen ähnliche<br />

Charakteristika wie SAT-Implikationsgraphen (Konfliktklausel → Konfliktschaltung).<br />

Diese ATPG-Graphen stellen eine mögliche Grundlage<br />

dar, ATPG-Probleme mit ähnlichen Techniken wie SAT-Probleme zu<br />

behandeln.<br />

1 Einleitung<br />

Die Probleme SAT (Erfüllbarkeitsproblem) und ATPG (Automatische Testmustergenerierung)<br />

haben verschiedene Ursprünge. Trotzdem sind sich beide Probleme<br />

sehr ähnlich, wurden in der Vergangenheit aber unterschiedlich gelöst.<br />

Beide Probleme besitzen eine hohe wissenschaftliche und wirtschaftliche Relevanz.<br />

Das SAT-Problem ist eines der bekanntesten NP-vollständigen Probleme in<br />

der theoretischen Informatik und Mathematik. Hierbei soll eine Belegung für<br />

eine abstrakte Gleichung gefunden werden, sodass diese erfüllt wird. Als eines<br />

der grundlegenden Probleme der Komplexitätstheorie wird es in nahezu jedem<br />

Standardwerk (z. B. [1]) betrachtet.<br />

Das ATPG-Problem dagegen findet seinen Ursprung in der Qualitätskontrolle<br />

von bereits gefertigten Chips. Gesucht sind Belegungen für die Eingänge eines<br />

Chips, sodass die Ausgänge sich zwischen fehlerfreiem und fehlerbehaftetem Zustand<br />

unterscheiden. Damit wird die Existenz eines Fehlers gezeigt.<br />

In dieser Ausarbeitung werden das SAT- und das ATPG-Problem und mögliche<br />

Lösungsansätze vorgestellt. Bekannte Algorithmen für SAT, die eine Konfliktanalyse<br />

verwenden, dienen als Grundlage für die Einführung von Implikationsgraphen<br />

für SAT-Probleme. Davon ausgehend werden die Implikationsgraphen


102<br />

als Hilfsmittel auf ATPG-Probleme übertragen. ATPG-Implikationsgraphen erlauben<br />

die Bildung von Konfliktschaltungen, die eine Analogie zu Konfliktklauseln<br />

bei SAT-Implikationsgraphen bilden. Die Konfliktschaltungen können zum<br />

einen in das Gatternetzwerk aufgenommen werden (Lernen), zum anderen auch<br />

Grundlage für die Belegung der Leitung sein.<br />

Im Appendix werden Begriffe aus der Komplexitätstheorie, bekannte SAT-<br />

Solver und die grundlegenden Regeln des Davis-Putnam-Verfahrens vorgestellt.<br />

2 SAT – Das Erfüllbarkeitsproblem<br />

Das SAT-Problem (engl. SATisfiability Problem) beschreibt die Erfüllung einer<br />

aussagenlogischen Gleichung. Das Problem ist NP-vollständig (siehe dazu Abschnitt<br />

A). Es war das erste Problem, dessen NP-Vollständigkeit (1971 von Cook<br />

[2]) bewiesen wurde.<br />

Anwendungsbereiche Die Anwendungsbereiche des SAT-Problems gliedern sich<br />

in zwei Gebiete. Zum einen wird es in der klassischen künstlichen Intelligenz für<br />

wissensbasierte <strong>Systeme</strong> und zur Beweisführung und -findung verwendet. Zum<br />

anderen wird es im Bereich der Electronic Design Automation (EDA) im Entwurf<br />

und beim Testen (siehe Abschnitt 3) angewandt.<br />

Formalisierung Eine gegebene aussagenlogische Gleichung ϕ besteht aus n Variablen<br />

x 1 ,...,x n , die mit Operationen verknüpft werden. Jeder der Variable<br />

kann einen Wert annehmen, im einfachsten Fall 0 (falsch) oder 1 (wahr), wovon<br />

im Folgenden stets ausgegenangen wird. Als Operationen stehen die Negation,<br />

Konjunktion und Disjunktion zur Verfügung.<br />

Mansprichtvonderkonjunktiven Normalform (KNF), wenn eine Gleichung<br />

ϕ aus m Klauseln über n Variablen x 1 ,...,x n besteht. Eine Klausel setzt sich zusammen<br />

aus einer Menge von Literalen, die disjunktiv (Operatorzeichen + bzw.<br />

∨) verbunden werden. Diese Literale sind Variablen in ihrer positiven (x i )bzw.<br />

negativen (¬x i )Form 1 . Die Klauseln werden untereinander konjunktiv (Operatorzeichen<br />

· bzw. ∧) verknüpft.<br />

Klausel<br />

{ }} {<br />

Literal<br />

{}}{<br />

ϕ = (x 1 + ¬x 3 ) · ( ¬x<br />

}{{} 2 + x 3 ) (1)<br />

Literal<br />

Gesucht ist eine Belegung A = (a 1 ,...,a n ) ∈ {0, 1} n für die Variablen<br />

x 1 ,...,x n , sodass alle Klauseln erfüllt werden. Kann keine Belegung gefunden<br />

werden, ist die Gleichung ϕ nicht erfüllbar.<br />

Die Gleichung ϕ kann als Funktion f(x 1 ,...,x n ) dargestellt werden. Bei einer<br />

gültigen Belegung liefert die Funktion den Wert 1 zurück, andernfalls den Wert<br />

0.<br />

1 Alternative Schreibweisen stellen die Negation mit einem Querstrich über der Variablen<br />

(x i) oder mit einem Apostroph (x ′ i)dar.


103<br />

Ein logischer Schaltkreis kann auch eine aussagenlogische Gleichung darstellen.<br />

Neben der eigentlichen Gleichung enthält der Schaltkreis strukturelle Informationen<br />

wie z. B. die Richtung von Leitungen. Die Umwandlung eines Schaltkreises<br />

in eine SAT-Gleichung ist trivial und wird in Abschnitt 3.1 beispielhaft<br />

gezeigt.<br />

2.1 Exakte Lösungsverfahren<br />

Für viele Probleme in P sind bereits effiziente Algorithmen bekannt. Dagegen<br />

sind NP-vollständige Probleme nur schwer zu lösen. Es wird angenommen, dass<br />

es für diese Probleme keine effizienten Algorithmen gibt.<br />

Es gibt verschiedene Ansätze NP-vollständige Probleme zu bearbeiten. Diese<br />

Ansätze kann man in zwei Kategorien einteilen: Exakte (vollständige) Verfahren<br />

untersuchen alle möglichen Lösungen und finden beweisbar eine optimale<br />

Lösung, falls diese existiert. Bei Erfüllbarkeitsproblemen ist andernfalls die Unerfüllbarkeit<br />

gezeigt. Durch die Betrachtung des gesamten Lösungsraums 2 brauchen<br />

diese Verfahren i. A. viel Zeit und Speicher. Lokale Suchverfahren dagegen<br />

betrachten nur einen Teil des Lösungsraums und können in Bezug auf das SAT-<br />

Problem nur Erfüllbarkeit, aber nicht die Unerfüllbarkeit zeigen. Für Optimierungsprobleme<br />

(z. B. TSP) können diese heuristischen Verfahren aber innerhalb<br />

kurzer Zeit fast-optimale Lösungen finden, die für praktische Anwendungen gut<br />

genug sind.<br />

Im Nachfolgenden wird der Schwerpunkt auf exakte Verfahren für das SAT-<br />

Problem gelegt.<br />

Vollständige Verfahren für das SAT-Problem lassen sich in drei Vorgehensweisen<br />

einteilen. Neben den deduktiven Verfahren, die mit logischem Schließen<br />

dieExistenzeineLösung beweisen, gibt es enummeriende Algorithmen, die alle<br />

möglichen Lösungen untersuchen. Als dritte Art gibt es die auf einer funktionalen<br />

Repräsentation (z. B. Graphen) arbeitenden Verfahren.<br />

Deduktive Algorithmen Deduktive Algorithmen leiten die Existenz einer Lösung<br />

durch logisches Schließen her. Die Art von Algorithmen werden auch in der<br />

klassischen” künstlichen Intelligenz [3] eingesetzt.<br />

”<br />

Davis-Putnam Bei dem Resolutionsverfahren von Davis und Putnam (DP) [4]<br />

werden die logischen Konsequenzen aus einer Klauselmenge berechnet. Dabei<br />

werden ausgehend von der ursprünglichen Klauselmenge zwei Elternklauseln gewählt,<br />

die ein Literal jeweils komplementär (im Beispiel x 3 ) besitzen. Im Resolutionsschritt<br />

wird eine neue Klausel erzeugt, die aus den beiden Elternklauseln<br />

ohne das gewählte Literal besteht (Abbildung 1(a)). Die neu erzeugte Klausel<br />

wird in die Klauselmenge hinzugefügt. Falls eine leere Klausel hergeleitet werden<br />

kann, ist die Instanz nicht erfüllbar.<br />

Das Davis-Putnam-Verfahren kann schlimmstenfalls exponentiell viel Speicher<br />

und Zeit benötigen. Es gibt verschiedene Erweiterungen, die in Abschnitt C<br />

und [3] aufgeführt sind.<br />

2 Durch Optimierung können aber Teile des Lösungsraums ausgeblendet werden.


104<br />

(x 1 + ¬x 3) (¬x 2 + x 3)<br />

(x 1) (¬x 1)<br />

(x 1 + ¬x 2)<br />

()<br />

(a) Resolutionsschritt<br />

(b) Leere Klausel<br />

Abb. 1. Beispiele für Resolutionsschritte<br />

AND/OR-Schließen AND/OR-Schließen bzw. Rekursives Lernen wurde basierend<br />

auf Gatternetzwerken im ATPG-Bereich entwickelt. Um die Voraussetzungen<br />

für eine bestimme Ausgangsbelegung zu finden, werden die Anforderungen<br />

in einen AND/OR-Baum abgebildet. In diesem Baum gibt es zwei Typen von<br />

Knoten: AND- und OR-Knoten. Um festzustellen, ob ein Knoten erfüllt wird,<br />

werden rekursiv die Kinderknoten betrachtet. Für einen AND-Knoten müssen<br />

alle seiner Kinderknoten erfüllt sein, für einen OR-Knoten mindestens einer. Ist<br />

eine Verzweigungsoption unerfüllbar, wird bei einem OR-Knoten die nächste Alternative<br />

überprüft, bei einem AND-Knoten der Knoten selbst als unerfüllbar<br />

markiert.<br />

Tritt ein bestimmtes Blatt (bei SAT eine Variable) in allen OR-Unterbäumen<br />

auf oder ist es durch einen direkten AND-Pfad vom Wurzelknoten aus erreichbar,<br />

so ist die Erfüllung des Blattes eine notwendige Voraussetzung für die Erfüllung<br />

des Wurzelknotens. Im Beispiel in Abbildung 2 ist die Variable x 1 notwendig zum<br />

Erfüllen von y 1 . Somit gilt ¬x 1 ⇒¬y 1 und durch Kontraposition auch y 1 ⇒ x 1 .<br />

x 1<br />

x 2<br />

y 1<br />

∨<br />

OR-Knoten<br />

y 1<br />

x 3<br />

x 4<br />

(a) Gatternetzwerk<br />

∧<br />

x 1 x 2 x 1 x 3 x 4<br />

∧<br />

(b) AND/OR-Baum<br />

AND-Knoten<br />

Abb. 2. Beispiel für einen AND/OR-Baum.<br />

Die gewonnene Sammlung von notwendigen Implikationen kann zur Einschränkung<br />

des Suchraums verwandt werden. Auch wenn das rekursive Lernen


105<br />

auf Gatterlisten beruht, kann es zur Lösung von SAT-Gleichungen angewandt<br />

werden.<br />

Stålmarcks Methode Auf Stålmarck [5] geht ein patentiertes Verfahren zum Ausprobieren<br />

von Variablen zurück. Dabei wird in einem ersten Schritt eine Gleichung<br />

in eine Schreibweise aus verschachtelten Implikationen überführt. Diese<br />

Implikationen werden als Tripel (Ergebnis, Implikant, Folgerung) in einer Menge<br />

zusammengefasst. Die Tripel können nach sieben Ableitungsregeln und einer<br />

Dilemma-Regel ersetzt werden.<br />

Zum Beweis wird angenommen, dass die Gleichung nicht erfüllbar ist. Kann<br />

diese Annahme durch Anwendung der Regeln auf die Menge der Regeln zum<br />

Widerspruch geführt werden, ist die Gleichung erfüllbar.<br />

Enummerierende Algorithmen Enummerierende Algorithmen traversieren<br />

den Suchraum.<br />

Davis-Putnam-Logemann-Loveland Ein Beispiel für ein enummerierendes Verfahren<br />

ist der Algorithmus von Davis-Logemann-Loveland (DLL) [6]. Da das<br />

ursprüngliche Davis-Putnam-Verfahren (Abschnitt 2.1) sehr viel Speicher verbrauchen<br />

kann, wurde in diesem neuen Ansatz eine Baumsuche verwendet. Die<br />

hier vorkommenden Suchoperationen können auf DP-Resolutionsoperationen abgebildet<br />

werden. Daher wird der DLL-Algorithmus auch mit DPLL abgekürzt.<br />

Der Lösungsraum wird auf einen binären Entscheidungsbaum abgebildet, wobei<br />

im einfachsten Fall in jeder Ebene 1 ≤ i ≤ n entschieden wird, ob die Variable<br />

x i mit 0 oder 1 belegt wird. Der Pfad von der Wurzel zu einem Blatt ist somit<br />

eine vollständige Belegung A, d.h.|A| = n. Befindet sich der Suchalgorithmus<br />

nicht an einem Blatt, sondern an einem inneren Knoten, ist die Belegung A nur<br />

partiell und einige Variablen sind frei (nicht belegt).<br />

0 1<br />

i<br />

i +1<br />

Abb. 3. Binärer Suchbaum.<br />

Der Baum wird mit einem Backtracking-<br />

Algorithmus [7] durchsucht. Wird durch eine<br />

Belegungszuweisung an eine Variable die<br />

SAT-Gleichung unerfüllbar, wird der darunterhängende<br />

Teilbaum ausgeblendet und die<br />

Variablenzuweisung invertiert. Sind beide Alternativen<br />

gescheitert, geht der Algorithmus<br />

eine Ebene zurück und ändert die Zuweisung<br />

der vorherigen Variable. Der Algorithmus<br />

terminiert, sobald ein Blatt erreicht wird und die vollständige Belegung die<br />

Gleichung erfüllt (Lösung gefunden) oder alle Möglichkeiten ausgeschöpft sind<br />

und der Algorithmus zur Wurzel zurückgekehrt ist (Unerfüllbarkeit bewiesen).<br />

Problematisch ist allerdings, dass bei einem ungünstigen Aufbau sehr viel Zeit<br />

benötigt wird, um falsche Entscheidungen zu entdecken. In den Gleichungen 2<br />

bis 5 wird ein solches Beispiel gezeigt. Die Entscheidung für x 1 und x 2 (partielle<br />

Belegung A) wirderstdannalsungültig entdeckt, wenn die Ebene k mit 2 <<br />

k ≤ n im Binärbaum erreicht wird. Dieses Problem wurde von Davis, Logemann


106<br />

und Loveland mit BCP (siehe Abschnitt 4.3) umgangen.<br />

A = {(x 1 , 0), (x 2 , 1)} (2)<br />

ϕ = ω 1 · ...· ω n (3)<br />

ω i =(x 1 + ¬x 2 + x k ) (4)<br />

ω j =(x 1 + ¬x 2 + ¬x k ) (5)<br />

Das Davis-Logemann-Loveland-Verfahren kann schlimmstenfalls exponentiell<br />

viel Zeit benötigen. Durch zahlreiche Varianten ist es die Basis für viele moderne<br />

SAT-Solver geworden.<br />

Funktionale Repräsentation Die funktionale<br />

Repräsentation in Form von gerichteten azyklischen<br />

Graphen (directed acyclic graphs, DAG) wurde von<br />

Bryant [8] eingeführt. Die Schwierigkeit bei dieser<br />

Repräsentation ist der Aufbau des Graphen, da die<br />

Größe des Graphen abhängig von der Konstruktionsreihenfolge<br />

ist.<br />

Ein Beispiel für einen DAG ist in Abbildung 4<br />

dargestellt. Die repräsentierte Gleichung ist ϕ =<br />

(x 1 +x 3 )·(x 2 +x 3 ). Gesucht ist ein Pfad vom Startknoten<br />

(im Beispiel x 1 ) zum Wahrheitswert 1. An<br />

jedem Knoten wird entschieden, ob die entsprechende<br />

Variable mit 0 oder 1 belegt wird.<br />

Eine SAT-Gleichung ist erfüllbar, wenn es einen<br />

Pfad vom Startknoten (im Beispiel x 1 ) zum Wahrheitswert<br />

1 gibt.<br />

x 1<br />

1<br />

0<br />

x 2<br />

x 3 0<br />

1<br />

0 1<br />

0 1<br />

Abb. 4. Beispiel für einen<br />

gerichteten, azyklischen<br />

Graphen.<br />

3 ATPG – Automatic Test Pattern Generation<br />

Automatic Test Pattern Generation (ATPG) beschäftigt sich mit der Erstellung<br />

von Testfällen zum Validieren von digitalen Schaltungen. Dabei werden Eingangsbelegungen<br />

gesucht, die auf Herstellungsfehler im Inneren der Schaltung<br />

schließen lassen. Die Eingangsbelegungen ”<br />

provozieren” einen Fehler, wodurch<br />

eine andere Ausgangsbelegung zu erzeugt wird, als sie eine fehlerfreie Schaltung<br />

erzeugen würde.<br />

Eine Einführung zu dem Thema findet sich in [9].<br />

3.1 Boolesches Netzwerk & Gatter<br />

Zur Simulation wird die Schaltung in einen Graphen, ein boolesches Netzwerk,<br />

überführt. Dabei repräsentieren die Knoten einfache Gatter, die gerichteten Kanten<br />

die Verbindungen zwischen den Gatternsignalen. Die Gatter implementieren<br />

einfache logische Operationen (AND, OR, . . . ) und können somit auch als SAT-


107<br />

Formeln dargestellt werden. Für ein Gatter mit den Eingängen x =(x 1 ,...,x n )<br />

und dem Ausgang y kann die Formel ϕ = ¬(y ⊕ f(x 1 ,...,x n )) aufgestellt werden,<br />

wobei f : B n → B die eigentliche boolesche Operation auf dem Alphabet<br />

B durchführt. Im einfachsten Fall ist B = {0, 1}.<br />

Als Beispiel wird ein OR-Gatter mit zwei Eingängen gezeigt und in eine SAT-<br />

Formel in KNF überführt.<br />

f(x 1 ,x 2 )=(x 1 + x 2 )<br />

ϕ = ¬(y ⊕ f(x 1 ,x 2 ))<br />

= ¬(y ⊕ (x 1 + x 2 ))<br />

= ¬(y ·¬(x 1 + x 2 )+¬y · (x 1 + x 2 ))<br />

= ¬(y ·¬x 1 ·¬x 2 + ¬y · x 1 + ¬y · x 2 )<br />

= ¬(y ·¬x 1 ·¬x 2 ) ·¬(¬y · x 1 ) ·¬(¬y · x 2 )<br />

=(¬y + x 1 + x 2 ) · (y + ¬x 1 ) · (y + ¬x 2 )<br />

3.2 Fehlermodelle<br />

In einer Schaltung können unterschiedliche Fehler auftreten. Für die Simulation<br />

wird aber nur die einfachste Form der Fehler betrachtet: Beim Single Stuckat-Fehler<br />

wird davon ausgegangen, dass eine Leitung im Gatternetz immer den<br />

gleichen Wert (0 oder 1) hat und sich nicht ändert. Da Leitungen als Variablen<br />

betrachtet werden (Beispiel oben: y, x 1 und x 2 ), wird bei einer fehlerhaften<br />

Leitung die korrespondierende Variable auf einen konstanten Wert gesetzt.<br />

x 1<br />

y 1<br />

.<br />

.<br />

x n<br />

y m<br />

Fehler φ: stuck-at-1<br />

Abb. 5. Beispiel für Stuck-at-1-Fehler eines AND-Gatters<br />

Bei einem Schaltkreis mit n Eingängen und m Ausgängen ist eine Belegung<br />

der Eingänge (Gleichung 6) und Ausgänge (Gleichung 7) gesucht, sodass sich für<br />

einen Fehler φ eine zu y (fehlerfrei) unterschiedliche Ausgangsbelegung y ′ nach<br />

Gleichung 8 (fehlerbehaftet) ergibt. Ein Beispiel ist in Abbildung 5 gezeigt.<br />

x =(x 1 = w 1 ,...,x n = w n ) (6)<br />

y =(y 1 = v 1 ,...,y n = v n ) (7)<br />

y ′ =(y 1 = v ′ 1 ,...,y n = v ′ n ) (8)<br />

v i ,v ′ j,w k ∈{0, 1} (9)


108<br />

Das Finden einer Belegung x kann entweder zufällig oder deterministisch<br />

geschehen. Bei einer zufälligen Suche müssen die Fehler nicht a priori bekannt<br />

sein. Durch das Ausprobieren von Belegungen sollen die Fehler gefunden werden.<br />

Im deterministischen Fall kommen in der zu untersuchenden Schaltung bzw.<br />

deren Modell nur bekannte Single Stuck-at-Fehler Φ = {φ 1 ,...,φ k } vor. Auf<br />

Grund der bekannten Fehler wird auf eine passende Ein- und Ausgangsbelegung<br />

geschlossen. Die randomisierte Suche wird im Nachfolgenden vernachlässigt.<br />

Für bestimmte Stuck-at-Fehler können keine Eingangsbelegungen erstellt<br />

werden, die den Fehler aufdecken. So kann die fehlerbehaftete Variable durch<br />

spätere boolesche Operationen ” überdeckt” werden. Diese redundanten Fehler 3<br />

lassen sich nicht mit deterministischen ATPG-Algorithmen erkennen. In diesem<br />

Fall muss der Algorithmus, ähnlich wie beim SAT-Problem, die Untestbarkeit<br />

(vgl. Unerfüllbarkeit) beweisen.<br />

3.3 Formalisierung<br />

Wie oben erwähnt, lassen sich Gatter als Funktionen der Art f : B n → B m darstellen.<br />

Zu Betrachtung von Fehlern ist es zweckmäßig, das Alphabet B = {0, 1}<br />

zu erweitern. Auf Roth [10] geht das D-Kalkül zurück. Hier wird B um die Werte<br />

D und D erweitert. Ist ein logischer Wert im fehlerfreien Zustand 1 und im<br />

fehlerbehafteten Fall 0, so wird ihm der Wert D zugewiesen. Im komplementärenFallwirdderWertD<br />

angewandt. Für Signalkanten, die keinen festen Wert<br />

zugewiesen bekommen haben, wird der Wert X genommen. Somit erweitert sich<br />

das Alphabet auf B = {0, 1, D, D,X}.<br />

Für das neue Alphabet müssen die Operationen darauf erweitert werden. Als<br />

Beispiel wird in Tabelle 1 die Negation vorgestellt.<br />

f 01X D D<br />

¬f 10X DD<br />

Tabelle 1. Negationsoperation im Alphabet B = {0, 1, D, D,X}.<br />

Das Finden eines Eingabevektors zum Aufspüren von Fehler lässt sich in zwei<br />

Teilprobleme untergliedern:<br />

– Das Steuerbarkeitsproblem behandelt die Frage, wie der Eingabevektor beschaffen<br />

sein muss, damit die betrachtete Leitung sich fehlerhaft verhält und<br />

somit der Fehler in Erscheinung tritt. Im Beispiel in Abbildung 6 ist das Signal<br />

a im Fehlerfall immer 0, daher muss die Eingangsbelegung so beschaffen<br />

sein, dass sie den Wert 1 im fehlerfreien Zustand erzeugt.<br />

Das Steuerbarkeitsproblem kann leicht in ein SAT-Problem überführt und<br />

als solches gelöst werden.<br />

3 Da diese Fehler keinen Einfluss auf die Ausgänge haben, ist ihre Existenz irrelevant.


109<br />

– Als weitere Bedingung wird gefordert, dass sich das fehlerhafte Signal bis zu<br />

einem Ausgang ausbreitet. Diese Bedingung wird Beobachtbarkeitsproblem<br />

genannt. In Abbildung 6 darf das zweite AND-Gatter das (fehlerhafte) Signal<br />

aus dem ersten AND-Gatter nicht überschreiben.<br />

x 1<br />

x 2<br />

a<br />

Fehler φ: stuck-at-0<br />

b y 1<br />

x 3<br />

Abb. 6. Fehlerbehaftetes Gatternetzwerk<br />

Ausgehend von dem Fehlerfall können einige Wertzuweisungen vorgenommen<br />

werden. Da a ein Stuck-at-0-Fehler ist, wird a = D zugewiesen. Damit der Ausgang<br />

des ersten AND-Gatters im fehlerlosen Zustand a = 1 liefert, muss x 1 =1<br />

und x 2 = 1 gelten. Im Allgemeinen müssen die notwendigen Variablenbelegungen<br />

zu den Eingängen (Erfüllung der Steuerbarkeit) und den Ausgängen (Erfüllung<br />

der Beobachtbarkeit) propagiert werden.<br />

Diejenigen Signalleitungen, die den Wert D oder D leiten, werden der D-<br />

Grenze zugerechnet. Erreicht die D-Grenze einen Ausgang, ist das Beobachtbarkeitsproblem<br />

positiv entschieden. Dazu komplementär definiert man die J-<br />

Grenze. Darin sind alle Leitungen enthalten, die einen Wert aus {0, 1} enthalten.<br />

Die Wertzuweisungen sind notwendig, damit der Fehler erkennbar auftritt.<br />

Idealerweise erreicht die J-Grenze möglichst viele Eingänge. Eingänge, die nicht<br />

Teil der J-Grenze sind oder durch die Ausbreitung der D-Grenze belegt wurden,<br />

müssen von der Heuristik eines ATPG-Verfahrens geeignet belegt werden.<br />

Im trivialen Beispiel der Abbildung 6 erreicht die J-Grenze die Ausgänge x 1<br />

und x 2 . Die D-Grenze durchschreitet das zweite AND-Gatter und setzt y 1 =D<br />

und x 3 =1.Für das Steuerbarkeitsproblem ergibt sich in diesem Fall die SAT-<br />

Formel aus Gleichung 10.<br />

ϕ =(x 1 + ¬a) · (x 2 + ¬a) · (¬x 1 + ¬x 2 + a) (10)<br />

3.4 Testerzeugung<br />

Ein allgemeines Schema einer Testerzeugung ist in Abbildung 7 dargestellt. Die<br />

einzelnen Blöcke werden in den nachfolgenden Abschnitten besprochen.<br />

– Zu Beginn wird die Testumgebung eingerichtet. Nach der Definition des Gatternetzwerks<br />

und der darauf operierenden Logik (Alphabet, Operationen,<br />

...)wirdindiesesGatterderFehler(Stuck-at-0bzw.Stuck-at-1)eingebaut.<br />

In einem zweiten Schritt werden die notwendigen Wertzuweisungen zur Initialisierung<br />

der D- und J-Grenze vorgenommen. Dieser Vorgang wird auch<br />

Unique Sensitization [11] genannt.


110<br />

Initialisierung<br />

Fehler einfügen<br />

Notwendige Belegungen<br />

Implikationen auswerten<br />

partielle Belegung<br />

Neuer Vorschlag<br />

Ja<br />

Inkonsistenzen?<br />

Wertzuweisungen<br />

ändern<br />

Nein<br />

Heuristik für<br />

optionale Werte<br />

Nein<br />

X-Pfad D → Ausgang<br />

Ja<br />

Nicht möglich<br />

Fehlerüberprüfung<br />

vollst. Belegung<br />

Lösung nicht auffindbar<br />

Ergebnis gefunden<br />

Abb. 7. Ablauf einer Testerzeugung<br />

– Wird eine Eingangsbelegung durch die Initialisierung neu erstellt oder eine<br />

bestehende Lösung durch den Algorithmus verändert, müssen die Implikationen<br />

auf die freien Variablen beachtet werden. Die Implikationen sind notwendige<br />

Belegungsanforderungen für die Leitungen im Gatternetz. Die Auswertung<br />

der Implikationen im Netzwerk entspricht dem BCP (vorgestellt in<br />

Abschnitt 4.3) für SAT-Probleme.<br />

– Die aus der Implikation gewonnene neue Belegung muss auf Fehler überprüft<br />

werden. Einerseits muss das Gleichungssystem immer noch erfüllbar sein.<br />

Als Beispiel wäre die Belegung A = {(x 1 =0), (x 2 =1), (x 3 =0)} für die<br />

Gleichung ϕ =(x 1 + ¬x 2 ) · (x 2 + x 3 ) ungültig.<br />

Andererseits muss ein X-Pfad existieren. Ein X-Pfad beschreibt den Weg von<br />

einem Signal der D-Grenze zu einem Ausgang. Das D-Signal hat dann die<br />

Möglichkeit den Ausgang zu erreichen, wenn die dazwischenliegenden Gatter<br />

mit undefinierten Werten (X) belegt sind.<br />

– War die Untersuchung auf Fehler ohne Beanstandung, können die noch freien<br />

Variablen betrachtet werden. Eine geeignete Heuristik wählt eine freie<br />

Variable aus und belegt sie mit einem Wert. Repräsentiert die neue Belegung<br />

eine gültige, vollständige Lösung für die ATPG-Instanz, terminiert das<br />

Verfahren.<br />

Wurden Fehler bei der Untersuchung entdeckt, ist die aktuelle Belegung<br />

nicht gültig. Abhängig vom Algorithmus wird eine neue Belegung gewählt.<br />

Kann keine neue Belegung gewählt werden (z. B. da bereits alle ausprobiert


111<br />

wurden), lässt sich daraus schließen, dass es keinen Testvektor für die ATPG-<br />

Instanz gibt (Redundanz liegt vor). Das Verfahren terminiert in diesem Fall.<br />

Tritt keine Terminierung ein, übernimmt der Algorithmus die neue Belegung<br />

und fährt mit der Überprüfung der Implikationen fort.<br />

4 Grundlagen von SAT-Solvern<br />

Im folgenden werden einige Grundlagen betrachtet, die bei nahezu jedem modernen<br />

SAT-Solver eingesetzt werden.<br />

4.1 Konventionen<br />

Für Algorithmen, die auf der Baumstruktur des Davis-Logemann-Loveland-Algorithmus<br />

basieren, sind einige Konventionen festzulegen.<br />

– Die Entscheidungsebene gibt an, in welcher Ebene des Baumes einer Variablen<br />

ein Wert zugewiesen wird. Die Ebene, in der über die Belegung einer<br />

Variablen entschieden wird, wird über die Funktion δ entschieden. In der<br />

einfachen Variante des Backtracking-Algorithmus gilt δ(x i )=i. Erweiterte<br />

Varianten weisen mehreren Variablen innerhalb einer Entscheidungsebene<br />

z. B. durch Implikationen Werte zu.<br />

– Der Wert, den eine Variable zugewiesen bekam, kann über die Funktion ν<br />

abgefragt werden. Dabei gilt ν(x i ) ∈{0, 1}.<br />

– Der Antezedent α(x i ) einer Variable x i ist NIL, falls die Variable durch<br />

eine Entscheidung und nicht durch eine Implikation belegt wurde (Entscheidungsvariable).<br />

Wurde die Variable durch eine Implikation belegt, ist α(x i )<br />

die Klausel, in der die Variable x i die letzte frei Variable war (siehe Abschnitt<br />

4.3).<br />

Die obigen Festlegungen könneninderFormx i = ν(x i )@δ(x i ):α(x i )zusammengefasst<br />

geschrieben werden. Im folgenden Beispiel sind x 1 und x 2 Entscheidungsvariablen,<br />

die den Wert 0 bzw. 1 in den Entscheidungsebenen 1 und 2<br />

erhielten. In der Ebene 2 ergibt sich eine notwendige Implikation zur Belegung<br />

der Variablen x 3 . Deren Antezedent ist die einzige Klausel in ϕ.<br />

ϕ =(¬x 1 + x 2 + x 3 )<br />

x 1 =1@1:NIL<br />

x 2 =0@2:NIL<br />

x 3 =1@2:(¬x 1 + x 2 + x 3 )<br />

4.2 Belegungsheuristiken<br />

Im Rahmen der meisten SAT-Solveralgorithmen müssen Entscheidungen getroffen<br />

werden wie Variablen zu belegen sind. Es gibt eine Reihe von möglichen<br />

Heuristiken, wie Entscheidungsvariablen belegt werden können. Die daraus resultierenden<br />

Implikationen beeinflussen den weiteren Ablauf des Algorithmus.


112<br />

Silva gibt in [12] einen Überblick über gängige Heuristiken, der von Moskewicz<br />

et al. in [13] zusammengefasst und erweitert wurde.<br />

Nachfolgend sind einige bekannte Belegungsheuristiken aufgeführt.<br />

– Wenn eine Entscheidung für eine Variable und deren Belegung ansteht, wird<br />

die Wahl zufällig vorgenommen. Das RAND-Verfahren ist einfach aufgebaut,<br />

da es unabhängig vom Zustand des Solvers arbeitet.<br />

– Ein ”<br />

gieriger” Ansatz für die Entscheidungsfindung ist der folgende: Alle<br />

möglichen Kombinationen werden betrachtet. Dann wird die Variable mit<br />

einem entsprechenden Wert belegt, sodass die meisten Klauseln erfüllt werden.<br />

Von diesem Ansatz (DLIS, Dynamic Largest Individual Sum) gibt es<br />

verschiedene Variationen. Bei DLCS (Dynamic Largest Combined Sum) wird<br />

für jede Variable bestimmt, wie viele Klauseln sie mit positiver und negativer<br />

Belegung zusammen erfüllt. Die endgültige Belegung ist positiv, falls<br />

die gewählte Variable mit positiver Belegung mehr Klauseln als mit negativer<br />

Belegung erfüllt. Andernfalls wird die Variable mit 0 belegt. DLIS und<br />

DLCS können randomisiert werden, indem nach der Auswahl der Variable<br />

deren Belegung zufällig gewählt wird.<br />

Diese Verfahren brauchen sehr viel Zeit, da alle Klauseln betrachtet werden<br />

und mögliche Belegungen überprüft werden müssen.<br />

– Komplexere Analysen werden bei BOHM, MOM oder der Jeroslaw-Wang-<br />

Heuristik vorgenommen. Bei BOHM wird die Erfüllung von kleinen Klauseln<br />

bevorzugt, wobei bei der Größe einer Klausel nur unbelegte Literale gezählt<br />

werden. MOM wählt Literale aus, die am häufigsten bei den kleinsten Klauseln<br />

vorkommen. Ähnlich wie DLIS arbeitet die Jeroslaw-Wang-Heuristik,<br />

wobei kleine Klauseln bei der Aufsummierung stärker gewichtet werden.<br />

– Die bei Chaff ([13], Abschnitt B.3) verwendete VSIDS-Heuristik (Variable<br />

State Independent Decaying Sum) betrachtet auch die Historie einer Variablen.<br />

Damit ist diese Heuristik im Gegensatz zu den oben vorgestellten<br />

Verfahren dynamisch. VSIDS führt für jedes Literal einen Aktivierungswert<br />

mit. Kommt das Literal in einem Konflikt vor, wird die Aktivierung erhöht.<br />

Die Werte alle Literale werden laufend verringert. Literale, die erst kurz vorher<br />

in gelernten Klausel auftraten, werden daher bei der Wahl bevorzugt.<br />

VSIDS hat einen geringen Overhead, liefert aber trotzdem gute Ergebnisse.<br />

Mehr zu VSIDS finden sich in Abschnitt B.3.<br />

Ähnlich wie VSIDS arbeitet die Heuristik im BerkMin-Solver [14]. Die Aktivierung<br />

von Variablen wird erhöht, wenn ein entsprechendes Literal in einem<br />

Konflikt (Konfliktklausel oder Antezedent) bei der Durchführung von BCP<br />

vorkommt. Wie bei VSIDS kühlen die Variablen ab, sodass kürzliche Änderungen<br />

in der Statistik einen größeren Einfluss auf die Entscheidung besitzen.<br />

Die Bestimmung der ”<br />

besten” Heuristik wird durch das Fehlen einer guten<br />

Metrik erschwert. Neben der Zeit, die zur Entscheidungsfindung benötigt wird,<br />

müssen die Auswirkung auf den BCP-Algorithmus beachtet werden. Treten auf<br />

Grund einer Entscheidung viele Konflikte auf, wird dadurch ebenfalls viel Zeit<br />

verbraucht. Experimentelle Ergebnisse in [14,13] deuten darauf hin, dass die<br />

dynamischen Verfahren insgesamt eine bessere Performanz aufweisen.


113<br />

4.3 Boolean Constraint Propagation und Implikationen<br />

Wird während des Ablaufes eines Algorithmus eine Entscheidung getroffen, so<br />

folgen aus dieser Entscheidung notwendige Implikationen. Für das SAT-Problem<br />

bedeutet es, dass aus einer Zuweisung an eine Variable weitere Zuweisungen<br />

zwingend daraus folgen, wenn die Gleichung erfüllbar bleiben soll.<br />

Wenn bei einer Klausel alle Literale bis auf ein freies Literal den Wert 0<br />

haben, so muss das letzte freie Literal den Wert 1 erhalten. Ansonsten hätte die<br />

Klausel den Wert 0 und die SAT-Instanz wäre nicht mehr erfüllbar. Ein Beispiel<br />

ist in Abbildung 8(a) dargestellt. Hier muss dem freien Literal x 2 der Wert 0<br />

zugewiesen werden. Wird diese unit-Klausel-Regel wiederholt angewandt, bis<br />

keine einzelnen freien Literale mehr vorkommen, spricht man von der Boolean<br />

Constraint Propagation. Dieses Verfahren wurde bereits von Davis und Putnam<br />

in der ursprünglichen Fassung des Algorithmus verwendet.<br />

Ein ähnliches Vorgehen kann in booleschen Netzwerken angewandt werden.<br />

Hier hängen die Ein- und Ausgänge der logischen Gatter voneinander ab. Ist<br />

ein AND-Gatter wie in Abbildung 8(b) beschaltet, muss der unbelegte Eingang<br />

x 1 den Wert 1 bekommen. Diese einfache Implikation ist vorwärtsgerichtet, falls<br />

einem Ausgang ein Wert zugewiesen wird, anderfalls ist sie rückwärtsgerichtet.<br />

Eine Reihe von einfachen Implikationen stellt eine direkte Implikation dar. Implikationen,<br />

die sich nicht aus direkten Implikationen ergeben, werden indirekte<br />

Implikationen genannt. Sie lassen sich nur mit aufwändigen Verfahren (z. B. Rekursives<br />

Lernen) bestimmen.<br />

Es ist ersichtlich, dass direkte Implikationen und BCP einander entsprechen.<br />

BCP wird in nahezu jedem exakten SAT-Solver verwendet, da es die Lösungsfindung<br />

bei großen SAT-Gleichungen erheblich beschleunigt.<br />

ω = (x 1 + ¬x 2)<br />

A = {(x 1, 0)}<br />

x 1<br />

1<br />

1<br />

(a) unit-Klausel-Regel<br />

(b) Einfache Implikation<br />

Abb. 8. Beispiele für Notwendige Implikationen bei SAT und ATPG<br />

4.4 Neustart<br />

Um aus einem Teilbaum zu ”<br />

entkommen”, kann ein Algorithmus einen Neustart<br />

durchführen. Dabei werden Teile der bisher gesammelten Daten und Belegungen<br />

gelöscht und eine neue Startposition ausgewählt. Die nicht verworfenen Daten<br />

(z. B. aus Konflikten gelernte Klauseln) können eine Wiederholung von Fehlbelegungen<br />

verhindern. Die Anwendung von Neustarts bei Chaff wird in Abschnitt<br />

B.3 dargestellt.


114<br />

Anstatt eines kompletten Neustarts kann der Algorithmus auch an eine beliebige<br />

Stelle im Suchbaum zurückspringen.<br />

5 Konfliktanalyse<br />

Konfliktanalyse bedeutet, aus Konflikten zu lernen, die während des Lösens der<br />

SAT-Instanz auftreten. Wird ein auf dem Davis-Putnam-Logeman-Loveland-<br />

Algorithmus (siehe Abschnitt 2.1) basierender SAT-Solver eingesetzt, werden<br />

Konflikte behandelt, die während der Implikationsverfolgung (BCP, siehe Abschnitt<br />

4.3) auftreten. Die Wahl und Ausprägung der Konfliktanalyse und die<br />

daraus abgeleiteten Lernstrategien haben entscheidenden Einfluss auf die Berechnungszeit<br />

des SAT-Solvers.<br />

Das konfliktbasierte Lernen (conflict based learning) ermöglicht es, durch<br />

Hinzufügen von neuen Klauseln beispielsweise bestimmte Konflikte zukünftig zu<br />

verhindern. Damit können Teile des Suchraums ausgeblendet (prune) werden,<br />

da gelernt wurde, dass sich darin keine gültigen Lösungen befinden.<br />

Eine Einführung zu diesem Thema findet sich in [15,16].<br />

5.1 Implikationsgraph<br />

Die in Abschnitt 4.1 eingeführten Darstellungen von Entscheidungsvariablen und<br />

-ebenen, Antezedenten und Implikationen können in einem Graphen zusammengefasst<br />

werden. Variablenzuweisungen ν(x) (Entscheidungen oder Implikationen)<br />

werden als Knoten dargestellt. Entscheidungsknoten stellen die Entscheidungen<br />

einer Ebene dar und besitzen keine eingehenden Kanten bzw. Vorgänger.<br />

Die Vorgänger eines Knotens mit dem Literal x i sind die Variablenbelegungen,<br />

die im Antezedenten δ(x i ) vorkommen und für die Knotenbelegung verantwortlich<br />

sind. Der Graph kann aus der Menge aller Zuweisungen der Form<br />

x i = ν(x i )@δ(x i ):α(x i ) berechnet werden. Diese Menge wurde durch die Durchführung<br />

von BCP gewonnen.<br />

Zu jedem Knoten ist somit die Variable und die Ebene der Zuweisung bekannt.<br />

Ein Beispiel ist in Abbildung 9 für die folgende Gleichung, wobei x 4 , x 12<br />

und x 16 als Entscheidungsknoten dienen.<br />

ϕ = ω 1 · ω 2 · ω 3 · ω 4 · ω 5 · ω 6 · ω 7 · ω 8<br />

ω 1 = x 2 + x 12 + ¬x 16<br />

ω 2 = ¬x 2 + ¬x 4 + ¬x 8 + ¬x 10<br />

ω 3 = x 8 + ¬x 16<br />

ω 4 = x 1 + x 10<br />

ω 5 = x 3 + x 10<br />

ω 6 = ¬x 5 + x 10<br />

ω 7 = ¬x 1 + ¬x 3 + x 5 + x 18<br />

ω 8 = ¬x 3 + ¬x 18


115<br />

¬x (5)<br />

12<br />

x (1)<br />

4<br />

x (5)<br />

1<br />

¬x (5)<br />

2 ¬x (5)<br />

x (5)<br />

10<br />

3<br />

x (5)<br />

18<br />

x (2)<br />

16<br />

x (2)<br />

8<br />

¬x (5)<br />

5<br />

¬x (5)<br />

18<br />

Abb. 9. Beispiel für einen Implikationsgraph. Entscheidungsvariablen sind grau dargestellt,<br />

Implikationsvariablen weiß. Die Schreibweise ¬x (5)<br />

2 bedeutet, dass der Variablen<br />

x 2 auf der Entscheidungsebene 5 der Wert 0 zugewiesen wurde.<br />

In einer Gleichung bzw. Graph ohne Konflikt lässt sich jede Variable mit genau<br />

einem Knoten darstellen. Bei einem Konflikt wird versucht, einer Variablen<br />

zwei verschiedene Werte zuzuordnen. Daher muss diese Konfliktvariable (conflicting<br />

variable) durch zwei Knoten (Beispiel: x 18 und ¬x 18 ) dargestellt werden 4 .<br />

Für die Konfliktanalyse kann man sich auf die Knoten beschränken, von denen<br />

aus es einen Pfad zu einer Konfliktvariable gibt.<br />

Werden die Knoten der aktuellen Entscheidungsebene betrachtet, kann es<br />

Knoten geben, durch die alle Pfade von der aktuellen Entscheidungsvariable zu<br />

den beiden Konfliktknoten laufen. Im Beispiel sind diese Eindeutige Implikationspunkte<br />

(Unique Implication Point, UIP) die Entscheidungsvariable x 12 ,sowie<br />

¬x 2 und ¬x 10 .EineÄnderung des Wertes eines UIP würde den Konflikt verhindern.<br />

Die UIPs können nach ihrer Entfernung zum Konflikt sortiert werden.<br />

Der dem Konflikt am nächsten liegende Knoten ist der erste UIP (First UIP),<br />

im Beispiel ¬x 10 .<br />

5.2 Konfliktklauseln und Schnitte<br />

Tritt ein Konflikt auf, kann dieser mit einer neuen Klausel beschrieben werden.<br />

Diese Konfliktklausel 5 ist unerfüllbar, genau dann wenn der Konflikt auftritt.<br />

Lernen bedeutet somit, die Konfliktklausel zur Klauselmenge hinzuzufügen, um<br />

eine Wiederholung des Konflikts zu verhindern.<br />

4 In [17] wird eine andere, aber äquivalente Darstellung mit Konfliktknoten κ verwendet.<br />

5 im Gegensatz zur konfliktverursachenden Klausel (conflicting clause)


116<br />

Das Bestimmen der Konfliktklausel kann auf den Implikationsgraphen übertragen<br />

werden. Dazu wird der Graph bipartitioniert 6 . Der Teilgraph, der die<br />

Konfliktvariable enthält, wird Konfliktseite (conflict side) genannt, der andere<br />

Teilgraph Ursachenseite (reason side). Die Grenze zwischen beiden Partitionen<br />

wird Schnitt (cut) genannt. Literale in Knoten auf der Ursachenseite, die Kanten<br />

auf die oder von der Konfliktseite hatten, werden invertiert in die gelernte<br />

Klausel aufgenommen.<br />

Beispiele für Schnitte sind in Abbildung 10 gezeigt. Bei dem äußeren Schnitt<br />

(hier: Entscheidungsschnitt) sind die betroffenen Knoten x (1)<br />

4 , ¬x(5) 12<br />

Somit kann die Konfliktklausel ω κ = ¬x 4 + x 12 + ¬x 16 gelernt werden.<br />

und x(2) 16 .<br />

Entscheidungsschnitt<br />

¬x (5)<br />

12<br />

x (1)<br />

4<br />

x (5)<br />

1<br />

¬x (5)<br />

2 ¬x (5)<br />

x (5)<br />

10<br />

3<br />

x (5)<br />

18<br />

x (2)<br />

16<br />

x (2)<br />

8<br />

¬x (5)<br />

5<br />

¬x (5)<br />

18<br />

First UIP<br />

Konfliktseite<br />

Relsat-Schnitt<br />

Ursachenseite<br />

Abb. 10. Beispiel für einen Implikationsgraph mit Schnitt<br />

Klausellöschung Im Laufe eines Algorithmus können sehr viele neue Klauseln<br />

in die Formel aufgenommen werden. Da eine zu starke Vergrößerung der Klauselmenge<br />

den Suchprozess erschwert, müssen hinzugefügte Klauseln u. U. wieder<br />

entfernt werden.<br />

Geeignete Heuristiken können Klauseln auf ihre Relevanz untersuchen. In<br />

regelmäßigen Aufräumschritten werden dann nicht länger benötigte Klauseln<br />

aus der Klauselmenge entfernt.<br />

6 in zwei Teilgraphen getrennt


117<br />

5.3 Lernschemata<br />

Die Art des Schnitts bedingt die Konfliktklausel. Es existieren verschiedene<br />

Schnittvarianten, die sich in Komplexität und Effizienz (z. B. Klauselgröße) unterscheiden.<br />

In [16] findet sich eine Übersicht über verschiedene Schemata.<br />

Entscheidungsschema Eine intuitive Schnittvariante folgt dem Entscheidungsschema.<br />

Dabei werden alle Entscheidungsvariablen auf die Ursachenseite verschoben,<br />

alle Implikationsvariablen auf die Konfliktseite. Diese Trennung erfolgt<br />

unabhängig von der Entscheidungsebene der Knoten. Betrachtet werden<br />

nur Variablen, deren Knoten einen Pfad zum Konflikt besitzen.<br />

Ein Beispiel ist in Abbildung 10 gezeigt.<br />

Minimaler Schnitt Einen Schnitt zu finden, der möglichst wenig Knoten bzw.<br />

Kanten im Implikationsgraphen betrifft, ist Ziel eines minimalen Schnitts<br />

(min-cut, nicht dargestellt). Aus dem Implikationsgraphen sollen dabei möglichst<br />

wenige Entscheidungs- und Implikationsvariablen entfernt werden, sodass<br />

zwei Partitionen entstehen. Dabei soll eine Seite sämtliche Konfliktvariablen<br />

besitzen, dafür aber keine Entscheidungsvariablen.<br />

Der minimale Schnitt kann mit bekannten graphentheoretischen Algorithmen<br />

bestimmt werden. Von allen hier aufgeführten Schnitten besitzt er die<br />

größte Komplexität mit O(n 2 log n).<br />

Schemata mit UIPs Beim Entscheidungsschema werden Entscheidungsvariablen<br />

als Grenzknoten zwischen den Partitionen verwendet. Dieses Schema kann<br />

man erweitern, wenn UIPs statt nur Entscheidungsvariablen betrachtet werden.<br />

1-UIP Das 1-UIP-Schema (1 UIP) versucht kleine, relevante Klauseln zu finden.<br />

Knoten der aktuellen Entscheidungsebene, die einen Pfad zu einem<br />

Konfliktknoten besitzen und zwischen erstem UIP und Konflikt liegen, stehen<br />

auf der Konfliktseite. Das erste UIP steht mit allen anderen Knoten auf<br />

der Ursachenseite. Die Konfliktklausel enthält daher als einziges Element nur<br />

die Variable des UIP.<br />

Für Abbildung 10 würde der Schnitt so verlaufen, dass die Knoten x 1 , x 3 ,<br />

¬x 5 , x 18 und ¬x 18 auf der Konfliktseite liegen (Schnitt B in Abbildung 11).<br />

Es wird die Klausel ω κ2 = x 10 gelernt.<br />

Alle-UIP Im Alle-UIP-Schema (All UIP) werden auf allen Entscheidungsebenen<br />

die ersten UIPs betrachtet, wobei mit der aktuellen Entscheidungsebene<br />

begonnen wird und dann schrittweise die Ebenen bis zur ersten betrachtet<br />

werden. Der Konfliktseite werden dann alle Knoten des Implikationsgraphen<br />

zugeordnet, die auf ihrer Entscheidungsebene nach dem ersten UIP belegt<br />

wurden und einen Pfad zum Konflikt besitzen. Alle anderen Variablen gehören<br />

zur Ursachenseite. Die resultierende Konfliktklausel enthält aus jeder<br />

betrachteten Entscheidungsebene nur eine Variable.<br />

n-UIP Das Alle-UIP-Schema ist eine Verallgemeinerung des 1-UIP-Schema auf<br />

alle Ebenen. Es sind aber auch Zwischenschritte vorstellbar, bei denen nur<br />

eine bestimme Anzahl von Entscheidungsebenen zurückgegangen wird. Wird<br />

neben der aktuellen Ebene die vorherige mit einbezogen, wird von dem 2-<br />

UIP-Schema gesprochen.


118<br />

Schemata von Implementierungen<br />

Relsat-Schema In Abbildung 10 ist ein Relsat-Schnitt gemäß dem Algorithmus<br />

von Bayardo und Schrag [18] dargestellt. Dabei werden alle Entscheidungsvariablen<br />

und die Implikationsvariablen früherer Entscheidungsebenen auf<br />

die Ursachenseite gesetzt. Die Implikationsvariablen der aktuellen Entscheidungsebene<br />

befinden sich auf der Konfliktseite. Im Beispiel der Abbildung<br />

wird die Konfliktklausel ω κ = ¬x 4 + ¬x 8 + x 12 + ¬x 16 gelernt.<br />

GRASP-Schema Das GRASP-Schema (siehe Abschnitt B.1) verwendet verschiedene<br />

Untervarianten.<br />

Rekonvergenz von UIPs Kantenpfade, die von einem UIP der aktuellen<br />

Entscheidungsebene ausgehen, laufen bei einem anderen UIP wieder zusammen.<br />

Diese Rekonvergenz (reconvergence) kann für einen Schnitt verwendet<br />

werden, wobei sich innerhalb des Schnitts kein Konflikt befindet.<br />

Im Beispiel in Abbildung 11 ist ein solcher Schnitt mit A gekennzeichnet<br />

und verläuft zwischen x 12 (Entscheidungsvariable) und ¬x 10 (UIP). Die<br />

gelernte Klausel ist ω κA = x 10 + x 12 + ¬x 16 .<br />

Ab erstem UIP Eine weitere Konfliktklausel erstellt GRASP aus einem<br />

Schnitt auf der aktuellen Entscheidungsebene zwischen dem ersten UIP<br />

(vom Konflikt aus gesehen) und allen Knoten näher am Konflikt. Die<br />

Art von Schnitt wird auch von GRASP (s. o.) angewandt. Abbildung 11<br />

zeigt diesen Fall als Schnitt B. Die gerlernte Klausel ist hier ω κB = x 10 .<br />

Backtracking Führt auch die alternative Belegung der Entscheidungsvariablen<br />

der aktuellen Ebene zum Widerspruch, kann der Konflikt auf dieser<br />

Entscheidungsebene nicht aufgelöst werden. Ein neuer Schnitt wird<br />

vorgenommen, der alle Knoten der aktuellen Entscheidungsebene auf<br />

die Konfliktseite stellt und Knoten früherer Entscheidungsebenen auf<br />

die Ursachenseite. Um diesen Konflikt aufzulösen, muss der Algorithmus<br />

auf eine frühere Entscheidungsebene springen. Dieser Sprung basiert<br />

auf dem Schnitt und ist Basis für den nicht-chronologischen Rücksprung<br />

(Abschnitt 5.5).<br />

Dieser Schnitt entspricht Schnitt C in Abbildung 11. Die durch den<br />

Schnitt gewonnene Klausel ist ω κC = ¬x 4 + x 12 .<br />

Die Bestimmung eines Schnitts erfordert die Traversierung des Implikationsgraphen.<br />

Die Komplexität hängt somit von der Anzahl der Kanten und Knoten<br />

ab (O(V + E)).<br />

5.4 Einfache Fehler<br />

In der gelernten Konfliktklausel ist zu jedem Literal dessen Entscheidungsebene<br />

bekannt. Ist die höchste vorkommende Entscheidungsebene gleich der aktuellen<br />

Entscheidungsebene, kann der Konflikt ohne Rücksprung (Backtracking) gelöst<br />

werden.<br />

Falls für die Entscheidungsvariable der aktuellen Ebene noch nicht beide Belegungen<br />

ausprobiert wurden, kann der Konflikt durch Invertieren der Belegung


119<br />

Schnitt C<br />

Schnitt B<br />

¬x (2)<br />

12<br />

x (1)<br />

4<br />

x (5)<br />

1<br />

¬x (5)<br />

2 ¬x (5)<br />

x (5)<br />

10<br />

3<br />

x (5)<br />

18<br />

x (5)<br />

16<br />

x (5)<br />

8<br />

¬x (5)<br />

5<br />

¬x (5)<br />

18<br />

Schnitt A<br />

Abb. 11. Beispiel für einen Implikationsgraph mit Schnitt nach GRASP<br />

gelöst werden. In [17] wird in diesem Fall von failure-driven assertion (FDA) gesprochen,<br />

da die neue Belegung der Entscheidungsvariable nicht länger von einer<br />

echten” Entscheidung kommt, sondern durch den Fehler erzwungen wird. Implikationen,<br />

die sich aus der ursprünglichen Belegung ergaben, werden rückgängig<br />

”<br />

gemacht.<br />

Falls beide Varianten der Belegung der aktuellen Entscheidungsvariable ausprobiert<br />

wurden und zum Konflikt führten, liegt die Ursache des Konflikts auf<br />

einer anderen Ebene und ein Rücksprung ist notwendig.<br />

5.5 Rücksprung<br />

Einfacher Rücksprung Das in Abschnitt 2.1 vorgestellte Davis-Logemann-<br />

Loveland-Verfahren benutzt ein einfaches Backtracking. Da dieser Backtracking-<br />

Algorithmus ähnlich wie ein Stack arbeitet, spricht man auch von einem chronologischen<br />

Backtracking. Tritt ein Fehler auf, wird die zuletzt gewählte Entscheidungsvariable<br />

invertiert, von der noch nicht beide Belegungen probiert wurden.<br />

Diese einfache Variante ist nur bei bestimmten Gleichungen effizient. Unter<br />

Umständen werden viele Rücksprünge vorgenommen und Variablenbelegungen<br />

invertiert, die keinen Einfluss auf den Konflikt haben. Ein Beispiel dazu stellen<br />

die Gleichungen 2 bis 5 auf Seite 6 dar.


120<br />

Nicht-chronologischer Rücksprung Eine Erweiterung zum einfachen Rücksprung<br />

stellt der nicht-chronologische Rücksprung dar. Als Sprungziel wird die<br />

Entscheidungsvariable aus der Konfliktklausel gewählt, die auf der höchsten Entscheidungsebene<br />

vor der aktuellen Ebene belegt wurde. Sind am Rücksprungknoten<br />

bereits beide Alternativen fehlgeschlagen, wird zur nächst kleineren Entscheidungebene,<br />

die den Konflikt mitverursacht hat, gesprungen. Eine Invertierung<br />

ist möglich, falls mindestens ein UIP der aktuellen Entscheidungsebene auf der<br />

Ursachenseite stand. Die Konfliktklausel wird in diesem Fall auch bestimmende<br />

Klausel (Asserting clause) genannt. In [17] wird von conflict-directed backtracking<br />

(konfliktbezogenem Rücksprung) gesprochen, da der Konflikt das Rücksprungziel<br />

bestimmt.<br />

Für das nachfolgende Beispiel ist der Baum in Abbildung 12 skizziert. Gegeben<br />

sind folgende Belegung A für die Formel ϕ:<br />

A = {(x 4 =0@3:NIL), (x 6 =0@4:NIL)}<br />

ϕ =(x 1 + x 3 ) · (x 1 + ¬x 3 + x 4 ) · (¬x 1 + x 5 + x 6 ) · (¬x 1 + ¬x 5 )<br />

In der Entscheidungsebene 9 wird der Entscheidungsvariablen x 1 der Wert<br />

0zugewiesen(x 1 =0@9:NIL). Daraus ergebt sich implizit x 3 =1@9:(x 1 + x 3 ).<br />

Das führt in der Klausel ω 2 =(x 1 + ¬x 3 + x 4 ) zum Konflikt. Da die konfliktverursachende<br />

Entscheidung x 1 = 0 auf der aktuellen Entscheidungsebene getroffen<br />

wurde, kann leicht eine alternative Belegung gewählt werden. Mit x 1 =1folgt<br />

x 5 =1@9:(¬x 1 + x 5 + x 6 ), was nun aber in der Klausel ω 4 =(¬x 1 + ¬x 5 )zum<br />

Konflikt führt.<br />

Ein einfacher Backtracking-Algorithmus würde an dieser Stelle auf die Entscheidungsebene<br />

8 zurückspringen und dort nach einigem Suchen auf den gleichen<br />

Fehler treffen. Mit dem nicht-chronologischen Backtracking kann direkt auf<br />

die Entscheidungsebene 4 gesprungen werden, an der x 6 =0gewählt wurde.<br />

Durch die Wahl der Alternative x 6 = 1 kann der gleiche Fehler wie oben nicht<br />

mehr auftreten.<br />

Nicht-chronologisches Backtracking wurde erstmals in GRASP (siehe Abschnitt<br />

B.1) verwendet.<br />

6 Implikationsgraphen für ATPG<br />

Im Nachfolgenden wird dargestellt, wie die von SAT-Problemen bekannten Implikationsgraphen<br />

(Abschnitt 5.1) auf Gatternetze übertragen werden können.<br />

6.1 Motivation<br />

Implikationsgraphen sind eine Ausdrucksmöglichkeit, unterschiedliche Verfahren<br />

zur Konfliktanalyse bei SAT zu beschreiben. Wie in Abschnitt 5.2 vorgestellt,<br />

wird ein SAT-Solver im wesentlichen durch die Art des Schnitts charakterisiert,<br />

die er anwendet, um den Implikationsgraphen zu bipartitionieren.<br />

Um die Mächtigkeit von SAT-Implikationsgraphen für ATPG-Probleme zu<br />

verwenden, muss im naiven Ansatz das Gatternetz erst in eine SAT-Gleichung


121<br />

Entscheidungsebene<br />

Rücksprung<br />

3<br />

4<br />

9<br />

<br />

<br />

Alternative<br />

Abb. 12. Nicht-chronologisches Backtracking<br />

transformiert werden, bevor es in einen Implikationsgraphen übersetzt werden<br />

kann. Dieser Ansatz hat allerdings drei entscheidende Nachteile:<br />

– Für den Zwischenschritt wird Rechenzeit und Speicherplatz benötigt.<br />

– Die resultierende SAT-Gleichung wird vergleichsweise groß. Bereits ein einfaches<br />

AND-Gatter mit zwei Eingängen wird in drei Klauseln umgesetzt.<br />

– Strukturinformationen, die durch das Gatter gegeben sind, gehen bei der<br />

Umsetzung verloren. Diese Problematik wird am Ende von Abschnitt 6.4<br />

erläutert.<br />

Zur Umgehung der Probleme kann der hier vorgestelle Ansatz für ATPG-<br />

Implikationsgraphen verwendet werden.<br />

6.2 Aufbau von Implikationsgraphen<br />

Der ATPG-Implikationsgraph lässt sich parallel mit der Durchführung des D-<br />

Kalküls (Abschnitt 3.3) aufbauen. Knoten im Implikationsgraphen entsprechen<br />

Leitungen im Gatternetz.<br />

Zur Initialisierung werden in den Implikationsgraphen Knoten<br />

mit gerichteten Entscheidungskanten eingebaut, wobei diese Knoten<br />

Leitungen mit bekanntem Wert repräsentieren. Die Entscheidungskanten<br />

besitzen keinen Ursprung, da die Werte z. B. durch einen FehlerimGatteroderdurchäußere<br />

Entscheidungen vorgegeben sind.<br />

Ausgehend von bestehenden Knoten (Leitungen im Gatter) werden die notwendigen<br />

Implikationen im D-Kalkül und Implikationsgraph durchgeführt. Im<br />

Implikationsgraphen werden dazu über Implikationskanten Knoten eingebaut,<br />

deren Belegung sich durch die direkten Implikationen ergibt. In der graphischen<br />

Repräsentation wird dazu jeder Knoten, der eine Implikation erzwungen hat,<br />

durch eine gerichtete Kante mit den dadurch neu eingefügten Knoten verbunden<br />

c


122<br />

(Abbildung 13(a)). Dieser Schritt wird so lange wiederholt, wie sich notwendige<br />

Implikationen durch das Gatter und seine Belegung ergeben.<br />

a 1<br />

a 2<br />

a 2<br />

a<br />

a 1<br />

a 2<br />

a<br />

a<br />

a<br />

a 1<br />

a 1<br />

(a) Notwendige Implikation bei a =<br />

1 und korrespondierender Implikationsgraph<br />

(b) Entscheidung notwendig bei<br />

a = 1 und korrespondierender Implikationsgraph<br />

für a 1 = 1<br />

Abb. 13. Konstruktionselemente im Implikationsgraph für Gatternetze<br />

Sind alle notwendigen Implikationen durchgeführt worden, kann es notwendig<br />

sein, eine Entscheidung über die Belegung einer Leitung zu treffen. Die Belegungsentscheidung<br />

wird wieder durch eine Entscheidungskante im Implikationsgraphen<br />

repräsentiert. An das Gatter, an dem die Entscheidung getroffen wurde,<br />

schließt eine Leitung an, deren Wert durch eine Implikation bestimmt wurde. Der<br />

zu dieser Leitung korrespondierende Knoten im Implikationsgraphen wird daher<br />

mit einer Entscheidungskante zu dem Knoten verbunden, der die neu belegte<br />

Leitung repräsentiert. Alternative Entscheidungsmöglichkeiten können am Implikationsknoten<br />

graphisch angedeutet werden (Abbildung 13(b)).<br />

Die beiden vorhergehenden Schritte werden abwechselnd durchgeführt, bis<br />

ein Konflikt auftritt (Abbildung 14(a)). Ein Konflikt wird bei einer gegensätzlichen<br />

Belegung einer Leitung durch zwei unabhängige notwendige Implikationen<br />

erzeugt. Im Implikationsgraphen werden die beiden Belegungen durch zwei<br />

Knoten dargestellt. Zur Auflösung des Konflikts werden ausgehend von den beiden<br />

betroffenen Knoten alle Implikationskanten bis zu den Entscheidungskanten<br />

zurückverfolgt. Die Graphknoten, auf die die Entscheidungskanten zeigen,<br />

stehen für Leitungen. Diese Leitungen werden als Eingangsleitungen für eine<br />

Konfliktschaltung verwendet. Die Konfliktschaltungschaltung besteht aus einem<br />

Mehrfach-AND, für dessen Ausgang eine 0 gefordert wird. (Abbildung 14(b)).<br />

Die Konfliktschaltung entspricht einer Konfliktklausel für SAT-Implikationsgraphen.<br />

Die gefundenen Entscheidungskanten bilden einen Schnitt durch den Implikationsgraphen.<br />

Wird die Konfliktschaltung in das Gatternetzwerk eingebaut,<br />

erzwingt das Gatter eine neue Entscheidung von mindestens einer Eingangsleitung.<br />

Dies entspricht einem chronologischen Rücksprung bei SAT-Solvern. Ein<br />

nicht-chronologischer Rücksprung wie bei SAT-Problemen ist im D-Kalkül nicht<br />

möglich, da die Auswahl der nächsten Leitung lokal zur letzten Zuweisung stattfindet<br />

und nicht unabhängig wie bei den Heuristiken der SAT-Solver.


123<br />

c<br />

b ¬b<br />

a<br />

c 1<br />

a 1<br />

(a) Implikationsgraph<br />

a 1<br />

c 1<br />

0<br />

(b) Konfliktschaltung<br />

Abb. 14. Konflikt im Implikationsgraph für Gatternetze und daraus resultierende Konfliktschaltung<br />

Sind alle Alternativen zur Belegung eines Gatters fehlgeschlagen, können die<br />

einzelnen Konfliktschaltungen der betroffenen Leitungen des Gatters zusammengefasst<br />

werden. Dazu werden die bestehenden Konfliktschaltungen mit einem<br />

Gatter kombiniert, das dem Elterngatter der Alternativen entspricht. Im Beispiel<br />

in Abschnitt 6.3 wird ein NOR-Gatter verwendet (Abbildung 17(a)). Das<br />

aus der Kombination entstandene neue Konfliktgatter benötigt keine Wahl für<br />

die Belegung der Leitungen. Alle internen Leitungen können durch Implikationen<br />

belegt werden.<br />

Als Verallgemeinerungsschritt können von dem Knoten der Zusammenfassung<br />

aus die notwendigen Implikationen zu den vorherigen Entscheidungskanten<br />

zurückverfolgt werden. Wird nur eine weitere Entscheidungskante erreicht (wie<br />

im folgenden Beispiel), kann die Belegung der kombinierten Konfliktschaltung<br />

verallgemeinert werden (vgl. Abbildung 17). Werden mehrere Entscheidungskanten<br />

erreicht, müssen die Implikationsknoten, auf die sie zeigen, als Eingangsleitungen<br />

für ein AND-Gatter verwendet werden. Der Ausgang des AND-Gatters<br />

wird mit der Konfliktschaltung an der Stelle verbunden, an der der Knoten<br />

der Zusammenfassung angeschlossen war. Die Kombinations- und Verallgemeinerungsschritte<br />

lassen sich, falls notwendig, wiederholen.<br />

In der resultierenden Konfliktschaltung tritt für eine gegebene Eingangsbelegung<br />

immer dann ein Konflikt auf, wenn auch in der ursprünglichen Schaltung<br />

ein Konflikt auftrat. Allerdings ist im Gegensatz zur ursprünglichen Schaltung<br />

keine Entscheidungsfindung notwendig, der Konflikt ergibt sich durch direkte<br />

Implikationen innerhalb der Konfliktschaltung.<br />

6.3 Beispiel<br />

Die Anwendung des Implikationsgraphen soll nun in einem größeren Beispiel<br />

(orientiert sich an einer Schaltung aus [19]) verdeutlicht werden. In Abbildung 15<br />

ist ein Teil eines Gatternetzwerks gegeben, zu dem die Belegungen a =0,f =1<br />

und g = 1 bekannt sind.<br />

Der Implikationsgraph startet in diesem Beispiel an der Leitung a, gekennzeichnet<br />

mit eingehender Entscheidungskante an den Knoten ¬a im Implikationsgraphen.<br />

Zur Erfüllung der Gattergleichung muss entweder a 1 =0odera 2 =0


124<br />

f = 1<br />

m 1<br />

m 2<br />

d 1<br />

b<br />

d<br />

e<br />

h<br />

a 1<br />

a = 0<br />

n 1<br />

n 2<br />

d 2<br />

a 2<br />

g = 1<br />

j<br />

Abb. 15. Beispiel für ein Gatternetzwerk mit Konflikt<br />

gelten. Hier wird a 1 = 0 weiterverfolgt. Die folgenden OR-Gatter erzwingen daraufhin<br />

e =0,h =0,b = 0 und d = 0. Das zentrale NOR-Gatter erfordert, dass<br />

entweder d 1 =1oderd 2 = 1 gesetzt werden muss. Die Wahl fällt auf d 1 , worauf<br />

das anschließende AND-Gatter m 1 = 1 und m 2 = 1 fordert. Das NAND-Gatter,<br />

mit dem f, m 1 und m 2 verbunden sind, verursacht daraufhin einen Konflikt,<br />

weil f =0ausm 1 und m 2 gefordert wird.<br />

¬a<br />

¬a 1<br />

¬b<br />

¬e<br />

¬d<br />

m 1<br />

¬h<br />

d 1<br />

¬f<br />

f<br />

m 2<br />

Abb. 16. Beispiel für einen Implikationsgraph mit Konflikt<br />

Aus dem Implikationsgraphen ist jetzt eine Konfliktschaltung ableitbar. Vom<br />

Konflikt ausgehend erreicht eine Rückverfolgung die Entscheidungskanten an den<br />

Knoten d 1 und f. Die Konfliktschaltung ist somit ein AND-Gatter mit d 1 und<br />

f als Eingänge und einem Ausgang, für den 0 gefordert wird.<br />

Die Verfolgung der Alternative d 2 = 1 des Knotens ¬d führt ebenfalls zum<br />

Konflikt (nicht dargestellt). Jetzt können die Konflikte von d 1 und d 2 zusammengefasst<br />

werden (Abbildung 17(a)). Dazu wird wie in der ursprünglichen Schaltung<br />

ein NOR-Gatter verwendet. Da die Belegung von d = 0 auf eine notwendige


125<br />

Implikation von a 1 =0zurückgeht, kann die Konfliktschaltung noch weiter verallgemeinert<br />

werden (Abbildung 17(b)). Wird die Konfliktschaltung als ”<br />

Black<br />

Box” betrachtet, besitzt sie nur a 1 , f und g als Schnittstelle. Intern werden nur<br />

drei Gatter verwendet und es ist keine Wahl für die Leitungsbelegung notwendig.<br />

d 1<br />

f<br />

0<br />

d 1<br />

f<br />

0<br />

d<br />

a 1<br />

d 2<br />

g<br />

d 2<br />

g<br />

0<br />

0<br />

(a) Kombination mit NOR-Gatter<br />

als Verbindung<br />

(b) Verallgemeinerung, da d durch<br />

a 1 ersetzt wurde<br />

Abb. 17. Kombination und Verallgemeinerung von Konfliktschaltungen<br />

6.4 Vergleich mit SAT-Implikationsgraphen<br />

ATPG-Implikationsgraphen 7 und SAT-Implikationsgraphen besitzen Gemeinsamkeiten<br />

und Unterschiede.<br />

Der wesentliche Unterschied zwischen beiden Typen von Implikationsgraphen<br />

ist, dass Graphen für SAT-Probleme zwei Arten von Knoten, aber nur eine Art<br />

von Kanten kennen. Bei ATPG-Graphen werden dagegen zwei Kantentypen unterschieden,<br />

dafür gibt es nur einfache Knoten. Bei SAT-Implikationsgraphen<br />

werden Entscheidungen für die Auswahl und Belegung einer Variable, sofern<br />

nicht durch das BCP vorgegeben, unabhängig von den übrigen Belegungen getroffen.<br />

Im SAT-Graphen wird somit unterschieden, ob ein Knoten durch eine<br />

Heuristik oder eine Implikation belegt wird. Dagegen wird im ATPG-Implikationsgraphen<br />

zusätzlich die Information aus dem D-Kalkül eingebaut, wie die<br />

Entscheidung einer Belegung motiviert ist. Dazu wird eine Entscheidungskante<br />

eingebaut, die innerhalb” eines Gatters verläuft und eine mögliche gültige Belegung<br />

der Leitung darstellt. Der Graphknoten, der die durch die Entscheidung<br />

”<br />

belegte Leitung beschreibt, muss daher nicht gesondert behandelt werden.<br />

Als Gemeinsamkeit ist die Darstellung von Abhängigkeitsstrukturen zu nennen.<br />

Beide Implikationsgraphentypen fassen zusammen, wie Belegungen für Variablen<br />

bzw. Leitungen motiviert sind. Im Konfliktfall kann die Ursache durch<br />

Rückverfolgung im Implikationsgraphen gefunden werden und eine Konfliktklausel<br />

bzw. -schaltung erstellt werden. Diese Klausel bzw. Schaltung kann gelernt<br />

7 im Folgenden verkürzt auchATPG=”Graphen genannt.


126<br />

werden (d. h. ins Schaltnetz bzw. die Klauselmenge aufgenommen werden) und<br />

eine Änderung der bisherigen Belegung erzwingen.<br />

Abschließend wird ein einfaches Beispiel für die Unterschiede<br />

zwischen beiden Arten von Implikationsgraphen gezeigt. Für a<br />

die nebenstehenden Schaltung kann die SAT-Gleichung ϕ =<br />

c<br />

b<br />

(¬c + a + b) · (c + ¬a) · (c + ¬b) abgeleitet werden. Aus der<br />

Belegung A = {(c = 0@1:NIL)} folgt implizit die Belegung<br />

A ′ = {(a =0@1:(c+¬a)), (b =0@1:(c+¬b))}. Dargestellt wird der resultierende<br />

Implikationsgraph in Abbildung 18(a). Der entsprechende ATPG-Implikationsgraph<br />

ist in Abbildung 18(b) aufgebaut. Anfänglich wurde die Entscheidung<br />

getroffen, die Belegung c = 0 (entspricht dem Knoten ¬c) vorzunehmen. Davon<br />

ausgehend werden die Implikationskanten zu den Knoten ¬a und ¬b eingefügt.<br />

Interessanter ist der Fall, falls c =1gewählt wird. In diesem Fall ist eine zweite<br />

Belegungswahl notwendig, um die dritte Variable/Leitung zu belegen. Für den<br />

SAT-Fall wird die Belegung a = 1 (entspricht dem Knoten a) bestimmt und in<br />

den Implikationsgraphen (Abbildung 18(c)) eingebaut. Zwar kann durch Entscheidungsebenen<br />

der zeitliche Ablauf der Zuweisungen nachvollzogen werden,<br />

aber nicht, warum a gewählt wurde 8 . Im Implikationsgraphen für das Gatternetzwerk<br />

(Abbildung 18(d)) ist dagegen klar, dass nach der Zuweisung für c<br />

keine notwendige Implikation gefunden wurde, dafür aber eine Entscheidung an<br />

einem Gatter getroffen wurde, an dem die Leitungen c und a angeschlossen sind.<br />

¬a<br />

¬a<br />

(a)<br />

¬c<br />

¬c<br />

(b)<br />

¬b<br />

¬b<br />

c<br />

(c)<br />

c<br />

(d)<br />

a<br />

a<br />

Abb. 18. Unterschiede zwischen Implikationsgraphen<br />

Beide Arten von Implikationsgraphen lassen sich ineinander überführen. Um<br />

einen SAT-Graphen in einen ATPG-Graphen zu konvertieren, werden die Ent-<br />

8 In diesem einfachen Beispiel ist es klar, in größeren Gleichungen trifft eineHeuristik<br />

eine ”<br />

willkürliche”Wahl.


127<br />

scheidungsknoten des SAT-Graphen in normale Knoten umgewandelt und mit<br />

einer eingehenden Entscheidungskante (ohne Anfangsknoten) versehen (Abbildung<br />

19(a)). Umgekehrt werden alle Entscheidungskanten entfernt und die Knoten,<br />

auf die sie zeigten, in Entscheidungsknoten umgewandelt (Abbildung 19(b)).<br />

Es ist offensichtlich, dass bei der Umwandlung von SAT nach ATPG keine Informationen<br />

verloren gehen. Die Umwandlung eines ATPG-Implikationsgraphen<br />

in ein SAT-Graphen dagegen ist mit Informationsverlust verbunden (vgl. jeweils<br />

ersten und dritten Implikationsgraphen in Abbildung 19).<br />

¬a<br />

¬a<br />

¬a<br />

(a)<br />

c<br />

→<br />

c<br />

→<br />

c<br />

¬b<br />

¬b<br />

¬b<br />

-a- -a- -a-<br />

(b)<br />

c<br />

→<br />

c<br />

→<br />

c<br />

¬b<br />

¬b<br />

¬b<br />

Abb. 19. Konversion zwischen Typen von Implikationsgraphen<br />

7 Zusammenfassung & Diskussion<br />

Implikationsgraphen sind eine mächtige Beschreibungsform, um die Konfliktanalyse<br />

verschiedenster SAT-Solver (GRASP, Rel-Sat, . . . ) in einem Konzept<br />

zu vereinheitlichen. Sie sind die Grundlage für die Analyse von bestehenden<br />

Solvern, da sich unterschiedliche Solver im Wesentlichen an den Schnitten im<br />

Implikationsgraphen unterscheiden 9 .<br />

Eine Übertragung von Implikationsgraphen auf ATPG-Probleme baut eine<br />

Brücke zu SAT-Solvern auf. Sie kann als Basis für die Übertragung von Techniken<br />

aus SAT-Solvern auf ATPG-Solver dienen, da Konzepte wie Schnitte und Konfliktklauseln/-schaltungen<br />

erhalten bleiben. Bedingt durch die in Abschnitt 6.4<br />

genannten Gemeinsamkeiten und Unterschiede sind allerdings Anpassungen an<br />

beispielsweise die Datenstrukturen von Gatternetzlisten notwendig.<br />

Nicht betrachtet wurden Implementierungs- und Effizienzaspekte. Daher fehlen<br />

Abschätzungen, wie sich die Laufzeitaspekte von ATPG-Implikationsgraphen<br />

9 Unter Ausblendung von Belegungsheuristiken, Neustarts und weiteren Maßnahmen.


128<br />

im Vergleich mit dedizierten ATPG-Solvern verhalten. Hier besteht weiterer<br />

Forschungs- und Entwicklungsbedarf, etwa in der Programmierung und Austestung<br />

einer Referenzimplementation.<br />

Die Konzeption von Implikationsgraphen für ATPG-Probleme hat gezeigt,<br />

dass sich SAT und ATPG weniger unterscheiden, als es auf den ersten Blick<br />

erscheint. Für beide Probleme lassen sich Algorithmen auf der Basis von Implikationsgraphen<br />

entwickeln.<br />

A<br />

Komplexitätstheorie<br />

Die Komplexitätstheorie betrachtet Algorithmen unter dem Gesichtspunkt des<br />

Verbrauchs von Ressourcen wie Rechenzeit und Speicher. Die Komplexität eines<br />

Algorithmus kann mit der O-Notation beschrieben werden. Die Menge O(g(n))<br />

umfasst dabei alle Algorithmen, für deren Laufzeitberechnungsfunktion f(n)<br />

(Laufzeit des Algorithmus für n Elemente) gilt<br />

O(g(n)) = {f|∃c >0,n 0 > 0 ∧∀n>n 0 : f(n) ≤ cg(n)} (11)<br />

Dabei ist n die Anzahl der betrachteten Elemente (Beispiel TSP: Anzahl<br />

Städte).<br />

Damit kann z. B. dem Quicksort-Algorithmus die Komplexität O(n log n) zugeordnet<br />

werden, wobei n die Anzahl der zu sortierenden Elemente beschreibt.<br />

Für das SAT-Problem gibt es dagegen 2 n verschiedene vollständige Belegungen<br />

(bei n Variablen), sodass SAT in O(2 n ) liegt.<br />

Zur Einordnung von Algorithmen wurden verschiedene Komplexitätsklassen<br />

definiert. Die Komplexitätsklasse P fasst alle Probleme zusammen, die von einer<br />

deterministischen Turingmaschine in polynomieller Zeit bearbeitet werden<br />

können. Für diese Probleme ist g(n) ein Polynom 10 . Mit der Klasse NP werden<br />

die Probleme erfasst, die von einer nicht-deterministischen Turingmaschine in<br />

polynomieller Zeit gelöst werden können. Hier kann g(n) nicht mehr mit einem<br />

Polynom beschrieben werden (Beispiel SAT: g(n) =2 n ).<br />

Ist ein Problem A NP-hart, so sind alle Probleme B ∈ NP darauf polynomiell<br />

reduzierbar und man schreibt B ≤ p A. Polynomiell reduzierbar bedeutet, dass<br />

es eine in polynomieller Zeit berechenbare Funktion f gibt, sodass gilt b ∈ B ⇔<br />

f(b) ∈ A. Eskönnen also alle NP-Probleme mit polynomiellem Aufwand in das<br />

Problem A überführt werden. Gilt weiterhin, dass A ∈ NP, dann ist das Problem<br />

A NP-vollständig.<br />

Es gilt P ⊆ NP. Ob aber auch P = NP gilt, ist eine der zentralen Fragen<br />

in der theoretischen Informatik. Kann gezeigt werden, dass es ein NP-hartes<br />

Problem A mit A ∈ P gibt, folgt daraus P = NP.<br />

Eine formale Beschreibung der Komplexitätstheorie findet sich u. a. in [1].<br />

B<br />

Implementierungen von SAT-Solvern<br />

Eine Übersicht von SAT-Solvern ist in [20] aufgeführt.<br />

10 Auch n log n ist polynomiell, da es ”<br />

kleiner” als n 2 ist.


129<br />

B.1 GRASP –Generic seaRch Algorithm for the Satisfiability<br />

Problem<br />

GRASP ist eine Programmbibliothek von Silva und Sakallah [17], die verschiedene<br />

bekannte Optimierungen für das Davis-Logemann-Loveland (Abschnitt 2.1)<br />

implementiert.<br />

Die wichtigsten Merkmale von GRASP sind:<br />

Nicht-chronologisches Backtracking (vgl. Abschnitt 5.5) für SAT-Probleme<br />

wurde erstmals von GRASP angewandt und baut auf den Erkenntnissen<br />

von BCP (Abschnitt 4.3).<br />

Klauselmitschriften (vgl. Abschnitt B.3), wobei die Aufnahme über Parameter<br />

gesteuert werden kann.<br />

Kausalitätsketten werden aufgezeichnet, wenn sie zu Konflikten führen.<br />

Ablauf Der GRASP-Algorithmus kann als rekursive Funktion dargestellt werden,<br />

wobei jede Rekursionsebene einer Entscheidungsebene entspricht. Abbildung 20<br />

zeigt den Ablauf der Funktion.<br />

Zu Beginn wird eine freie Variable gewählt und eine Entscheidung über ihre<br />

Belegung getroffen. Die Entscheidung wird üblicherweise mit einer Heuristik entschieden<br />

(siehe Abschnitt 4.2), bei GRASP wird DLIS verwendet. Ist die Variablenbelegung<br />

durch die Entscheidung vollständig geworden, wird die Rekursion<br />

erfolgreich abgebrochen.<br />

Andernfalls werden die Unit-Klauseln im BCP verarbeitet. Tritt kein Konflikt<br />

auf, kann in die nächste Entscheidungsebene eingetreten werden. Ist der rekursive<br />

Aufruf erfolgreich, kann auch die aktuelle Rekursionsebene erfolgreich verlassen<br />

werden.<br />

Tritt ein Konflikt in der BCP-Abarbeitung auf, wird dieser in einer Diagnose<br />

untersucht. Die Diagnose berechnet aus den Ursachen des Konflikts eine neue<br />

Klausel, die der Klauselmenge hinzugefügt (gelernt) wird. Da ein Fehler durch<br />

die Entscheidung auf dieser Ebene aufgetreten war, wird diese Entscheidung<br />

rückgängig gemacht. Kann der Konflikt nicht auf der aktuellen Ebene aufgelöst<br />

werden, ist ein nicht-chronologisches Backtracking notwendig. Dabei wird<br />

so viele Rekursionsebenen zurückgesprungen, bis eine Entscheidungsebene gefunden<br />

wird, in der der Konflikt aufgelöst werden kann.<br />

Konfliktdiagnose Tritt während der Durchführung von BCP ein Konflikt auf,<br />

wird dieser von GRASP untersucht. Zum einen kann der Algorithmus aus einem<br />

Konflikt eine neue Klausel berechnen und der Klauselmenge hinzufügen, um das<br />

erneute Auftreten des Konflikts zu verhindern (CBE, conflict-based equivalence).<br />

Zum anderen kann an eine andere Stelle im Suchbaum gesprungen werden, in der<br />

der Fehler nicht auftreten wird. Trat der Konflikt durch eine Entscheidung auf<br />

der aktuellen Entscheidungsebene auf, wird nur die letzte Entscheidung invertiert<br />

(FDA, failure-driven assertion). Haben bereits beide Alternativen für eine<br />

Entscheidung zum Widerspruch geführt, wird ein Sprung an eine frühere Entscheidungsebene<br />

vorgenommen (non-chrological backtracking) und deren Ent-


130<br />

Start<br />

Zuweisungen<br />

dieser Ebene<br />

zurücknehmen<br />

Entscheidung:<br />

Variable belegen<br />

Belegung ist vollständig<br />

Keine Widersprüche<br />

Belegung ist partiell<br />

Diagnose<br />

Konflikt<br />

BCP<br />

Belegung<br />

gefunden<br />

Widerspruch<br />

Kein Konflikt<br />

Zuweisungen<br />

dieser Ebene<br />

zurücknehmen<br />

Konflikt nicht<br />

in diesem δ<br />

Rekursion in<br />

nächste Entscheidungsebene<br />

Belegung ist vollständig<br />

Konflikt<br />

Erfolg<br />

Abb. 20. Flussdiagramm für GRASP<br />

scheidung invertiert (CDB, conflict-directed backtracking). Die Wahl der Rücksprungebene<br />

wird mit Hilfe der gelernten Klausel (beschrieben in Abschnitt 5.3)<br />

getroffen.<br />

B.2 SATO<br />

SATO ist ein aussagenlogischer SAT-Solver von Zhang und Stickel [21,22]. Die<br />

Implementierung verwendet die Regeln des Davis-Putnam-Verfahrens (siehe Abschnitt<br />

2.1) zu Lösung von SAT-Instanzen. SATO wird seit 1993 entwickelt und<br />

liegt inzwischen in der Version 4.1 vor.<br />

Ein wichtiger Aspekt bei der Implementierung des Davis-Putnam-Algorithmus<br />

ist die Heuristik zur Wahl des Literals für die Splitting Rule (Seite 37). Die<br />

Performanz einer Implementierung für unterschiedliche SAT-Instanzen ist stark<br />

abhängig von der verwendeten Heuristik. Mögliche Heuristiken sind, ein Literal<br />

zufällig aus den kürzesten, positiven Klauseln zu wählen oder das Literal mit<br />

häufigsten Vorkommen in binären Klauseln zu bestimmen.<br />

Neben dem Davis-Putnam-Verfahren wendet SATO auch eine Konfliktanalyse<br />

mit intelligentem Zurückspringen (intelligent backjumping). Dieses Zurückspringen<br />

entspricht dem von DLL-Algorithmen bekanntem nicht-chronologischen<br />

Backtracking. Die aus dem Konflikt gelernte Klausel wird zur Klauselmenge<br />

hinzugefügt, wobei die Anzahl der neuen Klauseln im Algorithmus beschränkt<br />

werden kann.


131<br />

Head/Tail-Zeiger Zur Beschleunigung von Resolution und Subsumption werden<br />

Head- und Tail-Zeiger verwendet. In jeder Klausel werden zwei Literale (Head<br />

und Tail) beobachtet, auf die jeweils ein Zeiger verweist. Für die Head- und Tail-<br />

Literale gilt als Invariante, dass außerhalb von ihnen (vor Head und nach Tail)<br />

alle Literale den Wert 0 haben. Wird einem Head- oder Tail-Literal der Wert<br />

0 zugewiesen, wird der entsprechende Zeiger nach innen auf die nächste freie<br />

Variable verschoben. Zeigen beide Zeiger auf das gleiche Literal, ist die Klausel<br />

unit und für die letzte freie Variable wird die notwendige Belegung vorgenommen.<br />

Hat ein Literal in der Klausel den Wert 1, wird die Klausel nicht weiter<br />

beachtet, weil sie nicht unit werden kann. Werden in einem Backtrackingschritt<br />

Variablen freigesetzt, müssen die Head- und Tail-Zeiger neu berechnet werden.<br />

Head<br />

Tail<br />

Head<br />

Tail<br />

0<br />

0 0 0<br />

0<br />

Als Speicherstruktur schlagen die Autoren vor, zu jeder Variablen vier Listen<br />

von Klauseln zu führen. In jeder Liste sind die Klauseln aufgeführt, indem<br />

die Variable in positiver bzw. negativer Form als Head- bzw. Tail-Variable vorkommt.<br />

Bewertung In dem in [22] aufgeführten Vergleichstest wurden die SATO-Versionen<br />

2.2 und 3.0 gegenüber weiteren exakten SAT-Solvern (u. a. GRASP) verglichen.<br />

Als Grundlage wurde eine Auswahl von 15 Instanzen aus dem zweiten DI-<br />

MACS-Wettbewerb [23] verwendet. Während SATO 2.2 vergleichsweise schlecht<br />

abschnitt, erreichte SATO 3.0 gut bis sehr gute Zeitwerte.<br />

B.3 Chaff<br />

Chaff ist ein SAT-Solver, entwickelt von Moskewicz, Madigan, Zhao, Lhang und<br />

Malik [13]. Der Algorithmus ist ähnlich strukturiert wie GRASP, unterscheidet<br />

sich aber von diesem hauptsächlich in seinem BCP-Algorithmus und der Belegungsheuristik.<br />

Basierend auf der Erkenntnis, dass der größte Teil der Rechenzeit eines SAT-<br />

Solvers in der BCP-Funktion verbraucht wird, haben die Autoren ihre Implementierung<br />

in diesem Bereich besonders auf Geschwindigkeit ausgerichtet. Dies<br />

wird einerseits durch eine effiziente Programmierung, andererseits durch geeignete<br />

Datenstrukturen und deren Caching erreicht.<br />

BCP Chaff verwendet das Konzept von beobachteten Literalen (watched literals).<br />

Eine Klausel ist nur dann unit und somit für BCP relevant, wenn weniger als zwei<br />

Literale darin frei bzw. gleich 1 sind. Eine solche Klausel, die für BCP relevant ist,<br />

wird implizit genannt. Um den Wechseln einer Klausel von nicht-implizit nach<br />

implizit effizient zu überwachen, werden in jeder Klausel zwei Literale überwacht.<br />

Wird eines der beiden ausgewählten Literale mit 0 belegt, muss die Klausel


132<br />

untersucht werden. Für eine betrachtete Klausel können sich zwei Möglichkeiten<br />

ergeben:<br />

Klausel ist nicht implizit Außer den beobachteten Literalen a gibt es mindestens<br />

ein weiteres Literal b, das nicht 0 ist. Dann wird die Beobachtung<br />

von den eben mit 0 belegten Literal a auf das Literal b verschoben.<br />

Im nachfolgenden Beispiel wird eine Klausel gezeigt, die zwei freie Variablen,<br />

zwei Literale mit dem Wert 0 und ein Literal mit dem Wert 1 besitzt. Die<br />

beiden freien Literale werden beobachtet. Wird eine der beiden freien Variablen<br />

mit 0 belegt (grau hinterlegt), wird der Beobachtungszeiger auf die 1<br />

gesetzt. Damit bleibt die Anforderung an die beobachteten Literale erhalten.<br />

0 0 1<br />

0 0 0 1<br />

Klausel ist implizit Wird eines der beobachteten Literale mit 0 belegt und es<br />

gibt außer dem anderen beobachteten Literal keine Literale, die nicht 0 sind,<br />

muss das letzte Literal auf 1 gesetzt werden, sofern es noch nicht 1 ist. Durch<br />

eine implizierte Belegung des letzten Literals können andere Klauseln unit<br />

werden und müssen durch den BCP-Algorithmus untersucht werden.<br />

Im Beispiel besitzt das letzte Literal, das nicht 0 ist, bereits den Wert 1. Es<br />

ergeben sich somit keine weiteren Implikationen.<br />

0 0 0 1<br />

0 0 0 0 1<br />

Die anfängliche Auswahl der beobachteten Literale kann zufällig erfolgen.<br />

Die beobachteten Literale ähneln in ihrem Konzept den Head/Tail-Variablen<br />

von SATO. Die Verwendung von beobachteten Literalen hat aber den Vorteil,<br />

dass bei einem Backtracking keine Literale neu ausgewählt werden müssen, da<br />

die bereits früher gewählten Literale frei gegeben werden. Die Freigabe kann<br />

ebenso wie eine Neubelegung in konstanter Zeit durchgeführt werden.<br />

Belegungsheuristik Chaff verwendet die Heuristik Variable State Independent<br />

Decaying Sum (VSIDS) als Belegungsheuristik zur Auswahl der nächsten Entscheidungsvariablen.<br />

Hierbei wird für jedes Literal ein Aktivitätswert geführt.<br />

Der Aktivitätswert wird für alle Literale in einer durch einen Konflikt gelernten<br />

Klausel erhöht. Gleichzeitig werden die Aktivitätswerte für alle Literale kontinuierlich<br />

verringert, indem die Werte mit einer Zahl 0


133<br />

Da die Aktualisierung der Aktivierungsstatistik nur bei Konflikten vorgenommen<br />

wird, hat sie nur einen geringen Anteil an der Gesamtrechenzeit. Gleichzeitig<br />

können bei schwierigen Problemen Verbesserungen der Laufzeit erwartet werden.<br />

Klauselmitschriften Die während der Konfliktbehandlung gewonnen Konfliktklauseln<br />

werden zur späteren Vermeidung von Wiederholungen der Konflikte<br />

gespeichert. Die Speicherung von allen Konfliktklauseln kann zu sehr hohem<br />

Speicherverbrauch führen. Daher verwendet Chaff eine sog. scheduled lazy clause<br />

deletion zum Löschen der Klauseln. Wie der Name andeutet, werden Klauseln<br />

nicht sofort gelöscht, sondern nur zum Löschen markiert. Erst in einem gesonderten<br />

Aufräumschritt werden die markierten Klauseln gelöscht. Eine Klausel<br />

wird zum Löschen markiert, sobald eine gewisse Anzahl von Literalen darin z. B.<br />

durch Backtracking wieder freigegeben wurden.<br />

Neustart Um aus einem Teilbaum zu entkommen, der wenig erfolgversprechend<br />

ist, kann Chaff einen Neustart des Suchalgorithmus durchführen. Dabei werden<br />

alle Variablenbelegungen gelöscht, die bisher gesammelten Konfliktklauseln sowie<br />

die Aktivierungsstatistik aber beibehalten. Dadurch wird vermieden, dass<br />

nach dem Neustart die selben Fehlentscheidungen wie beim vorherigen Durchlauf<br />

getroffen werden. Zusätzlich kann nach einem Neustart für einige Runden<br />

die Belegungsheuristik durch Zufallsmomente angereichert werden.<br />

Bewertung Die von den Autoren vorgestellten Daten deuten darauf hin, dass<br />

Chaff deutlich schneller zu einem Ergebnis gelangt als GRASP oder SATO. Für<br />

erfüllbare SAT-Instanzen ist Chaff etwa um den Faktor 10 schneller als GRASP<br />

und SATO, für unerfüllbare SAT-Instanzen etwa um den Faktor 100 schneller.<br />

B.4 MiniSat<br />

Zur Einführung in das Gebiet der Implementierung von SAT-Solvern stellen<br />

Eén und Sörensson eine minimale Implementierung eines SAT-Solvers vor [24].<br />

Hintergrund zu diesem Projekt ist die Tatsache, dass SAT-Solver i. A. schwierig<br />

zu implementieren sind und die bisherigen Implementierungen von anderen<br />

Gruppen daher nicht sehr eingänglich sind. Diese überschaubare Implementierung<br />

soll daher den Einstieg in die Implementierung von Hochleistungssolvern<br />

ermöglichen.<br />

Die MiniSat-Implementierung basiert auf früheren SAT-Solvern der Autoren<br />

(Satzoo und Satnik) und enthält die folgenden Charakteristika:<br />

– Konfliktbasiertes Backtracking<br />

– BCP mit beobachteten Literalen<br />

– Belegungsheuristik mit Aktivierungswerten


134<br />

Ablauf Der Ablauf der MiniSat-Implementierung ist in Abbildung 21 dargestellt.<br />

Zu Beginn wird eine Variable ausgewählt und mit einem Wert belegt.<br />

Diese anfängliche Belegung wird über den BCP-Algorithmus auf Implikationen<br />

und daraus entstehende Konflikte untersucht. Tritt kein Konflikt auf, wird die<br />

Belegung auf Vollständigkeit geprüft. Im positiven Fall wird der Algorithmus<br />

terminiert und bestätigt die Erfüllbarkeit der SAT-Instanz. Ist die Belegung nur<br />

partiell, wird über eine Heuristik eine freie Variable mit einem Wert belegt und<br />

der Algorithmus tritt wieder in die Propagationsphase ein. Falls die Propagation<br />

zu einem Konflikt führt, muss dieser behandelt werden, indem die Fehlerursache<br />

untersucht und eine alternative Belegung gesucht wird. Wurden alle Belegungskombinationen<br />

ausprobiert, so ist die SAT-Instanz unerfüllbar unter den<br />

gegebenen Randbedingungen. Somit terminiert das Verfahren. Andernfalls wird<br />

versucht, durch ein nicht-chronologisches Backtracking den Fehler zu umgehen.<br />

Gleichzeitig wird die Fehlerursache als neue Klausel gespeichert, um zukünftige<br />

Wiederholungen zu vermeiden.<br />

Start<br />

Suchphase<br />

Propagationsphase<br />

Lernphase<br />

Neue Variable<br />

belegen<br />

Nein<br />

BCP<br />

Konflikt?<br />

Backtracking<br />

und Lernen<br />

Nein<br />

Ja<br />

Vollständige<br />

Belegung?<br />

Analyse:<br />

Unerfüllbar?<br />

Ja<br />

Erfolg<br />

kein Konflikt<br />

Konflikt aufgetreten<br />

Fehler<br />

Abb. 21. Flussdiagramm für die MiniSat-Implementierung<br />

Implementierung Nachfolgend wird detaillierter auf einzelne Aspekte der Implementierung<br />

von MiniSat eingegangen.<br />

Constraints Constraints sind Vorgaben, die den Lösungsraum einschränken. So<br />

sind u. a. die Klauseln der SAT-Gleichung, Variablenbelegungen oder vom Anwender<br />

bestimmte Annahmen Constraints.<br />

Constraints stellen die Datenbasis dar, auf der der Algorithmus arbeitet. Sie<br />

sind mit den enthaltenen Literalen verknüpft und können somit zur Auswertung<br />

beim BCP und zum Finden von Konfliktursachen verwendet werden.


135<br />

Belegungsheuristik Ähnlich wie bei Chaff und Satzoo wird eine Belegungsheuristik<br />

verwendet, welche die Historie eines Literals benutzt. Anders als bei Chaff<br />

werden die Aktivierungswerte aber nur für Variablen und nicht für Literale betrachtet.<br />

Desweiteren werden die Aktivierungswerte nicht regelmäßig durch Skalierung<br />

verringert. Stattdessen wird das Verhältnis zwischen den Werten der<br />

Variablen betrachtet. Ebenso wie bei Chaff wird die Aktivierung einer Variable<br />

erhöht, sobald ein daraus gebildetes Literal Teil eines Konflikts ist.<br />

BCP und überwachte Literale Beim BCP-Algorithmus werden Klauseln daraufhin<br />

untersucht, ob sie nur noch ein freies Literal besitzen. Sind alle anderen<br />

Literale in der Klausel mit 0 belegt, folgt implizit die Belegung des letzten Literals<br />

mit 1. Da die implizierten Belegungen weitere Klauseln unit machen können,<br />

werden die Implikationen durch eine Art Breitensuche weitergereicht.<br />

Zur Überwachung, ob eine Klausel unit ist, werden zwei freie Literale ausgewählt<br />

und beobachtet. Diese Literale werden beobachtete Literale (watched<br />

literals) genannt.<br />

Die Struktur der Überwachung ist in Abbildung 22 abgebildet. Jedes in einem<br />

Constraint (z. B. Klausel) vorkommende Literal wird in einer Liste gespeichert.<br />

Zu jedem Literal in der Liste gibt es eine Liste von Constraints, in denen das<br />

Literal in seiner komplementären Form vorkommt.<br />

Liste aller vorkommenden Literale<br />

x 1 ¬x 1 x 2 ¬x 2<br />

¬x 1 x 3 ¬x 4 ¬x 7<br />

Klausel<br />

Beobachtungsliste<br />

Beobachtete Literale<br />

Abb. 22. Verwaltung der beobachteten Literale<br />

Wird ein nicht beobachtetes freies Literal mit einem Wert belegt, hat das für<br />

die Verwaltung der beobachteten Literale zunächst keine Auswirkung. Wird dagegen<br />

ein beobachtetes Literal mit einem Wert belegt, müssen für jede betroffene<br />

Klausel drei Fälle unterschieden werden.<br />

– Das Literal erhält den Wert 0, es gibt aber weitere, nicht beobachtete frei<br />

Literale. In diesem Fall wird das neu belegte Literal nicht länger beobachtet.<br />

Stattdessen wird ein anderes freies Literal zur Beobachtung ausgewählt.


136<br />

– Das Literal erhält den Wert 0, es gibt aber keine weiteren freien Literale<br />

außer dem anderen beobachteten Literal. Die Klausel ist somit unit und<br />

dem letzten freien Literal muss der Wert 1 zugewiesen werden.<br />

– Das Literal erhält den Wert 1. Hierdurch wird das Komplement des Literals<br />

0 und alle Klauseln, in denen das Komplement vorkommt (über die Beobachtungsliste<br />

bestimmbar), müssen untersucht werden. Zur Beobachtung wird<br />

ein anderes freies, unbeobachtes Literal gewählt.<br />

Backtracking und Lernen Tritt bei der Belegung und dem anschließenden BCP<br />

ein Konflikt auf, muss dieser behandelt werden. Dazu wird die aktuelle Belegung<br />

auf die Ursachen des Konflikts untersucht. Rekursiv von der betroffenen Klausel<br />

ausgehend werden die Entscheidungsvariablen gesucht, die den Konflikt verursacht<br />

haben. Ist ein Literal in der untersuchten Klausel eine Entscheidungsvariable,<br />

wird das Literal in die Liste der Verursacher aufgenommen. Ist ein Literal<br />

dagegen durch eine Implikation belegt worden, wird die Klausel untersucht, in<br />

der die Implikation entstand. Aus der Liste der Verursacher wird eine neue Klausel<br />

generiert, die eine erneute gleiche Belegung dieser Variablen verhindern soll.<br />

Diese neue Klausel ist eine Implikation aus der ursprünglichen Klauselmenge<br />

und wird als gelernt bezeichnet.<br />

Von den gefundenen Verursachern des Konflikts wird die Variable ausgewählt,<br />

die zuletzt belegt wurde. In einem nicht-chronologischen Backtracking-<br />

Schritt wird zur Entscheidungsebene der ausgewählten Variable gesprungen und<br />

die komplementäre Belegung gewählt. Sind bereits beide Alternativen eruiert,<br />

wird die nächstältere Variable betrachtet.<br />

Klausellöschung Im Ablauf des Algorithmus könnensicheinegrößere Anzahl<br />

von gelernten Klauseln ansammeln. Da diese gelernten Klauseln die Suchgeschwindigkeit<br />

verringern, können einige Klauseln von einer Heuristik gelöscht<br />

werden. Dazu verwaltet MiniSat für die gelernten Klauseln jeweils Aktivierungswerte.<br />

Klauseln mit niedrigen Aktivierungswerten werden bevorzugt gelöscht.<br />

Die Aktivierungswerte werden erhöht, wenn die Klausel in einem Konflikt wieder<br />

auftritt.<br />

Dadurch kann es aber vorkommen, dass bereits aufgetretene Fehlbelegungen<br />

erneut gemacht werden. Eine optimale Strategie zum Aufbewahren bzw. Entfernen<br />

von gelernten Klauseln hängt von der betrachteten SAT-Instanz ab.<br />

Bewertung Die Autoren geben an, dass MiniSat auch ohne aufwendige Optimierungen<br />

ähnliche Leistungen wie Satzoo oder Chaff erreichen kann. Unter geeigneten<br />

Testbedingungen können die beiden ”<br />

professionellen” Implementierungen<br />

sogar übertroffen werden.<br />

C<br />

Regeln bei Davis & Putnam<br />

Davis und Putnam [4] verwenden noch weitere Optimierungsmaßnahmen, die<br />

hier kurz vorgestellt werden sollen. Diese Optimierungen können vor der eigentlichen<br />

Suche angewandt werden, da sie die Formel vereinfachen und diese


137<br />

vereinfachte Formel genau dann gültig ist, wenn die ursprüngliche Formel auch<br />

gültig ist.<br />

Tautologie Klauseln, die komplementäre Literale enthalten, können aus der Formel<br />

gestrichen werden. Die Tautologie-Regel muss vor den nachfolgenden Regeln<br />

angewandt werden.<br />

Im Beispiel kann die zweite Klausel entfernt werden<br />

ϕ =(x 1 + ¬x 2 ) · (x 1 + ¬x 1 ) · (x 2 + ¬x 3 )<br />

PLR – Pure Literal Rule Kommt eine Variable nur in positiven oder negativen<br />

Literalen vor, kann sie mit dem Wert 1 bzw. 0 belegt werden. Damit werden die<br />

Klauseln, in denen dieses Literal vorkommt, automatisch wahr und können für<br />

die nachfolgende Lösungssuche vernachlässigt werden.<br />

Im untenstehenden Beispiel ist die Variable x 1 pur. Mitν(x 1 )=1können<br />

die ersten beiden Klauseln erfüllt werden.<br />

ϕ =(x 1 + ¬x 2 ) · (x 1 + x 3 ) · (x 2 + ¬x 3 )<br />

Ein-Literal-Klauseln Bestehen Klauseln nur aus einem Literal, so muss dieses<br />

Literal implizit den Wert 1 erhalten. Daraus folgend können alle Klauseln, die<br />

das gleiche Literal enthalten, gestrichen werden (da sie den Wert 1 haben). In<br />

Klauseln, die das Literal in seiner komplementären Form enthalten, wird nur<br />

dieses komplementäre Literal gelöscht (da es immer den Wert 0 haben wird).<br />

Im untenstehenden Beispiel wird der Vorgang demonstriert.<br />

ϕ =(x 1 ) · (¬x 1 + ¬x 2 + x 4 ) · (x 2 + ¬x 3 ) · (x 1 + ¬x 4 )<br />

ϕ =(¬x 2 + x 4 ) · (x 2 + ¬x 3 )<br />

Splitting Rule Eine Klauselmenge lässt sich in drei Untermengen A, B und R<br />

aufteilen, wenn eine Variable x gewählt wurde. Die Klauselmenge A enthält alle<br />

Klauseln, die x nur als positives Literal enthalten. B enthält die Klauseln, die x<br />

nur als negatives Literal enthalten. In R liegen alle restlichen Klausel, wobei in<br />

diesen Klauseln die Variable x in keinem Literal vorkommen darf. Dann können<br />

die Mengen A ′ und B ′ gebildet werden, die keine Literale mit x enthalten. Die<br />

Klauselmengen A ′ ∪ R und B ′ ∪ R können anschließend getrennt untersucht<br />

werden.<br />

Literatur<br />

1. Wegener, I.: Theoretische Informatik. Leitfäden und Monographien der Informatik.<br />

B. G. Teubner, Stuttgart (1993)<br />

2. Cook, S.A.: The complexity of theorem-proving procedures. In: Conference Record<br />

of Third Annual ACM Symposium on Theory of Computing. (1971) 151–158<br />

3. Bibel, W.: Deduktion. Handbuch der Informatik. Oldenburg, München (1992)<br />

4. Davis, M., Putnam, H.: A computing procedure for quantification theory. Journal<br />

of the ACM 7 (1960) 201–214


138<br />

5. Stålmarck, G.: System for determining propositional logic theorems by applying<br />

values and rules to triplets that are generated from a formula (1989) Patentiert in<br />

den U.S.A, Europa und Schweden.<br />

6. Davis, M., Logemann, G., Loveland, D.: A machine program for theorem-proving.<br />

Communications ACM 5 (1962) 394–397<br />

7. Wirth, N.: Algorithms + Data Structures = Programs. Prentice-Hall (1975)<br />

8. Bryant, R.E.: Graph-based algorithms for boolean function manipulation. IEEE<br />

Trans. on Computers C-85 (1986) 677–691<br />

9. Wolfgang Kunz, J.P.M.S., Malik,S.: 12. Logic Synthesis and Verification. In:<br />

SAT andATPG: Algorithms for Boolean Decision Problems. Kluwer Academic<br />

Publishers (2001) 309–341<br />

10. Roth, J.P.: Diagnosis of automata failures: Acalculus and a method. IBM Journal<br />

of Research and Development 10 (1966) 278–291<br />

11. Fujiwara, H., Shimono, T.: On the acceleration of test generation algorithms. IEEE<br />

Transactions on Computers 32 (1983) 1137–1144<br />

12. Marques-Silva, J.P.: The impact of branching heuristics in propositional satisfiability<br />

algorithms. Proceddings of the 9th Portuguese Conference on Artificial<br />

Intelligence (EPIA) (1999)<br />

13. Moskewicz, M.W., Madigan, C.F., Zhao, Y., Zhang, L., Malik, S.: Chaff: Engineering<br />

an Efficient SAT Solver. In: Proceedings of the 38th Design Automation<br />

Conference (DAC’01). (2001)<br />

14. Goldberg, E., Novikov, Y.: Berkmin: Afast and robust sat solver. Design Automation<br />

and Test in Europe (DATE) 2002 (2002) 142–149<br />

15. Beame, P., Kautz, H., Sabharwal, A.: Understanding the power of clause learning.<br />

In: Proceedings of the 18th International Joint Conference on Artificial Intelligence<br />

(IJCAI). (2003) 1194–1201<br />

16. Zhang, L., Madigan, C.F., Moskewicz, M.W., Malik, S.: Efficient conflict driven<br />

learning in boolean satisfiability solver. In: ICCAD. (2001) 279–285<br />

17. Marques-Silva, J.P., Sakallah, K.A.: GRASP –Anew search algorithm for satisfiability.<br />

Technical Report CSE-TR-292-96, The University of Michigan (1996)<br />

18. Jr., R.J.B., Schrag, R.C.: Using csp look-back techniques to solve realworld sat<br />

instances. In: Proceedings of the 14th National Conference on Artificial Intelligence.<br />

(1997) 203–208<br />

19. Wang, C., Reddy, S.M., Pomeranz,I.,Lin,X.,Rajski, J.: Conflict driven techniques<br />

for improving deterministic test pattern generation. In: Proceedings of the 2002<br />

IEEE/ACM international conference on Computer-aided design, ACM Press (2002)<br />

87–93<br />

20. Zhang, L., Malik, S.: The quest for efficient Boolean satisfiability solvers. In<br />

Voronkov, A., ed.: Automated Deduction – CADE-18. Volume 2392 of Lecture<br />

Notes in Computer Science., Springer-Verlag (2002) 295–313<br />

21. Zhang, H., Stickel,M.E.: An efficient algorithm for unit propagation. In: Proceedings<br />

of the 4th International Symposium on Artificial Intelligence and Mathematics.<br />

(1996)<br />

22. Zhang, H.: SATO: an efficient propositional prover. In: Proceedings of the International<br />

Conference on Automated Deduction (CADE’97), volume 1249 of LNAI.<br />

(1997) 272–275<br />

23. Du, D., Gu,J., Pardalos,P.M., eds.: Satisfiability Problem: Theory and Application.Volume<br />

35 of Dimacs Series in Discrete Mathematics and Theoretical Computer<br />

Science. American Mathematical Society (1997)<br />

24. Eén, N., Sörensson, N.: An extensible SAT-solver. Proceedings of the 6th International<br />

Conference on Theory and Applications of Satisfiability Testing (2003)


139<br />

Formaler Äquivalenzvergleich<br />

Florian Rothländer<br />

Technische Universität <strong>Kaiserslautern</strong><br />

Zusammenfassung: Während property checking (model checking) darauf<br />

abzielt, die Korrektheit einer Spezifikation sicherzustellen, ist es die<br />

Aufgabe des Äquivalenzvergleichs (equivilance checking) die Äquivalenz<br />

einer Implementierung mit der ursprünglichen Spezifikation. Dadurch<br />

werden Fehler erkannt, die während der zahlreichen Entwurfsverfeinerungen<br />

auftreten können. Der Aquivalenzvergleich beruht auf BDD- und<br />

SAT-basierten Verfahren zur Ausnutzung struktureller Ähnlichkeiten.<br />

Die grundlegenden Ansätze des formalen Äquivalenzvergleich sollen in<br />

dieser Arbeit gegenübergestellt werden.<br />

1 Einleitung<br />

In dieser Seminararbeit geht es um die grundlegenden Ansätze zum formalen<br />

Äquivalenzvergleich.<br />

Dabei geht es um den Vergleich von zwei digitalen Schaltungen. Eine dieser<br />

Schaltung ist die von den Entwicklern ursprünglich Spezifizierte (Spezifikation),<br />

die Andere eine davon modifizierte Version (Implementierung). Das Ziel lautet<br />

dann: <strong>Verifikation</strong> der Implementierung, sprich: “Handelt es sich bei der Implementierung<br />

noch um dieselbe spezifierte Funktion?“<br />

Zwei Schaltungen sind dabei gleich, wenn sie auf die gleichen Eingaben mit denselben<br />

Ausgaben reagieren.<br />

Modifizierungen, welche bei der Implementierung auftreten, sind unter anderem<br />

Logikoptimierungen (auf der Gatterebene), sequentielle Optimierungen oder Änderungen<br />

beim Layout durch die Umsetzungen zwischen verschiedenen Beschreibungsebenen<br />

(Synthese) während der Implementierung.<br />

Um nun zu verifizieren, dass die neue Schaltung immer noch genau dasselbe<br />

leistet wie die ursprünglich Spezifizierte, führt man einen Äquivalenzvergleich<br />

durch. Dies ist gerade bei den heutigen komplizierten und immer größer werdenden<br />

Schaltungen sehr wichtig - man denke an Handys oder PCs, um teuere<br />

Rückrufaktionen 1 und Imageverluste zu verhindern. Schließlich kann man im<br />

Gegensatz zu Software kein Update oder Service Pack nachliefern, um das Problem<br />

nachträglich zu beseitigen. Von daher ist auch das Interesse der Industrie<br />

an schnellen und vollständigen Lösungen heutzutage sehr groß.<br />

1 Siehe Intel Pentium 60, Fehler in der Fließkomma-Arithmetik(Division) 1994, Rückrufaktion<br />

kostete Intel 475 Millionen Dollar


140<br />

Man unterscheidet grundsätzlich zwischen dem kombinatorischen und dem sequentiellen<br />

Äquivalenzvergleich. Dabei ist der Unterschied, dass bei Letzterem<br />

die Schaltungen Register enthalten können und somit innere Zustände besitzen.<br />

Ein Zustand einer solchen Schaltung repräsentiert also die gesamte Vorgeschichte<br />

des Schaltwerks. Bei kombinatorischen Schaltungen genügen zur vollständigen<br />

Charakterisierung die aktuellen Werte am Eingang der Schaltung.<br />

Unter gewissen Bedingungen kann man auch bei sequentiellen Schaltungen Algorithmen<br />

des kombinatorischen Äquivalenzvergleichs verwenden. Dazu ist es<br />

zuerst einmal erforderlich, dass keine sequentiellen Optimierungen vorgenommen<br />

worden sind, was bei den gängigen Verfahren in der Industrie meist der Fall<br />

ist.Manverwendetdanneinen Algorithmus, welcher äquivalente Zustände beider<br />

Schaltungen findet (siehe Abschnitt 2.1 das sogenannte Latch Mapping oder<br />

auch State Matching Verfahren). Danach kann man jeweils für einen zeitlichen<br />

Rahmen (time frame) einen kombinatorischen Äquivalenzvergleich durchführen.<br />

In dieser Ausarbeitung werde ich daher nach einer kurzen Erläuterung des Latch<br />

Mapping nicht näher auf dden sequentiellen Aquivalenzvergleich eingehen, sondern<br />

mich auf die Algorithmen für den kombinatorischen Äquivalenzvergleich<br />

beschränken, da dieser auch für sequentielle Verfahren genutzt werden kann.


141<br />

2 Prinzipieller Ablauf<br />

Als erstes müssen beide Schaltungen in eine gleiche Beschreibungsebene transformiert<br />

werden. Meist ist dies die Gatterebene.<br />

Danach wird bei sequentiellen Schaltungen als Zwischenschritt das Latch Mapping<br />

durchgeführt und dann können die Verfahren des kombinatorischen Äquivalenzvergleiches<br />

angewendet werden.<br />

Übersicht:<br />

Lesen der beiden<br />

Schaltungsbeschreibungen<br />

Anpassen der Beschreibungsebenen<br />

Bestimmung äquivalenter<br />

Zustandsvariablen / Eingänge<br />

Kombinatorischer<br />

Äquivalenzvergleich<br />

Äquivalent<br />

Nicht<br />

äquivalent<br />

Abbildung 1: prinzipieller Ablauf


142<br />

2.1 Latch Mapping / State Matching<br />

Die Voraussetzungen beim kombinatorischen Äquivalenzvergleich fordern gleiche<br />

Zustandskodierungen der Schaltungen. Die gängigen Syntheseverfahren in der<br />

Industrie bewahren diese auch größtenteils.<br />

Um einen kombinatorischen Äquivalenzvergleich bei sequentiellen Schaltungen<br />

anwenden zu können, müssen erst äquivalente Zustandvariablen gefunden werden.<br />

Sofern keine sequentiellen Optimierungen vorgenommen wurden, kann das<br />

Latch Mapping diese Variablen finden. Das Verfahren versucht gleiche Zustände<br />

zweier Schaltungen zu bestimmen, wenn dies nicht manuell oder automatisch<br />

anhand gleicher Signalnamen möglich ist.<br />

Ablauf der Prozedur:<br />

– Lege alle Zustandsvariablen in eine Äquivalenzklasse<br />

– Beweise die Nichtäquivalenz einiger Zustandsvariablen; Möglichkeiten hierzu<br />

sind:<br />

• Simulation, wie im Beispiel auf Seite 5<br />

• Analyse der Schaltungsstruktur<br />

• Algorithmen der ATPG 2 ,SAT 3 oder symbolische Simulation mittels<br />

BDDs 4<br />

– Spalte die Äquivalenzklassen entsprechend den Ergebnissen auf<br />

– Wiederhole Schritt 2 und 3 bis keine Änderungen mehr auftreten<br />

2 Automatic Test Pattern Generation<br />

3 boolesches Erfüllbarkeitsproblem<br />

4 Binary Decision Diagrams


143<br />

2.1.1 Beispiel Erster Schritt: Lege alle Zustandsvariablen in eine Klasse und<br />

simuliere. Es werden jeweils binäre Werte angelegt und die Ergebnisse verglichen.<br />

a<br />

b<br />

c<br />

d<br />

Schaltung 1<br />

a’<br />

b’<br />

c’<br />

d’<br />

0,0<br />

1,0<br />

1,0<br />

1,1<br />

0,1<br />

e<br />

e’<br />

1,0<br />

f<br />

g<br />

h<br />

Schaltung 2<br />

f’<br />

g’<br />

h’<br />

0,0<br />

1,0<br />

1,1<br />

Variablen des<br />

Momentanzustandes<br />

Variablen des<br />

Nachfolgezustandes<br />

Abbildung 2: Latch Mapping Beispiel 1


144<br />

Zweiter und dritter Schritt: Bilden der Klassen {a, f}, {b, c, e, g} und {d, h} und<br />

weiter iterieren, um diese Klassen nochmals aufzuteilen. Somit ergeben sich nun<br />

2 3 Eingangskombinationen.<br />

a<br />

b<br />

c<br />

d<br />

Schaltung 1<br />

a’<br />

b’<br />

c’<br />

d’<br />

2 3 Kombinationen<br />

möglich<br />

e<br />

e’<br />

Variablen des<br />

Momentanzustandes<br />

f<br />

g<br />

h<br />

Schaltung 2<br />

f’<br />

g’<br />

h’<br />

Variablen des<br />

Nachfolgezustandes<br />

Abbildung 3: Latch Mapping Beispiel 2<br />

Jetzt stehen die endgültigen Klassen fest. Die zusammengehörigen Zustandspaare<br />

sind gefunden. Zum Beispiel hier {a, f}, {d, h}, {b, g} und {c, e}. Damitwäre<br />

das “latch mapping“ abgeschlossen.<br />

Jetzt beginnt das Vergleichen der Schaltungen.


145<br />

3 Ansätze<br />

3.1 Erster Ansatz<br />

Ein erster Ansatz besteht in der Simulation der Schaltungen. Man versucht alle<br />

Eingangskombinationen der beiden Schaltungen durchzutesten und beobachtet<br />

dabei die Ausgangsvektoren. Sind sie bei jeder Eingangskombination gleich, sind<br />

die Schaltungen äquivalent. Wenn man alle Kombinationen durchspielt, handelt<br />

es sich um eine sogenannte erschöpfende Simulation, welche einen formalen Beweis<br />

darstellt.<br />

Es stellte sich sehr schnell heraus, dass diese Art des Vergleichs sehr ineffizient<br />

und unpraktisch ist. Die Anzahl der Kombinationen von Eingangsbelegungen<br />

(auch Testvektoren genannt) steigt exponentiell mit der Anzahl der Eingänge<br />

an. Verwendet man ein kleineres Set, ist es kaum möglich herauszufinden, ob<br />

man damit wirklich jeden Zustand der Schaltung einmal erreicht hat, und somit<br />

ist dies kein formaler Äquivalenzbeweis mehr.<br />

Bei sequentiellen Schaltungen muss man zusätzlich noch überlegen, wieviele time<br />

frames manbetrachtenmöchte, bis abgebrochen wird. Somit scheidet diese<br />

Art des Äquivalenztests in der Praxis für große Schaltungen aus.<br />

3.2 OBDD Ansatz<br />

Die nächste Idee war die Verwendung von Ordered Binary Decision Diagrams,<br />

kurzOBDDs.DiesehabennachderEinführung von Bryant 1986 [3] eine sehr<br />

große Beliebtheit erfahren, und die Algorithmen zur Berechnung von OBDDs<br />

sind inzwischen sehr schnell und effizient.<br />

Definition OBDD:<br />

Gegeben eine Variablenmenge V = {x 1 , ··· ,x n } mit einer Ordnung ≤.<br />

Ein OBDD über den Variablen V bezüglich der Ordnung < ist dann ein Tupel<br />

mit folgenden Eigenschaften:<br />

G =(V ∪{L 0 ,L 1 },v 0 ,label,high,low)<br />

– ∀v ∈ V [label(v) ∈ V ]<br />

– label(L 0 ) = 0 und label(L 1 )=1<br />

– high: V → V ∪{L 0 ,L 1 } mit label(v)


146<br />

Ein solcher OBDD definiert eine boolesche Funktion f v0 wie folgt, rekursiv, über<br />

die Shannon Dekomposition:<br />

f v0 = x i · f low(v0) + x i · f high(v0)<br />

Wendet man nun noch zwei Regeln an, nämlich die Eliminationsregel 5 und die<br />

Isomorphieregel 6 ,erhält man einen sogenannten ROBDD, einen “reduzierten“<br />

OBDD, welcher die praktische Eigenschaft hat, dass er die minimale zur Darstellung<br />

der Funktion notwendige Anzahl von Knoten enthält und kanonisch ist.<br />

Als Beispiel hierzu Abbildung 4<br />

0<br />

x 2<br />

0 0<br />

x 1<br />

x 2<br />

1<br />

x 1<br />

x 2<br />

0 1<br />

Abbildung 4: Beispiel x 1 ∧ x 2, links OBDD, rechts ROBDD<br />

Zum Äquivalenzvergleich bildet man nun für jede Schaltung die boolesche Funktion<br />

7 , daraus mittels der Shannon-Zerlegung den BDD und vergleicht die beiden<br />

ROBDDs auf Isomorphie. Sind sie isomorph, sind es auch die beiden Funktionen<br />

und somit die beiden Schaltungen äquivalent.<br />

Das erste Problem hierbei besteht in der Konstruktion der BDDs. Es gibt “bösartige“<br />

Funktionen, bei denen die BDD-Größe exponentiell mit der Anzahl der<br />

Variablen ansteigt (Beispiel Integer Multiplikation, Beweis siehe [3]).<br />

Das zweite Problem ist die Wahl der Variablenordnung, die bei der Größe des<br />

entstehenden ROBDDs von entscheidender Bedeutung ist. Das Finden der optimalen<br />

Variablenordnung ist NP-complete. Es gibt also keine Algorithmen, welche<br />

polynomiale Laufzeit haben und dieses Problem lösen. Der beste Algorithmus<br />

momentan hat eine Laufzeit von O(3 n n 2 ). Deswegen verwendet man meist Heuristiken.<br />

Trotzdem ist dieses Problem noch nicht zufriedenstellend gelöst, und<br />

es kann passieren, dass die entstehenden BDDs einfach zu groß und komplex<br />

werden, um sinnvoll mit ihnen arbeiten zu können.<br />

5 Ist v.high =v.low, lösche v und führe alle Kanten nach v.high um<br />

6 Ist label(v) = label(v ′ ) und außerdem v.high/low =v’.high/low dann lösche v und<br />

lenke alle Kanten nach v’ um<br />

7 Zum Beispiel wie bei dem SAT Ansatz


147<br />

3.3 SAT Ansatz<br />

Bei SAT(=satisfiability) handelt es sich um das boolesche Erfüllbarkeitsproblem.<br />

Gegeben ist eine Formel in KNF, zum Beispiel (x 1 ∨ x 2 ) ∧ (x 3 ∨ x 4 ) und gesucht<br />

ist eine Belegung der Literale {x 1 , ··· ,x 4 }, welche diese Formel erfüllt. Dazu<br />

müssen die beiden Klauseln (x 1 ∨x 2 ) und (x 3 ∨x 4 )erfüllt werden. Eine Belegung,<br />

welche dieses Kriterium erfüllt, ist zum Beispiel {x 1 =1,x 2 =1,x 3 =0,x 4 =1}.<br />

Eine naive Vorgehensweise um eine solche Belegung zu finden wäre:<br />

1. Weise den Variablen schrittweise die Werte 0/1 zu und speichere die Entscheidung<br />

in einem Entscheidungsbaum<br />

2. Prüfe, ob die aktuelle Belegung der Variablen alle Klauseln erfüllt<br />

3. Ist dies nicht der Fall, gehe einen Schritt im Entscheidungsbaum zurück, und<br />

belege die Variable mit einem anderen Wert(Backtracking)<br />

4. Wiederhole, bis entweder eine Lösung gefunden, oder keine Variable mehr<br />

einen anderen Wert erhalten kann.<br />

Diesen Ansatz nennt man auch die Davis-Logemann-Loveland Procedure, ein<br />

einfacher Backtracking Algorithmus. In dieser Form ist er natürlich nicht effizient<br />

und führt zu exponentieller Laufzeit. Ausgehend von diesem Grundgerüst<br />

erweitert man diesen Ansatz mit neuen Regeln, um die Laufzeit zu verbessern.<br />

Einige Regeln, die angewendet werden, sind:<br />

unit clause rule Wenn die Zuweisung eines Wertes einer einzelnen Variable<br />

dazu führt, dass die Klausel zu einer Einheit wird, dann muss diese Variable<br />

den Wert 1 haben. Beispiel: (x 1 ∨¬x 2 ∨ x 3 ) und die aktuelle Zuweisung ist<br />

{x 1 =0,x 2 =1}, dann bildet diese Klausel eine Einheit und die verbleibende<br />

Variable x 3 muss den Wert 1 erhalten.<br />

boolean constraint propagation Die iterative Anwendung der unit clause<br />

rule nennt man auch boolean constraint propagation.<br />

pure literal rule Liegen für eine Variable x alle Literale in positiver oder negativer<br />

Form vor, so kann diese Variable einen Wert erhalten, welcher alle<br />

Klauseln erfüllt.<br />

Um nun SAT-Algorithmen benutzen zu können, müssen zwei Dinge geschehen.<br />

Alserstesbildetmanfür die Schaltungen die sogenannte Miter-Anordnung (siehe<br />

Abbildung 5). Die zusammengehörigen Eingänge und Ausgänge werden einzeln<br />

mit ⊕ verknüft, die Ausgänge führen dann in ein ∨-Gatter. Wenn die beiden<br />

Schaltkreise äquivalent sind, ergibt sich am Ausgang immer 0, da die ⊕-<br />

Gatter nur eine 1 ergeben, wenn einer der beiden Eingänge eine 1 war. Die<br />

∨-Verknüpfung prüft dann nur, ob einer der ⊕-Gatter eine logische 1 als Ergebnis<br />

ergab.<br />

Kann man eine Wertebelegung finden welche E = 1 erzeugt ist ein Testvektor<br />

für den Beweis der Nichtäquivalenz gefunden.


148<br />

x 1<br />

x 2<br />

.<br />

Schaltung 1<br />

⊕<br />

x n<br />

⊕<br />

∨<br />

Ē<br />

x 1<br />

x 2<br />

.<br />

Schaltung 2<br />

.<br />

⊕<br />

x n<br />

Abbildung 5: Miter-Anordnung<br />

Als zweites muss diese Schaltungsbeschreibung in KNF überführt werden. Um<br />

für eine Schaltung, welche in Gatterform vorliegt, eine KNF-Formel zu erlangen,<br />

wird einfach eine Konjunktion der einzelnen KNF-Formeln der Gatter gebildet.<br />

Eine KNF-Formel für ein Gatter x = f(x 1 , ··· ,x n ) erlangt man, indem man als<br />

erstes die Funktion ξ x (x, x 1 , ···x n )=x ⊕ f(x 1 , ···x n ) bildet, und diese dann<br />

als ein Produkt von Summen darstellt.<br />

Das Problem ist auch bei diesem Ansatz, dass die Algorithmen für diese Schaltungsanordnung<br />

bei großen Gattern viel zu lange brauchen, um die Erfüllbarkeit<br />

festzustellen.<br />

3.4 ATPG Ansatz<br />

ATPG, kurz für Automatic Test Pattern Generation, wurde ursprünglich entwickelt,<br />

um Testvektoren für eine Schaltung zu erzeugen. Diese Testvektoren<br />

sollten so beschaffen sein, dass sie Fehler in der Hardware aufdecken können, und<br />

zwar Fehler wie “stuck-at-1“ also eine Leitung ändert ihren Wert nicht mehr.<br />

Diese können dann an dem in Hardware gegossenen Chip eingesetzt werden, um<br />

mögliche Fehler aufzudecken.<br />

Die Aufgabenstellung lautet dann zum Beispiel:<br />

Gegeben ist eine Fehlerliste Φ mit Zielfehlern, erstelle geeignete Eingangsstimuli<br />

x, um diese aufzudecken.<br />

Ein Testvektor ist ein Test für den Fehler φ, wenndieAntwortz der fehlerhaften<br />

Schaltung auf den Eingangsvektor x eine andere ist, als die bei der fehlerfreien<br />

Schaltung. Der Zusammenhang zum Äquivalenzvergleich ergibt sich recht


149<br />

schnell, wenn man auf Basis der Miter-Anordnung die Frage stellt, ob E =1<br />

sein kann. Also erstelle einen Testvektor, welcher mir E = 1 erzeugt.<br />

Gibt es einen solchen Testvektor nicht, sind die beiden Schaltungen äquivalent,<br />

ähnlich wie auch bei den SAT-Verfahren.<br />

Allgmeine Probleme bei ATPG sind:<br />

Beobachtbarkeit Ein Fehler, der injiziert wird, und für den ein Testvektor<br />

erzeugt werden soll, muss beobachtbar sein. Das heißt, dass er zumindest<br />

einen der Ausgänge der Schaltung erreichen muss.<br />

Steuerbarkeit EinFehlermusssichauchbiszudenprimären Eingängen einer<br />

Schaltung zurückverfolgen lassen, damit überhaupt ein Testvektor erstellt<br />

werden kann.<br />

Mehr dazu unter [8].<br />

Bei der Verwendung von ATPG in Bezug zum Äquivalenzvergleich ergibt sich das<br />

Problem der Beobachtbarkeit nicht. Ausgehend von der Miter-Anordnung sucht<br />

man einen Test für den Fehler “stuck-at-0“ am Ausgang des Miters. Benötigt<br />

wird hier nur die Steuerbarkeit, um an einen Testvektor zu gelangen, aus dem<br />

dann der Widerspruch zur Äquivalenz der beiden Schaltungen gefolgert werden<br />

kann.


150<br />

4 Heutiger Stand<br />

Die vorherigen Ansätze haben die gesamte Schaltung als Ganzes zu überprüfen<br />

versucht. Dies ist gerade bei großen Schaltungen sehr ineffizient und verbraucht<br />

sehr viel Rechenzeit und/oder Speicherplatz.<br />

Daher führten die Überlegungen in die Richtung, ob es nicht möglich sei, gewisse<br />

Eigenschaften im Designprozess / Syntheseprozess auszunutzen, um die Problematik<br />

zu vereinfachen.<br />

Genau dies führte dann zu den ersten neueren Ansätzen von Brand und Kunz<br />

[4], [5] 1993, welche zeitgleich vorgestellt wurden.<br />

4.1 Strukturelle Ähnlichkeiten<br />

Ein typischer Syntheseprozess führt inkrementell viele kleine Operationen auf<br />

den Schaltungen aus, und bewahrt damit oft strukturelle Ähnlichkeiten in diesen.<br />

Es wird nun versucht genau das auszunutzen, um die gesamte Schaltungsanordnung<br />

zu vereinfachen.<br />

x 1<br />

x 2<br />

.<br />

Schaltung 1<br />

⊕<br />

x n<br />

interne Äquivalenzen<br />

⊕<br />

∨<br />

Ē<br />

x 1<br />

x 2<br />

.<br />

.<br />

Schaltung 2<br />

.<br />

⊕<br />

x n<br />

Abbildung 6: Miter Anordnung<br />

Die grundsätzliche Idee war es, wieder ausgehend von der Miter-Anordnung, das<br />

Problem zu vereinfachen, indem diese interne Äquivalenzen gefunden werden<br />

(siehe Abbildung 6).<br />

Die Vorschläge, wie diese strukturellen Ähnlichkeiten ausgenutzt und wie sie gefunden<br />

werden, unterscheiden die nachfolgenden Ansätze.


151<br />

4.1.1 Erste Idee Die beiden Schaltungen repräsentieren die Funktionen F 1<br />

und F 2 . Gesucht sind Teilfunktionen f 1 und f 2 von F 1 und F 2 ,für die gilt<br />

f 1 = f 2<br />

Das Finden der beiden Subfunktionen gelingt mittels eines Testgenerators (zum<br />

Beispiel ATPG-Algorithmen). Man verbindet beide Funktionen mit einem ⊕-<br />

Gatter und versucht Testvektoren zu finden, welche am Ausgang eine 1 erzeugen.<br />

Wenn solche Subfunktionen gefunden sind, gilt es diese auszunutzen. Dabei gibt<br />

es ein Problem: Das einfache Ersetzen der Funktionen durch eine neue Variable<br />

x, also ein Partitionieren der Schaltungen, kann zu dem Problem false negatives<br />

führen (siehe 4.2). Deswegen wurde von Brand vorgeschlagen, einfach eine<br />

Funktion durch die andere zu ersetzen (siehe Abbildung 7). Damit teilen beide<br />

Schaltungen dieselbe Version der Funktion, und die gesamte Miter-Anordnung<br />

wird reduziert. Desweiteren prüfte Brand noch, ob zum Beispiel f 1 = f 2 , und<br />

ersetzt dann ebenfalls entsprechend.<br />

Schaltung 1<br />

f 1<br />

⊕<br />

?<br />

F 1<br />

⇒<br />

Schaltung 1<br />

f 1<br />

F 1<br />

Schaltung 2<br />

F 2<br />

Schaltung 2<br />

F 2<br />

f 2<br />

f 2<br />

Abbildung 7: Teste ob f 1 = f 2, wenn ja, ersetze f 1 durch f 2<br />

Der resultierende neue Miter F 1 (f 2 ) ⊕ F 2 (f 2 ) ist nun kleiner, und somit ist der<br />

Äquivalenzvergleich einfacher geworden. Der gesamte Vorgang ist nun, ausgehend<br />

von den Eingängen der Schaltungen, schrittweise bis zu den Ausgängen,<br />

diese identischen Funktionen zu finden und zu ersetzen. Im besten Fall besteht<br />

F 1 am Ende nur noch aus Funktionen von F 2 , und die Äquivalenz ist bewiesen,<br />

ansonsten liefert der Testgenerator ein Gegenbeispiel.<br />

4.1.2 Zweite Idee Dieser Ansatz arbeitet ähnlich wie der Vorhergehende und<br />

wurde auch zeitgleich auf derselben Veranstaltung von Kunz [5] vorgeschlagen.<br />

Der Unterschied ist, dass hier rekursives Lernen angewendet wird, um die internen<br />

Äquivalenzen zu finden, und die gefundenen Äquivalenzen in den Knoten


152<br />

direkt gespeichert werden, also keine Substitution stattfindet.<br />

Rekursives Lernen hat die Aufgabe, präzise Implikationen über vorher bestimmte<br />

Signale zu machen. Diese Implikationen sind sowohl:<br />

einfache Implikationen: Liegt zum Beispiel an einem Und-Gatter eine 0 an,<br />

weiss man, dass am Ausgang ebenfalls der Wert 0 anliegt, ohne die weiteren<br />

Eingangssignale kennen zu müssen. Liegt an einem Oder-Gatter eine 1 an,<br />

weiss man auch, dass am Ausgang ebenfalls eine 1 anliegen wird.<br />

direkte Implikation: Eine direkte Implikation ergibt sich aus dem mehrfachen<br />

Anwenden der einfachen Implikationen, nur dass mehrere Gatter betrachtet<br />

werden.<br />

indirekte Implikationen: Sind solche, welche nicht aus direkten Implikationen<br />

ermittelt werden können. Sie sind also wesentlich schwerer zu ermitteln.<br />

Dies sind die hier betrachteten präzisen Implikationen.<br />

Mit dem Finden von Implikationen können also alle Wertebelegungen herausgefunden<br />

werden, die notwendig sind, um zum Beispiel bei der Miter-Anordnung<br />

am Ausgang E = 1 zu erzeugen. Da damit auch das SAT Problem gelöst würde,<br />

ist dieses Verfahren natürlich NP-vollständig (siehe Abschnitt 3.3).<br />

Der Algorithmus ermittelt zuerst alle direkten Implikationen, einfach durch das<br />

Auswerten der Wahrheitstabellen für die einzelnen Gatter. Die schwereren indirekten<br />

Implikationen werden dann durch rekursives Lernen ermittelt. Dabei<br />

werden in der Schaltung temporär Gatterausgänge mit Werten belegt, und es<br />

werden die logischen Konsequenzen, die sich daraus für die Gattereingänge ergeben,<br />

gesucht.<br />

Dies geschieht rekursiv von den Eingängen bis hin zu den Ausgängen und kann<br />

somit alle notwendigen Belegungen herausfinden. Die Ergebnisse werden in den<br />

einzelnen Knoten gespeichert, und werden nachher für den Äquivalenztest für<br />

die gesamte Schaltung verwendet, wobei ein SAT-Algorithmus verwendet wird.<br />

4.1.3 Weitere Ideen In den letzten Jahren haben weitere Arbeiten versucht<br />

die Verfahren noch effizienter zu gestalten. Unter anderem hat man wieder mit<br />

BDDs gearbeitet, aber diesmal nicht mehr für die gesamte Schaltung, sondern<br />

nur für Teile dieser. Zum Beispiel 8 erstellt man für interne Knoten BDDs und<br />

sucht dann nach isomorphen BDDs, um die internen Äquivalenzen zu finden.<br />

Die so gefundenen isomorphen BDDs werden dann zusammengefügt, und die<br />

Schaltung verkleinert sich.<br />

Beginnend werden erst für die Eingänge BDDs gebildet und dann für die innerenKnotenbishinzudenAusgängen.<br />

Bei den ersten BDDs, welche noch rein<br />

primäre Schaltungseingänge enthalten, ist dies problemlos. Kompliziert wird es<br />

8 bei [6] und [7]


153<br />

erst, wenn man BDDs für innere Knoten erstellt, und für die alten BDDs neue<br />

Variablen einführt (cut points). Dies führt zu einer Partitionierung der Schaltung<br />

und genau dadurch tritt auch bei diesen BDD-basierten Ansätzen wieder<br />

das Problem des false negatives auf und es müssen komplizierte und aufwendige<br />

Verfahren durchlaufen werden, um diese zu beseitigen.<br />

Eine Möglichkeit ist an der sogenannten Cut Frontier, also der Grenze der bisherigen<br />

BDD-Ausbreitung, mehrere neue BDDs schichtenweise zu erstellen. Diese<br />

neuen BDDs müssen dann aus anderen Variablen aufgebaut werden. Das heißt,<br />

dass sich das sogenannte support set für diese neuen BDDs unterscheiden muss 9 .<br />

Dieses Set besteht aus den Variablen, die den BDD bilden. Je mehr unterschiedliche<br />

BDDs für die inneren Knoten aufbaut werden, desto höher ist die Chance<br />

false negatives zu vermeiden. Wenn dies auch nicht zum Ziel führt, muss man<br />

die neu eingeführten Variablen, welche für die BDDs stehen, wieder resubstituieren,<br />

im worst-case bis hin zu den primären Eingängen der Schaltung. Dadurch<br />

kann es natürlich wieder zu einer Explosion der BDD-Größe kommen, was die<br />

Verfahren uneffizient macht.<br />

9 Eine Heuristik zum Finden von “guten“ support sets auf Basis von funktionaler<br />

Implikation, findet sich in [7]


154<br />

Als Beispiel für das Auftreten von false negatives durch BDDs an inneren Knotenpunkten,<br />

siehe folgende Schaltung:<br />

Schnittlinie<br />

g<br />

∧<br />

x 1<br />

b<br />

a<br />

∧<br />

d<br />

e<br />

∨<br />

∧<br />

c<br />

NOT<br />

∧<br />

∨<br />

x 3<br />

x 2<br />

∧<br />

NOT<br />

∨<br />

y 1<br />

f<br />

∧<br />

g<br />

∧<br />

x 1<br />

b<br />

a<br />

∧<br />

d<br />

∨<br />

c<br />

∧<br />

∨<br />

x 3<br />

x 2<br />

∧<br />

NOT<br />

∨<br />

y 2<br />

e<br />

NOT<br />

f<br />

∧<br />

Abbildung 8: Beispiel cut frontier<br />

Erstelle jetzt BDDs an der Schnittlinie, mit den substituierten Variablen x 1 ,x 2<br />

und x 3 und es ergeben sich die Schaltungen inkl. der BDDs wie auf Abbildung<br />

9.<br />

Wie man sieht sind die BDDs der daraus resultierenden Schaltungen nicht isomorph,<br />

obwohl y 1 = y 2 gilt. Als weiteres Beispiel zu false negatives siehe auch


155<br />

x 1<br />

x 3<br />

d<br />

e<br />

b<br />

x 2<br />

∧<br />

NOT<br />

∧<br />

NOT<br />

∨<br />

y 1<br />

x 1<br />

x 3<br />

e<br />

b<br />

x 2<br />

NOT<br />

∧<br />

NOT<br />

∨<br />

y 2<br />

x 2<br />

x 2<br />

x 1<br />

x 1<br />

x 3<br />

BDDs sind nicht isomorph<br />

x 3<br />

e<br />

e<br />

b<br />

d<br />

b<br />

0 1<br />

0 1<br />

Abbildung 9: BDDs nicht isomorph<br />

nachfolgenden Abschnitt 4.2.<br />

Ein weiteres Verfahren welches zum Einsatz kommt ist<br />

Hashing: Viele Algorithmen erstellen sich aus der Gatterbeschreibung einen<br />

neuen Graphen. Dabei werden Gatter direkt gehasht, wobei man zum Beispiel<br />

als Schlüssel die Gatterfunktion und die Eingangsvariablen verwendet.<br />

So können schon bei der Konstruktion des Graphen strukturell gleiche Teile<br />

direkt erkannt werden (gleiche Schlüssel).


156<br />

4.2 False-Negatives-Problem<br />

Zwei Schaltungen sind äquivalent, obwohl innere Funktionen nicht äquivalent<br />

sind. Dies liegt an den internen Schittpunkten, an denen nicht alle Wertebelegungen<br />

auftreten können. Siehe Abbildung 10.<br />

Die beiden Schaltungen sind äquivalent, sprich x = y, auchsinds 1 und s ′ 1 ,sowie<br />

s 2 und s ′ 2 äquivalent. Wenn man nun aber diese Signale einfach nimmt und<br />

substituiert, den vorherigen Teil also wegschneidet, wird der Algorithmus annehmen,<br />

dass die beiden Schaltungen nicht äquivalent sind. Er kennt nämlich dann<br />

die Vorgeschichte der beiden Signale s 1 und s 2 nicht mehr. Die Wertebelegung<br />

{s 1 =1,s 2 =1} wird dann nämlich als Gegenbeispiel zur Gleichheit gefunden,<br />

obwohl diese niemals aufteten kann.<br />

Schaltung 1<br />

Schaltung 2<br />

A<br />

B NOT<br />

C<br />

∧<br />

∧<br />

s 1<br />

s 2<br />

∨<br />

x<br />

A<br />

B NOT<br />

C<br />

∧<br />

∧<br />

s ′ 1<br />

s ′ 2<br />

⊕ y<br />

Abbildung 10: Ein false negatives Beispiel<br />

Dieses Problem tritt immer dann auf, wenn man versucht Teile der Schaltung<br />

abzuschneiden. Es ist nicht ohne weiteren Aufwand möglich, dieses Problem zu<br />

beseitigen.


157<br />

5 Fazit<br />

Wie oben gesehen ist der kombinatorische Äquivalenzvergleich zwischen zwei<br />

Schaltungen sehr komplex. Es gibt verschiedene Verfahren, welche alle ihre Vorund<br />

Nachteile haben. ATPG- / SAT-Verfahren sind vollständig, das heißt sie finden<br />

auf jedenfall eine Lösung, haben aber sehr lange Laufzeiten. Algorithmen,<br />

welche die Schaltungen partitionieren kämpfen mit dem false negative Problem<br />

und Anwendungen von BDDs erfordern unter Umständen sehr viel Speicher.<br />

Die Ausnutzung von strukturellen Ähnlichkeiten hat sich durchgesetzt, da die<br />

meisten industriellen Syntheseverfahren viele Äquivalenzpunkte zwischen der<br />

Spezifikation und der Implementierung bewahren. Dies erlaubt inzwischen die<br />

Bearbeitung von Schaltungen, welche aus Millionen von Gattern bestehen und<br />

ist für die meisten Anwendungen ausreichend.<br />

Der Vorgang des Äquivalenzvergleichs in der Industrie verwendet eine Vielzahl<br />

von Verfahren sequentiell. Wenn eine Engine den Vergleich nicht schafft, wird die<br />

nächste angeworfen, welche dann schon die gefundenen internen Äquivalenzen<br />

nutzen kann. Worst-Case Schaltungen für die Verfahren sind Multiplizierer, da<br />

bei diesen leider kaum interne Äquivalenzpunkte existieren.<br />

Gui Frontend<br />

enthält unter anderem:<br />

Parser für Schaltungsbeschreibung<br />

Syntheseverfahren für die Umsetzung<br />

in die Gatterebene<br />

Multiple Engine Backend<br />

Hashing strukturell<br />

gleicher Teile<br />

Simulation<br />

BDDs<br />

SAT / ATPG<br />

Verfahren<br />

Abbildung 11: Multiple Engine für den Äquivalenzvergleich


158<br />

Literatur<br />

1. Prof. Dr. Kunz: Skript <strong>Verifikation</strong> digitaler <strong>Systeme</strong> (2003)<br />

2. Prof. Dr. Schneider: Skript <strong>Verifikation</strong> <strong>reaktiver</strong> <strong>Systeme</strong> (2003)<br />

3. Bryant, R.E: Graph-based algorithms for Boolean function manipulation, aus IEEE<br />

Transactions on Computers C35.8, Seite 677-691 (1986)<br />

4. Brand, Daniel: Verification of Large Synthesized Designs, IEEE (1993)<br />

5. Kunz, Wolfgang: HANNIBAL: AnEfficient Tool for Logic Verification Based on<br />

Recursive Learning, IEEE (1993)<br />

6. Kuehlmann, A.,Krohm,F.: Equivalence Checking Using Cuts and Heaps, erschienen<br />

Im Oktober 1996 als Report RC 20587, im IBM T.J Watson Research Center<br />

7. Matsunaga, Yusuke: AnEfficient Equivalence Checker for Combinational Circuits,<br />

Kawasaki 211-88 (1996)<br />

8. Kunz, W., Marques-Silva, J., Malik, S.: SAT andATPG: Algorithms for Boolean<br />

Decision Problems, aus Logic Synthesis and Verification, Kluwer Academic Publishion<br />

(2001)


159<br />

Übersetzung prädikatenlogischer Formeln in<br />

endliche Automaten<br />

Thomas Türk<br />

Technische Universität <strong>Kaiserslautern</strong><br />

Zusammenfassung. In diesem Text sollen kurz endliche Automaten<br />

über unendlichen Wörtern – sogenannte ω-Automaten –vorgestellt werden.<br />

Darauf aufbauend wird gezeigt, dass spezielle Prädikatenlogiken,<br />

S1S und MSO


160<br />

diesem Einsatzbereich sind aber neben der Addition sowie leicht in Presburger-<br />

Arithmetik definierbaren Operationen wie Subtraktionen oder Shifts auch Bitvektoroperationen<br />

wichtig. Daher soll abschließend die Erweiterung der Presburger-Arithmetik<br />

um Bitvektoroperationen betrachtet werden. Es wird gezeigt<br />

werden, dass dies eine echte Erweiterung der Presburger-Arithmetik darstellt,<br />

dass also Bitvektoroperationen nicht in Presburger-Arithmetik definierbar sind.<br />

Außerdem wird gezeigt werden, dass das Entscheidungsproblem dieser um Bitvektoroperationen<br />

erweiterten Presburger-Arithmetik nicht elementare Komplexität<br />

besitzt. Dagegen ist das Entscheidungsproblem der Presburger-Arithmetik<br />

in O(2 22n )lösbar.<br />

Vorausgesetzt werden grundlegende Kenntnisse der Aussagenlogik sowie der<br />

Prädikatenlogik erster und zweiter Stufe. Endliche Automaten über endlichen<br />

Wörtern werden zwar kurz vorgestellt, aber auch hier werden Kenntnisse vorausgesetzt.<br />

Bei Problemen sei auf die entsprechende Literatur wie z. B. [Sch04]<br />

verwiesen. Auf diesem Buch basiert ein Großteil dieses Textes. Unter anderem<br />

stammen auch die verwendeten Schreibweisen aus diesem Buch.<br />

1 ω-Automaten<br />

ω-Automaten sind endliche Automaten über unendlichen Wörtern. Um diese<br />

einzuführen, sollen zunächst Wörter und endliche Automaten über endlichen<br />

Wörtern betrachtet werden. Diese Betrachtung wird jedoch kurz ausfallen, da<br />

grundlegende Kenntnisse vorausgesetzt werden. Bei Problemen sei auf die entsprechende<br />

Literatur verwiesen.<br />

1.1 endliche Automaten auf endlichen Wörtern<br />

Definition 1 (Wort, Alphabet). Sei Σ eine nicht leere Menge. Eine Funktion<br />

α : {i ∈ N | i


161<br />

Beispiel 1. Sei A =(Σ,S, I, R) ein Semiautomat (siehe Abb. 1) mit:<br />

– Σ = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}<br />

– S = {s 0 ,s 1 ,s 2 }<br />

– I = {s 0 }<br />

– R = {(s i ,j,s k ) | i + j ≡ k mod 3}<br />

Das Wort α = 312 über dem Alphabet Σ besitzt in dem A den Durchlauf<br />

s 0 s 0 s 1 s 0 .DaA deterministisch ist, ist dies der einzige Durchlauf von α durch A.<br />

0, 3, 6, 9<br />

s 0<br />

2, 5, 8<br />

2, 5, 8<br />

1, 4, 7<br />

s 1 s 2<br />

2, 5, 8<br />

0, 3, 6, 9 0, 3, 6, 9<br />

Abb. 1: Beispiel 1<br />

Die hier betrachteten endlichen Automaten sollen Wörter in zwei Klassen einteilen,<br />

die akzeptierten und die nicht akzeptierten Wörter. Um dies zu ermöglichen<br />

müssen Semiautomaten um eine Akzeptanzbedingung erweitert werden. Für<br />

endliche Wörter besteht diese Akzeptanzbedingung üblicherweise aus einer Menge<br />

von Zuständen F und der Setzung, dass ein Wort genau dann akzeptiert wird,<br />

wenn es einen Durchlauf s (0) ...s (n) dieses Wortes durch den Semiautomaten mit<br />

s (n) ∈F gibt. Formal bedeutet dies:<br />

Definition 4 (Endlicher Automat über endlichen Wörtern). Ein endlicher<br />

Automat über endlichen Wörtern A =(B, F) ist ein Tupel, wobei B =<br />

(Σ,S, I, R) ein Semiautomat und F⊆Sdie Menge der Finalzustände von A ist.<br />

A besteht also aus einem Semiautomaten B und der Menge der Finalzustände.<br />

Meist wird A in der Form (Σ,S, I, R, F) angegeben.<br />

Ein endliches Wort α über Σ wird genau dann von A akzeptiert (Schreibweise:<br />

α |= A), wenn es einen Durchlauf s (0) s (1) ...s (n) ∈ RUN B (α) gibt mit<br />

s (n) ∈F.<br />

Beispiel 2. Erweitert man den Semiautomaten aus Beispiel 1 um F = {s 0 },so<br />

akzeptiert A genau das leere Wort ε und jede Dezimalzahl, deren Quersumme<br />

durch 3 teilbar ist, d. h. jede Dezimalzahl, die durch 3 teilbar ist.


162<br />

1.2 ω-Automaten<br />

Diese Definition der endlichen Automaten auf endlichen Wörtern soll mit möglichst<br />

wenig Änderungen auf unendliche Wörter übertragen werden. Das Konzept<br />

der Durchläufe durch einen Semiautomaten lässt sich leicht anpassen. Ein Durchlauf<br />

eines unendlichen Wortes ist jedoch selbst unendlich. Somit ist die Übertragung<br />

der Akzeptanzbedingung auf unendliche Wörter nicht so leicht möglich<br />

wie die Übertragung der Durchläufe.<br />

Definition 5 (Durchlauf eines unendlichen Wortes). Sei A =(Σ,S, I, R)<br />

ein Semiautomat und α : N → Σ ein unendliches Wort über Σ. Dann heißt ein<br />

Wort β : N →Süber S Durchlauf von α durch A genau dann, wenn gilt: β (0) ∈I<br />

und (β (i) ,α (i) ,β (i+1) ) ∈Rfür alle i ∈ N.<br />

Die Menge alle Läufe eines Wortes α durch einen Semiautomaten A wird<br />

mit RUN A (α) bezeichnet. Gibt es für jedes Wort über Σ genau einen Durchlauf,<br />

so heißt A deterministisch.<br />

Betrachtet man für die Akzeptanzbedingung analog zum endlichen Fall eine<br />

Menge F von Zuständen, so ergeben sich diesmal mehrere mögliche, sinnvolle<br />

Definitionen für die Akzeptanz eines unendlich langen Wortes. Ein unendlich<br />

langes Wort könnte z. B. genau dann akzeptiert werden, wenn es einen Durchlauf<br />

gibt, der<br />

– die Menge F nie verlässt<br />

– die Menge F mindestens einmal besucht<br />

– ab einem bestimmten Zeitpunkt die Menge F nicht mehr verlässt<br />

– die Menge F unendlich oft besucht.<br />

Alle diese verschiedenen Akzeptanzbedingungen sind praxisrelevant und führen<br />

zu unterschiedlichen Automaten mit unterschiedlicher Ausdruckskraft. Mit<br />

ihrer Hilfe lassen sich für die Spezifikation wichtige Eigenschaft formulieren wie<br />

– Sicherheitseigenschaften, diefür alle Eingaben immer gelten sollen,<br />

– Lebendigkeitseigenschaften, diefür alle Eingaben mindestens einmal gelten<br />

sollen,<br />

– Persistenzeigenschaften, diefür alle Eingaben ab einem bestimmten Zeitpunkt<br />

gelten sollen,<br />

– Fairnesseigenschaften, diefür alle Eingaben unendlich oft gelten sollen.<br />

Im Folgenden sollen alle diese möglichen Akzeptanzbedingungen betrachtet<br />

und die daraus entstehenden Automaten als ω-Automaten bezeichnet werden.<br />

Dazu werden ω-Automaten als Formeln dargestellt.


1.3 Automatenformeln<br />

Sei A =(Σ,S, I, R) ein Semiautomat. Da sowohl das Alphabet Σ, alsauch<br />

die Menge der Zustände S endlich ist, können sie jeweils durch eine endliche<br />

Menge von aussagenlogischen Variablen kodiert werden. Sei also Σ =2 VΣ mit<br />

V Σ = {i 0 ,...i n }.AnalogseiS =2 VS mit V S = {q 0 ,...q m }. Damit sind Zustände<br />

Teilmengen von V S und Buchstaben Teilmengen von V Σ . Man kann solche Teilmengen<br />

einer Menge V von aussagenlogischen Variablen als Belegung interpretieren,<br />

die alle in der Menge vorkommenden Variablen mit TRUE und alle nicht<br />

vorkommenden Variablen mit FALSE belegt. Damit lassen sich Mengen solcher<br />

Teilmengen, also z. B. die Menge I der Initialzustände, durch eine aussagenlogische<br />

Formel ϕ kodieren, indem die Menge der Belegungen betrachtet wird, die<br />

ϕ erfüllen.<br />

Beispiel 3. Sei A =(Σ,S, I, R) der Semiautomat aus Beispiel 1, also der Semiautomat<br />

mit:<br />

– Σ = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}<br />

– S = {s 0 ,s 1 ,s 2 }<br />

– I = {s 0 }<br />

– R = {(s i ,j,s k ) | i + j ≡ k mod 3}<br />

Dann lassen sich die 10 Buchstaben von Σ durch 4 aussagenlogische Variablen<br />

i 0 ,i 1 ,i 2 und i 3 kodieren. Dabei soll die Binärdarstellung der Ziffern verwendet<br />

werden. Z. B. entspricht 6 der Menge {i 1 ,i 2 } oder 9 der Menge {i 0 ,i 3 }.Die3<br />

Zustände von A lassen sich durch 2 Variablen q 0 und q 1 kodieren. s 0 werde durch<br />

∅, s 1 durch {q 0 } und s 2 durch {q 1 } kodiert. Mit diesen Setzungen wird I durch<br />

die Formel ¬q 0 ¬q 1 kodiert.<br />

Es fällt auf, dass durch die Kodierung zusätzliche Buchstaben (10, 11 ...15)<br />

und zusätzliche Zustände ({q 0 ,q 1 }) entstehen. Betrachtet man jedoch nur Wörter<br />

über dem ursprünglichen Alphabet und garantiert durch die Transitionsrelation,<br />

dass keine zusätzlichen Durchläufe existieren, so führt dies zu keinen Problemen.<br />

Auch die Transitionsrelation lässt sich durch eine aussagenlogische Formel ϕ<br />

kodieren. Dazu wird für jede Zustandsvariable q eine neue Variable eingeführt,<br />

die in Anlehnung an Schreibweisen aus der Temporallogik mit Xq bezeichnet<br />

wird. Für zwei Zustände s 1 ,s 2 ⊆ V S und einen Buchstaben σ ⊆ V Σ gelte<br />

(s 1 ,σ,s 2 ) ∈Rgenau dann, wenn ϕ von der mit der Variablenmenge s 1 ∪σ∪{Xq |<br />

q ∈ s 2 } assoziierten Belegung erfüllt wird.<br />

Beispiel 4. Sei A =(Σ,S, I, R) der Semiautomat aus Beispiel 3 mit den Kodierungen<br />

V Σ = {i 0 ,i 1 ,i 2 ,i 3 }, S = {q 0 ,q 1 } und ϕ I = ¬q 0 ¬q 1 .Umauchdie<br />

Transitionsrelation R durch eine Formel ϕ R zu kodieren, sollen zunächst die<br />

Mengen der Buchstaben kodiert werden, mit denen die Transitionen beschriftet<br />

sind (siehe Abb. 2).<br />

– {0, 3, 6, 9} wird kodiert durch ϕ 0 = ¬i 0 ¬i 1 ¬i 2 ¬i 3 ∨ i 0 i 1 ¬i 2 ¬i 3 ∨¬i 0 i 1 i 2 ¬i 3 ∨<br />

i 0 ¬i 1 ¬i 2 i 3<br />

163


164<br />

– {1, 4, 7} wird kodiert durch ϕ 1 = i 0 ¬i 1 ¬i 2 ¬i 3 ∨¬i 0 ¬i 1 i 2 ¬i 3 ∨ i 0 i 1 i 2 ¬i 3<br />

– {2, 5, 8} wird kodiert durch ϕ 2 = ¬i 0 i 1 ¬i 2 ¬i 3 ∨ i 0 ¬i 1 i 2 ¬i 3 ∨¬i 0 ¬i 1 ¬i 2 i 3<br />

Damit kann die Transitionsrelation definiert werden durch<br />

1,4,7<br />

s 0 −−−→ s 1 : ¬q 0 ¬q 1 ∧ ϕ 1 ∧ Xq 0 ¬Xq 1 ∨<br />

2,5,8<br />

s 0 −−−→ s 2 : ¬q 0 ¬q 1 ∧ ϕ 2 ∧ ¬Xq 0 Xq 1 ∨<br />

0,3,6,9<br />

s 1 −−−−→ s 1 : q 0 ¬q 1 ∧ ϕ 0 ∧ Xq 0 ¬Xq 1 ∨<br />

1,4,7<br />

s 1 −−−→ s 2 : q 0 ¬q 1 ∧ ϕ 1 ∧ ¬Xq 0 Xq 1 ∨<br />

2,5,8<br />

s 1 −−−→ s 0 : q 0 ¬q 1 ∧ ϕ 2 ∧ ¬Xq 0 ¬Xq 1 ∨<br />

0,3,6,9<br />

s 2 −−−−→ s 2 : ¬q 0 q 1 ∧ ϕ 0 ∧ ¬Xq 0 Xq 1 ∨<br />

1,4,7<br />

s 2 −−−→ s 0 : ¬q 0 q 1 ∧ ϕ 1 ∧ ¬Xq 0 ¬Xq 1 ∨<br />

2,5,8<br />

s 2 −−−→ s 1 : ¬q 0 q 1 ∧ ϕ 2 ∧ ¬Xq 0 Xq 1<br />

ϕ 0<br />

{}<br />

ϕ 2<br />

ϕ 1<br />

ϕ 1<br />

{q 0} {q 1}<br />

ϕ 2<br />

ϕ 1<br />

ϕ 2<br />

ϕ 0<br />

ϕ0<br />

Abb. 2: Beispiel 3 und Beispiel 4<br />

Diese Formel, die die Transitionsrelation kodiert, wurde bewusst nicht vereinfacht,<br />

um möglichst gut die Beziehung zwischen der Kodierung und den ursprünglichen<br />

Repräsentation nachvollziehen zu können. Sie kann aber mit den<br />

üblichen Hilfsmitteln für die Aussagenlogik wie beispielsweise BDDs effizient<br />

behandelt werden.<br />

Bisher wurde gezeigt, wie Semiautomaten mit aussagenlogischen Formeln kodiert<br />

werden können. Um ω-Automaten zu kodieren, muss zusätzlich die Akzeptanzbedingung<br />

kodiert werden. Ein unendliches Wort soll genau dann von einem<br />

ω-Automaten akzeptiert werden, wenn es einen Durchlauf des Wortes durch den<br />

Automaten gibt, der die Akzeptanzbedingung erfüllt. Ein solcher Durchlauf ist<br />

aber selbst ein unendliches Wort. Daher ist es sinnvoll, für die Akzeptanzbedingung<br />

wieder ω-Automaten zu verwenden. Terminiert wird diese Rekursion,


165<br />

indem neben ω-Automaten die Akzeptanzbedingung aus einfachen Prädikaten<br />

auf unendlichen Wörtern bestehen darf. Aus diesen Überlegungen ergibt sich die<br />

Sprache L ω der Automaten-Formeln:<br />

Definition 6 (L ω ). Für eine gegebene Menge von aussagenlogischen Variablen<br />

V Σ sei die Menge der Automaten-Formeln L ω über V Σ die kleinste Menge mit:<br />

– v ∈L ω für alle v ∈V Σ<br />

– mit ϕ ∈L ω gilt auch ¬ϕ ∈L ω<br />

– mit ϕ, ψ ∈L ω gilt auch ϕ ∧ ψ ∈L ω<br />

– mit ϕ ∈L ω gilt auch Fϕ ∈L ω<br />

– A ∃ (V S ,ϕ I ,ϕ R ,ϕ) ∈ L ω ,falls<br />

•V S eine zu V Σ disjunkte Menge von aussagenlogischen Variablen ist<br />

• ϕ I eine aussagenlogische Formel über V S ist<br />

• ϕ R eine aussagenlogische Formel über V S ∪V Σ ∪{Xv | v ∈V S } ist<br />

• ϕ eine L ω Formel über V S ist<br />

Besitzt eine Automaten-Formel A die Form A ∃ (V S ,ϕ I ,ϕ R ,ϕ), wobeiϕ keine<br />

weiteren Formeln dieser Gestalt enthält, so heißt A flache Automaten-Formel.<br />

Definition 7 (Semantik von L ω ). Sei α : N → 2 VΣ ein unendliches Wort<br />

und ϕ eine L ω Formel über V Σ .Dannseifür i ∈ N die Aussage (α, i) |= ϕ<br />

(Sprechweise: ϕ akzeptiert α im Schritt i) definiert durch:<br />

– (α, i) |= v gdw. v ∈ α (i)<br />

– (α, i) |= ¬ϕ gdw. nicht (α, i) |= ϕ<br />

– (α, i) |= ϕ ∧ ψ gdw. (α, i) |= ϕ und (α, i) |= ψ<br />

– (α, i) |= Fϕ gdw. es existiert ein k ∈ N mit k ≥ i und (α, k) |= ϕ<br />

– (α, i) |= A ∃ (V S ,ϕ I ,ϕ R ,ϕ) gelte genau dann, wenn es einen Durchlauf β :<br />

N → 2 VS von α ′ – gegeben durch α ′(x) := α (x+i) – durch den durch V Σ , V S ,ϕ I<br />

und ϕ R kodierten Semiautomaten mit (β,0) |= ϕ gibt.<br />

Eine L ω Formel ϕ über V akzeptiert ein unendliches Wort α : N → 2 V<br />

(Schreibweise: α |= ϕ) genau dann, wenn (α, 0) |= ϕ gilt.<br />

Definition 8 (Äquivalenz von L ω -Formeln). Zwei L ω -Formeln A und B<br />

über einem gemeinsamen Variablenmenge V Σ heißen genau dann äquivalent<br />

(Schreibweise: A ≈ B), wenn für alle unendlichen Wörter α über 2 VΣ genau<br />

dann α |= A gilt, wenn α |= B gilt.<br />

Definition 9(Abkürzungen von L ω Formeln). Um L ω Formeln kompakter<br />

und leichter lesbar darstellen zu können, sollen Abkürzungen eingeführt werden.<br />

In den folgenden Abkürzungen seien ϕ und ψ jeweils beliebige L ω Formeln:<br />

– ϕ ∨ ψ := ¬(¬ϕ ∧¬ψ)<br />

– ϕ → ψ := ¬ϕ ∨ ψ<br />

– ϕ ↔ ψ := (ϕ → ψ) ∧ (ψ → ϕ)


166<br />

– Gϕ := ¬F ¬ϕ<br />

Es gilt also α |= Gϕ gdw. für alle i ∈ N gilt (α, i) |= ϕ<br />

– A ∀ (V S ,ϕ I ,ϕ R ,ϕ):=¬A ∃ (V S ,ϕ I ,ϕ R , ¬ϕ)<br />

α |= A ∀ (V S ,ϕ I ,ϕ R ,ϕ) gilt also genau dann, wenn für jeden Durchlauf<br />

β : N → 2 VS von α durch den durch V Σ , V S ,ϕ I und ϕ R kodierten Semiautomaten<br />

gilt β |= ϕ.<br />

– Häufig ist es sinnvoll, in der Akzeptanzbedingung ϕ eines ω-Automaten A =<br />

A ∃ (V S ,ϕ I ,ϕ R ,ϕ) über V Σ nicht nur den Durchlauf durch den von A beschriebenen<br />

Semiautomaten, sondern auch das zu dem Durchlauf gehörende<br />

Wort betrachten zu können. Dazu soll implizit ein Durchlauf β : N → 2 VS eines<br />

Wortes α : N → 2 VΣ erweitert werden zu einem Wort β ′ : N → 2 VS∪VΣ ,<br />

das gegeben ist durch β ′(n) := β (n) ∪ α (n) für alle n ∈ N. Eine Akzeptanzbedingung<br />

ϕ über V S ∪ V Σ kann dann auf diesem neuen Wort β ′ ausgewertet<br />

werden. Formal gesehen wird jede L ω -Formel über V Σ der Form<br />

A ∃ (V S ,ϕ I ,ϕ R ,ϕ) erweitert zu<br />

A ∃ (V S ∪{x ′ | x ∈V Σ },ϕ I ,ϕ R ∧ ∧<br />

x∈V Σ<br />

x ′ ↔ x, ϕ)<br />

.<br />

ϕ darf dann eine beliebige L ω -Formel über V S ∪ {x ′ | x ∈V Σ } sein. Als<br />

Schreibvereinfachung wird x mit x ′ für jede Variable x ∈V Σ identifiziert.<br />

– Der Ausdruck Xϕ soll ein Wort α genau dann akzeptieren, wenn (α, 1) |= ϕ<br />

gilt. Damit lässt sich Xϕ als Abkürzung für A ∃ ({q 0 ,q 1 }, ¬q 0 ¬q 1 ,ϕ R ,Gq 0 → ϕ)<br />

mit ϕ R = ¬q 0 ¬q 1 Xq 0 ¬Xq 1 ∨ q 0 ¬q 1 ¬Xq 0 Xq 1 ∨¬q 0 q 1 ¬Xq 0 Xq 1 betrachten<br />

(vergleiche Abb. 3).<br />

1 1<br />

{} {q 0} {q 1}<br />

1<br />

Abb. 3: Semiautomat für Xϕ<br />

1.4 Klassen von ω-Automaten<br />

Wie bereits erwähnt führen unterschiedliche Akzeptanzbedingungen zu unterschiedlichen<br />

Klassen von ω-Automaten mit unterschiedlicher Mächtigkeit. Wichtig<br />

sind die folgenden Klassen von Akzeptanzbedingungen:<br />

Definition 10 (Klassen von Akzeptanzbedingungen). φ i und ψ i seien für<br />

alle i ∈{1,...,n} aussagenlogische Formeln über den Zustandsvariablen. Dann


167<br />

seien die folgenden Akzeptanzbedingungen definiert durch:<br />

Sicherheitsbedingungen: Gφ 0<br />

Lebendigkeitsbedingungen: Fφ 0<br />

Persistenzbedingungen: FGφ 0<br />

Büchi- oder Fairnessbedingungen: GF φ 0<br />

n∨<br />

Rabin-Bedingungen: GF φ j ∧ FGψ j<br />

Street-Bedingungen:<br />

Präfix-Bedingungen (1. Typ):<br />

Präfix-Bedingungen (2. Typ):<br />

j=0<br />

n∧<br />

FGφ j ∨ GF ψ j<br />

j=0<br />

n∧<br />

Gφ j ∨ Fψ j<br />

j=0<br />

n∨<br />

Fφ j ∧ Gψ j<br />

Definition 11 (Klassen von ω-Automaten). Für eine Klasse von Akzeptanzbedingungen<br />

F bezeichne NDet F die Menge aller L ω -Formeln A, für die eine<br />

L ω -Formeln B der Form A ∃ (V S ,ϕ I ,ϕ R ,ϕ) mit A ≈ B existiert, wobei ϕ eine<br />

Akzeptanzbedingung der Klasse F ist. Entsprechend bezeichne Det F die Menge<br />

aller L ω -Formeln A, für die eine L ω -Formeln B der Form A ∃ (V S ,ϕ I ,ϕ R ,ϕ)<br />

mit A ≈ B existiert, wobei ϕ eine Akzeptanzbedingung der Klasse F und B<br />

deterministisch ist.<br />

Damit definieren die obigen Klassen von Akzeptanzbedingungen die folgenden<br />

Klassen von ω-Automaten:<br />

– NDet G<br />

– Det G<br />

– NDet F<br />

– NDet FG<br />

– NDet GF<br />

– NDet Rabin<br />

– NDet Street<br />

– NDet Präfix1<br />

– NDet Präfix2<br />

– Det F<br />

– Det FG<br />

– Det GF<br />

– Det Rabin<br />

– Det Street<br />

j=0<br />

– Det Präfix1<br />

– Det Präfix2<br />

Die Automaten-Klassen Det Präfix1 und Det Präfix2 beziehungsweise NDet Präfix1<br />

und NDet Präfix2 werden oft zu Det Präfix beziehungsweise NDet Präfix zusammengefasst.<br />

Besonders wichtig sind im Folgenden die Klassen NDet GF , die sogenannten<br />

Büchi-Automaten, undDet Street ,dieStreet-Automaten.<br />

Diese verschiedenen Klassen von ω-Automaten besitzen unterschiedliche Mächtigkeit<br />

(siehe Abb. 4). Details hierzu sind zum Beispiel in [Sch04] zu finden.<br />

Zu den mächtigsten Klassen gehören unter anderem die Büchi- und Street-<br />

Automaten. Es ist möglich, für jede L ω -Formel eine flache Automaten-Formel zu


168<br />

konstruieren. Damit kann zu jeder L ω -Formel wahlweise ein äquivalenter Büchioder<br />

Street-Automat konstruiert werden. Das Entscheidungsproblem für Büchiund<br />

Street-Automaten ist in O(2 3n )lösbar, wobei n die Anzahl der Zustände<br />

des entsprechenden Automaten ist.<br />

Wesentlich komplexer als das Entscheidungsproblem ist die Konstruktion<br />

der Büchi- bzw. Street-Automaten aus beliebigen L ω -Formeln. Die Konstruktion<br />

flacher Automaten-Formeln im Allgemeinen und damit die Konstruktion<br />

von Büchi- oder Street-Automaten im Speziellen besitzt nicht elementare Komplexität.<br />

Das heißt es existiert keine Konstante i ∈ N, so dass die Komplexität<br />

des Problems O(f i (n)) beträgt, wobei f i gegeben ist durch f 0 (n) := n<br />

und f i+1 (n) :=2 fi(n) . Problematisch bei dieser Konstruktion sind verschachtelte<br />

Automaten-Formeln der Form A ∃ (V S ,ϕ I ,ϕ R , A ∀ (V ′ S ,ϕ ′ I ,ϕ′ R ,ϕ)). Zur Konstruktion<br />

einer äquivalenten flachen Automaten-Formel wird nämlich ein zu<br />

A ∀ (V ′ S ,ϕ ′ I ,ϕ′ R ,ϕ) äquivalenter, deterministischer ω-Automat konstruiert. Diese<br />

Determinisierung kann zu einem exponentiellen Anstieg der Anzahl der Zustände<br />

führen.<br />

Det F<br />

Det GF<br />

Det Rabin<br />

<br />

<br />

<br />

Det Präfix<br />

NDet GF<br />

≈<br />

Det Street<br />

<br />

<br />

<br />

Det G<br />

Det FG<br />

NDet Rabin<br />

≈<br />

≈<br />

NDet G<br />

NDet F<br />

NDet Street<br />

≈<br />

NDet Präfix<br />

NDet GF<br />

≈<br />

≈<br />

≈<br />

≈<br />

≈<br />

NDet FG<br />

Abb. 4: Hierarchie der ω-Automaten<br />

2 S1S und MSO <<br />

2.1 Monadic Second Order Logic of One Successor (S1S)<br />

Definition 12 (Monadic Second Order Logic of One Successor (S1S)).<br />

Die Logik S1S ist die Prädikatenlogik zweiter Stufe mit Gleichheit über den<br />

natürlichen Zahlen, die<br />

– die beiden Funktionssymbole 0 und SUC<br />

– keine Prädikatssymbole<br />

– beliebig viele Variablen x erster Stufe, also des Typs x :→ N


169<br />

– beliebig viele monadische Variablen p zweiter Stufe, also des Typs p : N → B<br />

erlaubt. Außerdem wird nur die übliche Interpretation der Konstante 0 und der<br />

Nachfolgerfunktion auf den natürlichen Zahlen verwendet. S1S besitzt also nur<br />

eine mögliche Interpretation.<br />

Mit dieser Definition ist die Menge der S1S-Terme Term S1S die kleinste Menge,<br />

für die gilt:<br />

– 0 ∈ Term S1S<br />

– x ∈ Term S1S für jede Variable x :→ N<br />

– SUC(t) ∈ Term S1S für jeden Term t ∈ Term S1S<br />

Jeder S1S-Term besitzt also entweder die Form SUC n (0) oder SUC n (x), wobei<br />

x eine Variable erster Stufe ist. Terme der Form SUC n (0) werden mit dem<br />

Symbol n abgekürzt. So entspricht das Konstantensymbol 3 z. B. dem Term<br />

SUC(SUC(SUC(0))). Statt SUC n (t), wobei t ein beliebiger Term ist, wird auch<br />

die Schreibweise t + n verwendet.<br />

Die Menge der S1S-Formeln ist die kleinste Menge mit<br />

– t . = u ∈ S1S für alle Terme t, u ∈ Term S1S .<br />

– p (t) ∈ S1S für jede Variable zweiter Stufe p : N → B und jeden Term t ∈<br />

Term S1S<br />

– ¬ϕ ∈ S1S für jede Formel ϕ ∈ S1S<br />

– ϕ ∧ ψ ∈ S1S für alle Formeln ϕ, ψ ∈ S1S<br />

– ∃x.ϕ ∈ S1S für jede Variable erster Stufe x :→ N und jede Formel ϕ ∈ S1S<br />

– ∃p.ϕ ∈ S1S für jede Variable zweiter Stufe p : N → B und jede Formel<br />

ϕ ∈ S1S<br />

Außerdem werden für S1S-Formeln die folgenden Abkürzungen verwendet:<br />

– ϕ ∨ ψ := ¬(¬ϕ ∧¬ψ)<br />

– ϕ → ψ := ¬ϕ ∨ ψ<br />

– ϕ ↔ ψ := (ϕ → ψ) ∧ (ψ → ϕ)<br />

– ∀.ϕ := ¬∃¬ϕ<br />

S1S-Formeln und Terme werden nur über den natürlichen Zahlen ausgewertet.<br />

Sei ξ eine Belegung, also eine Funktion, die jeder Variable erster Stufe eine<br />

natürliche Zahl und jeder Variable zweiter Stufe eine Relation passender Stelligkeit<br />

auf den natürlichen Zahlen zuweist. Weiter bezeichne ξx y die durch<br />

{ y falls z = x<br />

ξx(z) y :=<br />

ξ(z) sonst<br />

definierte Belegung. Damit ist die Bedeutung t ξ eines Terms t ∈ Term S1S in<br />

einer Belegung ξ gegeben durch:<br />

– 0 ξ := 0<br />

– x ξ := ξ(x) für jede Variable x des Typs x :→ N


170<br />

– SUC(t) ξ := t ξ +1<br />

Ebenso ist die Bedeutung ϕ ξ einer S1S-Formel ϕ gegeben durch:<br />

– p (t) ξ := ξ(p) (t ξ)<br />

– ¬ϕ ξ :⇔ nicht ϕ<br />

– t . = u ξ :⇔ t ξ = u ξ<br />

– ϕ ∧ ψ ξ :⇔ ϕ ξ und ψ ξ<br />

– ∃x.ϕ ξ :⇔ es gibt ein x ∈ N mit ϕ ξ n x<br />

– ∃p.ϕ ξ :⇔ es gibt ein M ⊆ N mit ϕ ξ M<br />

p<br />

Beispiel 5. ∃p. ( (∀y.p (y) → p (SUC(y)) )∧¬p (x) ∧p (5)) ist eine S1S-Formel. Sie wird<br />

genau dann von einer Belegung ξ erfüllt, wenn gilt ξ(x) < 5.<br />

2.2 Monadic Second Order Logic of Linear Order (MSO < )<br />

Definition 13 (Monadic Second Order Logic of Linear Order (MSO < )).<br />

Die Logik MSO < ist die Prädikatenlogik zweiter Stufe mit Gleichheit über den<br />

natürlichen Zahlen, die<br />

– keine Funktionssymbole<br />

– nur das Prädikatssymbol <<br />

– beliebig viele Variablen x erster Stufe, also des Typs x :→ N<br />

– beliebig viele monadische Variablen p zweiter Stufe, also des Typs p : N → B<br />

erlaubt. Außerdem wird nur die übliche Interpretation


171<br />

– p (t) ξ := ξ(p) (t ξ)<br />

– ¬ϕ ξ :⇔ nicht ϕ<br />

– t . = u ξ :⇔ t ξ = u ξ<br />

– t


172<br />

function MSO < S1S(φ)<br />

case φ of<br />

”<br />

x 1


173<br />

ψ(t 1 ,...,f(t ′ 1 ,...,t′ n ),...t m) durch ψ(t 1 ,...,y,...,t m )∧ϕ(t ′ 1 ,...,t′ n ,y) ersetzt,<br />

wobei y eine neue, sonst nicht auftretende Variable ist.<br />

Beispiel 7 (Definierbarkeit in MSO < ). Das Prädikat ≤ kann in MSO < definiert<br />

werden durch ∀x.∀y. x ≤ y ↔ (x . = y ∨ x


174<br />

3.2 Übersetzung von ω-Automaten in S1S<br />

Mit dieser Abbildung zwischen Variablenbelegungen und Wörtern lässt sich zu<br />

einem Büchi-Automaten A über 2 VΣ leicht eine S1S-Formel ϕ A konstruieren,<br />

so dass jedes Wort α über 2 VΣ genau dann von A akzeptiert wird, wenn ξ α<br />

die Formel ϕ A erfüllt. Abb. 6 beschreibt die Konstruktion einer solchen Formel.<br />

Da zu jeder L ω -Formel ein äquivalenter Büchi-Automat konstruiert werden<br />

kann, können somit alle ω-Automaten in S1S-Formeln und damit auch in MSO < -<br />

Formeln übersetzt werden.<br />

function Buechi S1S(A)<br />

A ∃ ({q 1,...,q n},φ I,φ R,GFφ F) ≡ A;<br />

ψ I := XProp2S1S(0,φ I);<br />

ψ R := XProp2S1S(x, φ R);<br />

ψ F := XProp2S1S(x 2,φ F);<br />

return ∃q 1,...∃q n.ψ I ∧ (∀x.ψ R) ∧ `∀x 1.∃x 2.(x 1


175<br />

– Sing(p) :⇔∃x.p (t) ∧ ( ∀x 1 ,x 2 .(p (x1) ∧ p (x2) ) → x 1<br />

. = x2<br />

)<br />

– S 2 (p, q) :⇔ Sing(p) ∧ Sing(q) ∧∀x.p (x) → q (SUC(x))<br />

Abb. 7 beschreibt einen Algorithmus zur Entfernung Variablen erster Stufe<br />

aus MSO < -Formeln. Dabei ist zu beachten, dass jeder MSO < -Term eine Variable<br />

erster Stufe ist. Wie man leicht sieht, bestehen alle verbleibenden atomaren<br />

Formeln aus einem der neu eingeführten Prädikate. Die Korrektheit dieses Algorithmuses<br />

ist leicht nachweisbar. Ein Beweis findet sich in [Sch04].<br />

function ElimFO(φ)<br />

case φ of<br />

x 1<br />

. = x2 : return Subset(q x1 ,q x2 ) ∧ Subset(q x2 ,q x1 );<br />

x 1


176<br />

function MSO < Omega(φ)<br />

case φ of<br />

Subset(p, q) : return G(p → q);<br />

Sing(p) : return G(p → XG¬p) ∧ Fp;<br />

S 2(p, q) : return G`p → (Xq ∧ XG¬p)´ ∧ Fp∧ G(q → XG¬q);<br />

¬ϕ : return ¬MSO < Omega(ϕ);<br />

ϕ ∧ ψ : return MSO < Omega(ϕ) ∧ MSO < Omega(ψ);<br />

∃p.ϕ : return A ∃ ({p}, 1, 1, MSO < Omega(ϕ));<br />

end<br />

end<br />

Abb. 8: Übersetzung von MSO < -Formeln in ω-Automaten<br />

Komplexitätsresultat kann aber auch positiv interpretiert werden. Da MSO <<br />

und S1S äquivalente Ausdruckskraft wie ω-Automaten, aber eine wesentlich<br />

aufwendigere Entscheidungsprozedur besitzen, müssen sich bestimmte Aussagen<br />

mit MSO < und S1S-Formeln wesentlich kompakter als mit ω-Automaten<br />

darstellen lassen. Dies ist ein Indiz dafür, dass diese Formalismen wirklich für<br />

die Spezifikation geeignet sind.<br />

4 Praxisrelevante Formalismen<br />

Bisher wurde gezeigt, dass ω-Automaten, MSO < und S1S äquivalente Ausdruckskraft<br />

besitzen und ineinander überführt werden können. Die Logiken MSO <<br />

und S1S gestatten für viele Probleme eine wesentlich intuitivere Spezifikation als<br />

ω-Automaten. Dies gilt besonders, wenn man MSO < und S1S um in ihnen definierbare<br />

Funktionen und Prädikate erweitert.<br />

Trotzdem sollen im Folgenden noch weitere Formalismen betrachtet werden.<br />

Dies geschieht einerseits, weil sie eine noch intuitivere Beschreibung einiger Probleme<br />

ermöglichen, andererseits weil sie ein weniger komplexes Entscheidungsproblem<br />

besitzen.<br />

4.1 Lineare Temporale Logik (LTL)<br />

Definition 17 (Lineare Temporale Logik (LTL)). LTL ist eine spezielle<br />

Temporallogik, also eine um temporale Operatoren erweiterte Aussagenlogik,<br />

die auch den zeitlichen Verlauf der aussagenlogischen Variablen berücksichtigen<br />

kann. Sei V eine Menge von aussagenlogischen Variablen. Die Menge der LTL-<br />

Formeln über V ist die kleinste Menge mit:<br />

– x ∈ LTL für alle x ∈V<br />

– ¬ϕ ∈ LTL für jede Formel ϕ ∈ LTL<br />

– ϕ ∧ ψ ∈ LTL für alle Formeln ϕ, ψ ∈ LTL<br />

– Xϕ ∈ LTL für jede Formel ϕ ∈ LTL<br />

– ←− Xϕ ∈ LTL für jede Formel ϕ ∈ LTL<br />

– ϕUψ ∈ LTL für alle Formeln ϕ, ψ ∈ LTL


177<br />

– ϕ ←− U ψ ∈ LTL für alle Formeln ϕ, ψ ∈ LTL<br />

Definition 18 (Semantik von LTL). Sei α : N → 2 V ein unendliches Wort<br />

und ϕ eine LTL-Formel über V. Dannseifür i ∈ N die Aussage (α, i) |= ϕ<br />

(Sprechweise: α im Zeitpunkt i erfüllt ϕ) definiert durch:<br />

– (α, i) |= x gdw. x ∈ α (i) für x ∈V<br />

– (α, i) |= ¬ϕ gdw. nicht (α, i) |= ϕ<br />

– (α, i) |= Xϕ gdw. (α, i +1)|= ϕ<br />

– (α, i) |= ←− Xϕ gdw. i>0 und (α, i − 1) |= ϕ<br />

– (α, i) |= ϕ ∧ ψ gdw. (α, i) |= ϕ und (α, i) |= ψ<br />

– (α, i) |= ϕUψ gdw. es gibt es k ≥ i mit (α, k) |= ψ und für alle i ≤ jkgilt (α, j) |= ϕ<br />

Ein unendliches Wort α : N → 2 V erfüllt eine LTL-Formel ϕ über V (Schreibweise:<br />

α |= ϕ) genau dann, wenn (α, 0) |= ϕ gilt.<br />

Für LTL-Formeln werden die üblichen Abkürzungen ∨, → und ↔ verwendet.<br />

Außerdem werden weitere temporale Operatoren benutzt:<br />

Fϕ := 1 U ϕ<br />

←− Fϕ:= 1<br />

←− U ϕ<br />

Gϕ := ¬F ¬ϕ<br />

←− Gϕ := ¬<br />

←− F ¬ϕ<br />

ϕBψ := (¬ψ) U (ϕ ∧¬ψ)<br />

ϕ ←− B ψ := (¬ψ) ←− U (ϕ ∧¬ψ)<br />

ϕUψ:= (ϕ Uψ) ∨ Gϕ<br />

ϕ ←− U ψ := (ϕ ←− U ψ) ∨ ←− Gϕ<br />

ϕBψ:= (ϕ Bψ) ∨ G¬ψ<br />

ϕ ←− Bψ:= (ϕ ←− B ψ) ∨ ←− G¬ψ<br />

Betrachtet man – analog zur Übersetzung von ω-Automaten in S1S – die<br />

von einem Wort induzierte Variablenbelegung, so lässt sich zu einer LTL-Formel<br />

ϕ LTL über 2 V leicht eine MSO < -Formel ϕ MSO< konstruieren, so dass jedes Wort<br />

α über 2 V genau dann ϕ LTL erfüllt, wenn ξ α die Formel ϕ MSO< erfüllt. Abb. 9<br />

beschreibt die Konstruktion einer solchen Formel. Damit kann auch für jede<br />

LTL-Formel ein äquivalenter ω-Automat konstruiert werden.<br />

4.2 Presburger-Arithmetik<br />

Definition 19 (Presburger-Arithmetik). Presburger-Arithmetik ist die Prädikatenlogik<br />

erster Stufe mit Gleichheit über den natürlichen Zahlen, die


178<br />

function nachfolger(x 0,x 1)<br />

return (x 0


179<br />

– keine Funktionssymbole<br />

– das Prädikatssymbol ADD<br />

– beliebig viele Variablen x erster Stufe<br />

erlaubt. Außerdem sei das Prädikat ADD auf den natürlichen Zahlen wie üblich<br />

definiert, nämlich durch ADD(x, y, z) :⇔ x+y . = z. Presburger-Arithmetik besitzt<br />

also nur eine mögliche Interpretation.<br />

Mit dieser Definition ist die Menge der Presburger-Terme Term Presburger die<br />

Menge der Variablen. Die Menge der Presburger-Formeln ist die kleinste Menge<br />

mit<br />

– ADD(x, y, z) ∈ Presburger für alle Terme x, y, z ∈ Term Presburger<br />

– x = . y ∈ Presburger für alle Terme x, y ∈ Term Presburger<br />

– ¬ϕ ∈ Presburger für jede Formel ϕ ∈ Presburger<br />

– ϕ ∧ ψ ∈ Presburger für alle Formeln ϕ, ψ ∈ Presburger<br />

– ∃x.ϕ ∈ Presburger für jede Variable erster Stufe x : → N und jede Formel<br />

ϕ ∈ Presburger<br />

Definition 20 (Semantik der Presburger-Arithmetik). Presburger-Formeln<br />

und Terme werden nur über den natürlichen Zahlen ausgewertet. Sei ξ<br />

eine Belegung. Da ausschließlich Variablen erster Stufe Presburger-Terme darstellen,<br />

ist die Bedeutung x ξ eines Terms x ∈ Term Presburger in einer Belegung<br />

ξ ist gegeben durch x ξ := ξ(x). Die Bedeutung ϕ ξ einer Presburger-Formel<br />

ϕ ist gegeben durch:<br />

– ¬ϕ ξ :⇔ nicht ϕ ξ<br />

– ADD(x, y, z) ξ :⇔ x ξ + y ξ = z ξ<br />

– x = . y ξ :⇔ x ξ = y ξ<br />

– ϕ ∧ ψ ξ :⇔ ϕ ξ und ψ ξ<br />

– ∃x.ϕ ξ :⇔ es gibt ein n ∈ N mit ϕ ξ n x<br />

Auf den ersten Blick scheint Presburger-Arithmetik nicht ausdrucksstark zu<br />

sein. Es können jedoch viele wichtige Funktionen und Prädikate in Presburger-<br />

Arithmetik definiert werden. Alle definierten Funktionen und Prädikate besitzen<br />

ihre übliche Bedeutung auf den natürlichen Zahlen. Aus Gründen der Übersichtlichkeit<br />

wird auf die Allquantifizierung der zur Definition benutzten Formeln


180<br />

verzichtet und diese nur implizit gefordert:<br />

z . = x + y ↔ ADD(x, y, z)<br />

x ≤ y ↔∃z.ADD(x, z, y)<br />

x


181<br />

function Presburger S1S(φ)<br />

case φ of<br />

ADD(x, y, z) :<br />

ψ := ¬c (0) ∧∀t.c (t+1) ↔ `x (t) ∧ y (t) ∨ c (t) ∧ (x (t) ∨ y (t) )´;<br />

return ∃c.ψ ∧ (∀t.x (t) ⊕ y (t) ⊕ c (t) );<br />

end<br />

end<br />

.<br />

x 1 = x2 : return ∀y.p (y)<br />

x 1<br />

↔ p (y)<br />

x 2<br />

;<br />

¬ϕ : return ¬Presburger S1S(ϕ);<br />

ϕ ∧ ψ : return Presburger S1S(ϕ) ∧ Presburger S1S(ψ);<br />

∃x.ϕ :<br />

return ∃p x.`(∃x 1.∀x 2.x 1


182<br />

Betrachtet man Bitvektoroperationen genauer, so fällt auf, dass die bitweise<br />

Negation NOT zu Problemen führt. Da die Binärkodierung jeder natürlichen<br />

Zahl nämlich nur endlich viele Einsen enthält, enthält die negierte Binärkodierung<br />

einer natürlichen Zahl unendlich viele Einsen und stellt damit nicht mehr<br />

die Kodierung einen natürlichen Zahl dar. Für die Untersuchung der Definierbarkeit<br />

von Bitvektoroperationen in Presburger-Arithmetik muss daher die Erweiterung<br />

der Presburger-Arithmetik auf ganze Zahlen und deren Zweierkomplement-<br />

Kodierung betrachtet werden.<br />

5.1 Presburger-Arithmetik auf ganzen Zahlen<br />

Definition 21 (Presburger-Arithmetik auf ganzen Zahlen). Presburger Z -<br />

Arithmetik ist Presburger-Arithmetik auf ganzen Zahlen. Die Menge der Presburger<br />

Z -Terme Term PresburgerZ ist die Menge der Variablen x : → Z. Die Menge<br />

der Presburger Z -Formeln ist die kleinste Menge mit<br />

– ADD Z (x, y, z) ∈ Presburger Z für alle Terme x, y, z ∈ Term PresburgerZ<br />

– ≥ 0 (x) ∈ Presburger Z für alle Terme x ∈ Term PresburgerZ<br />

– x . = y ∈ Presburger Z für alle Terme x, y ∈ Term PresburgerZ<br />

– ¬ϕ ∈ Presburger Z für jede Formel ϕ ∈ Presburger Z<br />

– ϕ ∧ ψ ∈ Presburger Z für alle Formeln ϕ, ψ ∈ Presburger Z<br />

– ∃x.ϕ ∈ Presburger Z für jede Variable erster Stufe x : → Z und jede Formel<br />

ϕ ∈ Presburger Z<br />

Presburger Z -Formeln und -Terme werden nur über den ganzen Zahlen ausgewertet.<br />

Sei ξ eine Belegung. Da ausschließlich Variablen erster Stufe Presburger<br />

Z -Terme darstellen, ist die Bedeutung x ξ eines Terms x ∈ Term PresburgerZ<br />

in einer Belegung ξ ist gegeben durch x ξ := ξ(x). Die Bedeutung ϕ ξ einer<br />

Presburger Z -Formel ϕ ist gegeben durch:<br />

– ¬ϕ ξ :⇔ nicht ϕ ξ<br />

– ADD Z (x, y, z) ξ :⇔ x ξ + y ξ = z ξ<br />

– ≥ 0 (x) ξ :⇔ x ξ ≥ 0<br />

– x . = y ξ :⇔ x ξ = y ξ<br />

– ϕ ∧ ψ ξ :⇔ ϕ ξ und ψ ξ<br />

– ∃x.ϕ ξ :⇔ es gibt ein z ∈ Z mit ϕ ξ z x<br />

Es fällt auf, dass gegenüber Presburger N -daszusätzliche Prädikat > 0 in Presburger<br />

Z -Arithmetik erlaubt ist. Dies ist nötig, da sonst Presburger Z -Arithmetik<br />

nicht zwischen positiven und negativen Zahlen unterscheiden könnte, d. h. eine<br />

Belegung ξ erfüllt eine beliebige Presburger Z -Formel ϕ ohne ≥ 0 genau dann,<br />

wenn die Belegung ξ − , die gegeben ist durch ξ − (x) := −ξ(x) für alle x, die<br />

Formel ϕ erfüllt. Dies lässt sich leicht durch Induktion über den Aufbau zeigen.<br />

Ohne ≥ 0 können also wichtige Funktionen, wie Konstanten für die ganzen<br />

Zahlen, oder Prädikate wie > nicht definiert werden. Mit diesem Prädikat ist


183<br />

dies dagegen möglich:<br />

z . = x + y ↔ ADD(x, y, z)<br />

x . =0↔∀y.y + x . = y<br />

> 0 (x) ↔≥ 0 (x) ∧¬x . =0<br />

x ≤ y ↔∃z.≥ 0 (z) ∧ ADD(x, z, y)<br />

x 0 (z) ∧ ADD(x, z, y)<br />

x . =1↔∀y.y < x → y ≤ 0<br />

x . =2↔∀y.y < x → y ≤ 1<br />

.<br />

x . = −1 ↔∀y.y ≥ x → y>0<br />

x . = −2 ↔∀y.y ≥ x → y>1<br />

.<br />

z . = x − y ↔ z . = x + y<br />

y . = −x ↔ y . =0− x<br />

y . = x ∗ 0 ↔ y . =0<br />

y . = x ∗ 1 ↔ y . = x ∗ 0+x<br />

y . = x ∗ 2 ↔ y . = x ∗ 1+x<br />

y . = x ∗ 3 ↔ y . = x ∗ 2+x<br />

.<br />

.<br />

y . = x ∗−1 ↔ y . = x ∗ 0 − x<br />

y . = x ∗−2 ↔ y . =(x ∗−1) − x<br />

y . = x ∗−3 ↔ y . =(x ∗−2) − x<br />

.<br />

5.2 Äquivalente Ausdruckskraft von Presburger Z - und Presburger N -<br />

Arithmetik<br />

Presburger Z - und Presburger N -Arithmetik besitzen äquivalente Ausdruckskraft.<br />

Um dies zu zeigen, muss zunächst eine Abbildung zwischen den ganzen Zahlen<br />

und den natürlichen Zahlen gefunden werden. Sei η : Z → N gegeben durch:<br />

η(x) :=<br />

{<br />

2 ∗ x falls x ≥ 0<br />

(−2 ∗ x) − 1sonst<br />

Die Funktion η ist eine Bijektion. Ihre Umkehrfunktion η −1<br />

durch:<br />

{ x<br />

η −1 (x) := 2<br />

falls x gerade<br />

− x+1<br />

2<br />

sonst<br />

ist gegeben


184<br />

Zu einer Presburger N -Formel ϕ N lässt sich leicht eine Presburger Z -Formel<br />

ϕ Z konstruieren, so dass ϕ N von einer Belegung ξ : V→N genau dann erfüllt<br />

wird, wenn ϕ Z von ξ erfüllt wird. Sei für eine Belegung ξ : V→Z die Belegung<br />

ξ η : V→N gegeben durch ξ η (z) :=η(ξ(z)) für alle z ∈ Z. Damitlässt sich zu<br />

einer Presburger Z -Formel ϕ Z eine Presburger N -Formel ϕ N konstruieren, so dass<br />

jede Belegung ξ : V→Z genau dann ϕ Z erfüllt, wenn ξ η die Formel ϕ N erfüllt.<br />

Abb. 11 beschreibt die Konstruktion solcher Formeln. Die Korrektheit des Verfahrens<br />

kann leicht nachgewiesen werden. Einzig interessant ist die Übersetzung<br />

der Addition auf den ganzen Zahlen, für die eine Fallunterscheidung danach, ob<br />

die Parameter positive oder negative Zahlen sind, verwendet wird.<br />

Aufgrund dieser möglichen Übersetzung von Presburger Z - in Presburger N -<br />

Arithmetik lassen sich viele Eigenschaften der Presburger N - auf Presburger Z -<br />

Arithmetik übertragen. Eine wichtige Eigenschaft ist, dass auch das Entscheidungsproblem<br />

der Presburger Z -Arithmetik in O(2 22n )lösbar ist.<br />

Eine weitere sich übertragende Eigenschaft ist, dass jedes in Presburger N -<br />

Arithmetik definierbare monadische Prädikat p : N → B schließlich periodisch ist<br />

(siehe [BHMV]). Dies bedeutet, dass für jedes solche p zwei Konstanten n 0 ,v ∈ N<br />

existieren mit p (n) ⇔ p (n+v) für alle n ≥ n 0 .<br />

Lemma 1. Jedes in Presburger Z -Arithmetik definierbare Prädikat p : Z → B ist<br />

schließlich periodisch. D. h. es existieren Konstanten n 0 ,v ∈ N, so dass p (n) ⇔<br />

p (n+v) für alle n ≥ n 0 und p (n) ⇔ p (n−v) für alle n ≤−n 0 gilt.<br />

Beweis. Das Prädikat q : N → B sei gegeben durch q (i) :⇔ p (η−1(i)) . Da p<br />

in Presburger Z -Arithmetik definierbar ist, ist – wie der Übersetzungsalgorithmus<br />

zeigt – q in Presburger N -Arithmetik definierbar. Da jedes in Presburger N -<br />

Arithmetik definierbare monadische Prädikat schließlich periodisch ist, ist auch<br />

q schließlich periodisch. Daher existieren zwei Konstanten n 0 ,v ∈ N mit q (n) ⇔<br />

q (n+v) für alle n ≥ n 0 . O.B.d.A. seien n 0 und v gerade und n 0 > 0.<br />

Setze m 0 := η −1 (n 0 ) und w := η −1 (v). Dan 0 gerade gewählt wurde, gilt<br />

m 0 = n0<br />

2<br />

> 0. Damitgiltfür alle m ≥ m 0 die Beziehung η(m) =2∗ m ≥<br />

2 ∗ m 0 = n 0 . Man beachte, das η(m) gerade ist. Da v ebenfalls gerade ist, gilt<br />

η −1 (η(m) +v) =η −1 (η(m)) + η −1 (v) =m + w. Zusammengefasst gilt also für<br />

alle m ∈ Z mit m ≥ m 0<br />

p (m) ⇔ q (η(m)) ⇔ q (η(m)+v) ⇔ p η−1 (η(m)+v) ⇔ p (m+w)<br />

Wegen m 0 > 0 gilt für alle m ≤−m 0 die Beziehung η(m) =−(2 ∗ m) − 1 ><br />

−(2 ∗−m 0 )=2∗ m 0 = n 0 .Dav gerade ist, gilt η −1 (η(m)+v) =η −1 (η(m)) −<br />

η −1 (v) =m − w. Zusammengefasst gilt also für alle m ∈ Z mit m ≤−m 0<br />

p (m) ⇔ q (η(m)) ⇔ q (η(m)+v) ⇔ p η−1 (η(m)+v) ⇔ p (m−w)<br />

Damit ist gezeigt, dass das Prädikat p schließlich periodisch ist.<br />

⊓⊔


185<br />

function Presburger N Presburger Z (φ)<br />

case φ of<br />

ADD N (x, y, z): return ADD Z (x, y, z);<br />

x 1<br />

. = x2 : return x 1<br />

. = x2;<br />

¬ϕ : return ¬ϕ;<br />

ϕ ∧ ψ : return ϕ ∧ ψ;<br />

∃x.ϕ : return ∃x. ≥ 0(x) ∧ ϕ;<br />

end<br />

end<br />

function Presburger Z Presburger N (φ)<br />

case φ of<br />

≥ 0(x) : return ∃y.ADD N (y, y,x);<br />

ADD Z (x, y, z) :<br />

ϕ(x) := Presburger Z Presburger N (≥ 0(x));<br />

ψ ≥≥ (x, y, z) := x + N y = . z;<br />

ψ


186<br />

5.3 Bitvektoroperationen<br />

Nachdem die Presburger Z -Arithmetik eingeführt wurde, können Bitvektoroperationen<br />

nun genau definiert werden. Dazu muss zunächst geklärt werden, welches<br />

monadische Prädikat p x , auf dem die Bitvektoroperationen später arbeiten werden,<br />

einer ganzen Zahl x entspricht. Hierzu soll die sogenannte Zweierkomplement-Kodierung<br />

verwendet werden. Es soll also gelten<br />

p (i)<br />

{ ⌊ x<br />

⌋<br />

x ⇔ 2 ≡ 1 mod 2 falls x ≥ 0<br />

i<br />

¬p (i)<br />

−(x+1)<br />

falls x


187<br />

5.4 Definierbarkeit von Bitvektoroperationen in Presburger Z -<br />

Arithmetik<br />

Die um Bitvektoroperationen erweiterte Presburger Z -Arithmetik (kurz: Presburger<br />

Z,Bit -Arithmetik), kann ähnlich wie Presburger N -Arithmetik leicht in S1S<br />

übersetzt werden. Diese Logik ist daher entscheidbar und ihr Entscheidungsproblem<br />

besitzt höchstens nicht elementare Komplexität. Wie aber oben dargestellt,<br />

ist das Entscheidungsproblem der Presburger-Arithmetik in O(2 22n )<br />

lösbar und somit wesentlich einfacher als das Entscheidungsproblem von S1S.<br />

Dieses einfachere Entscheidungsproblem ist einer der Gründe für den Einsatz<br />

von Presburger-Arithmetik. Es ist daher interessant, die Komplexität des Entscheidungsproblems<br />

von Presburger Z,Bit -Arithmetik zu untersuchen.<br />

Zunächst soll betrachtet werden, ob Bitvektoroperationen in Presburger-<br />

Arithmetik definierbar sind. Wären Bitvektoroperationen in Presburger-Arithmetik<br />

definierbar, so besäßen Presburger Z - und Presburger Z,Bit -Arithmetik äquivalente<br />

Ausdruckskraft. Wenn die durch die Definitionen der Bitvektoroperationen<br />

implizierte Übersetzung von Presburger Z,Bit - nach Presburger Z -Arithmetik<br />

mit polynomiellem Aufwand möglich wäre, wäre zudem gezeigt, dass das<br />

Entscheidungsproblem von Presburger Z,Bit -Arithmetik in O(2 22n )lösbar ist. Im<br />

Folgenden soll gezeigt werden, dass Bitvektoroperationen jedoch nicht in Presburger<br />

Z -Arithmetik definierbar sind.<br />

Die Bitvektoroperation NOT kann leicht in Presburger Z -Arithmetik definiert<br />

werden durch<br />

NOT(x) . = z ←→ z . = −(x +1)<br />

Dagegen ist OR nicht definierbar.<br />

Lemma 2. Die Bitvektoroperation OR ist nicht in Presburger Z -Arithmetik definierbar.<br />

Beweis. Angenommen die Bitvektoroperation OR wäre in Presburger Z -Arithmetik<br />

definierbar. Dann ist aber auch das Prädikat Sing Z : Z → B, das gegeben ist<br />

durch<br />

⇔ es gibt ein k ∈ N mit i =2k<br />

in Presburger Z -Arithmetik definierbar durch<br />

(<br />

Sing (x,y,z)<br />

Z<br />

:= ≥ 0 (y) ∧ y ≤ x<br />

∧<br />

∀y ′ . ( ≥ 0 (y ′ ) ∧ y ′ ≤ x ) → OR(x, y ′ ) ≤ OR(x, y) ∧<br />

z = . )<br />

OR(x, y)+1<br />

∀z.Sing (z)<br />

Z<br />

Sing (i)<br />

Z<br />

↔ ∃x, y.Sing(x,y,z)<br />

Z<br />

Sei z eine Zweierpotenz. Dann ist zu zeigen, dass Sing (z)<br />

Z<br />

gilt. Sing (1)<br />

Z<br />

Sing (0,0,1)<br />

Z<br />

Sing (2k−1 ,2 k−1 −1,z)<br />

Z<br />

gilt. Für eine Zweierpotenz z =2 k mit k>0 ist Sing (z)<br />

Z<br />

gilt.<br />

gilt, da<br />

erfüllt, da


188<br />

Sei umgekehrt Sing (z)<br />

Z<br />

erfüllt. Zu zeigen ist, dass z eine Zweierpotenz ist.<br />

Betrachte die Werte der durch die Existenzquantoren gebundenen Variablen x<br />

und y. Esgilt0 ≤ y ≤ x. Giltx =0, so folgt daraus y =0und damit z =1.<br />

Sei also x>0 und p x das Prädikat, das x kodiert. Dann existiert ein k mit p (k)<br />

x<br />

und ¬p (l)<br />

x<br />

für alle l>k.Für alle y ′ ≤ x gilt ebenfalls ¬p (l)<br />

y ′<br />

und damit ¬p(l)<br />

OR(x,y ′ )<br />

für alle l>k.AlsogiltOR(x, y ′ ) ≤ 2 k+1 − 1. Mit y ′ =2 k − 1 wird dieser Wert<br />

erreicht. Also muss OR(x, y) =2 k+1 − 1 gelten. Damit gilt z =2 k+1 und z ist<br />

eine Zweierpotenz.<br />

Es wurde also gezeigt, dass unter der Annahme, dass die Bitvektoroperation<br />

OR in Presburger Z -Arithmetik definierbar ist, auch das Prädikat Sing Z in Presburger<br />

Z -Arithmetik definierbar ist. Das Prädikat Sing Z ist aber offensichtlich<br />

nicht schließlich periodisch. Nach Lemma 1 kann es damit aber nicht in Presburger<br />

Z -Arithmetik definiert werden. Also kann die Bitvektoroperation OR nicht<br />

in Presburger Z -Arithmetik definiert werden.<br />

⊓⊔<br />

5.5 Komplexität des Entscheidungsproblems der um<br />

Bitvektoroperationen erweiterten Presburger-Arithmetik<br />

Es wurde gezeigt, dass Bitvektoroperationen nicht in Presburger Z -Arithmetik definierbar<br />

sind. Dies bedeutet, dass Presburger Z,Bit -Arithmetik ausdrucksstärker<br />

als Presburger Z -Arithmetik ist. Daraus allein lässt sich jedoch noch nicht folgern,<br />

dass das Entscheidungsproblem der Presburger Z,Bit -Arithmetik nicht in O(2 22n )<br />

lösbar ist. Im Folgenden soll gezeigt werden, dass das Entscheidungsproblem der<br />

Presburger Z,Bit -Arithmetik nicht elementare Komplexität besitzt.<br />

Es wurde gezeigt, dass das Prädikat Sing Z : Z → B in Presburger Z,Bit -Arithmetik<br />

definierbar ist. Dieses Prädikat entspricht dem in Abschnitt 3.3 benutzten<br />

Prädikat Sing :2 N → B eingeschränkt auf die ganze Zahlen repräsentierenden<br />

monadischen Prädikate über N. Also gilt:<br />

Sing Z (x) ⇔ Sing(p x )für alle x ∈ Z<br />

Entsprechende Einschränkungen der Prädikate Subset und S 2 sind ebenfalls in<br />

Presburger Z -Arithmetik definierbar:<br />

∀x.∀y. Subset Z (x, y) ↔ AND(x, y) = . x<br />

∀x.∀y. S 2Z (x, y) ↔ Sing Z (x) ∧ x + x = . y<br />

In Abschnitt 3.3 wurde gezeigt, dass jede MSO < -Formel in eine äquivalente<br />

Formel übersetzt werden kann, die keine Variablen erster Stufe und nur die Prädikate<br />

Subset, Sing und S 2 enthält (siehe Abb. 7). Einschränkungen dieser Prädikate<br />

sind in Presburger Z -Arithmetik definierbar. Eine ähnliche Einschränkung von<br />

MSO < stellt die Weak Monadic Second Order Logic of Linear Order (WMSO < )<br />

dar. Sie entspricht MSO < , wobei nur monadische Prädikate p zweiter Stufe betrachtet<br />

werden, die endlichen Mengen entsprechen, für die also ein n 0 ∈ N existiert<br />

mit ¬p (n) für alle n ≽ n 0 .DieseEinschränkung bezieht sich sowohl auf das<br />

Quantifizieren als auch auf die erlaubten Belegungen freier Variablen. Analog zu


189<br />

MSO < kann auch WMSO < auf die Prädikate Subset, Sing und S 2 zurückgeführt<br />

werden (siehe Abb. 7). Die entstehenden Formeln lassen sich dann sehr leicht in<br />

Presburger Z,Bit -Arithmetik übersetzen (siehe Abb. 12).<br />

function WMSO < Presburger Z,Bit (φ)<br />

case φ of<br />

Subset(p x,p y) : return Subset Z (x, y);<br />

Sing(p x) : return Sing Z (x);<br />

S 2(p x,p y) : return S 2Z (x, y);<br />

¬ϕ : return ¬WMSO < Presburger Z,Bit (ϕ);<br />

ϕ ∧ ψ :<br />

return WMSO < Presburger Z,Bit (ϕ) ∧ WMSO < Presburger Z,Bit (ψ);<br />

end<br />

end<br />

∃p x.ϕ<br />

: return ∃x.x ≥ 0 ∧ WMSO < Presburger Z,Bit (ϕ);<br />

Abb. 12: Übersetzung von WMSO < in Presburger Z,Bit -Arithmetik<br />

Es ist bekannt, dass das Entscheidungsproblem von WMSO < nicht elementare<br />

Komplexität besitzt (siehe [GTW02]). Aufgrund obiger Übersetzung, die<br />

polynomielle Komplexität besitzt, besitzt damit auch das Entscheidungsproblem<br />

von Presburger Z,Bit -Arithmetik nicht elementare Komplexität.<br />

Umgekehrt kann auch jede Presburger Z,Bit -Formel in eine WMSO < -Formel<br />

übersetzt werden. Analog zu der Übersetzung zwischen Presburger N - und Presburger<br />

Z -Arithmetik kann man auch WMSO < und eine Variante von WMSO <<br />

ineinander übersetzen, die neben monadischen Prädikaten, die endlichen Mengen<br />

entsprechen, auch solche erlaubt, die koendlichen Mengen entsprechen. Die Übersetzung<br />

einer Presburger Z,Bit -Formel in eine Formel dieser erweiterten WMSO < -<br />

Logik kann analog der Übersetzung von Presburger-Formel in eine MSO < -Formel<br />

erfolgen. Damit ist gezeigt, dass Presburger Z,Bit und MSO < äquivalente Ausdruckskraft<br />

besitzen.<br />

6 Zusammenfassung und Ausblick<br />

In diesem Text wurden kurz ω-Automaten vorgestellt und gezeigt, dass sie<br />

gleichmächtig zu den Prädikatenlogiken MSO < und S1S sind. Dabei wurde ein<br />

Algorithmus zur Übersetzung von Formeln dieser Logiken in ω-Automaten vorgestellt.<br />

Desweiteren wurde gezeigt, wie die praxisrelevanten Formalismen LTL und<br />

Presburger-Arithmetik in ω-Automaten übersetzt werden können. Diese beiden<br />

Formalismen sind dabei als zwei wichtige Vertreter einer Menge von praxisrelevanten<br />

Formalismen zu sehen, die in ω-Automaten übersetzt werden können.<br />

Ein Schwerpunkt dieses Textes lag auf der genaueren Betrachtung der Presburger-Arithmetik.<br />

Sie wurde durch Hinzunahme von Bitvektoroperation zu<br />

Presburger Z,Bit -Arithmetik erweitert. Es wurde gezeigt, dass diese Presburger<br />

Z,Bit -Arithmetik ausdrucksstärker als Presburger-Arithmetik ist. Während


190<br />

das Entscheidungsproblem der Presburger-Arithmetik jedoch in O(2 22n )lösbar<br />

ist, besitzt das Entscheidungsproblem der Presburger Z,Bit -Arithmetik jedoch<br />

nicht elementare Komplexität, wie gezeigt werden konnte.<br />

Eine im Zusammenhang mit Presburger-Arithmetik und ω-Automaten noch<br />

offene Frage ist, ob aus Presburger-Formeln entstandene ω-Automaten ein spezielles,<br />

polynomielles Determinisierungsverfahren besitzen. Es wurden einige Indizien<br />

hierfür dargelegt. Ein solches polynomielles Determinisierungsverfahren<br />

könnte für verbesserte Implementierungen von <strong>Verifikation</strong>sverfahren benutzt<br />

werden, die auf Presburger-Arithmetik basieren. Die Frage, ob ein solches polynomielles<br />

Determinisierungsverfahren für aus Presburger-Formeln entstandene<br />

ω-Automaten existiert, ist also auch für die Praxis interessant. Daher sind weitere<br />

Untersuchungen in diesem Bereich sinnvoll.<br />

Literatur<br />

[BHMV] Bruyère, Veronique ; Hansel, Georges ; Michaux,Christian; Villemaire,<br />

Roger. Logic and p-Recognizable Sets of Integers<br />

[GTW02] Grädel, Erich; Thomas, Wolfgang ; Wilke, Thomas: Automata logics,<br />

and infinite games: a guide to current research. Springer-Verlag New York,<br />

Inc., 2002. –ISBN 3–540–00388–6<br />

[Opp78] Oppen, Derek C.: A 2 22pn upper bound on the complexity of presburger<br />

arithmetic. In: Journal Computer System Sciences 16 (1978), S. 323–332<br />

[Sch04] Schneider, Klaus: Verification of Reactive Systems. Springer, 2004<br />

[Sto74] Stockmeyer, Larry J.: The Complexity of Decision Problems in Automata<br />

Theory and Logic, Deptartment of Electrical Engineering, MIT, Boston,<br />

Massachusetts, Diss., 1974


191<br />

Symbolische Lokale Modellprüfungsverfahren<br />

Nico Mahlo<br />

Technische Universität <strong>Kaiserslautern</strong><br />

Zusammenfassung Globale Modellprüfungsverfahren bedienen sich inzwischen<br />

schon längerer Zeit unterschiedlichster symbolischer Repräsentationen<br />

für die zu betrachtenden Zustandsräume. Die Art der Repräsentation<br />

hat teilweise einen sehr großen Einfluss auf Performanz und Einsatzmöglichkeiten<br />

der Verfahren. In dieser Arbeit soll über den Einsatz<br />

von symbolischen Repräsentationen für die lokale Modellprüfung nachgedacht<br />

werden.<br />

1 Historie<br />

Anfänglich wurden Computer nur in sehr geringem Ausmaß eingesetzt. Man<br />

nahm sie bei sehr speziellen, öfter wiederkehrenden Berechnungen zur Unterstützung.<br />

Dies waren meist sehr überschaubare Aufgaben, so dass fehlerhafte<br />

Implementierungen noch relativ leicht zu verbessern waren. In den 60er Jahren<br />

des letzten Jahrhunderts hat die Verbreitung von Computern sehr stark zugenommen.<br />

Es wurden wesentlich mehr Aufgaben mit ihrer Hilfe gelöst und das<br />

ausgefächert auf die verschiedensten Gebiete der Wissenschaft und Wirtschaft.<br />

Aufgrund dieser exzessiven Verwendung und dem Erscheinen der ersten Multi-<br />

Task-Betriebssysteme ist die Komplexität der damals aktuellen Anwendungen /<br />

<strong>Systeme</strong> explosionsartig gestiegen. Sehr schnell wurde klar, dass mit den bisherigen<br />

Verfahren zur Erstellung und Prüfung von Programmen diese Komplexität<br />

und vor allem die zu erwartende Zukünftige nicht mehr zu bewältigen war. Die<br />

Softwarekrise brach herein (1968).<br />

In diesen Jahren entwickelten Floyd und Hoare eine Logik, die es ermöglichte,<br />

für imperative Programme Korrektheitsbeweise zu liefern. Grundlage dieser Logik<br />

sind Zusicherungen, die eine sehr lokale Kontrolle im Programm ermöglichen.<br />

Ein Beispiel für eine Programmzeile mit solchen Zusicherungen wäre:<br />

{x >0,y 0,y


192<br />

Bei heutigen <strong>Systeme</strong>n stößt diese Logik jedoch sehr schnell an ihre Grenzen.<br />

Sobald Parallelität ins Spiel kommt, oder bei reaktiven <strong>Systeme</strong>n eventuell<br />

Indeterminismus auftritt, ist eine <strong>Verifikation</strong> des entsprechenden Systems mit<br />

dem Hoare-Kalkül nur sehr schwer, bzw. überhaupt nicht mehr möglich.<br />

Natürlich hat man sich inzwischen auch diesen Problemen angenommen und<br />

es wurden neue Logiken entwickelt. Mit ihnen entanden auch neue <strong>Verifikation</strong>sverfahren,<br />

die dieses zu leisten vermögen.<br />

2 Logiken<br />

2.1 Modallogiken<br />

Eine Modallogik erweitert die Ausdrucksmöglichkeit der ”normalen“ Aussagenlogik<br />

um die Möglichkeit, notwendige Bedingungen von Möglichen zu unterscheiden.<br />

Folgende zwei Operatoren wurden zu diesem Zweck eingeführt:<br />

– ♦ϕ zum Ausdruck einer Möglichkeit (z.B. ”In Register 5 kann der Wert 23<br />

stehen.“)<br />

– □ϕ zum Ausdruck einer Notwendigkeit (z.B. ”In Register 5 muss der Wert<br />

23 stehen.“)<br />

Zur Auswertung muss das zu analysierende Programm als Zustandsgraph vorliegen.<br />

Die modalen Operatoren werden dann mit Zuständen und Transitionen<br />

verknüpft (z.B. 〈x〉ϕ: Es ist möglich, dass nach der Ausführung von x im Nachfolgezustand<br />

ϕ gilt). Zwei sehr bekannte modale Logiken sind HML (Hennessy–<br />

Milner Logic) und PDL (Propositional Dynamic Logic).<br />

2.2 Temporallogiken<br />

Temporallogiken haben eine sehr starke Ähnlichkeit zu Modallogiken. Der hauptsächliche<br />

Unterschied zwischen beiden besteht darin, dass Temporallogiken anstatt<br />

Bedingtes und Mögliches, zeitlich Mögliches (Lebendigkeitseigenschaften)<br />

und zeitlich Unausweichliches (Sicherheitseigenschaften / Invarianz) beschreiben.<br />

D.h. die modalen Operatoren bekommen eine zeitliche Interpretation.<br />

3 Grundlagen<br />

3.1 Kripke-Strukturen<br />

Eine Kripke-Struktur ist formal definiert als ein Tupel K =(I, S, R, L) mit<br />

– S ist eine endliche Menge von Zuständen<br />

– I⊆Sist die Menge der Initialzustände<br />

– R⊆S×S Transitionsrelation


193<br />

– L : S→2 VΣ Markierungsfunktion<br />

Der Gedanke dahinter ist, dass ”Rahmen aus einer Menge von Welten“ als<br />

Zustandsmenge S definiert werden. Diese Rahmen sind sozusagen die Momentaufnahme<br />

der zu beschreibenden Welt.<br />

Wenn beispielsweise die Welt eines Systems betrachtet werden soll, werden<br />

Attribute definiert, welche ausreichend sind, die gewünschten Eigenschaften auszudrücken.<br />

Diese Attribute werden sooft verfeinert, bis eine Menge von binären<br />

Entscheidungen (Label, welche wahr oder falsch sein können) vorliegt. Diese sogenannte<br />

Labelmenge reicht aus, um die gesamte Welt des Modells für einen<br />

bestimmten Augenblick zu beschreiben.<br />

Wenn diese Labelmenge nun n Elemente besitzt, dann ist die theoretische<br />

Anzahl von daraus erstellbaren Zuständen 2 n . Dies ist auch exakt die Menge der<br />

Zustände, welche die zugehörige Kripke-Struktur besitzt. All diese Zustände sind<br />

bei einer Kripke-Struktur immer vorhanden, da sie theoretisch möglich wären.<br />

Allerdings werden oft nicht erreichbare Zustände weggelassen.<br />

Die Transitionsrelation (auch Übergangsrelation genannt) beschreibt hierbei,<br />

welche Zustände von welchen aus erreichbar sind. Hierbei spielt Kausalität<br />

keine Rolle, d.h. es wird nicht betrachtet warum ein gewisser Zustand von einem<br />

bestimmten Anderen aus erreichbar ist, sondern nur ob er es ist. Bei einer<br />

Kripke-Struktur handelt es sich also um einen Erreichbarkeitsgraphen.<br />

Zur Veranschaulichung soll an dieser Stelle als Beispiel ein endlicher Automat<br />

in eine Kripke-Struktur überführt werden. Dies geschieht durch ”Ausrollen“ der<br />

Zustände mit den zugehörigen Transistionen. Überführt werden soll also der<br />

folgende Automat:<br />

a/b¯c<br />

x 1 x 3<br />

<br />

a/b¯c<br />

<br />

x 1¯x 3<br />

ā/¯bc<br />

¯x 1 x 2 x<br />

3<br />

ā/¯bc<br />

<br />

∗/¯b¯c<br />

Abbildung 1. Endlicher Automat<br />

Dieser Automat stellt eine Art Sicherung dar. Der Automat empfängt das<br />

positive Signal a und meldet den Erfolg durch b. Sollte das fehlerhafte Signal<br />

ā erkannt werden, dann wird die Fehlermeldung c gesendet und der Automat<br />

stoppt (bzw. befindet sich in einer Endlosschleife, in welcher keine weitere Reaktion<br />

stattfindet).


194<br />

Beschrieben sind interne Zustände, bedingte Transitionen und Ausgaben.<br />

Programmtechnisch gesehen könnte der Automat als Instanz einer Klasse mit<br />

Attributen x i und Methoden mit Eingaben a und Ausgaben b, c interpretiert<br />

werden.<br />

Die Markierung im Initialzustand bedeutet hier, dass sowohl x 1 als auch x 3<br />

true ist. Über x 2 wird hierbei keine Aussage gemacht, kann also als beliebig angenommen<br />

werden. Vor der Überführung des Automaten in eine Kripke-Struktur,<br />

soll diese zunächst betrachtet werden:<br />

x 1 x 3 ab x 1 x 2 x 3 ab x 1 x 3 c x 1 x 2 x 3 c<br />

<br />

<br />

<br />

<br />

<br />

x 2 x 3 <br />

<br />

<br />

x 2x 3 a <br />

<br />

<br />

<br />

<br />

x<br />

<br />

1 ab x 1 x 2 ab <br />

x 1 c x 1 x 2 c<br />

Abbildung 2. Zum Automaten zugehörige Kripke-Struktur<br />

In der Kripke-Struktur werden die ausgehenden Kanten eines Zustandes mit<br />

in den Zustand (genauer: in die Belabelung dessen) übernommen. Im Falle des<br />

Initialzustandes gibt es aufgrund der Undefiniertheit von x 2 zwei mögliche Startzustände:<br />

x 1 und x 3 sind wahr, x 2 ist entweder wahr oder falsch. Weiterhin fließen<br />

die im Startzustand möglichen Eingaben in den Zustand der Kripke-Struktur mit<br />

hinein. Der Input ist entweder a oder ā. Somit gibt es wiederum für jeden dieser<br />

zwei Startzustände zwei Möglichkeiten.<br />

Dies ist der Grund, warum in der Kripke-Struktur aus dem einen Startzustand<br />

des Automaten Vier geworden sind. Nach dem gleichen Schema werden<br />

auch die anderen beiden Zustände des Automaten in Zustände der Kripke-<br />

Struktur überführt. Die Transitionen ergeben sich auf ähnliche Art und Weise.<br />

Als Beispiel: Aus dem Initialzustand gelangt der Automat bei Eingabe a in den<br />

Zustand 2 (rechts oben, der Untere sei Zustand 3). In der Kripke-Struktur geht<br />

somit je eine Transition von jedem Initialzustand, in welchem a gilt, zu jedem<br />

Zustand, der einen Zustand von Zustand 2 des Automaten beschreibt (dies sind<br />

die vier unteren Zustände in der Kripke-Struktur).<br />

Hierbei wird ersichtlich, dass eine Kripke-Struktur – wie bereits erwähnt –<br />

keine Kausalität beschreibt. Es ist der Struktur nicht mehr zu entnehmen, wann<br />

und warum welche Transition ausgeführt wird, sondern nur, welche prinzipiell<br />

möglich sind. Es ist sogar vielmehr nicht einmal mehr möglich, zwischen Attributen,<br />

Eingaben und Ausgaben zu unterscheiden.<br />

Die Struktur selbst ist maximal, d.h. alle möglichen Zustände werden beschrieben.<br />

Es existieren die Attribute, Eingaben und Ausgaben, was insgesamt<br />

6 Labels ergibt. Damit hat die Kripke-Struktur exakt 2 6 = 64 Zustände. D.h.<br />

auch x 1 x 2 x 3 abc existiert in der Kripke-Struktur, ist allerdings nicht erreichbar


195<br />

und deshalb in der Grafik nicht dargestellt. Damit handelt es sich um eine minimale<br />

Kripke-Struktur. Es ist nicht möglich, zu dem selben Automaten eine andere<br />

korrekte und minimale Kripke-Struktur zu erstellen, wohl aber eine andere<br />

Nicht–minimale. Von nicht erreichbaren Zuständen dürfen beliebig ausgehende<br />

Kanten zu anderen (auch erreichbaren) Zuständen erstellt werden, ohne dass<br />

sich dabei die Semantik ändert. (Dies wird zu Optimierungszwecken auch getan<br />

– beispielsweise um eine BDD-Darstellung der Struktur zu minimieren.)<br />

3.2 Substitution<br />

Eine wichtige Operation bei der symbolischen Modellprüfung ist die Substitution.<br />

Aus diesem Grund sollen hier einige fundamentale Dinge beschrieben werden.<br />

Geltungsbereich einer Variablen<br />

Folgende Formeln sollen betrachtet werden:<br />

(∀x.P (x)) ∨ (∀x.Q(x))<br />

∀x.(P (x) ∨ Q(x))<br />

Auf den ersten Blick könnte man meinen, die beiden Formeln seien semantisch<br />

identisch. Den gravierenden Unterschied kann man sich jedoch schnell klar machen,<br />

wenn man P (x) für ”x ist eine gerade Zahl“ und Q(x) für ”x ist eine<br />

ungerade Zahl“ einsetzt. Wenn jetzt x ∈ N gilt, dann hieße die linke Formel<br />

”Alle natürlichen Zahlen sind gerade, oder alle natürlichen Zahlen sind ungerade.“,<br />

während die Rechte ”Alle natürlichen Zahlen sind gerade, bzw. ungerade.“<br />

besagt.<br />

Der Unterschied liegt hier an den Geltungsbereichen für x. Gut ersichtlich<br />

werden diese beim Betrachten der Syntaxbäume:<br />

∨<br />

∀x<br />

<br />

∀x<br />

<br />

∀x<br />

∨<br />

P (x)<br />

Q(x)<br />

<br />

P (x)<br />

<br />

Q(x)<br />

Abbildung 3. Syntaxbäume zu den obigen Formeln<br />

Die Geltungs– bzw. Bindungsbereiche der Quantoren sind genau deren Unterbäume<br />

im Syntaxgraphen. Während im rechten Fall jedes x nur die Oder-<br />

Verknüpfung erfüllen muss, wird hingegen im linken Fall verlangt, dass mindestens<br />

jedes xP erfüllt und/oder jedes xQ.


196<br />

Substitution<br />

Da Variablen für beliebige konkrete Werte stehen ist es sinnvoll, diese durch<br />

Terme substituieren zu können. Zum Beispiel bedeutet<br />

x ∨ y[a ∨ b/y]<br />

”Ersetze im Term x ∨ y das y durch a ∨ b“. Also ergibt sich:<br />

x ∨ a ∨ b<br />

Wenn nun aber beispielsweise in der Aussage<br />

∃x.x = y<br />

folgende Substitution durchgeführt werden soll, entsteht das Ergebnis<br />

∃x.x = y[x +1/y] ⇐⇒ ∃x.x = x +1<br />

welches für jedes x ∈ R offensichtlich falsch ist. Der Grund des aus einer korrekten<br />

Aussage hervorgegangenen Widerspruchs liegt im Geltungsbereich des<br />

∃–Quantors. Bei dieser Substitution ist das ”neue“ x, welches im Term x + 1 eine<br />

freie (da nicht gebunden) Variable war, in den Bindungsbereich des Quantors<br />

gelangt und wurde von diesem gebunden.<br />

Bei einer zulässigen Substitution darf daher eine freie Variable nicht gebunden<br />

werden. Sollte also ein solcher Konflikt auftreten, dann muss die (noch)<br />

freie Variable durch eine, noch nicht im zu substituierenden Term vorhandene,<br />

Variable ersetzt werden:<br />

∃x.x = y[x +1/y] ⇐⇒ ∃x.x = y[t +1/y] ⇐⇒ ∃x.x = t +1<br />

Dies ist eine gültige Substitution und ändert in diesem Fall auch nichts an der<br />

Erfüllbarkeit der Formel. Man sagt daher:<br />

Eine Substitution A[t/x] ist zulässig gdw. t ist frei für x in A.<br />

3.3 µ–Kalkül<br />

Das µ–Kalkül ist eine Möglichkeit zur Beschreibung von Bedingungen, bzw. Anforderungen<br />

auf Zuständen. Es kann sowohl modal als auch temporal betrachtet<br />

werden – abhängig vom System, dessen Beschreibung/Modell näher untersucht<br />

werden soll.<br />

Es geht somit prinzipiell um die Betrachtung von Abläufen – ungeachtet<br />

dessen, ob diese zeitlich oder modal (〈lat.〉 die Art und Weise bezeichnend) beschrieben<br />

werden. Hierbei sind natürlich Vorgänger und Nachfolger von essentieller<br />

Bedeutung. Definiert werden diese Vorgänger- und Nachfolgermengen wie<br />

folgt:<br />

Definition: Gegeben sei eine Relation R⊆S 1 ×S 2 . Die existenziellen<br />

und universellen [Ur-]Bilder der Mengen Q 1 ⊆S 1 und Q 2 ⊆S 2 werden


197<br />

definiert durch:<br />

– pre R ∃ (Q 2):={s 1 ∈S 1 |∃s 2 .(s 1 ,s 2 ) ∈R∧s 2 ∈S 2 }<br />

– pre R ∀ (Q 2):={s 1 ∈S 1 |∀s 2 .(s 1 ,s 2 ) ∈R→s 2 ∈S 2 }<br />

– suc R ∃ (Q 1):={s 2 ∈S 1 |∃s 1 .(s 1 ,s 2 ) ∈R∧s 1 ∈S 1 }<br />

– suc R ∀ (Q 1):={s 2 ∈S 1 |∀s 1 .(s 1 ,s 2 ) ∈R→s 1 ∈S 1 }<br />

In Worten: Für eine Kripke-Struktur beschreibt pre R ∃ (Q 2) die sog. existenziellen<br />

Vorgänger der Menge Q 2 . Dies ist die Menge der Zustände, von denen aus mit<br />

nur einem Schritt ein Zustand aus Q 2 erreicht werden kann. Es existiert also<br />

(mindestens) ein Nachfolgezustand aus Q 2 für jeden Zustand aus pre R ∃ (Q 2).<br />

pre R ∀ (Q 2) bezeichnet die sog. universellen Vorgänger der Menge Q 2 .<br />

Hierbei ist die Menge der Zustände, von denen aus mit nur einem Schritt<br />

auf jeden Fall ein Zustand aus der Menge Q 2 erreicht wird, gemeint. Die Definition<br />

der Nachfolgermengen vollzieht sich analog. Existenzielle Nachfolger sind<br />

Zustände, bei denen mindestens ein Vorgänger in Q 1 liegt. Bei der universellen<br />

Nachfolgermenge müssen alle Vorgängerzustände in Q 1 liegen.<br />

Binäre Zustandsdiagramme (BDDs)<br />

Binäre Zustandsdiagramme (engl. Binary Decision Diagram) dienen zur kompakten<br />

Verwaltung von aussagenlogischen Formeln. Mit ”kompakt“ sind nicht die<br />

ausgefalteten BDDs gemeint, sondern reduzierte, geordnete BDDs (ROBDDs).<br />

BDDs sind anschaulich gesprochen Graphen, welche Knoten haben, die Literale<br />

repräsentieren, jeweils eine 0- und eine 1-Kante haben und in den Blättern 0<br />

bzw. 1 als Knotenwert besitzen. Als Beispiel die Darstellung der Formel a ∧ b ∨ c<br />

als einfacher BDD ohne Optimierungen in voller Größe:<br />

a <br />

<br />

<br />

b<br />

<br />

b<br />

<br />

<br />

<br />

c<br />

c<br />

c<br />

c<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

0 1 0 1 0 1 1 1<br />

Abbildung 4. a ∧ b ∨ c als Binary Decision Diagram


198<br />

Auch Zustandsmengen (bzw. Kripke-Strukturen) lassen sich als aussagenlogische<br />

Formeln, und damit auch als [RO]BDDs darstellen. Zur Veranschaulichung<br />

diene folgendes kleines Beispiel:<br />

a <br />

b <br />

<br />

<br />

c ac<br />

⎛<br />

⎞<br />

a ∧¬b ∧¬c ∧¬a ′ ∧¬b ′ ∧ c ′ ∨<br />

a ∧¬b ∧¬c ∧ a ′ ∧¬b ′ ∧ c ′ ∨<br />

R =<br />

⎜ a ∧¬b ∧ c ∧¬a ′ ∧¬b ′ ∧ c ′ ∨<br />

⎟<br />

⎝ ¬a ∧ b ∧¬c ∧ a ′ ∧¬b ′ ∧ c ′ ∨ ⎠<br />

¬a ∧¬b ∧ c ∧ a ′ ∧¬b ′ ∧ c ′<br />

Abbildung 5. Kripke-Struktur und zugehörige aussagenlogische Formel<br />

Ein Zustand wird (ähnlich wie bei der Überführung eines Automaten in eine<br />

Kripke-Struktur) durch seine ausgehenden Kanten beschrieben. Hierbei werden<br />

die Labels des Zielzustandes besonders gekennzeichnet, damit diese nicht fälschlicherweise<br />

wegreduziert werden. In diesem Beispiel sind Zielzustandsmarkierungen<br />

mit einem ′ gekennzeichnet.<br />

R ist hier komplett ”ausgeschrieben“, um das Verfahren zu verdeutlichen. In<br />

der aussagenlogischen Formel sind also viele veroderte Transitionen, welche aus<br />

der Verundung aller Quell- und Ziellabel bestehen.<br />

Rechentechnisch bedeutet dies, dass die Transitionen, die vom Zustand X<br />

(z.B. a ∧ b ∧¬c) ausgehen, einfach durch<br />

Q = R∧X<br />

gefunden werden können. Auf den Vorgang des Reduzierens soll allerdings an<br />

dieser Stelle nicht weiter eingegangen werden, da es genügend Arbeiten gibt, die<br />

dieses Thema sehr detailliert behandeln. Die eigentlichen Berechnungen, die hier<br />

verwendet werden, sind unabhängig davon, ob es sich um einen klassischen BDD<br />

oder einen ROBDD handelt. Einzig die Ausführungsgeschwindigkeit würde von<br />

Letzterem profitieren.<br />

Neben der Berechnung von Transitionen eines Zustandes lassen sich mit diesen<br />

Strukturen auch die Vorgänger- und Nachfolgermengen berechnen. Dazu sei<br />

die Schreibweise für eine Substitution wie folgt vereinbart:<br />

[Φ] a b<br />

Dies bedeutet: Alle Vorkommen von b in Φ werden durch a ersetzt.<br />

Vorgängerberechnung<br />

Sei Φ Q eine aussagenlogische Formel, welche die Zustandsmenge Q repräsentiert.<br />

Zur Vereinfachung soll Q nur einen einzigen Zustand aus Abbildung 5 beschrei-


199<br />

ben. Sei dies Zustand c, also:<br />

Φ Q := ¬a ∧¬b ∧ c<br />

Errechnet wird die Menge der existenziellen Vorgänger von Q durch:<br />

pre R ∃ (Q) :<br />

∃x ′ 1, ..., x ′ n.R(x 1 , ..., x n ,x ′ 1, ..., x ′ n) ∧ [Φ Q ] x′ 1 ,...,x′ n<br />

x 1,...,x n<br />

Am jetzigen Beispiel berechnet sich das folgendermaßen:<br />

∃x ′ 1, ..., x ′ n. [Φ Q ] x′ 1 ,...,x′ n<br />

x 1,...,x n<br />

Durch die Auswahl eines einzigen Zustands ist diese Berechnung offensichtlich.<br />

x ′ i muss dem Vorkommen von x i entsprechen. Wenn dies zutrifft hat man im<br />

Fall, dass Φ Q nur einen einzigen Zustand repräsentiert, sofort eine erfüllende<br />

Belegung.<br />

[¬a ∧¬b ∧ c] ¬a′ ,¬b ′ ,c ′<br />

a,b,c<br />

⇐⇒ ¬¬a ′ ∧¬¬b ′ ∧ c ′ ⇐⇒ a ′ ∧ b ′ ∧ c ′<br />

ist sofort erfüllt, wenn man alle Literale wahr setzt.<br />

⎛<br />

⎞<br />

a ∧¬b ∧¬c ∧ a ′ ∧ b ′ ∧ c ′ ∨<br />

a ∧¬b ∧¬c ∧¬a ′ ∧ b ′ ∧ c ′ ∨<br />

pre R ∃ (Q) =<br />

⎜ a ∧¬b ∧ c ∧ a ′ ∧ b ′ ∧ c ′ ∨<br />

⎟<br />

⎝ ¬a ∧ b ∧¬c ∧¬a ′ ∧ b ′ ∧ c ′ ∨ ⎠ ∧ [¬a ∧¬b ∧ ,¬b ′ ,c ′<br />

c]¬a′ a,b,c<br />

} {{ }<br />

¬a ∧¬b ∧ c ∧¬a ′ ∧ b ′ ∧ c ′ (a ′ ∧b ′ ∧c ′ )<br />

( )<br />

a ∧¬b ∧¬c∨<br />

=<br />

a ∧¬b ∧ c<br />

} {{ }<br />

(∗)<br />

(∗) bezeichnet die gesuchte Menge. Dies ist die aussagenlogische Formel, welche<br />

alle gesuchten Zustände von pre R ∃<br />

(Q) beschreibt. Da es sich, wie gesagt,<br />

wiederum um eine aussagenlogische Formel handelt, kann auch diese Menge als<br />

[RO]BDD dargestellt werden. Da die BDD-Pakete inzwischen auf sehr effizienten<br />

Algorithmen beruhen, lassen sich Berechnungen auf diesen Datenstrukturen<br />

bemerkenswert gut durchführen.<br />

Die Nachfolgerberechnung wird ähnlich vollzogen. Die Berechnungsvorschrift<br />

zur Ermittlung der Nachfolgermenge von Q lautet:<br />

suc R ∃ (Q) : ∃x 1 , ..., x n . [R(x 1 , ..., x n ,x ′ 1, ..., x ′ n) ∧ Φ Q ] x1,...,xn<br />

x ′ 1 ,...,x′ n<br />

Wenn es sich bei Q allerdings nicht um die Repräsentation nur eines Zustandes<br />

handelt, wird die Berechnung einer erfüllenden Belegung für den ∃–Quantor<br />

etwas schwerer.<br />

Prinzipiell werden zur Quantifizierung von ROBDDs folgende zwei Eigenschaften<br />

benutzt (x ist eine Variable, ϕ eine Formel):


200<br />

∃x.ϕ =[ϕ] 1 x ∨ [ϕ]0 x<br />

∀x.ϕ =[ϕ] 1 x ∧ [ϕ]0 x<br />

[ϕ] 1 x und [ϕ]0 x<br />

werden auch als positiver und negativer Kofaktor von ϕ und x<br />

bezeichnet.<br />

Bei der Quantifizierung über einer Menge E von Variablen kann E wieder als<br />

ROBDD repräsentiert werden (als Verundung der einzelnen Zustände). Daraus<br />

resultiert der Algorithmus exists(e, r), welcher als Eingabe den E repräsentierenden<br />

ROBDD und den ”eigentlichen“ ROBDD, welcher die zu quantifizierende<br />

Formel darstellt, erhält.<br />

Die Ausgabe ist ein BddNode, der die erfüllende Belegung (falls diese existiert)<br />

beschreibt. Der Algorithmus soll an dieser Stelle jedoch nicht näher erläutert<br />

werden. Für nähere Informationen sei hiermit auf [VRS03] verwiesen.<br />

Das Finden dieser erfüllenden Belegung kann jedoch signifikant durch relationale<br />

Produktbildung mit einem ROBDD–Durchlauf optimiert werden. Ein<br />

für diese Operation angegebener Algorithmus in Pseudo-Code stammt aus der<br />

Vorlesung [VRS03]:<br />

function RelProd(BddNode e, r, q)<br />

int m; BddNode h, l;<br />

if r.isLeaf(0) ∨ q.isLeaf(0) then return Leaf(0);<br />

elseif r.isLeaf(1) then return exists(e, q);<br />

elseif q.isLeaf(1) then return exists(e, r);<br />

else<br />

m = min{r.label, q.label};<br />

(r 0 ,r 1 ) := cf(r, m);<br />

(q 0 ,q 1 ) := cf(q, m);<br />

h := RelProd(e, r 1 ,q 1 );<br />

l := RelProd(e, r 0 ,q 0 );<br />

if m ∈ e then return apply(∨,h,l);<br />

else return new BddNode(m, h, l);<br />

endif;<br />

endif;<br />

end function<br />

Abbildung 6. Algorithmus zur Berechnung des relationalen Produkts<br />

Ein BddNode sei hier definiert durch BddNode(Label, neg. Unterbaum, pos.<br />

Unterbaum). Die Funktion cf(BddNode x, int i) liefere hierbei das Paar mit den<br />

Kofaktoren der Knoten mit dem Label i. Der Algorithmus apply(f, x, y) liefere


201<br />

den BDD (bzw. dessen Wurzel), welcher die Verknüpfung von BddNode x und<br />

BddNode y mit der boolschen Operation f repräsentiert.<br />

Wenn R und Φ Q nun durch die ROBDDs r und q repräsentiert werden und<br />

ROBDD e die Menge E = {x 1 , ..., x n } beschreibt, dann berechnet<br />

RelProd(e, r, q) = ROBDD (∃x 1 , ..., x n .R∧Φ Q ) .<br />

Jetzt fehlt lediglich die Substitution der Variablen x ′ i durch x i (bzw. umgekehrt<br />

für q bei der Vorgängerberechnung). Im praktischen Einsatz wird dies jedoch<br />

meist durch eine verschränkte Variablenordnung umgangen.<br />

D.h. x ′ 1 ≺ x 1 ≺ x ′ 2 ≺ x 2 ≺ ... ≺ x ′ n ≺ x n , somit müssen im Algorithmus<br />

lediglich angepasste Indizes verwendet werden (z.B. i ↦→ 2i + 1 um alle x ′ i zu<br />

adressieren).<br />

Durch die effizienten BDD–Algorithmen existiert damit eine gute Möglichkeit<br />

zur Berechnung der Vorgänger- und Nachfolgermengen. Diese Mengen werden<br />

bei der Auswertung des µ–Kalküls benötigt, dessen Semantik folgendermaßen<br />

definiert ist:<br />

Zu einer Kripke-Struktur K und einer Formel ϕ ∈L µ definiert man:<br />

– x K := {s ∈S|x ∈L(s)}<br />

– ¬ϕ K := S\ϕ K<br />

– ϕ ∧ ψ K := ϕ K ∩ ψ K<br />

– ϕ ∨ ψ K := ϕ K ∪ ψ K<br />

– ♦ϕ K := pre R ∃ (ϕ K) und □ϕ K := pre R ∀ (ϕ K)<br />

– ← ♦ ϕ K := suc R ∃ (ϕ K) und ← □ϕ K := suc R ∀ (ϕ K)<br />

– µx.ϕ K und νx.ϕ K sind kleinster und größter Fixpunkt<br />

x K bezeichnet die Menge der Zustände, welche ein x in der Labelmenge haben;<br />

d.h. x ist in diesem Zustand wahr. Die Negation einer µ–Kalkülformel wird<br />

ausgewertet, indem aus der gesamten Zustandsmenge diejenigen entfernt werden,<br />

in denen die Formel gilt. Die Und- bzw. Oder-Verknüpfungen werden durch<br />

Schnittmengen respektive Vereinigungen der Teilformelmengen gebildet.<br />

← ♦ ϕ K ist definiert als die Menge der existenziellen Vorgänger der Zustände,<br />

in denen ϕ gilt. Auf ein temporales Zustandssystem ausgelegt bedeuted dies, dass<br />

das die Menge der Zustände ist, welche unmittelbar in einen Zustand gelangen<br />

können, in welchem ϕ erfüllt ist. □ϕ K , ← ♦ ϕ K , ← □ϕ K verhalten sich analog.<br />

Die eigentliche Stärke erlangt das µ–Kalkül erst durch die Fixpunktoperatoren.<br />

Ein Fixpunkt wird im mathematischen Sinn durch die Eigenschaft<br />

f(x) =x<br />

definiert. Bei der Fixpunktberechnung im µ–Kalkül handelt es sich bei x allerdings<br />

meist um eine Zustandsmenge. Kleinster und größter Fixpunkt bezeichnen


202<br />

somit die kleinste, bzw. größte Menge, die diese Eigenschaft erfüllt. Diese Zustandsmengen<br />

lassen sich aufgrund von Monotonie–Eigenschaften<br />

Es gilt:<br />

– Q 2 ⊆ Q ′ 2 impliziert pre R ∗ (Q 2 ) ⊆ pre R ∗ (Q ′ 2)<br />

– Q 1 ⊆ Q ′ 1 impliziert suc R ∗ (Q 1 ) ⊆ suc R ∗ (Q ′ 1)<br />

iterativ berechnen. D.h. die Berechnung nähert sich mit jeder Iteration dem<br />

Fixpunkt an, bis dieser letztendlich erreicht wird. Hier einige Beispiele dazu,<br />

was mit µ–Kalkül–Formeln ausgedrückt/beschrieben werden kann:<br />

– Sicherheitseigenschaften: Gibt es einen Pfad, auf dem immer ϕ gilt?<br />

νx.ϕ ∧ ♦x K<br />

– Lebendigkeitseigenschaften: Gibt es einen Pfad, auf dem mindestens einmal<br />

ϕ gilt?<br />

µx.ϕ ∨ ♦x K<br />

– Persistenzeigenschaften: Gibt es einen Pfad, auf dem ab einem Zeitpunkt<br />

immer ϕ gilt?<br />

µy.[νx.ϕ ∧ ♦x] ∨ ♦y K<br />

– Fairnesseigenschaften: Gibt es einen Pfad, auf dem unendlich oft ϕ gilt?<br />

νy.♦[µx.(y ∧ ϕ) ∨ ♦x] K<br />

3.4 Unendliche Zustandsräume<br />

<strong>Systeme</strong> mit unendlichen Zustandsräumen treten in den verschiedensten Formen<br />

auf. Besonders in der Welt der reaktiven <strong>Systeme</strong> sind diese sehr oft anzutreffen.<br />

Nach [ScSc04] gibt es unter anderem folgende fünf Quellen für Unendlichkeit:<br />

1. Datenstrukturen über unendliche Definitionsbereiche (z.B. N)<br />

2. Kontrollstrukturen (z.B. unbegrenzter Call-Stack, dynamische Erstellung<br />

von Prozessen)<br />

3. asynchrone Kommunikation / unbegrenzte Queues (FIFOs) für Prozess-<br />

Kommunikation<br />

4. Parametrisierung (unendliche Familien von <strong>Systeme</strong>n)<br />

5. Echtzeit-Schranken (basierend auf konkreten Zeitangaben)


203<br />

Sobald zum Beispiel Zustandsänderungen asynchron vonstatten gehen, lässt<br />

sich das System nicht mehr als endliche Menge von zeitbasierten Zuständen<br />

darstellen. Dies ist nicht möglich, da das Intervall zwischen zwei Zeitpunkten<br />

schließlich beliebig hoch aufgelöst werden kann, also zwischen zwei beliebig dicht<br />

aufeinander folgenden Zeitpunkten unendlich viele Zeitzustände dazwischen liegen.<br />

Unter anderem werden sogenannte erweiterte endliche Automaten, wie in<br />

[KuKu98] beschrieben, regelmäßig in frühen Phasen von Design-Flows verwendet.<br />

Diese Automaten gehören zur mächtigsten Klasse von Maschinenmodellen<br />

(touring-complete) und führen auf unendliche Zustandsräume.<br />

Ein weiteres Problem bei unendlichen Zustandsräumen besteht darin, dass<br />

für die Modellprüfung keine Garantie auf Terminierung gegeben werden kann.<br />

Daher versucht man, als zu prüfenden Zustandsraum sich auf die endlichen<br />

Kontrollstrukturen zu beschränken, anstatt auf unendlichen Datenstrukturen<br />

zu prüfen.<br />

Allerdings unabhängig davon, ob es sich um endliche, oder unendliche Zustandsräume<br />

handelt, wird bei Modellprüfung meist nur zwischen lokaler und<br />

globaler unterschieden.<br />

4 Modellprüfung<br />

Bei Modellprüfung geht es um Verfahren, die bestimmte Aussagen auf gegebenen<br />

Modellen auf Korrektheit/Gültigkeit untersuchen. Grundlage einer jeden<br />

<strong>Verifikation</strong> ist zunächst ein mathematisches, bzw. theoretisches Modell des zu<br />

prüfenden Systems.<br />

Definition: Modellprüfung ist eine Technik zur <strong>Verifikation</strong> von in der<br />

Informatik auftretenden <strong>Systeme</strong>n. [ArBi97]<br />

Dieses Modell muss natürlich die zu verifizierenden Eigenschaften in geeigneter<br />

Weise genau genug beschreiben. Zusätzlich zum Modell wird außerdem<br />

eine zu diesem passende Sprache benötigt, um die zu prüfenden Eigenschaften<br />

beschreiben zu können.<br />

Die Modellprüfung ist dann das Verfahren, welches mehr oder minder vollautomatisch<br />

diese Eigenschaften überprüft. Abhängig vom Verfahren wird beim<br />

Fehlschlagen der Prüfung auch ein Gegenbeispiel geliefert, was der Fehlersuche<br />

natürlich sehr dienlich ist, bzw. überhaupt erst einen Ansatzpunkt für diese liefert.<br />

Es gibt globale und lokale Modellprüfungsalgorithmen sowohl für endliche als<br />

auch für unendliche Zustandsräume. Seit geraumer Zeit werden neue Möglichkeiten,<br />

Zustandsräume effektiv zu beschreiben und zu verwalten, gesucht. Dies<br />

führte zu unterschiedlichen symbolischen Repräsentationen, unter anderem zu:<br />

– Prädikatenlogik<br />

– [endliche] Automaten


204<br />

– Kripke-Strukturen<br />

– Presburger Arithmetrik [ScSc04]<br />

– Binären Entscheidungsdiagrammen<br />

Viele dieser Repräsentationen hielten in den sogenannten symbolischen Modellprüfungsverfahren<br />

Einzug. Allerdings war es meistens die globale Modellprüfung,<br />

in welcher diese neuen Darstellungsformen eingesetzt wurden. Lange<br />

Zeit wurde die lokale Modellprüfung in diesem Bezug recht stiefmütterlich behandelt.<br />

Dies lag aber vor allem daran, dass die theoretisch effizienteren lokalen Verfahren<br />

in der Praxis dennoch nicht so leistungsfähig wie die Globalen waren, bzw.<br />

auch heute noch größtenteils sind. In den letzten Jahren verstärken sich jedoch<br />

die Bemühungen, auch lokale Modellprüfungsverfahren zu entwickeln, welche auf<br />

diesen symbolischen Repräsentationen beruhen.<br />

4.1 Globale Modellprüfung<br />

Unter globaler Modellprüfung versteht man Verfahren, die auf der gesamten Zustandsmenge<br />

operieren. D.h. für eine Anforderung ϕ wird der gesamte Zustandsraum<br />

auf dessen Erfüllung geprüft. Als Ergebnis wird die Menge aller Zustände<br />

geliefert, in welcher die Anforderung erfüllt wird.<br />

Mit dieser Technik erhält man sofort einen vollständigen Überblick über die<br />

Gültigkeit dieser Anforderung, da durch Kenntnis der Ergebnismenge T ⊆ S<br />

auch alle Zustände bekannt sind, in denen die Anforderung nicht erfüllt ist<br />

(nämlich F = S \ T ).<br />

Seien hier nun wieder Kripke-Strukturen und µ–Kalkül–Formeln als Beschreibungsformen<br />

des Zustandsraumes und der Anforderungen zugrunde gelegt. Dann<br />

werden die gegebenen Anforderungen in Subformeln zerlegt und mit den zugehörigen<br />

Zustandsmengen verknüpft. Als globaler Modellprüfer diene hier die<br />

States–Funktion aus [VRS03]:


205<br />

function States µ (Φ)<br />

case Φ of<br />

is var(Φ) : return {s|Φ ∈L(s)};<br />

¬ϕ : return S\ States µ (ϕ);<br />

ϕ ∧ ψ : return States µ (ϕ)∩ States µ (ψ);<br />

ϕ ∨ ψ : return States µ (ϕ)∪ States µ (ψ);<br />

♦ϕ : return pre R ∃ (States µ(ϕ));<br />

□ϕ : return pre R ∀ (States µ(ϕ));<br />

←<br />

♦ ϕ : return suc<br />

R<br />

∃<br />

(States µ (ϕ));<br />

←<br />

□ϕ : return suc<br />

R<br />

∀<br />

(States µ (ϕ));<br />

µx.ϕ : Q 1 := {};<br />

repeat<br />

Q 0 := Q 1 ;<br />

L := L Q1<br />

x ;<br />

Q 1 := States µ (ϕ);<br />

until Q 0 = Q 1 ;<br />

return Q 0 ;<br />

νx.ϕ : return S\ States µ (µx.¬[ϕ] ¬x<br />

x );<br />

end;<br />

Abbildung 7. Globaler Modellprüfungsalgorithmus States<br />

Im Falle, dass es sich bei Φ um eine Variable handelt, liefert der Algorithmus<br />

alle Zustände, in denen diese Variable zur Markierung gehört. Da dies der<br />

einfachste Fall einer Formel ist, kann daran schon erkannt werden, dass der Modellprüfer<br />

in jedem Fall alle Zustände betrachtet.<br />

Wenn Φ eine komplexere Formel darstellt, wird sie rekursiv in ihre Subformeln<br />

zerlegt. Für diese werden dann die zugehörigen Zustandsmengen berechnet<br />

(die weiter oben erwähnte Verknüpfung von Zustandsmengen zu Subformeln).<br />

Auch dies geschieht durch weitere Zerlegung der Subformeln in weitere Subformeln,<br />

bis diese letztlich nur noch je eine Variable repräsentieren.<br />

Anschließend werden diese Teilmengen wieder entsprechend der Operatoren<br />

zu einer Gesamtmenge verschmolzen, welche dann die Ergebnismenge darstellt.<br />

Falls Fixpunktformeln auftreten, werden diese durch iterative Annäherung der<br />

Fixpunktmengen bestimmt. Hierzu ein kleines Beispiel:<br />

Folgender Zustandsraum sei gegeben:


206<br />

s 0<br />

a <br />

s 3<br />

s 2<br />

<br />

ac b <br />

<br />

<br />

s ab 1<br />

<br />

s c 4<br />

<br />

s d 5<br />

Abbildung 8. Zustandsraum für Beispiel zur globalen Modellprüfung<br />

Für diese Kripke-Struktur soll nun die Formel<br />

µx.a ∨ ♦x K<br />

ausgewertet werden. Gesucht ist also die Menge von Zuständen, in denen a gilt,<br />

oder von denen aus ein Pfad existiert, auf welchem irgendwann einmal a gelten<br />

kann. Nach der Rechenvorschrift<br />

µx.ϕ : Q 1 := {};<br />

repeat<br />

Q 0 := Q 1 ;<br />

L := L Q1<br />

x ;<br />

Q 1 := States µ (ϕ);<br />

until Q 0 = Q 1 ;<br />

return Q 0 ;<br />

gilt also ϕ =(a ∨ ♦x). Dieses wird nach<br />

ϕ ∨ ψ : returnStates µ (ϕ) ∪ States µ (ψ);<br />

wiederum aufgeteilt. Damit ergibt sich folgender Rechenablauf für die erste Iteration:<br />

[µx] Q 0 := Q 1 := ∅<br />

Q 1 := States µ (a ∨ ♦x)<br />

[∨] States µ (a) ∪ States µ (♦x)<br />

{s|a ∈L(s)}<br />

[♦] pre R ∃ (States µ(x)<br />

} {{ } )<br />

States µ (a ∨ ♦x)<br />

[∨] States µ (a) ∪ States µ (♦x)<br />

{s|a ∈L(s)} [♦] pre R ∃ (States µ(x))<br />

Für diese Blatt-Werte ergibt sich somit:<br />

[µx] Q 0 := Q 1 := ∅


207<br />

Q 1 := States µ (a ∨ ♦x)<br />

[∨] States µ (a) ∪ States µ (♦x)<br />

{<br />

{s 0,s 1,s 4}<br />

}} {<br />

{s|a ∈L(s)} [♦] pre R ∃ (States µ (x)<br />

} {{ } )<br />

States µ (a ∨ ♦x)<br />

[∨] States µ (a) ∪ States µ (♦x)<br />

{s|a ∈L(s)}<br />

} {{ }<br />

[♦] pre R ∃ (States µ(x))<br />

{s 0,s 1,s 3}<br />

Nach dieser ersten Iteration sieht der Ausgangszustand für die zweite nun folgendermaßen<br />

aus:<br />

[µx] Q 0 := Q 1 := {s 0 ,s 1 ,s 3 ,s 4 }<br />

L := L Q1<br />

x<br />

Q 1 := States µ (a ∨ ♦x)<br />

[∨] States µ (a) ∪ States µ (♦x)<br />

{ }} {<br />

{s|a ∈L(s)} [♦] pre R ∃ (States µ (x)<br />

} {{ } )<br />

States µ (a ∨ ♦x)<br />

[∨] States µ (a) ∪ States µ (♦x)<br />

{s|a ∈L(s)}<br />

} {{ }<br />

[♦] pre R ∃ (States µ(x))<br />

Wenn auch diese zweite Iteration beendet ist, ergibt sich:<br />

[µx] Q 0 := Q 1 := {s 0 ,s 1 ,s 3 ,s 4 }<br />

L := L Q1<br />

x<br />

Q 1 := States µ (a ∨ ♦x)<br />

[∨] States µ (a) ∪ States µ (♦x)<br />

{<br />

{s 0,s 1,s 3,s 4}<br />

}} {<br />

{s|a ∈L(s)} [♦] pre R ∃ (States µ (x)<br />

} {{ } )<br />

States µ (a ∨ ♦x)<br />

[∨] States µ (a) ∪ States µ (♦x)<br />

{s|a ∈L(s)}<br />

} {{ }<br />

{s 0,s 1,s 3,s 4}<br />

[♦] pre R ∃ (States µ(x))<br />

Wie zu erkennen ist, sind nach dieser Iteration die Mengen Q 1 und Q 0 ({s 0 ,s 1 ,s 3 ,s 4 })<br />

identisch. Damit ist die Abbruchbedingung für die Fixpunktiteration erfüllt und<br />

der Fixpunkt wurde gefunden. Bei genauerer Betrachtung von Abbildung 8 ist<br />

auch ersichtlich, dass diese vier Zustände exakt die Zustände sind, von denen<br />

aus mindestens ein Zustand, in dem a gilt, erreichbar ist.<br />

4.2 Lokale Modellprüfung<br />

An dem eben gezeigten Ablauf wird klar, dass es sich bei globaler Modellprüfung<br />

um eine bottom–up Arbeitsweise handelt. Erst wird die Formel bis zu den atomaren<br />

Einheiten (den Variablen) aufgespalten, danach werden – angefangen von


208<br />

den Blättern (den zu den Variablen zugehörigen Zustandsmengen) – diese wieder,<br />

im Syntaxbaum aufsteigend, zusammengefügt.<br />

Bei lokaler Modellprüfung wird hingegen nach dem top–down–Prinzip vorgegangen.<br />

Dies ist möglich, weil sich die grundlegende Anforderung an eine lokale<br />

Modellprüfung von der an eine Globale unterscheidet. Anstatt der Frage nachzukommen,<br />

in welchen Zuständen die gegebene Formel erfüllt ist, wird die Formel<br />

auf einen bestimmten Zustand, bzw. eine bestimmte Zustandsmenge begrenzt.<br />

Das heißt im Klartext, dass die lokale Modellprüfung die Frage<br />

Wird die gegebene Formel ϕ in der gegebenen Zustandsmenge Z ⊆S<br />

erfüllt?<br />

beantwortet. Es muss jetzt also nicht mehr zwingend notwendig sein, alle Zustände<br />

im Zustandsraum zu betrachten. Eventuell reicht auch eine echte Teilmenge aus,<br />

um diese Frage zu beantworten.<br />

Genau an dieser Stelle offenbart sich der Vorteil der lokalen Modellprüfung.<br />

Da der Syntaxbaum top–down durchlaufen wird, kann es sein, dass komplette<br />

Teilbäume überhaupt nicht zur Problemlösung betrachtet werden müssen (lazy<br />

evaluation).<br />

Ein weiterer Vorteil – neben der Zeitersparnis durch den geringeren Rechenaufwand<br />

– ergibt sich bei <strong>Systeme</strong>n mit unendlichen Zustandsräumen. Durch<br />

die bedarfsmäßige Auswertung der Subformeln kann es sein, dass die unendliche<br />

Menge von Zuständen auf eine ausreichende endliche Menge begrenzt wird.<br />

Der für die Prüfung benötigte Syntaxbaum wird auch als ”Proof–Tree“ bezeichnet.<br />

Dieser entsteht durch syntaxorientierte Dekompositionsregeln. Auch<br />

hier sollen wieder Kripke-Strukturen und µ–Kalkül–Formeln für die grundlegende<br />

Beschreibung dienen. Die Reduktionsregeln für lokale Modellprüfung von<br />

µ–Kalkül–Formeln lauten:<br />

s ⊢ Φ ϕ ∧ ψ<br />

(1)<br />

s ⊢ Φ ϕ s ⊢ Φ ψ ∧ (2) s ⊢ Φ ϕ ∨ ψ<br />

s ⊢ Φ ϕ s ⊢ Φ ψ ∨<br />

s ⊢ Φ □ϕ<br />

(3)<br />

s 1 ⊢ Φ ϕ...s n ⊢ Φ ϕ ∧ (4) s ⊢ Φ ♦ϕ<br />

s 1 ⊢ Φ ϕ...s n ⊢ Φ ϕ ∨<br />

← ←<br />

s ⊢ Φ □ϕ<br />

(5)<br />

s ′ 1 ⊢ Φ ϕ...s ′ n ⊢ Φ ϕ ∧ (6) s ⊢ Φ ♦ ϕ<br />

s ′ 1 ⊢ Φ ϕ...s ′ n ⊢ Φ ϕ ∨<br />

(7) s ⊢ Φ µx.ϕ<br />

s ⊢ Φ ϕ<br />

s ⊢ Φ x<br />

(9)<br />

s ⊢ Φ D Φ (x)<br />

(8) s ⊢ Φ νx.ϕ<br />

s ⊢ Φ ϕ<br />

Abbildung 9. Reduktionsregeln für lokale Modellprüfung im µ–Kalkül


209<br />

D Φ (x) bezeichnet dabei die Subformel σx.ϕ von Φ bei der x gebunden wird. Zu<br />

lesen sind die Regeln wie folgt:<br />

s ⊢ Φ ϕ ∨ ψ<br />

s ⊢ Φ ϕ s ⊢ Φ ψ ∨<br />

bedeutet, dass in Zustand s in der Umgebung Φ (dazu später) geprüft werden<br />

soll, ob ϕ ∨ ψ gilt. Dieser Knoten wird in die Teilbäume<br />

– Prüfe, ob in Zustand s in der Umgebung Φϕgilt.<br />

– Prüfe, ob in Zustand s in der Umgebung Φψgilt.<br />

aufgespalten, welche im Originalknoten mit ODER (∨) verknüpft werden. An dieser<br />

Stelle besteht zum Beispiel die Möglichkeit, dass nur ein Teilbaum ausgewertet<br />

werden muss. Sollte der zuerst Ausgewertete bereits wahr als Rückgabewert<br />

liefern, dann kann der andere Teilbaum dieses Ergebnis nicht mehr beeinflussen.<br />

Gleiches gilt natürlich auch bei der UND–Verknüpfung – sollte ein Teilbaum<br />

falsch zurückliefern, kann die Auswertung des Knotens abgebrochen werden, da<br />

nur noch falsch als Ergebnis in Frage kommt.<br />

Dies kann sich insbesondere bei den modalen Operatoren (♦, □, ← ♦ , ← □) sehr<br />

effizienzsteigernd auswirken, da bei diesen Operatoren die Subformel für alle<br />

direkten Nachfolger, bzw. Vorgänger ausgewertet werden muss. Anschaulich gesprochen:<br />

Bei einem modalen Operator entstehen an diesem Knoten genausoviele<br />

Äste, wie der aktuelle Zustand Nachfolger/Vorgänger hat und durch lazy evaluation<br />

könnte es sein, dass schon die Auswertung des ersten Zweiges genügt,<br />

um den Knoten abschließen zu können.<br />

Als Beispiel diene wieder die Kripke-Struktur aus Abbildung 8. Diesmal soll<br />

die Formel<br />

νy.♦[µx.(y ∧ a) ∨ ♦x] K<br />

geprüft werden, aber nicht auf allen Zuständen, sondern nur im Zustand s 0 . Die<br />

Bedeutung der Formel lässt sich durch Lesen von innen nach außen erschließen:<br />

µx.a ∨ ♦x: Existiert ein ausgehender Pfad, auf welchem irgendwann einmal a<br />

gelten kann?<br />

νy.♦z: Gilt z immer (größter Fixpunkt) in einem beliebigen direkten Nachfolgezustand?<br />

Zusammen ergibt sich also: ”Gibt es einen Pfad, auf dem unendlich oft a vorkommt?“<br />

Daraus ergibt sich nun folgendes Tableau:


210<br />

0:(s 0 ,νy.♦[µx.(y ∧ a) ∨ ♦x]) ⊢<br />

<br />

1:(s 0 , ♦[µx.(y ∧ a) ∨ ♦x]) ⊢<br />

<br />

2:(s 1 , µx.(y ∧ a) ∨ ♦x) ⊢<br />

:(s 3 , µx.(y ∧ a) ∨ ♦x) ⊢<br />

<br />

3:(s 1 ,y∧ a ∨ ♦x) ⊢<br />

<br />

4:(s 1 ,y∧ a) ⊢<br />

:(s 1 , ♦x) ⊢<br />

<br />

<br />

5:(s 1 ,y) ⊢<br />

12 : (s 1 ,a) ⊢<br />

<br />

6:(s 1 , ♦[µx.(y ∧ a) ∨ ♦x]) ⊢<br />

<br />

7:(s 0 , µx.(y ∧ a) ∨ ♦x) ⊢ :(s 2 , µx.(y ∧ a) ∨ ♦x) ⊢<br />

<br />

8:(s 0 , (y ∧ a) ∨ ♦x) ⊢<br />

<br />

<br />

9:(s 0 ,y∧ a) ⊢<br />

:(s 0 , ♦x) ⊢<br />

<br />

<br />

10 : (s 0 ,y) ⊢ 11 : (s 0 ,a) ⊢<br />

Abbildung 10. Proof–Tree für Beispiel zur lokalen Modellprüfung


211<br />

Im Knoten 0 beginnt die Auswertung der Gesamtformel auf der gegebenen<br />

Prüfmenge. Durch Anwendung von Regel 8 gelangt man zu Knoten 1. In diesem<br />

Knoten ist der am schwächsten bindende Operator der ♦–Operator, daher<br />

findet Regel 3 Anwendung. Es ergeben sich also (da der Zustand s 0 exakt zwei<br />

unmittelbare Nachfolgezustände besitzt) zwei Äste. Der Rechte ist nur ”zur Erinnerung“<br />

angedeutet, wird aber zunächst noch nicht betreten.<br />

Die Verarbeitung erreicht zunächst den Knoten 2. Hier wird Regel 7 angewendet,<br />

da es sich um einen kleinsten Fixpunkt handelt. Diese fortlaufende<br />

Anwendung der Regeln zieht sich fort, bis zum Erreichen des Knotens 9, wo<br />

nochmals Regel 2 verwendet wird. Jetzt befindet sich der Modellprüfer in Knoten<br />

10, welcher denselben Inhalt hat, wie Knoten 1. (Genauer käme noch ein<br />

weiterer Knoten unter Nr. 10, welcher durch Anwendung von Regel 9 entstanden<br />

wäre und dann auch syntaktisch den Inhalt von Knoten 1 hätte.)<br />

Aufgrund der Sichtbarkeitseigenschaften von Knoten 1 und Knoten 10 (liegen<br />

in der gleichen Ebene), kann eine Schleife zu Knoten 1 gezogen werden, anstatt<br />

dass der Fixpunkt erneut entrollt werden muss. Bei der Schleifenbildung gilt:<br />

– Ist die Schleife ein größster Fixpunkt (νx), so wird wahr zurückgegeben.<br />

– Ist die Schleife ein kleinster Fixpunkt (µx), so wird falsch zurückgegeben.<br />

In diesem Fall ist der Rückgabewert also wahr und die Bearbeitung geht weiter<br />

in Knoten 11. Dort ist die Frage, ob in s 0 a gilt, was der Fall ist. Deshalb ist<br />

auch dieser Knoten wahr.<br />

Aus 10 und 11 wahr ergibt sich, dass auch Knoten 9 wahr ist. Da Knoten<br />

8 eine ODER–Verknüpfung aus den Teilbäumen ist, reicht der Wert wahr von<br />

Knoten 9 aus, um ihn zu erfüllen. Der rechte Teilbaum muss also überhaupt<br />

nicht mehr betrachtet werden. Diese bottom–up–Auswertung wird solange fortgeführt,<br />

bis der Wurzelknoten erreicht, und dessen Wert ebenfalls bekannt ist.<br />

Das endgültige Tableau ergibt sich dann zu:


212<br />

0:(s 0 ,νy.♦[µx.(y ∧ a) ∨ ♦x]) ⊢ 1<br />

<br />

1:(s 0 , ♦[µx.(y ∧ a) ∨ ♦x]) ⊢ 1<br />

<br />

2:(s 1 , µx.(y ∧ a) ∨ ♦x) ⊢ 1<br />

:(s 3 , µx.(y ∧ a) ∨ ♦x) ⊢<br />

<br />

3:(s 1 ,y∧ a ∨ ♦x) ⊢ 1<br />

<br />

4:(s 1 ,y∧ a) ⊢ 1<br />

:(s 1 , ♦x) ⊢<br />

<br />

<br />

5:(s 1 ,y) ⊢ 1<br />

12 : (s 1 ,a) ⊢ 1<br />

<br />

6:(s 1 , ♦[µx.(y ∧ a) ∨ ♦x]) ⊢ 1<br />

<br />

7:(s 0 , µx.(y ∧ a) ∨ ♦x) ⊢ 1 :(s 2 , µx.(y ∧ a) ∨ ♦x) ⊢<br />

<br />

8:(s 0 , (y ∧ a) ∨ ♦x) ⊢ 1<br />

<br />

<br />

9:(s 0 ,y∧ a) ⊢ 1<br />

:(s 0 , ♦x) ⊢<br />

<br />

<br />

10 : (s 0 ,y) ⊢ 1 11 : (s 0 ,a) ⊢ 1<br />

Abbildung 11. Proof–Tree für Beispiel zur lokalen Modellprüfung


213<br />

Es konnten in diesem Beispiel also insgesamt vier Teilbäume, welche selbst<br />

wiederum neue Teilbäume hätten hervorbringen können, von der Berechnung<br />

ausgeschlossen werden. Weiterhin wurden die Zustände s 4 und s 5 überhaupt<br />

nicht besucht.<br />

Schleifenbildung und Rang<br />

Wie im Proof–Tree bereits angesprochen, können Knoten mit gleichem Inhalt<br />

verbunden werden, wenn sie sich in demselben Sichbarkeitsbereich befinden. Weiter<br />

oben wurde bereits gesagt, dass beim wiederholten Erreichen eines Knoten<br />

(s x , σx.ϕ) abhängig von der Fixpunktart 0 oder 1 zurückgegeben wird. Um zu<br />

erklären, warum dies korrekt ist, seien folgende Mengen<br />

iter 0 (σx.ϕ), iter 1 (σx.ϕ),...,iter n (σx.ϕ) für σ ∈{µ, ν}<br />

die bei der Fixpunktiteration Auftretenden. Wenn es sich hierbei um einen kleinsten<br />

Fixpunkt (σ = µ) handelt, gilt:<br />

s ∈ µx.ϕ K ⇒∃n ∈ N.s ∈ iter n (µx.ϕ) K<br />

In Worten: Sollte s in der Menge des Fixpunktes liegen, dann muss es eine<br />

bestimmte Zahl n geben, die für die n–te Iteration steht, in welcher s sich in<br />

der Menge befindet. Dies muss gelten, da bei der Iteration für einen kleinsten<br />

Fixpunkt mit der leeren Menge begonnen wird.<br />

Aufgrund der Monotonie der Fixpunktiteration muss es also ein kleinstes<br />

n geben, welches diese Eigenschaft erfüllt (d.h. dieses n ist die Nummer der<br />

Iteration, in welcher s in die Fixpunktmenge aufgenommen wird). Dies bietet<br />

die Möglichkeit, jedem Zustand (bei einer fest gegebenen Fixpunktformel) einen<br />

Wert – seinen Rang – zuzuweisen.<br />

Dieser zum Zustand s i zugehörige Rang für die Formel σx.ϕ lässt sich somit<br />

bestimmen durch:<br />

{<br />

0 ,s /∈ µx.ϕ K<br />

rank(s i , µx.ϕ) :=<br />

n ,∀x ∈ N.s ∈ iter x (µx.ϕ) → n ≤ x<br />

{<br />

0 ,s∈ νx.ϕ K<br />

rank(s i , νx.ϕ) :=<br />

n ,∀x ∈ N.s /∈ iter x (νx.ϕ) → n ≤ x<br />

Dadurch ist es möglich, die Zustände in eine Ordnung zueinander zu setzen. Sie<br />

werden ihrem Rang nach geordnet. Bei einem kleinsten Fixpunkt werden zum<br />

Beispiel der Reihe nach Zustände vom Rang 1, dann Zustände vom Rang 2, usw.<br />

hinzugefügt (bei einem größten Fixpunkt werden die Zustände dem Rang nach<br />

aus der Menge entfernt).<br />

Zustände, die in einem größten Fixpunkt liegen, haben damit den Rang 0.<br />

Genauso wie Zustände, die nicht in einem kleinsten Fixpunkt liegen.


214<br />

Eine sich daraus ergebende wichtige Eigenschaft ist:<br />

Kleinste Fixpunkte entsprechen terminierender Rekursion (bzw. endlichen<br />

Schleifen), während größte Fixpunkte unendlicher Rekursion (bzw.<br />

unendlichen Schleifen) entsprechen.<br />

BDD-basierte Lokale Modellprüfung<br />

Da [RO]BDDs eine so effiziente wie kompakte Darstellung von Zustandsmengen<br />

ermöglichen, stellt sich die Frage, ob nicht auch ein lokales Modellprüfungsverfahren<br />

davon profitieren könnte. Bei globalen Verfahren werden BDDs schließlich<br />

schon längere Zeit erfolgreich eingesetzt.<br />

Zunächst möchte man die Standardfrage, ob eine Formel für einen bestimmten<br />

Zustand gilt, erweitern auf eine Zustandsmenge. Es soll also nun geprüft<br />

werden, ob die Formel für mehrere bestimmt Zustände gilt. Der erste Ansatz ist<br />

natürlich, diese Zustandsmenge zunächst ebenfalls als BDD darzustellen. Dabei<br />

stellt sich die Frage, ob dies durch Verundung der Label eines Zustandes und<br />

dann durch Veroderung der Zustände geschehen soll, oder ob – wie auch bei der<br />

Darstellung des Zustandsraumes – die Zustände durch ihre ausgehenden Kanten<br />

beschrieben werden sollen.<br />

Beschließen wir also, zunächst einen Zustand in dieser ”Arbeitsmenge“ ausschließlich<br />

durch seine Belabelung zu repräsentieren. Jetzt soll auf der aus Abbildung<br />

8 bekannten Kripke-Struktur (die jetzt als BDD repräsentiert sei) die<br />

Formel<br />

µx.a ∨ ♦x K<br />

geprüft werden. (Dies ist dieselbe Formel, wie im Beispiel zur globalen Modellprüfung.)<br />

Die Zustandsmenge, auf der die Formel ausgewertet werden soll, sei {s 1 ,s 4 }.<br />

Zunächst erstellen wir intuitiv einen Proof-Tree für das Problem. Dieser sieht<br />

folgendermaßen aus:


215<br />

0:({s 1 ,s 4 }, µx.a ∨ ♦x) ⊢<br />

<br />

1:({s 1 ,s 4 },a∨ ♦x) ⊢<br />

<br />

2:({s 1 ,s 4 },a) ⊢ 0 3:({s 1 ,s 4 }, ♦x) ⊢<br />

<br />

4:({s 0 ,s 2 ,s 3 }, µx.a ∨ ♦x) ⊢<br />

<br />

5:({s 0 ,s 2 ,s 3 },a∨ ♦x) ⊢<br />

<br />

6:({s 0 ,s 2 ,s 3 },a) ⊢ 0<br />

7:({s 0 ,s 2 ,s 3 }, ♦x) ⊢<br />

<br />

8:({s 1 ,s 3 ,s 4 ,s 5 }, µx.a ∨ ♦x) ⊢<br />

<br />

9:({s 1 ,s 3 ,s 4 ,s 5 },a∨ ♦x) ⊢<br />

<br />

10 : ({s 1 ,s 3 ,s 4 ,s 5 },a) ⊢ 0 11:({s 1 ,s 3 ,s 4 ,s 5 }, ♦x) ⊢<br />

<br />

:({s 0 ,s 2 ,s 3 ,s 4 },x) ⊢<br />

<br />

:({s 1 ,s 3 ,s 4 ,s 5 },x) ⊢<br />

Abbildung 12. Proof–Tree für Beispiel zur lokalen Modellprüfung


216<br />

In Knoten 1 kann der Baum wie gewöhnlich mit zwei Ästen fortgeführt werden.<br />

Jeder Ast bekommt eine Kopie der Arbeitsmenge ({s 1 ,s 4 }) und die Auswertung<br />

kommt zu Knoten 2. Wertet man hier die Frage, ob a gilt, durch UND–<br />

Verknüpfen der Arbeitsmenge mit a aus, so besagt die Antwort lediglich, ob a<br />

in mindestens einem Zustand der Arbeitsmenge erfüllt ist.<br />

In Knoten 3 gilt es die unmittelbaren Nachfolger von {s 1 ,s 4 } zu bestimmen.<br />

Eine einfache UND–Verknüpfung der Arbeitsmenge mit dem Zustandsraum führt<br />

zu der Kantenmenge, welche aus den Zuständen s 1 und s 4 hinausführen. In<br />

dieser aussagenlogischen Formel müssten dann alle x i entfallen und die x ′ i in x i<br />

umbenannt werden. Damit hat man die gewünschte Nachfolgermenge.<br />

Spätestens an diesem Punkt treten einige Probleme auf. Zum Beispiel ist<br />

die Erkennung von Schleifen beim Ausrollen von Fixpunkten nicht mehr so einfach<br />

zu bewerkstelligen, wie dies bei nur einem Zustand der Fall ist. Die erste<br />

Frage ist überhaupt nach der grundsätzlichen Arbeitsweise eines lokalen Modellprüfers,<br />

der auf mehreren Zuständen gleichzeitig arbeitet. Folgende Varianten<br />

wären denkbar:<br />

Sei M(s) ein lokaler Modellprüfer, welcher auf nur einem Zustand s arbeitet<br />

und M ′ (S) ein Lokaler, welcher auf der Zustandsmenge S arbeitet.<br />

– Der Modellprüfer M ′ arbeitet auf einer Menge {x 1 , ..., x n } mit folgendem<br />

Resultat: ∧ i∈{1,...,n} M(x i)=M ′ ({x 1 , ..., x n })<br />

Sagt also nur aus, ob die Formel in wirklich jedem Zustand gilt.<br />

– M ′ ({x 1 , ..., x n }) liefert als Rückgabewert eine Menge T ⊆{x 1 , ..., x n }, wobei<br />

die Formel für alle Zustände aus dieser Menge erfüllt ist.<br />

Es ist also neben der Wahl der Funktionalität noch einiges mehr zu beachten.<br />

Zum Beispiel in welcher Art und Weise die Arbeitsmenge nun repräsentiert<br />

werden soll – als Transitionen, oder durch ihre Label?<br />

5 Fazit<br />

Es gibt viele unterschiedliche Ansätze und Anwendungsgebiete für Modellprüfungsalgorithmen.<br />

Verfahren, welche die <strong>Verifikation</strong> durch symbolische Auswertung<br />

von µ–Kalkül–Formeln durchführen, sind verhältnismäßig einfach zu erstellen.<br />

Ein Nachteil der µ–Kalkül–Formeln ist die schwere Lesbarkeit. Einerseits ist<br />

es noch gut möglich für kleinere Aussagen solche Formeln zu formulieren, allerdings<br />

sind diese schon vom entgegengesetzten Standpunkt (Formel sehen und<br />

Verstehen) recht schwer zugänglich.<br />

Bei in der Praxis befindlichen Tools wird deshalb meist auf andere Logiken,<br />

welche leichter verständlich sind, zurückgegriffen. Der Vorteil der µ–Kalkül–<br />

Formeln ist die Möglichkeit zur Beschreibung von touring–vollständigen Problemen,<br />

d.h. das µ–Kalkül gehört zur mächtigsten Sprachklasse überhaupt. Es<br />

lassen sich viele Formalismen in das µ–Kalkül einbetten (z.B. Hoare–Logiken,<br />

temporale Logiken, ω-Automaten, etc.). Aus diesem Grund, und aus der guten


217<br />

maschinellen Verarbeitbarkeit, führen viele Programm die Eingaben in anderen<br />

Logiken intern wieder auf µ–Kalkül–Formeln zurück, auf welchen dann die<br />

eigentliche Auswertung/Berechnung stattfindet. Es gibt somit ein breites Anwendungsspektrum<br />

für µ–Kalkül–basierte Modellprüfung.<br />

[RO]BDD–basierte Modellprüfung könnte eine sehr gute Alternative zu bisherigen<br />

symbolischen Modellprüfungsverfahren, die lokal arbeiten, darstellen.<br />

Entscheidend für den Erfolg dieser Ansätze ist sicherlich die Möglichkeit und<br />

der Aufwand der Weitergabe von Arbeitsmengen und bereits berechneten Ergebnissen<br />

im Tableau. Während normale UND/ODER–Verzweigungen noch relativ<br />

einfach zu bewerkstelligen sind, ist der Schwierigkeitsgrad bei der Implementierung<br />

der Schleifenerkennung wesentlich höher. Sollte für diese Problematik ein<br />

effektiver Ansatz gefunden werden, könnte dies als ein entscheidender Vorteil für<br />

lokale Modellprüfung gegenüber Globaler herauskristallisieren.<br />

6 Literatur<br />

[HeAn94] Henrik Reif Anderson: On Model Checking Infinite–State Systems, Paper.<br />

[VRS03] K. Schneider: Skript <strong>Verifikation</strong> <strong>reaktiver</strong> <strong>Systeme</strong>, aus dem Jahr 2003.<br />

[Stir91] C. Stirling, D. Walker: Local model checking in the modal mu-calculus,<br />

Paper aus dem Jahr 1991.<br />

[ScSc04] T. Schuele, K. Schneider: Global vs. Local Model Checking of Infinite<br />

State Systems, Paper aus dem Jahr 2004.<br />

[Brya92] R. F. Bryant: Symbolic Boolean Manipulation with Ordered Binary<br />

Decision Diagrams, Paper aus dem Jahr 1992.<br />

[ArBi97] A. Biere: Effiziente Modellprüfung des µ-Kalküls mit binären Entschei–<br />

dungsdiagrammen, Dissertation aus dem Jahr 1997.<br />

[KuKu98] J. Kukula, T. Shiple, und A. Aziz.: Techniques for implicit state<br />

enumeration of EFSMs., Paper aus dem Jahr 1998.<br />

[LoIn03] M. Kegelmann: Skript Logik für Informatik, aus dem Jahr 2003,<br />

TU-Darmstadt.<br />

[ShSo03] N. Shankar, M. Sorea: Counterexample–Driven Model Checking,<br />

CS-Lab. Menlo Park, CA, aus dem Jahr 2003.<br />

[Yang99] B. Yang: Optimizing Model Checking Based on BDD Characterization,<br />

Dissertation aus dem Jahr 1999.


218<br />

Using Theorem Proving<br />

to Verify Arithmetic Hardware<br />

Jens Brandt<br />

Fachbereich Informatik<br />

Technische Universität <strong>Kaiserslautern</strong><br />

brandt@informatik.uni-kl.de<br />

Abstract. Computer systems are becoming more and more complex,<br />

and the task of making sure that they work correctly is getting increasingly<br />

difficult. In the past, solely simulation was used to expose bugs.<br />

Today’s hardware development processes usually include formal verification<br />

to complement testing. But some problems are too complex for<br />

traditional formal techniques in hardware verification – equivalence and<br />

model checking – especially those with large regular structures found in<br />

arithmetic circuits. Theorem provers are an alternative to reason about<br />

arithmetic components by exploiting structure and hierarchy. After an<br />

introduction to the HOL therom proving environment, some examples<br />

are presented that illustrate the advantages of this method.<br />

1 Introduction<br />

As computer systems are becoming more and more complex, the task of making<br />

sure that they work correctly is getting increasingly difficult. Besides that, the<br />

consequences of failure are becoming more serious, too. Meanwhile, computer<br />

systems are used in many safety-critical areas where errors cannot be tolerated.<br />

Even in non safety-critical areas, e.g. the home user PC, hardware errors can<br />

cause an expensive recall process: Intel lost approximately 450 million dollars<br />

ten years ago in 1994 due to the well-known Pentium bug (causing potentially<br />

wrong results of floating-point division).<br />

In the past, solely simulation and testing were used to expose bugs. Today’s<br />

hardware development processes usually includes formal verification to complement<br />

testing. Various methods have been researched and applied in industry,<br />

including equivalence checking, model checking and theorem proving. Equivalence<br />

and model checking have already proven to be adequate for automatically<br />

verifying a variety of large-style industrial designs. But, for equivalence or model<br />

checking, some problems are too complex, especially those related to arithmetic<br />

circuits. The methods can hardly exploit the regular structures of most arithmetic<br />

components. Even worse, BDD representations of some components like<br />

multipliers have got an exponential size, making it (almost) impossible to verify<br />

real-world problems. Theorem provers can be used in these cases, because they<br />

(or their users) are aware of the structure and hierarchy, making it possible to<br />

decompose the proof obligations. Moreover, correctness proofs may depend on


219<br />

many classical mathematical theorems and therefore require a certain body of<br />

mathematical concepts. Thus, there is a need for semi-automated theorem proving<br />

systems that allows the statement and verification of correctness properties<br />

at higher levels of abstraction.<br />

Theorem proving has shown to be a powerful method in this area. But it<br />

is not the magic bullet: Users must spend a lot of time to guide the prove<br />

process. Automation of this work is still a complex task with a lot of work to<br />

be done. Even reasoning about finite state machine logic is tedious in a theorem<br />

proving environments, since theorem provers are not good at reasoning about<br />

large amounts of random logic.<br />

To combine the advantages of the various formal methods, various research<br />

groups (both at universities and in industry) work on a tight integration between<br />

semi-automated theorem proving and other property verification tools.<br />

This approach seems to be the most promising to push back the boundaries on<br />

the today’s application of formal methods. Hardware verification is the largest<br />

industrial application of automated theorem proving: AMD, IBM, and Intel are<br />

among the companies that employ automated theorem proving technology for<br />

verification.<br />

The rest of this article is organised as follows: Section 2 introduces the HOL<br />

system and its foundations. In section 3, three examples are presented: The first<br />

one is a simple parity checker demonstrates basic techniques to verify hardware<br />

components with a theorem proover. The second one shows the proof of a basic<br />

arithmetic algorithm used in hardware designs, the binary greatest common<br />

divisor algorithm. The last example illustrates the definition of new types, a<br />

basic concept of extending and building new theories. In Section 4 finally, some<br />

conclusions are drawn.<br />

2 The HOL System<br />

2.1 Overview<br />

HOL4 is the lastest version of the HOL automated proof system for higher order<br />

logic. It provides an environment with an expressive notation for writing system<br />

specifications and powerful facilities for creating formal proofs of properties of<br />

specifications. It features built-in decision procedures that automate some lowlevel<br />

details of proofs. But one of its most important properties is its rigorous<br />

and well-understood theoretical basis that allows users to extend the system<br />

without compromising security (due to Robin Milner’s LCF approach). The HOL<br />

system is built on top of Moscow ML, a light-weight implementation of the strict<br />

functional language of Standard ML (SML). It has been used in many areas,<br />

including the definition of HDL semantics (e.g. VHDL, Verilog), hardware design<br />

and verification, reasoning about security, reasoning about real-time systems and<br />

software verification.<br />

The HOL system comes with an extensive library containing hundreds of predefined<br />

types, functions, tactics and proved theorems. For verifying arithmetic


220<br />

properties, there is e.g. a theory of bit vector machine arithmetic. It defines a lot<br />

of the integer operations found in computer architectures, including addition,<br />

multiplication, two’s complement and rotation. Moreover, the HOL system allows<br />

the user to access external programs within the HOL system by an oracle<br />

mechanism. In this way, SAT (e.g. SATO, GRASP and ZCHAFF) and BDD<br />

engines can be used in proofs.<br />

The HOL system is well documented[4, 6, 3]. After having learned some HOL<br />

basics and got used to the system (which takes some weeks), the documentation<br />

provides a lot of useful information for further work. A lot of material in this<br />

article has been borrowed from there.<br />

2.2 Foundations<br />

The following paragraphs present the logic supported by the HOL system. Introducing<br />

only the some basic concepts, they are a summary of the HOL description<br />

which presents the logic extensively.<br />

Types The HOL logic is based on Church’s simple theory of types[2]. It contains<br />

syntactic categories of types and terms whose elements denote respectively certain<br />

sets and elements of sets. These are taken from a fixed set of sets U, the<br />

universe, that has the following properties.<br />

– Inhab: Each element of U is a non-empty set<br />

– Sub: IfX ∈U and ¬Y ⊆ X, thenY ∈ U<br />

– Prod: IfX ∈Uand Y ∈U,thenX × Y ∈U. X × Y is the cartesian product,<br />

a set that consists of ordered pairs (x, y) withx ∈ X and y ∈ Y<br />

– Pow: IfX ∈U,thenthepowersetP(X) ={Y : Y ⊆ X} is also in U<br />

– Infty: U contains a distinguished infinite set I.<br />

– Choice Thereisadistinguishedelementch ∈ Π X∈U X. The elements of the<br />

product Π X∈U X are (dependently) typed functions: thus, for all X ∈ U, X<br />

is non-empty by Inhab and ch(X) ∈ X witnesses this.<br />

From these properties, it follows:<br />

– Fun: The universe contains the set of functions X → Y ∈U (if X ∈U and<br />

Y ∈U.<br />

– Bool: There is a distinguished two-element set B = {0, 1}.<br />

The types of the HOL logic represent sets in the universe U. Therearefourkinds<br />

of types:<br />

– Atomic types: These denote fixed sets in the universe. Each theory determines<br />

a particular collection of atomic types for example, the standard<br />

atomic types B and I denote, respectively the distinguished two-element<br />

set 2 and the distinguished infinite set I.


221<br />

– Compound types: Ifσ 1 ,...σ n are types, (σ 1 ,...,σ n )op is a type denoting the<br />

set resulting from the application of op to set sets σ 1 ,...,σ n . For example,<br />

prod is the type operator of arity 2 which denotes the cartesian product<br />

operation. (σ 1 ,σ 2 )prod is usually written as σ 1 × σ 2 .<br />

– Function types: Ifσ 1 and σ 2 are types, then σ 1 → σ 2 is the function type<br />

with domain σ 1 and range σ 2 . It denotes the set of total functions from the<br />

set denoted by its domain to the set denoted by its range. Syntactically,<br />

→ is simply a distinguished type operator. As it always denotes the same<br />

operation in any model of the HOL theory, it is singled out in the definition<br />

of HOL types.<br />

– Type variables: They stand for arbitrary sets in the universe.<br />

Terms The terms in the HOL logic are expressions that denote elements of the<br />

sets denoted by types. Thus, each term is associated with a unique type which<br />

will be expressed by t σ . (The type subscript may be omitted if it is clear from<br />

the context.) As the definition of types in HOL is relative to a particular type<br />

structure Ω, the formal definition of terms is relative to a given collection of<br />

typed constants over Ω. A signature over Ω is just a set Σ Ω of such constants.<br />

The set Terms ΣΩ of terms over Σ Ω is defined to be the smallest set closed under<br />

the formation rules:<br />

– Constants: Aconstantc σ over Ω is a pair (c, σ) wherec ∈ Names and<br />

σ ∈ T ypes ω . (Assume that an infinite set Names of names is given.)<br />

– Variables: Ifx ∈ Names and σ ∈ Types Ω then the variable var x σ is a term<br />

over Σ Ω .<br />

– Lambda-abstractions: The lambda-abstraction (which denotes a function)<br />

λx σ .t σ2 σ 1 → σ2 is a term if var x σ1 ∈ Terms ΣΩ and t σ2 ∈ Terms ΣΩ .<br />

– Function applications:Ift σ′ →σ ∈ Terms ΣΩ and t‘ σ‘ ∈ Terms ΣΩ then t σ′ →σt‘ σ ′ σ ∈<br />

Terms.Anapplicationtt‘ denotes the result of applying the function denoted<br />

by t to the value denoted by t ′ .<br />

Standard structures A standard type structure Ω contains the atomic types B<br />

of boolean values and I of individuals. Logical formulas are then identified with<br />

terms of type bool. In addition, for being standard a signature must contain<br />

various logical constants with interpretation given by a standard model M:<br />

– Implication: ⇒ B→B→B represents the implication. M(⇒, B → B → B): b ⇒ b‘<br />

is 0, if b = 1 and b‘ =0; otherwise b ⇒ b‘ is1.<br />

– Equality: = α→α→B denotes equality on the set denoted by α. The intended<br />

interpretation M(=,α → α → B) is as follows: x = X x ′ is 1 if and only if<br />

x = x ′ ; otherwise it is 0.<br />

– Choice function: ɛ(α → B) → α is a choice function. M(ɛ, (α → B) →<br />

α) ∈ Π X∈U (X → B) → X is the function assigning to each X ∈ U the<br />

choice function sending f ∈ (X → B) toch X (f) =ch(f 1 1)iff 1 2=0ch(X)<br />

otherwise.


222<br />

Theories The HOL system is organised in theories. Each of them contains sets of<br />

types, constants, definitions and axioms and a list of theorems that are proven<br />

from the axioms and definitions. A theory is potentially expandable, and the<br />

HOL system ensures that only well-formed theories are constructed by allowing<br />

theorems to be created only by formal proof.<br />

Defining what it means to be a theorem leads to the description of the proof<br />

system of HOL. This is built with the help of the programming language ML,<br />

being the meta language in this sense. The deductive system of the HOL system<br />

is based on eight rules of inference that are as follows:<br />

– Assumption introduction:<br />

– Reflexivity:<br />

t ⊢ t<br />

⊢ t = t<br />

– Beta conversion: Lett 1 [t 2 /x] be the result of substituting t 2 for x in t 1 ,with<br />

suitable renaming of variables to prevent free variables in t 2 becoming bound<br />

after substitution.<br />

⊢ (λx. t 1 )t 2 = t 1 [t 2 /x]<br />

– Substitution: Lett[t 1 ,...,t n ] denote a term t with some free occurrences<br />

of subterms t 1 , ... , t n singled out, and let t[t ′ 1,...,t ′ n]denotetheresult<br />

of replacing each selected occurrence of t i by t ′ i (for 1≤i≤n), with suitable<br />

renaming of variables to prevent free variables in t ′ i becoming bound after<br />

substitution.<br />

Γ 1 ⊢ t 1 = t ′ 1 ··· Γ n ⊢ t n = t ′ n Γ ⊢ t[t 1 ,...,t n ]<br />

Γ 1 ∪···∪Γ n ∪ Γ ⊢ t[t ′ 1,...,t ′ n]<br />

– Abstraction: Letx be not free in Γ .<br />

Γ ⊢ t 1 = t 2<br />

Γ ⊢ (λx. t 1 )=(λx. t 2 )<br />

– Type instantiation: Lett[σ 1 ,...,σ n /α 1 ,...,α n ] be the result of substituting<br />

the types σ 1 , ..., σ n for type variables α 1 , ..., α n in t, and let none of the<br />

type variables α 1 , ... , α n occur in Γ , and no distinct variables in t become<br />

identified after the instantiation.<br />

– Discharging an assumption:<br />

Γ ⊢ t<br />

Γ ⊢ t[σ 1 ,...,σ n /α 1 ,...,α n ]<br />

Γ ⊢ t 2<br />

Γ −{t 1 } ⊢ t 1 ⇒ t 2


223<br />

– Modus ponens:<br />

Γ 1 ⊢ t 1 ⇒ t 2 Γ 2 ⊢ t 1<br />

Γ 1 ∪ Γ 2 ⊢ t 2<br />

The deductive system of HOL is shown to be sound for the set theoretic semantics<br />

of HOL described in the previous section. Each mechanism of it guarantees to<br />

preserve the property of possessing a model. Thus, theories built up from the<br />

initial HOL theory (which does possess a model) using these mechanisms are<br />

guaranteed to be consistent.<br />

HOL notation Standard notation Description<br />

Truth T ⊤ true<br />

Falsity F ⊥ false<br />

Negation ~t ¬t not t<br />

Disjunction t 1\/t 2 t 1 ∨ t 2 t 1 or t 2<br />

Conjunction t 1/\t 2 t 1 ∧ t 2 t 1 and t 2<br />

Implication t 1==>t 2 t 1 ⇒ t 2 t 1 implies t 2<br />

Equality t 1=t 2 t 1 = t 2 t 1 equals t 2<br />

∀-quantification !x.t ∀x. t for all x : t<br />

∃-quantification ?x.t ∃x. t for some x : t<br />

ε-term @x.t εx. t an x such that: t<br />

Table 1. Terms of the HOL Logic [6]<br />

The theory INIT is the initial theory of the HOL logic. It introduces the<br />

logical operators shown in Table 1 and contains the five axioms that the HOL<br />

system is based on.<br />

BOOL_CASES_AX |- !t. (t = T) \/ (t = F)<br />

IMP_ANTISYM_AX |- !t1 t2. (t1 ==> t2) ==> (t2 ==> t1) ==> (t1 = t2)<br />

ETA_AX<br />

|- !t. (\x. t x) = t<br />

SELECT_AX |- !P:’a->bool x. P x ==> P($@ P)<br />

INFINITY_AX |- ?f:ind->ind. ONE_ONE f /\ ~(ONTO f)<br />

where ONE_ONE and ONTO aredefinedasfollows<br />

ONE_ONE_DEF |- ONE_ONE f = (!x1 x2. (f x1 = f x2) ==> (x1 = x2))<br />

ONTO_DEF |- ONTO f = (!y. ?x. y = f x)<br />

In HOL, a formula is represented by a then ML type term whose HOL type<br />

is bool. It can be constructed by the given constructors. Unlike this, a theorem<br />

(ML type thm) does not have a primitive constructor function. In this way, the<br />

ML type asserts that theorems are not arbitrarily and unrecordedly constructed,<br />

compromising of the consistency of the logic.<br />

2.3 Usage<br />

As already stated in the introduction, the HOL system provides an environment<br />

for writing specifications and creating formal proofs of properties.


224<br />

Proofs For a logician, a formal proof is a sequence, each of whose elements<br />

is either an axiom or follows from earlier members of the sequence by a rule of<br />

inference. A theorem is the last element of a proof. In HOL (following LCF), this<br />

consists in applying ML functions representing rules of inference to axioms or<br />

previously generated theorems. Thus, every value of type thm in the HOL system<br />

can be obtained by repeatedly applying primitive inference rules to axioms. Some<br />

examples are:<br />

– Undischarging (UNDISCH):<br />

– Symmetry of equality (SMY):<br />

Γ ⊢ t 1 ⇒ t 2<br />

Γ, t 1 ⊢ t 2<br />

– Transitivity of equality (TRANS):<br />

Γ ⊢ t 1 = t 2<br />

Γ ⊢ t 2 = t 1<br />

Γ 1 ⊢ t 1 = t 2 Γ 2 ⊢ t 2 = t 3<br />

Γ 1 ∪ Γ 2 ⊢ t 1 = t 3<br />

One of the most important and most powerful inference rules is rewriting<br />

(REWRITE_RULE) which does a limited amount of automatic theorem-proving. It<br />

uses a list of equational theorems (Γ ⊢ t 1 = t 2 ) to replace any subterms of an<br />

object theorem that match t 1 by the corresponding instance of t 2 . Conditional<br />

and recursive rewriting is supported, too.<br />

Tactics A forward proof (the style that is described in the last paragraph) is<br />

quite unnatural and too low level for many applications (possibly consisting of<br />

millions of steps). In the early 1970s, Robin Milner invented the notion of tactics,<br />

which was an important advance in proof generating methodology. In short, a<br />

tactic is a function that does two things: it splits a goal into subgoals and keeps<br />

track of the reason why solving the subgoals will solve the goal. Consider, for<br />

example, the rule of ∧ introduction:<br />

Γ 1 ⊢ t 1 Γ 2 ⊢ t 2<br />

Γ 1 ∪ Γ 2 ⊢ t 1 ∧ t 2<br />

Suppose the goal is to prove A ∧ B. Thus, it is sufficient to prove A and B.<br />

The justification for the reduction of the goal A ∧ B to the two subgoals A and<br />

B is the rule of ∧-introduction. The specified HOL tactic CONJ_TAC is:<br />

t 1 /\ t 2<br />

t 1 t 2<br />

The following examples illustrates the use of tactics in the HOL system. A<br />

goal specified by g is reduced to two subgoals by applying the tactic CONJ_TAC.


225<br />

- g‘A /\ B‘;<br />

> val it =<br />

Proof manager status: 1 proof.<br />

1. Incomplete:<br />

Initial goal:<br />

A /\ B<br />

: proofs<br />

- e(CONJ_TAC);<br />

OK..<br />

2 subgoals:<br />

> val it =<br />

B<br />

A<br />

: goalstack<br />

Library The HOL system comes with a rich collection of theories containing<br />

predefined types, functions and tactics and already proven theorems. Figure<br />

1 shows the various theories along with their dependencies. All of them are<br />

derived from the initial theory containing the five axioms and the eight primitive<br />

inference rules stated above.<br />

To use a library, it must be loaded (load ẍyzTheory¨). For an easier access,<br />

its internal declarations can be made public by opening (open xyzTheory). New<br />

theories are created by new theory and contain all theorems that are stored with<br />

the store thm (oder some other storing) function.<br />

Defining new types Whereas defining new functions and carrying out proofs is<br />

quite intuitive, the definition of new types needs more explanation. New types<br />

are always derived from existing ones, i.e. to build a new type, existing type<br />

constants and operators are used to specify a representation type whose range is<br />

restricted possibly restricted to form the set of elements the new type contains.<br />

Figure 2 illustrates the construction: From the elements of a representation<br />

set R, a subset is chosen by a predicate P . The abstractions of those elements<br />

form the set of the new type A. Moreover, for each a ∈ A thereisarepresenting<br />

element r ∈ R.<br />

new_type_definition (tyop, |- ?x. t x)<br />

The ML function new type definition implements the primitive HOL rule<br />

of definition for introducing new type constants into the logic, tyop is the name<br />

of the new type, x is an element of the representation type and t is a predicate<br />

with domain of this type and range of booleans. The new_type_defintion function<br />

must be given a proof which shows that the type contains an element.<br />

Let’s consider the example of defining a type containing three elements (taken<br />

from [3]). This type can be derived from the type bool # bool (the product of<br />

two booleans). In order to get a type containing three elements (and not the


226<br />

Fig. 1. Theories of the HOL library with their dependencies<br />

four possible ones of the base type), a predicate restricting the range is given:<br />

λ(x, y).¬(x ∧ y).<br />

val tyax = new_type_definition ("three",<br />

Q.prove(‘?p. (\(x,y). ~(x /\ y)) p‘,<br />

Q.EXISTS_TAC ‘(F,F)‘ THEN GEN_BETA_TAC THEN REWRITE_TAC []));<br />

To get maps between the representation type and the new type, the function<br />

define new type bijections is used. In the example, the mappings between<br />

representing and abstracted type will be named abs3 and rep3.<br />

val three_bij = define_new_type_bijections<br />

{name="three_tybij", ABS="abs3", REP="rep3", tyax=tyax};


227<br />

A<br />

abs<br />

rep<br />

R<br />

P<br />

Fig. 2. Type definitions<br />

val three_bij =<br />

|- (!a. abs3 (rep3 a) = a) /\<br />

(!r. (\(x,y). ~(x /\ y)) r = (rep3 (abs3 r) = r))<br />

Some more complex examples will be given in section 3.3.<br />

3 Examples<br />

3.1 Parity Checker<br />

In this section, a simple device that computes the parity of a sequence of bits<br />

is specified verified with the help of the HOL system. It is a slightly modified<br />

version of the example given in section 7 of the HOL tutorial [4] showing the<br />

basic principles of verifying logic circuits.<br />

Specification To specify the parity checker formally, signals are modelled as<br />

functions from numbers (representing times) to booleans. In this example, two<br />

functions must be regarded: the input in and the output out of the device.<br />

The nth output of the parity checker should be T if and only if there have been<br />

an even number of T’s input on in before. Thus, a primitive recursive function<br />

PARITY can be defined so that for n


228<br />

Implementation To verify the given implementation, it must be described by a<br />

boolean term S(in, out) withfreevariablesx and y. S(in, out) istrueifand<br />

only if some combination of in and out is externally observable on the wires.<br />

For the parity checker, a relation PARITY IMP(inp,out) will be constructed<br />

describing its behaviour.<br />

As the parity checker is built from standard logic devices, some standard<br />

logical devices must be defined before the implementation of the parity checker<br />

can be given:<br />

val ONE_def = Define ‘ONE(out:num->bool) =<br />

!t. out t = T‘;<br />

val NOT_def = Define ‘NOT(inp, out:num->bool) =<br />

!t. out t = ~inp t‘;<br />

val MUX_def = Define ‘MUX(sw,in1,in2,out:num->bool) =<br />

!t. out t = if sw t then in1 t else in2 t‘;<br />

val REG_def = Define ‘REG(inp,out:num->bool) =<br />

!t. out t = if (t=0) then F else inp(t-1)‘;<br />

The predicate ONE is true of a signal out if for all times t the value of out is<br />

T. The binary predicate NOT is true of a pair of signals (inp,out) ifthevalueof<br />

out is always the negation of the value of inp. Registers are unit-delay elements:<br />

Theoutputattimet+1 is the input at the preceding time t, except at time 0<br />

when the register outputs F as required above.<br />

Apparently, the parity checker can be implemented with a register storing<br />

the parity value. Whenever T is an input, its content is complemented. But the<br />

output at time t cannot be just the value stored in that register, since it is<br />

(according to the specification) a function of the input at time t. Thus, there<br />

must be a combinational path from the input to the output.<br />

Provided that all registers initially store F, Figure 3 shows the design of a<br />

device that is intended to implement the specification of the parity checker. This<br />

diagram can be represented as a predicate by conjoining the relations holding<br />

between the various signals and then existentially quantifying the internal lines<br />

as described in (e.g. see 3 4)<br />

val PARITY_IMP_def = Define ‘PARITY_IMP(inp,out) =<br />

?l1 l2 l3 l4 l5.<br />

NOT(l2,l1) /\<br />

MUX(inp,l1,l2,l3) /\<br />

REG(out,l2) /\<br />

ONE l4 /\<br />

REG(l4,l5) /\<br />

MUX(l5,l3,l4,out)‘;<br />

Verification The main goal of the verification to prove the fact that the observed<br />

behaviour of the parity checker fulfils its specification. This safety property can<br />

be stated in the following way:<br />

g ‘!inp out. PARITY_IMP(inp,out) ==> !t. out t = PARITY t inp‘;


229<br />

in<br />

out<br />

0<br />

1<br />

1<br />

1 REG<br />

0<br />

REG<br />

1<br />

Fig. 3. Schematic diagram of the parity checker<br />

This is proved in two steps: At first, the PARITY LEMMA lemma shows how the<br />

output is calculated from the previous time step and the input, provided that<br />

inp and out are related as in the schematic diagram.<br />

g‘!inp out. PARITY_IMP(inp,out) ==><br />

(out 0 = T) /\ !t. out(SUC t) = if inp(SUC t) then ~(out t) else out t‘;<br />

e(PURE_REWRITE_TAC [PARITY_IMP_def, ONE_def, NOT_def, MUX_def, REG_def]);<br />

e(REPEAT STRIP_TAC);<br />

e(PROVE_TAC[]);<br />

e(PAT_ASSUM ‘‘!t. out t = X t‘‘ (fn th => REWRITE_TAC [SPEC ‘‘SUC t‘‘ th]));<br />

e(RW_TAC arith_ss []);<br />

val PARITY_LEMMA = top_thm();<br />

To prove this lemma, rewriting with definitions is used in the initial step,<br />

followed by decomposing the resulting goal by applying STRIP TAC. The first part<br />

can then be proven mechanically. For the second subgoal a specialised version<br />

of the assumption !t. out t = X f is used before the final simplification step.<br />

Having proven this lemma, it remains for the second part of the verification:<br />

g‘!inp out. (out 0 = T) /\ (!t. out (SUC t) =<br />

if inp (SUC t) then ~out t else out t) ==><br />

!t. out t = PARITY t inp‘;<br />

e(REPEAT GEN_TAC);<br />

e(STRIP_TAC);<br />

e(Induct);<br />

e(ASM_REWRITE_TAC[PARITY_def]);<br />

e(ASM_REWRITE_TAC[PARITY_def]);<br />

val UNIQUELESS_LEMMA = top_thm();<br />

This proof illustrates the use of induction in the HOL system: After the<br />

quantifiers and the left part of the implication have been removed from the<br />

goal, the right part is split up by an induction on t (which is the outermost<br />

universally quantified variable at that moment). The subgoals can be proved,<br />

simply by rewriting with the assumptions.


230<br />

To complete the proof of the parity checking device, the two parts of the<br />

verification are finally combined:<br />

(* goal is ‘‘!inp out. PARITY_IMP(inp,out) ==> !t. out t = PARITY t inp‘‘ *)<br />

e(RW_TAC std_ss []);<br />

e(MATCH_MP_TAC UNIQUELESS_LEMMA);<br />

e(PROVE_TAC[PARITY_LEMMA]);<br />

val PARITY_CORRECT = top_thm();<br />

Certainly, this examples does not need a theorem prover in order to be verified.<br />

Due to the small number of states and the lack of arithmetic components,<br />

other verification methods would be more appropriate. But, it shows the basics<br />

needed to do theorem proving, whereas the next example shows the power of<br />

the theorem proving method.<br />

3.2 Binary Greatest Common Divisor<br />

The binary method to determine the greatest common divisor of two numbers<br />

has been discovered by Roland Silver and John Terzian in 1962. They have<br />

never published it, but soon, the method became well known in computer science<br />

[8]. It only needs three operations: shifting, subtraction and testing whether a<br />

number is odd or even. Other, more complicated operations (like division) are<br />

not required. Therefore, it is primarily suited to binary arithmetic. It is based<br />

on the following three facts:<br />

– If u is even, and v is even: gcd(u, v) =2· gcd( u/2 ,v/2)<br />

– If u is even, and v is odd: gcd(u, v) =gcd(u/2 ,v)<br />

– If u is greater than v: gcd(u, v) =gcd(u − v, v)<br />

Figure 4 shows a schematic that implements the algorithm: Initially, the<br />

registers x and y store the input values. Like the Euclidean algorithm, the gcd<br />

is calculated in several steps. In each step, one of the three facts mentioned<br />

above are used. To verify this component, two things should be shown: First,<br />

the result should be eventually computed, and this value should be really the<br />

greatest common divisor of the inputs. While the first point is obvious (Consider<br />

the sum u+v as variant.), the partial correctness can be shown using the following<br />

invariant:<br />

– Invariant: Letu and v be the numbers whose greatest common divisor is<br />

calculated, and let x, y and k be the values of the respective registers. In<br />

each step, gcd(u, v) =gcd(x, y) · 2 k holds.<br />

(* BGCD_EVEN_EVEN |- !x y. EVEN x /\ EVEN y<br />

==> (gcd x y = 2*gcd (x DIV 2) (y DIV 2)) *)<br />

(* BGCD_EVEN_ODD |- !x y. EVEN x /\ ODD y<br />

==> (gcd x y = gcd (x DIV 2) y) *)<br />

(* BGCD_ODD_EVEN |- !x y. ODD x /\ EVEN y<br />

==> (gcd x y = gcd x (y DIV 2)) *)


231<br />

REG (x)<br />

REG (y)<br />

COUNTER (k)<br />

n<br />

0<br />

n<br />

0<br />

>>1<br />

>>1<br />

1 0<br />

1 0<br />

A−B<br />

Abool, out:num->bool) =<br />

!t. out t = ~inp t‘;<br />

val OR_def = Define ‘OR(in1:num->bool,in2:num->bool,out:num->bool) =<br />

!t. out t = (in1 t) \/ (in2 t)‘;<br />

val AND_def = Define ‘AND(in1:num->bool,in2:num->bool,out:num->bool) =<br />

!t. out t = (in1 t) /\ (in2 t)‘;<br />

val MUX_def = Define<br />

‘MUX(sw:num->bool,in1:num->num,in2:num->num,out:num->num) =<br />

!t. out t = if sw t then in1 t else in2 t‘;<br />

val COUNTER_def = Define ‘COUNTER(inp:num->bool,out:num->num) =<br />

!t. out t = if (t=0) then 0 else<br />

if (inp t) then (out(t-1)+1) else out(t-1)‘;<br />

val REG_def = Define ‘REG(inp:num->num,out:num->num,init:num) =<br />

!t. out t = if (t=0) then init else inp (t-1)‘;


232<br />

val SHIFT_def = Define ‘SHIFT(inp:num->num, out:num->num) =<br />

!t. out t = (inp t) DIV 2‘;<br />

val SUB_def = Define ‘SUB(in1:num->num,in2:num->num,out:num->num) =<br />

!t. out t = (in1 t - in2 t)‘;<br />

val LESS_def = Define ‘LESS(in1:num->num,in2:num->num,out:num->bool) =<br />

!t. out t = (in1 t < in2 t)‘;<br />

val LSB_def = Define ‘LSB(inp:num->num,out:num->bool) =<br />

!t. out t = ((inp t) MOD 2 = 1)‘;<br />

Then, the composition is described by:<br />

val BGCD_IMP_def = Define<br />

‘BGCD_IMP(initX:num, initY:num,<br />

regX:num->num, regY:num->num, regK:num->num) =<br />

? inX, inY, regXshift, regYshift, oddX, oddY,<br />

regXcor, regYcor, evenX, evenY, evenXY,<br />

oddXY, oddXYy, oddXYx, subX, subY, subXY, subYX.<br />

REG(inX,regX,initX) /\ REG(inY,regY,initY) /\<br />

SHIFT(regX,regXshift) /\ SHIFT(regY,regYshift) /\<br />

LSB(regX,oddX) /\ LSB(regY,oddY) /\<br />

MUX(oddX,regX,regXshift,regXcor) /\<br />

MUX(oddY,regY,regYshift,regYcor) /\<br />

NOT(oddX,evenX) /\ NOT(oddY,evenY) /\<br />

AND(evenX,evenY,evenXY)/\<br />

COUNTER(evenXY,regK)/\<br />

AND(oddX, oddY, oddXY) /\<br />

LESS(regXcor,regYcor,oddXYx) /\ LESS(regYcor,regXcor,oddXYy) /\<br />

AND(oddXY,oddXYx,subX) /\ AND(oddXY,oddXYy,subY) /\<br />

SUB(regXcor,regYcor,subXY) /\ SUB(regYcor,regXcor,subYX) /\<br />

MUX(subX,regXcor,subXY,inX) /\ MUX(subY,regYcor,subYX,inY)‘;<br />

Now, it is possible to prove the invariant and the correctness of the component.<br />

The proof for this can be found in A.1. Considering this example, the<br />

benefit from the theorem proving method becomes obvious: The number of possible<br />

states and the complexity of the components is big. But this does not affect<br />

the theorem proving approach, which abstracts from the size of the registers and<br />

make it even possible to prove the correctness for arbitrary sizes.<br />

3.3 Rational Numbers<br />

This section shows are more comprehensive example introducing the type of<br />

rational numbers Q. This theory can be used to verify hardware that is based on<br />

rational arithmetic operations. Applications of this can be found in areas that<br />

need precise calculations of basic arithmetics, e.g. linear geometry primitives<br />

used in safety-critical environments.<br />

The rational numbers are defined in two steps. First, fractions consisting of a<br />

pair of integers are introduced. Subsequently, rational numbers are constructed<br />

as equivalence classes of them using the quotient theory.


233<br />

Fractions As known from school, each fraction f consists of a pair of integers<br />

(a, b), whose components are known as the numerator a and the denominator b<br />

of a fraction. The latter of the two components b must not be zero; otherwise<br />

the fraction does not have a clear meaning. To make things easier, the sign of a<br />

fraction is always moved to the numerator:<br />

f = a a, b ∈ Int,b>0<br />

b<br />

In HOL, the type of fractions can be defined by the following statement.(In<br />

the proof of the the non-emptiness of the set of fractions, 1 1<br />

is used as witness.)<br />

val frac_tyax = save_thm("frac_tyax", new_type_definition( "frac",<br />

Q.prove(‘?x. (\f:int#int. 0


234<br />

val add_def = Define ‘add f1 f2 =<br />

abs_frac(nmr f1 * dnm f2 + nmr f2 * dnm f1, dnm f1 * dnm f2)‘;<br />

val mul_def = Define ‘mul f1 f2 =<br />

abs_frac(nmr f1 * nmr f2, dnm f1 * dnm f2)‘;<br />

val sub_def = Define ‘sub f1 f2 = add f1 (ainv f2)‘;<br />

val div_def = Define ‘div f1 f2 = mul f1 (minv f2)‘;<br />

Addition and multiplication are defined intuitively. Substraction and division<br />

use them and the inverse elements.<br />

Like in many other areas, good tools are the key to success. A well considered<br />

set of tactics and lemmas makes proofs much simpler.<br />

val FRAC_EQ_TAC:tactic = fn (asl,w) =><br />

let<br />

val (lhs,rhs) = dest_eq w<br />

in<br />

let<br />

val (lhc, lha) = dest_comb lhs;<br />

val (rhc, rha ) = dest_comb rhs;<br />

in<br />

let<br />

val [a1,b1] = strip_pair lha;<br />

val [a2,b2] = strip_pair rha;<br />

in<br />

let<br />

val sg1 = mk_eq(a1,a2);<br />

val sg2 = mk_eq(b1,b2);<br />

in<br />

(<br />

[(asl,sg1), (asl,sg2)],<br />

fn [thm1,thm2] => MP<br />

(SPEC b2 (SPEC a2 (SPEC b1 (SPEC a1 (<br />

prove(‘‘!a1 b1 a2 b2. (a1=a2) /\ (b1=b2) ==><br />

(abs_frac(a1,b1)=abs_frac(a2,b2))‘‘, ARW_TAC[])<br />

)))))<br />

(CONJ thm1 thm2)<br />

)<br />

end<br />

end<br />

end<br />

end<br />

handle HOL_ERR _ => raise ERR "FRAC_EQ_TAC" "";<br />

FRAC EQ TAC is a tactic which is used in almost every proof involving fractions:<br />

To show that two fractions are equal, it is sufficient to show that respectively<br />

their numerators and denominators are equal. In the first three let parts,<br />

the numerator and denominator of the two fractions are extracted. This is accomplished<br />

by successively applying the appropriate destructor functions. The<br />

strategy assumes a certain syntactical structure of the goal. If this is not given,<br />

the tactic will fail (i.e. the goal will remain unchanged).


235<br />

The fourth let part constructs the two subgoals (numerators are equal, denominators<br />

are equal) using the constructor function mk_eq. These subgoals prove<br />

the initial goal; the argument for this is !a1 b1 a2 b2. (a1=a2) /\ (b1=b2) ==><br />

(abs\_frac(a1,b1)=abs\_frac(a2,b2)).<br />

(* FRAC_REP_ABS_SUBST: 0 < b |- (rep_frac (abs_frac (a,b)) = (a,b)) : thm *)<br />

(* NMR: !a b. 0 < b ==> (nmr (abs_frac (a,b)) = a) *)<br />

val NMR = store_thm("NMR", ‘‘!a b. 0 < b ==> (nmr (abs_frac (a,b)) = a)‘‘,<br />

REPEAT STRIP_TAC THEN<br />

REWRITE_TAC[nmr_def] THEN<br />

REWRITE_TAC[FRAC_REP_ABS_SUBST] );<br />

(* DNM: !a b. 0 < b ==> (nmr (abs_frac (a,b)) = a) *)<br />

val DNM = store_thm("DNM", ‘‘!a b. 0 < b ==> (dnm (abs_frac (a,b)) = b)‘‘,<br />

REPEAT STRIP_TAC THEN<br />

REWRITE_TAC[dnm_def] THEN<br />

REWRITE_TAC[FRAC_REP_ABS_SUBST] );<br />

The pair library offers theorems to simplify terms of the form FST(a,b)=a or<br />

SND(a,b)=b. Similar theorems are provided by the fractions library. NMR and DNM<br />

reduce the terms nmr(abs frac(a,b)) and dnm(abs frac(a,b)). Both of them<br />

require that the denominator of the included fraction is positive. Otherwise, this<br />

simplification step cannot be done. In most cases, this means the proof gets stuck<br />

at this place.<br />

To show the required precondition, another tactic comes to help:<br />

(* INT_MUL_POS_SIGN: |- !a b. 0 0 0<br />

ASSUME_TAC( (prove(intSyntax.mk_less(intSyntax.zero_tm,term1),<br />

ARW_TAC[FRAC_DNM_POSITIVE,INT_MUL_POS_SIGN])) )<br />

handle HOL_ERR _ => raise ERR "FRAC_NOT_NAN_ASM_TAC" "";<br />

For a given term, the tactic tries to prove that it is positive, using the facts<br />

that the denominator of a fraction is positive and the product of two positive<br />

numbers is positive.<br />

Equipped with these utilities, some properties of fractions can be shown quite<br />

elegantly, e.g. the associativity of the addition:<br />

val FRAC_ADD_ASSOC = store_thm("FRAC_ADD_ASSOC",<br />

‘‘!a b c. add a (add b c) = add (add a b) c‘‘,<br />

REPEAT STRIP_TAC<br />

THEN REWRITE_TAC[add_def]<br />

THEN DNM_POS_ASM_TAC ‘‘dnm a * dnm b‘‘<br />

THEN DNM_POS_ASM_TAC ‘‘dnm b * dnm c‘‘<br />

THEN ARW_TAC[NMR,DNM]<br />

THEN FRAC_EQ_TAC<br />

THEN INT_RING_TAC );


236<br />

The steps of the proof are as follows:<br />

– First, all quantifiers are stripped off the goal by repeatedly applying STRIP_TAC.<br />

Thus, all variables become free.<br />

– Then, the definition of the addition is used to rewrite the goal. The resulting<br />

proof obligation contains subterms of the form nmr(abs_frac(x,y)) and<br />

dnm(abs_frac(x,y)).<br />

– Assumptions are added, stating that respectively dnm a * dnm b and dnm b * dnm c<br />

are positive.<br />

– With this, the goal can be simplified. NMR and DNM are used.<br />

– The goal of the form x=y is split up into the two subgoals x==>y and y==>x.<br />

– Both of them are solved by INT_RING_TAC, which transforms all terms of the<br />

goal to a normal form (using ring properties), and then compares them.<br />

In a similar way, some more properties of fractions can be shown, e.g. the following<br />

lemmas:<br />

(* FRAC_MULT_ASSOC: |- !a b c. mul a (mul b c) = mul (mul a b) c *)<br />

(* FRAC_ADD_COMM: |- !a b c. add a b = add b a *)<br />

(* FRAC_MULT_COMM: |- !a b c. mul a b = mul b a *)<br />

(* FRAC_ADD_RID: |- !a. add a frac_0 = a *)<br />

(* FRAC_MUL_RID: |- !a. mul a frac_1 = a *)<br />

(* FRAC_SUB_PLUS: |- !a b c. sub a (add b c) = sub (sub a b) c *)<br />

(* FRAC_SUB_MINUS: |- !a b c. sub a (sub b c) = add (sub a b) c *)<br />

(* SUB_AINV_THM: |- !a b. sub a b = ainv (sub b a) *)<br />

Rational numbers Rational numbers are constructed as equivalence classes of<br />

fractions. Two fractions f1 = f1n<br />

f1 d<br />

and f2 = f2n<br />

f2 d<br />

are equivalent, if the fractions<br />

f1‘ and f2 ′ obtained by reduction of f1 andf2 are equal. This can be defined<br />

as follows:<br />

f1 n<br />

∼ f2 n<br />

⇔ f1 n · f2 d = f2 n · f1 d<br />

f1 d f2 d<br />

In HOL, this definition can be written as:<br />

val rat_equiv_def =<br />

Define ‘rat_equiv f1 f2 = (nmr f1 * dnm f2 = nmr f2 * dnm f1)‘;<br />

The following theorem asserts that the equivalence relation has the intended<br />

meaning:<br />

(* RAT_EQUIV_ALT |- !a. rat_equiv a = \x. (?b c. 0


237<br />

Before we proceed to the definition of the quotient type of rational numbers,<br />

it is shown that rat equiv is indeed an equivalence relation by proving the<br />

following three lemmas.<br />

(* RAT_EQUIV_REF: |- !a:frac. rat_equiv a a *)<br />

(* RAT_EQUIV_SYM: |- !a b. rat_equiv a b = rat_equiv b a *)<br />

(* RAT_EQUIV_TRANS: |- !a b c. rat_equiv a b /\ rat_equiv b c<br />

==> rat_equiv a c *)<br />

The actual type definition is rather short. Names for the new type rat and the<br />

mappings between the abstract and the representing type abs_rat and rep_rat<br />

are given.<br />

val rat_def = define_quotient_type "rat"<br />

"abs_rat"<br />

"rep_rat"<br />

RAT_EQUIV_REF RAT_EQUIV_SYM RAT_EQUIV_TRANS;<br />

Some operations can be defined now. All of them rely on the corresponding<br />

function for fractions.<br />

(* numerator, denominator, sign of a fraction *)<br />

val rat_nmr_def = Define ‘rat_nmr r = nmr (rep_rat r)‘;<br />

val rat_dnm_def = Define ‘rat_dnm r = dnm (rep_rat r)‘;<br />

val rat_sgn_def = Define ‘rat_sgn r = sgn (rep_rat r)‘;<br />

(* additive, multiplicative inverse of a fraction *)<br />

val rat_0_def = Define ‘rat_0 = abs_rat( frac_0 )‘;<br />

val rat_1_def = Define ‘rat_1 = abs_rat( frac_1 )‘;<br />

(* neutral elements *)<br />

val rat_ainv_def = Define ‘rat_ainv r1 = abs_rat( ainv (rep_rat r1))‘;<br />

val rat_minv_def = Define ‘rat_minv r1 = abs_rat( minv (rep_rat r1))‘;<br />

(* less (absolute value) *)<br />

val rat_les_abs_def = Define ‘rat_les_abs r1 r2 =<br />

les_abs (rep_rat r1) (rep_rat r2)‘;<br />

(* basic arithmetics *)<br />

val rat_add_def = Define ‘rat_add r1 r2 =<br />

abs_rat( add (rep_rat r1) (rep_rat r2) )‘;<br />

val rat_sub_def = Define ‘rat_sub r1 r2 =<br />

abs_rat( sub (rep_rat r1) (rep_rat r2) )‘;<br />

val rat_mul_def = Define ‘rat_mul r1 r2 =<br />

abs_rat( mul (rep_rat r1) (rep_rat r2) )‘;<br />

val rat_div_def = Define ‘rat_div r1 r2 =<br />

abs_rat( div (rep_rat r1) (rep_rat r2) )‘;<br />

To reuse the properties already proved for the fractions, an important fact<br />

must be shown for the all of these operations: the congruence, e.g. for the addition,<br />

the following equation must hold:


238<br />

a + b = a + b<br />

This property is split up in two parts in the HOL theory:<br />

(* RAT_ADD_CONG:<br />

|- !x y. abs_rat (add (rep_rat (abs_rat x)) y) = abs_rat (add x y) /\<br />

!x y. abs_rat (add x (rep_rat (abs_rat y))) = abs_rat (add x y) *)<br />

Among the addition, the congruence property is proved for each operation<br />

defined for the rational numbers above. As it can be seen in the appendix A.4,<br />

theseproofsarenotassimpleastheyseemtobe.Theyallrequirealotof<br />

conversions to obtain a goal, which the definition of the equivalence relation can<br />

be applied to.<br />

(* RAT_ADD_ASSOC: |- !a b c. rat_add a (rat_add b c) =<br />

rat_add (rat_add a b) c *)<br />

(* RAT_MULT_ASSOC:|- !a b c. rat_mul a (rat_mul b c) =<br />

rat_mul (rat_mul a b) c *)<br />

(* RAT_ADD_COMM: |- !a b. rat_add a b = rat_add b a *)<br />

(* RAT_ADD_COMM: |- !a b. rat_mul a b = rat_mul b a *)<br />

(* RAT_ADD_RID: |- !a. rat_add a rat_0 = a *)<br />

(* RAT_ADD_LID: |- !a. rat_add rat_0 a = a *)<br />

(* RAT_MULT_RID: |- !a. rat_mul a rat_1 = a *)<br />

(* RAT_MULT_LID: |- !a. rat_mul rat_1 a = a *)<br />

(* RAT_ADD_RINV: |- !a. rat_add a (rat_ainv a) = rat_0 *)<br />

(* RAT_ADD_LINV: |- !a. rat_add (rat_ainv a) a = rat_0 *)<br />

(* RAT_MULT_RINV: |- !a. ~(a = rat_0) ==><br />

(rat_mul a (rat_minv a) = rat_1) *)<br />

(* RAT_MULT_LINV: |- !a. ~(a = rat_0) ==><br />

(rat_mul (rat_minv a) a = rat_1) *)<br />

(* RAT_RDISTRIB: |- !a b c. rat_mul (rat_add a b) c<br />

= rat_add (rat_mul a c) (rat_mul b c) *)<br />

(* RAT_LDISTRIB: |- !a b c. rat_mul c (rat_add a b)<br />

= rat_add (rat_mul c a) (rat_mul c b) *)<br />

(* RAT_IS_RING: |- is_ring (ring rat_0 rat_1<br />

rat_add rat_mul rat_ainv) *)<br />

The theory of rational numbers proves various ring properties for the rational<br />

numbers. Especially, the last theorem is very useful. The ring library of the HOL<br />

system provides automated reduction and proving functions for rings, which can<br />

be accessed, if the last theorem is proved.<br />

With these theorems, it is possible to examine hardware component based on<br />

rational numbers and to express properties of them. This section illustrates which<br />

(and how much) mathematical background may be needed to verify hardware.<br />

4 Conclusion<br />

Theorem proving has shown to be be a powerful method to verify hardware,<br />

especially arithmetic components. It is the best choice to verify dataflow properties,<br />

since model checking and equivalence checking fail to exploit its structure


239<br />

due to its underlying mathematical concepts. But, on the other side, theorem<br />

proving needs guidance from the user. Therefore, it is a time-consuming and<br />

(for industrial users) expensive method, whose effort only some applications can<br />

afford.<br />

As theorem proving is strong where model checking and equivalence checking<br />

are weak (and the other way around), it seems to be the most promising approach<br />

to integrate these complementary methods.<br />

References<br />

1. Camilleri,A.J.,Melham,T.F.,andGordon,M.J. Hardware verification<br />

using higher-order logic. In From HDL Descriptions to Guaranteed Correct Circuit<br />

Designs: Proceedings of the IFIP WG 10.2 Working Conference (1987), D. Borrione,<br />

Ed., IFIP WG 10.2, North-Holland, pp. 43–67.<br />

2. Church, A. A formulation of the simple theory of types. Journal of Symbolic Logic<br />

5 (1940), 56–68.<br />

3. Gordon, M. The HOL system reference, 6 2002.<br />

4. Gordon, M. The HOL system tutorial, 6 2002.<br />

5. Gordon,M.J. Why higher-order logic is a good formalism for specifying and<br />

verifying hardware. In Formal Aspects of VLSI Design: Proceedings of the 1985<br />

Edinburgh Workshop on VLSI (1986), G. J. M. P. Subrahmanyam, Ed., North-<br />

Holland, pp. 153–177.<br />

6. Gordon,M.J.The HOL system description, 6 2002.<br />

7. Gordon,M.J.,Milner,R.,andWadsworth,C.P.Edinburgh LCF: A mechanised<br />

logic of computation. In Lecture Notes in Computer Science, vol. 78. Springer-<br />

Verlag, 1979.<br />

8. Knuth, D. E. The Art of Computer Programming, vol. Seminumerical Algorithms.<br />

Addison Wesley, 1968.<br />

9. Milner, R., Tofte, M., and Harper, R. The definition of Standard ML. The<br />

MIT Press, 1990.<br />

A<br />

HOL theories<br />

A.1 bgcd<br />

(*==========================================================================*)<br />

(* Binary gcd (Jens Brandt) *)<br />

(* *)<br />

(* Binary method of the gcd algorithm *)<br />

(* *)<br />

(* March 2004 *)<br />

(* *)<br />

(*==========================================================================*)<br />

app load ["gcdTheory", "schneiderUtils"];<br />

open arithmeticTheory dividesTheory gcdTheory schneiderUtils;<br />

val ARW_TAC = RW_TAC arith_ss;


240<br />

val DIVIDES_DOUBLE = store_thm("DIVIDES_DOUBLE",<br />

‘‘! x y. divides (2 * x) (2 * y) = divides x y‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[divides_def] THEN<br />

EQ_TAC THENL<br />

[<br />

REWRITE_TAC[prove(‘‘2=SUC 1‘‘,ARW_TAC[])] THEN<br />

REWRITE_TAC[EQT_ELIM (AC_CONV(MULT_ASSOC,MULT_COMM)<br />

‘‘q * (SUC 1 * x) = SUC 1 * (q *x)‘‘)] THEN<br />

REWRITE_TAC[MULT_MONO_EQ]<br />

,<br />

REWRITE_TAC[divides_def] THEN<br />

STRIP_TAC THEN<br />

ASM_REWRITE_TAC[] THEN<br />

EXISTS_TAC ‘‘q:num‘‘ THEN<br />

REWRITE_TAC[EQT_ELIM (AC_CONV(MULT_ASSOC,MULT_COMM)<br />

‘‘2 * (q * x) = q * (2 * x)‘‘)]<br />

] );<br />

val DIVIDES_GCD_L = store_thm("DIVIDES_GCD_L",<br />

REPEAT GEN_TAC THEN<br />

ASSUME_TAC (SPEC_ALL GCD_IS_GCD) THEN<br />

UNDISCH_TAC ‘‘is_gcd a b (gcd a b)‘‘ THEN<br />

REWRITE_TAC[is_gcd_def] THEN<br />

ARW_TAC[] );<br />

val DIVIDES_GCD_R = store_thm("DIVIDES_GCD_R",<br />

REPEAT GEN_TAC THEN<br />

ASSUME_TAC (SPEC_ALL GCD_IS_GCD) THEN<br />

UNDISCH_TAC ‘‘is_gcd a b (gcd a b)‘‘ THEN<br />

REWRITE_TAC[is_gcd_def] THEN<br />

ARW_TAC[] );<br />

‘‘! a b. divides (gcd a b) a‘‘,<br />

‘‘! a b. divides (gcd a b) b‘‘,<br />

val SUC1_IS_2 = prove(‘‘SUC 1=2‘‘,ARW_TAC[]);<br />

val ODD_EXISTS_IMP = prove(‘‘!n m. (n=SUC(2*m)) ==> ODD n‘‘,<br />

GEN_TAC THEN<br />

REWRITE_TAC[ODD_EXISTS] THEN<br />

ARW_TAC[] THEN<br />

EXISTS_TAC ‘‘m:num‘‘ THEN<br />

ARW_TAC[] );<br />

val EVEN_DOUBLE_EQ = prove(‘‘! x y. (2* y = x) ==> EVEN x‘‘,<br />

REPEAT GEN_TAC THEN<br />

ARW_TAC[] THEN<br />

ARW_TAC[EVEN_DOUBLE] );<br />

val ODD_DOUBLE_EQ = prove(‘‘! x y. (SUC (2* y) = x) ==> ODD x‘‘,<br />

REPEAT GEN_TAC THEN


241<br />

ARW_TAC[] THEN<br />

ARW_TAC[ODD_DOUBLE] );<br />

val ODD_EVEN_PRODUCT = prove(‘‘!x y. ODD x /\ EVEN (y*x) ==> EVEN y‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[EVEN_MULT] THEN<br />

ONCE_REWRITE_TAC[LEFT_AND_OVER_OR] THEN<br />

ARW_TAC[ONCE_REWRITE_RULE[CONJ_COMM] EVEN_AND_ODD] );<br />

val ASM_IMP_CONJ = prove(‘‘!a b c. (a /\ b ==> c) = (a ==> b ==> c)‘‘,<br />

PROVE_TAC[] );<br />

val DIVIDES_ODD_EVEN = store_thm("DIVIDES_ODD_EVEN",<br />

‘‘!x y. ODD x /\ divides x (2 * y) ==> divides x y‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[ODD_EXISTS] THEN<br />

REWRITE_TAC[divides_def] THEN<br />

STRIP_TAC THEN<br />

ONCE_REWRITE_TAC[GSYM (SPEC ‘‘1‘‘ (SPEC ‘‘q * x‘‘<br />

(SPEC ‘‘y:num‘‘ MULT_MONO_EQ)))] THEN<br />

REWRITE_TAC[SUC1_IS_2] THEN<br />

ASM_REWRITE_TAC[] THEN<br />

REWRITE_TAC[EQT_ELIM (AC_CONV(MULT_ASSOC,MULT_COMM)<br />

‘‘2 * (q’ * SUC (2 * m)) = 2 * q’ * SUC (2 * m)‘‘)] THEN<br />

REWRITE_TAC[ONCE_REWRITE_RULE[MULT_COMM] MULT_MONO_EQ] THEN<br />

REWRITE_TAC[GSYM EVEN_EXISTS] THEN<br />

ASSUME_TAC (UNDISCH_ALL (REWRITE_RULE[SUC1_IS_2] (SPEC ‘‘m:num‘‘<br />

(SPEC ‘‘x:num‘‘ ODD_EXISTS_IMP)))) THEN<br />

ASSUME_TAC (UNDISCH_ALL<br />

(SPEC ‘‘y:num‘‘ (SPEC ‘‘q*x‘‘ EVEN_DOUBLE_EQ))) THEN<br />

ASSUME_TAC (UNDISCH_ALL (REWRITE_RULE [ASM_IMP_CONJ] (SPEC ‘‘q:num‘‘<br />

(SPEC ‘‘x:num‘‘ ODD_EVEN_PRODUCT)))) THEN<br />

PROVE_TAC[] );<br />

val ODD_DIVIDES_ODD = store_thm("ODD_DIVIDES_ODD",<br />

‘‘!x y. ODD x /\ divides y x ==> ODD y‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[CONTRAPOS_CONV ‘‘ODD x /\ divides y x ==> ODD y‘‘] THEN<br />

REWRITE_TAC[DE_MORGAN_THM] THEN<br />

REWRITE_TAC[GSYM EVEN_ODD] THEN<br />

REWRITE_TAC[EVEN_EXISTS, divides_def] THEN<br />

STRIP_TAC THEN<br />

ASM_REWRITE_TAC[] THEN<br />

LEFT_DISJ_TAC THEN<br />

ARW_TAC[] THEN<br />

EXISTS_TAC ‘‘m*q‘‘ THEN<br />

ARW_TAC[AC_CONV(MULT_ASSOC,MULT_COMM) ‘‘q * (2 * m) = 2 * (m * q)‘‘] );<br />

val IS_GCD_DOUBLE = store_thm("IS_GCD_DOUBLE",<br />

‘‘is_gcd (2*a) (2*b) (2*c) = is_gcd a b c‘‘,


242<br />

REWRITE_TAC[is_gcd_def] THEN<br />

REWRITE_TAC[DIVIDES_DOUBLE] THEN<br />

ONCE_REWRITE_TAC[CONJ_ASSOC] THEN<br />

EQ_TAC THENL<br />

[<br />

ARW_TAC[] THEN<br />

LEFT_NO_FORALL_TAC 2 ‘‘2*d‘‘ THEN<br />

UNDISCH_TAC ‘‘divides d b‘‘ THEN<br />

UNDISCH_TAC ‘‘divides d a‘‘ THEN<br />

REWRITE_TAC[GSYM ASM_IMP_CONJ] THEN<br />

ONCE_REWRITE_TAC[GSYM DIVIDES_DOUBLE] THEN<br />

ARW_TAC[]<br />

,<br />

STRIP_TAC THEN<br />

ARW_TAC[] THEN<br />

UNDISCH_TAC ‘‘divides d (2*b)‘‘ THEN<br />

UNDISCH_TAC ‘‘divides d (2*a)‘‘ THEN<br />

REWRITE_TAC[GSYM ASM_IMP_CONJ] THEN<br />

DISJ_CASES_TAC (SPEC ‘‘d:num‘‘ EVEN_OR_ODD) THENL<br />

[<br />

UNDISCH_TAC ‘‘EVEN d‘‘ THEN<br />

REWRITE_TAC[EVEN_EXISTS] THEN<br />

STRIP_TAC THEN<br />

ASM_REWRITE_TAC[] THEN<br />

REWRITE_TAC[DIVIDES_DOUBLE] THEN<br />

LEFT_NO_FORALL_TAC 1 ‘‘m:num‘‘ THEN<br />

ARW_TAC[]<br />

,<br />

STRIP_TAC THEN<br />

ASSUME_TAC( UNDISCH_ALL (REWRITE_RULE [ASM_IMP_CONJ]<br />

(SPEC‘‘a:num‘‘ (SPEC‘‘d:num‘‘ DIVIDES_ODD_EVEN)))) THEN<br />

ASSUME_TAC( UNDISCH_ALL (REWRITE_RULE [ASM_IMP_CONJ]<br />

(SPEC‘‘b:num‘‘ (SPEC‘‘d:num‘‘ DIVIDES_ODD_EVEN)))) THEN<br />

LEFT_NO_FORALL_TAC 5 ‘‘d:num‘‘ THEN<br />

ONCE_REWRITE_TAC[MULT_COMM] THEN<br />

MATCH_MP_TAC (SPEC ‘‘2‘‘( SPEC ‘‘c:num‘‘<br />

(SPEC ‘‘d:num‘‘ DIVIDES_MULT))) THEN<br />

ARW_TAC[]<br />

]<br />

] );<br />

val IS_GCD_EQ = store_thm("IS_GCD_EQ", ‘‘!a b c. is_gcd a b c = (c = gcd a b)‘‘,<br />

REPEAT GEN_TAC THEN<br />

EQ_TAC THENL<br />

[<br />

STRIP_TAC THEN<br />

ASSUME_TAC (SPEC ‘‘gcd a b‘‘ (SPEC ‘‘c:num‘‘ (SPEC ‘‘b:num‘‘<br />

(SPEC ‘‘a:num‘‘ IS_GCD_UNIQUE)))) THEN<br />

ASSUME_TAC (SPEC_ALL GCD_IS_GCD) THEN<br />

ARW_TAC[]


243<br />

,<br />

STRIP_TAC THEN<br />

ASM_REWRITE_TAC[] THEN<br />

ARW_TAC[GCD_IS_GCD]<br />

] );<br />

val BGCD_EVEN_EVEN = store_thm("BGCD_EVEN_EVEN",<br />

‘‘!x y. EVEN x /\ EVEN y ==> (gcd x y = 2*gcd (x DIV 2) (y DIV 2))‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[EVEN_EXISTS] THEN<br />

ONCE_REWRITE_TAC[MULT_COMM] THEN<br />

STRIP_TAC THEN<br />

ASM_REWRITE_TAC[] THEN<br />

ASSUME_TAC (prove(‘‘0 (gcd x y = gcd (x DIV 2) y)‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[EVEN_EXISTS, ODD_EXISTS] THEN<br />

ONCE_REWRITE_TAC[MULT_COMM] THEN<br />

STRIP_TAC THEN<br />

ASM_REWRITE_TAC[] THEN<br />

ASSUME_TAC (prove(‘‘0


244<br />

UNDISCH_TAC ‘‘is_gcd m (SUC (m’ * 2)) (gcd m (SUC (m’ * 2)))‘‘ THEN<br />

REWRITE_TAC[is_gcd_def] THEN<br />

ARW_TAC[]<br />

] );<br />

val BGCD_ODD_EVEN = store_thm("BGCD_ODD_EVEN",<br />

‘‘!x y. ODD x /\ EVEN y ==> (gcd x y = gcd x (y DIV 2))‘‘,<br />

ONCE_REWRITE_TAC[GCD_SYM] THEN<br />

ARW_TAC[BGCD_EVEN_ODD] );<br />

val BGCD_ODD_ODD0 = store_thm("BGCD_ODD_ODD0",<br />

‘‘!x y. ODD x /\ ODD y /\ (x=y) ==> (gcd x y = x)‘‘,<br />

REPEAT STRIP_TAC THEN<br />

ARW_TAC[GCD_REF] );<br />

val BGCD_ODD_ODD1 = store_thm("BGCD_ODD_ODD1",<br />

‘‘!x y. ODD x /\ ODD y /\ y (gcd x y = gcd (x-y) y)‘‘,<br />

REPEAT STRIP_TAC THEN<br />

ASSUME_TAC (SPEC ‘‘x-y‘‘ (SPEC ‘‘y:num‘‘ GCD_ADD_L)) THEN<br />

UNDISCH_TAC ‘‘gcd (y + (x - y)) y = gcd y (x - y)‘‘ THEN<br />

ONCE_REWRITE_TAC[ADD_SYM] THEN<br />

ASSUME_TAC (UNDISCH_ALL (prove(‘‘y < x ==> ybool, out:num->bool) =<br />

!t. out t = ~inp t‘;<br />

val MUX_def = Define ‘MUX(sw:num->bool,in1:num->num,in2:num->num,out:num->num) =<br />

!t. out t = if sw t then in1 t else in2 t‘;<br />

val OR_def = Define ‘OR(in1:num->bool,in2:num->bool,out:num->bool) =<br />

!t. out t = (in1 t) \/ (in2 t)‘;<br />

val AND_def = Define ‘AND(in1:num->bool,in2:num->bool,out:num->bool) =<br />

!t. out t = (in1 t) /\ (in2 t)‘;<br />

val COUNTER_def = Define ‘COUNTER(inp:num->bool,out:num->num) =<br />

!t. out t = if (t=0) then 0 else<br />

if (inp t) then (out(t-1)+1) else out(t-1)‘;<br />

val REG_def = Define ‘REG(inp:num->num,out:num->num,init:num) =<br />

!t. out t = if (t=0) then init else inp (t-1)‘;<br />

val SHIFT_def = Define ‘SHIFT(inp:num->num, out:num->num) =<br />

!t. out t = (inp t) DIV 2‘;


245<br />

val SUB_def = Define ‘SUB(in1:num->num,in2:num->num,out:num->num) =<br />

!t. out t = (in1 t - in2 t)‘;<br />

val LESS_def = Define ‘LESS(in1:num->num,in2:num->num,out:num->bool) =<br />

!t. out t = (in1 t < in2 t)‘;<br />

val LSB_def = Define ‘LSB(inp:num->num,out:num->bool) =<br />

!t. out t = ((inp t) MOD 2 = 1)‘;<br />

val BGCD_IMP_def = Define ‘BGCD_IMP<br />

(initX:num, initY:num,<br />

regX:num->num, regY:num->num, regK:num->num) =<br />

? inX, inY, regXshift, regYshift, oddX, oddY, regXcor, regYcor,<br />

evenX, evenY, evenXY, oddXY, oddXYy, oddXYx,<br />

subX, subY, subXY, subYX.<br />

REG(inX,regX,initX) /\ REG(inY,regY,initY) /\<br />

SHIFT(regX,regXshift) /\ SHIFT(regY,regYshift) /\<br />

LSB(regX,oddX) /\ LSB(regY,oddY) /\<br />

MUX(oddX,regX,regXshift,regXcor) /\ MUX(oddY,regY,regYshift,regYcor) /\<br />

NOT(oddX,evenX) /\ NOT(oddY,evenY) /\<br />

AND(evenX,evenY,evenXY)/\<br />

COUNTER(evenXY,regK)/\<br />

AND(oddX, oddY, oddXY) /\<br />

LESS(regXcor,regYcor,oddXYx) /\ LESS(regYcor,regXcor,oddXYy) /\<br />

AND(oddXY,oddXYx,subX) /\ AND(oddXY,oddXYy,subY) /\<br />

SUB(regXcor,regYcor,subXY) /\ SUB(regYcor,regXcor,subYX) /\<br />

MUX(subX,regXcor,subXY,inX) /\ MUX(subY,regYcor,subYX,inY)‘;<br />

A.2 fractionScript<br />

(*==========================================================================*)<br />

(* Theory of fractions. (Jens Brandt) *)<br />

(* *)<br />

(* The fractions are pairs of integers. Denominator of fractions is always *)<br />

(* positive. *)<br />

(* *)<br />

(* February 2004 *)<br />

(* *)<br />

(*==========================================================================*)<br />

open HolKernel boolLib Parse bossLib;<br />

(* interactive mode<br />

app load ["integerTheory","intLib","ringLib",<br />

"integerRingTheory","integerRingLib"];<br />

*)<br />

open<br />

arithmeticTheory ringTheory ringLib<br />

integerTheory intLib integerRingTheory integerRingLib;<br />

val _ = new_theory "fraction";


246<br />

val ARW_TAC = RW_TAC int_ss;<br />

(*--------------------------------------------------------------------------*<br />

* type definition<br />

*--------------------------------------------------------------------------*)<br />

val frac_tyax = new_type_definition( "frac",<br />

Q.prove(‘?x. (\f:int#int. 0


247<br />

(*--------------------------------------------------------------------------<br />

* FRAC_EQ_TAC : tactic<br />

*<br />

* A ?- abs_frac(a1,b1) = abs_frac(a2,b2)<br />

* ========================================= FRAC_EQ_TAC<br />

* A ?- a1=a2 | A ?- b1=b2<br />

*<br />

* Two fractions are equal, if the nominator and the denominator are<br />

* equal.<br />

*--------------------------------------------------------------------------*)<br />

val FRAC_EQ_TAC:tactic = fn (asl,w) =><br />

let<br />

val (lhs,rhs) = dest_eq w<br />

in<br />

let<br />

val (lhc, lha) = dest_comb lhs;<br />

val (rhc, rha ) = dest_comb rhs;<br />

in<br />

let<br />

val [a1,b1] = strip_pair lha;<br />

val [a2,b2] = strip_pair rha;<br />

in<br />

let<br />

val sg1 = mk_eq(a1,a2);<br />

val sg2 = mk_eq(b1,b2);<br />

in<br />

(<br />

[(asl,sg1), (asl,sg2)],<br />

fn [thm1,thm2] => MP<br />

(SPEC b2 (SPEC a2 (SPEC b1 (SPEC a1 (<br />

prove(‘‘!a1 b1 a2 b2. (a1=a2) /\ (b1=b2) ==><br />

(abs_frac(a1,b1)=abs_frac(a2,b2))‘‘, ARW_TAC[])<br />

)))))<br />

(CONJ thm1 thm2)<br />

)<br />

end<br />

end<br />

end<br />

end<br />

handle HOL_ERR _ => raise ERR "FRAC_EQ_TAC" "";<br />

(*--------------------------------------------------------------------------<br />

* DNM_POS_ASM_TAC : term -> tactic<br />

*<br />

*<br />

* ============== DNM_POS_ASM_TAC<br />

* A ?- 0 < t1<br />

*<br />

* If t1 is term representing the denominator of a fraction ‘‘dnm x‘‘


248<br />

* or a product of denominators ‘‘dnm x1 * dnm x2 * ... * dnm xn‘‘,<br />

* the fact that this term is positive is added to the assumptions.<br />

*--------------------------------------------------------------------------*)<br />

(* INT_MUL_POS_SIGN: |- !a b. 0 0 0 raise ERR "FRAC_NOT_NAN_ASM_TAC" "";<br />

(*--------------------------------------------------------------------------<br />

* NMR: thm<br />

* |- !a b. 0 < b ==> (nmr (abs_frac (a,b)) = a)<br />

*<br />

* DNM: thm<br />

* |- !a b. 0 < b ==> (dnm (abs_frac (a,b)) = b)<br />

*--------------------------------------------------------------------------*)<br />

(* FRAC_REP_ABS_SUBST: 0 < b |- (rep_frac (abs_frac (a,b)) = (a,b)) : thm *)<br />

val FRAC_REP_ABS_SUBST =<br />

let<br />

val lemma01 = prove( ‘‘(\f. 0 (nmr (abs_frac (a,b)) = a)‘‘,<br />

REPEAT STRIP_TAC THEN


249<br />

REWRITE_TAC[nmr_def] THEN<br />

REWRITE_TAC[FRAC_REP_ABS_SUBST] );<br />

(* DNM: !a b. 0 < b ==> (nmr (abs_frac (a,b)) = a) *)<br />

val DNM = store_thm("DNM", ‘‘!a b. 0 < b ==> (dnm (abs_frac (a,b)) = b)‘‘,<br />

REPEAT STRIP_TAC THEN<br />

REWRITE_TAC[dnm_def] THEN<br />

REWRITE_TAC[FRAC_REP_ABS_SUBST] );<br />

(*--------------------------------------------------------------------------<br />

* FRAC_ID: thm<br />

* |- !f. abs_frac (nmr f,dnm f) = f<br />

*--------------------------------------------------------------------------*)<br />

val FRAC_ID = store_thm("FRAC_ID", ‘‘!f. abs_frac (nmr f,dnm f) = f‘‘,<br />

STRIP_TAC THEN<br />

REWRITE_TAC[nmr_def,dnm_def]<br />

THEN ARW_TAC[FRAC_ABS_REP_SUBST]);<br />

(*--------------------------------------------------------------------------<br />

* FRAC_EXPLODE_THM: thm<br />

* |- !f a b. 0 < b ==> ((f = abs_frac(a,b)) = (nmr f = a) /\ (dnm f = b))<br />

*--------------------------------------------------------------------------*)<br />

val FRAC_EXPLODE_THM = store_thm("FRAC_EXPLODE_THM",<br />

‘‘!f a b. 0 < b ==> ((f = abs_frac (a,b)) = (nmr f = a) /\ (dnm f = b))‘‘,<br />

REPEAT STRIP_TAC THEN<br />

EQ_TAC THEN<br />

STRIP_TAC THEN<br />

ARW_TAC[NMR,DNM,FRAC_ID] );<br />

(*--------------------------------------------------------------------------<br />

* FRAC_ADD_ASSOC: thm<br />

* |- !a b c. add a (add b c) = add (add a b) c<br />

*<br />

* FRAC_MULT_ASSOC: thm<br />

* |- !a b c. mul a (mul b c) = mul (mul a b) c<br />

*--------------------------------------------------------------------------*)<br />

val FRAC_ADD_ASSOC = store_thm("FRAC_ADD_ASSOC",<br />

‘‘!a b c. add a (add b c) = add (add a b) c‘‘,<br />

REPEAT STRIP_TAC THEN REWRITE_TAC[add_def]<br />

THEN DNM_POS_ASM_TAC ‘‘dnm a * dnm b‘‘<br />

THEN DNM_POS_ASM_TAC ‘‘dnm b * dnm c‘‘<br />

THEN ARW_TAC[NMR,DNM]<br />

THEN FRAC_EQ_TAC THEN INT_RING_TAC );<br />

val FRAC_MULT_ASSOC = store_thm("FRAC_MULT_ASSOC",<br />

‘‘!a b c. mul a (mul b c) = mul (mul a b) c‘‘,<br />

REPEAT STRIP_TAC THEN REWRITE_TAC[mul_def]


250<br />

THEN DNM_POS_ASM_TAC ‘‘dnm a * dnm b‘‘<br />

THEN DNM_POS_ASM_TAC ‘‘dnm b * dnm c‘‘<br />

THEN ARW_TAC[NMR,DNM]<br />

THEN FRAC_EQ_TAC THEN INT_RING_TAC);<br />

(*--------------------------------------------------------------------------<br />

* FRAC_ADD_COMM: thm<br />

* |- !a b c. add a b = add b a<br />

*<br />

* FRAC_MULT_COMM: thm<br />

* |- !a b c. mul a b = mul b a<br />

*--------------------------------------------------------------------------*)<br />

val FRAC_ADD_COMM = store_thm("FRAC_ADD_COMM",<br />

‘‘!a b. add a b = add b a‘‘,<br />

REPEAT STRIP_TAC THEN<br />

REWRITE_TAC[add_def]<br />

THEN FRAC_EQ_TAC<br />

THEN INT_RING_TAC );<br />

val FRAC_MULT_COMM = store_thm("FRAC_MULT_COMM",<br />

‘‘!a b. mul a b = mul b a‘‘,<br />

REPEAT STRIP_TAC THEN<br />

REWRITE_TAC[mul_def]<br />

THEN FRAC_EQ_TAC THEN<br />

INT_RING_TAC );<br />

(*--------------------------------------------------------------------------<br />

* FRAC_ADD_RID: thm<br />

* |- !a. add a frac_0 = a<br />

*<br />

* FRAC_MUL_RID: thm<br />

* |- !a. mul a frac_1 = a<br />

*--------------------------------------------------------------------------*)<br />

val FRAC_ADD_RID = store_thm("FRAC_ADD_RID",‘‘!a. add a frac_0 = a‘‘,<br />

STRIP_TAC THEN<br />

REWRITE_TAC[add_def, frac_0_def]<br />

THEN ARW_TAC[NMR,DNM]<br />

THEN REWRITE_TAC[RING_NORM_CONV<br />

‘‘nmr a * 1 + 0 * dnma‘‘, RING_NORM_CONV ‘‘dnm a * 1‘‘]<br />

THEN ARW_TAC[FRAC_ID] );<br />

val FRAC_MUL_RID = store_thm("FRAC_MUL_RID",‘‘!a. mul a frac_1 = a‘‘,<br />

STRIP_TAC THEN<br />

REWRITE_TAC[mul_def, frac_1_def]<br />

THEN ARW_TAC[NMR,DNM]<br />

THEN REWRITE_TAC[RING_NORM_CONV ‘‘nmr a * 1‘‘, RING_NORM_CONV ‘‘dnm a * 1‘‘]<br />

THEN ARW_TAC[FRAC_ID] );


251<br />

(*--------------------------------------------------------------------------<br />

* FRAC_SUB_PLUS: thm<br />

* |- !a b c. sub a (add b c) = sub (sub a b) c<br />

*--------------------------------------------------------------------------*)<br />

val FRAC_SUB_PLUS = store_thm("FRAC_SUB_PLUS",<br />

‘‘!a b c. sub a (add b c) = sub (sub a b) c‘‘,<br />

REPEAT STRIP_TAC THEN REWRITE_TAC[add_def,sub_def,ainv_def]<br />

THEN DNM_POS_ASM_TAC ‘‘dnm a * dnm b‘‘<br />

THEN DNM_POS_ASM_TAC ‘‘dnm b * dnm c‘‘<br />

THEN DNM_POS_ASM_TAC ‘‘dnm b‘‘<br />

THEN DNM_POS_ASM_TAC ‘‘dnm c‘‘<br />

THEN ARW_TAC[NMR,DNM]<br />

THEN FRAC_EQ_TAC THEN<br />

INT_RING_TAC );<br />

(*--------------------------------------------------------------------------<br />

* FRAC_SUB_MINUS: thm<br />

* |- !a b c. sub a (sub b c) = add (sub a b) c<br />

*--------------------------------------------------------------------------*)<br />

val FRAC_SUB_MINUS = store_thm("FRAC_SUB_MINUS",<br />

‘‘!a b c. sub a (sub b c) = add (sub a b) c‘‘,<br />

REPEAT STRIP_TAC THEN REWRITE_TAC[add_def,sub_def,ainv_def]<br />

THEN DNM_POS_ASM_TAC ‘‘dnm a * dnm b‘‘<br />

THEN DNM_POS_ASM_TAC ‘‘dnm b * dnm c‘‘<br />

THEN DNM_POS_ASM_TAC ‘‘dnm b‘‘<br />

THEN DNM_POS_ASM_TAC ‘‘dnm c‘‘<br />

THEN ARW_TAC[NMR,DNM]<br />

THEN FRAC_EQ_TAC THEN<br />

INT_RING_TAC );<br />

(*--------------------------------------------------------------------------<br />

* SUB_AINV_THM: thm<br />

* |- !a b. sub a b = ainv (sub b a)<br />

*--------------------------------------------------------------------------*)<br />

val SUB_AINV_THM = store_thm("SUB_AINV_THM",<br />

‘‘!a b. sub a b = ainv (sub b a)‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[ainv_def, add_def, sub_def] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm a‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm b‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm b * dnm a‘‘ THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

FRAC_EQ_TAC THEN<br />

INT_RING_TAC );<br />

val _ = export_theory();


252<br />

A.3 fractionLib<br />

structure fractionLib :> fractionLib =<br />

struct<br />

open HolKernel boolLib Parse bossLib;<br />

(* interactive mode<br />

app load ["integerTheory","intLib","ringLib",<br />

"integerRingTheory","integerRingLib"];<br />

*)<br />

open<br />

pairTheory arithmeticTheory ringTheory ringLib<br />

integerTheory intLib integerRingTheory integerRingLib<br />

fractionTheory;<br />

val ARW_TAC = RW_TAC int_ss;<br />

val frac_bij = DB.fetch "fraction" "frac_tybij";<br />

(*--------------------------------------------------------------------------<br />

* FRAC_EQ_TAC : tactic<br />

*<br />

* A ?- abs_frac(a1,b1) = abs_frac(a2,b2)<br />

* ========================================= FRAC_EQ_TAC<br />

* A ?- a1=a2 | A ?- b1=b2<br />

*<br />

* Two fractions are equal, if the nominator and the denominator are<br />

* equal.<br />

*--------------------------------------------------------------------------*)<br />

val FRAC_EQ_TAC:tactic = fn (asl,w) =><br />

let<br />

val (lhs,rhs) = dest_eq w<br />

in<br />

let<br />

val (lhc, lha) = dest_comb lhs;<br />

val (rhc, rha ) = dest_comb rhs;<br />

in<br />

let<br />

val [a1,b1] = strip_pair lha;<br />

val [a2,b2] = strip_pair rha;<br />

in<br />

let<br />

val sg1 = mk_eq(a1,a2);<br />

val sg2 = mk_eq(b1,b2);<br />

in<br />

(<br />

[(asl,sg1), (asl,sg2)],<br />

fn [thm1,thm2] => MP


253<br />

(SPEC b2 (SPEC a2 (SPEC b1 (SPEC a1 (<br />

prove(‘‘!a1 b1 a2 b2. (a1=a2) /\ (b1=b2) ==><br />

(abs_frac(a1,b1)=abs_frac(a2,b2))‘‘, ARW_TAC[])<br />

)))))<br />

(CONJ thm1 thm2)<br />

)<br />

end<br />

end<br />

end<br />

end<br />

handle HOL_ERR _ => raise ERR "FRAC_EQ_TAC" "";<br />

(*--------------------------------------------------------------------------<br />

* DNM_POS_ASM_TAC : term -> tactic<br />

*<br />

*<br />

* ============== DNM_POS_ASM_TAC<br />

* A ?- 0 < t1<br />

*<br />

* If t1 is term representing the denominator of a fraction ‘‘dnm x‘‘<br />

* or a product of denominators ‘‘dnm x1 * dnm x2 * ... * dnm xn‘‘,<br />

* the fact that this term is positive is added to the assumptions.<br />

*--------------------------------------------------------------------------*)<br />

(* INT_MUL_POS_SIGN: |- !a b. 0 0 0 raise ERR "FRAC_NOT_NAN_ASM_TAC" "";<br />

(*--------------------------------------------------------------------------<br />

* NMR_CONV: conv<br />

* NMR_CONV ‘‘nmr (abs_frac (a,b))‘‘ = 0 < b |- (nmr (abs_frac (a,b)) = a)<br />

*<br />

* DNM_CONV: thm<br />

* DNM_CONV ‘‘dnm (abs_frac (a,b))‘‘ = 0 < b |- (dnm (abs_frac (a,b)) = a)


254<br />

*--------------------------------------------------------------------------*)<br />

val NMR_CONV:conv = fn term =><br />

let<br />

val (nmr,f) = dest_comb term;<br />

in<br />

let<br />

val (abs,args) = dest_comb f;<br />

in<br />

let<br />

val [a,b] = strip_pair args;<br />

in<br />

UNDISCH_ALL(SPEC b (SPEC a NMR))<br />

end<br />

end<br />

end<br />

handle HOL_ERR _ => raise ERR "NMR_CONV" "";<br />

val DNM_CONV:conv = fn term =><br />

let<br />

val (nmr,f) = dest_comb term;<br />

in<br />

let<br />

val (abs,args) = dest_comb f;<br />

in<br />

let<br />

val [a,b] = strip_pair args;<br />

in<br />

UNDISCH_ALL(SPEC b (SPEC a DNM))<br />

end<br />

end<br />

end<br />

handle HOL_ERR _ => raise ERR "DNM_CONV" "";<br />

end;<br />

A.4 rationalScript<br />

(*==========================================================================*)<br />

(* Theory of rational numbers. (Jens Brandt) *)<br />

(* *)<br />

(* The rational numbers are constructed as equivalence classes of fractions *)<br />

(* using the quotient theory of Peter Vincent Homeier *)<br />

(* *)<br />

(* February 2004 *)<br />

(* *)<br />

(*==========================================================================*)<br />

open HolKernel boolLib Parse bossLib;


255<br />

(* interactive mode<br />

app load ["fractionTheory", "fractionLib", "quotient"];<br />

*)<br />

open<br />

pairTheory arithmeticTheory ringTheory ringLib<br />

integerTheory intLib integerRingTheory integerRingLib<br />

fractionTheory fractionLib quotient;<br />

val _ = new_theory "rational";<br />

val ARW_TAC = RW_TAC int_ss;<br />

val frac_bij = DB.fetch "fraction" "frac_tybij";<br />

(*--------------------------------------------------------------------------*<br />

* some lemmas<br />

*--------------------------------------------------------------------------*)<br />

(* LESS_IMP_NOT_0: |- !n. 0i ~(n=0i) *)<br />

val LESS_IMP_NOT_0 = store_thm("LESS_IMP_NOT_0",<br />

‘‘!n:int. 0i ~(n=0i)‘‘,<br />

GEN_TAC THEN<br />

ASM_CASES_TAC ‘‘n=0i‘‘<br />

THEN ARW_TAC[] );<br />

(* INT_EQ_RMUL_EXP: |- !a b n. 0 ((a=b) = (a*n=b*n)) *)<br />

val INT_EQ_RMUL_EXP = store_thm("INT_EQ_RMUL_EXP",<br />

‘‘!a:int b:int n:int. 0 ((a=b) = (a*n=b*n))‘‘,<br />

REPEAT STRIP_TAC<br />

THEN EQ_TAC<br />

THEN ASSUME_TAC (prove(‘‘0i ~(n=0i)‘‘,<br />

ASM_CASES_TAC ‘‘n=0i‘‘ THEN ARW_TAC[]))<br />

THEN ASSUME_TAC (SPEC ‘‘n:int‘‘ (SPEC ‘‘b:int‘‘<br />

(SPEC ‘‘a:int‘‘ INT_EQ_RMUL_IMP)))<br />

THEN ARW_TAC[] );<br />

(* INT_LT_RMUL_EXP: |- !a b n. 0 ((ab*n<br />

REPEAT STRIP_TAC THEN<br />

REWRITE_TAC[int_gt] THEN<br />

ASSUME_TAC (UNDISCH_ALL (GSYM (SPEC ‘‘a:int‘‘ (SPEC ‘‘b:int‘‘<br />

(SPEC ‘‘n:int‘‘ INT_LT_MONO))))) THEN<br />

ARW_TAC[INT_MUL_SYM] );


256<br />

(* ABS_NOT_0_POSITIVE: |- !x:int. ~(x = 0i) ==> 0i < ABS x *)<br />

val ABS_NOT_0_POSITIVE = store_thm("ABS_NOT_0_POSITIVE",<br />

‘‘!x:int. ~(x = 0i) ==> 0i < ABS x‘‘,<br />

REPEAT STRIP_TAC THEN<br />

REWRITE_TAC[INT_ABS] THEN<br />

ASM_CASES_TAC ‘‘x rat_equiv a c *)<br />

val RAT_EQUIV_TRANS =<br />

let<br />

val subst01 = prove(<br />

‘‘(nmr a * dnm b = nmr b * dnm a) =<br />

(nmr a * dnm b * dnm c * dnm c = nmr b * dnm a * dnm c * dnm c)‘‘,<br />

DNM_POS_ASM_TAC ‘‘dnm c * dnm c‘‘ THEN<br />

ASSUME_TAC (SPEC ‘‘dnm c * dnm c‘‘ (SPEC ‘‘nmr b * dnm a‘‘


257<br />

(SPEC ‘‘nmr a * dnm b‘‘ INT_EQ_RMUL_EXP))) THEN<br />

ARW_TAC[INT_MUL_ASSOC]);<br />

val subst02 = prove(<br />

‘‘(nmr b * dnm c = nmr c * dnm b) =<br />

(nmr b * dnm c * dnm a * dnm c = nmr c * dnm b * dnm a * dnm c)‘‘,<br />

DNM_POS_ASM_TAC ‘‘dnm a * dnm c‘‘ THEN<br />

ASSUME_TAC (SPEC ‘‘dnm a * dnm c‘‘ (SPEC ‘‘nmr c * dnm b‘‘<br />

(SPEC ‘‘nmr b * dnm c‘‘ INT_EQ_RMUL_EXP))) THEN<br />

ARW_TAC[INT_MUL_ASSOC]);<br />

val subst03 = prove(<br />

‘‘(nmr a * dnm c = nmr c * dnm a) =<br />

(nmr a * dnm c * dnm b * dnm c = nmr c * dnm a * dnm b * dnm c)‘‘,<br />

DNM_POS_ASM_TAC ‘‘dnm b * dnm c‘‘ THEN<br />

ASSUME_TAC (SPEC ‘‘dnm b * dnm c‘‘ (SPEC ‘‘nmr c * dnm a‘‘<br />

(SPEC ‘‘nmr a * dnm c‘‘ INT_EQ_RMUL_EXP))) THEN<br />

ARW_TAC[INT_MUL_ASSOC]);<br />

val subst11 =<br />

EQT_ELIM (AC_CONV (INT_MUL_ASSOC,INT_MUL_SYM)<br />

‘‘nmr a * dnm b * dnm c * dnm c<br />

= nmr a * dnm c * dnm b * dnm c‘‘);<br />

val subst12 =<br />

EQT_ELIM (AC_CONV (INT_MUL_ASSOC,INT_MUL_SYM)<br />

‘‘nmr b * dnm a * dnm c * dnm c<br />

= nmr b * dnm c * dnm a * dnm c‘‘);<br />

val subst13 =<br />

EQT_ELIM (AC_CONV (INT_MUL_ASSOC,INT_MUL_SYM)<br />

‘‘nmr c * dnm b * dnm a * dnm c<br />

= nmr c * dnm a * dnm b * dnm c‘‘);<br />

in<br />

store_thm("RAT_EQUIV_TRANS",<br />

‘‘!a b c. rat_equiv a b /\ rat_equiv b c ==> rat_equiv a c‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[rat_equiv_def] THEN<br />

SUBST_TAC[subst01, subst02, subst03] THEN<br />

SUBST_TAC[subst11, subst12, subst13] THEN<br />

REPEAT STRIP_TAC THEN<br />

ASM_REWRITE_TAC[] )<br />

end;<br />

(*--------------------------------------------------------------------------*<br />

* RAT_EQUIV_ALT<br />

*<br />

* |- !a. rat_equiv a =<br />

* \x. (?b c. 0


258<br />

*<br />

* alternative representation of equivalence relation<br />

*--------------------------------------------------------------------------*)<br />

val RAT_EQUIV_ALT =<br />

let<br />

val lemma1 = prove(‘‘! x y. 0 0 < dnm x * y‘‘,<br />

REPEAT GEN_TAC THEN DNM_POS_ASM_TAC ‘‘dnm x‘‘ THEN<br />

ARW_TAC[INT_MUL_POS_SIGN]);<br />

val lemma2 = prove(<br />

‘‘(abs_frac (nmr a * b,dnm a * b) = abs_frac (nmr f * c,dnm f * c))<br />

==> (rep_frac (abs_frac (nmr a * b,dnm a * b))<br />

= rep_frac (abs_frac (nmr f * c,dnm f * c)))‘‘, ARW_TAC[]);<br />

(* lemma3: 0 < dnm a * b |=<br />

rep_frac (abs_frac (nmr a * b,dnm a * b)) = (nmr a * b,dnm a * b) *)<br />

val lemma3 = UNDISCH_ALL (REWRITE_RULE[SND]<br />

(#1 (EQ_IMP_RULE (SPEC ‘‘(nmr a * b,dnm a * b)‘‘<br />

(BETA_RULE (CONJUNCT2 frac_bij))))));<br />

(* lemma4: 0 < dnm f * c |=<br />

rep_frac (abs_frac (nmr f * c,dnm f * c)) = (nmr f * c,dnm f * c) *)<br />

val lemma4 = UNDISCH_ALL (REWRITE_RULE[SND]<br />

(#1 (EQ_IMP_RULE (SPEC ‘‘(nmr f * c,dnm f * c)‘‘<br />

(BETA_RULE (CONJUNCT2 frac_bij))))));<br />

in<br />

val subst1 = UNDISCH_ALL (SPEC ‘‘b:int‘‘<br />

(SPEC ‘‘nmr f * dnm a‘‘ (SPEC ‘‘nmr a * dnm f‘‘ INT_EQ_RMUL_EXP)));<br />

val subst2 = UNDISCH_ALL (SPEC ‘‘c:int‘‘<br />

(SPEC ‘‘nmr f * dnm a * b‘‘ (SPEC ‘‘nmr a * dnm f * b‘‘<br />

INT_EQ_RMUL_EXP)));<br />

store_thm("RAT_EQUIV_ALT",<br />

‘‘!a. rat_equiv a = \x. (?b c. 0


259<br />

end;<br />

,<br />

])<br />

ARW_TAC[] THEN<br />

UNDISCH_TAC ‘‘abs_frac(nmr a * nmr (abs_frac (b,b)),<br />

dnm a * dnm (abs_frac (b,b))) = abs_frac(nmr f<br />

* nmr (abs_frac (c,c)),dnm f * dnm (abs_frac (c,c)))‘‘ THEN<br />

REWRITE_TAC[NMR_CONV ‘‘nmr (abs_frac (b,b))‘‘,<br />

NMR_CONV ‘‘nmr (abs_frac (c,c))‘‘, DNM_CONV ‘‘dnm<br />

(abs_frac (b,b))‘‘, DNM_CONV ‘‘dnm (abs_frac (c,c))‘‘] THEN<br />

ASSUME_TAC (UNDISCH_ALL (SPEC ‘‘b:int‘‘<br />

(SPEC ‘‘a:frac‘‘ lemma1))) THEN<br />

ASSUME_TAC (UNDISCH_ALL<br />

(SPEC ‘‘c:int‘‘ (SPEC ‘‘f:frac‘‘ lemma1))) THEN<br />

STRIP_TAC THEN<br />

ASSUME_TAC (UNDISCH_ALL lemma2) THEN<br />

UNDISCH_TAC ‘‘rep_frac (abs_frac (nmr a * b,dnm a * b))<br />

= rep_frac (abs_frac (nmr f * c,dnm f * c))‘‘ THEN<br />

SUBST_TAC[lemma3,lemma4] THEN<br />

ARW_TAC[] THEN<br />

REWRITE_TAC[subst1, subst2] THEN<br />

REWRITE_TAC[EQT_ELIM(RING_CONV<br />

‘‘nmr a * dnm f * b * c = (nmr a * b) * dnm f * c‘‘)] THEN<br />

ARW_TAC[] THEN<br />

REWRITE_TAC[EQT_ELIM (RING_CONV<br />

‘‘nmr f * b * dnm a * c = (dnm a * b) * nmr f * c‘‘)] THEN<br />

ARW_TAC[]<br />

(*--------------------------------------------------------------------------*<br />

* type definition<br />

*--------------------------------------------------------------------------*)<br />

val rat_def = define_quotient_type "rat"<br />

"abs_rat"<br />

"rep_rat"<br />

RAT_EQUIV_REF RAT_EQUIV_SYM RAT_EQUIV_TRANS;<br />

(*--------------------------------------------------------------------------*<br />

* operations<br />

*--------------------------------------------------------------------------*)<br />

(* numerator, denominator, sign of a fraction *)<br />

val rat_nmr_def = Define ‘rat_nmr r = nmr (rep_rat r)‘;<br />

val rat_dnm_def = Define ‘rat_dnm r = dnm (rep_rat r)‘;<br />

val rat_sgn_def = Define ‘rat_sgn r = sgn (rep_rat r)‘;<br />

(* additive, multiplicative inverse of a fraction *)<br />

val rat_0_def = Define ‘rat_0 = abs_rat( frac_0 )‘;<br />

val rat_1_def = Define ‘rat_1 = abs_rat( frac_1 )‘;


260<br />

(* neutral elements *)<br />

val rat_ainv_def = Define ‘rat_ainv r1 = abs_rat( ainv (rep_rat r1))‘;<br />

val rat_minv_def = Define ‘rat_minv r1 = abs_rat( minv (rep_rat r1))‘;<br />

(* less (absolute value) *)<br />

val rat_les_abs_def = Define<br />

‘rat_les_abs r1 r2 = les_abs (rep_rat r1) (rep_rat r2)‘;<br />

(* basic arithmetics *)<br />

val rat_add_def = Define<br />

‘rat_add r1 r2 = abs_rat( add (rep_rat r1) (rep_rat r2) )‘;<br />

val rat_sub_def = Define<br />

‘rat_sub r1 r2 = abs_rat( sub (rep_rat r1) (rep_rat r2) )‘;<br />

val rat_mul_def = Define<br />

‘rat_mul r1 r2 = abs_rat( mul (rep_rat r1) (rep_rat r2) )‘;<br />

val rat_div_def = Define<br />

‘rat_div r1 r2 = abs_rat( div (rep_rat r1) (rep_rat r2) )‘;<br />

(*--------------------------------------------------------------------------<br />

* REP_ABS_EQUIV<br />

*--------------------------------------------------------------------------*)<br />

val REP_ABS_EQUIV = prove(<br />

‘‘!a. rat_equiv a (rep_rat (abs_rat a))‘‘,<br />

GEN_TAC THEN<br />

REWRITE_TAC[CONJUNCT2 rat_def] THEN<br />

REWRITE_TAC[CONJUNCT1 rat_def]);<br />

val REP_ABS_DFN_EQUIV = prove(<br />

‘‘!x. nmr x * dnm (rep_rat(abs_rat x))<br />

= nmr (rep_rat(abs_rat x)) * dnm x‘‘,<br />

GEN_TAC THEN<br />

REWRITE_TAC[GSYM rat_equiv_def] THEN<br />

ARW_TAC[REP_ABS_EQUIV] );<br />

(* |- !r’ r. (abs_rat r = abs_rat r’) = rat_equiv r r’ *)<br />

val RAT_ABS_EQUIV = GEN_ALL (SYM (SPEC_ALL (CONJUNCT2 rat_def)));<br />

val RAT_ABS_EQUIV_TAC = REWRITE_TAC[RAT_ABS_EQUIV];<br />

val RAT_IMP_EQUIV = prove(‘‘!r1 r2. (r1 = r2) ==> rat_equiv r1 r2‘‘,<br />

REPEAT STRIP_TAC THEN<br />

REWRITE_TAC[rat_equiv_def]<br />

THEN ARW_TAC[]);<br />

val RAT_EQUIV_TRANS_IMP = prove(<br />

‘‘!a b c. rat_equiv a b ==> (rat_equiv a c = rat_equiv b c)‘‘,<br />

REPEAT STRIP_TAC THEN


261<br />

ASM_CASES_TAC ‘‘rat_equiv b c‘‘ THENL [<br />

PROVE_TAC[RAT_EQUIV_TRANS]<br />

,<br />

ASSUME_TAC (CONTRAPOS (SPEC ‘‘c:frac‘‘<br />

(SPEC ‘‘a:frac‘‘ (SPEC ‘‘b:frac‘‘ RAT_EQUIV_TRANS)))) THEN<br />

UNDISCH_TAC ‘‘~rat_equiv b c<br />

==> ~(rat_equiv b a /\ rat_equiv a c)‘‘ THEN<br />

ARW_TAC[RAT_EQUIV_SYM]<br />

]);<br />

val RAT_ADD_EQUIV_ARG = prove(<br />

‘‘!x y z. rat_equiv x y ==> rat_equiv (add x z) (add y z)‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[rat_equiv_def] THEN<br />

STRIP_TAC THEN<br />

REWRITE_TAC[add_def] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm x * dnm z‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm y * dnm z‘‘ THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

REWRITE_TAC[INT_RDISTRIB] THEN<br />

REWRITE_TAC[EQT_ELIM (AC_CONV (INT_MUL_ASSOC,INT_MUL_COMM)<br />

‘‘nmr x * dnm z * (dnm y * dnm z) = nmr x * dnm y * dnm z * dnm z‘‘)] THEN<br />

ASM_REWRITE_TAC[] THEN<br />

INT_RING_TAC);<br />

(* funktioniert nicht, bestimmt wegen Änderung in REP_ABS_EQUIV *)<br />

(*val RAT_ADD_REP_ABS_ARG = prove(<br />

‘‘!a b c. rat_equiv (add a b) c = rat_equiv (rep_rat (abs_rat (add a b))) c‘‘,<br />

REPEAT GEN_TAC THEN<br />

MATCH_MP_TAC RAT_EQUIV_TRANS_IMP THEN<br />

ONCE_REWRITE_TAC[RAT_EQUIV_SYM] THEN<br />

ARW_TAC[REP_ABS_EQUIV]);*)<br />

(*--------------------------------------------------------------------------<br />

* NMR_EQ0_CONG: thm<br />

* |- !f1. (nmr (rep_rat (abs_rat f1)) = 0) = (nmr f1 = 0)<br />

*<br />

* NMR_LT0_CONG: thm<br />

* |- !f1. (nmr (rep_rat (abs_rat f1)) < 0) = (nmr f1 < 0)<br />

*<br />

* NMR_GT0_CONG: thm<br />

* |- !f1. (nmr (rep_rat (abs_rat f1)) > 0) = (nmr f1 > 0)<br />

*<br />

*--------------------------------------------------------------------------*)<br />

val NMR_EQ0_CONG =<br />

let<br />

val subst1 = UNDISCH_ALL (SPEC ‘‘dnm f1‘‘ (SPEC ‘‘0i‘‘<br />

(SPEC ‘‘nmr (rep_rat (abs_rat f1))‘‘ INT_EQ_RMUL_EXP)));<br />

val subst2 = UNDISCH_ALL (SPEC ‘‘dnm (rep_rat (abs_rat f1))‘‘


262<br />

(SPEC ‘‘0i‘‘ (SPEC ‘‘nmr f1‘‘ INT_EQ_RMUL_EXP)));<br />

in<br />

store_thm("NMR_EQ0_CONG",<br />

‘‘!f1. (nmr (rep_rat (abs_rat f1)) = 0) = (nmr f1 = 0)‘‘,<br />

GEN_TAC THEN<br />

DNM_POS_ASM_TAC ‘‘dnm f1‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat (abs_rat f1))‘‘ THEN<br />

SUBST_TAC[subst1,subst2] THEN<br />

REWRITE_TAC[INT_MUL_LZERO] THEN<br />

ARW_TAC[REP_ABS_DFN_EQUIV] )<br />

end;<br />

val NMR_LT0_CONG =<br />

let<br />

val subst1 = UNDISCH_ALL (SPEC ‘‘dnm f1‘‘ (SPEC ‘‘0i‘‘<br />

(SPEC ‘‘nmr (rep_rat (abs_rat f1))‘‘ INT_LT_RMUL_EXP)));<br />

val subst2 = UNDISCH_ALL (SPEC ‘‘dnm (rep_rat (abs_rat f1))‘‘<br />

(SPEC ‘‘0i‘‘ (SPEC ‘‘nmr f1‘‘ INT_LT_RMUL_EXP)));<br />

in<br />

store_thm("NMR_LT0_CONG",<br />

‘‘!f1. (nmr (rep_rat (abs_rat f1)) < 0) = (nmr f1 < 0)‘‘,<br />

GEN_TAC THEN<br />

DNM_POS_ASM_TAC ‘‘dnm f1‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat (abs_rat f1))‘‘ THEN<br />

SUBST_TAC[subst1,subst2] THEN<br />

REWRITE_TAC[INT_MUL_LZERO] THEN<br />

ARW_TAC[REP_ABS_DFN_EQUIV] )<br />

end;<br />

val NMR_GT0_CONG =<br />

let<br />

val subst1 = UNDISCH_ALL (SPEC ‘‘dnm f1‘‘ (SPEC ‘‘0i‘‘<br />

(SPEC ‘‘nmr (rep_rat (abs_rat f1))‘‘ INT_GT_RMUL_EXP)));<br />

val subst2 = UNDISCH_ALL (SPEC ‘‘dnm (rep_rat (abs_rat f1))‘‘<br />

(SPEC ‘‘0i‘‘ (SPEC ‘‘nmr f1‘‘ INT_GT_RMUL_EXP)));<br />

in<br />

store_thm("NMR_GT0_CONG",<br />

‘‘!f1. (nmr (rep_rat (abs_rat f1)) > 0) = (nmr f1 > 0)‘‘,<br />

GEN_TAC THEN<br />

DNM_POS_ASM_TAC ‘‘dnm f1‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat (abs_rat f1))‘‘ THEN<br />

SUBST_TAC[subst1,subst2] THEN<br />

REWRITE_TAC[INT_MUL_LZERO] THEN<br />

ARW_TAC[REP_ABS_DFN_EQUIV] )<br />

end;<br />

(*--------------------------------------------------------------------------<br />

* SGN_CONG: thm<br />

* |- !f1. sgn (rep_rat (abs_rat f1)) = sgn f1<br />

*--------------------------------------------------------------------------*)


263<br />

val SGN_CONG = store_thm("SGN_CONG",<br />

‘‘!f1. sgn (rep_rat (abs_rat f1)) = sgn f1‘‘,<br />

GEN_TAC THEN<br />

REWRITE_TAC[sgn_def] THEN<br />

ARW_TAC[NMR_EQ0_CONG, NMR_LT0_CONG] );<br />

(*--------------------------------------------------------------------------<br />

* RAT_AINV_CONG: thm<br />

* |- !x. abs_rat (ainv (rep_rat (abs_rat x))) = abs_rat (ainv x)<br />

*--------------------------------------------------------------------------*)<br />

val RAT_AINV_CONG = store_thm("RAT_AINV_CONG",<br />

‘‘!x. abs_rat (ainv (rep_rat (abs_rat x))) = abs_rat (ainv x)‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[RAT_ABS_EQUIV] THEN<br />

REWRITE_TAC[rat_equiv_def,ainv_def] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm x‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat (abs_rat x))‘‘ THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

REWRITE_TAC[INT_MUL_CALCULATE,INT_EQ_NEG] THEN<br />

REWRITE_TAC[GSYM rat_equiv_def] THEN<br />

ONCE_REWRITE_TAC[RAT_EQUIV_SYM] THEN<br />

ARW_TAC[REP_ABS_EQUIV] );<br />

(*--------------------------------------------------------------------------<br />

* RAT_MINV_CONG: thm<br />

* |- !x. ~(nmr x=0) ==><br />

* (abs_rat (minv (rep_rat (abs_rat x))) = abs_rat (minv x))<br />

*--------------------------------------------------------------------------*)<br />

val RAT_MINV_CONG =<br />

let<br />

val lemmaX = store_thm("RAT_MINV_CONG",<br />

‘‘0 < ABS (nmr x) ==> 0 < ABS (nmr (rep_rat (abs_rat x)))‘‘,<br />

REWRITE_TAC[INT_ABS] THEN<br />

REWRITE_TAC[NMR_LT0_CONG] THEN<br />

ARW_TAC[] THENL<br />

[<br />

ONCE_REWRITE_TAC[GSYM INT_NEG_0] THEN<br />

ONCE_REWRITE_TAC[INT_LT_NEG] THEN<br />

PROVE_TAC[NMR_LT0_CONG]<br />

,<br />

UNDISCH_TAC ‘‘0 < nmr x‘‘ THEN<br />

REWRITE_TAC[GSYM int_gt] THEN<br />

PROVE_TAC[NMR_GT0_CONG]<br />

] );<br />

val lemmaY = prove(‘‘!x:int. 0 (ABS x = x)‘‘,<br />

GEN_TAC THEN<br />

REWRITE_TAC[INT_ABS] THEN


264<br />

in<br />

ARW_TAC[] THEN<br />

PROVE_TAC[INT_LT_ANTISYM] );<br />

prove(‘‘!x. ~(nmr x=0) ==><br />

(abs_rat (minv (rep_rat (abs_rat x))) = abs_rat (minv x))‘‘,<br />

end;<br />

REPEAT STRIP_TAC THEN<br />

REWRITE_TAC[minv_def] THEN<br />

ASSUME_TAC (UNDISCH_ALL (SPEC ‘‘nmr x‘‘ ABS_NOT_0_POSITIVE)) THEN<br />

ASSUME_TAC (UNDISCH_ALL lemmaX) THEN<br />

RAT_ABS_EQUIV_TAC THEN<br />

REWRITE_TAC[rat_equiv_def] THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm x‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat (abs_rat x))‘‘ THEN<br />

ONCE_REWRITE_TAC[UNDISCH_ALL (GSYM (SPEC ‘‘dnm x‘‘ lemmaY)),<br />

UNDISCH_ALL (GSYM (SPEC ‘‘dnm (rep_rat (abs_rat x))‘‘ lemmaY))] THEN<br />

REWRITE_TAC[SGN_CONG] THEN<br />

REWRITE_TAC[EQT_ELIM (AC_CONV (INT_MUL_ASSOC,INT_MUL_SYM)<br />

‘‘sgn x * ABS (dnm (rep_rat (abs_rat x))) * ABS (nmr x)<br />

= sgn x * (ABS (dnm (rep_rat (abs_rat x))) * ABS (nmr x))‘‘)] THEN<br />

REWRITE_TAC[EQT_ELIM (AC_CONV (INT_MUL_ASSOC,INT_MUL_SYM)<br />

‘‘sgn x * ABS (dnm x) * ABS (nmr (rep_rat (abs_rat x)))<br />

= sgn x * (ABS (dnm x) * ABS (nmr (rep_rat (abs_rat x))))‘‘)] THEN<br />

REWRITE_TAC[INT_ABS_MUL] THEN<br />

REWRITE_TAC[INT_EQ_LMUL] THEN<br />

DISJ2_TAC THEN<br />

ONCE_REWRITE_TAC[INT_MUL_SYM] THEN<br />

REWRITE_TAC[REP_ABS_DFN_EQUIV] )<br />

(*--------------------------------------------------------------------------<br />

* RAT_ADD_CONG1: thm<br />

* |- !x y. abs_rat (add (rep_rat (abs_rat x)) y) = abs_rat (add x y)<br />

*<br />

* RAT_ADD_CONG2: thm<br />

* |- !x y. abs_rat (add x (rep_rat (abs_rat y))) = abs_rat (add x y)<br />

*<br />

* RAT_ADD_CONG: thm<br />

* |- !x y. abs_rat (add (rep_rat (abs_rat x)) y) = abs_rat (add x y) /\<br />

* !x y. abs_rat (add x (rep_rat (abs_rat y))) = abs_rat (add x y)<br />

*--------------------------------------------------------------------------*)<br />

val RAT_ADD_CONG1 =<br />

let<br />

val lemmaX = prove(<br />

‘‘!a:int b:int c:int d:int. (a + b = c + d) = (a - c = d - b)‘‘,<br />

REWRITE_TAC[SPEC ‘‘b:int‘‘ (SPEC ‘‘d:int‘‘


265<br />

in<br />

(SPEC ‘‘a:int - c:int‘‘ INT_EQ_SUB_LADD))] THEN<br />

ONCE_REWRITE_TAC[EQT_ELIM (intLib.ARITH_CONV<br />

‘‘(a:int) - (c:int) + (b:int) = a + b - c‘‘)] THEN<br />

REWRITE_TAC[SPEC ‘‘d:int‘‘ (SPEC ‘‘c:int‘‘<br />

(SPEC ‘‘(a:int) + (b:int)‘‘ INT_EQ_SUB_RADD)) ] THEN<br />

ARW_TAC[EQT_ELIM (intLib.ARITH_CONV ‘‘(d:int) + (c:int) = c + d‘‘)] );<br />

val lemmaY = prove(‘‘!a:int b:int. 0 ( (a*b=0)=(a=0) )‘‘,<br />

REPEAT STRIP_TAC THEN<br />

EQ_TAC THENL<br />

[<br />

SUBST_TAC[UNDISCH_ALL (SPEC ‘‘b:int‘‘ (SPEC ‘‘0i‘‘ (SPEC ‘‘a:int‘‘<br />

INT_EQ_RMUL_EXP)))] THEN<br />

ASM_REWRITE_TAC[] THEN<br />

ARW_TAC[INT_MUL_LZERO]<br />

,<br />

ARW_TAC[INT_MUL_LZERO]<br />

]);<br />

val subst1 = UNDISCH_ALL (SPEC ‘‘dnm y‘‘<br />

(SPEC ‘‘(nmr x * (dnm (rep_rat (abs_rat x)) * dnm y)<br />

+ nmr y * dnm x * dnm (rep_rat (abs_rat x)))‘‘<br />

(SPEC ‘‘(nmr (rep_rat (abs_rat x)) * dnm x * dnm y<br />

+ nmr y * dnm (rep_rat (abs_rat x)) * dnm x)‘‘<br />

(GSYM INT_EQ_RMUL_EXP))));<br />

store_thm("RAT_ADD_CONG1",<br />

‘‘!x y. abs_rat (add (rep_rat (abs_rat x)) y) = abs_rat (add x y)‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[RAT_ABS_EQUIV] THEN<br />

REWRITE_TAC[rat_equiv_def,add_def] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm x * dnm y‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat (abs_rat x)) * dnm y‘‘ THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

REWRITE_TAC[INT_RDISTRIB] THEN<br />

REWRITE_TAC[EQT_ELIM (<br />

RING_CONV ‘‘ nmr (rep_rat (abs_rat x)) * dnm y<br />

* (dnm x * dnm y) + nmr y * dnm (rep_rat (abs_rat x))<br />

* (dnm x * dnm y) = (nmr (rep_rat (abs_rat x)) * dnm x<br />

* dnm y + nmr y * dnm (rep_rat (abs_rat x)) * dnm x)<br />

* dnm y‘‘)] THEN<br />

REWRITE_TAC[EQT_ELIM (RING_CONV ‘‘ nmr x * dnm y<br />

* (dnm (rep_rat (abs_rat x)) * dnm y) + nmr y * dnm x<br />

* (dnm (rep_rat (abs_rat x)) * dnm y)=(nmr x<br />

* (dnm (rep_rat (abs_rat x)) * dnm y) + nmr y<br />

* dnm x * (dnm (rep_rat (abs_rat x)))) * dnm y‘‘)] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm y‘‘ THEN<br />

SUBST_TAC[subst1] THEN<br />

REWRITE_TAC[EQT_ELIM (RING_CONV ‘‘nmr x<br />

* (dnm (rep_rat (abs_rat x)) * dnm y) = nmr x<br />

* dnm (rep_rat (abs_rat x)) * dnm y‘‘)] THEN<br />

REWRITE_TAC[EQT_ELIM (RING_CONV ‘‘nmr y * dnm x


266<br />

end;<br />

* dnm (rep_rat (abs_rat x)) = nmr y * (dnm x<br />

* dnm (rep_rat (abs_rat x)))‘‘)] THEN<br />

REWRITE_TAC[EQT_ELIM (RING_CONV ‘‘nmr y * dnm (rep_rat (abs_rat x))<br />

* dnm x = nmr y * (dnm (rep_rat (abs_rat x)) * dnm x)‘‘)] THEN<br />

ARW_TAC[lemmaX] THEN<br />

REWRITE_TAC[GSYM INT_SUB_LDISTRIB, GSYM INT_SUB_RDISTRIB] THEN<br />

REWRITE_TAC[EQT_ELIM (RING_CONV<br />

‘‘dnm x * dnm (rep_rat (abs_rat x))<br />

= dnm (rep_rat (abs_rat x)) * dnm x‘‘)] THEN<br />

ARW_TAC[INT_MUL_RZERO,INT_SUB_REFL] THEN<br />

ARW_TAC[lemmaY] THEN<br />

ARW_TAC[INT_EQ_SUB_LADD, INT_ADD_LID] THEN<br />

REWRITE_TAC[GSYM rat_equiv_def] THEN<br />

ARW_TAC[GSYM REP_ABS_EQUIV] )<br />

val RAT_ADD_CONG2 = store_thm("RAT_ADD_CONG",<br />

‘‘!x y. abs_rat (add x (rep_rat (abs_rat y))) = abs_rat (add x y)‘‘,<br />

ONCE_REWRITE_TAC[FRAC_ADD_COMM] THEN<br />

ARW_TAC[RAT_ADD_CONG1]);<br />

val RAT_ADD_CONG = save_thm<br />

("RAT_ADD_CONG", CONJ RAT_ADD_CONG1 RAT_ADD_CONG2);<br />

(*--------------------------------------------------------------------------<br />

* RAT_MULT_CONG1: thm<br />

* |- !x y. abs_rat (mul (rep_rat (abs_rat x)) y) = abs_rat (mul x y)<br />

*<br />

* RAT_MULT_CONG2: thm<br />

* |- !x y. abs_rat (mul x (rep_rat (abs_rat y))) = abs_rat (mul x y)<br />

*<br />

* RAT_MULT_CONG: thm<br />

* |- !x y. abs_rat (mul (rep_rat (abs_rat x)) y) = abs_rat (mul x y) /\<br />

* !x y. abs_rat (mul x (rep_rat (abs_rat y))) = abs_rat (mul x y)<br />

*--------------------------------------------------------------------------*)<br />

val RAT_MULT_CONG1 = store_thm("RAT_MULT_CONG1",<br />

‘‘!x y. abs_rat (mul (rep_rat (abs_rat x)) y) = abs_rat (mul x y)‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[RAT_ABS_EQUIV] THEN<br />

REWRITE_TAC[rat_equiv_def,mul_def] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm x * dnm y‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat (abs_rat x)) * dnm y‘‘ THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

REWRITE_TAC[EQT_ELIM (RING_CONV ‘‘nmr (rep_rat (abs_rat x))<br />

* nmr y * (dnm x * dnm y) = nmr (rep_rat (abs_rat x)) *dnm x<br />

* nmr y * dnm y‘‘)] THEN<br />

REWRITE_TAC[EQT_ELIM (RING_CONV ‘‘nmr x * nmr y<br />

* (dnm (rep_rat (abs_rat x)) * dnm y) = nmr x


267<br />

* dnm (rep_rat (abs_rat x)) * nmr y * dnm y‘‘)] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm y‘‘ THEN<br />

REWRITE_TAC[INT_EQ_RMUL] THEN<br />

ARW_TAC[LESS_IMP_NOT_0] THEN<br />

ASM_CASES_TAC ‘‘nmr y=0‘‘ THENL<br />

[<br />

ARW_TAC[]<br />

,<br />

ARW_TAC[] THEN<br />

REWRITE_TAC[GSYM rat_equiv_def] THEN<br />

ONCE_REWRITE_TAC[RAT_EQUIV_SYM] THEN<br />

ARW_TAC[REP_ABS_EQUIV]<br />

] );<br />

val RAT_MULT_CONG2 = store_thm("RAT_MULT_CONG2",<br />

‘‘!x y. abs_rat (mul x (rep_rat (abs_rat y))) = abs_rat (mul x y)‘‘,<br />

ONCE_REWRITE_TAC[FRAC_MULT_COMM] THEN<br />

ARW_TAC[RAT_MULT_CONG1]);<br />

val RAT_MULT_CONG =<br />

save_thm("RAT_MULT_CONG", CONJ RAT_MULT_CONG1 RAT_MULT_CONG2);<br />

(*--------------------------------------------------------------------------<br />

* RAT_SUB_CONG1: thm<br />

* |- !x y. abs_rat (sub (rep_rat (abs_rat x)) y) = abs_rat (sub x y)<br />

*<br />

* RAT_SUB_CONG2: thm<br />

* |- !x y. abs_rat (sub x (rep_rat (abs_rat y))) = abs_rat (sub x y)<br />

*<br />

* RAT_SUB_CONG: thm<br />

* |- !x y. abs_rat (sub (rep_rat (abs_rat x)) y) = abs_rat (sub x y) /\<br />

* !x y. abs_rat (sub x (rep_rat (abs_rat y))) = abs_rat (sub x y)<br />

*--------------------------------------------------------------------------*)<br />

val RAT_SUB_CONG1 = store_thm("RAT_SUB_CONG1",<br />

‘‘!x y. abs_rat (sub (rep_rat (abs_rat x)) y) = abs_rat (sub x y)‘‘,<br />

REWRITE_TAC[sub_def] THEN<br />

ARW_TAC[RAT_ADD_CONG]);<br />

val RAT_SUB_CONG2 = store_thm("RAT_SUB_CONG2",<br />

‘‘!x y. abs_rat (sub x (rep_rat (abs_rat y))) = abs_rat (sub x y)‘‘,<br />

ONCE_REWRITE_TAC[SUB_AINV_THM] THEN<br />

ONCE_REWRITE_TAC[GSYM RAT_AINV_CONG] THEN<br />

ARW_TAC[RAT_SUB_CONG1] );<br />

val RAT_SUB_CONG = save_thm("RAT_SUB_CONG",<br />

CONJ RAT_SUB_CONG1 RAT_SUB_CONG2);<br />

(*--------------------------------------------------------------------------<br />

* RAT_DIV_CONG1: thm


268<br />

* |- !x y. ~(nmr y = 0) ==><br />

* (abs_rat (div (rep_rat (abs_rat x)) y) = abs_rat (div x y))<br />

*<br />

* RAT_DIV_CONG2: thm<br />

* |- !x y. ~(nmr y = 0) ==><br />

(abs_rat (div x (rep_rat (abs_rat y))) = abs_rat (div x y))<br />

*<br />

* RAT_DIV_CONG: thm<br />

* |- !x y. ~(nmr y = 0) ==><br />

* (abs_rat (div (rep_rat (abs_rat x)) y) = abs_rat (div x y)) /\<br />

* !x y. ~(nmr y = 0) ==><br />

(abs_rat (div x (rep_rat (abs_rat y))) = abs_rat (div x y))<br />

*--------------------------------------------------------------------------*)<br />

val RAT_DIV_CONG1 = store_thm("RAT_DIV_CONG1", ‘‘!x y. ~(nmr y = 0) ==><br />

(abs_rat (div (rep_rat (abs_rat x)) y) = abs_rat (div x y))‘‘,<br />

REPEAT STRIP_TAC THEN<br />

REWRITE_TAC[div_def] THEN<br />

ARW_TAC[RAT_MULT_CONG] );<br />

val RAT_DIV_CONG2 = store_thm("RAT_DIV_CONG2", ‘‘!x y. ~(nmr y = 0) ==><br />

(abs_rat (div x (rep_rat (abs_rat y))) = abs_rat (div x y))‘‘,<br />

REPEAT STRIP_TAC THEN<br />

REWRITE_TAC[div_def, mul_def] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm x * dnm (minv y)‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm x * dnm (minv (rep_rat (abs_rat y)))‘‘ THEN<br />

RAT_ABS_EQUIV_TAC THEN<br />

REWRITE_TAC [rat_equiv_def] THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

REWRITE_TAC[EQT_ELIM (AC_CONV (INT_MUL_ASSOC,INT_MUL_SYM) ‘‘nmr x<br />

* nmr (minv (rep_rat (abs_rat y))) * (dnm x * dnm (minv y))<br />

= (nmr x * dnm x) * (nmr (minv (rep_rat (abs_rat y)))<br />

* dnm (minv y))‘‘)] THEN<br />

REWRITE_TAC[EQT_ELIM (AC_CONV (INT_MUL_ASSOC,INT_MUL_SYM)<br />

‘‘nmr x * nmr (minv y) * (dnm x * dnm (minv (rep_rat (abs_rat y))))<br />

= (nmr x * dnm x) *(nmr (minv y) * dnm (minv (rep_rat<br />

(abs_rat y))))‘‘)] THEN<br />

REWRITE_TAC[INT_EQ_LMUL] THEN<br />

DISJ2_TAC THEN<br />

REWRITE_TAC[GSYM rat_equiv_def] THEN<br />

REWRITE_TAC[GSYM RAT_ABS_EQUIV] THEN<br />

ARW_TAC[RAT_MINV_CONG] );<br />

val RAT_DIV_CONG =<br />

save_thm("RAT_DIV_CONG", CONJ RAT_DIV_CONG1 RAT_DIV_CONG2 );<br />

(*--------------------------------------------------------------------------<br />

* RAT_ADD_ASSOC: thm<br />

* |- !a b c. rat_add a (rat_add b c) = rat_add (rat_add a b) c


269<br />

*<br />

* RAT_MULT_ASSOC: thm<br />

* |- !a b c. rat_mul a (rat_mul b c) = rat_mul (rat_mul a b) c<br />

*--------------------------------------------------------------------------*)<br />

val RAT_ADD_ASSOC = store_thm("RAT_ADD_ASSOC",<br />

‘‘!a b c. rat_add a (rat_add b c) = rat_add (rat_add a b) c‘‘,<br />

REWRITE_TAC[rat_add_def] THEN<br />

REWRITE_TAC[RAT_ADD_CONG] THEN<br />

REWRITE_TAC[FRAC_ADD_ASSOC] );<br />

val RAT_MULT_ASSOC = store_thm("RAT_MULT_ASSOC",<br />

‘‘!a b c. rat_mul a (rat_mul b c) = rat_mul (rat_mul a b) c‘‘,<br />

REWRITE_TAC[rat_mul_def] THEN<br />

REWRITE_TAC[RAT_MULT_CONG] THEN<br />

REWRITE_TAC[FRAC_MULT_ASSOC] );<br />

(*--------------------------------------------------------------------------<br />

* RAT_ADD_COMM: thm<br />

* |- !a b. rat_add a b = rat_add b a<br />

*<br />

* RAT_ADD_COMM: thm<br />

* |- !a b. rat_mul a b = rat_mul b a<br />

*--------------------------------------------------------------------------*)<br />

val RAT_ADD_COMM = store_thm("RAT_ADD_COMM",<br />

‘‘!a b. rat_add a b = rat_add b a‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[rat_add_def] THEN<br />

REWRITE_TAC[RAT_ABS_EQUIV] THEN<br />

MATCH_MP_TAC RAT_IMP_EQUIV THEN<br />

ARW_TAC[FRAC_ADD_COMM] );<br />

val RAT_MULT_COMM = store_thm("RAT_MULT_COMM",<br />

‘‘!a b. rat_mul a b = rat_mul b a‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[rat_mul_def] THEN<br />

REWRITE_TAC[RAT_ABS_EQUIV] THEN<br />

MATCH_MP_TAC RAT_IMP_EQUIV THEN<br />

ARW_TAC[FRAC_MULT_COMM] );<br />

(*--------------------------------------------------------------------------<br />

* RAT_ADD_RID: thm<br />

* |- !a. rat_add a rat_0 = a<br />

*<br />

* RAT_ADD_LID: thm<br />

* |- !a. rat_add rat_0 a = a<br />

*<br />

* RAT_MULT_RID: thm<br />

* |- !a. rat_mul a rat_1 = a


270<br />

*<br />

* RAT_MULT_LID: thm<br />

* |- !a. rat_mul rat_1 a = a<br />

*--------------------------------------------------------------------------*)<br />

val RAT_ADD_RID = store_thm("RAT_ADD_RID",<br />

‘‘!a. rat_add a rat_0 = a‘‘,<br />

REWRITE_TAC[rat_add_def,rat_0_def] THEN<br />

REWRITE_TAC[RAT_ADD_CONG] THEN<br />

REWRITE_TAC[FRAC_ADD_RID] THEN<br />

ARW_TAC[CONJUNCT1 rat_def]);<br />

val RAT_ADD_LID = store_thm("RAT_ADD_LID",<br />

‘‘!a. rat_add rat_0 a = a‘‘,<br />

ONCE_REWRITE_TAC[RAT_ADD_COMM] THEN<br />

ARW_TAC[RAT_ADD_RID] );<br />

val RAT_MULT_RID = store_thm("RAT_MULT_RID",<br />

‘‘!a. rat_mul a rat_1 = a‘‘,<br />

REWRITE_TAC[rat_mul_def,rat_1_def] THEN<br />

REWRITE_TAC[RAT_MULT_CONG] THEN<br />

REWRITE_TAC[FRAC_MUL_RID] THEN<br />

ARW_TAC[CONJUNCT1 rat_def]);<br />

val RAT_MULT_LID = store_thm("RAT_MULT_LID",<br />

‘‘!a. rat_mul rat_1 a = a‘‘,<br />

ONCE_REWRITE_TAC[RAT_MULT_COMM] THEN<br />

ARW_TAC[RAT_MULT_RID] );<br />

(*--------------------------------------------------------------------------<br />

* RAT_ADD_RINV: thm<br />

* |- !a. rat_add a (rat_ainv a) = rat_0<br />

*<br />

* RAT_ADD_LINV: thm<br />

* |- !a. rat_add (rat_ainv a) a = rat_0<br />

*<br />

* RAT_MULT_RINV: thm<br />

* |- !a. ~(a=rat_0) ==> (rat_mul a (rat_minv a) = rat_1)<br />

*<br />

* RAT_MULT_LINV: thm<br />

* |- !a. ~(a = rat_0) ==> (rat_mul (rat_minv a) a = rat_1)<br />

*--------------------------------------------------------------------------*)<br />

val RAT_ADD_RINV = store_thm("RAT_ADD_RINV",<br />

‘‘!a. rat_add a (rat_ainv a) = rat_0‘‘,<br />

GEN_TAC THEN<br />

REWRITE_TAC[rat_add_def,rat_ainv_def,rat_0_def] THEN<br />

ARW_TAC[RAT_ADD_CONG] THEN<br />

REWRITE_TAC[add_def,ainv_def,frac_0_def] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat a)‘‘ THEN


271<br />

ARW_TAC[NMR,DNM] THEN<br />

RAT_ABS_EQUIV_TAC THEN<br />

REWRITE_TAC[rat_equiv_def] THEN<br />

DNM_POS_ASM_TAC ‘‘1i‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat a) * dnm (rep_rat a)‘‘ THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

INT_RING_TAC );<br />

val RAT_ADD_LINV = store_thm("RAT_ADD_LINV",<br />

‘‘!a. rat_add (rat_ainv a) a = rat_0‘‘,<br />

ONCE_REWRITE_TAC[RAT_ADD_COMM] THEN<br />

ARW_TAC[RAT_ADD_RINV] );<br />

val RAT_MULT_RINV =<br />

let<br />

val lemmaX = prove(‘‘(a = rat_0) = (nmr (rep_rat a) = 0)‘‘,<br />

EQ_TAC THENL<br />

[<br />

REWRITE_TAC[rat_0_def, frac_0_def] THEN<br />

STRIP_TAC THEN<br />

ASM_REWRITE_TAC[] THEN<br />

ARW_TAC[NMR_EQ0_CONG] THEN<br />

DNM_POS_ASM_TAC‘‘1i‘‘ THEN<br />

ARW_TAC[NMR]<br />

,<br />

REWRITE_TAC[rat_0_def, frac_0_def] THEN<br />

ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN<br />

ASM_REWRITE_TAC[] THEN<br />

SUBST_TAC[GSYM (SPEC ‘‘a:rat‘‘ (CONJUNCT1 rat_def))] THEN<br />

RAT_ABS_EQUIV_TAC THEN<br />

REWRITE_TAC[rat_equiv_def] THEN<br />

ARW_TAC[rat_def] THEN<br />

DNM_POS_ASM_TAC‘‘1i‘‘ THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

UNDISCH_TAC ‘‘0 = nmr (rep_rat a)‘‘ THEN<br />

ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN<br />

ARW_TAC[INT_MUL_LZERO]<br />

] );<br />

val lemmaY = prove(‘‘! x y. 0 0 < dnm x * y‘‘,<br />

REPEAT GEN_TAC THEN<br />

DNM_POS_ASM_TAC ‘‘dnm x‘‘ THEN<br />

ARW_TAC[INT_MUL_POS_SIGN]);<br />

in<br />

store_thm("RAT_MULT_RINV", ‘‘!a. ~(a=rat_0) ==><br />

(rat_mul a (rat_minv a) = rat_1)‘‘,<br />

GEN_TAC THEN<br />

REWRITE_TAC[rat_mul_def, rat_minv_def, rat_1_def] THEN<br />

REWRITE_TAC[RAT_MULT_CONG] THEN<br />

REWRITE_TAC[mul_def, minv_def, frac_1_def] THEN<br />

REWRITE_TAC[lemmaX] THEN


272<br />

end;<br />

STRIP_TAC THEN<br />

ASSUME_TAC (UNDISCH_ALL (SPEC ‘‘nmr (rep_rat a)‘‘<br />

ABS_NOT_0_POSITIVE)) THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

RAT_ABS_EQUIV_TAC THEN<br />

REWRITE_TAC[rat_equiv_def] THEN<br />

ASSUME_TAC (UNDISCH_ALL (SPEC ‘‘ABS (nmr (rep_rat a))‘‘<br />

(SPEC ‘‘rep_rat a‘‘ lemmaY))) THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

ARW_TAC[INT_ABS,sgn_def] THEN<br />

INT_RING_TAC )<br />

val RAT_MULT_LINV = store_thm("RAT_MULT_LINV", ‘‘!a. ~(a = rat_0) ==><br />

(rat_mul (rat_minv a) a = rat_1)‘‘,<br />

ONCE_REWRITE_TAC[RAT_MULT_COMM] THEN<br />

ARW_TAC[RAT_MULT_RINV] );<br />

(*--------------------------------------------------------------------------<br />

* RAT_RDISTRIB: thm<br />

* |- !a b c. rat_mul (rat_add a b) c = rat_add (rat_mul a c) (rat_mul b c)<br />

*<br />

* RAT_LDISTRIB: thm<br />

* |- !a b c. rat_mul c (rat_add a b) = rat_add (rat_mul c a) (rat_mul c b)<br />

*--------------------------------------------------------------------------*)<br />

val RAT_RDISTRIB = store_thm("RAT_RDISTRIB",<br />

‘‘!a b c. rat_mul (rat_add a b) c = rat_add (rat_mul a c) (rat_mul b c)‘‘,<br />

REPEAT GEN_TAC THEN<br />

REWRITE_TAC[rat_mul_def,rat_add_def] THEN<br />

ARW_TAC[RAT_MULT_CONG, RAT_ADD_CONG] THEN<br />

REWRITE_TAC[mul_def,add_def] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat a) * dnm (rep_rat b)‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat b) * dnm (rep_rat c)‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat a) * dnm (rep_rat c)‘‘ THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

RAT_ABS_EQUIV_TAC THEN REWRITE_TAC[rat_equiv_def] THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat a) * dnm (rep_rat b) * dnm (rep_rat c)‘‘ THEN<br />

DNM_POS_ASM_TAC ‘‘dnm (rep_rat a) * dnm (rep_rat c)<br />

* (dnm (rep_rat b) * dnm (rep_rat c))‘‘ THEN<br />

ARW_TAC[NMR,DNM] THEN<br />

INT_RING_TAC );<br />

val RAT_LDISTRIB = store_thm("RAT_LDISTRIB",<br />

‘‘!a b c. rat_mul c (rat_add a b) = rat_add (rat_mul c a) (rat_mul c b)‘‘,<br />

ONCE_REWRITE_TAC[RAT_MULT_COMM] THEN<br />

REWRITE_TAC[RAT_RDISTRIB] );<br />

(*--------------------------------------------------------------------------<br />

* RAT_IS_RING: thm


273<br />

* |- is_ring (ring rat_0 rat_1 rat_add rat_mul rat_ainv)<br />

*--------------------------------------------------------------------------*)<br />

val RAT_IS_RING = store_thm("RAT_IS_RING",<br />

‘‘is_ring (ring rat_0 rat_1 rat_add rat_mul rat_ainv)‘‘,<br />

ARW_TAC[ is_ring_def, ring_accessors,<br />

RAT_ADD_ASSOC, RAT_MULT_ASSOC,<br />

RAT_ADD_LID, RAT_MULT_LID,<br />

RAT_ADD_RINV,<br />

RAT_RDISTRIB] THEN<br />

MAP_FIRST MATCH_ACCEPT_TAC [<br />

RAT_ADD_COMM, RAT_MULT_COMM<br />

] );<br />

val _ = export_theory();


274<br />

Modellierung von synchronen Sprachen mit<br />

Prozessersetzungssystemen<br />

Rüdiger Grammes<br />

Technische Universität <strong>Kaiserslautern</strong><br />

Zusammenfassung. Esterel ist eine synchrone Sprache zur Beschreibung<br />

deterministischer, <strong>reaktiver</strong> <strong>Systeme</strong>. Zur Analyse der Programme<br />

müssen diese in eine formale Beschreibungssprache überführt werden.<br />

Eine solche Beschreibungssprache sind die Prozessersetzungssysteme. In<br />

dieser Arbeit werden die Zusammenhänge zwischen Esterel und Prozessersetzungssystemen<br />

untersucht. Für eine Teilmenge von Esterel wird eine<br />

Abbildung von Programmen in diesen Formalismus definiert. Es werden<br />

Erweiterungen für Esterel skizziert, die die volle Mächtigkeit der Beschreibungssprache<br />

ausschöpfen.<br />

1 Einleitung<br />

Esterel [Ber00] ist eine synchrone Sprache zur Beschreibung deterministischer,<br />

<strong>reaktiver</strong> <strong>Systeme</strong>. Um ein Esterel–Programm analysieren zu können, muss es<br />

in eine formale Beschreibung überführt werden. Eine Möglichkeit ist, Esterel–<br />

Programme mit Mealy–Automaten umzusetzen. In diesem Beitrag soll eine Umsetzung<br />

mit einem mächtigeren Formalismus, den Prozessersetzungssystemen,<br />

versucht werden.<br />

Prozessersetzungssysteme (PES) [May99,Esp02] beschreiben Prozesse durch<br />

eine Menge von Prozesstermen, sowie Ersetzungsregeln die auf Prozessterme<br />

angewendet werden. PES erlauben sequenzielle und parallele Komposition von<br />

Prozessen. Sie umfassen mehrere bekannte Formalismen, z.B. endliche Automaten<br />

oder Petrinetze.<br />

Kapitel 2 gibt eine kurze Übersicht über Prozessersetzungssysteme und ihre<br />

Klassifizierung. In Kapitel 3 wird eine Modellierung von Esterel–Programmen<br />

mit PES vorgestellt, die in Kapitel 4 durch die Verwendung mächtigerer PES<br />

erweitert wird. Die Modellierung beschränkt sich dabei auf eine Teilmenge von<br />

Esterel. Kapitel 5 skizziert Erweiterungen von Esterel, die der Sprache die Ausdrucksstärke<br />

mächtigerer PES gibt.<br />

2 Prozessersetzungssysteme<br />

Für nebenläufige <strong>Systeme</strong> mit unendlichen Zustandsräumen existieren einige<br />

Formalismen, wie z.B. Petri–Netze und Prozessalgebren. Viele dieser Formalismen<br />

können als spezielle Unterklassen von Ersetzungssystemen auf Prozesstermen<br />

dargestellt werden. Die allgemeinste Klasse bilden die Prozessersetzungs-


275<br />

systeme [May99], die die Ausdrucksstärke von Kellerautomaten und Petrinetzen<br />

vereinen.<br />

Prozessersetzungssysteme bestehen aus einer Menge von Prozesstermen T ,<br />

die die Zustände eines Systems beschreiben, und Ersetzungsregeln ∆ für das<br />

dynamische Verhalten. Prozessterme bilden sich aus einer Menge von Prozesskonstanten,<br />

sowie deren sequenzielle und parallele Komposition. Für eine Prozesskonstante<br />

X, Prozessterme t 1 und t 2 und einen leeren Term ɛ hat ein Prozessterm<br />

t die Form<br />

t ::= ɛ | X | t 1 .t 2 | t 1 ‖ t 2 .<br />

Die parallele Komposition ”‖” ist kommutativ und assoziativ, die sequenzielle<br />

Komposition ”.” assoziativ.<br />

Act ist eine abzählbar unendliche Menge von Aktionen. Eine Ersetzungsregel<br />

a<br />

aus ∆ hat die Form t 1 −→ t2 mit a ∈ Act. Um die Sequenzialität von ”.” zu erhalten,<br />

werden Ersetzungen nur auf Präfixen von Prozesstermen vorgenommen.<br />

Die Semantik des PES wird durch ein markiertes Transitionssystem gegeben,<br />

das die folgenden Transitionen enthält:<br />

(t 1<br />

a<br />

−→ t2 ) ∈ ∆<br />

t 1<br />

a<br />

−→ t2<br />

,<br />

(t 1<br />

a<br />

−→ t<br />

′<br />

1 ) ∈ ∆<br />

t 1 ‖ t 2<br />

a<br />

−→ t<br />

′<br />

1 ‖ t 2<br />

,<br />

(t 1<br />

a<br />

−→ t<br />

′<br />

1 ) ∈ ∆<br />

t 1 .t 2<br />

a<br />

−→ t<br />

′<br />

1 .t 2<br />

Um Unterklassen von PES zu bilden, kann man die Menge der Prozessterme<br />

einschränken, indem man sequenzielle oder parallele Komposition verbietet. Die<br />

folgenden Klassen sind Teilmengen der Prozessterme T :<br />

1 Nur Prozesskonstanten, ɛ ∉ 1<br />

S Prozesskonstanten und sequenzielle Komposition (X, Y . X, ...)<br />

P Prozesskonstanten und parallele Komposition (X, Y ‖ X, ...)<br />

G Sequenzielle und parallele Komposition (X, X . Y, (X . Y) ‖ Z, ...)<br />

Es ist 1 ⊂ S, P ⊂ G. Durch Einschränken der Prozessterme, die auf der<br />

linken bzw. rechten Seite einer Ersetzungsregel vorkommen können, entstehen<br />

verschiedene Klassen von Ersetzungssystemen, die mit bekannten Formalismen<br />

verglichen werden können. Man definiert ein (α, β)–PES als eine Menge von<br />

Ersetzungsregeln ∆ der Form l a −→ r, mitl ≠ ɛ aus α und r aus β. Sinnvollsind<br />

(α, β)–PES mit α ⊆ β, da sonst Prozessterme, die auf linken, aber nicht auf<br />

rechten Seiten stehen dürfen, nicht erreicht werden können.<br />

Die Klassen von (α, β)–PES lassen sich in einer Hierarchie anordnen (siehe<br />

Abb. 1). In diese Hierarchie lassen sich einige bekannte Formalismen einordnen.<br />

(1,1)–PES erlauben nur Prozesskonstanten. Da die Menge der Ersetzungsregeln<br />

in ∆ endlich ist, gibt es auch nur endlich viele Zustände. Endliche Automaten<br />

lassen sich mit (1,1)–PES modellieren.


276<br />

PES (G,G)<br />

PAD (S,G)<br />

PAN (P,G)<br />

Keller- (S,S)<br />

automaten<br />

PA (1,G)<br />

Petrinetze (P,P)<br />

BPA (1,S)<br />

BPP (1,P)<br />

Endliche (1,1)<br />

Automaten<br />

Abb. 1. Die PES–Hierarchie<br />

(S,S)–PES erlauben sequenzielle Komposition von Prozesstermen und damit<br />

eine unendliche Zustandsmenge. Kellerautomaten lassen sich mit (S,S)–PES modellieren.<br />

Durch das Ersetzen von Präfixen kann mit sequenzieller Komposition<br />

ein Stack von Prozesskonstanten auf– und abgebaut werden. Mit (1,S)–PES ist<br />

dies auch möglich, sie erkennen die gleiche Sprache. Der Abbau des Stacks ist<br />

aber nur über das Umschreiben auf ɛ möglich, Kommunikation zwischen Prozessen<br />

ist nicht erlaubt. Der entsprechende Formalismus sind die ’Basic Process<br />

Algebras’.<br />

(P,P)–PES erlauben parallele Komposition von Prozesstermen und damit eine<br />

unendliche Zustandsmenge. Petrinetze lassen sich mit (P,P)–PES modellieren.<br />

Eine Prozesskonstante entspricht einem Platz im Petrinetz, die Häufigkeit einer<br />

Prozesskonstante in einem Prozessterm entspricht der Anzahl der Marken auf<br />

diesem Platz. Die Prozesskonstanten auf der linken Seite einer Ersetzungsregel<br />

sind die Eingangsplätze, die Prozesskonstanten auf der rechten Seite die Ausgangsplätze<br />

einer Transition. (1,P)–PES entsprechen Petrinetzen, die nur einen<br />

Eingangsplatz für eine Transition haben können. Der entsprechende Formalismus<br />

sind die ”Basic Parallel Processes”.<br />

Weitere Klassen wie (1,G)– oder (G,G)–PES entstehen durch Vereiningung<br />

der bekannten Klassen. Da ein Esterel–Programm in einen Mealy–Automaten<br />

übersetzt werden kann, genügen (1,1)–PES zur Modellierung des Programms.


277<br />

3 Modellierung von Esterel mit (1,1)–PES<br />

Esterel–Programme sollen in (1,1)–PES übersetzt werden. Dazu werden Funktionen<br />

definiert, die rekursiv die Esterel–Statements abarbeiten. Die Funktionen<br />

arbeiten auf folgenden Mengen aus Esterel und PES:<br />

EstStm: Menge der Esterel–Statements<br />

EstSigTerm: Menge der Ausdrücke über Signale<br />

Signal: Menge der deklarierten Signale<br />

T : Menge der Prozessterme<br />

Act: Menge der Aktionen<br />

∆: Menge der Ersetzungsregeln<br />

Aktionen sind durch die An- bzw. Abwesenheit von Esterel–Signalen gegeben.<br />

Die Aktion a beschreibt die Anwesenheit des Signals a, die Aktion ¬a die<br />

Abwesenheit. Mit ∧ und ∨ kann eine Aktion durch den Status mehrerer Signale<br />

gegeben werden. Anwendung findet dies z.B. innerhalb von abort–Statements.<br />

Durch die folgenden Regeln wird eine abzählbar unendliche Menge von Aktionen<br />

für das PES definiert.<br />

s ∈ Signal ⇒ s ∈ Act<br />

true, false ∈ Act<br />

a ∈ Act ⇒¬a ∈ Act<br />

a, b ∈ Act ⇒ a ∧ b ∈ Act<br />

a, b ∈ Act ⇒ a ∨ b ∈ Act<br />

Die Funktion act bildet Signalausdrücke aus EstSigTerm auf Aktionen des<br />

PES ab. Für a, b ∈ EstSigTerm ist<br />

act(not a) =¬act(a)<br />

act(a or b) =act(a) ∨ act(b)<br />

act(a and b) =act(a) ∧ act(b)<br />

act(a) =a falls a ∈ Signal<br />

Um ein Esterel–Programm mittels eines PES zu beschreiben, werden Funktionen<br />

definiert, die Esterel–Statements eine Menge von Termen und Ersetzungsregeln<br />

zuordnen. Da Esterel eine orthogonale Sprache ist, bietet sich die Verwendung<br />

von Rekursion an.<br />

Auf Esterel–Statements werden drei Funktionen definiert. Für ein Statement<br />

S bezeichnet terms(S) die zugehörige Menge von Termen und rules(S, N, def)<br />

die zugehörige Menge von Ersetzungsregeln des PES. N ist der Term, der auf


278<br />

die Abarbeitung von S folgt. def ist eine Aktion, bei deren Nichteintreten keine<br />

Regel von S aktiviert ist.<br />

root zeichnet einen Term aus terms(S) als den initialen Term des Statements<br />

aus. Für die im Detail betrachteten Statements gibt es genau einen initialen<br />

Term, d.h. root ist total.<br />

Im Folgenden sei N ∈ T ,def∈ Act.<br />

root : EstStm → T<br />

terms : EstStm →P(T )<br />

rules : EstStm × T × Act →P(∆)<br />

Halt, pause und await sind Statements, die Zeitschritte und damit neue Terme<br />

einführen (Makroschritte) und keine weiteren Statements enthalten.<br />

Halt verbraucht die restliche Zeit. Halt entspricht ’loop pause end’, entsprechend<br />

wird der Term bei einem tick auf sich selbst umgeschrieben. Sei H ∈ T ein<br />

neuer Term. Es ist<br />

root(halt) = H<br />

terms(halt) = {H}<br />

rules(halt, N, def) = {H tick∧def<br />

−−−−−→ H}<br />

Pause verbraucht genau einen Zeitschritt. Es wird ein neuer Term eingeführt,<br />

der bei einem tick in den Nachfolgeterm umgeschrieben wird, sofern die Aktion<br />

def nicht eingetreten ist. Sei P ∈ T ein neuer Term. Es ist<br />

root(pause) = P<br />

terms(pause) = {P}<br />

rules(pause, N, def) = {P tick∧def<br />

−−−−−→ N }<br />

Await verhält sich wie pause, es wird jedoch auf das Eintreten von α gewartet.<br />

Await kann aus loop, pause und abort abgeleitet werden. Sei α ∈ EstSigTerm<br />

und A ∈ T ein neuer Term. Es ist<br />

root(await α) =A<br />

terms(await α) ={A}<br />

rules(await α, N,def)={A act(α)∧def<br />

−−−−−−−→ N, A ¬act(α)∧def<br />

−−−−−−−−→ A}<br />

Da der Prozessabbruch verzögert ist, ist der initiale Term auf jeden Fall der<br />

initiale Term des inneren Statements S. Terme des Statements sind die Terme<br />

von S. Die Regeln des inneren Statements sind nur aktiviert, wenn α abwesend<br />

ist. Ist α anwesend, wird das innere Statement abgebrochen. Terme von S werden<br />

deswegen bei Anwesenheit von α in den Nachfolgeterm umgeschrieben.


279<br />

root(abort S when α) =root(S)<br />

terms(abort S when α) =terms(S)<br />

rules(abort S when α, N,def)=rules(S, N, ¬act(α)∧ def)<br />

∪{s act(α)∧def<br />

−−−−−−−→ N | s ∈ terms(S)}<br />

Das innere Statement S einer Schleife wird nach Beenden ohne Verzögerung<br />

neu ausgeführt. Dazu wird der Nachfolgeterm von S auf den initialen Term von<br />

S gesetzt.<br />

root(loopSend)=root(S)<br />

terms(loopSend)=terms(S)<br />

rules(loop S end, N, def) = rules(S, root(S), def)<br />

Der initiale Term einer Sequenz ist der initiale Term des ersten Statements<br />

der Sequenz. Terminiert das erste Statement S, wird ohne Verzögerung das zweite<br />

Statement T ausgeführt. Die Terme der Sequenz sind daher die Terme von S und<br />

T vereinigt. Die Regeln der Sequenz sind die Regeln von S und T vereinigt. Der<br />

Nachfolgeterm der Regeln von S ist der initale Term von T, der Nachfolgeterm<br />

von T ist der Nachfolgeterm der Sequenz.<br />

root(S;T) = root(S)<br />

terms(S;T) = terms(S) ∪ terms(T)<br />

rules(S;T, N, def) = rules(S, root(T), def) ∪ rules(T,N,def)<br />

Bei parallelen Statements in Esterel entsteht bei der Umsetzung in PES das<br />

Äquivalent zu einem Produktautomaten. Die Terme sind das karthesische Produkt<br />

der Terme der parallelen Statements S und T. Der initiale Term ist das<br />

Paar der initialen Terme von S und T. Für jedes Paar von Regeln aus S und T<br />

wird eine neue Regel eingeführt. Rules’ erweitert die Regelmenge derart, dass für<br />

jede Signalbelegung eine Ersetzungsregel angewendet werden kann. Für Signalbelegungen,<br />

für die keine Ersetzungsregel angewendet werden kann, wird eine<br />

neue Ersetzungsregel eingeführt, die den Term in sich selbst umschreibt.<br />

root(S ‖ T) = root(S) × root(T)<br />

terms(S ‖ T) = {s × t | s ∈ terms(S), t ∈ terms(T) }<br />

rules(S ‖ T, N, def) = {s × t x∧y<br />

−−→ s’ × t’ | s x −→ s’ ∈ rules’(S, N, def),<br />

t y −→ t’ ∈ rules’(T, N, def) }<br />

mit rules’(S, N, def) = rules(S, N, def) ∪{s ¬ V x:s x −→s ′<br />

−−−−−−−→ s | s ∈ terms(S)}<br />

Alle weiteren Statements von purem Esterel können auf diese Art modelliert<br />

werden. Für Ausgaben (’emit’) ist eine Erweiterung der Aktionsmenge nötig.<br />

Für den sofortigen Prozessabbruch und das Testen der Anwesenheit von Signalen<br />

müssen die Funktionen erweitert werden, da root partiell sein kann und mehrere<br />

initiale Terme für ein Statement möglich sind.


280<br />

4 Esterel und (P,P)–PES<br />

(1,1)–PES sind ausdrucksstark genug, um Esterel zu modellieren. Esterel erlaubt<br />

eine beschränkte Anzahl von parallelen Statements, die als Produktautomat mit<br />

endlichen Automaten modelliert werden können. Die (unbeschränkte) parallele<br />

Komposition von (P,P)–PES kann jedoch gegebenenfalls dazu verwendet werden,<br />

eine einfachere und intuitivere Modellierung für Esterel–Programme zu erzeugen.<br />

Der initiale Term der parallelen Statements ist die parallele Komposition<br />

der initialen Terme der Statements. Die Menge der Terme ist die Vereinigung<br />

der Terme der Statements. Die Regeln der Statements werden übernommen und<br />

vereinigt. Nachfolgeterm ist ein neuer Term ’F’. Sind beide Statements terminiert<br />

(also nach ’F’ umgeschrieben), terminiert das parallele Statement und wird in<br />

den Nachfolgeterm N umgeschrieben. Sei F ∈ T ein neuer Term. Es ist:<br />

root(S ‖ T) = root(S) ‖ root(T)<br />

terms(S ‖ T) = terms(S) ∪ terms(T)<br />

rules(S ‖ T, N, def) = rules(S,F,def)∪ rules(T,F,def)<br />

∪{F ‖ F true<br />

−−−→ N}<br />

Dieser Ansatz benötigt einen zusätzlichen Schritt zur Synchronisation der<br />

beiden parallelen Statements. Um der Semantik von Esterel zu entsprechen,<br />

darf dieser Schritt keine Zeit verbrauchen. In jedem Fall entsteht ein neuer Zustand<br />

’F ‖ F’, der bei der Umsetzung als Produktautomat nicht existiert. Dieser<br />

Schritt kann durch einige zusätzliche Regeln entfernt werden. Für ein Paar von<br />

Regeln der Statements S und T, die in den Term F umschreiben, werden neue<br />

Regeln eingeführt. Sind beide Regeln aktiviert, wird in den Nachfolgeterm N<br />

umgeschrieben, ansonsten wird der Prozess, dessen Regeln aktiviert ist, in den<br />

Term ’F’ umgeschrieben.<br />

root(S ‖ T) = root(S) ‖ root(T)<br />

terms(S ‖ T) = terms(S) ∪ terms(T)<br />

rules(S ‖ T, N, def) =<br />

{s ‖ t −−→ x∧y<br />

N, s −−−→ x∧¬y<br />

F, t −−−→ ¬x∧y<br />

F, s ‖ F −→ x N, F ‖ t −→ y N<br />

| s −→ x F ∈ rules(S, F, def), t −→ y F ∈ rules(T,F,def)}<br />

∪{s −→ x s’ | s −→ x s’ ∈ rules(S, F, def) ∪ rules(T,F,def)∧ s’ ≠F}<br />

Parallele Prozesse in Esterel sind synchron und führen gleichzeitig Schritte<br />

durch. Bei der Umsetzung mit (P,P)–PES führt dies zu Problemen. Bei der hier<br />

gewählten Umsetzung werden die Regeln der parallelen Statements vereinigt,<br />

d.h. ein Ersetzungsschritt hat nur Auswirkungen auf einen der beiden Prozesse.<br />

Dies entspricht einem Interleaving der Prozesse und nicht einer synchronen<br />

Ausführung wie in Esterel. Synchronität kann durch Ersetzungsregeln, die sich<br />

auf beide Prozesse beziehen, erreicht werden. Dazu wird eine Anzahl von Regeln<br />

benötigt, die der eines Produktautomaten entspricht. Die Verwendung von


281<br />

(P,P)–PES ist daher nur sinnvoll, um die Parallelität in den Prozesstermen explizit<br />

zu machen.<br />

5 Erweiterung von Esterel für (S,S)– und (P,P)–PES<br />

Esterel–Programme können in Mealy–Automaten übersetzt und daher mit (1,1)–<br />

PES modelliert werden. Denkbar sind Erweiterungen, die Esterel die Mächtigkeit<br />

von (S,S)– und (P,P)–PES und damit eine potenziell unendliche Zustandsmenge<br />

geben.<br />

(S,S)–PES entsprechen Kellerautomaten. Durch Einführung von Rekursion<br />

in Esterel kann ein Stack von Prozessen aufgebaut werden, der beim Verlassen<br />

der Prozeduren wieder abgebaut wird.<br />

Das Statement ’call procedure’ gibt die Kontrolle an das erste Statement<br />

von ’procedure’ weiter. ’call procedure’ terminiert, wenn der Statement–Block<br />

der Prozedur terminiert. Im folgenden Beispiel wird die Prozedur proc aufgerufen.<br />

In der Prozedur wird auf ein ’a’ gewartet. Tritt ’a’ ein, wird abhängig von<br />

der Anwesenheit von ’b’ proc rekursiv aufgerufen, oder die Prozedur terminiert<br />

sofort.<br />

module dpc:<br />

procedure proc:<br />

input a,b;<br />

(S) call proc;<br />

(E) end module (A) await a;<br />

(B) present b then call proc<br />

(F) end procedure<br />

In einem entsprechenden (S,S)–PES wird beim Aufruf der initial Term der<br />

Prozedur sequenziell mit dem aktuellen Prozess komponiert. Terminiert die Prozedur<br />

(Konstante F), wird der sequenzielle Term in den Nachfolgeterm umgeschrieben.<br />

Diese Schritte dürfen keine Zeit verbrauchen. Für die Prozedur werden<br />

die Regeln erstellt wie für einen Statement–Block. Ist ’b’ nicht präsent, wird<br />

A beim Auftreten von ’a’ in den Term F umgeschrieben, ansonsten erfolgt ein<br />

erneuter Prozeduraufruf.<br />

S → A.S<br />

F.S → E<br />

A −−→ a∧b<br />

A.B<br />

A −−−→ a∧¬b<br />

F<br />

F.B → F<br />

Im folgenden Beispiel wird proc zweimal aufgerufen, einmal im Modul dpc<br />

und einmal rekursiv. Sobald ’b’ nicht mehr präsent ist, terminieren die Prozeduren.<br />

S → A.S a∧b<br />

−−→ A.B.S a∧¬b<br />

−−−→ F.B.S → F.S → E


282<br />

Probleme bereitet bei der Definition eines (S,S)–PES die Funktion terms. Die<br />

Menge der Terme eines Prozeduraufrufes hängt von der Rekursionstiefe ab und<br />

ist potenziell unendlich. Bei einem Prozessabbruch muss jeder dieser Zustände<br />

in einem Schritt verlassen werden. Mit einer endlichen Menge von Regeln ist dies<br />

nicht möglich.<br />

Parallele Prozesse existieren sowohl in Esterel als auch in (P,P)–PES. In<br />

Esterel ist die Parallelität jedoch statisch im Programm festgelegt, wodurch der<br />

Zustandsraum endlich bleibt. Im Folgenden wird an einem Beispiel eine dynamische<br />

Prozesserzeugung eingeführt.<br />

fork ist ein Mikroschritt, der einen neuen Prozess als Kopie des aktuellen<br />

Prozesses erstellt. Im Modul ’fork’ wird, sobald das Signal ’a’ präsent ist, ein<br />

neuer Prozess erstellt und auf ’b’ gewartet. Der neue Prozess wartet auf das<br />

Signal a. Fork ist ein Mikroschritt und verbraucht keine Zeit, daher ist das<br />

Signal a noch präsent. Await ist jedoch verzögernd und terminiert nicht sofort.<br />

module fork:<br />

input a,b;<br />

(A) await a;<br />

fork;<br />

(B) await b<br />

end module<br />

Ein entsprechendes (P,P)–PES benötigt zwei Regeln. A wird beim Eintreten<br />

der Aktion ’a’ durch A ‖ B ersetzt, entsprechend den beiden Prozessen die auf<br />

’a’ bzw. ’b’ warten. B wird beim Eintreten der Aktion ’b’ in ɛ umgeschrieben,<br />

entsprechend dem Prozess der auf ’b’ wartet und dann terminiert. Tritt immer<br />

wieder ’a’ ein aber nie ’b’, werden immer wieder neue Prozesse erzeugt, die nicht<br />

terminieren. Der Zustandsraum wird damit unendlich groß.<br />

A −→ a A ‖ B<br />

B −→ b ɛ<br />

Diese Modellierung entspricht nicht ganz der Semantik von Esterel, wie das<br />

folgende Ausführungsbeispiel des (P,P)–PES zeigt.<br />

A a −→ B ‖ A a −→ B ‖ B ‖ A b −→ B ‖ A ...<br />

In den ersten beiden Schritten gilt ’a’ und nicht ’b’, daher wird jeweils ein<br />

neuer Prozess erzeugt. Zwei Prozesse warten nun auf ’b’. Bei der Aktion ’b’ wird<br />

ein Prozess zu ɛ umgeschrieben, aber nach der Semantik von Esterel terminieren<br />

beide Prozesse synchron. Da eine unbeschränkte Menge von Prozessen synchron<br />

einen Schritt machen kann, die Menge der Ersetzungsregeln aber nur endlich ist,<br />

ist diese Umsetzung nicht möglich.


283<br />

6 Zusammenfassung<br />

Esterel, Mealy–Automaten und (1,1)–PES haben dieselbe Ausdrucksstärke. Esterel–Programme<br />

können mit (1,1)–PES in eine formale Beschreibung überführt<br />

werden. Wie bei der Umsetzung mit Mealy–Automaten entstehen durch parallele<br />

Komposition von Esterel–Prozessen eine große Anzahl von Termen und Ersetzungsregeln.<br />

Da parallele Prozesse in Esterel synchron sind, kann die Anzahl der<br />

Regeln durch die Verwendung von (P,P)–PES nicht reduziert werden.<br />

Durch Einführen von Rekursion und unbeschränkter Parallelität kann Esterel<br />

die Ausdrucksstärke von (S,S)– bzw. (P,P)–PES gegeben werden. Eine formale<br />

Beschreibung mit PES ist nicht möglich, da eine unbeschränkte Anzahl synchroner<br />

Prozesse nicht mit einer endlichen Menge von Ersetzungsregeln beschrieben<br />

werden kann. Dasselbe Problem ergibt sich bei einem Prozessabbruch, wenn der<br />

abgebrochene Prozess eine unbeschränkte Anzahl von Termen haben kann.<br />

Literatur<br />

[Ber00] Gérard Berry. The Esterel v5 Language Primer, 2000.<br />

[Esp02] Javier Esparza. Grammars as Processes. Formal and Natural Computing,<br />

pages 277–297, 2002.<br />

[May99] Richard Mayr. Process Rewrite Systems. Information and Computation,<br />

1999.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!