pn([mary|X],X).
n([clown|X],X).
det([a|X],X).
vi([laughs|X],X).
vt([loves|X],X).
vs([thinks|X],X).

s(X0,Xn) :- np(X0,X1),
            vp(X1,Xn).

np(X0,Xn) :- pn(X0,Xn).
np(X0,Xn) :- det(X0,X1),
             n(X1,Xn).

vp(X0,Xn) :- vi(X0,Xn).

vp(X0,Xn) :- vt(X0,X1), 
             np(X1,Xn).

vp(X0,Xn) :- vs(X0,X1), 
             s(X1,Xn).
