- •Первое знакомство Объекты и отношения
- •Запросы
- •Переменные
- •Конъюнкция
- •Правила
- •Более подробно Термы
- •Операторы
- •Эквивалентность и унификация
- •Арифметика
- •Выполнение целей (повторение)
- •Структуры и деревья
- •Обработка списков
- •Отсечение
- •Разное Ввод-вывод
- •Управление порядком вычислений
- •Динамическое создание и анализ структур
- •Пролог как база данных
- •Работа с файлами
Эквивалентность и унификация
Бинарный предикат = является встроенным. Цель =(X, Y) (или X = Y) удовлетворяется, если X можно унифицировать с Y. Правила унификации:
-
если X — несвязанная переменная, а Y — атом или структура (или связанная переменная), то X унифицируется с Y, путем связывая X с Y. Аналогично, если Y — несвязанная переменная, то…;
?- X = mary.
X = mary.
?- mary = X.
X = mary.
?- X = likes(john, mary).
X = likes(john, mary).
?- X = likes(john, _).
X = likes(john, _G538).
?- X = 10.
X = 10.
?- X = 10+20.
X = 10+20.
-
если как X, так и Y — несвязанные переменные, то X унифицируется с Y, путем связывания переменных друг с другом. Если одна переменная связана с другой и, если одна из них далее связывается с каким-либо термом, то с термом связывается и другая переменная;
?- X = Y.
X = Y.
-
атомы или числа унифицируются только сами с собой;
?- mary = mary.
true.
?- mary = john.
false.
?- X = mary, X = john.
false.
?- X = mary, Y = john, X = Y.
false.
?- X = Y, X = john, Y = mary.
false.
?- 10 = 10.
true.
?- 10 = 3 + 7.
false.
-
две структуры унифицируются друг с другом, если у них одинаковый функтор и одинаковое количество компонентов и если соответствующие компоненты этих структур этих структур унифицируются между собой.
?- likes(mary, john) = likes(mary, john).
true.
?- likes(mary, john) = likes(john, mary).
false.
?- likes(X, john) = likes(mary, john).
X = mary.
?- likes(X, john) = likes(mary, Y).
X = mary, Y = john.
?- likes(X, john) = likes(Y, Z).
X = Y, Z = john.
?- beliefs(X, Y) = beliefs(alice, likes(john, mary)).
X = alice, Y = likes(john, mary).
?- knows(jane, X) = knows(jane, beliefs(jane, X)).
X = beliefs(jane, X).
?- J = john, M = mary, A = alice, L = likes(J, M), B = beliefs(A, L).
J = john, M = mary, A = alice, L = likes(john, mary), B = beliefs(alice, likes(john, mary)).
?- X = knows(jane, X), X = knows(_, knows(_, knows(_, Y))).
X = Y, Y = knows(jane, Y).
?- 3 + 7 = 3 + 7.
true.
X = 3 + 7, Y + Z = X.
X = 3 + 7, Y = 3, Z = 7.
Арифметика
Для вычисления числового значения выражения используется предикат встроенный бинарный is. Выражение (заданное структурой) должно быть вторым аргументов, а его значение — первый. Второй аргумент не может быть несвязанной переменной. Примеры:
?- 10 is 3 + 7.
true.
?- X is 3 + 7.
X = 10.
?- 3 + 7 is X.
ERROR: is/2: Arguments are not sufficiently instantiated
?- Y = 3 + 7, X is Y.
Y = 3+7, X = 10.
Предикат is поддерживает основные математические операции и функции. Пример:
?- X is 20 * 7.
X = 140.
?- X is (10 * 7) - (5 * 6).
X = 40.
?- X is 20 / 7.
X = 2.857142857142857.
?- X is 20 // 7.
X = 2.
?- X is 20 mod 7.
X = 6.
?- X is sin(pi / 6).
X = 0.49999999999999994.
?- 1 is 2 * 0.5.
false.
?- 1.0 is 2 * 0.5.
true.
Для сравнения чисел можно использовать следующие встроенные бинарные предикаты =:= (равно), =\= (не равно), < (меньше), > (больше), =< (больше либо равно) и >= (меньше либо равно). Оба аргумента должны быть выражениями (и ни один из аргументов не должен быть несвязанной переменной). Примеры:
?- 7 + 3 =:= 2 + 8.
true.
?- 1 =:= 0.5 + 0.5.
true.
?- X = 10, Y = 5, X < 3 * Y.
X = 10,
Y = 5.