54 lines
993 B
Plaintext
54 lines
993 B
Plaintext
|
|
||
|
|
||
|
% Categories allows us to neatly organize the different "kinds"
|
||
|
% of words on this example: determiners, nouns, and verbs
|
||
|
|
||
|
|
||
|
:- category(determiners).
|
||
|
|
||
|
:- private(determiner//0). % private category non-terminals become private
|
||
|
% non-terminals of the objects importing the category
|
||
|
determiner --> [the].
|
||
|
determiner --> [a].
|
||
|
|
||
|
:- end_category.
|
||
|
|
||
|
|
||
|
:- category(nouns).
|
||
|
|
||
|
:- private(noun//0).
|
||
|
|
||
|
noun --> [boy].
|
||
|
noun --> [girl].
|
||
|
|
||
|
:- end_category.
|
||
|
|
||
|
|
||
|
:- category(verbs).
|
||
|
|
||
|
:- private(verb//0).
|
||
|
|
||
|
verb --> [likes].
|
||
|
verb --> [hates].
|
||
|
|
||
|
:- end_category.
|
||
|
|
||
|
|
||
|
:- object(sentence,
|
||
|
implements(parsep),
|
||
|
imports(determiners, nouns, verbs)).
|
||
|
|
||
|
parse(List, true) :-
|
||
|
phrase(sentence, List).
|
||
|
parse(_, false).
|
||
|
|
||
|
sentence --> noun_phrase, verb_phrase.
|
||
|
|
||
|
noun_phrase --> ::determiner, ::noun. % the ::/1 control construct is used to call grammar
|
||
|
noun_phrase --> ::noun. % rules encapsulated on the imported categories
|
||
|
|
||
|
verb_phrase --> ::verb.
|
||
|
verb_phrase --> ::verb, noun_phrase.
|
||
|
|
||
|
:- end_object.
|