George Boole und seine Variablen

Was würde wohl George Boole(1815-1864), der englische Mathematiker und Philosoph, der Namensgeber der Booleschen Variablen, dazu sagen, wenn er wüsste, dass über hundert Jahre nach seinem Tod sein Name in so gut wie jedem Quelltext verewigt ist? Und was würde er sagen, wenn er wüsste, dass viele Programmieranfänger Probleme mit „seinen“ Variablen haben?
Damit er sich zumindest über die letzte Frage nicht mehr so viele Gedanken machen muss, soll dieses Tutorial helfen, diesbezügliche Verwirrungen aufzuklären. Denn eigentlich ist alles ganz einfach…

Boolesche Logik – Grundlagen

„Wieso Boolesche Logik? Gibt es denn verschiedene Logiken?“, werden sich manche vielleicht fragen. Und ja, genauso ist es. Wer sich dafür interessiert, kann sich mal den entsprechenden Wikipedia-Artikel durchlesen. Hier soll es aber nur um die Boolesche Logik gehen, denn diese ist beim Programmieren entscheidend. Auch, wenn manches in der Booleschen Logik zuerst einmal ziemlich unlogisch aussieht( 😉 ), so gehört die Boolesche Logik zu den einfachsten. Man muss sich nur erst einmal daran gewöhnen…

Wahrheitswerte

In der Booleschen Algebra (~Boolesche Logik) gibt es nur 2 Werte: wahr und falsch, true und false, 1 und 0. das vereinfacht so ziemlich alles kolossal(mathematisch gesehen zumindest):
Eine Aussage kann nicht „bis zu einem gewissen Grade“ wahr sein. Entweder eine Aussage ist wahr oder sie ist falsch.

Beispiele
Aussagen, die wahr sind:
– Das Wort ‚Delphi‘ fängt mit einem ‚D‘ an.
– Wenn der Hahn kräht auf dem Mist, ändert sich’s Wetter oder’s bleibt, wie’s ist.
– 2+2=4

Aussagen, die falsch sind:
– Alle Wörter fangen mit einem ‚D‘ an.
– Die Hähne bestimmen, wie das Wetter wird.
– 2+2=5

Aussagen, die je nach gegebener Situation wahr oder falsch sein können:
– Heute ist Montag.
– Der Benzinpreis ist heute schon wieder gestiegen.
– Mein Geburtstag fällt dieses Jahr auf einen Sonntag.

Aussagen, die weder wahr noch falsch sind und deshalb nicht Gegenstand der Booleschen Algebra sind:
– Wie viel Uhr ist es?(kein Wahrheitswert)
– Delphi ist eine schöne Sprache.(subjektiv)
– Delphi eignet sich gut um zu programmieren.(Nur bis zu einem gewissen Grade richtig(was man immer dann werkt, wenn mal wieder jemand ein Betriebssystem in Delphi schreiben will…))

Mit Wahrheiten rechnen

Um nun mit diesen Wahrheitswerten zu rechnen gibt es verschiedene Rechenoperationen: Nullfunktion, Konjunktion(and), Inhibit, Identität, Antivalenz(xor), Disjunktion(or), nor, Äquivalenz, Negation(not), Implikation, nand, …
Von diesen allen sollen und hier aber nur and, or, not, xor und die Äquivalenz interessieren.

and
Der Resultierende Wahrheitswert ist genau dann wahr, wenn beide Werte wahr sind:

1
2
3
4
5
6
7
var
  b1, b2: Boolean;
begin
  b1 := True;
  b2 := False;
  if b1 and b2 then
    ... // wird nicht ausgeführt

or
Der Resultierende Wahrheitswert ist genau dann wahr, wenn der eine oder der andere oder beide Werte wahr sind:

1
2
3
4
5
6
7
var
  b1, b2: Boolean;
begin
  b1 := True;
  b2 := True;
  if b1 or b2 then
    ... // wird ausgeführt

Das ist etwas anders, als man es vom allgemeinen Sprachgebrauch her kennt. Mit or/oder ist hier das logische oder gemeint. Also nicht „entweder…oder“. Es können also auch beide Werte wahr sein.

not
Not invertiert einen Wahrheitswert. Aus True wird False und aus False True:

1
2
3
4
5
6
var
  b: Boolean;
begin
  b := False;
  if not b then
    ... // wird ausgeführt

Äquivalenz
Der resultierende Wahrheitswert ist genau dann wahr, beide Wahrheitswerte wahr oder beide falsch sind(also gleich).

1
2
3
4
5
6
7
var
  b1, b2: Boolean;
begin
  b1 := True;
  b2 := True;
  if b1 = b2 then
    ... // wird ausgeführt

xor
xor(Antivalenz, exklusives oder) ist nun das aus dem allgemeinen Sprachgebrauch bekannte „entweder…oder“. Der Resultierende Wahrheitswert ist genau dann wahr, wenn entweder der eine oder der andere, nicht aber beide Werte wahr sind(also unterschiedlich):

1
2
3
4
5
6
7
var
  b1, b2: Boolean;
begin
  b1 := True;
  b2 := True;
  if b1 xor b2 then
    ... // wird *nicht* ausgeführt

zu erwähnen ist vielleicht noch, dass man xor als Kombination von and und or darstellen kann:

1
2
3
4
5
6
7
a xor b
//ist nichts anderes, als
(a or b) and not (a and b)
// bzw:
(a and (not b)) or ((not a) and b)
// bzw:
a <> b

Logik-Minimierung

Am letzten Beispiel sieht man, dass die Darstellungen logischer Ausdrücke nicht eindeutig ist. Für ein und denselben Ausdruck gibt es immer viele Möglichkeiten der Darstellung. Manche sind einfach, andere komplex und wieder andere sind kompliziert.
Manchmal kann es sinnvoll sein, komplexe (oder gar komplizierte) Boolsche Ausdrücke zu vereinfachen. Diesen Prozess nennt man Logik-Minimierung. Durch geschicktes Umformen können ganze Teilterme wegfallen, sodass sich ein komplizierter Ausdruck mitunter stark vereinfachen kann. Der entsprechende Wikipedia-Artikel liefert hier weitere Informationen.

Bit-Operationen

Die Operatoren and, or, xor und not lassen sich auch mit Integer-Werten benutzen. Dann bezeichnen sie die so genannten Bit-Operatoren. Prinzipiell wird hier jedes einzelne Bit als Wahrheitswert interpretiert. Da das Resultat dann aber meist von dem abweicht, was der Programmier-Anfänger sich gedacht hat, stiftet dies des Öfteren Verwirrung. Bit-Oprationen werden oft bei Verschlüsselungen, sowie in Verbindung mit Bitfeldern in der WinAPI (in C/C++ Ersatz für die dort fehlenden Mengentypen) u.ä. eingesetzt und spielen beim „normalen“ Programmieren im Vergleich zu den Boolean-Operatoren oft eine eher untergeordnete Rolle.

Kapitel: | 1 | 2 | 3 | Weiter |

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.