% CS-335 Foundations of AI
% Coursework 1 - Part 1
%
% Sean Handley, 320097@swan.ac.uk

%define a simple sentence - noun phrase, followed by verb phrase
sentence(sentence(NP,VP)) --> noun_phrase(Num,NP), verb_phrase(Num,VP).

%define different forms of noun phrase
noun_phrase(Num,NP) -->
	quantifier(Q),
	anim_noun(Num,N),
	{build_noun_phrase(Q,N,NP)}.

noun_phrase(Num,NP) -->
    quantifier(Q),
	adjective(A),
    anim_noun(Num,N),
    {build_noun_phrase(Q,A,N,NP)}.

noun_phrase(Num,NP) -->
	anim_noun(Num,N),
	{build_noun_phrase(N,NP)}.

noun_phrase(Num,NP) -->
	adjective(A),
	anim_noun(Num,N),
	{build_noun_phrase(A,N,NP)}.

build_noun_phrase(Q,N,noun_phrase(Q,N)).
build_noun_phrase(N,noun_phrase(N)).
build_noun_phrase(Q,A,N,noun_phrase(Q,A,N)).
build_noun_phrase(A,N,noun_phrase(A,N).

%distinguish subject NPs and object NPs
object_noun_phrase(Num,NP) -->
	quantifier(Q),
	inanim_noun(Num,N),
	{build_object_noun_phrase(Q,N,NP)}.

object_noun_phrase(Num,NP) -->
	quantifier(Q),
	adjective(A),
	inanim_noun(Num,N),
	{build_object_noun_phrase(Q,A,N,NP)}.

object_noun_phrase(Num,NP) -->
	inanim_noun(Num,N),
	{build_object_noun_phrase(N,NP)}.

object_noun_phrase(Num,NP) -->
	adjective(A),
	inanim_noun(Num,N),
	{build_object_noun_phrase(A,N,NP)}.

object_noun_phrase(Num,NP) -->
	noun_phrase(Num,NP).

build_object_noun_phrase(Q,N,object_noun_phrase(Q,N)).
build_object_noun_phrase(N,object_noun_phrase(N)).
build_object_noun_phrase(Q,A,N,object_noun_phrase(Q,A,N)).
build_object_noun_phrase(A,N,object_noun_phrase(A,N)).

%verb phrase must be followed by object NP
verb_phrase(Num,verb_phrase(TV,NP)) -->
	transitive_verb(Num,TV),
	object_noun_phrase(_,NP).

%define quantifiers
quantifier(quantifier(Q)) --> [Q], {quantifier(Q)}.
quantifier(some).
quantifier(every).
quantifier(all).
quantifier(a).

%define adjectives
adjective(adjective(A)) --> [A], {adjective(A)}.
adjective(black).
adjective(small).
adjective(ugly).
adjective(sweet).

%define nouns, distinguishing anim and inanim as well as plurality
anim_noun(sing,anim_noun(N)) --> [N], {anim_noun(N,_X)}.
anim_noun(plu,anim_noun(N)) --> [N], {anim_noun(_X,N)}.

anim_noun(child,children).
anim_noun(boy,boys).
anim_noun(girl,girls).
anim_noun(goat,goats).
anim_noun(cow,cows).
anim_noun(sheep,sheep).

inanim_noun(sing,inanim_noun(N)) --> [N], {inanim_noun(N,_X)}.
inanim_noun(plu,inanim_noun(N)) --> [N], {inanim_noun(_X,N)}.

inanim_noun(ball,balls).
inanim_noun(doll,dolls).
inanim_noun(toy,toys).

%define verbs as well as plurality
transitive_verb(sing,transitive_verb(TV)) --> [TV], {transitive_verb(TV,_X)}.
transitive_verb(plu,transitive_verb(TV)) --> [TV], {transitive_verb(_X,TV)}.
transitive_verb(follows,follow).
transitive_verb(hits,hit).
transitive_verb(carries,carry).
transitive_verb(loves,love).