% A top-down, depth-first Prolog parser that builds trees
% progtddfparse.pl
:- op(1200, xfx, --->).
:- op(1200, xfx, ===>).
td_parse(Cat,[Cat, Word], [Word|Rest],Rest) :-
   (Cat===> [Word]).
td_parse(Mother, [Mother | Dtrs], S0,S) :-
    (Mother ---> Daughters),
    td_parse_dtrs(Daughters, Dtrs,  S0,S).
td_parse_dtrs([], [], S, S).
td_parse_dtrs([Cat | Cats],[Dtr | Dtrs], S0,S) :-
   td_parse(Cat, Dtr, S0,S1),
   td_parse_dtrs(Cats, Dtrs, S1,S).