SWI-Prolog

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 02:50, 22 мая 2016.
SWI-Prolog
Парадигма логическое программирование
Спроектировано Jan Wielemaker
Первый   появившийся 1987
Стабильная версия 7.2.3 / 25 августа, 2015 года
Печать дисциплины динамическая
OS кроссплатформенный (Windows NT, Mac OS, UNIX)
Лицензия GNU LGPL
Расширение файла .pl
Портал: https://swi-prolog.org/

SWI-Prolog — это свободная реализация языка программирования Prolog. Часто используется для преподавания и приложений Semantic Web. Данная реализация содержит в себе большой набор возможностей, библиотеки для constraint logic programming, многопоточности, GUI, интерфейс к языку программирования Java и т.д. SWI-Prolog работает на платформах Unix, Windows, и Macintosh. Язык поддерживает литературное программирование. Реализация содержит библиотеки для SGML, RDF, RDFS, средства разработчика (включая IDE с графическими отладчиком и профилировщиком), и обширную документацию.

История

SWI-Prolog постоянно развивается, начиная с момента создания в 1987 году. Его создателем и основным разработчиком является Jan Wielemaker. Название SWI происходит от Sociaal-Wetenschappelijke Informatica («Social Science Informatics»), первоначального названия группы в Амстердамском университете, где работает Wielemaker. Позже название этой группы сменилось на HCS (Human-Computer Studies).

XPCE

XPCE - это платформо-независимый GUI тулкит для SWI-Prolog, Lisp и других интерактивных динамически типизированных языков программирования. Развитие графической библиотеки XPCE было начато в 1987, совместно с началом работ над SWI-Prolog. XPCE замышлялся как не привязанный к конкретному языку программирования, наибольшую популярность этот фреймворк получил именно с Prolog. Поддерживает кнопки, меню, слайдеры, вкладки и другие базовые GUI виджеты. XPCE доступен на всех платформах, поддерживаемых SWI-Prolog’ом.

PreEmacs

PceEmacs — встроенный в среду SWI-Prolog текстовый редактор. PceEmacs — это клон Emacs, написанный на Prolog (и XPCE). Он поддерживает автоматические отступы, подсветку синтаксиса, полную проверку синтаксиса путем вызова парсера SWI-Prolog, предупреждения о singleton переменных и поиск определений предикатов на основе исходного кода в Prolog-базе данных.

Программа на SWI-Prolog

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

Терм

Терм основная конструкция на языки SWI-Prolog. Включает:

  • Простые термы
    • Константы
      • Атомы mia, hit_this_Qb
      • Числа [0-9]
    • Переменные X, Y, HitThisQ
  • Составные термы f(t_1, t_2, ..., t_n)

Переменные

  • Переменная - способ передачи данных во времени и пространстве.
  • Переменная - позволяет хранить данные и передавать их в подпрограммы.

Свободные переменные

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

Связанные переменные

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

База знаний

База знаний - набор фактов и правил, описывающих взаимоотношения в некоторой предметной области. Обрабатывается интерпретатором сверху вниз.

Факт

Одним из элементов базы знаний является факт.

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

Примеры:

 woman(mia).
 woman(jody). loves(mia, jody).

Правило

Другим элементов базы знаний, позволяющим выводить новые факты является правило.

  • Правило - утверждение, которое истинно тогда и только тогда, когда выполняются условия данного правила.
  • Правило - предложение, которое устанавливает отношение между термами при выполнении заданных условий.
  • Правило - условная истина.

Примеры:

 happy(mia).        % fact listen2Music(mia). % fact listen2Music(yolanda) :- happy(yolanda). % rule

Типы данных

SWI-Prolog поддерживает динамическую типизацию данных.

Если имя объекта начинается со строчной буквы, то этот объект имеет известное значение, то есть это константа. Объекты с известными или постоянными значениями должны начинаться со строчных букв, если они не являются числами.

 likes(mary,apples). /* mary и apples являются константами. */

Слова, начинающиеся с прописных букв, являются переменными языка SWI-Prolog.

Внутренние унификационные подпрограммы означивают переменные.

Означенные переменные и константы имеют значения, «известные» SWI-Prolog'у.

Свободные или неозначенные переменные значений не имеют.

Переменные могут быть объектами предиката как в утверждениях, так и в подцелях.

 likes(mary,apples). /* Утверждение - Мэри любит яблоки */
 likes(mary,What). /* Цель – что любит Мэри? */

Числа

 ?- A = 12, B = -0.5e4.
 A = 12,
 B = -5000.0. ?- number($A), number($B).
 true. % показываем, что тип переменных - числа

Атомы

 ?- A = abc, B = 'Hello World'.
 A = abc,
 B = 'Hello World'. ?- atom($A), atom($B).
 true. % показываем, что тип переменных - атомы

Строки

 ?- S = "Привет мир".
 S = [1055, 1088, 1080, 1074, 1077, 1090, 32, 1084, 1080|...].

Видно, что строки являются списками кодов символов, т.е. к ним применимы все те же операции что и к спискам.

Списки

 ?- A=[], B=[a, foo, 123, [[[[[1,2,42]],bar]]], "Привет", A], C=[A,B].
 A = [], % пустой список B = [a, foo, 123, [[[[[1|...]], bar]]], [1055, 1088, 1080, 1074|...], []],
 C = [[], [a, foo, 123, [[[[...]|...]]], [1055, 1088|...], []]]

Списки могут быть:

  • Разнородными (содержать любые комбинации выше (и ниже) перечисленных типов)
  • Вложенными

Структуры

 ?- A = aaa(bb), B = aaa(bbbbbb, 123, [456, c]), C = ccc(ddd(eee), fff, g(h(i(j(kkkkk))))).
 A = aaa(bb),
 B = aaa(bbbbbb, 123, [456, c]),
 C = ccc(ddd(eee), fff, g(h(i(j(kkkkk)))))

Интуитивно понятный пример:

 ?- Family = family(father(bill, age(37)), mother(ann, age(34)), children([son(john, age(10)), daughter(jill, age(8))])).
 Family = family(father(bill, age(37)), mother(ann, age(34)), children([son(john, age(10)), daughter(jill, age(8))]))

Структура в прологе представляется функтором (имя структуры, то что до скобок) и параметрами (то что в скобках). Число параметров называется арностью функтора. Как видим, структуры тоже могут быть вложенными.

Унификация

Унификация - является наиболее важной операцией в языке SWI-Prolog. Сопоставление выполняет сравнение двух термов на равенство, при этом неконкретизированные переменные получают значения, при которых термы становятся идентичными. Выполнение сопоставления может производиться либо явно, в теле правила с помощью встроенного предиката X=Y, либо неявно, при сопоставлении цели с фактом или головой правила. Сопоставление реализует основные операции обработки данных в логическом программировании:

  • однократное присваивание,
  • передача параметров,
  • создание структурных объектов,
  • доступ к полям структурных объектов с возможностью одновременного чтения/записи.
  • Сопоставление выполняется согласно следующим правилам:
    • Неконкретизированная переменная сопоставима с любым объектом и этот объект становится значением переменной (конкретизацией).
    • Числа и атомы сопоставимы только с идентичными числами и атомами.
    • Структуры сопоставимы только, если они имеют одинаковый функтор, одинаковое число компонентов, и соответствующие компоненты сопоставимы друг с другом.
    • Неконкретизированные переменные сопоставимы друг с другом, при этом они становятся сцепленными. Если одна из них получит конкретное значение, то такое же значение получит и другая переменная.

Программист в соответствии с логическим синтаксисом SWI-Prolog'а объявляет, какие факты и правила дают тот или иной результат при различных подцелях, а внутренние подпрограммы унификации выполняют оставшуюся часть работы.

Внутренние унификационные подпрограммы также означивают переменные. Означенные переменные и константы имеют значения, «известные» Прологу. Свободные переменные значений не имеют.

Откат

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

Ссылки