Как запустить turbo prolog на windows 10

Обновлено: 06.07.2024

Программа, работу с которой мы сейчас начинаем, имеет целью дать необходимые навыки в использовании меню системы и основных команд редактора. Программа называется WELCOME.PRO. Действия, которые следует предпринять, чтобы создать эту программу, не зависят от того, работаете ли вы на машине с винчестерским диском, или на машине с двумя дисководами для гибких дисков.

Перейдите при помощи стрелки к команде главного меню Edit и нажмите клавишу Enter (либо просто введите латинскую букву E).При этом в левом верхнем углу окна Editor появится мерцающая черточка — курсор редактора. Теперь редактор Турбо-Пролога готов принять вводимый вами с клавиатуры текст.

Набейте текст программы WELCOME.PRO:

write("Welcome to Turbo Prolog!"), nl.

Когда вы доходите до конца очередной строки, нажимайте клавишу Enter для перехода на следующую. Для удаления неверного символа нужно прибегнуть к помощи клавиши BackSpace. После ввода программы экран компьютера должен выглядеть так, как это показано на рис. 1.3. Не нужно, конечно, добиваться точного совпадения картинок, в частности, количества пробелов в каждой строке. Выравнивание строк в Турбо-Прологе, так же как и в других языках, преследует цель придания программе несколько большей наглядности и не влияет на ее выполнение.

Турбо-Пролог позволяет адресовать результат трансляции либо на диск, либо в оперативную память. При задании Run программа транслируется в оперативную память. Транслировать программу на диск пока вы лишь учитесь работать на Турбо-Прологе, нет необходимости. Но в дальнейшем вы можете создавать и объектные файлы для совместного редактирования с другими объектыми модулями, и выполнимые файлы, которые можно запускать на счет вне среды Турбо-Пролога. В этом вам поможет материал приложения В настоящей книги.

Как вы, вероятно, заметили, Турбо-Пролог транслирут столь малую программу очень и очень быстро, за какие-то доли секунды.

Упражнение 1.1.

Запустите на счет программу WELCOME пару раз подряд и попрактикуйтесь переходить от одной команды к другой, пока не почувствуете себя в этом деле достаточно уверенно.

Теперь можно окончить сеанс работы с Турбо-Прологом, если вы этого хотите, конечно. Если в рабочий файл были внесены хоть какие-то изменения, система спросит, нужно ли записывать на диск новый исправленный вариант файла. Для обозначения положительного ответа необходимо нажать клавишу Y. Если команда Quit была задана случайно, ее можно отменить при помощи Esc.

Сохранение программного файла

Для того, чтобы записать на диск программу и таким образом сохранить ее, необходимо выйти из редактора (если вы находитесь в режиме редактирования), нажав клавишу Esc, а затем выбрать команду Files и подкоманду Save во вновь появившемся меню (либо нажав S, либо используя стрелки и клавишу Enter). В результате этих действий на экране возникнет небольшое окно, в котором будет высвечено либо заданное по умолчанию имя файла (как, например, WORK.PRO), либо то имя, которое вы присвоили файлу сами (смотри рис. 1.5). Имя файла можно оставить без изменений, а можно и отредактировать. В нашем случае следует ввести имя WELCOME.PRO, а затем нажать Enter.

Если на диске уже есть файл с указанным именем (более ранняя версия редактируемой программы или какая-либо иная программа), то в результате операции записи на диск расширение имени этого файла будет сменено на .BAK, чтобы пометить старый вариант файла. Не забывайте сохранять отредактированный файл перед тем, как окончить сеанс работы с Турбо-Прологом. В противном случае модифицированный вариант программы будет утерян.

Достаточно частое сохранение рабочего файла на диск очень полезно. В случае отказа электропитания, или программного сбоя компьютера вы всегда будете иметь достаточно "свежий" вариант программы. Некоторые программисты записывают очередные версии программы под разными именами. Генерация таких многочисленных "поколений" программных файлов может также быть полезной, так как позволяет проследить все этапы развития программы.

Turbo Prolog (Турбо-Пролог) является самым замечательным языком искусственного интеллекта (ИИ). Turbo Prolog (Турбо-Пролог) является компиляторно-ориентированным языком программирования высокого уровня. Turbo Prolog (Турбо-Пролог) разработан фирмой Borland International и предназначен для программирования задач из области искусственного интеллекта.

Как язык программирования искусственного интеллекта Turbo Prolog (Турбо-Пролог) особенно хорош для создания экспертных систем, динамических баз данных, программ с применением естественноязыковых конструкций. Turbo Prolog (Турбо-Пролог) также может быть использован и для других задач общего характера.

Turbo Prolog (Турбо-Пролог) имеет окна, цветную графику и интерактивные средства ввода-вывода, что свидетельствует о его максимальном удобстве для пользователя прикладных программ.

Встроенные предикаты Turbo Prolog (Турбо-Пролог) и другие дополнительные возможности делают его пригодным для решения многих стандартных задач из сферы бизнеса, включая бухгалтерский учет, расчет зарплаты и представление графиков.

Наряду с Turbo Prolog (Турбо-Пролог) в США созданы еще несколько реализаций Пролога: Arity Prolog, Prolog II, Wisdom Prolog и Micro Prolog. В отличие от них Turbo Prolog (Турбо-Пролог) имеет великолепный полноэкранный редактор, множество рабочих окон и интерактивный диалоговый отладчик. Turbo Prolog (Турбо-Пролог) поддерживает цветную графику IBM PC, снабженного цветным графическим адаптером (CGA) и расширенным графическим адаптером (EGA). Предикаты графики и система с графическим экранным пером являются составной частью Turbo Prolog (Турбо-Пролог). Turbo Prolog (Турбо-Пролог) также снабжен средствами работы с последовательными файлами, файлами прямого доступа и двоичными файлами.

Написанные на Turbo Prolog (Турбо-Пролог) программы компилируются, в отличие от других версий Пролога, где программа интерпретируется.

Интерпретатор выбирает предложения программы одно за другим и последовательно исполняет их.

Компилятор транслирует в машинные коды сразу весь текст программы.

Turbo Prolog (Турбо-Пролог) транслирует исходный текст программы особенно быстро (быстрее всех других версий Пролога для компьютеров IBM PC). Также Turbo Prolog (Турбо-Пролог) позволяет легко создавать отдельные выполнимые файлы.

Turbo Prolog (Турбо-Пролог) имеет прекрасный пользовательский интерфейс для отладки программ.

Отличия Turbo Prolog (Турбо-Пролог) от C&M Prolog

Turbo Prolog (Турбо-Пролог) имеет несколько отличий. В Turbo Prolog (Турбо-Пролог) отсутствуют некоторые элементы C&M Prolog, но такие, которые встречаются только в очень сложных программах.

Самым существенным отличием от упомянутого стандарта (как и от других версий языка) является наличие в Turbo Prolog (Турбо-Пролог) строгой типизации элементов данных.

Сделанные отступления от неофициального стандарта позволили значительно увеличить скорость трансляции и счета программ. И хотя некоторые программисты возражают против этих отступлений, говоря что Turbo Prolog (Турбо-Пролог) не есть Пролог «в чистом виде», однако именно в таком виде язык имеет массу преимуществ, например наличие графики и возможность работы с окнами. Этих средств нет в других реализациях. Независимо от того, является ли Turbo Prolog (Турбо-Пролог) «чистым» Прологом или нет, он тем не менее является очень современным, полноценным и гибким языком программирования.

Файлы и папки Turbo Prolog (Турбо-Пролог)

PROLOG.OVL - оверлейный файл, используемый системой при запуске, при создании .EXE файлов и при выполнении некоторых других функций. PROLOG.SYS - файл, содержащий информацию о цвете, расположении окон системы, также как и информацию об использумых системой директориях. PROLOG.HLP - файл с текстом применяемых в системе подсказок (обращение к нему осуществляется при помощи функциональной клавиши F1). GEOBASE.PRO и GEOBASE.INC - демонстрационная программа базы данных по географии США GeoBASE. PROLOG.LIB и INIT.OBJ - файлы, используемые системой Турбо-Пролог при создании выполнимых файлов. EXAMPLES - директория, содержащая программы, используемые в разделе обучения Руководства пользователя. ANSWERS - директория, содержащая ответы на упражнения из Руководства. PROGRAMS - директория, содержащая демонстрационные программы.

Запуск Turbo Prolog (Турбо-Пролог)

Перейдите в директорию Turbo Prolog (Турбо-Пролог) C:\PROLOG и запустите файл PROLOG.EXE.

Начальная заставка информирует о годе выпуска и номере используемой версии системы.

Главное меню системы Turbo Prolog (Турбо-Пролог)

Главное меню Turbo Prolog (Турбо-Пролог) высвечивает 6 доступных пользователю опций (команд) в верхней части экрана. Первая буква названия каждой из команд выделена при помощи увеличенной яркости. Выделение имеет целью напоминать, что для задания команды достаточно нажать лишь первую букву ее названия.

Команды определяются 7 функциями Turbo Prolog (Турбо-Пролог), каковыми являются:

Настройка системы в соответствии с индивидуальными потребностями (Setup).

Переход от одной команды к другой прост и удобен. Существует два способа задания команд. Первый требует нажатия клавиши, соответствующей первой букве названия выбранной команды в комбинации с кнопкой Alt. Так, для выбора команды Edit необходимо нажать Alt+E. Для окончания работы с командой используется клавиша Esc. Второй способ состоит в перемещении по меню при помощи стрелок; переход к работе с выбранной командой осуществляется нажатием Enter.

Главное меню содержит четыре окна:

в левом верхнем углу располагается окно редактора Turbo Prolog (Турбо-Пролог) (Editor);

Верхняя строка окна редактора содержит информацию о высвечиваемом в этом окне файле. Line 1 и Col 1 свидетельствуют о том, что курсор в настоящий момент располагается в первой позиции первой строки. Значения этих индикаторов строки и позиции меняются вслед за изменением положения курсора.

Надпись Indent сигнализирует о том, что включен режим автоматического выравнивания строк, а надпись Insert - о том, что задан режим вставки.

WORK.PRO является заданным по умолчанию именем рабочего файла; .PRO есть заданное по умолчанию расширение для файлов, содержащих программы на Турбо-Прологе. Если вы набьете в редакторе какой-либо текст и запишете его на диск без изменения имени файла, то файл с вашим текстом получит имя WORK.PRO.

Запуск на счет программы, написанной на Turbo Prolog (Турбо-Пролог)

Первая наша программа называется WELCOME.PRO. Перейдите при помощи Alt+E) в окно редактора. Введите текст программы:

Turbo Prolog (Турбо-Пролог) позволяет адресовать результат трансляции либо на диск, либо в оперативную память. При задании Run программа транслируется в оперативную память.

В дальнейшем вы можете создавать и объектные файлы для совместного редактирования с другими объектыми модулями, и выполнимые файлы, которые можно запускать на счет вне среды Turbo Prolog (Турбо-Пролог).

Сохранение программного файла Turbo Prolog (Турбо-Пролог)

Для того чтобы записать на диск программу и таким образом сохранить ее, необходимо выйти из редактора нажав клавишу Esc и нажать последовательно Alt+F и потом клавишу S. В результате этих действий на экране возникнет небольшое окно, в котором будет высвечено либо заданное по умолчанию имя файла (как, например, WORK.PRO). Имя файла можно оставить без изменений, а можно и отредактировать. Если на диске уже есть файл с указанным именем (более ранняя версия редактируемой программы или какая-либо иная программа), то в результате операции записи на диск расширение имени этого файла будет сменено на .BAK, чтобы пометить старый вариант файла. Не забывайте сохранять отредактированный файл перед тем, как окончить сеанс работы с Turbo Prolog (Турбо-Пролог). В противном случае модифицированный вариант программы будет утерян.

Достаточно частое сохранение рабочего файла на диск очень полезно. В случае отказа электропитания, или программного сбоя компьютера вы всегда будете иметь достаточно «свежий» вариант программы. Некоторые программисты записывают очередные версии программы под разными именами. Генерация таких многочисленных «поколений» программных файлов может также быть полезной, так как позволяет проследить все этапы развития программы.

Просмотр каталога директории

Для того чтобы просмотреть каталог файлов какой-либо директории, необходимо нажать Alt+F и далее нажать D (подкоманда Directory). На экране возникнет окно, в котором необходимо выбрать маску отображаемых файлов в текущей директории. После того, как вы нажмете Enter, в окне появятся имена всех файлов заданной директории, удовлетворяющие заданной маске.

Загрузка и редактирование программного файла

Для того чтобы загрузить в окно редактора уже существующий файл, необходимо нажать Alt+F и далее нажать L (Load). На экране возникнет окно, в котором необходимо выбрать маску отображаемых файлов в текущей директории. После того, как вы нажмете Enter, в окне появятся имена всех файлов заданной директории, удовлетворяющие заданной маске.

Alt+F и далее N (New file) – очистить окно редактирования. Если текущий файл не сохранён, то система запросит подтверждения. Если нажать Y, то окно очистится от текста.

Горячие клавиши

F1 – помощь, краткий перечень команд редактора. Shift+F10 - расширить это окно до размеров полного экрана; повторное нажатие Shift-F10 вернет окно к его первоначальным габаритам.

возможно, работа ваша закончится, а компьютер "зависнет".

Для получения инструкций по использованию INSTALL.BAT с вашей конк-

ретной системой, прочтите один из следующих параграфов.

Установка на систему с гибкими магнитными дисками

После того, как вы сделали резервные копии ваших дистрибутивных дис-

ков, вы готовы установить Турбо Пролог 2.0 на вашу систему с двумя диско-

водами для гибких магнитных дисков (ГМД). (Если у вас есть жесткий диск,

и вы намереваетесь установить Турбо Пролог на него, то пропустите данный

параграф, а вместо него читайте "Установка на жесткий диск".) Перед тем,

как вы начнете, вам нужно следующее:

мо, то, прежде чем читать дальше, посмотрите раздел "Теперь сделаем ре-

зервные копии" в данной главе).

1. Установите ваш резервный диск с именем INSTALLATION/ README в

дисковод A и сделайте этот дисковод текущим (для этого введите "a:" и

нажмите Ввод). Ваше приглашение DOS будет выглядеть что-то наподобие сле-

2. Для запуска программы инсталяции введите следующую строку (не

вводите "A:\>" - это приглашение DOS):

Please place a formatted BLANK disk labeled EXAMPLES in drive B:

