Teillösungen zur Probeklausur zur Vorlesung Informatik A (Autoren: Florian Schmidt, Sascha Meiers) 1. Logisches (a) Mittels Wahrheitstabelle ergibt sich DN F (α) = (¬x ∧ y ∧ ¬z) ∨ (¬x ∧ y ∧ z) ∨ (x ∧ ¬y ∧ ¬z) ∨ (x ∧ y ∧ z) KN F (α) = (x ∨ y ∨ z) ∧ (x ∨ y ∨ ¬z) ∧ (¬x ∨ y ∨ ¬z) ∧ (¬x ∨ ¬y ∨ z) (b) Es soll Resolutionskalkül benutzt werden, um zu testen, ob β eine Tautologie ist. Mittels Resolution kann nur getestet werden, ob eine Formel unerfüllbar, also eine Kontradiktion ist. β ist jedoch Tautologie genau dann wenn ¬β Kontradiktion ist. Es muss also getestet werden, ob sich die leere Klausel aus ¬β ableiten lässt. Resolution kann nur mit KNF Formeln durchgeführt werden. Glücklicher Weise ist ¬β bereits in KNF! ¬β = (¬x1 ∨ x2 ) ∧ ¬x2 ∧(x1 ∨ x2 ∨ ¬x3 ) ∧ (x1 ∨ x2 ∨ x3 ) Res({{x1 ∨ x2 ∨ ¬x3 }, {x1 ∨ x2 ∨ x3 }}) = {x1 , x2 } Res({{¬x1 , x2 }, {x1 , x2 }}) = {x2 } Res({{¬x2 }, {x2 }}) = Natürlich führen auch viele andere Wege zur leeren Klausel. 2. Beweisbares (a) reverse [] = [] reverse (x:xs) = reverse xs ++ [x] Beweis mittels Vollständiger Induktion: Induktionsanfang: sum [] = sum (reverse []) 0 = sum [] rev.1 0 = [] sum.1 sum.1 (1) Induktionsvoraussetzung: sum xs = sum (reverse xs) Induktionsschritt: sum (x:xs) = sum (reverse (x:xs)) x + sum xs = sum (reverse xs ++ [x]) sum.2 IV rev.2 (∗) x + sum (reverse xs) = sum (reverse xs) + sum [x] sum.2 x + sum (reverse xs) = sum (reverse xs) + x + sum [] sum.1 x + sum (reverse xs) = sum (reverse xs) + x + 0 Komm.+ x + sum (reverse xs) = x + sum (reverse xs) Wobei (*) sum(xs ++ ys) = sum xs + sum ys (b) Hat ein echter q-närer gewurzelter Baum n Knoten, so gilt für die minimale Höhe des Baumes: hmin (T ) = dlogq (n · (q − 1))e − 1 Beweis: Damit ein Baum die minimale Höhe h hat, muss er bis zur Höhe h − 1 vollständig sein. Der Baum hat somit echt mehr Knoten als ein vollständiger Baum der Höhe h − 1 und maximal so viele Knoten wie ein vollständiger Baum der Höhe h. Das bedeutet: # Knoten im voll. Baum der H öhe h − 1 < h−1 X qe < n n ≤ # Knoten im voll. Baum der H öhe h h X ≤ qe e=0 qh − 1 < q−1 qh − 1 < h q < n n · (q − 1) n · (q − 1) + 1 e=0 q h+1 −1 q−1 h+1 ≤q −1 ≤ ≤ q h+1 h < logq (n · (q − 1) + 1) ≤ h + 1 Daraus folgt: hmin = dlogq (n · (q − 1))e − 1 3. Haskell (a) isSquare :: String -> Bool isSquare xs = take n xs == drop n xs where n = div (length xs) 2 Für xs mit ungerader Länge liefern take n xs und drop n xs jeweils Strings unterschiedlicher Länge, die in jedem Fall ungleich sind, so dass die Eingabe nicht akzeptiert wird. Für Strings gerader Länge vergleicht ++ auf elementweise Gleicheit. Insbesondere wird auch [] korrekter Weise akzeptiert. (b) faktors :: Int -> [Int] faktors n = [i | i <- [1..(n-1)], mod n i == 0] perfekt :: Int -> [Int] perfekt n = [i | i <- [1..(n-1)], sum (faktors i) == i] (c) Beispiel: Die Zahl 1234 kann als 1 · 1000 + 2 · 100 + 3 · 10 + 4 geschrieben werden. Im Hornerschema ergibt das: 1 · 1000 + 2 · 100 + 3 · 10 + 4 = ((((1) · 10 + 2) · 10) + 3) · 10 + 4 = ((((0 · 10 + 1) · 10 + 2) · 10) + 3) · 10 + 4 Das Hornerschema kann als Faltung ausgedrückt werden. Der linkeste Term ist am tiefsten geschachtelt. Es handelt sich also um eine Linksfaltung mit der Operation (+).(*10) wobei (.) der Operator für Hintereinanderausführung in Haskell ist. dec2Int xs = foldl ((+).(*10)) 0 xs 4. Verständnis (a) ∀n ∈ N, n > 1 : ∃p ∈ N : n ≤ p ≤ 2n ∧ isprim(p) (b) Eine DNF ist erfüllbar, sobald mindestens eine Klausel erfüllbar ist. Eine Klausel ist eine Konjunktion von Variabeln. Kommt darin keine Variable sowohl negiert als auch nicht negiert, vor, so ist solch eine Kojunktion von Variabeln immer erfüllbar. Eine DNF ist also nicht erfüllbar genau dann wenn in jeder Klausel mindestens eine Variable sowohl negiert als auch nicht negiert vorkommt. (c) Nein. Es lässt sich zum Beispiel keine Kontradiktion ausdrücken. Für alle xi ist xi ∧ T rue ≡ xi . Eine Konjunktion nichtnegierter Variabeln ist nie eine Kontradiktion. (d) (6,7) (e) Alle Codierungen, die vom Huffman Verfahren generiert wurden, sind optimal. Das Huffman Verfahren liefert einen Blockcode, falls alle Blätter die gleiche Tiefe haben. Dies ist der Fall, wenn alle n Zeichen gleichwahrscheinlich sind und sich n als n = 2i für ein i ∈ N schreiben lässt.