logo
TurboProlog / Документация / TOM_2

Грамматический разбор с помощью разделения списков

Программа разбора использует метод под названием "грамматический

разбор с помощью разделения списков".

Первыми двумя аргументами предикатов разбора являются входной список

и остаток от списка после отсечения части запроса. В последнем аргументе

программа разбора строит структуру запроса.

Программа разбора состоит из нескольких предикатов и предложений,

каждый из которых предназначен для обработки специальных способов при

анализе запроса. Для более подробного знакомства с работой программы раз-

бора смотрите комментарии и используйте режим трассировки, чтобы понять,

как производится грамматический разбор различных запросов.

Следующее предложение производит анализ запроса: Now large is the

town new york. Фильтр выделяет для программы разбора ["large", "town",

"new", "york"].

s_attr([BIG,ENAME/S1],S2,E1, /*First s_attrclause*/

g_eaec(E1,A,E2,X)):-

ent_name(E2,ENAME), /*Entity type town is a city.

Look up entity in the language

scheme*/

size(E2,BIG), /*Iook up city size is large*/

entitysize(E2,E1), /*Iook up city scale is

population*/

schema(E1,A,E2), /*Iook up scheme population of

city*/

get_ent(S1,S2,X),!. /*return an entity name and

guery*/

Программа разбора может также производить анализ более неопределен-

ного запроса - Now large is new york?

При таком запросе первое предложение для предиката s_attr не работа-

ет, т.к. оно ожидает типа объекта (такого, как town или state). Тогда

программа вызывает второе предложение для s_attr, приведенное ниже:

s_attr([BIG/S1],S2,E1,g_eaec(E1,A,E2,X)):-

get_ent(S1,S2,X),

size(E2,BIG),entitysize(E2,E1),

schema(E1,A,E2),ent(E2,X),!.

Используя это предложение, программа разбора определяет, что "new

york" - относится к "city", и что "large" - это количество жителей.

Как только программа разбора обработает запрос, Geobase вызывает

предложение "eval", которое определяет, какой должен быть выдан запрос к

базе данных. Действительное обращение к базе данных производится предика-

тами "db" и "ent".

"Eval" вызывается с запросом из программы разбора в первом аргументе

и возвращает значения во втором аргументе во время поиска с возвратом.

Если "eval" вызывается со следующей целью:

eval(g_eaec("city","in","state","california"),CITIES)

оно будет сопоставляться со следующим предложением:

eval(g_eaec(E1,A,E2,C),ANS):-db(E1,A,E2,C).

В оставшейся части программы Geobase реализован интерфейс с пользо-

вателем. "readkey" переводит коды символов, вводимых с клавиатуры, в сим-

волические ключи, а "menu" реализует меню. Пользователь имеет возможность

проверить и измерить язык с помощью интерфейса.