stringtranslate.com

Пролог

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

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

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

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

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

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

Типы данных

Единственный тип данных Prolog — это терм . Термины — это атомы , числа , переменные или составные термы . [примечание 1]

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

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

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

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

и читается как "Head is true if Body is true". Тело правила состоит из вызовов предикатов, которые называются целями правила . Встроенный логический оператор (имеется в виду оператор,/2 арности 2 с именем ) обозначает конъюнкцию целей и обозначает дизъюнкцию . Конъюнкции и дизъюнкции могут появляться только в теле, но не в заголовке правила.,;/2

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

человек ( сократ ).

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

человек ( сократ )  :-  правда .

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

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

Сократ — человек?

 ?-  человек ( сократ ).  Да

что такое люди?

 ?-  человек ( X ).  X  =  Сократ

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

смертный ( X )  :-  человек ( X ).

А если мы добавим это правило и спросим, ​​какие вещи смертны?

 ?-  смертный ( X ).  X  =  Сократ

Предикаты и программы

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

мать_ребенок ( труда ,  салли ).отец_ребенок ( том ,  салли ). отец_ребенок ( том ,  эрика ). отец_ребенок ( майк ,  том ).брат/сестра ( X ,  Y )  :-  родитель_ребенок ( Z ,  X ),  родитель_ребенок ( Z ,  Y ).родитель_ребенок ( X ,  Y )  :-  отец_ребенок ( X ,  Y ). родитель_ребенок ( X ,  Y )  :-  мать_ребенок ( X ,  Y ).

Предикат father_child/2состоит из трех предложений, каждое из которых является фактом, а предикат parent_child/2состоит из двух предложений, каждое из которых является правилом.

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

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

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

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

Рассмотрим parent_child/2предикат, определенный в программе семейного отношения выше. Следующая программа Prolog определяет отношение предка :

предок ( X ,  Y )  :-  родитель_ребенок ( X ,  Y ). предок ( X ,  Y )  :-  родитель_ребенок ( X ,  Z ),  предок ( Z ,  Y ).

Он выражает, что X является предком Y, если X является родителем Y или X является родителем предка Y. Он рекурсивен, поскольку определяется в терминах самого себя ( ancestor/2в теле второго предложения есть вызов предиката).

Исполнение

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

 ?-  брат ( Салли ,  Эрика ).  Да

Это получается следующим образом: изначально единственным соответствующим заголовком предложения для запроса sibling(sally, erica)является первый, поэтому доказательство запроса эквивалентно доказательству тела этого предложения с соответствующими переменными связываниями на месте, т. е. конъюнкцией (parent_child(Z,sally), parent_child(Z,erica)). Следующая цель, которую нужно доказать, — самая левая цель этого соединения, т. е. parent_child(Z, sally). Два заголовка предложения соответствуют этой цели. Система создает точку выбора и пробует первую альтернативу, тело которой — father_child(Z, sally). Эта цель может быть доказана с помощью факта father_child(tom, sally), поэтому привязка Z = tomгенерируется, а следующей целью, которую нужно доказать, является вторая часть вышеуказанного соединения: parent_child(tom, erica). Опять же, это может быть доказано соответствующим фактом. Поскольку все цели могут быть доказаны, запрос выполняется успешно. Поскольку запрос не содержал переменных, никакие привязки не сообщаются пользователю. Запрос с переменными, например:

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

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

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

Отрицание

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

законно ( X )  :-  \+  незаконно ( X ).

оценивается следующим образом: Prolog пытается доказать illegal(X). Если доказательство для этой цели может быть найдено, исходная цель (т. е. \+ illegal(X)) терпит неудачу. Если доказательство не может быть найдено, исходная цель достигает цели. Поэтому \+/1префиксный оператор называется «недоказуемым» оператором, поскольку запрос ?- \+ Goal.выполняется успешно, если Цель не доказуема. Этот вид отрицания является обоснованным , если его аргумент является «основным» (т. е. не содержит переменных). Обоснованность теряется, если аргумент содержит переменные, а процедура доказательства завершена. В частности, запрос ?- legal(X).теперь не может использоваться для перечисления всех допустимых вещей.

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

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

Ниже приведены несколько примеров программ, написанных на Прологе.

Привет, мир

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

