Logik mit SetlX

Speichern Sie den folgenden Code in einer Datei "truthtable.stlx".
tabelle := procedure(s) {
    t := parse(s);
    v := vars(t);
    print (v);
    return { [[var in vi : var in [] + v], evalTerm(t, vi) ] : vi in 2**v};
};

vars := procedure(t) {
    match(t) {
        case ^variable(v) : return {v};
        default : return +/{ vars(tt): tt in args(t)};
    }
};

evalTerm := procedure(t, v){
    match(t) {
        case ^variable(var) | var in v: return true;
        case ^variable(var) | var notin v: return false;
        case a && b: return evalTerm(a, v) && evalTerm(b, v);
        case a || b: return evalTerm(a, v) || evalTerm(b, v);
        case a <==> b: return evalTerm(a, v) <==> evalTerm(b, v);
        case a == b: return evalTerm(a, v) == evalTerm(b, v);
        case a <!=> b: return evalTerm(a, v) <!=> evalTerm(b, v);
        case a != b: return evalTerm(a, v) != evalTerm(b, v);
        case a => b: return evalTerm(a, v) => evalTerm(b, v);
        case !a: return !evalTerm(a, v);
        default: print("fixme: t = $t$");
    }
};
Starten Sie SetlX, geben Sie multiLineMode(true); und danach load("truthtable.stlx") ein. (Falls das Laden nicht funktioniert, können Sie den Code auch mit Copy/Paste einfügen.) Mit der Funktion tabelle() können Sie sich jetzt Wahrheitstabellen anzeigen lassen. Zum Beispiel: tabelle("(a || b) && c ");.

1) Finden Sie für jeden Ausdruck auf der linken Seite, den dazu äquivalenten auf der rechten Seite. Überprüfen Sie Ihre Ergebnisse mit SetlX. Bei einer Äquivalenz müssen alle Zeilen der Wahrheitstabelle "true" ergeben.

a || a !(a || !b)
a && b !b || !a
!a && b a && (a || b)
!(a && b) (!a) && (!b)
!(a || b) !(!a || !b)
a && b && c             (c && a)||(a && b)
a && (b || c) (a || c) && (b || c)
(a && b) || c c && a && b

2) Ein Logik-Rätsel: wen laden Sie ein?

  • Wenn Sie Susanne einladen, müssen Sie auch John einladen.
  • Sie dürfen nur entweder John oder Marie einladen, aber nicht beide.
  • Sie müssen entweder Susanne oder Marie oder beide einladen.
  • Wenn Sie Marie einladen, müssen Sie auch Susanne einladen.

    Schreiben Sie eine Formel, welche alle diese Bedingungen mit && verbindet. Lassen Sie sich die Wahrheitstabelle mit SetlX anzeigen. Suchen Sie sich die Zeilen heraus, welche "true" ergeben und lesen Sie daraus die Lösung ab. (Was bedeutet es für Ihre Lösung, wenn mehr als eine Zeile "true" ergibt?)


    Eine Datenstruktur

    A) Finden Sie eine Beschreibung für jede dieser Beispiele von Elementen:

    B) Welche Elemente passen zu diesen Beschreibungen?

    Was ist der Zusammenhang zwischen Elementen (wie in A) und Beschreibungen (wie in B)?

    C) Wenn Sie nur die Elemente 1, 2, 3 haben, wieviele Möglichkeiten gibt es, davon Elemente auszuwählen?

    Betrachten Sie Elemente und Beschreibungen wie in A und B als eine Datenstruktur.
    Wie würden Sie diese Datenstruktur definieren?
    Welche Eigenschaften spielen eine Rolle, was kann man ignorieren?
    Was bedeuten die Punkte (...) in einigen der Beispielen?
    Gibt es Zusammenhänge zwischen einigen der Beispiele?
    Was für verschiedene Möglichkeiten für Zusammenhänge gibt es?
    Was für Gründe (Anwendungen) könnte es geben, so eine Datenstruktur zu formalisieren?

    Falls Sie schon etwas Programmiererfahrung haben: welche Datenstruktur würden Sie verwenden, um mehrere Elemente zusammenzufassen und in einer Variablen zu speichern? Unterscheidet sich die mathematische Datenstruktur in den Beispielen eventuell von der, die Sie aus Programmiersprachen kennen?