Терм 1
Терм 2
Отождествимы ?
Джек (Х)
Джек (человек) да: Х = человек
Джек (личность) Джек (человек)
нет
Джек (Х, Х)
Джек (23, 23)
да: Х = 23
Джек (Х, Х)
Джек (12, 23)
нет
Джек ( . )
Джек(12, 23)
да
f(Y, Z)
Х
да: X = f(Y, Z)
Х
Z
да: X = Z
Заметим, что Пролог находит наиболее общий унификатор термов. В
последнем примере (табл.14.1) существует бесконечное число унификаторов:
X-1, Z-2; X-2, Z-2; ....
но Пролог находит наиболее общий:
Х=Z
.
Следует сказать, что в большинстве реализаций Пролога для
повышения
эффективности
его
работы
допускается
существование
циклических унификаторов. Например, попытка отождествить термы
f(X)
и
Х
приведет к циклическому унификатору
X=f(X)
, который определяет
бесконечный терм
f(f(f(f(f(...)))))
. В программе это иногда вызывает
бесконечный цикл.
Возможность отождествления двух термов проверяется с помощью
оператора
=
.
Ответом на запрос
?- 3+2=5.
будет
нет
127
так как термы не отождествимы (оператор не вычисляет значения своих
аргументов), но попытка доказать
?-строка(поз(Х)) -строка(поз(23)).
закончится успехом при
Х=23.
Унификация часто используется для доступа к подкомпонентам
термов. Так, в вышеприведенном примере
Х
конкретизируется первой
компонентой терма
поз(23)
, который в свою очередь является компонентой
терма строка.
Бывают случаи, когда надо проверить, идентичны ли два терма.
Выполнение оператора
= =
заканчивается успехом, если его аргументы —
идентичные термы. Следовательно, запрос
?-строка(поз(Х)) --строка(поз (23)).
дает ответ
нет
, поскольку подтерм
Х
в левой части (
X
— свободная
переменная) не идентичен подтерму
23
в правой части, Однако запрос
?- строка (поз (23)) --строка(поз (23)).
дает ответ
да.
Отрицания операторов
=
и
- =
записываются как
\= и \= =
соответственно.
14.6 Выражения
В этой
части показано, каким
образом Пролог
выполняет
арифметические операции. Будут описаны арифметические операторы и их
использование в выражениях, а также рассмотрены встроенные предикаты,
служащие для вычисления и сравнения арифметических выражений.
Язык Пролог не предназначен для программирования задач с большим
количеством
арифметических
операций.
Для
этого
используются
процедурные языки программирования. Однако в любую Пролог-систему
включаются все обычные арифметические операторы:
+
сложение,
—
вычитание,
*
умножение,
/
деление,
mod
остаток от деления целых чисел,
div
целочисленное деление.
В некоторых реализациях языка Пролог присутствует более широкий
набор встроенных арифметических операторов.
128
Диапазоны чисел, входящих в арифметические выражения, зависят от
реализации Пролога. Например, система ICLPROLOG оперирует целыми
числами со знаком в диапазоне: –8388606 ... 8388607.
Do'stlaringiz bilan baham: |