Пролог - Prolog

Пролог
ПарадигмаЛогическое программирование
РазработаноАлен Колмерауэр, Роберт Ковальски
Впервые появился1972
Стабильный выпуск
Часть 1: General core-Edition 1 (июнь 1995 г.); 25 лет назад (1995-06))
Часть 2: Модули - издание 1 (июнь 2000 г.); 20 лет спустя (2000-06))
Расширения имени файла.pl, .pro,
Интернет сайтЧасть 1: www.iso.org/ стандарт/21413.html
Часть 2: www.iso.org/ стандарт/20775.html
Основной реализации
B-Prolog, Чао, Затмение, GNU Prolog, Jekejeke Prolog, Поплог Пролог, П#, Quintus Prolog, SICStus, клубника, SWI-Prolog, Тау Пролог, tuProlog, WIN-PROLOG, XSB, YAP.
Диалекты
ISO Prolog, Эдинбургский Пролог
Под влиянием
Планировщик
Под влиянием
CHR, Clojure, Лог данных, Erlang, KL0, KL1, Меркурий, Унция, Strand, Визуальный пролог, XSB

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

Пролог уходит корнями в логика первого порядка, а формальная логика, и в отличие от многих других языки программирования, Prolog предназначен в первую очередь как декларативное программирование язык: логика программы выражается в терминах связи, представленные как факты и правила. А вычисление инициируется запуском запрос над этими отношениями.[4]

Язык был разработан и внедрен в Марселе, Франция, в 1972 г. Ален Колмерауэр с Филиппом Русселем по мотивам Роберт Ковальски процедурная интерпретация Роговые оговорки.[5][6]

Пролог был одним из первых языков логического программирования[7] и остается самым популярным таким языком сегодня, с несколькими доступными бесплатными и коммерческими реализациями. Язык использовался для доказательство теорем,[8] экспертные системы,[9] переписывание терминов,[10] системы типов,[11] и автоматизированное планирование,[12] а также его первоначальную предполагаемую область использования, обработка естественного языка.[13][14] Современные среды Prolog поддерживают создание графический пользовательский интерфейс, а также административные и сетевые приложения.

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

Синтаксис и семантика

В Прологе логика программы выражается в терминах отношений, а вычисление инициируется запуском запрос над этими отношениями. Отношения и запросы строятся с использованием единственного типа данных Пролога, срок.[4] Отношения определяются статьи. По запросу движок Prolog пытается найти разрешающая способность опровержение отрицательного запроса. Если отрицательный запрос может быть опровергнут, то есть найден экземпляр для всех свободных переменных, который делает объединение предложений и одноэлементный набор, состоящий из отрицательного запроса, ложным, из этого следует, что исходный запрос с примененным найденным экземпляром является ложным. логическое следствие программы. Это делает Пролог (и другие языки логического программирования) особенно полезным для баз данных, символическая математика, и приложения для синтаксического анализа языка. Поскольку Пролог допускает нечистые предикаты, проверяя значение истины некоторых специальных предикатов могут иметь намеренно побочный эффект, например, вывод значения на экран. Из-за этого программисту разрешается использовать некоторое количество обычных императивное программирование когда логическая парадигма неудобна. Он имеет чисто логическое подмножество, называемое «чистый Пролог», а также ряд внелогических функций.

Типы данных

Сингл Пролога тип данных это срок. Условия либо атомы, числа, переменные или же сложные термины.

  • An атом имя общего назначения без внутреннего значения. Примеры атомов включают Икс, красный, 'Тако', и 'какой-то атом'.
  • Числа возможно поплавки или же целые числа. Совместимые со стандартом ISO системы Prolog могут проверять флаг Prolog как «ограниченный». Большинство основных систем Пролога поддерживают целые числа произвольной длины.
  • Переменные обозначаются строкой, состоящей из букв, цифр и символов подчеркивания и начинающейся с заглавной буквы или символа подчеркивания. Переменные очень похожи на переменные по логике в том смысле, что они заменяют произвольные термины.
  • А составной термин состоит из атома, называемого «функтором», и ряда «аргументов», которые снова являются терминами. Составные термины обычно записываются как функтор, за которым следует список терминов аргументов, разделенных запятыми, который содержится в круглых скобках. Количество аргументов называется термином арность. Атом можно рассматривать как составной термин с арность нуль. Пример составного термина: person_friends (зельда, [том, джим]).

Частные случаи сложных терминов:

  • А Список представляет собой упорядоченный набор терминов. Он обозначается квадратными скобками с терминами, разделенными запятыми, или, в случае пустого списка, []. Например, [1,2,3] или же [красный, зеленый, синий].
  • Струны: Последовательность символов, окруженная кавычками, эквивалентна списку (числовых) кодов символов, списку символов (атомы длины 1) или атому, в зависимости от значения флага Prolog двойные кавычки. Например, "быть или не быть".[15]

ISO Prolog обеспечивает атом / 1, номер 1, целое / 1, и поплавок / 1 предикаты для проверка типов.[16]

Правила и факты

Программы на языке Prolog описывают отношения, определяемые с помощью предложений. Чистый Пролог ограничен Роговые оговорки. Есть два типа статей: факты и правила. Правило имеет форму

Голова :- Тело.

и читается как «Голова истинна, если тело истинно». Тело правила состоит из вызовов предикатов, которые называются цели. Встроенный логический оператор ,/2 (имеется в виду арность 2 оператор с именем ,) обозначает соединение целей и ;/2 обозначает дизъюнкция. Соединения и разъединения могут появляться только в теле, а не в голове правила.

Предложения с пустыми телами называются факты. Пример факта:

Кот(мошенник).

что эквивалентно правилу:

Кот(мошенник) :- истинный.

Встроенный предикат правда / 0 всегда правда.

Учитывая вышеуказанный факт, можно спросить:

Кривоголик - кошка?

 ?- Кот(мошенник). да

что такое кошки?

 ?- Кот(Икс). Икс = мошенник

Статьи с телами называются правила. Пример правила:

животное(Икс) :- Кот(Икс).

Если мы добавим это правило и спросим какие вещи животные?

 ?- животное(Икс). Икс = мошенник

