SWI-Prolog
Последнее изменение этой страницы: 02:50, 22 мая 2016.
Парадигма | логическое программирование |
---|---|
Спроектировано | 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'а объявляет, какие факты и правила дают тот или иной результат при различных подцелях, а внутренние подпрограммы унификации выполняют оставшуюся часть работы.
Внутренние унификационные подпрограммы также означивают переменные. Означенные переменные и константы имеют значения, «известные» Прологу. Свободные переменные значений не имеют.
Откат
Откат - это механизм, который Пролог использует для нахождения дополнительных фактов и правил, необходимых при вычислении цели, если текущая попытка вычислить цель оказалась неудачной. Пролог использует откат для того, чтобы попробовать новые пути к решению. Пролог использует всю доступную информацию для выбора подходящего направления.
ISSN 2542-0356
Следуй за Полисом
Оставайся в курсе последних событий
Лицензия
Если не указано иное, содержание этой страницы доступно по лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» 4.0, а примеры кода – по лицензии Apache 2.0. Подробнее см. Условия использования.