% Top-Down-Chart-Parser mit Vollstaendigkeitsvermerk % Simon Clematide "Programmiertechniken in der Computerlinguistik II" Sommer 2005 % Unterlagen dazu im Skript /* Anfragebeispiele ?- clear_chart, parse(vp, [chased,a,dog,with,a,bone]-[]). Geschwaetziger Parser ?- clear_chart, C=vp,verbose_parse(C, [chased,a,dog,with,a,bone]-[]). */ % Grammatik und Lexikon rule(s, [np,vp]). rule(np, [det,n]). rule(np, [det,n,pp]). rule(vp, [v,np]). rule(vp, [v,np,pp]). rule(pp, [p,np]). word(det, a). word(p, with). word(n, dog). word(n, bone). word(v, chased). % parse/2: Parsen einer Kategorie C parse(C, [Word|S]-S) :- word(C, Word). parse(C, S-Rest) :- complete(C, S), !, edge(C, S, Rest). parse(C, S-Rest) :- rule(C, RHS), parse_daughters(RHS, S-S1), asserta(edge(C, S, S1)), S1 = Rest. parse(C,S-_) :- asserta(complete(C,S)), fail. % parse_daughters/2: Parsen einer % Liste von Kategorien parse_daughters([C|Cs], S-Rest) :- parse(C, S-S1), parse_daughters(Cs, S1-Rest). parse_daughters([], S-S). % Vollstaendigkeitsvermerk :- dynamic complete/2. % Kanten :- dynamic edge/3. % Chart saeubern clear_chart :- retract(edge(_,_,_)), fail. clear_chart :- retract(complete(_,_)), fail. clear_chart. verbose_parse(C, [Word|S]-S) :- word(C, Word). verbose_parse(C, S-Rest) :- complete(C, S), !, edge(C, S, Rest), format("FOUND IN CHART: ~p~N",[edge(C,S,Rest)]). verbose_parse(C, S-Rest) :- rule(C, RHS), verbose_parse_daughters(RHS, S-S1), asserta(edge(C, S, S1)), format("ADDED IN CHART: ~p~N",[edge(C, S, S1)]), S1 = Rest. verbose_parse(C,S-_) :- asserta(complete(C,S)), format("COMPLETED CATEGORY '~p' STARTING ON ~p~N",[C,S]), fail. % verbose_parse_daughters/2: Parsen einer % Liste von Kategorien verbose_parse_daughters([C|Cs], S-Rest) :- verbose_parse(C, S-S1), verbose_parse_daughters(Cs, S1-Rest). verbose_parse_daughters([], S-S).