Это сравнение показывает, что приглашение («?-» против «| ?-») и статус разрешения («истина» против «да», «ложь» против «нет») могут различаться в разных реализациях Prolog.

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

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

program_optimized ( Prog0 ,  Prog )  :-  проход_оптимизации_1 ( Prog0 ,  Prog1 ),  проход_оптимизации_2 ( Prog1 ,  Prog2 ),  проход_оптимизации_3 ( Prog2 ,  Prog ).

или эквивалентно с использованием нотации DCG :

программа_оптимизирована  -->  проход_оптимизации_1 ,  проход_оптимизации_2 ,  проход_оптимизации_3 .

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

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

раздел ([],  _ ,  [],  []). раздел ([ X | Xs ],  Pivot ,  Smalls ,  Bigs )  :-  (  X  @<  Pivot  ->  Smalls  =  [ X | Rest ],  раздел ( Xs ,  Pivot ,  Rest ,  Bigs )  ;  Bigs  =  [ X | Rest ],  раздел ( Xs ,  Pivot ,  Smalls ,  Rest )  ).быстрая сортировка ([])  -->  []. быстрая сортировка ([ X | Xs ])  -->  {  partition ( Xs ,  X ,  Меньше ,  Больше )  },  быстрая сортировка ( Меньше ),  [ X ],  быстрая сортировка ( Больше ).

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

Шаблон проектирования — это общее повторно используемое решение часто встречающейся проблемы в разработке программного обеспечения . Некоторые шаблоны проектирования в Prolog — это скелеты, методы, [16] [17] клише, [18] схемы программ, [19] схемы описания логики, [20] и программирование высшего порядка . [21]

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

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

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

 perfect ( N )  :-  между ( 1 ,  inf ,  N ),  U  is  N  //  2 ,  findall ( D ,  ( между ( 1 , U , D ),  N  mod  D  =:=  0 ),  Ds ),  sumlist ( Ds ,  N ).

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

В качестве другого примера предикат maplistприменяет предикат Pко всем соответствующим позициям в паре списков:

maplist ( _ ,  [],  []). maplist ( P ,  [ X | Xs ],  [ Y | Ys ])  :-  вызов ( P ,  X ,  Y ),  maplist ( P ,  Xs ,  Ys ).

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

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

Модули

Для программирования в больших масштабах Prolog предоставляет модульную систему , которая находится в стандарте ISO. [24] Однако, хотя большинство систем Prolog поддерживают структурирование кода в модули, практически ни одна реализация не придерживается модульной части стандарта ISO. Вместо этого большинство систем Prolog решили поддерживать как фактический стандарт модулей модульную систему Quintus / SICStus . Однако дополнительные удобные предикаты, касающиеся модулей, предоставляются только некоторыми реализациями и часто имеют тонкие различия в своей семантике. [25]

Некоторые системы решили реализовать концепции модулей как компиляцию «из источника в источник» в базовый ISO Prolog, как в случае Logtalk . [26] GNU Prolog изначально отклонился от модулей ISO, выбрав вместо этого контекстное логическое программирование, в котором загрузка и выгрузка единиц (модулей) может осуществляться динамически. [27] Ciao разработал строгую модульную систему, которая, будучи в основном совместимой с фактическим стандартом, используемым другими системами Prolog, поддается точному статическому анализу, поддерживает сокрытие терминов и облегчает программирование в целом. [28] XSB использует другой подход и предлагает модульную систему на основе атомов . [29] Последние две системы Prolog позволяют контролировать видимость терминов в дополнение к видимости предикатов. [25]

Разбор

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

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

Prolog — гомоиконический язык, предоставляющий множество возможностей для рефлексивного программирования (рефлексии). Его неявная стратегия выполнения позволяет написать краткий метациклический оценщик (также называемый метаинтерпретатором ) для чистого кода Prolog:

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

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

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

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

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

встроенный ( A  is  B ). встроенный ( read ( X )). % и т. д.

и предложения, представленные как clause_cf(Head, Body, Certainty). Учитывая это, его можно вызвать как solve(Goal, Certainty)для выполнения Goalи получения меры уверенности относительно результата.

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

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