Из-за реляционной природы многих встроенных предикатов их обычно можно использовать в нескольких направлениях. Например, длина / 2 может использоваться для определения длины списка (длина (Список, L), учитывая список Список), а также для создания скелета списка заданной длины (длина (X, 5)), а также для создания скелетов списков и их длины вместе (длина (X, L)). По аналогии, append / 3 может использоваться как для добавления двух списков (добавить (ListA, ListB, X) данные списки ListA и СписокB), а также разбить данный список на части (добавить (X, Y, Список), учитывая список Список). По этой причине для многих программ Prolog достаточно сравнительно небольшого набора библиотечных предикатов.

Как язык общего назначения, Prolog также предоставляет различные встроенные предикаты для выполнения рутинных действий, таких как ввод, вывод, используя графику и иным образом взаимодействуя с операционной системой. Эти предикаты не имеют реляционного значения и полезны только для побочных эффектов, которые они проявляют в системе. Например, предикат написать / 1 отображает термин на экране.

Исполнение

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

мать_дитя(трудиться, Салли). отец_ ребенок(Том, Салли).отец_ ребенок(Том, Эрика).отец_ ребенок(Майк, Том). брат или сестра(Икс, Y)      :- parent_child(Z, Икс), parent_child(Z, Y). parent_child(Икс, Y) :- отец_ ребенок(Икс, Y).parent_child(Икс, Y) :- мать_дитя(Икс, Y).

Это приводит к тому, что следующий запрос оценивается как истинный:

 ?- брат или сестра(Салли, Эрика). да

Это получается следующим образом: Изначально единственный совпадающий заголовок предложения для запроса брат (Салли, Эрика) является первым, поэтому доказательство запроса эквивалентно доказательству тела этого предложения с соответствующими привязками переменных на месте, то есть конъюнкцией (родитель_деток (Z, салли), родитель_деток (Z, Эрика)). Следующая цель, которую нужно доказать, - это самая левая цель этого конъюнкции, т. Е. parent_child (Z, салли). Этой цели соответствуют две главы статьи. Система создает точку выбора и пробует первую альтернативу, тело которой Father_child (Z, салли). Эта цель может быть доказана, используя факт отец_ ребенок (Том, ​​Салли), поэтому привязка Z = том генерируется, и следующая цель, которую необходимо доказать, - это вторая часть вышеуказанного соединения: parent_child (Том, ​​Эрика). Опять же, это подтверждается соответствующим фактом. Поскольку все цели могут быть доказаны, запрос выполняется. Поскольку запрос не содержит переменных, пользователю не сообщается о привязках. Запрос с переменными, например:

?- отец_ ребенок(Отец, Ребенок).

перечисляет все действительные ответы при возврате.

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

Циклы и рекурсия

Итерационные алгоритмы могут быть реализованы с помощью рекурсивных предикатов.[17]

Отрицание

Встроенный предикат Prolog \+/1 обеспечивает отрицание как неудача, что позволяет немонотонный рассуждения. Цель + незаконно (X) в правиле

законный(Икс) :- \+ незаконный(Икс).

оценивается следующим образом: Пролог пытается доказать незаконно (X). Если можно найти доказательство этой цели, исходная цель (т. Е. + незаконно (X)) не работает. Если не найти доказательств, первоначальная цель достигнута. Следовательно \+/1 префиксный оператор называется "недоказуемым" оператором, поскольку запрос ? - + Цель. считается успешным, если цель недоказуема. Такое отрицание звук если его аргумент "земля" (т.е. не содержит переменных). Разумность теряется, если аргумент содержит переменные и процедура доказательства завершена. В частности, запрос ? - юридический (X). now не может использоваться для перечисления всех законных вещей.

Программирование на Прологе

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

Вот несколько примеров программ, написанных на Прологе.

Привет, мир

Пример запроса:

?- записывать('Привет, мир!'), нл.Привет Мир!истинный.?-

Оптимизация компилятора

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

program_optimized(Prog0, Прог) :-    Optimization_pass_1(Prog0, Prog1),    optim_pass_2(Prog1, Prog2),    Optimization_pass_3(Prog2, Прог).

или эквивалентно используя DCG обозначение:

program_optimized --> Optimization_pass_1, optim_pass_2, Optimization_pass_3.

Быстрая сортировка

В быстрая сортировка алгоритм сортировки, связывающий список с его отсортированной версией:

раздел([], _, [], []).раздел([Икс|Хз], Вращаться, Smalls, Большие) :-    (   Икс @< Вращаться ->        Smalls = [Икс|Отдых],        раздел(Хз, Вращаться, Отдых, Большие)    ;   Большие = [Икс|Отдых],        раздел(Хз, Вращаться, Smalls, Отдых)    ). быстрая сортировка([])     --> [].быстрая сортировка([Икс|Хз]) -->    { раздел(Хз, Икс, Меньше, Больше) },    быстрая сортировка(Меньше), [Икс], быстрая сортировка(Больше).

Шаблоны проектирования

А шаблон дизайна является универсальным многоразовым решением часто встречающейся проблемы в разработка программного обеспечения. В Prolog шаблоны проектирования имеют разные имена: скелеты и методы,[19][20] клише,[21] схемы программы,[22] и схемы логического описания.[23]Альтернативой шаблонам проектирования является программирование высшего порядка.[24]

Программирование высшего порядка

Предикат высшего порядка - это предикат, который принимает в качестве аргументов один или несколько других предикатов. Хотя поддержка программирования более высокого порядка выводит Пролог за пределы области логики первого порядка, которая не позволяет количественную оценку по предикатам,[25] В ISO Prolog теперь есть несколько встроенных предикатов высшего порядка, таких как звонок / 1, звонок / 2, звонок / 3, findall / 3, setof / 3, и bagof / 3.[26] Кроме того, поскольку произвольные цели Пролога могут быть построены и оценены во время выполнения, легко написать предикаты более высокого порядка, такие как maplist / 2, который применяет произвольный предикат к каждому члену данного списка, и подсписок / 3, который фильтрует элементы, удовлетворяющие заданному предикату, также с учетом карри.[24]

Чтобы преобразовать решения из временного представления (подстановки ответов при поиске с возвратом) в пространственное представление (термины), в Prolog есть различные предикаты всех решений, которые собирают все замены ответов заданного запроса в списке. Это можно использовать для понимание списка. Например, идеальные числа равны сумме собственных делителей:

 идеально(N) :-     между(1, инф, N), U является N // 2,     найти все(D, (между(1,U,D), N мод D =:= 0), Ds),     итоговый список(Ds, N).

