% Berechnung von Links fuer beliebige Grammatiken % Simon Clematide "Programmiertechniken in der Computerlinguistik II" Sommer 2005 % Unterlagen dazu im Skript "Left Corner Parsen" % assert_lc_link/0 % Assertiere lc_link/2-Fakten auf Grund von kontextfreien Grammatikregeln % im Format rule(LHS, RHS). Die syntaktischen Kategorien duerfen % komplex sein. % Bespielgrammatik /* rule(s(s(ADVSI,S)), [advsi(ADVSI),s(S)]). rule(s(s(NP,VP)), [np(NP),vp(VP)]). rule(np(np(DET,N)), [det(DET),n(N)]). rule(np(np(NP1,CONJ,NP2)), [np(NP1),conj(CONJ),np(NP2)]). rule(vp(vp(V,ADV)), [v(V),adv(ADV)]). rule(vp(vp(VMOD,VINF)), [vmod(VMOD),vinf(VINF)]). rule(det(det('')), []). rule(adv(adv('')), []). rule(advsi(advsi('')), []). */ assert_lc_link :- compute_lc_link(LC, C), \+ (clause(lc_link(LC,C),true)), assertz(lc_link(LC,C)), fail. assert_lc_link. :- use_module(library(lists),[memberchk/2]). compute_lc_link(LC, C) :- lc_link_via(category(SymbolLC,ArityLC), [category(SymbolC,ArityC)]), functor(LC, SymbolLC, ArityLC), functor(C, SymbolC, ArityC). compute_lc_link(C, C). lc_link_via(category(Symbol1,Arity1), [category(Symbol1,Arity1),category(Symbol2,Arity2)|_]) :- rule(LHS, [LC|_]), functor(LHS, Symbol1, Arity1), functor(LC, Symbol2, Arity2). lc_link_via(Initial, [category(SymbolLC,ArityLC)|Tail]) :- rule(NewFirst, [LC|_]), functor(NewFirst, Symbol, Arity), functor(LC, SymbolLC, ArityLC), \+ (memberchk(category(Symbol,Arity), [category(SymbolLC,ArityLC)|Tail])), lc_link_via(Initial, [category(Symbol,Arity),category(SymbolLC,ArityLC)|Tail]).