Тьюринг ( Tape0 ,  Tape )  :-  выполнить ( q0 ,  [],  Ls ,  Tape0 ,  Rs ),  обратить ( Ls ,  Ls1 ),  добавить ( Ls1 ,  Rs ,  Tape ).выполнить ( qf ,  Ls ,  Ls ,  Rs ,  Rs )  :-  !. выполнить ( Q0 ,  Ls0 ,  Ls ,  Rs0 ,  Rs )  :-  символ ( Rs0 ,  Sym ,  RsRest ),  один раз ( правило ( Q0 ,  Sym ,  Q1 ,  NewSym ,  Действие )),  действие ( Действие ,  Ls0 ,  Ls1 ,  [ NewSym | RsRest ],  Rs1 ),  выполнить ( Q1 ,  Ls1 ,  Ls ,  Rs1 ,  Rs ).символ ([],  b ,  []). символ ([ Sym | Rs ],  Sym ,  Rs ).действие ( влево ,  Ls0 ,  Ls ,  Rs0 ,  Rs )  :-  влево ( Ls0 ,  Ls ,  Rs0 ,  Rs ). действие ( остаться ,  Ls ,  Ls ,  Rs ,  Rs ). действие ( вправо ,  Ls0 ,  [ Sym | Ls0 ],  [ Sym | Rs ],  Rs ).слева ([],  [],  Rs0 ,  [ b | Rs0 ]). слева ([ L | Ls ],  Ls ,  Rs ,  [ L | Rs ]).

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

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

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

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

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

Выполнение

Пролог ИСО

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

Компиляция

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

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

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

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

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

Хеширование

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

Таблица

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

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

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

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

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

В 1982 году компьютеры работали со скоростью около 10 000–100 000 LIPS [логических выводов в секунду]. FGCS планировала производить компьютеры, работающие со скоростью от 0,1 до 1 GLIPS. [50] По оценкам Института компьютерных технологий нового поколения, 1 LIP требовал около 100 операций на обычном компьютере. План состоял в том, чтобы в конце проекта (в 1992 году) создать машину с 1000 процессорами, достигающую 1 GLIPS, что подразумевает не менее 1 MLIPS на процессор. [51]

Sega реализовала Prolog для использования с Sega AI Computer, выпущенным для японского рынка в 1986 году. Prolog использовался для чтения естественного языкового ввода на японском языке с помощью сенсорной панели . [52]

Пределы

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

Программное обеспечение, разработанное на Prolog, критиковалось за высокую производительность по сравнению с традиционными языками программирования. В частности, недетерминированная стратегия оценки Prolog может быть проблематичной при программировании детерминированных вычислений или даже при использовании "безразличного недетерминизма" (когда делается единственный выбор вместо возврата ко всем возможностям). Для достижения желаемой производительности, возможно, придется использовать сокращения и другие языковые конструкции, что уничтожит одну из главных привлекательных сторон Prolog — возможность запускать программы "вперед и назад". [57]

Prolog не является чисто декларативным: из-за конструкций, таких как оператор cut , для его понимания требуется процедурное чтение программы Prolog. [58] Порядок предложений в программе Prolog имеет значение, поскольку от него зависит стратегия выполнения языка. [59] Другие языки логического программирования, такие как Datalog , являются действительно декларативными, но ограничивают язык. В результате многие практические программы Prolog написаны так, чтобы соответствовать порядку поиска в глубину Prolog , а не как чисто декларативные логические программы. [57]

Расширения

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

Типы

Prolog — нетипизированный язык. Попытки ввести и расширить Prolog с помощью типов начались в 1980-х годах, [60] [61] и продолжаются по состоянию на 2008 год . [62] Информация о типах полезна не только для безопасности типов , но и для рассуждений о программах Prolog. [63]

Режимы

Синтаксис Prolog не определяет, какие аргументы предиката являются входными, а какие — выходными. [64] Однако эта информация важна, и ее рекомендуется включать в комментарии. [65] Режимы предоставляют ценную информацию при рассуждениях о программах Prolog [63] и также могут использоваться для ускорения выполнения. [66]

Ограничения

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

Объектно-ориентированный

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

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

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

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

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

Visual Prolog — это многопарадигмальный язык с интерфейсами, классами, реализациями и объектными выражениями.

Графика

