% Subcategorization, Number, Case


% Regeln
% ------

s --> np(Number,nom), vp(Number).

vp(Number) --> v(1, Number).
vp(Number) --> v(2, Number), np(_,acc).
vp(Number) --> v(3, Number), np(_,acc), np(_,acc).
vp(Number) --> v(4, Number), s.


np(Number,Case)  --> pron(Number, Case).
np(Number,_Case) --> d(Number), n(Number).



% Lexikon
% -------

d(_)        --> [the].
d(singular) --> [a].
d(plural)   --> [].

pron(singular, nom) --> [he]; [she]. 
pron(singular, acc) --> [him]; [her]. 
pron(plural, nom)   --> [they]. 
pron(plural, acc)   --> [them]. 

n(singular) --> [butler]; [cat]; [dog]; [garden]; [gardener]; [mouse]; [policeman].
n(plural)   --> [butlers]; [cats]; [dogs]; [gardens]; [gardeners]; [mice];
	        [policemen].

v(1, singular) --> [barks]; [sleeps].
v(1, plural)   --> [bark]; [sleep].
v(1, _)        --> [barked]; [slept].
v(2, singular) --> [chases]; [sees].
v(2, plural)   --> [chase]; [see].
v(2, _)        --> [chased]; [saw].
v(3, singular) --> [gives]; [sells].
v(3, plural)   --> [give]; [sell].
v(3, _)        --> [gave]; [sold].
v(4, singular) --> [says]; [thinks].
v(4, plural)   --> [say]; [think].
v(4, _)        --> [said]; [thought].


% --------------------------------------------------------

parse(List) :- s(List,[]).