("Пожалуйста, вставьте отформатированный чистый диск с именем

EXAMPLES в дисковод B:")

то сделайте, что оно просит, и нажмите какую-нибудь клавишу.

Программа инсталяции создаст на вашем чистом диске EXAMPLES три

каталога, а затем скопирует файлы с резервного диска на диск

4. Когда этот шаг завершится, вы увидите на экране следующее сообще-

Please place a formatted BLANK disk labeled BOOT DISK in drive B:

("Пожалуйста, установите отформатированный чистый диск с именем BOOT

DISK в дисковод B:").

5. Уберите свой диск EXAMPLES из дисковода B и установите в него

чистый диск BOOT DISK. Программа инсталяции скопирует файлы README с ре-

зервного диска на ваш диск BOOT DISK.

Please insert the Turbo Prolog disk labeled COMPILER into drive A:

("Пожалуйста, вставьте диск Турбо Пролога с именем COMPILER в диско-

7. Удалите из дисковода A резервный диск INSTALLATION/README и уста-

новите в этот дисковод резервный диск COMPILER.

8. Программа инсталяции скопирует файл PROLOG.EXE с резервного диска

Please place a formatted BLANK disk labeled PROGRAMS in drive B:

("Пожалуйста, установите отформатированный чистый диск с именем

PROGRAMS в дисковод B:").

9. Уберите из дисковода B свой диск BOOT DISK и вставьте в дисковод

B ваш диск PROGRAMS.

10. Программа инсталяции скопирует несколько файлов с резервного

диска на ваш диск PROGRAMS. Затем она выведет на ваш экран следующее со-

Please insert the Turbo Prolog disk labeled HELP FILES/BGI into

drive A: and a formatted BLANK disk labeled RUN DISK in drive B:

("Пожалуйста, установите диск Турбо Пролога с именем HELP FILES/BGI

в дисковод A: и отформатированный чистый диск с именем RUN DISK в диско-

11. Уберите из дисковода A резервный диск COMPILER и установите в

этот дисковод резервный диск HELP FILES/BGI.

12. Уберите из дисковода B свой диск PROGRAMS и установите в этот

дисковод чистый диск RUN DISK.

13. Программа инсталяции скопирует несколько файлов с резервного

диска на ваш диск RUN DISK. Затем она выведет на экран следующее сообще-

Please insert the Turbo Prolog disk labeled LIBRARIES into drive A:

and formatted BLANK disk labeled LIBRARY in drive B:

("Пожалуйста, установите диск Турбо Пролога с именем LIBRARIES в

дисковод A: и отформатированный чистый диск с именем LIBRARY в дисковод

14. Уберите из дисковода A резервный диск HELP FILES/BGI и установи-

те в этот дисковод резервный диск LIBRARIES.

15. Уберите из дисковода B свой диск RUN DISK и установите в этот

дисковод чистый диск LIBRARY.

16. Программа инсталяции скопирует несколько файлов с резервного

Turbo Prolog 2.0 is now ready for use on your system. Don't forget

to put the ORIGINAL disks in a safe place.

("Теперь Турбо Пролог 2.0 готов к использованию на вашей системе. Не

забудьте спрятать свои диски-оригиналы в безопасное место").

Для получения какой-либо новой информации по установке Турбо Пролога

2.0 на вашу систему с дисководами для гибких магнитных дисков смотрите на

Prolog - самый популярный язык логического программирования

Prolog - самый популярный язык логического программирования

Узнаем, что такое логическое программирование (ЛП ), и его области применения

Установим самый популярный язык ЛП --- Prolog

Научимся писать простые программы на Prolog

Научимся спискам в Prolog

Разберем преимущества и недостатки Prolog.

Эта статья будет полезна для тех, кто:

Интересуется необычными подходами и расширяет свой кругозор

Начинает изучать Prolog (например, в институте)

В конце статьи я оставлю полезные ссылки. Если у вас останутся вопросы — пишите в комментариях!

Начнем туториал: Пролог для чайников!

Логическое программирование

Существуют разные подходы к программированию. Часто выделяют такие парадигмы программирования:

И наконец — Декларативное (Логическое). Основывается на автоматическом доказательстве теорем на основе фактов и правил. Примеры языков: Prolog и его диалекты, Mercury. В таких языках мы описываем пространство состояний, в которых сам язык ищет решение к задаче. Мы просто даем ему правила, факты, а потом говорим, что "сочини все возможные стихи из этих слов", "реши логическую задачу", "найди всех братьев, сестер, золовок, свояков в генеалогическом древе", или "раскрась граф наименьшим кол-вом цветов так, что смежные ребра были разного цвета".

Установка Prolog

Существую разные реализации (имплементации) Пролога: SWI Prolog, Visual Prolog, GNU Prolog. Мы установим SWI Prolog.

Установка на Arch Linux:

Установка на Ubuntu:

Prolog работает в режиме интерпретатора. Теперь можем запустить SWI Prolog. Запускать не через swi-prolog, а через swipl:

Ура! Оно работает!

Теперь поставим на Windows.
Перейдем на официальный сайт на страницу скачивания стабильной версии. Ссылка на скачивание. Клик. Скачаем 64х битную версию. Установка стандартная. Чтобы ничего не сломать, я решил галочки не снимать. Ради приличия я оставлю скрины установки.

Сайт SWI Prolog - установщики последней стабильной версии Галочки не трогаем Ищу SWI-Prolog через поиск Windows. Запускаю Ура! Теперь и на Windows все работает

Основы Prolog. Факты, правила, предикаты

Есть утверждения, предикаты:

Марк изучает книгу (учебник, документацию)

Маша видит клавиатуру (мышку, книгу, тетрадь, Марка)

Миша изучает математику (ЛП, документацию, учебник)

Саша старше Лёши

С английского "predicate" означает "логическое утверждение".

Есть объекты: книга, клавиатура, мышка, учебник, документация, тетрадь, математика, ЛП, Марк, Маша, Саша, Даша, Лёша, Миша, да что угодно может быть объектом.
Есть отношения между объектами, т.е то, что связывает объекты. Связь объектов можно выразить через глаголы, например: читать, видеть, изучать. Связь можно выразить через прилагательное. Миша старше Даши. Даша старше Лёши. Получается.. связью может быть любая часть речь? Получается так.

Прекрасно! Давайте попробуем запрограммировать эти утверждения на Прологе. Для этого нам нужно:

Создать новый текстовый файл, который я назову simple.pl (.pl — расширение Пролога)

В нем написать простой однострочный код на Прологе

Запустить код с помощью SWI Prolog

Спросить у Пролога этот факт

Запустим. На линуксе это делается таким образом:

На Windows я использую notepad++ для написания кода на Прологе. Я запущу SWI-Prolog и открою файл через consult.

Видим, что он скомпилировал условия. Даже написал "1 clauses", т.е один факт

Видим, что он скомпилировал условия. Даже написал "1 clauses", т.е один факт

Что мы сделали? Мы загрузили базу знаний (те, которые мы описали в простом однострочном файле simple.pl) и теперь можем задавать вопросы Прологу. То есть система такая: пишем знания в файле, загружаем эти знания в SWI Prolog и задаем вопросы интерпретатору. Так мы будем решать поставленную задачу. (Даже видно, в начале интерпретатор пишет "?- ". Это означает, что он ждет нашего вопроса, как великий мистик)

Давайте спросим "Марк изучает книгу?" На Прологе это выглядит так:

По сути мы спросили "есть ли факт study(mark, study) в твоей базе?", на что нам Пролог лаконично ответил "true." и продолжает ждать следующего вопроса. А давайте спросим, "изучает ли Марк документацию?"

Интерпретатор сказал "false.". Это означает, что он не нашел этот факт в своей базе фактов.

Расширим базу фактов. После я определю более строгую терминологию и опишу, что происходит в этом коде.

Сделаю важное замечание для начинающих. Сложность Пролога состоит в специфичной терминологии и в непривычном синтаксисе, в отсутствии императивных фич, вроде привычного присвоения переменных.

Терминология. Объекты данных в Прологе называются термами (предполагаю, от слова "термин"). Термы бывают следующих видов:

Константами. Делятся на числа и атомы. Начинаются с маленькой буквы. Числа: 1,36, 0, -1, 123.4, 0.23E-5. Атомы — это просто символы и строки: a, abc, neOdinSimvol, sTROKa. Если атом состоит из пробела, запятых и тд, то нужно их обрамлять в одинарные кавычки. Пример атома: 'строка с пробелами, запятыми. Eto kirilicca'.

Переменными. Начинаются с заглавной буквы: X, Y, Z, Peremennaya, Var.

Структурами (сложные термы). Например, study(misha, lp).

Списками. Пример: [X1], [Head|Tail]. Мы разберем их позже в этой статье.

Есть хорошая статья, которая подробно рассказывает про синтаксис и терминологию Пролога. Рекомендую её, чтобы лучше понять понятия Пролог.

Пролог использует методы полного перебора и обход дерева. Во время проверки условий (доказательства утверждений) Пролог заменяет переменные на конкретные значения. Через пару абзацев будут примеры.

study(mark, book). — такие конструкции называются фактами. Они всегда истинны. Если факта в базе знаний нету, то такой факт ложный. Факты нужно оканчивать точкой, так же как утверждения в русском языке.

"Задавать вопросы Прологу" означает попросить Пролог доказать наше утверждение. Пример: ?- study(mark, book). Если наше утверждение всегда истинно, то Пролог напечатает true, если всегда ложно, то false. Если наше утверждение верно при некоторых значениях переменных, то Пролог выведет значения переменных, при которых наше утверждение верно.

Давайте загрузим факты в Пролог и будем задавать вопросы. Давайте узнаем, что изучал mark. Для этого нам нужно написать "study(mark, X)." Если мы прожмем "Enter", то Пролог нам выдаст первое попавшееся решение

Чтобы получить все возможные решения, нужно прожимать точку с запятой ";".

Можем узнать, кто изучал документацию.

Можно узнать, кто и что изучал!

Пролог проходится по всей базе фактов и находит все такие переменные Who и Object, что предикат study(Who, Object) будет истинным. Пролог перебирает факты и заменяет переменные на конкретные значения. Пролог выведет такие значения переменных, при которых утверждения будут истинными. У нас задача состояла только из фактов, и решение получилось очевидным.
Переменная Who перебирается среди имен mark, misha, а переменная Object среди book, studentbook, docs, lp, math.
Who не может равняться masha, потому что masha ничего не узнала согласно нашей базе фактов. Аналогично Object не может равняться tomuChevoNetuVBaze, так как такого значения не было в базе фактов. Для study на втором месте были только book, studentbook, docs, lp, math.

Короче, я старался понятным языком объяснить метод полного перебора, и что Пролог тупо все перебирает, пока что-то не подойдет. Все просто.

А теперь разберем правила в Прологе. Напишем ещё одну программу old.pl.

older(X,Y) :- older(X, Z), older(Z,Y) — такие конструкции называются правилами. Чтобы из факта получить правило, нужно заменить точку "." на двоеточие дефис ":-" и написать условие, когда правило будет истинным. Правила истинны только при определенных условиях. Например, это правило будет истинно в случае, когда факты older(X,Z) и older(Z,Y) истинны. Если переформулировать, то получается "X старше Y, если X старше Z и Z старше Y". Если математически: "X > Y, если X > Z и Z > Y".

Запятая "," в Прологе играет роль логического "И". Пример: "0 < X, X < 5". X меньше 5 И больше 0.
Точка с запятой ";" играет роль логического "ИЛИ". "X < 0; X > 5". X меньше 0 ИЛИ больше 5.
Отрицание "not(Какой-нибудь предикат)" играет роль логического "НЕ". "not(X==5)". X НЕ равен 5.

Факты и правила образуют утверждения, предикаты. (хорошая статья про предикаты)

Сперва закомментируйте правило и поспрашивайте Пролог, кто старше кого.

Маша старше Миши. Пролог просто прошелся по фактам и нашел единственное верный факт. Но.. мы хотели узнать "Кого старше Маша?". Логично же, что если Миша старше Саши И Маша старше Миши, то Маша также старше Саши. И Пролог должен решать такие логические задачи. Поэтому нужно добавить правило older(X,Y) :- older(X, Z), older(Z,Y).
Повторим вопрос.

Программа смогла найти все решения. Но что это такое? Ошибка! Стек переполнен! Как вы думаете, с чем это может быть связано? Попробуйте подумать, почему это происходит. Хорошее упражнение — расписать на бумаге алгоритм older(masha,X) так, как будто вы — Пролог. Видите причину ошибки?

Это связано с бесконечной рекурсией. Это частая ошибка, которая возникает в программировании, в частности, на Прологе. older(X, Y) вызывает новый предикат older(X,Z), который в свою очередь вызывает следующий предикат older и так далее.
Нужно как-то остановить зацикливание. Если подумать, зачем нам проверять первый предикат "older(X, Z)" через правила? Если не нашел факт, то значит весь предикат older(X, Y) ложный (подумайте, почему).
Нужно объяснить Прологу, что факты и правила нужно проверять во второй части older(Z, Y), а в первой older(X, Y) — только факты
Нужно объяснить Прологу, что если он в первый раз не смог найти нужный факт, то ему не нужно приступать к правилу. Нам нужно как-то объяснить Прологу, где факт, а где правило.
Это задачу можно решить, добавив к предикатам ещё один аргумент, который будет показывать — это правило или факт.

Нижнее подчеркивание "_" - это анонимная переменная. Её используют, когда нам не важно, какое значение будет на её месте. Нам важно, чтобы первая часть правила была фактом. А вторая часть может быть любой.

Наша программа вывела все верные ответы.

Возможно, возникает вопрос: откуда Пролог знает, что изучает Марк и что Миша старше Даши? Как он понимает такие человеческие понятия? Почему ассоциируется study(mark, math) с фразой "Марк изучает математику"? Почему не с "математика изучает Марка"?. Это наше представление. Мы договорились, что пусть первый терм будет обозначать "субъект", сам предикат "взаимосвязь", а второй терм "объект". Мы могли бы воспринимать по-другому. Это просто договеренность о том, как воспринимать предикаты. Пролог позволяет нам абстрактно описать взаимоотношения между термами.

Напишем предикат для нахождения факториала от N.


"is" означает присвоить, т.е N1 будет равняться N-1. Присвоение значений переменным Пролога называется унификацией. "is" работает только для чисел. Чтобы можно было присваивать атомы, нужно вместо "is" использовать " full-width ">

Списки в Прологе отличаются от списков в C/C++, Python и других процедурных языков. Здесь список — это либо пустой элемент; либо один элемент, называемый головой, и присоединенный список — хвост. Список - это рекурсивная структура данных с последовательным доступом.

Списки выглядят так: [],[a], [abc, bc], ['Слово 1', 'Слово 2', 1234], [X], [Head|Tail].
Рассмотрим [Head|Tail]. Это всё список, в котором мы выделяем первый элемент, голову списка, и остальную часть, хвост списка. Чтобы отделить первые элементы от остальной части списка, используется прямая черта "|".
Можно было написать такой список [X1,X2,X3|Tail]. Тогда мы выделим первые три элемента списка и положим их в X1, X2, X3, а остальная часть списка будет в Tail.

В списках хранятся данные, и нам нужно с ними работать. Например, находить минимум, максимум, медиану, среднее, дисперсию. Может нужно найти длину списка, длину самого длинного атома, получить средний балл по N предмету среди студентов группы G. Может нужно проверить, есть ли элемент Elem в списке List. И так далее. Короче, нужно как-то работать со списками. Только предикаты могут обрабатывать списки (да и в целом в Прологе все обрабатывается предикатами).

Напишем предикат для перебора элементов списка, чтобы понять принцип работы списка.

element([Head|Tail],Element) будет истинным, если Element равен Head (первому элементу списка) ИЛИ если предикат element(Tail, Element) истинный. В какой-то момент эта рекурсия окончится. (Вопрос читателю: когда кончится рекурсия? Какое условие будет терминирующим?) Таким образом, предикат будет истинным, если Element будет равен каждому элементу списка [Head|Tail]. Пролог найдет все решения, и мы переберем все элементы списка.

Часто бывает нужным знать длину списка. Напишем предикат для нахождения длины списка. Протестим.

Мой Пролог предупреждает, что была не использована переменная H. Код будет работать, но лучше использовать анонимную переменную _, вместо singleton переменной.

В SWI Prolog имеется встроенный предикат length. Я реализовал аналогичный предикат list_length. Если встречается пустой список, то его длина равна нулю. Иначе отсекается голова списка, рекурсивно определяется длина нового получившегося списка и к результату прибавляется единица.

Чтобы лучше понять алгоритм, пропишите его на бумаге. Последовательно, так, как делает Пролог.

Последняя задача про списки в этой статье, это определить, принадлежит ли элемент списку. Например, 1, 2, 3 и 4 являются элементами списка [1,2,3,4]. Этот предикат мы назовем list_member.

Очевидно, что если список начинается с искомого элемента, то элемент принадлежит списку. В противном случае необходимо отсечь голову списка и рекурсивно проверить наличие элемента в новом получившемся списке.

Преимущества и недостатки Prolog

Пролог удобен в решении задач, в которых мы знаем начальное состояние (объекты и отношения между ними) и в которых нам трудно задать четкий алгоритм поиска решений. То есть чтобы Пролог сам нашел ответ.

Список задач, в которых Пролог удобен:

Компьютерная лингвистика. Написание стихов, анализ речи

Поиск пути в графе. Работа с графами

Знаменитую логическую задачу Эйнштейна можно гораздо легче решить на Прологе, чем на любом другом императивном языке. Одна из вариаций такой задачи:

На улице стоят пять домов. Каждый из пяти домов окрашен в свой цвет, а их жители — разных национальностей, владеют разными животными, пьют разные напитки и имеют разные профессии.

Англичанин живёт в красном доме.

У испанца есть собака.

В зелёном доме пьют кофе.

Украинец пьёт чай.

Зелёный дом стоит сразу справа от белого дома.

Скульптор разводит улиток.

В жёлтом доме живет математик.

В центральном доме пьют молоко.

Норвежец живёт в первом доме.

Сосед поэта держит лису.

В доме по соседству с тем, в котором держат лошадь, живет математик.

Музыкант пьёт апельсиновый сок.

Норвежец живёт рядом с синим домом.

Кто пьёт воду? Кто держит зебру?

Замечание: в утверждении 6 справа означает справа относительно вас.

Научиться решать логические задачи на Пролог, можно по этой статье.
Ещё одна интересная статья. В ней автор пишет программу сочинитель стихов на Prolog.

Интересная задача, которую вы можете решить на Прологе: раскрасить граф наименьшим количеством цветов так, чтобы смежные вершины были разного цвета.

Иллюстрация к задаче

Иллюстрация к задаче

Пролог такой замечательный язык! Но почему его крайне редко используют?
Я вижу две причины:

Альтернативы (например, нейросетей на Python)

Пролог решает задачи методом полного перебора. Следовательно, его сложность растет как O(n!). Конечно, можно использовать отсечения, например, с помощью "!". Но все равно сложность останется факториальной. Простые задачи не так интересны, а сложные лучше реализовать жадным алгоритмом на императивном языке.

Я не могу сказать, что логическое программирование не нужно. Оно действительно развивает логическое мышление. Элементы логического программирования можно встретить на практике. И в принципе, логическое программирование — интересная парадагима, которую полезно знать, например, специалистам ИИ.

Что дальше?

Я понимаю, что статью я написал суховато и слишком "логично" (вероятно, влияние Пролога). Я надеюсь, статья вам помогла в изучении основ Логического Программирования на примере Пролога.

(Мои мысли: я часто использую повторения в статье. Это не сочинение, это туториал. Лучше не плодить ненужные синонимы и чаще использовать термины. По крайней мере, в туториалах. Так лучше запоминается. Повторение — мать учения. А как вы считаете?).

Это моя дебютная статья, и я буду очень рад конструктивной критике. Задавайте вопросы, пишите комментарии, я постараюсь отвечать на них. В конце статьи я приведу все ссылки, которые я упоминал и которые мне показались полезными.

Читайте также: