s(Sem) --> np((X^Scope)^Sem), vp(X^Scope).

np((Sem^Scope)^Scope) --> proper_noun(Sem).
np(Sem) --> determiner((X^Restrictor)^Sem), n(X^Restrictor).

vp(Sem)  --> intransitive_verb(Sem).
vp(X^Pred) --> transitive_verb(Y^X^Scope), np((Y^Scope)^Pred).

n(Sem) --> common_noun(Sem).
n(X^(P, Q)) --> adjective(X^P), n(X^Q).

proper_noun(max) --> [max].
proper_noun(fido) --> [fido].

determiner((X^Restrictor)^(X^Scope)^all(X, Restrictor, Scope)) --> [every].
determiner((X^Restrictor)^(X^Scope)^some(X, Restrictor, Scope)) --> [a]; [some].

common_noun(X^cat(X)) --> [cat].
common_noun(X^dog(X)) --> [dog].
common_noun(X^professor(X)) --> [professor].

adjective(X^big(X)) --> [big].
adjective(X^brown(X)) --> [brown].
adjective(X^little(X)) --> [little].
adjective(X^green(X)) --> [green].

intransitive_verb(X^bark(X)) --> [barked].
intransitive_verb(X^meow(X)) --> [meowed].

transitive_verb(Y^X^chase(X, Y)) --> [chased].
transitive_verb(Y^X^see(X, Y)) --> [saw].