Это можно использовать для перечисления совершенных чисел, а также для проверки того, является ли число совершенным.

Другой пример: предикат список карт применяет предикат п на все соответствующие позиции в паре списков:

список карт(_, [], []).список карт(п, [Икс|Хз], [Y|Ys]) :-   вызов(п, Икс, Y),   список карт(п, Хз, Ys).

Когда п это предикат, который для всех Икс, P (X, Y) объединяет Y с одним уникальным значением, список карт (P, Xs, Ys) эквивалентно применению карта функционировать в функциональное программирование в качестве Ys = map (Функция, Xs).

Стиль программирования высшего порядка в Prolog впервые появился в HiLog и λProlog.

Модули

За программирование в большом, Prolog предоставляет модульная система. Модульная система стандартизирована ISO.[27] Однако не все компиляторы Пролога поддерживают модули, и существуют проблемы совместимости между модульными системами основных компиляторов Пролога.[28] Следовательно, модули, написанные на одном компиляторе Пролога, не обязательно будут работать на других.

Парсинг

Есть специальное обозначение, называемое грамматики с определенными предложениями (DCG). Правило, определенное через -->/2 вместо :-/2 расширяется препроцессором (expand_term / 2, средство, аналогичное макросам на других языках) в соответствии с несколькими простыми правилами переписывания, что приводит к обычным предложениям Пролога. В частности, переписывание снабжает предикат двумя дополнительными аргументами, которые можно использовать для неявной передачи состояния вокруг,[требуется разъяснение ] аналогично монады на других языках. DCG часто используются для написания парсеров или генераторов списков, так как они также предоставляют удобный интерфейс для списков различий.

Мета-интерпретаторы и рефлексия

Пролог - это гомоиконный язык и предоставляет множество возможностей для отражение. Его стратегия неявного выполнения позволяет написать краткую мета-круговой оценщик (также называемый метаинтерпретатор) для чистого кода Пролога:

решать(истинный).решать((Подцель 1,Подцель 2)) :-     решать(Подцель 1),    решать(Подцель 2).решать(Голова) :-     пункт(Голова, Тело),    решать(Тело).

куда истинный представляет собой пустой союз, а предложение (Head, Body) объединяется с предложениями в базе данных формы Голова: - Тело.

Поскольку программы Пролога сами по себе являются последовательностями терминов Пролога (:-/2 инфикс оператор ), которые легко читаются и проверяются с помощью встроенных механизмов (например, читать / 1), можно писать настраиваемые интерпретаторы, которые дополняют Prolog специфическими для предметной области функциями. Например, Стерлинг и Шапиро представляют метаинтерпретатор, который выполняет рассуждения с неопределенностью, воспроизведенный здесь с небольшими изменениями:[29]:330

решать(истинный, 1) :- !.решать((Подцель 1,Подцель 2), Уверенность) :-    !,    решать(Подцель 1, Уверенность1),    решать(Подцель 2, Уверенность2),    Уверенность является мин(Уверенность1, Уверенность2).решать(Цель, 1) :-    встроенный(Цель), !,     Цель.решать(Голова, Уверенность) :-    clause_cf(Голова, Тело, Уверенность1),    решать(Тело, Уверенность2),    Уверенность является Уверенность1 * Уверенность2.

Этот интерпретатор использует таблицу встроенных предикатов Пролога в форме[29]:327

встроенный(А является B).встроенный(читать(Икс)).% так далее.

и пункты, представленные как clause_cf (глава, тело, уверенность). Учитывая это, его можно назвать решить (цель, уверенность) выполнить Цель и получить определенную уверенность в результате.

Полнота по Тьюрингу

Чистый Пролог основан на подмножестве первого порядка логика предикатов, Роговые оговорки, который Полный по Тьюрингу. Полноту Пролога по Тьюрингу можно показать, используя его для моделирования машины Тьюринга:

Тьюринг(Лента0, Лента) :-    выполнять(q0, [], Ls, Лента0, Рупий),    обеспечить регресс(Ls, Ls1),    добавить(Ls1, Рупий, Лента). выполнять(qf, Ls, Ls, Рупий, Рупий) :- !.выполнять(Q0, Ls0, Ls, 0 рупий, Рупий) :-    символ(0 рупий, Сим, RsRest),    однажды(правило(Q0, Сим, Q1, NewSym, Действие)),    действие(Действие, Ls0, Ls1, [NewSym|RsRest], 1 рупий),    выполнять(Q1, Ls1, Ls, 1 рупий, Рупий). символ([], б, []).символ([Сим|Рупий], Сим, Рупий). действие(оставили, Ls0, Ls, 0 рупий, Рупий) :- оставили(Ls0, Ls, 0 рупий, Рупий).действие(оставаться, Ls, Ls, Рупий, Рупий).действие(верно, Ls0, [Сим|Ls0], [Сим|Рупий], Рупий). оставили([], [], 0 рупий, [б|0 рупий]).оставили([L|Ls], Ls, Рупий, [L|Рупий]).

Простой пример машины Тьюринга определяется фактами:

правило(q0, 1, q0, 1, верно).правило(q0, б, qf, 1, оставаться).

Эта машина выполняет приращение на одно число в унарном кодировании: он перебирает любое количество ячеек «1» и добавляет дополнительную «1» в конце. Пример запроса и результат:

?- Тьюринг([1,1,1], Ц).Ц = [1, 1, 1, 1] ;

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

Выполнение

ISO Prolog

В ISO Стандарт Пролога состоит из двух частей. ИСО / МЭК 13211-1,[26][30] опубликованная в 1995 году, направлена ​​на стандартизацию существующих практик многих реализаций основных элементов Prolog. Это прояснило аспекты языка, которые ранее были неоднозначными, и привело к созданию переносимых программ. Есть три исправления: Кор.1: 2007,[31] Кор.2: 2012,[32] и Кор.3: 2017.[33] ИСО / МЭК 13211-2,[26] опубликовано в 2000 году, добавляет в стандарт поддержку модулей. Стандарт поддерживается ISO / IEC JTC1 /SC22 / WG17[34] рабочая группа. ANSI X3J17 - это техническая консультативная группа США по стандарту.[35]

Компиляция

