Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf [email protected].

25
Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf [email protected]

Transcript of Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf [email protected].

Page 1: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

Parsing mit DCGs

Prolog Grundkurs WS 99/00Christof Rumpf

[email protected]

Page 2: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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.

Page 3: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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,...}

Page 4: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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.

Page 5: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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.

Page 6: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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.

Page 7: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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*

Page 8: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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

Page 9: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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“

Page 10: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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.

Page 11: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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].

Page 12: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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).

Page 13: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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

Page 14: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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

Page 15: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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]) [])

Page 16: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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).

Page 17: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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).

Page 18: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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

Page 19: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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

Page 20: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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“

Page 21: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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

Page 22: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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.

Page 23: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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).

Page 24: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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].

Page 25: Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

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 )).