Программирование на языке Пролог для искусственного интеллекта | страница 25
Наш следующий пример показывает, как можно использовать структуры для представления геометрических объектов (см. рис. 2.3). Точка в двумерном пространстве определяется двумя координатами; отрезок определяется двумя точками, а треугольник можно задать тремя точками. Введем следующие функторы:
>точка
для точек
>отрезок
для отрезков и
>треугольник
для треугольников.
Рис. 2.2. Дата — пример структурного объекта: (а) его представление в виде дерева; (б) запись на Прологе.
Тогда объекты, приведенные на рис. 2.3, можно представить следующими прологовскими термами:
>P1 = точка( 1, 1)
>P2 = точка( 2, 3)
>S = отрезок( P1, P2) =
> отрезок( точка( 1, 1), точка( 2, 3) )
>T = треугольник( точка( 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 показана древовидная структура, соответствующая арифметическому выражению
(a + b)*(c - 5)
В соответствии с введенным к настоящему моменту синтаксисом, такое выражение, используя символы >*
, >+
и >-
в качестве функторов, можно записать следующим образом:
>*( +( a, b), -( c, 5))
Рис. 2.5. Древовидная структура, соответствующая арифметическому выражению (a + b)*(c - 5).
Это, конечно, совершенно правильный прологовский терм, однако это не та форма, которую нам хотелось бы иметь, при записи арифметических выражений. Хотелось бы применять обычную инфиксную запись, принятую в математике. На самом деле Пролог допускает использование инфиксной нотации, при которой символы