Учебник Prolog для начинающих
Prolog — главный язык логического программирования: вы описываете, ЧТО истинно (факты и правила), а поиск ответа берёт на себя движок вывода. Этот курс глубоко проводит от декларативной парадигмы и установки SWI-Prolog через унификацию, бэктрекинг, рекурсию и списки к отсечению, отрицанию, динамике базы знаний, грамматикам DCG, головоломкам и программированию в ограничениях. Много примеров «семейные отношения» и классических головоломок учат думать в логической парадигме — иначе, чем в императивных и функциональных языках.
Курс «Prolog: логическое программирование» состоит из 8 разделов и 26 уроков: Логическая парадигма, Факты, правила и запросы, Переменные, унификация и термы, Бэктрекинг и рекурсия, Списки, Арифметика и управление поиском, Недетерминизм, головоломки и ограничения и DCG, парадигмы и применения. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Логическая парадигма
- Что такое логическое программирование
Логическое программирование как третья парадигма: вы описываете, ЧТО истинно, а не КАК вычислять. Связь с логикой предикатов и декларативностью.
- Декларативность: ЧТО против КАК
Декларативный против императивного: программист задаёт отношения и факты, а движок вывода сам ищет решение. Сравнение кода и роль механизма вывода.
- Что такое Prolog и где он применяется
История Prolog (Колмероэ, 1972, PROgrammation en LOGique), области применения: ИИ, экспертные системы, NLP, базы знаний, IBM Watson. Сильные и слабые стороны.
- Установка SWI-Prolog и первые шаги
Установка SWI-Prolog на Windows, macOS и Linux, запуск интерпретатора swipl, загрузка файла через consult, первые запросы в ?- и выход через halt.
- Что такое логическое программирование
2 Факты, правила и запросы
- Факты и база знаний
Что такое факт в Prolog, синтаксис parent(tom, bob), предикаты и аргументы, имена-атомы со строчной буквы и из чего собирается база знаний.
- Запросы: как Prolog отвечает
Запросы в Prolog: знак ?-, поиск факта в базе, ответ true/false, переменные в запросе и подстановки, перебор решений через точку с запятой.
- Правила и логический вывод
Правила Prolog: запись head :- body, оператор :- как «если», конъюнкция-запятая (И) и дизъюнкция ; (ИЛИ), вывод новых фактов на примере grandparent и sibling.
- Факты и база знаний
3 Переменные, унификация и термы
- Переменные и унификация
Переменные Prolog пишутся с большой буквы. Унификация — это сопоставление термов, а не присваивание. Операторы = и \=.
- Анонимная переменная и сопоставление
Анонимная переменная _ в Prolog означает «значение неважно». Каждое _ независимо. Паттерн-матчинг по структуре терма.
- Термы, функторы и арность
В Prolog всё — терм: атомы, числа, переменные, составные термы. Функтор и арность name/N, оператор =.. (univ), сравнение @<, ==, \==.
- Переменные и унификация
4 Бэктрекинг и рекурсия
- Бэктрекинг: поиск с возвратом
Как Prolog перебирает решения сверху вниз: точки выбора, откат при неудаче, точка с запятой для запроса всех ответов и дерево поиска.
- Рекурсия в Prolog: предки
Рекурсивное правило ancestor: предок — это родитель или родитель предка. Базовый и рекурсивный случай, ход вывода и опасность левой рекурсии.
- Пути в графе
Граф как факты edge/2, рекурсивный предикат path, проблема циклов и бесконечного поиска, накопление посещённых узлов в списке Visited.
- Бэктрекинг: поиск с возвратом
5 Списки
- Нотация списков [H|T]
Нотация списков в Prolog: пустой список, [1,2,3], голова и хвост [H|T], вложенная структура и сопоставление списков по образцу через унификацию.
- Рекурсивная обработка: member и length
Рекурсия над списками в Prolog: реализуем member/2 и length/2 сами через [H|T], считаем сумму sum_list, разбираем базу и шаг рекурсии и трассировку.
- append и обработка списков
Реализуем append/3 в Prolog сами, разбираем его обратимость и генерацию всех разбиений списка бэктрекингом, строим reverse и last через append.
- Нотация списков [H|T]
6 Арифметика и управление поиском
- Арифметика: оператор is
Почему оператор = в Prolog не вычисляет арифметику, как работает is и чем отличаются сравнения =:=, =\=, меньше, больше, =< и >=.
- Отсечение cut (!)
Отсечение ! в Prolog: как cut отбрасывает точки выбора, чем зелёное отсечение отличается от красного и в чём его опасности.
- Отрицание как неудача (\+)
Отрицание как неудача \+ в Prolog: замкнутость мира, отличие от логического отрицания, ловушка с переменными и связь с cut-fail.
- Динамика базы знаний: assert и retract
Динамические предикаты в Prolog: dynamic, assert/asserta/assertz и retract — накопление состояния, мемоизация и почему это «грязно».
- Арифметика: оператор is
7 Недетерминизм, головоломки и ограничения
- Сбор всех решений: findall, bagof, setof
Как собрать все решения цели Prolog в список: findall, bagof, setof и aggregate_all. Различия, ловушки пустого списка и сортировки с дедупликацией.
- Генерация и проверка (generate-and-test) и головоломки
Парадигма generate-and-test в Prolog: генерируй кандидата — проверяй ограничение. Зебра-загадка Эйнштейна и раскраска карты на permutation и member.
- Программирование в ограничениях CLP(FD)
Обзор CLP(FD) в Prolog: переменные над конечными доменами, ограничения #=, #\=, домен ins, all_different, labeling. Судоку и SEND+MORE=MONEY.
- Сбор всех решений: findall, bagof, setof
8 DCG, парадигмы и применения
- Грамматики DCG
Определённо-клаузальные грамматики DCG в Prolog: нотация стрелки, разбор токенов через phrase/2, разностные списки под капотом и генерация фраз.
- Prolog против императивного и функционального
Чем логическая парадигма Prolog отличается от императивной и функциональной: состояние против отношений, унификация, бэктрекинг и связь с Haskell.
- Применения Prolog в реальном мире
Где Prolog работает на практике: экспертные системы, базы знаний, IBM Watson, конфигураторы, верификация, NLP, планирование — и куда двигаться дальше.
- Грамматики DCG