%  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],[]).