Для эффективности код Пролога обычно компилируется в абстрактный машинный код, на который часто влияет регистровый код. Абстрактная машина Уоррена (WAM) набор инструкций.[36] Некоторые реализации используют абстрактная интерпретация для получения информации о типе и режиме предикатов во время компиляции или компиляции в реальный машинный код для повышения производительности.[37] Разработка эффективных методов реализации кода Пролога является областью активных исследований в сообществе логического программирования, и в некоторых реализациях используются различные другие методы выполнения. К ним относятся бинаризация предложения и виртуальные машины на основе стека.[нужна цитата ]

Хвостовая рекурсия

Системы Prolog обычно реализуют хорошо известный метод оптимизации, называемый оптимизация хвостового вызова (TCO) для детерминированных предикатов, показывающих хвостовая рекурсия или, в более общем смысле, хвостовые вызовы: кадр стека предложения отбрасывается перед выполнением вызова в хвостовой позиции. Следовательно, детерминированные хвостовые рекурсивные предикаты выполняются с постоянным пространством стека, как циклы в других языках.

Индексация срока

Поиск предложений, которые невозможно сопоставить с термином в запросе, зависит от количества предложений линейно. Индексация срока использует структура данных что позволяет сублинейное время поиски.[38] Индексирование влияет только на производительность программы, на семантику оно не влияет. Большинство Прологов используют индексацию только по первому члену, поскольку индексирование по всем терминам дорого, но методы, основанные на закодированные слова или же наложенный кодовые слова обеспечить быструю индексацию всего запроса и заголовка.[39][40]

Хеширование

Некоторые системы Prolog, такие как WIN-PROLOG и SWI-Prolog, теперь реализуют хеширование для более эффективной обработки больших наборов данных. Это дает очень большой прирост производительности при работе с большими корпусами, такими как WordNet.

Таблинг

Некоторые системы Prolog, (B-Prolog, XSB, SWI-Prolog, YAP, и Чао ), реализовать мемоизация метод называется таблица, что освобождает пользователя от необходимости вручную сохранять промежуточные результаты. Таблинг - это компромисс между пространством и временем; время выполнения можно сократить, используя больше памяти для хранения промежуточных результатов:[41][42]

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

Таблинг может быть расширен в различных направлениях. Он может поддерживать рекурсивные предикаты через SLG-разрешение или линейное таблирование. В многопоточной системе Prolog результаты табуляции могут быть конфиденциальными для потока или совместно используемыми для всех потоков. А в инкрементальной таблице таблица может реагировать на изменения.

Реализация в аппаратном обеспечении

Вовремя Проект компьютерных систем пятого поколения, были попытки реализовать Prolog на аппаратном уровне с целью достижения более быстрого выполнения с выделенными архитектурами.[44][45][46] Кроме того, Prolog имеет ряд свойств, которые позволяют ускорить параллельное выполнение.[47] Более поздний подход заключался в компиляции ограниченных программ Prolog в программируемая вентильная матрица.[48] Однако быстрый прогресс в области аппаратного обеспечения общего назначения постоянно опережает более специализированные архитектуры.

Ограничения

Хотя Пролог широко используется в исследованиях и образовании, Пролог и другие языки логического программирования не оказали существенного влияния на компьютерную индустрию в целом.[49] Большинство приложений небольшие по промышленным стандартам, некоторые из них превышают 100 000 строк кода.[49][50] Программирование в целом считается сложным, потому что не все компиляторы Prolog поддерживают модули, и существуют проблемы совместимости между модульными системами основных компиляторов Prolog.[28] Переносимость кода Пролога между реализациями также была проблемой, но разработки с 2007 года означали: «Переносимость в рамках семейства реализаций Пролога, производных от Edinburgh / Quintus, достаточно хороша для поддержки переносимых реальных приложений».[51]

Программное обеспечение, разработанное на Prolog, подвергалось критике за снижение производительности по сравнению с традиционными языками программирования. В частности, недетерминированная стратегия оценки Пролога может быть проблематичной при программировании детерминированных вычислений или даже при использовании «недетерминированного недетерминизма» (когда делается единственный выбор вместо обратного отслеживания всех возможностей). Сокращения и другие языковые конструкции, возможно, придется использовать для достижения желаемой производительности, разрушая одно из главных достоинств Пролога - способность запускать программы «вперед и назад».[52]

Пролог не является чисто декларативным: из-за таких конструкций, как оператор резки, чтобы понять ее, необходимо процедурное прочтение программы на языке Prolog.[53] Порядок предложений в программе Prolog имеет большое значение, поскольку от него зависит стратегия выполнения языка.[54] Другие языки логического программирования, такие как Лог данных, действительно декларативны, но ограничивают язык. В результате многие практические программы на Прологе написаны в соответствии с порядком поиска Пролога в глубину, а не как программы с чисто декларативной логикой.[52]

Расширения

На основе Prolog были разработаны различные реализации для расширения возможностей логического программирования во многих направлениях. К ним относятся типы, режимы, программирование логики ограничений (CLP), объектно-ориентированное логическое программирование (OOLP), параллелизм, линейная логика (LLP), функциональные и логика высшего порядка возможности программирования, а также совместимость с базы знаний:

Типы

Пролог - нетипизированный язык. Попытки ввести типы относятся к 1980-м годам,[55][56] и по состоянию на 2008 год все еще предпринимаются попытки расширить Prolog с помощью типов.[57] Информация о типе полезна не только для безопасность типа но также и для рассуждений о программах на Прологе.[58]

Режимы

Спецификатор режимаИнтерпретация
+nonvar при входе
-вар при входе
?Не указано

Синтаксис Пролога не определяет, какие аргументы предиката являются входными, а какие - выходными.[59] Однако эта информация важна, и ее рекомендуется включить в комментарии.[60] Режимы предоставляют ценную информацию при рассмотрении программ Prolog[58] а также может использоваться для ускорения выполнения.[61]

Ограничения

Программирование логики ограничений расширяет Prolog, чтобы включить концепции из удовлетворение ограничений.[62][63] Программа логики ограничений допускает ограничения в теле предложений, например: A (X, Y): - X + Y> 0. Он подходит для крупномасштабных комбинаторная оптимизация проблемы[64] и, таким образом, полезен для приложений в промышленных условиях, таких как автоматическое табулирование времени и календарное планирование производства. Большинство систем Prolog поставляются с как минимум одним решателем ограничений для конечных областей, а также часто с решателями для других областей, таких как рациональные числа.

