
:- op( 300, xfy, [ '&', '=>' ] ).


s(S) --> np(IV^S), vp(IV).

np(IV^S) --> det(N2^IV^S), n(N1), optrel(N1^N2).
np((E^S)^S) --> pn(E).

vp(X^S) --> tv(X^IV), np(IV^S).
vp(IV) --> iv(IV).

optrel((X^S1)^(X^(S1 & S2))) --> [that], vp(X^S2).
optrel(N^N) --> [].

det( (X^S1)^(X^S2)^   all(X,(S1 => S2)) ) --> [every].
det( (X^S1)^(X^S2)^exists(X,(S1 &  S2)) ) --> [a].

n( X^  man(X) ) --> [man].
n( X^woman(X) ) --> [woman].

pn( john ) --> [john].
pn( mary ) --> [mary].

tv( X^Y^loves(X,Y) ) --> [loves].

iv( X^sleeps(X) ) --> [sleeps].
