%	Convert English statement into predicate logic.
%	From Clocksin & Mellish

:- op(700, xfy, &).

sentence(P) :-
	noun_phrase(X, P1, P),
	verb_phrase(X, P1),
	terminator, !.
sentence(_) :- error.

noun_phrase(X, P1, P) :-
	determiner(X, P2, P1, P),
	noun(X, P3),
	rel_clause(X, P3, P2).

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 & P2)) :- #that, verb_phrase(X, P2).

rel_clause(_, P, P).


determiner(X, P1, P2, all(X, (P1 -> P2))) :- #every.

determiner(X, P1, P2, exists(X, (P1 & P2))) :- #a.


noun(X, man(X)) :- #man.

noun(X, woman(X)) :- #woman.

proper_noun(john) :- #john.

proper_noun(mary) :- #mary.

trans_verb(X, Y, loves(X, Y)) :- #loves.

intrans_verb(X, lives(X)) :- #lives.
 
error :- terminator, !, fail.
error :- #X, error.

terminator :- #'.'.
terminator :- #'?'.