Объектная ориентация

Флора-2 это объектно-ориентированная система представления знаний и рассуждений, основанная на F-логика и включает HiLog, Логика транзакции, и доказуемое рассуждение.

Logtalk - это объектно-ориентированный язык программирования логики, который может использовать большинство реализаций Prolog в качестве внутреннего компилятора. Как многопарадигмальный язык, он включает поддержку как прототипов, так и классов.

Облог это небольшое портативное объектно-ориентированное расширение Prolog, разработанное Маргарет Макдугалл из EdCAAD, Эдинбургский университет.

Objlog был фрейм-языком, объединяющим объекты и Prolog II от CNRS, Марсель, Франция.

Пролог ++ был разработан Партнеры по логическому программированию и впервые выпущен в 1989 году для ПК с MS-DOS. Была добавлена ​​поддержка других платформ, и вторая версия была выпущена в 1995 году. Книга Криса Мосса о Prolog ++ была опубликована издательством Addison-Wesley в 1994 году.

Графика

Системы Prolog, обеспечивающие графическая библиотека находятся SWI-Prolog,[65] Визуальный пролог, WIN-PROLOG, и B-Prolog.

Параллелизм

Пролог-MPI это открытый исходный код SWI-Prolog расширение для распределенных вычислений по Интерфейс передачи сообщений.[66] Также существуют различные параллельные языки программирования Prolog.[67]

Веб-программирование

Некоторые реализации Prolog, в частности SWI-Prolog и Ciao, поддерживают на стороне сервера веб-программирование с поддержкой веб-протоколов, HTML и XML.[68] Также есть расширения для поддержки семантическая сеть форматы, такие как RDF и СОВА.[69][70] Пролог также был предложен как сторона клиента язык.[71]

Adobe Flash

Кедр это бесплатный и базовый интерпретатор Пролога. Начиная с версии 4 и выше, Cedar поддерживает FCA (Flash Cedar App). Это обеспечивает новую платформу для программирования на Prolog через ActionScript.

Другой

  • F-логика расширяет Prolog фреймами / объектами для представление знаний.
  • Логика транзакции расширяет Prolog с помощью логической теории операторов обновления, изменяющих состояние. Он имеет как теоретико-модельную, так и процедурную семантику.
  • OW Prolog был создан для того, чтобы восполнить недостаток графики и интерфейса в Prolog.

Интерфейсы на другие языки

