:- 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].