Установка 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.; база знаний живёт в памяти и теряется при перезапуске.
Проверьте себя
1. Чем обязательно должен заканчиваться запрос в интерпретаторе SWI-Prolog?
AТочкой с запятой ;
BТочкой . и нажатием Enter
CДвоеточием :
DНичем, достаточно Enter
2. Как загрузить файл family.pl в работающий интерпретатор?
Aimport family
Bload family.pl
Cconsult('family.pl'). или короткая форма [family].
Drun family
3. Как в Prolog различаются переменная и константа-атом по записи?
AПеременная пишется в кавычках, атом без
BПеременная — с заглавной буквы, атом (константа) — с маленькой
CНикак, регистр не важен
DПеременная начинается со знака $
4. Какой предикат корректно завершает сессию интерпретатора?
Aexit.
Bquit.
Chalt.
Dstop.