sentence --> np, vp. np --> det, noun. vp --> iverb. vp --> tverb, np. det --> [a]. det --> [every]. det --> [the]. noun --> [man]. noun --> [woman]. noun --> [cat]. noun --> [dog]. iverb --> [walks]. iverb --> [runs]. tverb --> [hates]. tverb --> [loves]. tverb --> [chases]. tverb --> [bites]. ?- findall(P,phrase(np,P),L), write(L), nl. ?- findall(P,phrase(sentence,P),L), length(L,N), write(N), nl. sentence(s(N,V)) --> np(N), vp(V). np(q(D,X)) --> det(D), noun(X). vp(X) --> iverb(X). vp(r(N,X)) --> tverb(X), np(N). det(e) --> [a]. det(a) --> [every]. det(u) --> [the]. noun(m) --> [man]. noun(w) --> [woman]. noun(c) --> [cat]. noun(d) --> [dog]. iverb(w) --> [walks]. iverb(r) --> [runs]. tverb(h) --> [hates]. tverb(l) --> [loves]. tverb(c) --> [chases]. tverb(b) --> [bites]. ?- phrase(sentence(S),[every,dog,hates,the,cat]), write(S), nl. ?- phrase(sentence(s(q(e,m),r)),P), write(P), nl.