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

Post on 06-Apr-2016

214 views 0 download

Transcript of Parsing mit DCGs Prolog Grundkurs WS 99/00 Christof Rumpf rumpf@uni-duesseldorf.de.

Parsing mit DCGs

Prolog Grundkurs WS 99/00Christof 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.

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