- •Глава 2 арифметика и структуры данных
- •2. 1. Арифметика
- •Арифметические выражения
- •Предикат "is"
- •Предикаты, выполняющие сравнение
- •Виды связи аргументов
- •2. 2. Структуры данных Типы термов
- •Примеры составных термов
- •Рекурсивные структуры
- •Процедура, которая строит рекурсивную структуру
- •2. 3. Списки Представление списков при помощи структуры "./2"
- •Другая форма представления списка, в которой употребляются квадратные скобки
- •Представление списков произвольной длины
- •Список произвольной длины при использовании формы записи с квадратными скобками
- •Унификация списков
- •Сравнение списков и простых структур
- •2. 4. Процедуры, выполняющие действия со списками Применение рекурсивных процедур для обработки списков
- •Выполнение запроса к процедуре "печатать—элементы"
- •Печать списка в обратном порядке
- •Форма записи аргументов в заголовке правила
- •Примеры процедур, предназначенных для обработки списков
- •2. 5. Способы представления базы данных Пять способов представления
- •1) Представление целостных информационных элементов в виде фактов
- •2) Представление атрибутов в виде фактов
- •3) Представление в виде списка структур
- •4) Представление в виде рекурсивной структуры
- •5) Представление в виде двоичного дерева
- •Сравнение разных видов представления базы данных
- •Библиографические заметки
- •Упражнения
Глава 2 арифметика и структуры данных
2. 1. Арифметика
Арифметические выражения
В языке Пролог имеется ряд встроенных предикатов, предназначенных для вычисления арифметических выражений. (Встроенный предикат - это процедура, входящая в систему программного обеспечения интерпретатора Пролога.) В Прологе арифметические выражения вычисляются только тогда, когда они служат аргументами одного из таких встроенных предикатов.
Арифметическое выражение состоит из целых чисел, например:
10 –3 2000
и из нижеследующего множества операций:
+ — * / mod.
За исключением унарной операции "минус", все операции языка Пролог являются инфиксными. У инфиксной операции - два аргумента, а обозначение операции записывается между этими аргументами без употребления скобок. В приводимом ниже списке Х и Y обозначают либо числа, либо другие арифметические выражения.
Арифметические операции
X+Y
X-Y
X*Y
-X
X/Y
X mod Y
Примечание; в некоторых версиях языка Пролог имеются также числа с плавающей точкой и арифметическая операция //, предназначенная для выполнения целочисленного деления (см. приложение IV).
Предикат "is"
В языке Пролог имеется встроенный предикат "is" (есть), являющийся также инфиксной операцией. Первым аргументом здесь служит неконкретизированная переменная или целое число, а вторым аргументом — арифметическое выражение, не содержащее неконкретизированных переменных. Предикат "is" унифицирует первый аргумент с результатом вычисления второго аргумента.
|? -Y is 10* 4.
Y=40
|? -40 is 10* 4.
да
|? -Xis50, YisX/2.
Х=50
У=25
|? - Х is 3, Y is (5* Х)/2.
X=3
Y =7;
нет
Предикат "is" является детерминированным
Последний пример показывает, что предикат "is" дает максимум один ответ. Предикат, вырабатывающий только один ответ, называется детерминированным.
Предикаты, выполняющие сравнение
Приводимые ниже предикаты предназначены для выполнения операции арифметического сравнения. У каждого из них в качестве аргументов должны выступать арифметические выражения. Эти аргументы вычисляются перед выполнением сравнения.
> больше
< меньше
> = больше или равно
= < меньше или равно
=:= равно
= \ = не равно
Данные предикаты можно употреблять таким образом:
|? - 12=<24.
да
|? -50=\=50.
нет
Виды связи аргументов
Считается, что аргумент, входящий в запрос, является для процедуры входным, если он представляет из себя атом или структуру. Аргумент считается выходным для процедуры, если он является переменной. Аргумент называется двунаправленным, если в запросе к процедуре его можно использовать или как входной, или как выходной. Все правила и факты, рассмотренные в гл. 1, являются целиком двунаправленными.
Однако встроенные предикаты, предназначенные для выполнения арифметического сравнения, не являются двунаправленными. В них каждый аргумент должен представлять из себя арифметическое выражение, в состав которого не входят неконкретизированные переменные. Если в качестве одного из аргументов этих предикатов будет задана неконкретизированная переменная, то интерпретатор выдаст сообщение об ошибке.