- •1.1 Пример программы: родственные отношения.
 - •1.2 Факты.
 - •1.3 Вопросы.
 - •1.4 Переменные.
 - •1.5 Конъюнкция целей.
 - •1.6 Правила.
 - •1.7 Конъюнкция в правилах.
 - •1.8 Переменные в теле правила.
 - •1.9 Cтруктура пролог-программы.
 - •2.1 Синтаксис пролога.
 - •2.1.1 Константы.
 - •2.1.2 Переменные.
 - •2.1.3 Структуры.
 - •2.1.4 Операторы - тоже функторы.
 - •2.2 Арифметика.
 - •2.3 Операции сравнения.
 - •2.4 Сопоставление.
 - •2.6 Примеры сопоставления структур.
 - •3.1 Декларативная семантика Пролог-программ
 - •3.2 Дизъюнкция целей
 - •3.3 Процедурная семантика
 - •3.3.1 Пример вычисления
 - •3.3.2 Формальное описание процедуры вычисления целей.
 - •3.4 Соотношение между процедурным и декларативным смыслом
 - •4.1 Списки
 - •4.1.1 Представление списка диаграммой.
 - •4.1.2 Выделение головы и хвоста списка
 - •4.1.3 Шаблоны списков.
 - •4.1.4 Определения отношений через cons форму списка
 - •4.1.4 Определения отношений через cons форму списка
 - •4.2 Процедуры обработки списков
 - •4.2.3 Применение append
 - •4.2.5 Длина списка
 - •4.3 Встроенные предикаты
 - •4.3.1 Простые встроенные предикаты ввода-вывода.
 - •4.3.2 Процедурный смысл встроенных предикатов ввода-вывода.
 - •4.4 Ввод-вывод списков.
 - •4.4.1 Ввод-вывод списка как терма.
 - •4.4.2 Поэлементный ввод-вывод списка.
 - •5.1 Отсечение.
 - •5.1.1 Графическая иллюстрация действия cut.
 - •5.1.2 Пример действия cut.
 - •5.1.3 Применение cut при выборе альтернатив.
 - •5.1.4 Формальное описание действия отсечения.
 - •5.2 Применение отсечения.
 - •5.2.2 Добавление элемента без дублирования.
 - •5.2.3 Классификация.
 - •5.2.4 Отсечение в численной рекурсии.
 - •5.2.5 Замечания при использовании отсечения.
 - •5.3 Сортировка списков.
 - •5.3.1 Метод наивной сортировки.
 - •5.3.2 Метод пузырька.
 - •5.3.3 Mетод вставки.
 - •5.3.4 Быстрая сортировка quick.
 - •6.1 Отрицание как неудача. (not as failure)
 - •6.2 Алгоритм поиска на Прологе. ( Логический подход к задаче о фермере, волке, козе и капусте.)
 - •6.3 Чтение и запись информации с файлов.
 - •6.3.1 Обработка входных потоков.
 - •6.3.2 Обработка выходных потоков.
 - •6.4 Обработка символов.
 - •7.1 Встроенные предикаты
 - •7.1.2 Проверка типа терма
 - •7.2 Метапредикаты.(Встроенные предикаты обработки термов.)
 - •7.2.1 Создание и декомпозиция термов.
 - •7.2.2 Предикаты работы с базой данных
 - •7.3 Поиск в лабиринте
 - •7.4 Сравнительная характеристика языков программирования.
 - •8.1. Операции (Операторы).
 - •8.1.1 Приоритет оператора.
 - •8.1.2. Тип оператора.
 - •8.1.3 Объявление операций.
 - •8.2. Поиск.
 - •8.2. Поиск.
 - •8.2.1 Поиск в Прологе.
 - •8.2.2 Поиск в глубину.
 - •8.2.3 Поиск в ширину.
 - •8.2.4 Резюме Поиска.
 - •9.1. Введение
 - •9.2 Поиск с предпрочтением.
 - •10.1. Постановка задачи
 - •10.2. Пример грамматики
 - •10.3. Пример разбора вручную.
 - •10.4. Реализация грамматического разбора на Прологе.
 - •Как должны выглядеть утверждения Пролога ?
 - •Запоминание состояния в Прологе.
 - •Аналогично для dcg проводится
 - •11.1. Постановка задачи
 - •Две емкости
 - •11.2. Решение задачи
 - •12.1. Постановка задачи
 - •12.2. Решение
 - •13.1. Введение
 - •Метод "образовать и проверить"
 - •13.2. Раскрашивание плоской карты
 
