parse(Words) :-
        start_symbol(S), parse(S,Words,[]).
parse(A,I,J) :-
        scan(B,I,K), 
        leftcorner(B,A,K,J).

scan(B,I,K) :-
        ( (B ---> []), I=K
        ; (word(W,B) ; B=[W]), I = [W|K] ).
leftcorner(B,A,I,J) :-
        ( B=A, I=J
        ; (C ---> Gamma),
            tupleToList(Gamma,[B|Beta])
            parse_list(Beta,I,K),
            leftcorner(C,A,K,J)
        ).
parse_list([B|Bs],I,J) :-
        parse(B,I,K), parse_list(Bs,K,J).
parse_list([],I,J) :- I = J.

tupleToList((B,C),[B|Cs]) :- !, tupleToList(C,Cs).
tupleToList([],[]).
tupleToList([W],[[W]]).
tupleToList(B,[B]).

