Programmierung von wahrheitswerten
Problemstellung
Zur lösung von logikaufgaben mit dem rechner müssen die wahrheitswerte als Boole'sche variablen fomuliert werden: »true« oder »false«, 1 oder 0.
Wenn das ereignis A bedeuten soll, dass Otto angst hat, dann bedeutet A = 1: Otto hat angst.
Soll das ereignis M bedeuten, dass Otto müde ist, dann bedeutet M = 0: Otto ist nicht müde.
Wenn wir nun die zwei ereignisse verknüpfen und den wahrheitswert dieser verknüpfung aus den wahrheitswerten der einzelereignisse berechnen wollen, stoßen wir auf eine schwierigkeit. Die rechnerische verknüpfung muss wieder einen der beiden werte 0 oder 1 annehmen, denn auch die verknüpfung kann wieder nur wahr oder falsch sein.
Wie würden wir nun zum beispiel eine oder-verknüpfung formulieren? Wenn mindestens eines der beiden ereignisse den wahrheitswert 1 annimmt, muss die verknüpfung ebenfalls 1 werden. Versuchen wir es mit der multiplikation. Die würde nur dann 1 ergeben, wenn
beide einzelereignisse zutreffen. Wenn nur eines zutrifft, ist das produkt 1 * 0 aber 0, obwohl es ebenfalls 1 sein müsste. Würde die addition vielleicht das gewünschte ergebnis liefern? Die führt in den beiden fällen, in denen nur eines der ereignisse eintritt, tasächlich zu 1, aber wenn beide eintreten, zu 2.
Dem problem könnte mit einer IF-klausel im programm begegnet werden, doch das wäre keine echte
berechnung des wahrheitswertes der verknüpfung mehr. Eine solche soll aber nachfolgend versucht werden.
Konzept
Wir verwenden nicht die wahrheitswerte 1 und 0, sondern 1 und -1. Eine nicht zutreffende aussage hat somit den wert -1 statt 0. Die 1 für eine wahre aussage bleibt unverändert.
Damit lässt sich wirklich rechnen.
Wir ordnen die vier kombinationen der ereigniss A und M wie folgt an.
A | M | Das heißt |
1 | 1 | Otto hat angst. | Otto ist müde. |
-1 | 1 | Otto hat keine angst. | Otto ist müde. |
1 | -1 | Otto hat angst. | Otto ist nicht müde. |
-1 | -1 | Otto hat keine angst. | Otto ist nicht müde. |
Nachher werden wir für jeden verknüpfungstyp die wahrheitswerte rechts danebenschreiben.
Und-verknüpfung
A | M | sgn(A + M − 1) |
1 | 1 | 1 |
-1 | 1 | -1 |
1 | -1 | -1 |
-1 | -1 | -1 |
A ∧ M wird berechnet zu sgn(A + M − 1)
Nur wenn beide ereignisse eintreten, ist deren verknüpfung wahr.
Haben beide den wahrheitswert -1, dann führt die summe noch weiter ins negative hinein, das vorzeichen bleibt negativ.
Hat nur ein ereignis den wahrheitswert -1 und das andere +1, dann heben sie sich gerade zu 0 auf, werden aber nicht +1. Durch subtraktion von 1 wird das vorzeichen wieder negativ.
Nur wenn beide +1 sind, dann wird ihre summe 2 groß genug, damit nach abzug von 1 noch 1 übrigbleibt. Erst jetzt wird das vorzeichen positiv. Und genau dies muss bei der und-verknüpfung passieren.
Anmerkung
Die signum-funktion gibt genau genommen nicht das vorzeichen an (minus oder plus), sondern eine vollständige zahl. sgn(-7) = -1 sgn(9) = +1
In Basic gibt die signum-funktion für die zahl 0 wieder 0 zurück. Man könnte die null dahingehend verstehen, dass das nichts (die null) »kein« (null) vorzeichen hat.
Oder-verknüpfung (inklusiv)
A | M | sgn(A + M + 1) |
1 | 1 | 1 |
-1 | 1 | 1 |
1 | -1 | 1 |
-1 | -1 | -1 |
A ∨ M berechnet sich zu sgn(A + M + 1)
Dank der
addition von 1 wird eine oder- verknüpfung eher, d. h. bei kleineren werten von A und M, positiv als eine und-verknüpfung (bei der 1
abgezogen wird).
Haben beide einzelereigniss den wahrheitswert -1, liegt die summe -2 immer noch weit genug im negativen zahlenraum, dass die addition von 1 am negativen vorzeichen nichts ändert.
Hat eines der ereignisse den wert 1 und das andere -1, dann wird die summe 0 um 1 vergößert, und schon ist die verknüpfung positiv.
Betragen beide wahrheitswerte 1, landen wir bei 2 + 1 = 3, womit die signumfunktion wieder 1 ergibt.
Beachte: Auch wenn
beide ereignisse eintreten, ist die verknüpfung wahr, obwohl es strenggenommen kein »oder« im sinne einer alternative ist (»entweder ... oder ...«). Hier geht es darum, dass »mindestens eine« der beiden bedingungen erfüllt ist. Darum spricht man auch vom »inklusiven oder«. Das »exklusive oder« folgt weiter unten.
Implikation
A | M | -sgn(A − M − 1) |
1 | 1 | 1 |
-1 | 1 | 1 |
1 | -1 | -1 |
-1 | -1 | 1 |
A → M = -sgn(A − M − 1)
Solange der erste wert klein genug ist (-1, fälle 2 und 4) und der zweite wert positiv (fälle 1 und 2), führt die subtraktion des zweiten wertes zu einem negativen ergebnis. Nur im dritten fall ist der erste wert bereits positiv und führt die subtraktion des negativen zweiten wertes zu einer vergrößerung und damit zu einem positiven vorzeichen.
Wahrheitsmäßig muss es aber genau umgekehrt sein, fall drei muss als einziger falsch sein. Darum werden die vorzeichen umgekehrt.
Umgangssprachlich würde die implikation etwa wie folgt lauten: »Wenn Otto angst hat, dann ist er müde.«
Sind beide bedingungen erfüllt, sind deren wahrheitswerte gleich, und damit ist die verknüpfung erfüllt.
Ist A = -1 und M = 1, ist die verknüpfung ebenfalls wahr. Denn Ottos müdigkeit kann auch einen anderen grund haben als angst.
Die verknüpfung ist nur in einem fall nicht erfüllt, wenn A = 1 und M = -1, wenn also A > M wird. Dann nämlich hat Otto angst, aber er wird in der folge
nicht müde.
Äquivalenz
A | M | sgn(A * M) |
1 | 1 | 1 |
-1 | 1 | -1 |
1 | -1 | -1 |
-1 | -1 | 1 |
A ↔ M = sgn(A * M)
Das positive vorzeichen tritt nur dann auf, wenn beide ereignisse den gleichen wahrheitswert haben. Tritt nur ein ereignis ein, ist das andere negativ und damit auch das vorzeichen des produktes.
Die äquivalenz ist gleichbedeutend mit einer implikation in beide richtungen.
Exklusiv-oder
A | M | -sgn(A * M) |
1 | 1 | -1 |
-1 | 1 | 1 |
1 | -1 | 1 |
-1 | -1 | -1 |
A ⊻ M = -sgn(A * M)
Wir drehen das ergebnis der äquivalenz durch multiplikation mit -1 um. Jetzt wird die verknüpfung negativ, wenn beide ereignisse den gleichen wahrheitswert haben. Und wenn sie verschiedene wahrheitswerte haben, also das produkt eigentlich negativ ist, wird es nun positiv gemacht.
Hinweis: Die englische abkürzung »xor« steht für »exclusive or«, wobei das »x« nicht einen anfangsbuchstaben meint, sondern an den
klang des wortanfangs von »exclusive« erinnern soll.
Die festlegung der wahrheitswerte auf 1 und -1 hat den vorteil, dass die signum-funktion verwendet werden kann, weil sie auf diese werte abbildet, selbst wenn der betrag von 1 abweicht. So im falle der 3 bei der oder-verknüpfung oder im falle der -3 bei der und-verknüpfung sowie bei der implikation.
Für A = 1 und M = 1 ergibt A ∨ M: sgn(1 + 1 + 1) = sgn(3) = 1
Für A = -1 und M = -1 ergibt A ∧ M: sgn(-1 + (-1) − 1) = sgn(-3) = -1
Für A = -1 und M = 1 ergibt A → M: -sgn(-1 − 1 − 1) = -sgn(-3) = -(-1) = 1
Das macht die sache flexibel.
Mit diesen formeln können logische verknüpfungen in verschiedenen programmiersprachen berechnet werden. Geben Sie für zwei ereignisse die wahrheitswerte 1 und -1 vor, setzen Sie diese in die formel für den gewünschten verknüpfungstyp ein, und Sie werden sehen, ob die bedingung erfüllt wird.
Zwar bieten die programmiersprachen üblicherweise eine einfachere sprachregelung für die logischen operatoren an wie AND, OR, XOR, NOT, IMP und EQU, womit es nicht mehr erforderlich ist, von hand eine berechnungsformel zu entwickeln. Trotzdem ist es schön zu wissen, dass man auch anderswie an sein ziel kommen kann. Und solch eine magische formel zu entwickeln, ist doch viel interessanter als einfach IMP zu notieren, nicht wahr?
[xxviii·ix·mmxxv]