Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Прологу.doc
Скачиваний:
68
Добавлен:
01.05.2014
Размер:
501.25 Кб
Скачать

Verb( string ) % Глагол

DOMAINS % Описание грамматики

DETERM = none ; determ( STRING )

NOUNP = nounp( DETERM, STRING, RELCL)

RELCL = none ; relcl( STRING, VERBP )

SENTENCE = sent( NOUNP, VERBP )

VERBP = verb( STRING ) ; verbp( STRING, NOUNP )

TOKL = STRING*

PREDICATES

is_det( STRING )

is_noun( STRING )

is_rel( STRING )

is_verb( STRING )

s_determ( TOKL, TOKL, DETERM )

s_nounp( TOKL, TOKL, NOUNP )

s_relcl( TOKL, TOKL, RELCL )

s_sentence( TOKL, TOKL, SENTENCE )

s_verbp( TOKL, TOKL, VERBP )

tokl( STRING, TOKL )

tom(TOKL)

run1

run2(STRING)

sen_an

GOAL makewindow(1,6,0,"",0,0,25,80),

sen_an.

CLAUSES

sen_an:– write("Try: every man that lives loves a woman"),

readln(LIN), LIN >< "" ,

tokl(LIN,TOKL),

s_sentence( TOKL, _, SENT),

write("PROLOG OBJECT=",SENT," "),

readchar(_),clearwindow,!.

tokl(STR,[TOK|TOKL]) :–

fronttoken(STR,TOK,STR1),

tokl(STR1,TOKL).

tokl(_,[ ]).

s_sentence(TOKL,TOKL2,sent(NOUNP,VERBP)):–

s_nounp(TOKL,TOKL1,NOUNP),

s_verbp(TOKL1,TOKL2,VERBP),

TOKL2=[ ],!.

s_sentence(_,_,_):–write(">> Sentence not recognized \n"),fail.

% Группа подлежащего

s_nounp(TOKL,TOKL2,nounp(DETERM,NOUN,RELCL)):–

s_determ(TOKL,[NOUN|TOKL1],DETERM),

is_noun(NOUN),

s_relcl(TOKL1,TOKL2,RELCL).

% Определитель

s_determ([DETERM|TOKL],TOKL,determ(DETERM)):–

is_det(DETERM).

s_determ(TOKL,TOKL,none).

% Группа дополнения

s_relcl([REL|TOKL],TOKL1,relcl(REL,VERBP)):–

is_rel(REL),

s_verbp(TOKL,TOKL1,VERBP).

s_relcl(TOKL,TOKL,none).

% Группа сказуемого

s_verbp([VERB|TOKL],TOKL1,verbp(VERB,NOUNP)):–

is_verb(VERB),

s_nounp(TOKL,TOKL1,NOUNP).

s_verbp([VERB|TOKL],TOKL,verb(VERB)):–

is_verb(VERB).

is_noun(X):–noun(X),!.

is_noun(X):–noun(Y),concat(Y,"s",X).

is_det(X):–det(X).

is_rel(X):–rel(X).

is_verb(X):–verb(X),!.

is_verb(X):–verb(Y),concat(Y,"s",X),!.

is_verb(X):–verb(Y),concat(Y,"ed",X),!.

is_verb(X):–verb(Y),concat(Y,"es",X),!.

is_verb(X):–verb(Y),concat(Y,"ing",X).

% Словарь

det("every").

det("a").

noun("man").

noun("woman").

rel("that").

rel("who").

rel("whom").

rel("which").

rel("that").

verb("love").

verb("live").

4. Стандартные предикаты

Одной из основных причин, которые помогли Прологу стать "реальным" языком программирования, было введение в язык элементов, лежащих за пределами чистой логики. В Турбо-Прологе такие элементы реализованы как стандартные (встроенные) предикаты.

Большинство стандартных предикатов выполняет несколько функций в зависимости от состояния параметров, входящих в предикат. В одном случае заранее определен какой-либо один параметр, в другом случае известны другие параметры, иногда к моменту обращения могут быть известны все параметры. Известные параметры предиката называются входными, неизвестные – выходными. Совокупность входных и выходных параметров определяет работу предиката. Эта совокупность называется поточным шаблоном. Если предикат будет вызываться с двумя аргументами, имеется четыре варианта поточного шаблона:

(i,i) (i,o) (o,i) (o,o),

где i– входной параметр,о– выходной параметр. Однако не для каждого предиката все возможные варианты поточного шаблона имеют смысл.

Hиже приводятся некоторые наиболее часто употребляемые стандартные предикаты, сгруппированные в отдельные классы по их функциональному назначению. Более полный список стандартных предикатов можно найти в [3].