Использование программы "объект"

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

|? - объект ( [cow, horse, goat], Остаток, существительное).

Остаток = [horse, goat}

Запрос спрашивает: можно ли взять существительное из начала списка "[cow, horse, goat]" и если да, то какая часть списка останется? Ответ на данный запрос показывает, что это возможно, и что остается список «[horse, goat]». Запрос подтверждает, что слово cow является существительным.

Сходным образом, запрос к процедуре "объект" подтвердит или опровергнет предположение о том, что список слов образует нетерминал:

|? - объект ([the, cow,’.‘], L, глагольная_группа).

нет

|?— объект ([the, cow, '.'], L, группа_существительного),

L = [ '.'] % успех

|? - объект ([ the, cow, shakes, the, tail],

L, предложение).

L = [] % успех

Использование процедуры "объект" в обратном направлении

Все аргументы процедуры "объект" являются двунаправленными. Это означает, что при помощи запросов к процедуре "объект" можно также сгенерировать любые синтаксические объекты, какие только можно построить по входному списку лексем, или даже сгенерировать все возможные предложения по заданным словарю и грамматике.

% проанализировать входной список:

|? - объект ([the, tail], L, Объект). % (1)

L = [tail]

Объект = артикль;

L= []

Объект = группа_существительного ;

нет

% сгенерировать все предложения:

|?—объект (X, [], предложение). % (2)

Х= [the, cow, shakes, the, cow];

X = [the, cow, shakes, the, tail];

X = [the, cow, walks, the, cow];

X = [the, cow, walks, the, tail];

X = [the, fail, shakes, the, cow];

X = [the, tail, shakes, the, tail];

X = [the, tail, walks, the, cow] ;

X = [the, tail, walks, the, tail];

нет

Обратите внимание, что в запросе (2) второй аргумент [] указывает, что после окончания грамматического разбора должен остаться пустой список.

Предложения, сгенерированные программой разбора, синтаксически правильны, однако их семантическая корректность не гарантируется. Программа может вырабатывать бессмысленные предложения вроде « [the, cow, walks, the, tail]» (что можно перевести как "Корова идет по хвосту").

Что Вы ожидаете получить от запроса:

|? -объект (А, В, С).?

Расширение грамматики

Грамматику можно расширить многими способами. В частности, можно изменить определение группы существительного так, чтобы оно позволило размещать любое количество прилагательных между артиклем и существительным. Если в словарь системы добавить прилагательные, скажем, «big» и «strong», то расширенная версия программы "объект" сможет проводить грамматический разбор групп существительного типа « the big strong cow» (большая сильная корова).

Если один и тот же нетерминал будет определяться более чем одним грамматическим правилом, то система разбора будет действовать точно так же, как и интерпретатор языка Пролог: вначале она попытается выполнить грамматический разбор входного списка в соответствии с первым правилом; если ее постигнет неудача, то она перейдет к следующему правилу и т. д. Можно допустить наличие прилагательных в группе существительного, если определить одно правило для случая, когда прилагательные отсутствуют, другое правило — когда в группу существительного входит одно прилагательное, еще одно правило — для случая, когда имеются два прилагательных и т. д:

группа_существительного -> артикль существительное

группа_существительного -> артикль прилагательное существительное

группа_существительного -> артикль прилагательное

прилагательное существительное

Такой подход нерационален. Более выгодной стратегией будет определение промежуточного объекта, названного "прил", таким образом, чтобы он мог представлять любое количество прилагательных. Объект "прил" можно определить при помощи двух правил. Первое правило берет одно прилагательное из начала входного списка, а затем рекурсивно вызывает "прил" для поиска прилагательных в оставшейся части списка. Второе правило не берет из списка ни одного слова, устанавливая тем самым, что "прил" может не иметь в своем составе ни одного слова.

прил -> прилагательное прил (1)

прил -> (2)

Данное определение "прил" является праворекурсивным, так как в первом правиле рекурсивный вызов "прил" осуществляется из компоненты правила, расположенной в крайней правой позиции. Второе правило "прил" представляет собой пустую продукцию, так как оно не имеет компонент.

Теперь можно определить новую версию группы существительного, в которой используется "прил":

группа_существительного -> артикль прил существительное

Реализация расширенной грамматики

Расширенная грамматика реализована процедурой "объект2":

% нетерминалы:

объект2 (I, О, предложение): —

объект2 (I, R, группа_существительного),

объект2 (R, О, глагольная_группа).

объект2 (1, 0, глагольная_группа): -

объект2 (I, R. глагол),

объект2 (R, О, группа_существительного).

объект2 (1, 0, группа_существительного): -

объект2 (I, R, артикль),

объект2 (R. Р1, прил),

объект2 (R1, 0, существительное).

объект2 (I, О, прил): -

объект2 (I, R, прилагательное),

объект2 (R, О, прил).

объект2 (I, I, прил).

% терминалы:

объект2 ([big | R], R, прилагательное).

объект2 ([strong | R], R, прилагательное).

объект2 ([brown | R], R, прилагательное).

объект2 ([the | R], R, артикль).

объект2 ([cow | R], R, существительное).

объект2 ([tail | R], R, существительное).

объект2 ([shakes | R], R, глагол).

объект2 ([walks | R], R, глагол).

Обратите внимание, что вторая фраза "прил" всегда будет успешной, так как она не имеет условий. Эта фраза скопирует во второй аргумент любой список, заданный в качестве первого аргумента.

Программа "Объект2" может выполнить грамматический разбор предложения, в состав которого входит группа существительного с любым числом прилагательных:

|? - объект2 ([the, big, strong, brown, cow, shakes, the, big, tail ], L,

предложение).

L=[]

Что Вы ожидаете получить от запроса:

|? - объект2 (X, [], предложение).?

Если бы процедура "объект" предназначалась для выдачи корректных предложений, то как с этих позиций Вы оценили бы поведение последнего запроса? Приемлемо ли оно? Как можно было бы модифицировать программу, чтобы она более правильно генерировала предложения?

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие