Установка SWI-Prolog и первые шаги
Урок проведёт от установки SWI-Prolog до первого работающего запроса к собственной базе знаний.
SWI-Prolog — самая популярная свободная реализация Prolog с интерактивным интерпретатором, командой запуска
swiplи богатым набором встроенных средств.
Теория без практики быстро забывается, поэтому пора установить инструмент и потрогать язык руками. Мы выберем SWI-Prolog: он бесплатен, работает на всех основных ОС, хорошо документирован и активно развивается. После установки вы научитесь запускать интерпретатор, загружать файл с базой знаний и задавать запросы.
Установка на разные ОС
Команды ниже — для терминала, поэтому помечены как bash. Выберите свою систему.
Windows. Проще всего скачать установщик с официального сайта swi-prolog.org и пройти мастер установки. Либо через менеджер пакетов:
winget install SWI.SWI-Prolog
macOS. Удобнее всего через Homebrew:
brew install swi-prolog
Linux (Debian/Ubuntu). Через штатный менеджер пакетов:
sudo apt update
sudo apt install swi-prolog
Проверить, что всё встало, можно по версии:
swipl --version
Вывод:
SWI-Prolog version 9.2.0 for x86_64-linux
Конкретные цифры версии у вас будут свои — главное, что команда отработала и не выдала «command not found».
Запуск интерпретатора
Наберите в терминале swipl — откроется интерактивная сессия. Приглашение ?- означает, что система ждёт от вас запрос (вопрос). Это и есть та самая строка, в которой мы раньше писали вопросы вроде ?- dedushka(ivan, Kto).
swipl
Вывод:
Welcome to SWI-Prolog (version 9.2.0) ... ?-
Каждый запрос обязательно заканчивается точкой . и нажатием Enter. Забыли точку — система будет молча ждать продолжения. Это правило номер один для новичка.
Минимальная база знаний и её загрузка
Создайте текстовый файл family.pl (расширение .pl — стандарт для Prolog) со следующим содержимым:
% family.pl — простейшая база знаний
roditel(ivan, petr).
roditel(petr, maria).
dedushka(X, Z) :- roditel(X, Y), roditel(Y, Z).
Теперь загрузим файл в работающий интерпретатор. Это называется consult. Есть два равнозначных способа из приглашения ?-:
?- consult('family.pl').
или короткая форма со списочными скобками (имя без расширения):
?- [family].
Вывод:
true.
Ответ true. означает, что файл прочитан и факты с правилами загружены в память. Если в файле опечатка, система выведет предупреждение или ошибку с номером строки — читайте их внимательно.
Первые запросы
База загружена — можно спрашивать. Закрытый вопрос (ждём «да/нет»):
?- roditel(ivan, petr).
Вывод:
true.
Запрос с переменной (ждём подстановку). Переменные пишутся с заглавной буквы:
?- dedushka(ivan, Kto).
Вывод:
Kto = maria.
Если бы решений было несколько, после первого ответа система остановилась бы и ждала вашего знака: нажмёте ; (точку с запятой) — покажет следующее решение, нажмёте Enter — завершит поиск. Так движок вывода перебирает варианты под вашим контролем.
Как работает под капотом
Когда вы вводите ?- dedushka(ivan, Kto)., происходит цепочка: интерпретатор разбирает строку, находит в загруженной базе правило dedushka/2 (запись имя/арность означает «предикат dedushka с двумя аргументами»), унифицирует X = ivan, Z = Kto и начинает доказывать тело правила — подцели roditel(ivan, Y) и roditel(Y, Kto). Находит roditel(ivan, petr), фиксирует Y = petr, затем roditel(petr, maria), фиксирует Kto = maria и выводит результат. Сама база знаний при этом живёт в оперативной памяти процесса swipl — поэтому при перезапуске интерпретатора её нужно загрузить снова.
Завершение работы
Чтобы корректно выйти из интерпретатора, используйте предикат halt:
?- halt.
Это завершит сессию и вернёт вас в обычную командную строку. Альтернатива — сочетание Ctrl+D (конец ввода), но halt. нагляднее и однозначнее.
Частые ошибки
Забыть точку в конце запроса. Самая распространённая ловушка. Без завершающей . система думает, что вы ещё печатаете, и ничего не отвечает. Допишите точку и нажмите Enter.
Писать переменную с маленькой буквы. В Prolog имя с маленькой буквы — это атом (константа), а с большой — переменная. kto — это конкретное имя, Kto — «найди подходящее значение». Перепутаете регистр — получите неожиданный результат.
Не загрузить файл перед запросом. Если задать вопрос к предикату, которого нет в памяти, SWI-Prolog сообщит об ошибке «Unknown procedure». Сначала consult (или [file]), потом запросы.
Редактировать файл и ждать, что изменения подхватятся сами. После правки .pl нужно загрузить его заново той же командой [family]. — старая версия остаётся в памяти, пока вы не перезагрузите.
Итог
- SWI-Prolog ставится на Windows (winget/установщик), macOS (brew), Linux (apt); команда запуска —
swipl. - Приглашение
?-ждёт запрос; каждый запрос завершается точкой и Enter. - Загрузка базы знаний —
consult('file.pl').или короткая форма[file]. - Переменные — с заглавной буквы;
;показывает следующее решение, Enter завершает поиск. - Выход — предикат
halt.; база знаний живёт в памяти и теряется при перезапуске.