5. 4. Конвертер программ с dec-10 пролога на микро-пролог Синтаксис микро-Пролога

Микро-Пролог - это версия языка Пролог, имеющаяся на многих небольших компьютерах. Основу синтаксиса микро-Пролога составляет так называемое синтаксическое ядро, которое значительно отличается от употребляемого в настоящей книге синтаксиса DEC-10. Ниже приводится программа "d_to_m", преобразующая синтаксис DEC-10 в синтаксис ядра микро-Пролога и обратно. Автор преследовал несколько целей, включая данную программу-конвертер в книгу. Перечислим эти цели:

1) данная программа призвана проиллюстрировать то, как можно воспользоваться одной и той же Пролог-программой для перевода с одного языка на другой и обратно при условии, что оба языка обладают сходной структурой;

2) программа показывает взаимное соответствие между компонентами DEC-10 Пролога и микро-Пролога, что будет полезным для читателей, интересующихся обоими языками;

3) данная программа-конвертер может быть использована для перевода программ с одной версии языка Пролог на другую.

Компоненты микро-Пролога

Термы микро-Пролога — это переменные и константы. Структуры отсутствуют в микро-Прологе. Любое слово, начинающееся с букв X, Y, Z, х, у, z или с символа _, — это переменная. Наиболее важным синтаксическим объектом микро-Пролога является список, который записывается как помещенное в скобки множество термов, отделенных друг от друга пробелами (а не запятыми). В микро-Прологе имеется такое же обозначение конструктора списка (символ |), как и в DEC-10 Прологе (см. табл. 5. 1).

Выражение, представляющее отношение, в микро-Прологе записывается как список, первым элементом которого является имя прилагательное, а остальными элементами — аргументы (см. табл. 5. 2).

Таблица 5. 1

DEC-10

Списки микро-Пролог

[a, b, с]

[X | Y]

[один,два | R]

(а b с)

(X | Y)

(один два | _ R)

Таблица 5.2

DEC-10

Отношения микро-Пролог

отец (филип, чарльз)

(отец филип чарльз)

Таблица 5.3

DEC-10

Фразы микро-Пролог

знает (X, Y) :-

работает(X, Z),

работает (Y,Z).

((знает XY)

(работает Х Z)

(работает Y Z))

отец (филип, чарльз).

((отец филип чарльз))

Фраза записывается как список выражений, описывающих отношения, в котором первый элемент — это заголовок фразы, а остальные элементы составляют тело фразы. Факт — это список, содержащий только одно выражение, представляющее отношение (см. табл. 5. 3).

Должно быть ясно, что структуры обоих вариантов языка Пролог очень близки. Во многих случаях выражение, написанное на одной из версий языка, имеет точный аналог в другой версии. Наиболее важные различия между двумя рассматриваемыми версиями Пролога заключаются в отличиях встроенных предикатов. Для простоты программа "d_to_m" не принимает во внимание встроенные предикаты.

Реализация программы "d_to_m"

Программа "d_to_m" реализована как процедура нисходящего грамматического разбора. В отличие от процедуры "объект", процедура "d_to_m" имеет пять аргументов. Первый аргумент - это название терминала или нетерминала, определяемого фразой. Если программа переводит текст с синтаксиса DEC-10 на синтаксис микро-Пролога, то вторым аргументом служит входной список (выражение на DEC-10 Прологе), третьим аргументом будет то, что останется от входного списка после окончания разбора, а четвертым аргументом является выходной список (выражение на микро-Прологе). Если же программа преобразует текст, написанный на микро-Прологе, в текст на DEC-10 Прологе, то четвертый аргумент - это входной список (выражение на микро-Прологе), пятый аргумент - это то, что останется от входного списка, а второй аргумент будет содержать выходной список (выражение на DEC-10 Прологе).

% имена переменных:

% Id входное выражение на DEC-10 Прологе

% Im входное выражение на микро-Прологе

