BIT I, WS 2016/17 Inhaltsverzeichnis Formale Grundlagen (Nachträge) 1 Aussagenlogik: Funktionale Vollständigkeit . . . . . . . . . . . . . . . . . . . 1 Bit-Arithmetik mit logischen Operationen . . . . . . . . . . . . . . . . . . . . 3 Prädikatenlogik: Eine ganz kurze Einführung 4 . . . . . . . . . . . . . . . . . . Formale Grundlagen (Nachträge) Einige Punkte, die wir bisher im Zusammenhang mit den formalen Grundlagen vernachlässigt haben, werden hier kurz erläutert. Aussagenlogik: Funktionale Vollständigkeit In der Einführung zur Aussagenlogik hatten wir fünf zweistellige Junktoren kennengelernt, die für die sprachichen Ausdrücke dann wenn stehen, in Zeichen: und, oder, entweder oder, wenn dann und genau ∧, ∨, Y, → und ⇔. Nun kann es neben den genannten fünf oenbar noch weitere zweistellige Junktoren geben. Allen diesen Junktoren ist ja gemein, dass Sie die vier möglichen Kombinationen aus je zwei Wahrheitswerten abbilden auf vier einzelne Wahrheitswerte. Der Junktor falsch ) ∧ etwa bildet die Kombinationen (falsch, falsch ), (falsch, wahr ) und (wahr, ab auf den Wahrheitswert Wahrheitswert wahr. Es gibt nun genau 24 = 16 falsch wahr, wahr ) und die Kombination ( auf den solcher möglichen Abbildungen. p q > ∨ ← c → b ⇔ ∧ w w f f w f w f w w w w w w w f w w f w w w f f w f w w w f w f w f f w w f f f p q ⊥ ↓ 6← e 6→ d Y | w w f f w f w f f f f f f f f w f f w f f f w w f w f f f w f w f w w f f w w w Die Bezeichnungen lauten (u.a.): Verum, Tautologie (immer wahr) ∨: Disjunktion, oder, OR ←: Replikation, Konversion (entspricht q → p) c: Präpendenz, Identität von p (wahr, wenn p wahr) →: Implikation, Subjunktion, Konditional, wenn dann • >: • • • • 1 BIT I, WS 2016/17 Formale Grundlagen (Nachträge) Postpendenz, Identität von q (wahr, wenn q wahr) ⇔: Bikonditional, Bijunktion, Äquivalenz, genau dann wenn ∧: Konjunktion, und, AND ⊥: Falsum, Kontradiktion (immer falsch) ↓: Peirce-Pfeil, NOR (entspricht: ¬(p ∨ q)) 6←: Präsektion, nur q e: Pränonpendenz, Negation von p 6→: Postsektion, nur p d: Postnonpendenz, Negation von q Y: exklusive Disjunktion, Kontravalenz, XOR |: Sheer-Strich, NAND (entspricht ¬(p ∧ q)) • b: • • • • • • • • • • Einige der Junktoren lassen sich durch Kombinationen anderer Junktoren zum Ausdruck bringen. So sind sind die Ausdrücke p w w f f Da statt q w f w f p∧q und ¬(¬p ∨ ¬q) äquivalent. ¬p ¬q ¬p ∨ ¬q ¬(¬p ∨ ¬q) p∧q f f w w f w f w f w w w w f f f w f f f p und q stets auch beliebig komplexe Formeln stehen könnten, heiÿt das, das wir den Operator ∧ streng genommen gar nicht brauchen. Wir könnten ihn überall ersetzen durch eine Kombination aus den Zeichen ∨ und ¬. alle anderen Junktoren auf diese Weise zu funktional vollständig. Zu ihnen gehören unter anderem { ∧, ¬ }, { Mengen von Zeichen, die in der Lage sind, ersetzen, nennen wir ∨, ¬ } und { →, ¬ }. Nur zwei Junktoren haben die Eigenschaft allein funktional vollständig zu sein. Es handelt sich um den Peirce-Pfeil (↓, NOR) und den Sheer-Strich (|, NAND). Sie reichen also jeweils allein aus, um alle nur denkbaren aussagenlogischen Ausdrücke zu formulieren. Hier ein Beispiel für die Äquivalenz ((p|p)|(q|q)) ⇔ (p ∨ q), die zeigt, dass wir ∨ "durch einen Ausdruck ersetzen können, der nur | enthält. p w w f f q w f w f p|p q|q (p|p)|(q|q) p∨q f f w w f w f w w w w f w w w f Diese Erkenntnis kann man sich zu Nutze machen. Wo Logikgatter in digitalen Schaltungen vorkommen, können diese stets durch das Hintereinanderschalten von NOR-Gattern gebildet werden. Die allermeisten NAND- und/oder NOR- und NOT-Gatter ein. NAND oder digitalen Schaltkreiese setzen daher nur 2 BIT I, WS 2016/17 Formale Grundlagen (Nachträge) Bit-Arithmetik mit logischen Operationen Die logischen Operationen können eingesetzt werden, um arithemtische Operationen zu implementieren. Wir gehen im folgenden nur das Beispiel der Addition von zwei 8-BitZahlen durch. Beispiel: Gegeben sind die Zahlen a = 12 und b = 5, als Bitfolgen: a = 00001100 b = 00000101 Als Ergebnis einer Addition dieser beiden Zahlen erwarten wir die 8-Bit-Bitfolge für 17: 00010001. 1. Vorüberlegung : Beim bitweisen Addieren von zwei Binärzahlen können wir im Prinzip drei Fälle unterscheiden: 1. Bit 2. Bit 3. Bit 0 0 1 + Bit + Bit + Bit 0 1 1 = Ergebnis ist = Ergebnis ist = Ergebnis ist 0 1 0, Übertrag von 1 Lassen wir den Übertrag im 3. Fall zunächst auÿen vor, so scheint es als wäre die Operation XOR perfekt geeignet. Der Operator (entspricht: Y) 0 und 1 auf 1 ab und die Kombinationen (0, 0) nationen von auf 0 bildet alle Kombiund (1, 1) werden abgebildet. sum = a ^ b // sum ist: 00001001 Wie ist aber mit dem Übertrag zu verfahren? Zunächst einmal können wir feststellen, dass der Übertrag nur zustande kommt, wenn die zu addierenden Bits beide 1 sind. Wir können daher mit der Operation AND feststellen, an welchen Stellen ein Übertrag entsteht: carry = a & b // carry ist: 00000100 Ein Übertrag wirkt sich normalerweise so aus, dass die zu übertragende Zahle eine Stelle weiter links notiert und addiert wird. Um das nachzumachen, können wir einen Bitshift um eine Position nach links anwenden. shifted = carry << 1 // shifted ist: 00001000 Nun müssten wir im Prinzip nur noch shifted auf sum addieren, also den Über- trag und das Ergebnis der Addition ohne Übertrag. Auch das funktioniert mit Bitoperatoren auf die gleiche Weise. Statt und shifted a und b addieren wir nun einfach sum und wiederholen das so lange, bis keine Übertrag mehr entsteht. carry = shifted & sum; // carry ist: 00001000 sum = shifted ^ sum; // sum ist: 00000001 shifted = carry << 1; // shifted ist: 00010000 Da es wieder einen Übertrag gab (carry 6= 0), müssen wir die ganze Operation noch einmal wiederholen: carry = shifted & sum; // carry ist: 00000000 sum = shifted ^ sum; // sum ist: 00010001 shifted = carry << 1; // shifted ist: 00000000 3 BIT I, WS 2016/17 2. Implementation : Formale Grundlagen (Nachträge) Eine Implementation dieser Schritte in einer Funktion könnte etwa so aussehen: int binary_add(int a, int b) { int sum = a ^ b; int carry = a & b; int shifted = carry << 1; while(carry != 0) { carry = shifted & sum; sum = shifted ^ sum; shifted = carry << 1; } } return sum; Prädikatenlogik: Eine ganz kurze Einführung Viele der Aussagen, die wir alltäglich benutzen wenden Prädikate auf bestimmte Objekte an. Das ist etwa bei den folgenden Aussagen der Fall. Das Hemd ist schwarz Vera läuft. Die Prüfung ist einfach. Dabei bezeichnen Das Hemd, Vera und die Prüfung Gegenstände in der Welt. (Im weitesten Sinne des Wortes Gegenstände. Hier ist alles gemeint, was sich irgendwie sprachlich identizieren lässt.) Schwarz sein, laufen und einfach sein können wir als Eigenschaften • • • oder Prädikate auassen, die von diesen Gegenständen ausgesagt werden. In der Prädikatenlogik können solche Aussagen formalisiert werden durch die Angabe von Individuenkonstanten (z.B.: a, b, c, . . . ) und Prädikatfunktionen (z.B. F (x), G(x), H(x), . . . ). Wir können dann z.B. schreiben: • F (a) • G(b) wobei gelten könnte: • F (x) = x ist schwarz • G(x) = x läuft • a = Das Hemd • b = Vera Da die Prädikatenlogik eine Erweiterung der Aussagenlogik darstellt, können wir diese Aussagen auch mit den Junktoren der Aussagenlogik verknüpfen. So würde F (a) ∧ G(b) den natürlichsprachlichen Satz Das Hemd ist schwarz und Vera läuft formalisieren. Ihre eigentliche Stärke hat die Prädikatenlogik aber dort, wo nicht Sätze über einzelne Gegenstände mit Individuenkonstanten formalisiert werden, sondern wo sie die Formalisierung von generellen Aussagen über Klassen von Gegenständen erlaubt. Dazu kommen 4 BIT I, WS 2016/17 Formale Grundlagen (Nachträge) Individuenvariablen zum Einsatz (. . . , x, y, z ) sowie Quantoren (∀, ∃, lies: Für alle, Es gibt ein ). Damit lassen sich dann Aussagen wie die Folgenden formulieren: • ∀x F (x) → G(x) • ∃y F (y) ∧ G(y) Wäre nun F (x) = x ist aus Kupfer und G(x) = x leitet Elektrizität, dann hätten wir damit fomuliert: • • Für alle Gegenstände x gilt: Wenn x aus Kupfer ist, dann leitet x Elektrizität. Es gibt mindestens einen Gegenstand y, sodass gilt: y ist aus Kupfer und y leitet Elektrizität. Dabei ist leicht einsehbar, dass es eine Beziehung zur Mengenlehre gibt. Viele Aussagen der Prädikatenlogik lassen sich leicht in Aussagen über Mengen übertragen. Sei {x | F (x)} und MG = {x | G(x)}, MF = dann können wir statt den obigen beiden Aussagen auch schreiben: • MF ⊂ MG • |MF ∩ MG | > 0, bzw.: MF ∩ MG 6= ∅ 5