Чтение онлайн

на главную - закладки

Жанры

Программирование на языке пролог
Шрифт:

Например, предикат найтидля работы со словарем, имеющим вид упорядоченного дерева (см. разд. 7.1), может быть заключен в такой модуль:

module dictionary.

export (найти / 3, печ_дерево / 3).

import (меньше / 2).

visible (таблица, подряд), body.

найти(Н, b(H,G,_,_), G):-!.

найти(Н, в(Н1,_,BEFORE,_),G):- меньше(Н,Н1)?найти(Н,ВЕFОRЕ,G).

найти(Н,в(Н1,,_,AFTER),G):- not(меньше(Н,Н1)), найти (H,AFTER,G).

печ_дерево(T,FORM,KEYWORD):- var(T),!.

печ_дерево(в(H,W,L,G),F,K):- печ_дерево(L,F,K), печ_элемент(Н,W,F,K), печ_дерево(G,F,K).

печ_элемент(Н,W,таблица,K):- !, outterm(H), outtab(15), outterm(K),outspaces(l), outterm(W), newline.

печ_элемент(Н,W,подряд,K):- outterm(H), outspaces(l), outterm(K), outspaces(1), outterm(W), outterm(",").

end mod /* dictionary */.

Этот модуль «экспортирует» (т. е. делает доступным для других модулей) предикаты найти/3и печ_дерево/3,и только эти предикаты данного модуля могут быть использованы вне его. Предикат печ_деревоможет выводить на печать заданное дерево в двух возможных форматах в соответствии с аргументом FORM,который может иметь значения таблицаи подряд.Эти два имени описаны как видимые, что указывает на то, что они используются не только внутри данного модуля например, как конструктор в-структур. Видимость имени не обязательно обозначает сохранение его символьного представления в другом модуле, однако, если оно используется в другом модуле как видимое имя, то эти два вхождения унифицируются.

Заметим, что конкретное представление дерева скрыто в данном модуле.

Рассмотрим еще один модуль, использующий определенные выше предикаты. Предположим, что у нас есть список лошадей, участвующих в бегах, в порядке их финиширования, а нам нужно получить алфавитный перечень их кличек с указанием занятого места. Для этого можно воспользоваться предикатом печ_ индекс,который по списку кличек порождает дерево, а затем выводит его на печать.

module index.

export(печ_индекс/0).

import(найти/3, список_кличек/1, печ_дерево/3).

visible(таблица).

body.

печ_индекс:- список_кличек(L),созд_дерево(L, 1, Т, печ_дерево(Т,таблица,": ").

созд_дерево([],_,_):- !.

созд_дерево([NАМЕ|L,N,Т):- найти(NAME,T,N), M is N+1, созд_дерево(L,М,T).

endmod /* index */.

Здесь снова имя таблица задано как видимое, тогда как параметр KEYWORDпредиката печ_дерево(здесь он имеет значение ".") заключен в двойные кавычки. Это означает, что символьное представление этого имени должно быть сохранено.

Компоненты системы МПролог

Ядром системы МПролог является интерпретатор. Другой основной компонентой системы является подсистема разработки программ PDSS,которая сама написана на МПрологе и работает под управлением интерпретатора. Подсистема PDSSобеспечивает возможности диалоговой разработки программ.

После того как фаза разработки программ закончена, можно воспользоваться тремя другими компонентами системы, обеспечивающими эффективность выполнения программы.

Претранслятор системы МПролог преобразует МПролог-модули во внутреннее представление, допускающее эффективное выполнение. Он обрабатывает элементы программы, осуществляя их оптимизацию, управляемую пользователем. Например, использование описаний вида match_orderи modeпозволяет значительно повысить эффективность поиска утверждений.

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

Третьей из указанных выше компонент системы является компилятор, который преобразует двоичные модули (порождаемые претранслятором), заменяя представление программы, необходимое для интерпретатора, на непосредственно исполняемый машинный код. Система МПролог допускает объединение в готовую программу интерпретируемых и откомпилированных модулей.

Различные ограничения

Целые числа могут изменяться в диапазоне от -8 388 607 до 8 388 607. Действительные числа не предусмотрены. Приоритеты операторов могут изменяться от -3000 до 3000.

Дополнительные встроенные предикаты

В МПрологе предусмотрены некоторые дополнительные встроенные предикаты. Например, допускающие повторное согласование при возвратном ходе предикаты ввода, разнообразные предикаты вывода, работы со строками, с базой данных, а также предикаты обработки особых ситуаций.

Два основных предиката ввода insymb(X)и interm(X)допускают повторное согласование при возврате. Это означает, что при возвратном ходе выполненные ими действия «отменяются». Например, если первый вводимый символ не совпадает с аааа, то вопрос

? insymb(aaaa).

не согласуется, причем в этом случае аааасохраняется во входном потоке и может быть считан последующими предикатами ввода [21] .

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

предложение:- группа_существительного, группа_глагола.

21

Здесь допущена неточность: во входном потоке при возвратном ходе сохраняется не аааа, а то, что прочитано из него до возврата.
– Прим. ред.

группа_существительного:- определитель, существительное.

группа_глагола:- глагол.

группа_глагола:- глагол, группа_существительного.

определитель:- insymb(the).

существительное:- insymb(man).

существительное:- insymb(apple).

глагол:- insymb(eats).

глагол:- insymb(sings).

Приведенный выше предикат предложениезавершается успешно, если из входного потока поступает предложение, удовлетворяющее заданной грамматике. Заметим, что обработка синтаксических ошибок и команда '=' реализуются на основе предикатов ввода, допускающих повторное согласование при возврате. Предикаты для работы с базой данных в МПрологе также имеют версии, допускающие повторное согласование. Например,

Поделиться:
Популярные книги

Романов. Том 1 и Том 2

Кощеев Владимир
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
Романов. Том 1 и Том 2

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Дважды одаренный

Хозяин Теней 6

Петров Максим Николаевич
6. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 6

Эволюционер из трущоб. Том 6

Панарин Антон
6. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 6

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Стёртые буквы

Первушина Елена Владимировна
Фантастика:
фэнтези
6.25
рейтинг книги
Стёртые буквы

Изгой Проклятого Клана. Том 6

Пламенев Владимир
6. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 6

Моя (не) на одну ночь. Бесконтрактная любовь

Тоцка Тала
4. Шикарные Аверины
Любовные романы:
современные любовные романы
7.70
рейтинг книги
Моя (не) на одну ночь. Бесконтрактная любовь

Скрытые чувства

Эльденберт Марина
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Скрытые чувства

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Принадлежать им

Зайцева Мария
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Принадлежать им

Лекарь Империи 8

Лиманский Александр
8. Лекарь Империи
Фантастика:
попаданцы
городское фэнтези
аниме
5.00
рейтинг книги
Лекарь Империи 8

Воин

Бубела Олег Николаевич
2. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.25
рейтинг книги
Воин