% Od, Rd, Rdl выходные выражения на DEC-10 Прологе

% Оm, Rm, Rml выходные выражения на микро-Прологе

%

% в комментариях представлено:

% нетерминал - > компоненты DEC-10 Пролога//компоненты микро-

% Пролога % терминалы:

% + ? ? ? ?

d_to_m (атом, [Слово | Od], Od, [Слово | Оm], Оm): -

atom (Слово).

d_to_m (перем, [ДСлово | Od], Od, [МСлово | Оm], Оm) :-

(nonvar (ДСлово), % направление: с DEC на МР

name (ДСлово, [С | Остаток]),

uppercase (С),

% поместить символ _ в начало ДСлово, чтобы получилась

% переменная микро-Пролога:

name (МСлово, [' _', С [ Остаток])

;

nonvar (МСлово), % направление: с МР на DEC

name (МСлово, [С ] Остаток]),

% сделать первую букву прописной, чтобы получилась

% переменная DEC-10 Пролога:

capitalize (С, ПропС),

name (ДСлово, [ПропС [Остаток])

).

% список -->[]//()

d_to_m (список, ['[',']'| Od] ,Od. ['(',')' | Om], Оm).

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

% список ——> [арг_ты] // (арг_ты)

d_to_m (список, I' [' | Id], Od, [' (' | Im], Оm) :-

d to_m (арг_ты. Id, ['] ' | Od], Im, [' )' | Om]).

% список ——> [арг_ты ] перем] // (арг_ты перем)

d_to _m (список, [' [' | Id], Od, ['(' | Im],0m):-

d_to_m (арг_ты. Id, [' | ' | Rd], Im, [' |' | Rm]),

d_to_m (перем, Rd, [']' | Od], Rm, [' )' | Om]).

% фраза -> отношение :- отношения . // (отношение отношения)

d_to_m (фраза. Id, Od, ['(' ] Im] ,Om):-

d_to_m (отношение, Id, [':— ' ! Rd1], Im, Rm1),

d_to_m (отношения, Rdl,['.'| Od], Rm1, [')' | Om]).

% фраза ——> отношение. // ( отношение )

d_to_m (Фраза, Id, Od, [' (' | Im], Om) :-

d_to_m (отношение, Id, ['.' | Od], Im, [')' | Om]).

% отношения ——> отношение, отношения // отношение отношения

d_to_m (отношения, Id, Od, Im, Om) :-

d_to_m (отношение, Id, [', ' | Rdl], Im, Rml),

d_to_ m (отношения, Rd1, Od, Rml, Om).

% отношения - —> отношение // отношение

d_to_m (отношения, Id, Od, Im, Om) :-

d_to_m (отношение. Id, Od, Im, Om).

% отношение ——> атом (арг_ты) // (атом арг_ты )

d_to_m (отношение, Id, Od, [' (' | Im], Om) :-

d to_m (атом. Id, [' (' | Rd1], Im, Rm1),

d_to_m (apг_ты,Rdl, [')' |Od],Rm1,['' |Om]).

% отношение - -> атом // ( атом )

d_to_m (отношение, Id, Od, [' (' | Im], Om):-

d_to_m (атом, Id, Od, Im, [')' | Om]).

% арг_ты --> аргумент, арг_ты // аргумент арг_ты

d_to_m (арг_ты, Id, Od, Im, Om) :-

d_to_m (аргумент, Id, [',' | Rd], Im, Rm),

d_to m (арг_ты, Rd, Od, Rm, Om).

% арг ты --> аргумент // аргумент

d_to_m (арг_ты, Id, Od, Im, Om) :-

d_to_m (аргумент, Id, Od, Im, Om).

% аргумент —> перем ; атом; список

d_to_m (аргумент. Id, Od, Im, Om) :-

d_to_m (перем, Id, Od, Im, Оm)

;

d_to_m (атом, Id, Od, Im, Om)

;

d_to_m (список, Id, Od, Im, Оm).

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