%% Description: Code for Chart Parsing %% %% Writer: Gazdar/Mellish (1989) %% %% °ü·Ã¼º: Á¦ 3Àå %% %% Name: chart.pl %% :- consult('epsg_ch.pl'). :- consult('tree_ls.pl'). parse(V0,Vn,String) :- start_chart(V0,Vn,String). add_edge(V1,V2,Category1,[],Parse) :- assertz(edge(V1,V2,Category1,[],Parse)), foreach(rule(Category2,[Category1|Categories]), add_edge(V1,V1,Category2,[Category1|Categories],[Category2])), foreach(edge(V0,V1,Category2,[Category1|Categories],Parses), % fundamaental rule add_edge(V0,V2,Category2,Categories,[Parse|Parses])). add_edge(V0,V1,Category,Categories,Parse) :- edge(V0,V1,Category,Categories,Parse),!. add_edge(V0,V1,Category1,[Category2|Categories],Parses) :- assertz(edge(V0,V1,Category1,[Category2|Categories],Parses)), foreach(edge(V1,V2,Category2,[],Parse), add_edge(V0,V2,Category1,Categories,[Parse|Parses])). start_chart(V0,V0,[]). start_chart(V0,Vn,[Word|Words]) :- V1 is V0+1, foreach(word(Category,Word), add_edge(V0,V1,Category,[],[Word,Category])), start_chart(V1,Vn,Words). % test % allows use of test sentences (in "epsg_ch.pl") with chart parsers test(String) :- V0 is 0, initial(Symbol), parse(V0,Vn,String), foreach(edge(V0,Vn,Symbol,[],Parse), mwrite(Parse)), listing(edge), retractall(edge(_,_,_,_,_)). foreach(X,Y) :- X, do(Y), fail. foreach(X,Y) :- true. do(Y) :- Y, !. mwrite(Tree) :- mirror(Tree,Image), write(Image), nl,nl,tree_ls(Image),nl. mirror([],[]) :- !. mirror(Atom,Atom) :- atomic(Atom). mirror([X1|X2],Image) :- mirror(X1,Y2), mirror(X2,Y1), append(Y1,[Y2],Image). % test sentences test1 :- test([peter,saw, a,girl]). test2 :- test([peter,saw, the,girl,with,a, telescope]). test3 :- test([they,report,on,the,nurses]).