%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Konstruktion einer c- und einer f-Struktur zu einem Satz %%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Die c-Struktur ist ein Baum, dessen Knoten grammatische Kategorien sind, % z.B. satz, vp, nomen. Die Knoten der hier konstruierten Bäume sind Paare % aus diesen Kategorien und der zugehörigen f-Struktur. Dadurch können die % Metaregeln der lexikalisch-funktionalen Grammatik sehr leicht implemen- % tiert werden. Eine f-Struktur wird dargestellt durch eine Liste von Paa- % ren, z.B. [ (cas, dat), (genus, neut), (num, sg)]. Dabei ist die Liste % nach der ersten Komponente geordnet. In der zweiten Komponente kann alles % enthalten sein, was die Definition der f-Struktur erlaubt (z.B. wieder % eine f-Struktur. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Regeln für kontextfreie Grammatiken %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Startsymbol start(satz). % Zur Zeit noch sehr einfache Sätze nur von der Form np.vp % Die np muß im Nominativ stehen. regel((satz,F),[(np,F1),(vp,F2)]):- member((cas, nom),F1), matchf(F1,F2,F). % Erlaubte Nominalphrasen gegeben durch det.adj*.nomen regel((np,F),[(det,F1),(nomenliste,F2)]):-matchf(F1,F2,F). regel((nomenliste,F),[(nomen,F)]). regel((nomenliste,F),[(adj,F1),(nomenliste,F2)]):-matchf(F1,F2,F). % Hier wird die genaue Form der Regel aus der subcat-Liste entnommen. regel((vp,F),[(v,F1) | Exp]):- member((subcat,L),F1), expand(L,Exp,F2), matchf(F1,F2,F). expand([],[],[]). expand([Cat|Rest],[(np,F1)|Rest1],F):- member((cas, Cat),F1), expand(Rest,Rest1,F2), matchf([(Cat,F1)],F2,F). % terminal, nichtterminal werden hier noch nicht benötigt. Für spätere % Verwendung werden sie schon programmiert. nichtterminal(X):-regel(X,_). nichtterminal(X):-lexikon(X,_). terminal(X):-not(nichtterminal(X)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Regeln für c- und f-Strukturen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ein Satz ist korrekt, wenn man zu ihm einen Baum konstruieren kann. korrekt(Satz):- machebaum(Satz,_). machebaum(Satz,Baum):- expansion(Satz,Exp), baum(Exp,Baum). % In baum wird aus der Liste von Bäumen, die aus expansion entstehen, ein % einzelner Baum gemacht. Dabei wird eine mittlere Teilliste (unten als M % bezeichnet) ausgewählt, überprüft, ob deren Wurzeln als rechte Seite % einer Regel auftreten können, und, wenn das der Fall sein sollte, aus % der Teilliste M ein neuer Baum [N|M] konstruiert, der dann das M ersetzt. baum(L,L):- lieswurzel(L,[(W,_)]), start(W). baum(L,Baum):- zerlege(L,A,M,E), lieswurzel(M,W), regel(N,W), anhaengen(A,[[N|M]|E],L1), baum(L1,Baum). % expansion macht aus einem Satz (einer Liste von Worten), eine Liste von % Bäumen. Beispieleingabe: [die,frau,schlaeft] Die Bäume bestehen nur aus % einem Knoten. Dieser ist ein Paar aus der Wortart und einer f-Struktur. expansion([],[]). expansion([Wort|Rest],[[(Wortart,F)]|Rest1]):- lexikon(Wortart,Formen,[Wort]), fstruct(Wortart,Formen,F), expansion(Rest,Rest1). % Aufbau der simpelsten f-Strukturen. fstruct(nomen,(Casus,Numerus,Genus), [(cas,Casus),(genus,Genus),(num,Numerus)]). fstruct(adj,(Casus,Numerus,Genus), [(cas,Casus),(genus,Genus),(num,Numerus)]). fstruct(det,(Casus,Numerus,Genus), [(cas,Casus),(genus,Genus),(num,Numerus)]). fstruct(v,(Numerus,Genus,subcat(Liste)), [(genus,Genus),(num,Numerus),(subcat,Liste)]). % lieswurzel macht aus einer Liste von Bäumen die Liste von deren Wurzeln. lieswurzel([],[]). lieswurzel([[W|_]|Rest],[W|Rest1]):- lieswurzel(Rest,Rest1). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Hilfsfunktionen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% anhaengen([],L,L). anhaengen([ X | Rest ],Liste,[ X | G ]) :- anhaengen(Rest,Liste,G). % zerlege Liste L in einen Anfang A, Mitte M, Ende E. zerlege(L,A,M,E):-anhaengen(H,E,L),anhaengen(A,M,H). % Konvertierung für Erweiterung zur Morphologiebehandlung konvert(N,L):-name(N,L1),konvertliste(L1,L). konvertliste([],[]). konvertliste([B|Rest],[B1|Rest1]):- name(B1,[B]), konvertliste(Rest,Rest1). % lexikalische Ordnung: X kommt vor Y im Lexikon vor(X,Y):-name(X,NX),name(Y,NY),kleiner(NX,NY). % lexikalische Ordnung auf Listen kleiner([],[_|_]). kleiner([K|_],[L|_]):-K