Системы Пролога, предоставляющие графическую библиотеку : SWI-Prolog , [70] Visual Prolog , WIN-PROLOG и B-Prolog .

Параллелизм

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

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

Некоторые реализации Prolog, в частности Visual Prolog , SWI-Prolog и Ciao , поддерживают серверное веб-программирование с поддержкой веб-протоколов, HTML и XML . [73] Существуют также расширения для поддержки семантических веб- форматов, таких как Resource Description Framework (RDF) и Web Ontology Language (OWL). [74] [75] Prolog также был предложен в качестве клиентского языка. [76] Кроме того, Visual Prolog поддерживает JSON-RPC и Websockets .

Adobe Flash

Cedar Архивировано 2010-10-19 в Wayback Machine — бесплатный и базовый интерпретатор Prolog. Начиная с версии 4 и выше Cedar поддерживает FCA (Flash Cedar App). Это обеспечивает новую платформу для программирования на Prolog через ActionScript .

Другой

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

Существуют фреймворки, которые могут стать связующим звеном между Prolog и другими языками:

История

Хронология ранних разработок в Prolog

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

Европейские исследователи искусственного интеллекта отдавали предпочтение Prolog, в то время как американцы отдавали предпочтение Lisp , что, как сообщается, вызвало множество националистических дебатов о достоинствах языков. [82] Большая часть современного развития Prolog произошла под влиянием проекта Fifth Generation Computer Systems (FGCS), в рамках которого была разработана версия Prolog под названием Kernel Language для своей первой операционной системы .

Первоначально Pure Prolog был ограничен использованием доказательной машины теоремы о разрешении с предложениями Хорна следующего вида:

Н :- В 1 , ..., В н .

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

чтобы показать/решить H, показать/решить B 1 и ... и B n .

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

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

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

Prolog использовался в Watson . Watson использует программное обеспечение DeepQA от IBM и фреймворк Apache UIMA (Unstructured Information Management Architecture). Система была написана на разных языках, включая Java, C++ и Prolog, и работает на операционной системе SUSE Linux Enterprise Server 11 с использованием фреймворка Apache Hadoop для обеспечения распределенных вычислений. Prolog используется для сопоставления с образцом по деревьям синтаксического анализа естественного языка. Разработчики заявили: «Нам требовался язык, на котором мы могли бы удобно выражать правила сопоставления с образцом по деревьям синтаксического анализа и другим аннотациям (например, результаты распознавания именованных сущностей), и технология, которая могла бы выполнять эти правила очень эффективно. Мы обнаружили, что Prolog был идеальным выбором для языка из-за его простоты и выразительности ». [12] Prolog используется в платформе разработки Low-Code Development Platform GeneXus , которая ориентирована на ИИ. [ требуется цитата ] База данных графов с открытым исходным кодом TerminusDB реализована в Prolog. [83] TerminusDB предназначена для совместного создания и курирования графов знаний .

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

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

Примечания

  1. ^ Терминология Пролога отличается от терминологии логики . Термин Пролога — это (в зависимости от контекста) термин или атомарная формула логики. Атом в стандартной логической терминологии означает атомарную формулу ; атом Пролога (в зависимости от контекста) — это константа, функциональный символ или предикатный символ логики.

