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?
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?)
B) Welche Elemente passen zu diesen Beschreibungen?
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?