home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lifeos2.zip / LIFE-1.02 / TESTS / LF / CHART_PA.LF < prev    next >
Text File  |  1996-06-04  |  3KB  |  92 lines

  1. % a top-down chart parser in life
  2. % ge 21 dec 93, 13 jan 94
  3.  
  4. % See ~vanroy/People/Gregor.Erbach
  5.  
  6. % ---------------------------------------------------------------------------
  7. % * Gregor Erbach - Universitaet des Saarlandes - Computational Linguistics
  8. % *
  9. % *         Im Stadtwald - POB 1150 - D-66041 Saarbruecken - Germany
  10. % *
  11. % *   erbach@coli.uni-sb.de * Tel +49/681 302-4117 * Fax +49/681 302-4351
  12. % *
  13. % ---------------------------------------------------------------------------
  14.  
  15. % rules:   rule(lhs => Cat,rhs => List-of-Cat)
  16. % lexicon: lex(Word) -> Cat
  17. % item:    item(begin => B, end => E, cat => C, rest => List-of-Cat)
  18. dynamic(item)?
  19.  
  20. % clear the item database
  21. rec :-
  22.      retract(item),
  23.      fail.
  24. % predict the startsymbol at node 0
  25. rec :-
  26.      predict(node => 0, cat => startsymbol),
  27.      fail.
  28. % scanning
  29. rec(String) :-
  30.      app(X,[Word|_],String),
  31.      add_item(item(begin => N:length(X), 
  32.                    end => N+1, 
  33.                    cat => lex(Word), rest => [])
  34.              ), 
  35.      fail.
  36. % look up results
  37. rec(String,Cat) :-
  38.      item(begin => 0, end => length(String), cat => Cat, rest => []).
  39.  
  40. predict(node => N, cat => C) :-
  41.      \+((item(begin => N, end => N, cat => Cat),  subsumes(Cat,C))),
  42.      rule(lhs => C, rhs => RHS),
  43.      add_item(item(begin => N, end => N, cat => C, rest => RHS)),
  44.      fail.
  45. predict.
  46.  
  47. % assert the item
  48. add_item(Item) :-
  49.      assert(Item),
  50.      fail.
  51. % apply fundamental rule for passive item
  52. add_item(item(begin => Mid, end => E, cat => C, rest => [])) :- 
  53.      item(begin => B, end => M, rest => [C1|Rest], cat => Cat),
  54.      nl, write(unify(M,Mid)),
  55.      M = Mid,  write('   done'), 
  56.      C = C1,
  57.      add_item(item(begin => B, end => E, cat => Cat, rest => Rest)),
  58.      fail.
  59. % apply fundamental rule for active item
  60. add_item(item(begin => B, end => Mid, cat => Cat, rest => [F|Rest])) :-
  61.      item(begin => Mid, end => E, cat => F, rest => []),
  62.      add_item(item(begin => B, end => E, cat => Cat, rest => Rest)),
  63.      fail.
  64. % predict first category of active item
  65. add_item(item(end => E, rest => [F|_])) :-
  66.      predict(node => E, cat => F).
  67.  
  68. subsumes(X,X).   % not quite correct
  69.  
  70. % append
  71. app([],L,L).
  72. app([X|L1],L2,[X|L3]) :- app(L1,L2,L3).
  73.  
  74. % a mini grammar for testing
  75. startsymbol -> s.
  76.  
  77. rule(lhs => s(Tns),
  78.      rhs => [np(Num), vp(Num,Tns)]).
  79.  
  80. rule(lhs => vp(Num,Tns),
  81.      rhs => [vi(Num,Tns)]).
  82.  
  83. rule(lhs => vp(Num,Tns),
  84.      rhs => [vt(Num,Tns), np(_)]).
  85.  
  86. lex(john) ->  np(sg).
  87. lex(they) -> np(pl).
  88. lex(sleep) -> vi(pl,pres).
  89. lex(sleeps) -> vi(sg,pres).
  90. lex(hit) -> vt(pl,pres).
  91. lex(hits) -> vt(sg,pres).
  92.