# Aussagenlogik

Diese Präsentation zeigt einige der in mathGUIde eingebauten Funktionen der Aussagenlogik

Aussagenlogische Formeln, die den Klassenmethoden der Klasse `Logic` übergeben werden, müssen wie folgt aufgebaut sein:

- Variablen müssen einzelne Buchstaben sein.
- Erlaubte Junktoren sind: `not`, `and`, `or`, `xor`, `->`, `<->`.

### Wahrheitswerttafel

Wir testen die De Morgan'sche Regeln durch Fallunterscheidung, indem wir sie für alle möglichen Wahrheitswerttafeln prüfen.

Im folgenden Programmstück werden in der ersten Zeile alle vier möglichen Wahrheitswerttafeln für die Variablen a und b erzeugt.
In der zweiten Zeile stehen vier logische Ausdrücke, deren Wahrheitswerte für alle vier Fälle in einer Tabelle ausgegeben werden.
Anschließend wird eine Wahrheitswerttafel mit Hilfe der mathGUIde-Funktion printTable angezeigt.

    table = [{"a":a, "b":b} for a in (False, True) for b in (False, True)]
    expr = ["a", "b", "not(a or b)", "not a and not b"]
    printTable(4,4,
        lambda i,k: Logic.satisfies(expr[k], table[i]),
        colHeadFn = lambda i: expr[i])

Man sieht, dass in jedem der vier Falle beide logischen Folrmeln den gleichen Wahrheitswert haben. Bitte überprüfen Sie ebenso die andere De Morgan'sche Regel!

### Aussagenlogische Äquivalenzen

Wir haben soeben folgende aussagenlogische Äquivalenz gezeigt:

\neg (a \wedge b) \Leftrightarrow \neg a \vee \neg b

Das kann mathGUIde auch direkt überprüfen:

    # De Morgan'sche Regeln:
    Logic.equivalent("not(a or b)", "not a and not b")
    Logic.equivalent("not(a and b)", "not a or not b")

    # Eine ungültige Regel:
    Logic.equivalent("not(a or b)", "not a or not b")

### Subjunktion und Implikation

    Logic.equivalent("a -> b", "not a or b") # Subjunktion
    Logic.implies("a", "a or b")             # Implikation
    Logic.implies("a", "a and b")  # Ungültige Implikation

### Allgemeingültigkeit und Unerfüllbarkeit

    Logic.valid("a or not a")        # Allgemeingültige Formel
    Logic.satisfiable("a and not a") # Unerfüllbare Formel

    # De Morgan'sche Regeln
    Logic.valid("not(a or b) <-> (not a and not b)")
    Logic.valid("not(a and b) <-> (not a or not b)")