Formal Methods in Computer Science Hochschule Darmstadt WS 2008/09 Klausurrelevante Themen Dr. Dieter Hofbauer BA Nordhessen Januar 2009 1 Ersetzungssysteme 1. Term als Baum zeichnen. Positionen in einem Term angeben. • Beispiel: f (g(f (a, b)), f (b, g(a))). 2. Gegebene Substitution auf gegebenen Term anwenden. • Beispiel: tσ für t = f (g(y), f (x, y)) und σ = {x 7→ g(y), y 7→ f (a, x)} angeben. 3. Für gegebenes Ersetzungssystem R und gegebene Terme/Wörter s und t: Gilt s →R t, gilt s →∗R t, gilt s ↔∗R t? • Beispiel: Man beantworte die Fragen für das Wortersetzungssystem R = {a → b, c → b} und jeweils für die Wörter (1) (2) (3) (4) s = bca und t = bba s = aaa und t = ccc s = abc und t = bbb s = abab und t = babab 4. Für gegebenes Ersetzungssystem R und gegebene Terme/Wörter Normalformen berechnen. Beispiel: • Man berechne alle Normalformen des Terms f (g(g(a))) bezüglich des Termersetzungssystems R = {f (g(x)) → g(f (x)), g(x) → h(x, x)}. • Welche Normalformen sind mit einer Innermost-Strategie erreichbar? Und welche mit einer Outermost-Strategie? 5. Existenz von Normalformen (hat jeder Term eine Normalform?). Eindeutigkeit von Normalformen (hat jeder Term höchstens eine Normalform?). 6. Verständnisfragen zum Thema Konfluenz und Termination. 7. Lokale Konfluenz: Nichttriviale kritische Paare berechnen (eins oder alle) und auf Harmlosigkeit prüfen. Beispiele: 1 • R1 = {f (g(x)) → g(f (x)), g(x) → h(x)} • R2 = {f (g(x)) → g(f (x)), f (x) → g(x)} • R3 = {f (g(x)) → g(f (x)), g(f (x)) → h(x, x)} • S = {a(a(x, y), z) → a(x, a(y, z))} • T = {f (a(x, y)) → a(f (x), f (y)), f (f (x)) → x} 8. Unifikation von Termen: Für gegebene Terme s und t feststellen, ob die Terme unifizierbar sind, gegebenenfalls einen allgemeinsten Unifikator angeben. Variante: Einen Unifikator angeben, der nicht allgemeinster Unifikator ist. Beispiele (hier seien x, y, z, u, v Variablen): • s = f (g(u), h(u, v)) und t = f (z, h(f (y, y), z)) • s = h(x, h(x, f (y))) und t = h(h(g(y), y), z) • s = h(h(x, y), x) und t = h(h(f (y), z), g(z)) • s = h(h(g(x), f (y)), f (z)) und t = h(h(g(z), f (f (x))), f (y)) 9. Knuth-Bendix-Vervollständigung: Nicht klausurrelevant. 10. Für gegebenes Ersetzungssystem Termination prüfen; Antwort begründen (etwa mit Interpretation oder rekursiver Pfadordnung). Beispiele: • {f (x ◦ y) → f (x) ◦ f (y)} • {(x ∧ y) ∨ z → (x ∨ z) ∧ (y ∨ z)} 11. Entscheiden, ob eine gegebene monotone Interpretation die Termination eines gegebenen Ersetzungssystems zeigt. Beispiel: • Termination von {(x ◦ y) ◦ z → x ◦ (y ◦ z), x ◦ (y ◦ z) → y ◦ y mit der Interpretation τ auf N, wobei ◦τ (n, m) = m(m + n) auf einem geeigneten Abschnitt von N gewählt sei. 2 Funkionales Programmieren / Haskell 1. Ausdrücke, Funktionen, Typen (inklusive Typvariablen): Den Wert eines gegebenen Ausdrucks angeben. Den Typ einer gegebenen Funktion bzw. eines gegebenen Ausdrucks angeben. Umgekehrt eine Funktion zu gegebenem Typ angeben. Beispiel: Hier sei succ :: Int -> Int definiert als succ n = n+1. • Wert und Typ von [1,2,3] • Wert und Typ von [succ 1, succ 2, succ 3] • Wert und Typ von map succ [1,2,3] • Typ von map succ • Typ von map • Typ von map fst 2 2. Verständnisfragen zu Haskell-Typen (Tupel, Listen etc.). 3. Verständnisfragen zu Listen-Comprehension. Beispiel: • Wert von [n+2 | n <- [7..9]] 4. Eine Haskell-Funktion nach verbaler Spezifikation schreiben, inklusive Typangabe. Beispiel: • Schreiben Sie eine Haskell-Funktion minAndMax, die zwei Argumente vom Typ Int besitzt und die ein Paar vom Typ (Int,Int) berechnet, nämlich das Paar aus dem Minimum und dem Maximum der beiden Argumente (in dieser Reihenfolge). Beispiel: minAndMax 7 3 liefert (3,7). • Schreiben Sie eine Haskell-Funktion replicate, die zu gegebener Zahl n und gegebenem Element x (beliebigen Typs) eine Liste der Länge n liefert, deren Einträge alle gleich x sind. Beispiel: replicate 3 7 liefert [7,7,7]. (Zusatzfrage: Was berechnet Ihre Funktion für negatives n?) • Schreiben Sie eine Haskell-Funktion flatten, die eine Liste von Listen in eine einzige Liste umrechnet, indem die Listen konkateniert werden. Beispiel: flatten [[3,1],[],[7,7,2]] liefert [3,1,7,7,2]. 5. Eine gebebene Haskell-Funktion auf Beispiele anwenden und allgemein erklären. Beispiel: • Die Funktion filter :: (a -> Bool) -> [a] -> [a] ist definiert als filter p xs = [ x | x <- xs, p x ]. Sei big n = n>2. Welchen Wert hat dann filter big [3,1,5]? Begründung? Allgemeine Funktionsweise? 6. Verständnisfragen zum Pattern-Matching in Haskell. 7. Verständnisfragen zur Auswertungsstrategie von Haskell (lazy evaluation). 8. Funktionales Programmieren in objektorientierten Sprachen: Nicht klausurrelevant. 3 Logisches Programmieren / Prolog 1. Syntax: Terme und Formeln. Semantik: Terme und Formeln in einem gegebenen Modell auswerten. 2. Erfüllbarkeit / Widersprüchlichkeit / Allgemeingültigkeit von Formeln prüfen: Nicht klausurrelevant. 3. Ableiten: Schnittregel / Resolutionsregel auf gegebene Beispielformeln anwenden können (Beispiele VL-Folie 37). (Notwendige Voraussetzung für Resolution: Unifikation.) 4. Prolog als Programmiersprache: Nicht klausurrelevant. (Insbesondere: Gegebenes Prolog-Programm auf Beispiel-Goals anwenden und allgemein erklären; ein Prolog-Programm nach verbaler Spezifikation schreiben; Verständnisfragen zur Auswertungsstrategie von Prolog.) 3