8.1. Операции (Операторы).
Как вы помните для некоторых структур, имеющих размерность /2, функтор может быть записан между компонентами. Например +(1,2)
можно записать как
1 + 2 .
При этом структуру легче воспринимать в программе и водить.
Пролог предоставляет возможность использовать наряду с встроенными операторами и дополнительные операторы для структур с арностью /2 и /1.
Для этого достаточно объявить эту структуру оператором используя встроенный предикат op/3.
op(Приоритет,Тип,Имя).
Имя оператора - любой атом.
8.1.1 Приоритет оператора.
Приоритет оператора задает порядок выполнения операций в выражениях, содержащих более одного оператора.
Приоритет задается приоритетным номером - числом обычно в диапазоне 1-1500 (в нашем случае до 1200).
Вычисления начинаются с оператора имеющего наименьший номер и заканчиваются наибольшим номером.
Например, в выражении x + y * 2 приоритет * больше + и вычисления производятся как x + (y * 2). Приоритетный номер скобки равен нулю.(Самый высокий приоритет)
Поэтому скобки могут использоваться для изменения ассоциативности.
8.1.2. Тип оператора.
Тип задает позицию и ассоциативность оператора.
Позиция оператора указывает, где он записывается по отношению к своим аргументам.
Для арности 2 оператор может быть только инфиксным и располагать между аргументами.
Например 2 > 1 или Р;Q
Для арности 1 оператор может быть
префиксным - записываться перед единственным аргументом : not a или -1
постфиксным - записываться после единственного аргумента : 5! или
Ассоциативность оператора показывает, какая операция выполняется первой в выражении, содержащем два или более оператора с одинаковым приоритетом.
Тип может принимать одно из следующих значений
xfx xfy yfx для инфиксных операций
fy fx для префиксных операций
xf yf для постфиксных операций
Здесь
fff - функтор,
x - выражение
y - выражение
Для простоты следует запомнить что yfx имеет левую ассоциативность.
Например + определен как op( 500, yfx, +). + обладает левой ассоциативностью. Т.е. A + B + C + D выполняется как +(+(+(A,B),C),D) Представляется как дерево растущее в низ и налево:
Наоборот xfy имеет правую ассоциативность.
Т.е. A , B , C , D выполняется как ,(A, ,(B, ,(C,D))) Представляется как дерево растущее в низ и направо:
8.1.3 Объявление операций.
Если объявляется 2 или 1 арная процедура то для удобства использования
с т.з. читабильности программы ее можно объявить как операцию.
(Для SWI-prolog op включается в программу как цель, а не как факт). Например
:-op(1500,xfx, love).
bob love mary.
pam love sam.
?- bob love Y.
Y = mary.
Еще один пример
?- X=join(a,b),write(X),nl,op(500,yfx,join),
write(X).
Дает join(a, b)
a join b
X = a join b
xyx - инфиксная операция, не обладающая свойством ассоциативности
Примером может служить операция mod.
Поэтому
?- X is 120 mod 50 mod 5
является недопустимой.
Встроенные операторы для SWI-prolog представлены в таблице.
(Все операторы могут быть переопределены пользователями)
1200 fx :-, ?-
1150 fx dynamic , multifile, module_transparent, discontiguous, volatile, initialization
xfy ;, |
1050 xf
1000 xfy ,
954 xfy \\
900 fy \+, not
900 fx ~
700 xfx <, =, =.., =@=, =:=, =<, ==, =\=, >, >=, @<, @=<,
@>, @>=, \=, \==, is
600 xfy :
500 yfx +, -, /\, \/, xor
500 fx +, -, ?, \
400 yfx *, /, //, <<, >>, mod, rem
200 xfx **
200 xfy ^
