Verifikation reaktiver Systeme - Universität Kaiserslautern
Verifikation reaktiver Systeme - Universität Kaiserslautern
Verifikation reaktiver Systeme - Universität Kaiserslautern
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.