Algorithmen & Programmierung Logik
Aussagenlogik Gegenstand der Untersuchung Es werden Verknüpfungen zwischen Aussagen untersucht. Aussagen Was eine Aussage ist, wird nicht betrachtet, aber jede Aussage besitzt genau einen Wahrheitswert. Wahrheitswerte Aussage ist wahr Wahrheitswert true Aussage ist falsch Wahrheitswert false 206
So sollte man es nicht machen! Aussage 1? Pinguine sind schwarz-weiß. Aussage 2 Alte Filme sind schwarz-weiß. Verknüpfung der beiden Aussagen Pinguine sind alte Filme. 207
Verknüpfung von Aussagen Gegeben seien zwei Aussagen A und B Konjunktion (logisches Und) Die Verknüpfung A B ist eine Aussage. Disjunktion (logisches Oder) Die Verknüpfung A B ist eine Aussage. Negation (logisches Nicht) A ist eine Aussage. Prinzip der Extensionalität Der Wahrheitswert einer Aussageverknüpfung hängt ausschließlich von den Wahrheitswerten ihrer Teilaussagen ab. 208
Negation Bedeutung Die Negation negiert eine Aussage: A ist genau dann wahr, wenn A nicht wahr (d.h. falsch) ist. Alternative Darstellung Ā Alternative Bezeichnungen Komplement NOT Wahrheitstabelle A A false true true false 209
Konjunktion Bedeutung A B ist nur dann wahr, wenn Aussage A und Aussage B wahr sind. Alternative Bezeichnungen Und AND Wahrheitstabelle A B A B false false false false true false true false false true true true 210
Disjunktion Bedeutung A B ist wahr, wenn mindestens eine der beiden Aussagen A oder B wahr ist. Alternative Bezeichnungen Oder OR Wahrheitstabelle A B A B false false false false true true true false true true true true 211
Verknüpfung von Aussagen Es gibt weitere Aussageverknüpfungen, die sich jedoch mit Negation und Konjunktion bzw. Negation und Disjunktion darstellen lassen: Antivalenz Wahrheitstabelle A A Äquivalenz false true Implikation true false Logische Vollständigkeit Alle logischen Verknüpfungsvarianten lassen sich ausschließlich mit Negation und wahlweise Konjunktion oder Disjunktion ausdrücken. Wahrheitstabelle A B A B false false false false true false true false false true true true Wahrheitstabelle A B A B false false false false true true true false true true true true 212
Antivalenz Bedeutung A B ist genau dann wahr, wenn ausschließlich Aussage A wahr ist oder ausschließlich Aussage B wahr ist. Anders ausgedrückt: A und B müssen entgegengesetzte Wahrheitswerte aufweisen. Alternative Bezeichnung Exklusives Oder XOR Wahrheitstabelle A B A B false false false false true true true false true true true false 213
Äquivalenz Bedeutung A B ist nur dann wahr, wenn Aussage A den selben Wahrheitswert wie Aussage B aufweist. Hierbei spielt es keine Rolle, welcher Wahrheitswert dies konkret ist. Wahrheitstabelle A B A B false false true false true false true false false true true true 214
Implikation Bedeutung A B (Sprechweise A impliziert B oder B folgt aus A) ist nur dann wahr, wenn entweder Aussage B wahr ist oder beide Aussagen falsch sind. Wahrheitstabelle A B A B false false true false true true true false false true true true 215
Logische Vollständigkeit Es gibt zwei weitere Verknüpfungsvarianten, die ebenfalls nur eine Kombination aus Negation und Konjunktion bzw. Negation und Disjunktion sind: NAND (NOT AND) Es gilt: A NAND B = (A B) NOR (NOT OR) Es gilt: A NOR B = (A B) Bedeutung Wahrheitstabelle NAND A B A NAND B false false true false true true true false true true true false Wahrheitstabelle NOR A B A NOR B false false true false true false true false false true true false Sowohl NAND als auch NOR sind logisch vollständig, d.h. dass man lediglich mit einer dieser beiden Verknüpfungsvarianten jede andere logische Verknüpfung ausdrücken kann. NAND-Gatter stellen die Basis digitaler Technik dar. 216
Logische Vollständigkeit Beispiel A A NAND A A B (A NAND B) NAND (A NAND B) A B (A NAND A) NAND (B NAND B) Wahrheitstabelle NAND A B A NAND B false false true false true true true false true true true false A B (A NAND (B NAND B)) NAND ((A NAND A) NAND B) A B (A NAND B) NAND ((A NAND A) NAND (B NAND B)) A B A NAND (B NAND B) A NOR B ((A NAND A) NAND (B NAND B)) NAND ((A NAND A) NAND (B NAND B)) 217
Boolesche Algebra Begriff Der Begriff geht auf George Boole (1815-1869) zurück, dessen Logikkalkül von 1847 die Grundlage der heute verwendeten Form darstellt. Inhalt Beschrieben werden eine Menge von Axiomen auf der Menge der Wahrheitswerte 0 (false) und 1 (true) sowie der einstelligen Verknüpfung Negation und den zweistelligen Verknüpfungen Konjunktion und Disjunktion. 218
Boolesche Algebra De Morgansche Regeln Kommutativgesetze Idempotenz Assoziativgesetze Distributivgesetze Absorptionsregeln Konstantensubstitution 219
Logik in C Verknüpfungsoperationen C unterstützt die boolesche Algebra direkt durch die Bereitstellung der Verknüpfungsoperationen Konjunktion, Disjunktion und Negation. Wahrheitswerte Des Weiteren gelten für die Bereitstellung der Wahrheitswerte folgende Regeln: Der Integerwert 0 entspricht dem Wahrheitswert false Ein Integerwert ungleich 0 entspricht dem Wahrheitswert true Bessere Modellierung Ab dem C99 Standard gibt es einen vordefinierten Datentyp bool, der die ebenfalls vordefinierte Wertemenge true und false bereitstellt. Allerdings muss zu seiner Nutzung die Bibliothek <stdbool.h> vorher eingebunden werden. In C++ ist der Datentyp bool standardmäßig in das Sprachkonzept integriert. 220
Logik in C Wir haben bereits (unwissentlich) mit logischen Ausdrücken in C gearbeitet: Selektion Iteration if ( Bedingung ) else Anweisung1 while ( Bedingung ) Anweisung Anweisung2 Bedingung Eine Bedingung (Vergleichsoperation) ist eigentlich ein logischer Ausdruck, dessen Auswertung einen Wahrheitswert produziert (Bedingung erfüllt true, Bedingung nicht erfüllt false). 221
Verknüpfung Verknüpfungsoperationen Mit Hilfe dieser Operatoren können logische Ausdrücke gemäß der booleschen Algebra miteinander verknüpft werden: logisches Und && (Konjunktion) logisches Oder (Disjunktion) Komplement! (Negation) Ergebnis der Verknüpfung Ist ein logischer Ausdruck, dessen Wahrheitswert aus der Wahrheitstabelle der gewünschten Verknüpfungsoperation und den Wahrheitswerten der zu verknüpfenden Teilausdrücke resultiert. Anwendung Kompakte Darstellung komplexer Bedingungen. 222
Verknüpfung - Beispiel Die Vorbedingung des Euklidischen Algorithmus lautete, dass der größte gemeinsame Teiler nur von natürlichen Zahlen gebildet werden kann. Mit Hilfe der logischen Verknüpfungsoperatoren können wir diese Forderung jetzt bequem formulieren: int ggt(int a, int b) { if (a > 0 && b > 0) { while (a!= b) { if (a > b) a = a - b; else b = b - a; } } else // 0 als Fehlercode, da a = 0; // kein Teiler 0 möglich } return a; } 223
Verknüpfung - Beispiel Gregorianischer Kalender Der in der westlichen Welt seit 1582 gültige Gregorianische Kalender definiert eine Jahreslänge von 365,2425 Tagen. Weil die nächste ganzzahlige Jahreslänge von 365 Tagen zu kurz ist, wird aller vier Jahre ein zusätzlicher Tag - der Schalttag 29. Februar - eingeführt. Um weiteren Rechenungenauigkeiten (wie bei dem im römischen Reich gebräuchlichen Julianischen Kalender) vorzubeugen, gilt ergänzend noch folgende Regel: Durch 100 teilbare Jahre stellen nur dann Schaltjahre dar, wenn sie auch durch 400 teilbar sind. Aufgabe Wir wollen herausfinden, ob ein beliebiges Jahr ein Schaltjahr ist. Bedingungen für Schaltjahre 1. Wenn ein Jahr durch 400 teilbar ist, dann ist es ein Schaltjahr 2. Wenn ein Jahr durch 100 teilbar ist, dann ist es kein Schaltjahr (außer wenn 1. gilt) 3. Wenn ein Jahr durch vier teilbar ist, dann ist es ein Schaltjahr (außer wenn 2. gilt) 224
Komplementäre Ausdrücke Selektionen der Form if ( logischer Ausdruck ) Anweisung1 else Anweisung2 // Wenn logischer Ausdruck nach true ausgewertet werden kann // wird Anweisung1 ausgeführt // sonst // wird Anweisung2 ausgeführt können wir durch Negation des Selektionskriteriums umformen in if (! logischer Ausdruck ) Anweisung2 else Anweisung1 // Wenn logischer Ausdruck nach false ausgewertet werden kann // wird Anweisung2 ausgeführt // sonst // wird Anweisung1 ausgeführt Anwendung Unter Umständen bessere Modellierung bzw. Verständnis einer zu formulierenden Bedingung. 225
Äquivalenz von Vergleichen Der Vergleich zweier Werte lässt sich auf verschiedene Art und Weise beschreiben. Nutzen äquivalente Umformungen können verständlicher sein Weniger Rechenoperationen durch Wegfall der Negation Äquivalente Vergleichsoperationen x < y!(x >= y) y > x!(y <= x) x <= y!(x > y) y >= x!(y < x) x == y!(x!= y) y == x!(y!= x) x >= y!(x < y) y >= x!(y < x) x > y!(x <= y) y < x!(y >= x) x!= y!(x == y) y!= x!(y == x) 226
Ende der Vorlesung