Существуют рамки, которые могут связывать Пролог с другими языками:

  • В Сервер LPA Intelligence позволяет встраивать LPA Prolog в C, C #, C ++, Java, VB, Delphi, .Net, Lua, Python и другие языки. Он использует специальный строковый тип данных, который предоставляет LPA Prolog.
  • Logic Server API позволяет как расширение, так и встраивание Prolog в C, C ++, Java, VB, Delphi, .NET и любой язык / среду, которая может вызывать .dll или .so. Реализовано для Amzi! Пролог Амзи! Prolog + Логический Сервер но спецификация API может быть доступна для любой реализации.
  • JPL - это двунаправленный мост Java Prolog, который по умолчанию поставляется с SWI-Prolog, позволяя Java и Prolog вызывать друг друга (рекурсивно). Известно, что он имеет хорошую поддержку параллелизма и находится в стадии активной разработки.
  • ИнтерПролог, мост библиотеки программирования между Ява и Prolog, реализующий двунаправленный вызов предикатов / методов между обоими языками. Объекты Java могут быть отображены в термины Пролога и наоборот. Позволяет развивать GUI и другие функции в Java, оставив логическую обработку на уровне Prolog. Поддерживает XSB, с поддержкой SWI-Prolog и YAP запланировано на 2013 год.
  • Прова обеспечивает интеграцию собственного синтаксиса с Java, сообщениями агента и правилами реакции. Prova позиционирует себя как основанную на правилах систему сценариев (RBS) для промежуточного программного обеспечения. Язык открывает новые горизонты в сочетании императив и декларативное программирование.
  • PROL Встраиваемый движок Prolog для Java. Он включает небольшую среду IDE и несколько библиотек.
  • GNU Prolog для Java представляет собой реализацию ISO Prolog в виде библиотеки Java (gnu.prolog)
  • Чао предоставляет интерфейсы к C, C ++, Java и реляционным базам данных.
  • C # -Prolog интерпретатор Пролога, написанный на (управляемом) C #. Легко интегрируется в программы на C #. Характеристики: надежный и достаточно быстрый интерпретатор, интерфейс командной строки, Windows-интерфейс, встроенный DCG, XML-предикаты, SQL-предикаты, расширяемость. Доступен полный исходный код, включая генератор парсера, который можно использовать для добавления расширений специального назначения.
  • Jekejeke Prolog API обеспечивает тесно связанные средства одновременного вызова и вызова между Prolog и Java или Android, с отмеченной возможностью создания индивидуальных объектов базы знаний. Его можно использовать для встраивания интерпретатора ISO Prolog в автономные приложения, апплеты, сервлеты, APK и т. Д.
  • Абстрактная машина Уоррена для PHP Компилятор и интерпретатор Пролога в PHP 5.3. Библиотека, которую можно использовать отдельно или в рамках фреймворка Symfony2.1, которая была переведена с Стефана Бютчера работать на Java, которую можно найти [здесь Стефан.buettcher.org/ cs/ вам/индекс.html]
  • tuProlog - это облегченная система Prolog для распределенных приложений и инфраструктур, специально разработанная на основе минимального ядра, для статической или динамической настройки путем загрузки / выгрузки библиотек предикатов. tuProlog изначально поддерживает многопарадигмальное программирование, обеспечивая чистую, бесшовную модель интеграции между Prolog и основными объектно-ориентированными языками, а именно Java, для версии Java tuProlog, и любым языком на основе .NET (C #, F # ..) для tuProlog. NET-версию.[72]

История

Название Пролог был выбран Филипп Руссель как сокращение для программирование в логике (Французский за программирование в логика ). Он был создан примерно в 1972 году Ален Колмерауэр с Филиппом Русселем по мотивам Роберт Ковальски процедурная интерпретация Роговые оговорки. Частично это было мотивировано желанием примирить использование логики в качестве языка декларативного представления знаний с процедурным представлением знаний, которое было популярно в Северной Америке в конце 1960-х - начале 1970-х годов. В соответствии с Роберт Ковальски, первая система Prolog была разработана в 1972 году Колмерауэром и Филиппом Русселем.[5] Первой реализацией Пролога был интерпретатор, написанный на Фортране Джерардом Баттани и Анри Мелони. Дэвид Х. Д. Уоррен перевез этот интерпретатор в Эдинбург, где реализовал альтернативный интерфейс, который определил синтаксис «Эдинбургский пролог», используемый в большинстве современных реализаций. Уоррен также реализовал первый компилятор для Prolog, создав влиятельный Prolog DEC-10 в сотрудничестве с Фернандо Перейрой. Позже Уоррен обобщил идеи, лежащие в основе пролога DEC-10, чтобы создать Абстрактная машина Уоррена.

Европейские исследователи искусственного интеллекта отдавали предпочтение Прологу, а американцы - Лисп, что, как сообщается, вызвало множество националистических дебатов о достоинствах языков.[73] Большая часть современного развития Prolog возникла под влиянием Проект компьютерных систем пятого поколения (FGCS), которая разработала вариант Prolog под названием Язык ядра для своего первого Операционная система.

Изначально чистый Пролог был ограничен использованием разрешающая способность средство доказательства теорем с Роговые оговорки формы:

H: - B1, ..., Bп.

Применение средства доказательства теорем рассматривает такие предложения как процедуры:

показать / решить H, показать / решить B1 и ... и Bп.

Однако вскоре Pure Prolog был расширен за счет включения отрицание как неудача, в которых отрицательные условия вида not (Bя) показаны попытками и неудачей решения соответствующих положительных условий Bя.

Последующие расширения Prolog от исходной команды представили программирование логики ограничений способности в реализации.

Использование в промышленности

Пролог использовался в Watson. Watson использует программное обеспечение IBM DeepQA и Apache. UIMA (Архитектура управления неструктурированной информацией). Система написана на разных языках, включая Java, C ++ и Prolog, и работает на SUSE Linux Enterprise Server 11 операционная система, использующая Apache Hadoop структура для обеспечения распределенных вычислений. Пролог используется для сопоставление с образцом над деревьями синтаксического анализа естественного языка. Разработчики заявили: «Нам требовался язык, на котором мы могли бы удобно выражать правила сопоставления с образцом в деревьях синтаксического анализа и другие аннотации (например, результаты распознавания именованных сущностей), а также технологию, которая могла бы очень эффективно выполнять эти правила. Мы обнаружили, что Prolog был идеальным выбором для языка из-за его простоты и выразительности ».[14] Пролог используется в платформе разработки Low-Code. GeneXus, который ориентирован на AI.[74]

Смотрите также

Родственные языки

  • В Гёдель язык - это строго типизированная реализация параллельное программирование логики ограничений. Он построен на SICStus Prolog.
  • Визуальный пролог, ранее известный как PDC Prolog и Turbo Prolog, является строго типизированный объектно-ориентированный диалект Пролога, который сильно отличается от стандартного Пролога. Как Turbo Prolog, он продавался Borland, но теперь он разработан и продан датской фирмой PDC (Prolog Development Center), которая изначально его выпустила.
  • Лог данных является подмножеством Пролога. Он ограничен отношениями, которые могут быть стратифицированными, и не допускает составных терминов. В отличие от Prolog, Datalog не Полный по Тьюрингу.
  • Меркурий является ответвлением Prolog, ориентированным на разработку программного обеспечения в целом со статической системой полиморфных типов, а также системой режимов и детерминизма.
  • GraphTalk - это проприетарная реализация абстрактной машины Уоррена с дополнительными объектно-ориентированными свойствами.
  • В какой-то степени[который? ] Пролог - это подмножество Планировщик. Идеи Planner были позже развиты в Метафора научного сообщества.
  • AgentSpeak вариант Пролога для программирования поведения агента в мультиагентные системы.
  • Erlang начал свою жизнь с реализации на основе Пролога и поддерживает большую часть синтаксиса Пролога, основанного на унификации.
  • Pilog декларативный язык, построенный на основе ПикоЛисп, который имеет семантику Пролога, но использует синтаксис Лиспа.

Рекомендации

  1. ^ Clocksin, Уильям Ф .; Меллиш, Кристофер С. (2003). Программирование на Прологе. Берлин; Нью-Йорк: Springer-Verlag. ISBN  978-3-540-00678-7.
  2. ^ Братко, Иван (2012). Пролог для искусственного интеллекта (4-е изд.). Харлоу, Англия; Нью-Йорк: Эддисон Уэсли. ISBN  978-0-321-41746-6.
  3. ^ Ковингтон, Майкл А. (1994). Обработка естественного языка для программистов на Prolog. Энглвуд Клиффс, Нью-Джерси: Prentice Hall. ISBN  978-0-13-629213-5.
  4. ^ а б Ллойд, Дж. У. (1984). Основы логического программирования. Берлин: Springer-Verlag. ISBN  978-3-540-13299-8.
  5. ^ а б Ковальский, Р. А. (1988). «Первые годы логического программирования» (PDF). Коммуникации ACM. 31: 38. Дои:10.1145/35043.35046. S2CID  12259230.
  6. ^ Colmerauer, A .; Руссель, П. (1993). «Рождение Пролога» (PDF). Уведомления ACM SIGPLAN. 28 (3): 37. Дои:10.1145/155360.155362.
  7. ^ Видеть Логическое программирование § История.
  8. ^ Стикель, М. Э. (1988). «Доказательство теорем технологии пролога: реализация расширенным компилятором пролога». Журнал автоматизированных рассуждений. 4 (4): 353–380. CiteSeerX  10.1.1.47.3057. Дои:10.1007 / BF00297245. S2CID  14621218.
  9. ^ Мерритт, Деннис (1989). Создание экспертных систем на Прологе. Берлин: Springer-Verlag. ISBN  978-0-387-97016-5.
  10. ^ Фелти, Эми. «Подход логического программирования к реализации переписывания терминов более высокого порядка». Расширения логического программирования (1992): 135-161.
  11. ^ Кент Д. Ли (19 января 2015 г.). Основы языков программирования. Springer. С. 298–. ISBN  978-3-319-13314-0.
  12. ^ Уте Шмид (21 августа 2003 г.). Индуктивный синтез функциональных программ: универсальное планирование, сворачивание конечных программ и абстракция схемы с помощью рассуждений по аналогии. Springer Science & Business Media. ISBN  978-3-540-40174-2.
  13. ^ Фернандо К. Н. Перейра; Стюарт М. Шибер (2005). Пролог и анализ естественного языка. Микротом.
  14. ^ а б Адам Лалли; Пол Фодор (31 марта 2011 г.). «Обработка естественного языка с помощью Prolog в системе IBM Watson». Ассоциация логического программирования. Смотрите также Ватсон (компьютер).
  15. ^ ИСО / МЭК 13211-1: 1995 Пролог, 6.3.7 Термины - список с двойными кавычками. Международная организация по стандартизации, Женева.
  16. ^ Проверка типа термина - SWI-Prolog
  17. ^ Карлссон, Матс (27 мая 2014 г.). SICStus Prolog User's Manual 4.3: Основная справочная документация. Совет директоров - Книги по запросу. ISBN  9783735737441 - через Google Книги.
  18. ^ Ковингтон, Майкл А .; Багнара, Роберто; О'Киф, Ричард А.; Вилемакер, Ян; Прайс, Саймон (2011). «Руководство по написанию кода для Prolog». Теория и практика логического программирования. 12 (6): 889–927. arXiv:0911.2899. Дои:10.1017 / S1471068411000391. S2CID  438363.
  19. ^ Kirschenbaum, M.; Sterling, L.S. (1993). "Applying Techniques to Skeletons". Constructing Logic Programs, (Ed. J.M.J. Jacquet): 27–140. CiteSeerX  10.1.1.56.7278.
  20. ^ Sterling, Leon (2002). "Patterns for Prolog Programming". Computational Logic: Logic Programming and Beyond. Lecture Notes in Computer Science / Lecture Notes in Artificial Intelligence. 2407. pp. 17–26. Дои:10.1007/3-540-45628-7_15. ISBN  978-3-540-43959-2.
  21. ^ D. Barker-Plummer. Cliche programming in Prolog. In M. Bruynooghe, editor, Proc. Second Workshop on Meta-Programming in Logic, pages 247--256. Dept. of Comp. Sci., Katholieke Univ. Leuven, 1990.
  22. ^ Gegg-harrison, T. S. (1995). Representing Logic Program Schemata in Prolog. Procs Twelfth International Conference on Logic Programming. pp. 467–481.
  23. ^ Deville, Yves (1990). Logic programming: systematic program development. Wokingham, England: Addison-Wesley. ISBN  978-0-201-17576-9.
  24. ^ а б Naish, Lee (1996). Higher-order logic programming in Prolog (Report). Department of Computer Science, University of Melbourne. CiteSeerX  10.1.1.35.4505.
  25. ^ "With regard to Prolog variables, variables only in the head are implicitly universally quantified, and those only in the body are implicitly existentially quantified". Получено 2013-05-04.
  26. ^ а б c ISO/IEC 13211: Information technology — Programming languages — Prolog. Международная организация по стандартизации, Geneva.
  27. ^ ISO/IEC 13211-2: Modules.
  28. ^ а б Moura, Paulo (August 2004), "Logtalk", Association of Logic Programming, 17 (3)
  29. ^ а б Shapiro, Ehud Y.; Sterling, Leon (1994). The Art of Prolog: Advanced Programming Techniques. Кембридж, Массачусетс: MIT Press. ISBN  978-0-262-19338-2.
  30. ^ A. Ed-Dbali; Deransart, Pierre; L. Cervoni (1996). Prolog: the standard: reference manual. Берлин: Springer. ISBN  978-3-540-59304-1.
  31. ^ "ISO/IEC 13211-1:1995/Cor 1:2007 -".
  32. ^ "ISO/IEC 13211-1:1995/Cor 2:2012 -".
  33. ^ "ISO/IEC 13211-1:1995/Cor 3:2017 -".
  34. ^ "ISO/IEC JTC1 SC22 WG17".[постоянная мертвая ссылка ]
  35. ^ "X3J17 and the Prolog Standard". Архивировано из оригинал на 2009-08-23. Получено 2009-10-02.
  36. ^ David H. D. Warren. "An abstract Prolog instruction set". Technical Note 309, SRI International, Menlo Park, CA, October 1983.
  37. ^ Van Roy, P.; Despain, A. M. (1992). "High-performance logic programming with the Aquarius Prolog compiler". Компьютер. 25: 54–68. Дои:10.1109/2.108055. S2CID  16447071.
  38. ^ Graf, Peter (1995). Индексация срока. Springer. ISBN  978-3-540-61040-3.
  39. ^ Wise, Michael J.; Powers, David M. W. (1986). Indexing Prolog Clauses via Superimposed Code Words and Field Encoded Words. Международный симпозиум по логическому программированию. С. 203–210.
  40. ^ Colomb, Robert M. (1991). «Повышение унификации в PROLOG за счет индексации пунктов». The Journal of Logic Programming. 10: 23–44. Дои:10.1016/0743-1066(91)90004-9.
  41. ^ Swift, T. (1999). "Tabling for non‐monotonic programming". Анналы математики и искусственного интеллекта. 25 (3/4): 201–240. Дои:10.1023/A:1018990308362. S2CID  16695800.
  42. ^ Zhou, Neng-Fa; Sato, Taisuke (2003). "Efficient Fixpoint Computation in Linear Tabling" (PDF). Proceedings of the 5th ACM SIGPLAN International Conference on Principles and Practice of Declarative Programming: 275–283.
  43. ^ Swift, T.; Warren, D. S. (2011). "XSB: Extending Prolog with Tabled Logic Programming". Теория и практика логического программирования. 12 (1–2): 157–187. arXiv:1012.5123. Дои:10.1017/S1471068411000500. S2CID  6153112.
  44. ^ Abe, S .; Bandoh, T.; Yamaguchi, S .; Kurosawa, K.; Kiriyama, K. (1987). "High performance integrated Prolog processor IPP". Proceedings of the 14th annual international symposium on Computer architecture - ISCA '87. п. 100. Дои:10.1145/30350.30362. ISBN  978-0818607769. S2CID  10283148.
  45. ^ Robinson, Ian (1986). A Prolog processor based on a pattern matching memory device. Third International Conference on Logic Programming. Конспект лекций по информатике. 225. Springer. С. 172–179. Дои:10.1007/3-540-16492-8_73. ISBN  978-3-540-16492-0.
  46. ^ Taki, K.; Nakajima, K.; Nakashima, H .; Ikeda, M. (1987). "Performance and architectural evaluation of the PSI machine". Уведомления ACM SIGPLAN. 22 (10): 128. Дои:10.1145/36205.36195.
  47. ^ Gupta, G .; Pontelli, E.; Ali, K. A. M.; Carlsson, M.; Hermenegildo, M. V. (2001). "Parallel execution of prolog programs: a survey". Транзакции ACM по языкам и системам программирования. 23 (4): 472. Дои:10.1145/504083.504085. S2CID  2978041.
  48. ^ "Statically Allocated Systems".
  49. ^ а б Logic programming for the real world. Zoltan Somogyi, Fergus Henderson, Thomas Conway, Richard O'Keefe. Proceedings of the ILPS'95 Postconference Workshop on Visions for the Future of Logic Programming.
  50. ^ "FAQ: Prolog Resource Guide 1/2 [Monthly posting] Section - [1-8] The Prolog 1000 Database".
  51. ^ Jan Wielemaker and Vıtor Santos Costa: Portability of Prolog programs: theory and case-studies. CICLOPS-WLPE Workshop 2010.
  52. ^ а б Kiselyov, Oleg; Kameyama, Yukiyoshi (2014). Re-thinking Prolog. Proc. 31st meeting of the Japan Society for Software Science and Technology.
  53. ^ Franzen, Torkel (1994), "Declarative vs procedural", Association of Logic Programming, 7 (3)
  54. ^ Dantsin, Evgeny; Eiter, Thomas; Готтлоб, Георг; Voronkov, Andrei (2001). "Complexity and Expressive Power of Logic Programming". Опросы ACM Computing. 33 (3): 374–425. CiteSeerX  10.1.1.616.6372. Дои:10.1145/502807.502810. S2CID  518049.
  55. ^ Mycroft, A.; O'Keefe, R. A. (1984). "A polymorphic type system for prolog". Искусственный интеллект. 23 (3): 295. Дои:10.1016/0004-3702(84)90017-1.
  56. ^ Pfenning, Frank (1992). Types in logic programming. Кембридж, Массачусетс: MIT Press. ISBN  978-0-262-16131-2.
  57. ^ Schrijvers, Tom; Santos Costa, Vitor; Вилемакер, Ян; Demoen, Bart (2008). "Towards Typed Prolog". In Maria Garcia de la Banda; Enrico Pontelli (eds.). Logic programming : 24th international conference, ICLP 2008, Udine, Italy, December 9-13, 2008 : proceedings. Конспект лекций по информатике. 5366. pp. 693–697. Дои:10.1007/978-3-540-89982-2_59. ISBN  9783540899822.
  58. ^ а б Apt, K. R.; Marchiori, E. (1994). "Reasoning about Prolog programs: From modes through types to assertions". Формальные аспекты вычислений. 6 (S1): 743. CiteSeerX  10.1.1.57.395. Дои:10.1007/BF01213601. S2CID  12235465.
  59. ^ O'Keefe, Richard A. (1990). The craft of Prolog. Кембридж, Массачусетс: MIT Press. ISBN  978-0-262-15039-2.
  60. ^ Michael Covington; Roberto Bagnara; и другие. (2010). "Coding guidelines for Prolog". arXiv:0911.2899 [cs.PL ].
  61. ^ Рой, П .; Demoen, B.; Willems, Y. D. (1987). "Improving the execution speed of compiled Prolog with modes, clause selection, and determinism". Tapsoft '87. Конспект лекций по информатике. 250. стр.111. Дои:10.1007/BFb0014976. ISBN  978-3-540-17611-4.
  62. ^ Jaffar, J. (1994). "Constraint logic programming: a survey". The Journal of Logic Programming. 19–20: 503–581. Дои:10.1016/0743-1066(94)90033-7.
  63. ^ Colmerauer, Alain (1987). "Opening the Prolog III Universe". Байт. August.
  64. ^ Wallace, M. (2002). "Constraint Logic Programming". Computational Logic: Logic Programming and Beyond. Конспект лекций по информатике. 2407. pp. 512–556. Дои:10.1007/3-540-45628-7_19. ISBN  978-3540456285.
  65. ^ "XPCE graphics library".
  66. ^ "prolog-mpi". Apps.lumii.lv. Получено 2010-09-16.
  67. ^ Ehud Shapiro. The family of concurrent logic programming languages Опросы ACM Computing. Сентябрь 1989 г.
  68. ^ Wielemaker, J.; Huang, Z.; Van Der Meij, L. (2008). "SWI-Prolog and the web" (PDF). Теория и практика логического программирования. 8 (3): 363. Дои:10.1017 / S1471068407003237. S2CID  5404048.
  69. ^ Jan Wielemaker and Michiel Hildebrand and Jacco van Ossenbruggen (2007), S. Heymans; A. Polleres; E. Ruckhaus; D. Pearse; G. Gupta (eds.), "Using {Prolog} as the fundament for applications on the semantic web" (PDF), Proceedings of the 2nd Workshop on Applications of Logic Programming and to the Web, Semantic Web and Semantic Web Services, CEUR Workshop Proceedings, Porto, Portugal: CEUR-WS.org, 287, pp. 84–98
  70. ^ Processing OWL2 Ontologies using Thea: An Application of Logic Programming. Vangelis Vassiliadis, Jan Wielemaker and Chris Mungall. Proceedings of the 5th International Workshop on OWL: Experiences and Directions (OWLED 2009), Chantilly, VA, United States, October 23–24, 2009
  71. ^ Loke, S. W.; Davison, A. (2001). "Secure Prolog-based mobile code". Теория и практика логического программирования. 1 (3): 321. arXiv:cs/0406012. CiteSeerX  10.1.1.58.6610. Дои:10.1017/S1471068401001211. S2CID  11754347.
  72. ^ «Архивная копия». Архивировано из оригинал on 2019-03-17. Получено 2019-06-08.CS1 maint: заархивированная копия как заголовок (связь)
  73. ^ Pountain, Dick (October 1984). "POP and SNAP". БАЙТ. п. 381. Получено 23 октября 2013.
  74. ^ "Wikipedia GeneXus Page".

дальнейшее чтение