20. Juni 2011
1 Grammatiken 2 LL(1) 3 EXP 4 Datentypen 5 LP
Grammatiken Angabe Erstellen Sie First- und Follow-Mengen aller Non-Terminale der folgenden Grammatik. S a S S B y B A C A A b b A x A ɛ C c A C C ɛ
LL(1) Grammatik S as S By B AC A Abb A x A ɛ C cac C ɛ LL(1) Tabelle S A B C a b c x y $
LL(1) 2 Grammatik S as S By B AC A Abb A x A ɛ C cac C ɛ LL(1) Tabelle a b c x y $ S a S B y B y B y B y A B C
LL(1) 3 Grammatik S as S By B AC A Abb A x A ɛ C cac C ɛ LL(1) Tabelle a b c x y $ S a S B y B y B y B y A ɛ ; A ɛ x; A ɛ b b b b B C
LL(1) 4 Grammatik S as S By B AC A Abb A x A ɛ C cac C ɛ LL(1) Tabelle a b c x y $ S a S B y B y B y B y A ɛ; A b ɛ x; A ɛ b b b B A C A C A C A C C c A C ɛ
LL(1) 5 Grammatik LL(1) Grammatik S as S By B AC A Abb A x A ɛ C cac C ɛ S as S By B AC A xr A R R bbr R ɛ C cac C ɛ
LL(1) 6 Die häufigsten Fehler: Zu wenig Übung Keine Antwort auf Erklären Sie $ Spalte vergessen Mit S as kann man nicht aaaa auf einmal Parsen.
Angabe Schreiben Sie ein Programm in EXP über N 0 (Funktionen: add, div, lt?), welches als Parameter eine Zahl (x) nimmt und den abgerundeten Logarithmus zur Basis 2 dieser Zahl ( log 2 x ) zurückgibt. log 2 0 := 0. Zeigen Sie die Korrektheit ihrer Implementation für alle Zahlen in N 0 unter Verwendung der Interpretationsfunktion.
Lösung - Rekursive Definition Mathematisch EXP* log 2 x = { 0 x < 2 log2 x 2 + 1 sonst δlog(x) =if lt?(x,2) then 0 else add(log(div(x,2)),1)
Lösung - Beweis Zu zeigen* ω : I (δ, ω, log(x)) = log 2 ω(x) Wann macht eine vollständige Induktion Sinn? Gibt es ein Kriterium nachdem man mögliche Eingaben sortiert aufzählen kann? Baut ein Berechnungsschritt auf einem (in dieser Sortierung) früheren Schritt auf? z.b. Rekursion
Lösung - Induktion Schema Induktionshypothese: Einschränkung der zu zeigenden Aussage auf bestimmte ω (z.b. ω(x) n) Induktionsbasis: Wir beweisen die Aussage für einen einfachen Spezialfall (Abbruchbedingung bei Rekursion) Induktionsschritt: Wir beweisen dass das Ergebnis für einen Berechnungsschritt korrekt ist, wenn die (in der Sortierung) vorhergehenden Berechnungsschritte korrekt sind Induktionshypothese* ω, ω(x) n : I (δ, ω, log(x)) = log 2 ω(x)
Lösung - Induktion 2 Induktionsbasis* Sei ω(x) < 2. I (δ, ω, log(x)) = I (δ, ω, if lt?(x,2) then 0 else add(log(div(x,2)),1)) NR: I (δ, ω, lt?(x,2)) = lt?(i (δ, ω, x), I (δ, ω, 2)) = lt?(ω(x), 2)) =. = I (δ, ω, 0) = log 2 ω(x) Dieses Ergebnis entspricht der Definition. Damit sind alle Fälle bewiesen für die ω(x) < 2.
Lösung - Induktion 3 Induktionsschritt Teil I* Sei ω(x) = n + 1 2 ( 2, denn die Basisfälle haben wir ja schon bewiesen). I (δ, ω, log(x)) = I (δ, ω, if lt?(x,2) then 0 else add(log(div(x,2)),1)) NR: I (δ, ω, lt?(x,2)) = lt?(i (δ, ω, x), I (δ, ω, 2)) = lt?(ω(x), 2)) =. = I (δ, ω, add(log(div(x,2)),1)) = add(i (δ, ω, log(div(x,2))), I (δ, ω, 1)) = add(i (δ, ω, log(div(x,2))), 1) = ( )
Lösung - Induktion 4 Induktionshypothese (zur Erinnerung) ω, ω(x) n : I (δ, ω, log(x)) = log 2 ω(x) Induktionsschritt Teil II* NE: ω (x) = I (δ, ω, div(x,2)) = div(ω(x), 2) = ( ) = add(i (δ, ω, log(x)), 1) ω(x) 2 = n+1 2 n. Weil ω (x) n gilt Induktionshypothese für ω! laut IH = add( log 2 ω (x), 1) = log 2 ω (x) + 1 = log 2 ω(x)
Angabe Codierung von N in {x N x 0 mod 2} Gegeben sind der Datentyp der Natürlichen Zahlen (inkl. 0) und jeder der geraden, natürlichen Zahlen (Funktionen/Prädikate jeweils: add, mul, div, eq?) Geben Sie eine Codierung des Datentyps der Natürlichen Zahlen in den Datentyp der geraden, natürlichen Zahlen an. Zeigen Sie, dass ihre codierte mul-funktion die Codierungseigenschaften erfüllt.
Lösung Ansatz (informell) Es gibt gleich viele gerade Zahlen wie natürliche Zahlen Wir codieren die i. natürliche Zahl mit der i. geraden (π(a) = 2 a) Addition ist trivial: π(a) + π(b) = 2 a + 2 b = 2 (a + b) = π(a + b) Multiplikation: Direkt multiplizieren geht nicht, da π(a) π(b) = 2 a 2 b = 4 a b, also ein Faktor 2 zu viel. Division hat das gleiche Problem: π(a)/π(b) = 2 a 2 b = a b, also Faktor 2 zu wenig. Vergleichen ist aber auch trivial, da wir schon einen Vergleichsoperator haben.
Lösung Codierung π(a) = 2 a π[add N ](a, b) = add G (a, b) π[mul N ](a, b) = div G (mul G (a, b), 2) π[div N ](a, b) = div G (mul G (a, 2), b) π[eq N?](a, b) = eq G?(a, b)
Lösung Beweis, dass π[mul N ](a, b) korrekt ist zzg: s, t N : π[mul N ](π(s), π(t)) = π(mul N (s, t)) Beweis: π[mul N ](π(s), π(t)) = I EXP (δ, ω, div G (mul G (π(s), π(t)), 2)) = /(I EXP (δ, ω, mul G (π(s), π(t))), I EXP (δ, ω, 2)) = /( (I EXP (δ, ω, π(s)), I EXP (δ, ω, π(t))), 2) = /( (π(s), π(t)), 2) = /( (2 s, 2 t), 2) = (2 s 2 t)/2 = 2 s t = π(s t) = π(mul N (s, t))
Angabe Programmierbeispiel in LP Gegeben sei der Funktor element(v, R), der eine Liste über einen Wert V und eine Restliste R beschreibt. Der Wert V ist eine natürliche Zahl inklusive Null, die wiederum mit dem Funktor s(x) dargestellt wird. Für die leere Liste wird die Konstante null verwendet. Auf die Liste ist das Prädikat len(l, Len) definiert, welches immer wahr ist wenn die übergebene Liste L genau Len Elemente enthält. Definieren Sie ein Prädikat sum(l, E) unter dieser Listendarstellung, das immer dann wahr ist, wenn ein übergebenes Element E die Summe der Werte V der übergebenen Liste L ist. Beweisen Sie folgende Anfrage mittels Resolution: sum(element (s(0), element(s(0), element(s(0), null))), s(s(s(0)))).
Lösung Ansatz (informell) Prädikat add richtig! Bestimmen des Basisfalls. Wie kommen wir zu unserem Basisfall? Mögliche Fehler Prädikat add ist falsch definiert (läuft in eine Endlosschleife). Vermischung logisch / funktional. Achtung LP!= Prolog (cuts, Vergleichsoperatoren) Auslassen von Zwischenschritten bei der Resolution.
Lösung Prädikat add add(x, 0, X) :- nat(x). add(x, s(y), s(z)) :- add(x, Y, Z). Prädikat sum %Basisfall, Ende der Liste sum(null, 0). %Abarbeiten der Liste sum(e(v, R), E) :- sum(r, S), add(v, S, E).
Resolution(1) sum(e(s(0), e(s(0), e(s(0), null))), s(s(s(0)))). sum(e(v, R), E) :- sum(r, S), add(v, S, E). Θ = {V s(0), R e(s(0), e(s(0), null)), E s(s(s(0))) } sum(e(s(0), e(s(0), sum(e(s(0), e(s(0), e(s(0), null))), e(s(0), null))), s(s(s(0)))). s(s(s(0)))) :- sum(e(s(0), e(s(0), null)), S), add(s(0), S, s(s(s(0)))). sum(e(s(0), e(s(0), null)), S). Θ = {V s(0), R e(s(0), null)), E S } sum(e(v, R), E) :- sum(r, S 1 ), add(v, S 1, E).
Resolution(2) sum(e(s(0), e(s(0), null)), S). sum(e(s(0), e(s(0), null)), S) :- sum(e(s(0), null)), S 1 ), add(s(0), S 1, S). sum(e(s(0), null), S 1 ). sum(e(v, R), E) :- sum(r, S 2 ), add(v, S 2, E). Θ = {V s(0), R null, E S 1 } sum(e(s(0), null), S 1 ). sum(e(s(0), null), S 1 ) :- sum(null, S 2 ), add(s(0), S 2, S 1 ). sum(null, S 2 ). sum(null, 0). Θ = {S 2 0)}
Resolution(3) add(s(0), 0, S 1 ). add(x, 0, X) Θ = {X s(0) add(s(0), 0, s(0)). rückeinsetzen S 1 s(0) sum(e(s(0), e(s(0), add(x, s(y), s(z)) :- null)), s(0)), add(s(0), add(x, Y, Z). s(0), S). Θ = {X s(0), Y s(0), Y S sum(e(s(0), e(s(0), null)), s(0)), add(s(0), s(0), S). add(s(0), 0, S). Θ = {X s(0) add(x, s(y), s(z)) :- add(s(0), 0, S). add(x, 0, X).
Resolution(4) add(s(0), 0, s(0)). rückeinsetzen S s(s(0)) sum(e(s(0), null)), s(s(0))), add(s(0), s(s(0)), s(s(s(0)))). add(s(0), s(s(0)), add(x, s(y), s(z)) :- s(s(s(0)))). add(x, Y, Z).... add(s(0), 0, s(0)). add(x, 0, X)