0 | черный | 8 | темно серый |
1 | синий | 9 | светло синий |
2 | зеленый | 10 | светло зеленый |
3 | голубой | 11 | светло голубой |
4 | коричневый | 12 | красный |
5 | фиолетовый | 13 | сиреневый |
6 | темно желтый | 14 | желтый |
7 | серый | 15 | белый |
Таблица 1. Таблица кодирования цвета в системе Пролог-Д.
В системе Пролог-Д предусмотрены следующие встроенные графические предикаты:
1. ТОЧКА.
Синтаксис: ТОЧКА(Арг1,Арг2,Арг3)
Встроенный предикат ТОЧКА имеет три аргумента. Ниже приведены результаты выполнения в зависимости от типа аргумента.
ТОЧКА(ц1,ц2,ц3) Установить точку с координатами (ц1,ц2) и цветом ц3;
ТОЧКА(ц1,ц2,П3) П3 := цвет_точки(ц1,ц2);
ТОЧКА(ц1,П2,ц3) Рисовать линию с начальной точкой (ц1,0), конечной - (ц1,211) цветом ц3;
ТОЧКА(П1,ц2,ц3) Рисовать линию с начальной точкой (0,ц2), конечной - (255,ц2) цветом ц3;
ТОЧКА(П1,П2,ц3) Заполнить экран цветом ц3. В этих пяти случаях предикат истинен, иначе - выполнение программы прекращается и выводится сообщение об ошибке: "Невыполнимый предикат ТОЧКА".
2. ЛИНИЯ.
Синтаксис: ЛИНИЯ(Арг1,Арг2,Арг3,Арг4,Арг5).
Этот встроенный предикат имеет пять аргументов. Пятый аргумент всегда должен быть целым, арифметическим выражением или переменной, конкретизированной целым. Результаты выполнения приведены ниже:
ЛИНИЯ(ц1,ц2,ц3,ц4,ц) Рисовать линию с начальной точкой (ц1,ц2), конечной - (ц3,ц4), цветом ц
ЛИНИЯ(ц1,ц2,ц3,П4,ц) Рисовать закрашенный треугольник с вершинами (ц1,ц2), (ц3,0), (ц3,211) и цветом ц;
ЛИНИЯ(ц1,ц2,П3,ц4,ц) Рисовать закрашенный треугольник с вершинами (ц1,ц2), (0,ц4), (255,ц4) и цветом ц;
ЛИНИЯ(ц1,П2,ц3,ц4,ц) Рисовать закрашенный треугольник с вершинами (ц1,0), (ц1,211), (ц3,ц4) и цветом ц;
ЛИНИЯ(П1,ц2,ц3,ц4,ц) Рисовать закрашенный треугольник с вершинами (0,ц2), (255,ц3), (ц3,ц4) и цветом ц;
ЛИНИЯ(П1,П2,ц3,ц4,ц) | ЛИНИЯ(ц1,ц2,П3,П4,ц) |
ЛИНИЯ(ц1,П2,П3,П4,ц) | ЛИНИЯ(П1,ц2,П3,П4,ц) - Заполнение экрана цветом ц
ЛИНИЯ(П1,П2,ц3,П4,ц) | ЛИНИЯ(П1,П2,П3,ц4,ц) |
ЛИНИЯ(П1,П2,П3,П4,ц) | ЛИНИЯ(ц1,П2,ц3,П4,ц) - Вертикальный, закрашенный цветом ц прямоугольник, с вершинами (ц1,0), (ц1,211), (ц2,0), (ц2,211);
ЛИНИЯ(П1,ц2,П3,ц4,ц) Горизонтальный закрашенный цветом ц прямоугольник с вершинами (0,ц2), (255,ц2), (0,ц4), (255,ц4);
ЛИНИЯ(ц1,П2,П3,ц4,ц) Четырехугольник цветом ц с вершинами (ц1,0), (ц1,211), (0,ц4), (255,ц4);
ЛИНИЯ(П1,ц2,ц3,П4,ц) Четырехугольник цветом ц с вершинами (0,ц2), (255,ц2), (ц3,0), (ц3,211).
В этих шестнадцати случаях предикат истинен, иначе выполнение программы прекращается и выдается сообщение об ошибке.
3. ОКРУЖНОСТЬ.
Синтаксис: ОКРУЖНОСТЬ(Арг1,Арг2,Арг3,Арг4).
Встроенный предикат ОКРУЖНОСТЬ имеет четыре аргумента. Четвертым аргументом всегда должно быть целое, арифметическое выражение или переменная, конкретизированная целым. Ниже приведены результаты выполнения в зависимости от типов аргументов.
ОКРУЖНОСТЬ(ц1,ц2,ц3,ц) Окружность с центром (ц1,ц2), радиусом ц3, цветом ц;
ОКРУЖНОСТЬ(ц1,ц2,П3,ц) | ОКРУЖНОСТЬ(ц1,П2,П3,ц) |
ОКРУЖНОСТЬ(П1,ц2,П3,ц) Заполнение экрана цветом ц
ОКРУЖНОСТЬ(П1,П2,П3,ц) | ОКРУЖНОСТЬ(П1,П2,ц3,ц) |
ОКРУЖНОСТЬ(ц1,П2,ц3,ц) Вертикальный закрашенный цветом ц прямоугольник с вершинами: (ц1-ц3,0), (ц1-ц3,211), (ц1+ц3,0), (ц1+ц3,211);
ОКРУЖНОСТЬ(П1,ц2,ц3,ц) Горизонтальный закрашенный цветом ц прямоугольник с вершинами: (0,ц2-ц3), (255,ц2-ц3), (0,ц2+ц3), (255,ц2+ц3); В этих восьми случаях предикат истинен, иначе выполнение программы прекращается и выводится сообщение об ошибке: "Невыполнимый предикат ОКРУЖНОСТЬ"
4. ЗАКРАСКА.
Синтаксис: ЗАКРАСКА(Арг1,Арг2,Арг3,Арг4).
Встроенный предикат ЗАКРАСКА имеет четыре аргумента. Процедурно этот предикат означает закрасить цветом Арг3 внутри контура с граничным цветом Арг4 начиная с точки (Арг1,Арг2). Предикат всегда истинен. Все аргументы должны быть целыми, арифметическими выражениями или переменными, конкретизированными целыми. Если это условие не выполняется, то выполнение программы прекращается и выводится сообщение об ошибке: "Невыполнимый предикат ЗАКРАСКА".
Пример: закрашенный квадрат
рамка(x1',y1',x2',y2',цвет')<-ЛИНИЯ(x1',y1',x1',y2',цвет');
ЛИНИЯ(x1',y1',x2',y1',цвет');ЛИНИЯ(x1',y2',x2',y2',цвет');
ЛИНИЯ(x2',y1',x2',y2',цвет');
пример <- рамка(50,50,150,150,8),ЗАКРАСКА(100,100,15,8);
?пример;.
В качестве примера приводится описание угла, вершина которого находится в точке (x,y):
угол(x,y)<-ЛИНИЯ(x,y,10,10,1),ЛИНИЯ(x,y,150,50,1);
?угол(100,100);.
Сначала будет нарисован отрезок, соединяющий точки (100,100) и (10,10), а затем отрезок, соединяющий точки (100,100) и (50,50). Если бы пятым аргументом предикатов ЛИНИЯ было бы число равное нулю, то точки отрезков были бы не видимы. Не обязательно, чтобы описание всей картинки было записано в одном предложении. Часть описания может быть выделена в виде отдельного предложения. Программу предыдущего примера можно модифицировать:
угол(x,y)<-ЛИНИЯ(x,y,10,10,1),продолжение(x,y);
продолжение(x,y)<-ЛИНИЯ(x,y,50,50,1); ?угол(100,100);.
Новая программа будет выполнять те же самые функции, хотя и записывается в два предложения. Система Пролог -Д допускает возможность использования переменных в графических примитивах. В качестве примера приводится описание вектора, выходящего из точки A с кoординатами (x, y) в точку B координатами (s,t):
вектор(A(x,y),B(s,t))<-ЛИНИЯ(x,y,s,t,1);
Необходимо отметить особенность графических объектов, описываемых с помощью переменных. В процессе работы системы может оказаться, что какая-то переменная в описании графического примитива не определена. В этом случае графический примитив все равно будет выполнен, однако переменная принимает все допустимые для нее значения. Иными словами на экране появится геометрическое место точек, задаваемое уравнением графического объекта.
В качестве примера приводится вопрос:
?ЛИНИЯ(0,0,x,0,1);.
В результате ответа на этот вопрос на экране появится треугольник белого цвета. В данном ситуации все просто. Причина появления белого треугольника в том, что величина абциссы второй точки не определена, в этом случае абцисса должна быть любым числом, в допустимых пределах. Как правило, область допустимых значений ограничена размерами экрана. Языковые средства Пролога-Д обеспечивают возможность наращивать определения, естественным путем поддерживают структурность описания объекта. В качестве примера приводится описание построения домика. Домик можно определить как треугольник и квадрат, совмещенные одной стороной. Квадрат можно определить посредством четырех отрезков формально это выглядит так:
квадр(x,y,z,t)<-ЛИНИЯ(x,y,x,t,1),ЛИНИЯ(x,y,z,y,1),
ЛИНИЯ(x,t,z,t,1), ЛИНИЯ(z,y,z,t,1);.
7. Обработка списков
На практике часто встречаются задачи, связанные с перечислением объектов. Для описания таких объектов используются списки. Например, список учеников первого класса: [Саша,Петя,Дима,Ксюша,Лена,Оля,Катя].
Элементами списка могут быть не только атомы, но и функции и, вообще, любые элементы, даже списки. Например, список, состоящий из функций - список остановок поезда с указанием времени стоянки:
[Челябинск(0),Миасс(2),Златоуст(5),Вязовая(5),Усть-Катав(2), Аша(2), Уфа(20),Абдулино(3),Самара(20),Сызрань(2),Инза(2),
Рузаевка(10), Потьма(2), Рязань(5), Москва(0)].
Примером списка, состоящего из списков, может служить прямоугольная таблица (матрица), представляющая собой список строк, каждая из которых список элементов в данной строке. Например, таблица: 23 45 56 2 78 89 66 45 56 12 3 75 2 3 6 5 2 1 56 2 5 8 9 22 23 22 33 5 6 9 1 33 может быть представлена следующим списком, состоящим из списков:
[[23,45,56,2,78,89,66,45],[56,12,3,75,2,3,6,5],
[2,1,56,2,5,8,9,22],[2,1,56,2,5,8,9,22],[23,22,33,5,6,9,1,33]].
Во всех примерах квадратные скобки означают, что данный объект представляет собой список. Список может быть определен двумя способами: перечислением элементов списка, то есть так, как это было сделано выше и определением головы и хвоста списка. Например, список [X|Y] определен именно таким путем. X - это голова списка, а Y - его хвост. Различные шаблоны определяют различное внутреннее представление.
Шаблону [x,y] соответствует внутреннее представление
СПИСОК
/ \
x СПИСОК
/ \
y [ ]
Шаблону [x|y] соответствует внутреннее представление:
СПИСОК
/ \
x y
Разные шаблоны - разные внутренние представления - обуславливают различия в унификации. Используя представление списка можно решить ряд задач.
Решение
Задача 1.1.2
1.1.2. Опишите на языке логики первого порядка свойства отношения равенство.
Задача 2.1.2
2.1.2. Опишите на языке Пролог-Д состав своей семьи.
Я опишу некоторую, придуманную мной семью, состоящую из мамы, папы, дедушки (отца мамы) и бабушки. Родственные отношения описываются предикатами МАМА, ПАПА, ДЕДУШКА, БАБУШКА.