%  Parser in Prolog Grammar-rule Notation
% gramdcg8.pl

s --> np(X, Y), vp(X, Y).
np(X, Y) --> pro(X, Y).
np(3, X) --> det(X), n(X).
vp(X, Y) --> vi(X, Y).
vp(X, Y) --> vbe(X, Y), adj.

det(sing) --> [this].
det(plu)  --> [these].
det(X)    --> [the].

n(sing) --> [knight].
n(plu)  --> [knights].
n(X)    --> [sheep].

pro(1, sing) --> [i].
pro(1, plu)  --> [we].
pro(2, X)    --> [you].
pro(3, sing) --> [it].
pro(3, plu)  --> [they].

adj --> [tipsy].

vbe(1, sing) --> [am].
vbe(1, plu)  --> [are].
vbe(2, X)    --> [are].
vbe(3, plu)  --> [are].
vbe(3, sing) --> [is].

vi(X, Y)    --> [slept].
vi(1, X)    --> [sleep].
vi(2, X)    --> [sleep].
vi(3, plu)  --> [sleep].
vi(3, sing) --> [sleeps].