% Figure 17.6 A DCG handling the syntax and meaning of a small
% subset of natural language.
:- op( 100, xfy, and).
:- op( 150, xfy, =>).
sentence( S) -->
noun_phrase( X, P, S), verb_phrase( X, P).
noun_phrase( X, P, S) -->
determiner( X, P12, P, S), noun( X, P1), rel_clause( X, P1, P12).
noun_phrase( X, P, P) -->
proper_noun( X).
verb_phrase( X, P) -->
trans_verb( X, Y, P1), noun_phrase( Y, P1, P).
verb_phrase( X, P) -->
intrans_verb( X, P).
rel_clause( X, P1, P1 and P2) -->
[that], verb_phrase( X, P2).
rel_clause( X, P1, P1) --> [].
determiner( X, P1, P, all( X, P1 => P)) --> [every].
determiner( X, P1, P, exists( X, P1 and P)) --> [a].
noun( X, man(X)) --> [man].
noun( X, woman(X)) --> [woman].
proper_noun( john) --> [john].
proper_noun( annie) --> [annie].
proper_noun( monet) --> [monet].
trans_verb( X, Y, likes( X, Y)) --> [ likes].
trans_verb( X, Y, admires( X, Y)) --> [admires].
intrans_verb( X, paints(X)) --> [paints].
% Some tests
test1( M) :-
sentence( M, [john,paints],[]).
test2( M) :-
sentence( M, [a, man, paints], []).
test3( M) :-
sentence( M, [every,man,that,paints,admires,monet],[]).
test4( M) :-
sentence( M, [annie,admires,every,man,that,paints],[]).
test5( M) :-
sentence( M, [every,woman,that,admires,a,man,that,paints,likes,monet],[]).