Лексический диапазон имени - одно предложение. Это значит, что если, например, имя Х15 встречается в двух предложениях, то оно обозначает две разные переменные. Однако внутри одного предложения каждое его появлений обозначает одну и ту же переменную. Для констант ситуация другая: один и тот же атом обозначает один и тот же объект в любом предложении, иначе говоря, - во всей программе.
2. 1. 3. Структуры
Структурные объекты (или просто структуры) - это объекты, которые
состоят из нескольких компонент. Эти компоненты,
в свою очередь, могут быть структурами. Например,
дату можно рассматривать как структуру,
состоящую из трех компонент: день, месяц, год.
Хотя они и составлены из нескольких компонент,
структуры в программе ведут себя как единые объекты. Для того, чтобы объединить
компоненты в структуру, требуется выбрать
дата( 1, май, 1983)
(см. рис. 2.2).
Все компоненты в данном примере являются константами (две компоненты - целые числа и одна - атом). Компоненты могут быть также переменными или структурами. Произвольный день в мае можно представить структурой:
дата( День, май, 1983)
Заметим, что День является переменной и ей можно приписать произвольное значение на некотором более позднем этапе вычислений.
Такой метод структурирования данных прост и эффективен. Это является одной из причин того, почему Пролог естественно использовать для решения задач обработки символьной информации.
Синтаксически все объекты данных в Прологе
представляют собой
май
и
дата( 1, май, 1983)
суть термы.
Все структурные объекты можно изображать в виде деревьев (пример см. на рис. 2.2). Корнем дерева служит функтор, ветвями, выходящими из него, - компоненты. Если некоторая компонента тоже является структурой, тогда ей соответствует поддерево в дереве, изображающем весь структурный объект.
Наш следующий пример показывает, как можно использовать структуры для представления геометрических объектов (см. рис. 2.3). Точка в двумерном пространстве определяется двумя координатами; отрезок определяется двумя точками, а треугольник можно задать тремя точками. Введем следующие функторы:
точка для точек
отрезок для отрезков и
треугольник для треугольников.
Рис. 2. 2. Дата - пример структурного объекта:
(а) его представление в виде дерева; (б) запись на Прологе.
Тогда объекты, приведенные на рис. 2.3, можно представить следующими прологовскими термами:
Р1 = точка( 1, 1)
P2 = точка( 2, 3)
S = отрезок( P1, P2) =
отрезок( точка( 1, 1), точка( 2, 3) )
Т = треугольник( точка( 4, 2), точка( 6, 4),
точка( 7, 1) )
Рис. 2. 3. Простые геометрические объекты.
Соответствующее представление этих объектов в виде деревьев приводится на рис. 2.4. Функтор, служащий
Рис. 2. 4. Представление объектов с рис. 2.3 в виде деревьев.
корнем дерева, называется
Если бы в такой же программе фигурировали точки трехмерного пространства, то можно было бы для их представления использовать другой функтор, скажем точка3:
точка3( X, Y, Z)
Можно, однако, воспользоваться одним и тем же именем точка одновременно и для точек двумерного и трехмерного пространств и написать, например, так:
точка( XI, Y1) и точка ( X, Y, Z)
Если одно и то же имя появляется в программе в двух различных смыслах, как в вышеупомянутом примере с точкой, то пролог-система будет различать их по числу аргументов и интерпретировать это имя как два функтора: один - двухаргументный; второй - трех. Это возможно потому, что каждый функтор определяется двумя параметрами:
(1) именем, синтаксис которого совпадает с синтаксисом атомов;
(2)
Как уже объяснялось, все структурные объекты в Прологе - это деревья, представленные в программе термами. Рассмотрим еще два примера, чтобы показать, насколько удобно сложные объекты данных представляются с помощью прологовских термов. На рис. 2.5 показана древовидная структура, соответствующая арифметическому выражению
В соответствии с введенным к настоящему моменту синтаксисом, такое выражение, используя символы *, + и - в качестве функторов, можно записать следующим образом:
*( +( а, в), -( с, 5) )
Рис. 2. 5. Древовидная структура, соответствующая арифметическому
выражению