Folien zur Vorlesung: http://www.logic.at/lvas/eti/
Reguläre Mengen: Alle Sprachen, die aus einem Alphabet durch Vereinigung, Verkettung und Kleene-Stern gebildet werden können.
s statt {s} für s e S
z.B.
real = digit {digit} "." {digit} [scale]
scale = "E" ["+"|"-"] digit
{digit}
Verwendung von Abkürzungen für reguläre Teilausdrücke, erhöht nicht die Ausdruckskraft.
Bessere Strukturierung, bessere Lesbarkeit.
Keine direkte oder indirekte Rekursivität: digits = digit * digits È {e} ist nicht zulässig.
egrep unter UNIX
z.B. Real-Zahl: ^[0-9]+\.[0-9]*(E[+-]?[0-9]+)?$
z.B. Lift: kann nur endliche Zustände und endlichen Input haben.
DEA: deterministischer endlicher Automat: bei jedem Zustand ist bekannt, was zu tun ist.
NDEA: nichtDEA mit e-Übergängen.
Endlicher Automat wird beschrieben durch:
Zu jedem Automaten mit Î-Übergängen gibt es einen ohne Î-Übergänge, der dieselbe Sprache akzeptiert.
Zu jedem NEA gibt es einen äquivalenten DEA.
Zu jeder regulären Sprache gibt es einen bis auf Umbenennung der Zustände eindeutigen, minimalen DEA.
Zwei Zustände p und q heißen unterscheidbar durch ein Wort w Î S*, wenn mensch von p aus mit w in einen Endzustand gelangen kann, aber nicht von q aus, bzw. von q aber nicht von p aus.
p und q sind ununterscheidbar, wenn sie durch kein Wort unterschieden werden können.
Pro Zustandpaar: eine Zelle (leer oder X) und eine Warteliste für Zustandspaare.
1. Hinzufügen einer Falle falls notwendig.
2. Initialisierung: alle Wartelisten sind leer. Alle Paare aus einem End- und einem Nichtendzustand werden mit X markiert.
3. Für jedes nicht-markierte Paar (p, q) prüfe: Gibt es s Î S, sodaß ((d(p,s), d(q,s)) markiert ist, dann markiere (p,q) sowie alle Paare in seiner Warteliste. Andernfalls füge (p,q) zur Warteliste aller Nachfolgerpaare ((d(p,s), d(q,s)) hinzu.
4. Zusammenfassen aller Zustandspaare, die nicht markiert sind, zu einem Zustand.
5. Entfernen aller Zustände, die vom Startzustand aus nicht erreichbar sind oder von denen aus kein Endzustand erreichbar ist.
Grammatik G = <V,T,P,S>, wobei
V...Variable (Nonterminale)
T...Terminalsymbole
P...Produktionen
S...Startsymbol
Grammatik: Zeichenersetzungssystem
In der endgültigen Sprache sollen nur Terminalsymbole vorkommen, die nicht mehr ersetzt werden.
Synonym für kontextfreie Produktionen
Notation: Nonterminale in spitzen Klammern.
<Real> => <Digit> <Digits> . <Digits> <SF>
Auch "Regular Right Part Grammar (RRPG)"
Auf rechter Seite der Produktionen dürfen reguläre Ausdrücke in EBNF auftreten.
Abkürzung uninteressanter Produktionen:
A=> w1{w2}w3
erlaubt die Ableitung
Typ 0: alle durch eine Grammatik beschreibbare Sprachen (keine Einschränkungen der Produktionen)
Typ 1: kontextsensitive oder monotone Sprachen
Typ 2: Kontextfreie Sprachen
Typ 3: Reguläre Sprachen
Elemente: UND, ODER, NICHT, ", $, Konstantensymbole, Funktionssymbole, Prädikatensymbole, Individuenvariablensymbole
Atomformel: z.B. "3 < x" oder auch "2 * x < x - 2" (Term, Prädikatensymbol, Term)
Term: Individuenvariablensymbole, Funktionssymbole, Konstantensymbole
Abstrakter Datentyp: Grundmenge (nicht-leer), Konstantensymbole, Funktionssymbole, Prädikatensymbole
=> Natürliche Zahlen, Binäre Stacks (irreführend, nur 0/1-Strings), Listen
D... abstrakter Datentyp
FS(D), PS(D), KS(D): Funktions-, Prädikaten-, Konstantensymble zu D
Einfachste Ausdrücke: Konstanten. Dann Funktionssymbole und Variablensymbole (IVS)
IVS={x, y, z, x1, x2 ...}
T: Kleinste Menge, sodaß
build(rest(nil), x) e T()
x e IVS => x e T()
Funktion M (meaning):
MT: T(D) => D
D... Grundmenge von D
MT(I, k) = k'
k'... Konstante zum Symbol k
EXP(D)...Expressions
(E1) IVS Element von EXP
(E2) KS Element von EXP
(E3) f Element FSn, e1, .. en Element von EXP => F(e1, .., en) Element von EXP
(E4) p Element von PSn, t, e Element von EXP=> if p(e1, ..., en) then t else e
(E5) F Element von FVSn, e1, ..., en Element von EXP => F(e1, ..., en)
(FVS = Funktionsvariablensymbole, FVSn = n-stellige FVS; FVS = {F, G, MEMBER ...})
call-by-value-Funktionsaufruf: Environment wird für die Zeit des Funktionsaufrufs umdefiniert.
call-by-name-Funktionsaufruf: Environment bleibt gleich, die Variablen x1...xn werden durch e1...en ersetzt.
Der Unterschied ist, daß bei call-by-value alle Ausdrücke am Anfang ausgewertet werden.
injektive Abbildung: jedes Element von D wird auf ein anderes Element von L abgebildet.
dMM(delta, env, exp) =
if eq?(ART(exp), ivs) then DOIVS(env, exp)
else if eq?(ART(exp), const) then DOCONST(exp)
else if eq?(ART(exp), appl) then DOAPPL(delta, env, exp)
else if eq?(ART(exp), cond) then DOCOND(delta, env, exp)
else if eq?(ART(exp), call) then DOCALL(delta, env, exp)
else error
IVS={x, y, z, x1, ..}
[x]=x, ..., [x1] = x1
KS=[0, 1, 2, ...]
[k]=h(k') k'...Konstante zum Symbol k
[0]=(), [1] = (1)
[+]=plus
[=]=eq
[<]=lt
dART(exp) = first(exp)
dDOCONST(exp) = 2TES(exp)
dDOIVS(env, exp) =
LOOKUP(2TES(env), exp)
dDOAPPL(delta, env, exp) =
if eq?(FS(exp), plus) then ...