Rekursive Listenverarbeitung Prolog Grundkurs WS 99/00 Christof Rumpf [email protected].
Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf [email protected].
-
Upload
ida-emma-engel -
Category
Documents
-
view
214 -
download
0
Transcript of Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf [email protected].
06.12.99 GK Prolog - Parsing mit DCGs 2
Sprachen und Grammatiken
Eine Sprache kann als eine Menge endlicher Ketten von Wörtern, Morphemen, Phonemen ect. angesehen werden. Nicht jede mögliche Kette dieser Einheiten gehört zu der Sprache. Wir unterscheiden zwischen grammatischen und ungrammatischen Ketten.
Eine Grammatik ist eine Menge von Regeln, die die Teilmenge der grammatischen Ketten einer Sprache beschreiben.
06.12.99 GK Prolog - Parsing mit DCGs 3
Sprachen
A sei eine endliche Menge, genannt Alphabet oder Vokabular.
Eine Kette über A ist eine endliche Sequenz von Elementen aus A.
A* ist die Menge aller Ketten über A. Eine Sprache ist eine Menge L A*.
ist die leere Kette.
A = {a,b,c}
= abca
A* = {,a,b,c, aa,ab,ac,ba, bb,bc,...}
06.12.99 GK Prolog - Parsing mit DCGs 4
Grammatiken
Eine Grammatik ist ein Tupel <VT, VN, S, R>.
– VT ist eine Menge von Terminalsymbolen.
– VN ist eine Menge von Nichtterminalsymbolen.
– S VN wird Startsymbol genannt.
– R * VN * × * ist eine endliche Menge von Ersetzungsregeln, mit = VT VN.
06.12.99 GK Prolog - Parsing mit DCGs 5
Ersetzungsregeln
Eine Grammatik ist ein deduktives System von Axiomen und Inferenzregeln, das die Ketten einer Sprache als Theoreme generiert.
Seien ,, *, dann kann durch Anwendung der Regel jedes Vorkommen der Teilkette in durch ersetzt werden.
Mit der Regel AB CDA können wir z.B. aus der Kette EBABCC die Kette EBCDACC ableiten.
06.12.99 GK Prolog - Parsing mit DCGs 6
Chomsky-Hierarchie
Die Chomsky-Hierarchie klassifiziert vier Typen von Grammatiken gemäß der Form ihrer Regeln.– 0: * VN * × * rekursiv aufzählbar
– 1: * VN * × * *, *- kontextsensitiv
– 2: VN × * kontextfrei
– 3: VN × VT VN VN × VT regulär
ist die leere Kette.
06.12.99 GK Prolog - Parsing mit DCGs 7
Sprachklassen
Jedem Typ der Chomsky-Hierarchie entspricht entspricht eine Sprachklasse.– rekursiv aufzählbare Sprachen– kontextsensitive Sprachen anbncn
– kontextfreie Sprachen anbn
– reguläre Sprachen a*b*
06.12.99 GK Prolog - Parsing mit DCGs 8
Automaten
Den Grammatiktypen der Chomsky-Hierarchie entsprechen jeweils Typen von Automaten, die die Grammatiken interpretieren können:– 0: Turing Maschine– 1: Indexierte/linear gebundene Automaten– 2: Kellerautomaten (Stack)– 3: Endliche Automaten
06.12.99 GK Prolog - Parsing mit DCGs 9
Parser Ein Parser ist ein Automat, der auf Basis einer
Grammatik für eine Kette einen Ableitungsbaum (parse tree) erzeugt. S
NP VP
Det N V NP
Jeder Mann liebt Det N
eine Frau
Grammatik
&
„Jeder Mann liebt eine Frau“
06.12.99 GK Prolog - Parsing mit DCGs 10
Kontextfreie PSGs
Kontextfreie Phrasenstrukturgrammatiken entsprechen den Typ-2-Grammatiken der Chomsky-Hierachie, d.h. die Regeln sind durch das Muster VN × * beschränkt:– Auf der linken Seite steht genau ein
Nichtterminalsymbol.– Auf der rechten Seite steht eine beliebige
Verkettung von Terminal- und Nichtterminalsymbolen.
06.12.99 GK Prolog - Parsing mit DCGs 11
DCGs
Definite Clause Grammars in Prolog entsprechen in ihrer Form den kontextfreien Phrasenstrukturregeln.
KF-PSG DCG S NP VP s --> np, vp. VP V NP vp --> v, np. V klaut v --> [klaut]. NP paul np --> [paul]. NP bananen np --> [bananen].
06.12.99 GK Prolog - Parsing mit DCGs 12
Externe vs. interne Notation
DCGs werden beim Laden (consult) eines Prolog-Programms mit Differenzlisten annotiert.
Editor (extern) Datenbasis (intern)
s --> np, vp. s(A,C):- np(A,B), vp(B,C). vp --> v, np. vp(A,C):- v(A,B), np(B,C). v --> [klaut]. v([klaut|T],T). np --> [paul]. np([paul|T],T). np --> [bananen]. np([bananen|T],T).
06.12.99 GK Prolog - Parsing mit DCGs 13
Vergleiche DCGs mit append_dl/3
s(A,C):- np(A,B), vp(B,C).
append_dl((A,B), (B,C), (A,C)). Präfix Suffix Konkatenation
06.12.99 GK Prolog - Parsing mit DCGs 14
Konkatenation von Diff-Listen
append_dl((A,B),(B,C),(A,C)).
?- D1 = ([1,2,3|T1],T1), D2 = ([4,5,6|T2],T2), append_dl(D1,D2,D3). D1 = ([1,2,3,4,5,6|T2],[4,5,6|T2]) (A,B) D2 = ([4,5,6|T2],T2]) (B,C) D3 = ([1,2,3,4,5,6|T2],T2) (A,C) T1 = [4,5,6|T2] B T2 = _1 C
06.12.99 GK Prolog - Parsing mit DCGs 15
Ableitung „Paul klaut Bananen“ ?- s([paul,klaut,bananen],[]). A C C s([paul,klaut,bananen|[]],[])
A B B C np([paul|[klaut,bananen]], vp([klaut,bananen|[]], [klaut,bananen]) []) B D D C v([klaut|[bananen]], np([bananen|[]], [bananen]) [])
06.12.99 GK Prolog - Parsing mit DCGs 16
DCGs zu Klauseln p1 --> p2,...,pn.
p1(V1,Vn) --> p2(V1,V2),...,pn(Vn-1,Vn).
p --> [Atom].
p([Atom|T],T).
06.12.99 GK Prolog - Parsing mit DCGs 17
transDCG/2 transDCG((L1-->R1),(L2:-R2)):- transDCG(L1,X,Y,L2), transDCG(R1,X,Y,R2). transDCG((C11,C12),X,Z,(C21,C22)):- transDCG(C11,X,Y,C21), transDCG(C12,Y,Z,C22). transDCG(C1,X,Y,C2):- C1 =.. [C1], % Test C2 =.. [C1,X,Y]. transDCG([Lex],[Lex|T],T,true).
06.12.99 GK Prolog - Parsing mit DCGs 18
Anfragen an transDCG/2 ?- transDCG((s --> np, vp),X). X = s(A,C):- np(A,B), vp(B,C) yes ?- transDCG((v --> [klaut]),X). X = v([klaut|T],T):- true yes ?- transDCG((np --> np, [und], np),X). X = np(A,C):- np(A,[und|B]), true, np(B,C) yes
06.12.99 GK Prolog - Parsing mit DCGs 19
Evolution unserer Grammatiken s(NP1,V,NP2):- np(NP1), vp(V,NP). v(klaut).
s(S):- np(NP), vp(VP), append(NP,VP,S). v([klaut]).
s --> np, vp. v --> [klaut].
1
2
3
06.12.99 GK Prolog - Parsing mit DCGs 20
Rekursive Regeln
np --> det, adjs, n. adjs --> []. adjs --> adj, adjs. adj --> [schöne]. det --> [der]. n --> [frosch].
„der schöne schöne ... schöne Frosch“
06.12.99 GK Prolog - Parsing mit DCGs 21
Linksrekursion
„Klaus und Maria und ... und Dieter“
np --> np, [und], np.
np --> [klaus].
np --> [maria].
...
np --> [dieter].
loopt immer
np --> [klaus].
np --> [maria].
...
np --> [dieter].
np --> np, [und], np.
loopt bei ungrammatischen NPs
06.12.99 GK Prolog - Parsing mit DCGs 22
Umgang mit Linksrekursion
Die Terminations-Probleme bei Linksrekursion liegen im top-down-depth-first-Verfahren des Prolog-Interpreters begründet. Lösungen:– Linksrekursion vermeiden.– Bottom-up oder left-corner-Interpreter
verwenden.– Left-corner-transform auf die Regeln
anwenden.
06.12.99 GK Prolog - Parsing mit DCGs 23
Parametrisierte DCGs p1(P11,...,P1i) -->
p2(P21,...,P2j), ..., pn(Pn1,...,Pnk).
p1(P11,...,P1i,V1,Vn):- p2(P21,...,P2j,V1,V2), ..., pn(Pn1,...,Pnk,Vn-1,Vn).
06.12.99 GK Prolog - Parsing mit DCGs 24
Agreement np(Agr) --> det(Agr), n(Agr). det(agr(nom,sg,masc))--> [der]. det(agr(dat,sg, fem))--> [der]. det(agr(nom,sg, fem))--> [die]. det(agr(dat,sg,masc))--> [dem]. det(agr(acc, _,masc))--> [den]. n( agr( _,sg,masc))--> [mann]. n( agr( _,sg, fem))--> [frau]. n( agr(acc,pl,masc))--> [männern].
06.12.99 GK Prolog - Parsing mit DCGs 25
Seiteneffekte det(agr(K,N,G)) --> [der], {N=sg, ((K = nom, G = masc); (K = dat, G = fem ))}.
det(agr(K,N,G),[der|T],T):- N=sg, ((K = nom, G = masc); (K = dat, G = fem )).