Ссылки

  1. ^ Клоксин, Уильям Ф.; Меллиш, Кристофер С. (2003). Программирование на Прологе . Берлин; Нью-Йорк: Springer-Verlag. ISBN 978-3-540-00678-7.
  2. ^ Братко, Иван (2012). Программирование на Прологе для искусственного интеллекта (4-е изд.). Харлоу, Англия; Нью-Йорк: Addison Wesley. ISBN 978-0-321-41746-6.
  3. ^ Ковингтон, Майкл А. (1994). Обработка естественного языка для программистов на Прологе . Энглвуд Клиффс, Нью-Джерси: Prentice Hall. ISBN 978-0-13-629213-5.
  4. ^ ab Lloyd, JW (1984). Основы логического программирования . Берлин: Springer-Verlag. ISBN 978-3-540-13299-8.
  5. ^ См. Логическое программирование § История .
  6. ^ Stickel, ME (1988). «Проверка теорем на основе технологии пролога: реализация с помощью расширенного компилятора пролога». Journal of Automated Reasoning . 4 (4): 353–380. CiteSeerX 10.1.1.47.3057 . doi :10.1007/BF00297245. S2CID  14621218. 
  7. ^ Мерритт, Деннис (1989). Создание экспертных систем на Прологе . Берлин: Springer-Verlag. ISBN 978-0-387-97016-5.
  8. ^ Фелти, Эми. «Подход логического программирования к реализации переписывания терминов высшего порядка». Расширения логического программирования (1992): 135-161.
  9. ^ Кент Д. Ли (19 января 2015 г.). Основы языков программирования. Springer. С. 298–. ISBN 978-3-319-13314-0.
  10. ^ Ute Schmid (21 августа 2003 г.). Индуктивный синтез функциональных программ: универсальное планирование, сворачивание конечных программ и абстракция схемы с помощью аналоговых рассуждений. Springer Science & Business Media. ISBN 978-3-540-40174-2.
  11. ^ Фернандо К. Н. Перейра ; Стюарт М. Шибер (2005). Пролог и анализ естественного языка. Микротом.
  12. ^ ab Adam Lally; Paul Fodor (31 марта 2011 г.). "Обработка естественного языка с помощью Prolog в системе IBM Watson". Association for Logic Programming. Архивировано из оригинала 3 сентября 2014 г. Получено 13 июня 2014 г.См. также Watson (компьютер) .
  13. ^ ISO/IEC 13211-1:1995 Пролог, 6.3.7 Термины — обозначение списка в двойных кавычках. Международная организация по стандартизации , Женева.
  14. ^ Карлссон, Матс (27 мая 2014 г.). Руководство пользователя SICStus Prolog 4.3: Основная справочная документация. BoD – Книги по запросу. ISBN 978-3-7357-3744-1– через Google Книги.
  15. ^ Ковингтон, Майкл А.; Багнара, Роберто; О'Киф, Ричард А.; Вилемейкер, Ян; Прайс, Саймон (2011). «Руководство по кодированию для Пролога». Теория и практика логического программирования . 12 (6): 889–927. arXiv : 0911.2899 . doi :10.1017/S1471068411000391. S2CID  438363.
  16. ^ Киршенбаум, М.; Стерлинг, Л.С. (1993). «Применение методов к скелетонам — шаблоны для программирования на Прологе». Построение логических программ, (ред. JMJ Jacquet) . Конспект лекций по информатике / Конспект лекций по искусственному интеллекту: 27–140. CiteSeerX 10.1.1.56.7278 . 
  17. ^ Стерлинг, Леон (2002). Вычислительная логика: логическое программирование и не только . Том 2407. С. 17–26. doi :10.1007/3-540-45628-7_15. ISBN 978-3-540-43959-2.
  18. ^ Д. Баркер-Пламмер. Программирование клише в Прологе. В М. Брюйноге, редакторе, Proc. Второй семинар по метапрограммированию в логике, страницы 247--256. Кафедра вычислительной техники, Католический университет Лёвена, 1990.
  19. ^ Gegg-harrison, TS (1995). Представление схем логических программ в Prolog . Труды Двенадцатой международной конференции по логическому программированию. С. 467–481.
  20. ^ Девиль, Ив (1990). Логическое программирование: систематическая разработка программ . Уокингем, Англия: Addison-Wesley. ISBN 978-0-201-17576-9.
  21. ^ ab Naish, Lee (1996). Программирование логики высшего порядка на Прологе (Отчет). Кафедра компьютерных наук, Мельбурнский университет . CiteSeerX 10.1.1.35.4505 . 
  22. ^ "Что касается переменных Пролога, то переменные только в голове неявно универсально квантифицированы, а переменные только в теле неявно экзистенциально квантифицированы" . Получено 2013-05-04 .
  23. ^ abc ISO/IEC 13211: Информационные технологии – Языки программирования – Пролог. Международная организация по стандартизации , Женева.
  24. ^ ISO/IEC 13211-2: Модули.
  25. ^ аб Филипп Кернер; Майкл Леушел; Жоао Барбоза; Витор Сантос Коста; Вероника Даль; Мануэль В. Эрменегильдо; Хосе Ф. Моралес; Ян Вилемакер; Дэниел Диас; Сальвадор Абреу; Джованни Чиатто (ноябрь 2022 г.), «Пятьдесят лет Пролога и далее», Теория и практика логического программирования , 22 (6): 776–858, doi : 10.1017/S1471068422000102 , hdl : 10174/33387
  26. ^ ab Moura, Paulo (август 2004 г.), "Logtalk", Association of Logic Programming , 17 (3), заархивировано из оригинала 2010-04-12 , извлечено 2010-02-16
  27. ^ Абреу; Ногейра (2005), «Использование языка логического программирования с сохранением и контекстами», Lecture Notes in Artificia Intelligence , 4369
  28. ^ Кабеса; Эрменегильдо (2000), Новая модульная система для Пролога , Lecture Notes in Computer Science, т. 1861
  29. ^ Сагонас; Свифт; Уоррен (1994), «XSB как эффективный дедуктивный движок базы данных», SIGMOD
  30. ^ ab Шапиро, Эхуд Й.; Стерлинг, Леон (1994). Искусство Пролога: Продвинутые методы программирования . Кембридж, Массачусетс: MIT Press. ISBN 978-0-262-19338-2.
  31. ^ Эд-Дбали, А.; Дерансар, Пьер; Червони, Л. (1996). Пролог: стандарт: справочное руководство . Берлин: Шпрингер. ISBN 978-3-540-59304-1.
  32. ^ "ISO/IEC 13211-1:1995/Испр. 1:2007". ISO .
  33. ^ "ISO/IEC 13211-1:1995/Исп. 2:2012". ISO .
  34. ^ "ISO/IEC 13211-1:1995/Испр. 3:2017". ISO .
  35. ^ "ИСО/МЭК СТК1 ПК22 РГ17".[ постоянная мертвая ссылка ]
  36. ^ "X3J17 и Prolog Standard". Архивировано из оригинала 2009-08-23 . Получено 2009-10-02 .
  37. ^ Дэвид HD Уоррен. «Абстрактный набор инструкций Пролога». Техническое примечание 309, SRI International , Менло-Парк, Калифорния, октябрь 1983 г.
  38. ^ Ван Рой, П.; Деспейн, А. М. (1992). «Высокопроизводительное логическое программирование с компилятором Aquarius Prolog». Компьютер . 25 : 54–68. doi :10.1109/2.108055. S2CID  16447071.
  39. ^ Граф, Питер (1995). Индексация терминов . Springer. ISBN 978-3-540-61040-3.
  40. ^ Wise, Michael J.; Powers, David MW (1986). Индексирование предложений Пролога с помощью наложенных кодовых слов и слов с кодировкой полей . Международный симпозиум по логическому программированию . С. 203–210.
  41. ^ Коломб, Роберт М. (1991). «Улучшение унификации в PROLOG посредством индексации предложений». Журнал логического программирования . 10 : 23–44. doi :10.1016/0743-1066(91)90004-9.
  42. ^ Свифт, Т. (1999). «Таблицы для немонотонного программирования». Annals of Mathematics and Artificial Intelligence . 25 (3/4): 201–240. doi :10.1023/A:1018990308362. S2CID  16695800.
  43. ^ Чжоу, Нэн-Фа; Сато, Тайсуке (2003). «Эффективное вычисление фиксированной точки в линейном табулировании» (PDF) . Труды 5-й Международной конференции ACM SIGPLAN по принципам и практике декларативного программирования : 275–283.
  44. ^ Swift, T.; Warren, DS (2011). «XSB: Расширение Пролога с помощью табличного логического программирования». Теория и практика логического программирования . 12 (1–2): 157–187. arXiv : 1012.5123 . doi :10.1017/S1471068411000500. S2CID  6153112.
  45. ^ Абэ, С.; Бандо, Т.; Ямагучи, С.; Куросава, К.; Кирияма, К. (1987). "Высокопроизводительный интегрированный процессор Пролога IPP". Труды 14-го ежегодного международного симпозиума по архитектуре компьютеров - ISCA '87 . стр. 100. doi :10.1145/30350.30362. ISBN 978-0-8186-0776-9. S2CID  10283148.
  46. ^ Робинсон, Ян (1986). Процессор Пролога на основе запоминающего устройства сопоставления с образцом . Третья международная конференция по логическому программированию. Конспект лекций по информатике. Том 225. Springer. С. 172–179. doi :10.1007/3-540-16492-8_73. ISBN 978-3-540-16492-0.
  47. ^ Таки, К.; Накадзима, К.; Накашима, Х.; Икеда, М. (1987). «Оценка производительности и архитектуры машины PSI». ACM SIGPLAN Notices . 22 (10): 128. doi : 10.1145/36205.36195 .
  48. ^ Гупта, Г.; Понтелли, Э.; Али, К. А. М.; Карлссон, М.; Херменегильдо, М. В. (2001). «Параллельное выполнение программ на прологе: обзор». Труды ACM по языкам и системам программирования . 23 (4): 472. doi : 10.1145/504083.504085 . S2CID  2978041.
  49. ^ «Статически распределенные системы».
  50. ^ Bramer, MA; Bramer, Dawn (1984). Пятое поколение: аннотированная библиография. Wokingham, England; Reading, Mass: Addison-Wesley. стр. 6. ISBN 978-0-201-14427-7.
  51. ^ Фейгенбаум, Эдвард; Шробе, Говард (1993-07-01). «Японский национальный проект пятого поколения: введение, обзор и оценка». Future Generation Computer Systems . Конференция FGCS. 9 (2): 105–117. doi :10.1016/0167-739X(93)90003-8. ISSN  0167-739X.
  52. ^ «Программное обеспечение, которое относится к играм серьезно». New Scientist . Reed Business Information . 26 марта 1987 г. стр. 34 – через Google Books .[ постоянная мертвая ссылка ]
  53. ^ "Компьютерные науки - Языки программирования, синтаксис, алгоритмы | Britannica". www.britannica.com . Получено 2023-07-12 .
  54. ^ ab Логическое программирование для реального мира. Золтан Шомоди, Фергус Хендерсон, Томас Конвей, Ричард О'Киф. Труды семинара ILPS'95 Postconference Workshop on Visions for the Future of Logic Programming.
  55. ^ "FAQ: Prolog Resource Guide 1/2 [Ежемесячная публикация] Раздел - [1-8] База данных Prolog 1000". Faqs.org .
  56. ^ Ян Вилемейкер и Витор Сантос Коста: Переносимость программ на Прологе: теория и практические примеры. Семинар CICLOPS-WLPE 2010. Архивировано 16 июля 2010 г. на Wayback Machine .
  57. ^ ab Киселёв, Олег; Камеяма, Юкиёси (2014). Переосмысление Пролога. Труды 31-го заседания Японского общества по программной науке и технологиям.
  58. ^ Франзен, Торкель (1994), «Декларативный против процедурного», Ассоциация логического программирования , 7 (3)
  59. ^ Данцин, Евгений; Эйтер, Томас; Готтлоб, Георг; Воронков, Андрей (2001). «Сложность и выразительная сила логического программирования». ACM Computing Surveys . 33 (3): 374–425. CiteSeerX 10.1.1.616.6372 . doi :10.1145/502807.502810. S2CID  518049. 
  60. ^ Майкрофт, А.; О'Киф, Р.А. (1984). «Полиморфная система типов для пролога». Искусственный интеллект . 23 (3): 295. doi :10.1016/0004-3702(84)90017-1.
  61. ^ Пфеннинг, Фрэнк (1992). Типы в логическом программировании . Кембридж, Массачусетс: MIT Press. ISBN 978-0-262-16131-2.
  62. ^ Шрийверс, Том; Сантос Коста, Витор; Вилемакер, Ян; Демоэн, Барт (2008). «На пути к типизированному Прологу». В Марии Гарсиа де ла Банда ; Энрико Понтелли (ред.). Логическое программирование: 24-я международная конференция ICLP 2008, Удине, Италия, 9-13 декабря 2008 г.: материалы . Конспекты лекций по информатике. Том. 5366. стр. 693–697. дои : 10.1007/978-3-540-89982-2_59. ISBN 978-3-540-89982-2.
  63. ^ ab Apt, KR; Marchiori, E. (1994). "Рассуждения о программах на Прологе: от режимов через типы к утверждениям". Formal Aspects of Computing . 6 (S1): 743. CiteSeerX 10.1.1.57.395 . doi :10.1007/BF01213601. S2CID  12235465. 
  64. ^ О'Киф, Ричард А. (1990). Искусство Пролога . Кембридж, Массачусетс: MIT Press. ISBN 978-0-262-15039-2.
  65. ^ Ковингтон, Майкл; Багнара, Роберто; и др. (2010). «Руководство по кодированию для Пролога». arXiv : 0911.2899 [cs.PL].
  66. ^ Рой, П.; Демоен, Б.; Виллемс, Й.Д. (1987). «Улучшение скорости выполнения скомпилированного Пролога с помощью режимов, выбора предложений и детерминизма». Tapsoft '87 . Lecture Notes in Computer Science. Vol. 250. pp. 111. doi :10.1007/BFb0014976. ISBN 978-3-540-17611-4.
  67. ^ Джаффар, Дж. (1994). «Программирование логики ограничений: обзор». Журнал логического программирования . 19–20: 503–581. doi : 10.1016/0743-1066(94)90033-7 .
  68. ^ Колмерауэр, Ален (1987). «Открытие Вселенной Пролога III». Байт . Август.
  69. ^ Уоллес, М. (2002). "Constraint Logic Programming". Computational Logic: Logic Programming and Beyond . Lecture Notes in Computer Science. Vol. 2407. pp. 512–556. doi :10.1007/3-540-45628-7_19. ISBN 978-3-540-45628-5.
  70. ^ "XPCE: собственная библиотека графического интерфейса SWI-Prolog". swi-prolog.org .
  71. ^ "prolog-mpi". Apps.lumii.lv . Получено 2010-09-16 .
  72. ^ Эхуд Шапиро. Семейство языков параллельного логического программирования ACM Computing Surveys . Сентябрь 1989 г.
  73. ^ Wielemaker, J.; Huang, Z.; Van Der Meij, L. (2008). "SWI-Prolog и веб" (PDF) . Теория и практика логического программирования . 8 (3): 363. doi :10.1017/S1471068407003237. S2CID  5404048.
  74. ^ Wielemaker, Jan; Hildebrand, Michiel; van Ossenbruggen, Jacco (2007), Heymans, S.; Polleres, A.; Ruckhaus, E.; Pearse, D.; Gupta, G. (ред.), «Использование {Prolog} в качестве основы для приложений в семантической паутине» (PDF) , Труды 2-го семинара по приложениям логического программирования и в Интернете, семантической паутине и службах семантической паутины , Труды семинара CEUR, т. 287, Порту, Португалия: CEUR-WS.org, стр. 84–98
  75. ^ Обработка онтологий OWL2 с использованием Thea: применение логического программирования. Вангелис Вассилиадис, Ян Вилемейкер и Крис Мангалл. Труды 5-го международного семинара по OWL: опыт и направления (OWLED 2009), Шантильи, Вирджиния, США, 23–24 октября 2009 г.
  76. ^ Loke, SW; Davison, A. (2001). «Безопасный мобильный код на основе Пролога». Теория и практика логического программирования . 1 (3): 321. arXiv : cs/0406012 . CiteSeerX 10.1.1.58.6610 . doi :10.1017/S1471068401001211. S2CID  11754347. 
  77. ^ Андерсен, К. и Свифт, Т., 2023. Система Януса: мост к новым приложениям пролога. В Prolog: The Next 50 Years (стр. 93-104). Cham: Springer Nature Switzerland.
  78. ^ Колмерауэр, А. и Руссель, П., 1996. Рождение Пролога. В Истории языков программирования --- II (стр. 331-367).
  79. ^ Ковальски, РА (1988). "Ранние годы логического программирования" (PDF) . Сообщения ACM . 31 : 38. doi :10.1145/35043.35046. S2CID  12259230.
  80. ^ Колмерауэр, А.; Руссель, П. (1993). «Рождение Пролога» (PDF) . Уведомления ACM SIGPLAN . 28 (3): 37. doi :10.1145/155360.155362.
  81. ^ "Пролог: краткая история" . Получено 21 ноября 2021 г. .
  82. ^ Pountain, Dick (октябрь 1984). "POP and SNAP". Byte . стр. 381. Получено 23 октября 2013 .
  83. ^ terminusdb/terminusdb, TerminusDB, 2020-12-13 , получено 2020-12-15

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