% Example of DCG

%

% This DCG handles adjectives as well as number-agreement

% between the subject noun and the verb (so "The man eats an apple"

% is okay, but "The man eat an apple" is not).

sentence(sentence(N,V)) --> noun_phrase(N,Num), verb_phrase(V,Num).

noun_phrase(np(D,N),Num) --> determiner(D,Num), noun_phrase2(N,Num).

noun_phrase(np(N),Num) --> noun_phrase2(N,Num).

noun_phrase2(np2(A,N),Num) --> adjective(A),noun_phrase2(N,Num).

noun_phrase2(np2(N),Num) --> noun(N,Num).

verb_phrase(vp(V),Num) --> verb(V,Num).

verb_phrase(vp(V,N),Num) --> verb(V,Num), noun_phrase(N,Num1).

determiner(det(the),Num) --> [the].

determiner(det(a),singular) --> [a].

determiner(det(an),singular) --> [an].

noun(noun(pieplate),singular) --> [pieplate].

noun(noun(pieplates),plural) --> [pieplates].

noun(noun(man),singular) --> [man].

noun(noun(men),plural) --> [men].

noun(noun(apple),singular) --> [apple].

noun(noun(apples),plural) --> [apples].

noun(noun(surprise),singular) --> [surprise].

noun(noun(surprises),plural) --> [surprises].

adjective(adj(decorated)) --> [decorated].

adjective(adj(red)) --> [red].

verb(verb(contains),singular) --> [contains].

verb(verb(contain),plural) --> [contain].

verb(verb(eats),singular) --> [eats].

verb(verb(eat),plural) --> [eat].

%query is of the form:

%?-sentence(Z,[the,man,eats,the,apple],[]).

%Z will contain the parse tree after execution is done.

%?-sentence(Z,[the,man,eat,the,apple],[]).

%this query will fail because of number disagreement

%between the verb and subject.

%?-sentence(Z,[the,man,eats,the,red,apple],[]).

%?-sentence(Z,[the,decorated,pieplate,contains,a,surprise],[]).

%%add some verbs, adjectives, and nouns to the grammar above.

%%load the system on sicstus, then run some queries to compute.

%%the parse trees of some sentences. Do this for 5 sentences.

%%submit your script. >/html>