/* A depth-first, left-to-right parser.
Here is how the parser is called:
| ?- parse(s, [the,dog,chased,the,cat], []).
yes
*/
parse(Cat, [Firstword|Restwords], Restwords):-
(Cat ==> Firstword).
parse(Cat, String, Rest ):-
(Cat ==> Daughters),
parsedaughters(Daughters, String, Rest).
parsedaughters((Cat, Cats), String, Rest):-
parse(Cat, String, Next),
parsedaughters(Cats, Next, Rest).
parsedaughters(Cat, String, Rest):-
parse(Cat, String, Rest).