#include "head.html"
List-Monade: verzweigende Rechnungen
Der Typkonstruktor List ist eine Monade.
Wir haben die Vorstellung von einer Liste von möglichen Ergebnissen
(einer nichtdeterministischen Rechnung).
instance Monad [] where
return x = [x]
xs >>= f = concat ( map f xs )
concat :: [[a]] -> [a]
concat = foldr (++) []
-- Beispiel: concat [ "frob", "ni", "", "cate" ] = "frobnicate"
Wort-Ersetzungs-Systeme
#include "../src/Rewrite.hs"
Wortersetzung ist ein Berechnungsmodell.
Für beliebige Systeme sind deswegen alle "interessanten" Eigenschaften
unentscheidbar. Jedoch kann man eingeschränkte Systeme betrachten,
zum Beispiel solche mit nur einer Regel (wie die Beispiele eben).
dafür gibt es zwei große offene Fragen:
- Ist die Termination entscheidbar?
- Enthält jedes nicht terminierende System eine Schleife?
Siehe dazu
http://www.lri.fr/~rtaloop/95.html
und dort angegebene Literatur. Anyone for a Diplomarbeit darüber?
Grammatiken
Wir treffen Wort-Ersetzungs-Systeme außerdem bereits im Grundstudium
als Regelmengen von Grammatiken.
data Grammatik = Grammatik
{ terminale :: String
, nichtterminale :: String
, startsymbol :: Char
, regeln :: [ (String, String) ]
}
Damit beschäftigt sich derzeit das dritte Semester.
Siehe
Grammatik-Simulator-Programm.
Übungsaufgabe: schreibe dazu
- Hilfsprogramme, z. B. Feststellen/Prüfen der Form
(d. h. des Chomsky-Typs) der Grammatik
- interessante Übungsaufgaben, z. B. "geben Sie eine Grammatik für ...,
bei der in jedem Ableitungsschritt höchstens ein ... links von ..."
und die entsprechenden Testprogramme
(Beispiel)
- Implementierungen von Algorithmen aus der Grundvorlesung,
z. B. Chomsky-NF herstellen, oder Greibach-NF,
oder Schnitt mit regulärer Sprache, usw.
#include "foot.html"