Kapitel Kapitel 4 Deskriptive Programmierung SS 2008 4. 4. Algorithmen und Datenstrukturen in in deskriptiven Programmiersprachen Deskriptive Programmierung 1
Sprachverarbeitung in in Prolog Prolog Prolog wurde ursprünglich für die Verarbeitung von natürlicher Sprache entwickelt. Colmerauer 1972: Mensch-Machine Machine Dialog in natürlicher Sprache Die meisten Prolog-Systeme bieten ein fertiges Konzept für die Verarbeitung geschriebener Sprache. - Die Sprache wird mit Hilfe kontextfreier Grammatiken spezifiziert. - Die Grammatiken werden automatisch in einen Prolog-Parser Parser übersetzt. Deskriptive Programmierung 2
Grammatikregeln Formale Sprachen können mit Hilfe kontextfreier Grammatiken definiert werden. Definition: Eine kontextfreie Grammatik G ist definiert als ein Quadrupel G = (N, T, P, S), wobei gilt: - N ist eine endliche Menge von Nichtterminalsymbolen. - T ist eine endliche Menge von Terminalsymbolen. - P N (N T) * ist eine endliche Menge von Produktionsregeln. Eine Regel wird üblicherweise durch X γ dargestellt, wobei X ein Nichtterminalsymbol und γ eine (evtl. leere) Symbolfolge ist. - S N ist das (nichtterminale( nichtterminale) Startsymbol. Deskriptive Programmierung 3
Kontextfreie Grammatiken Beispiel Beispiel Startsymbol Programm Klauselfolge Klauselfolge Klauselfolge Programmklausel Klauselfolge Programmklausel Klausel Programmklausel Anfrage Klausel Faktum Klausel Regel Faktum Literal '.' Regel Literal ':-' Alternativen '.' Anfrage ':-' Alternativen '.' Alternativen LiteralCutFolge Alternativen LiteralCutFolge ';' Alternativen LiteralCutFolge LiteralCut LiteralCutFolge LiteralCut ',' LiteralCutFolge LiteralCut Literal LiteralCut '!' Nichtterminalsymbol Terminalsymbol Produktionsregeln Deskriptive Programmierung 4
Grammatikregeln in in (erweitertem) Prolog Prolog DCG-Notation: definite clause grammar (in den meisten Prologsystemen vorhanden) Startsymbol satz --> subjekt, verb, objekt. subjekt --> artikel, substantiv. objekt --> artikel, substantiv. artikel --> [das]. artikel --> [einen]. substantiv --> [kind]. substantiv --> [apfel]. verb --> [isst]. Nichtterminalsymbol Terminalsymbol Produktionsregeln Deskriptive Programmierung 5
Zugehöriges Parserprogramm in in normalem Prolog: Prolog: naive naive Version Version satz(l) :- append(l1, L2, L12), append(l12, L3, L), subjekt(l1), verb(l2), objekt(l3). subjekt(l) :- append(l1, L2, L), artikel(l1), substantiv(l2). objekt(l) :- append(l1, L2, L), artikel(l1), substantiv(l2). artikel([das]). artikel([einen]). substantiv([kind]). substantiv([apfel]). verb([isst]). Deskriptive Programmierung 6
Effizientere Version Version des des Parsers Parsers satz(l,r) :- subjekt(l,l1), verb(l1,l2), objekt(l2,r). subjekt(l,r) :- artikel(l,l1), substantiv(l1,r). objekt(l,r) :- artikel(l,l1), substantiv(l1,r). artikel([das R],R). artikel([einen R],R). substantiv([kind R],R). substantiv([apfel R],R). verb([isst R],R). Deskriptive Programmierung 7
Linksrekursive Grammatikregeln Problematisch sind linksrekursive Grammatikregeln: - literalcutfolge --> literalcut. literalcutfolge --> literalcutfolge, comma, literalcut. dazugehörige intern generierte Analyseregeln: - literalcutfolge(l, R) :- literalcut(l, R). - literalcutfolge(l, R) :- literalcutfolge(l, L1), comma(l1, L2), literalcut(l2, R). Rekursiver Abstieg, ohne Elemente zu verarbeiten. Diese sind nicht nur in Prolog ein Problem, sondern generell für Top-down-Parser. Deskriptive Programmierung 8
Parser-Generierung Synthese (1) (1) Bislang: Parser, der feststellt, ob der Satz zur definierten Sprache gehört. Ziel: Weiterverarbeitung der Sätze -Beispiel: Übersetzung ins Englische (oder in Maschinensprache) "Gleich geht es los" - Konstruktion eines Syntaxbaums "Equal goes it loose". "Das Kind isst einen Apfel" satz( nominalphrase( artikel(das), substantiv(kind)), nominalphrase (subjekt) satz verb nominalphrase (objekt) verb(isst), nominalphrase( artikel(einen), substantiv(apfel))) artikel substantiv isst artikel substantiv das kind einen apfel Deskriptive Programmierung 9
Parser-Generierung Synthese (2) (2) satz(satz(s,v,o)) --> subjekt(s), verb(v), objekt(o). subjekt(nominalphrase(a,s)) --> artikel(a), substantiv(s). objekt(nominalphrase(a,s)) --> artikel(a), substantiv(s). artikel(artikel(das)) --> [das]. artikel(artikel(einen)) --> [einen]. substantiv(substantiv(kind)) --> [kind]. substantiv(substantiv(apfel)) --> [apfel]. verb(verb(isst)) --> [isst].?- satz(sb, [das, kind, isst, einen, apfel, mehr], Rest). SB = satz(nominalphrase(artikel(das), substantiv(kind)), verb(isst), nomialphrase(artikel(einen), substantiv(apfel))) Rest = [mehr[ mehr] Deskriptive Programmierung 10
Parser-Generierung Semantische Analyse Analyse (1) (1) Grammatikalisch falsche Sätze sollen als fehlerhaft erkannt werden, z.b.: "Die Kinder isst einen Apfel." vs. "Die Kinder essen einen Apfel." satz(satz(s,v,o)) --> subjekt(s,num), verb(v,num), objekt(o). subjekt(nominalphrase(a,s),num) --> artikel(a),substantiv(s,num). objekt(nominalphrase(a,s)) --> artikel(a), substantiv(s,_). substantiv(substantiv(kind), singular) --> [kind]. substantiv(substantiv(kinder), plural) --> [kinder]. substantiv(substantiv(apfel), singular) --> [apfel] verb(verb(isst), singular) --> [isst]. verb(verb(essen), plural) --> [essen]. artikel(artikel(das)) --> [das]. artikel(artikel(die)) --> [die]. artikel(artikel(einen)) --> [einen]. Deskriptive Programmierung 11
Parser-Generierung Zusatzbedingungen satz(satz(s,v,o)) --> subjekt(s, Num), verb(v, Num), objekt(o). subjekt(nominalphrase(a,s), Num) --> artikel(a), substantiv(s, Num). objekt(nominalphrase(a,s)) --> artikel(a), substantiv(s,_). artikel(artikel(a)) --> > [A], { wb_artikel(a) ) }.} substantiv(substantiv(n), Num) --> > [N], { wb_substantiv(n, Num) ) }.} verb(verb(v), Num) --> > [V], { wb_verb(v, Num) ) }.} Wörter-Datenbank wb_artikel(das). wb_artikel(die). wb_artikel(einen). wb_substantiv(kind, singular). wb_substantiv(kinder, plural). wb_substantiv(apfel, singular). wb_verb(isst, singular). wb_verb(essen, plural). Aufrufe beliebiger Zusatzbedingungen, d.h. beliebiger Prolog-PrädikatePrädikate Deskriptive Programmierung 12
Deskriptive Programmierung 13