Пролог
Парадигма | Логика |
---|---|
Разработано | Ален Кольмерауэр |
Впервые появился | 1972 год |
Стабильная версия | Часть 1: General core-Edition 1 (июнь 1995 г.; ) Часть 2: Модули, издание 1 (июнь 2000 г.; ) |
Дисциплина набора текста | Нетипизированный (единственный тип данных — «термин») |
Расширения имен файлов | .pl , .pro , .P |
Веб-сайт | Часть 1: www. Часть 2: www. |
Основные реализации | |
Амзи! Пролог , B-Prolog , Ciao , ECLiPSe , GNU Prolog , LPA Prolog , Poplog , P# , Quintus Prolog , Scryer Prolog , SICStus , Strawberry , SWI-Prolog , Tau Prolog , tuProlog , WIN-PROLOG XSB , YAP . | |
Диалекты | |
ISO Пролог , Эдинбургский Пролог | |
Под влиянием | |
Планировщик | |
Под влиянием | |
CHR , Clojure , Datalog , Erlang , Epilog , KL0 , KL1 , Logtalk , Mercury , Oz , Strand , Visual Prolog | |
|
Пролог — это язык логического программирования , возникший в области искусственного интеллекта , автоматического доказательства теорем и компьютерной лингвистики . [1] [2] [3]
Пролог уходит своими корнями в логику первого порядка , формальную логику , и в отличие от многих других языков программирования , Пролог задуман в первую очередь как декларативный язык программирования : программа представляет собой набор фактов и правил , которые определяют отношения . Вычисление . инициируется запуском запроса к программе [4]
Пролог был одним из первых языков логического программирования. [5] и сегодня остается самым популярным подобным языком, имея несколько бесплатных и коммерческих реализаций. Этот язык использовался для доказательства теорем . [6] экспертные системы , [7] переписывание терминов , [8] системы типов , [9] и автоматизированное планирование , [10] а также его первоначальная предполагаемая область использования, обработка естественного языка . [11] [12]
Пролог — это полный по Тьюрингу язык программирования общего назначения, который хорошо подходит для приложений интеллектуальной обработки знаний.
Синтаксис и семантика [ править ]
В Прологе логика программы выражается в терминах отношений, и вычисления инициируются путем выполнения запроса по этим отношениям. Отношения и запросы строятся с использованием единственного типа данных Пролога — термина . [4] Отношения определяются пунктами . По заданному запросу механизм Пролога пытается найти решение , опровергающее отрицательный запрос. Если отрицательный запрос может быть опровергнут, т. е. найдена реализация для всех свободных переменных, которая делает объединение предложений и одноэлементное множество, состоящее из отрицаемого запроса, ложным, из этого следует, что исходный запрос с примененным найденным экземпляром является логическое следствие программы. Это делает Пролог (и другие языки логического программирования) особенно полезными для баз данных, символьной математики и приложений синтаксического анализа языков. Поскольку Пролог допускает нечистые предикаты , проверка истинного значения некоторых специальных предикатов может иметь некоторый преднамеренный побочный эффект , например вывод значения на экран. По этой причине программисту разрешено использовать некоторое количество традиционного императивного программирования , когда логическая парадигма неудобна. Он имеет чисто логическое подмножество, называемое «чистым Прологом», а также ряд экстралогических особенностей.
Типы данных [ править ]
Пролога Единственным типом данных является термин . Термины — это атомы , числа , переменные или составные термины . [примечание 1]
- Атом — это имя символа , начинающееся со строчной буквы или заключенное в кавычки. Примеры атомов включают
x
,red
,'Taco'
,'some atom'
, и'p(a)'
. - Числа могут быть числами с плавающей запятой или целыми числами . Большинство основных систем Пролога поддерживают целые числа произвольной длины.
- Переменные обозначаются строкой, состоящей из букв, цифр и символов подчеркивания и начинающейся с заглавной буквы или подчеркивания. Переменные очень похожи на переменные в логике, поскольку они являются заполнителями для произвольных терминов.
- Составной терм состоит из атома, называемого «функтором», и ряда «аргументов», которые также являются термами. Составные термины обычно записываются в виде функтора, за которым следует список терминов-аргументов, разделенных запятыми, который содержится в круглых скобках. терма Количество аргументов называется арностью . Атом можно рассматривать как составной термин с нулевой арностью . Примером сложного термина является
person_friends(zelda,[tom,jim])
.
Особые случаи сложных терминов:
- Список — это упорядоченный набор терминов. Он обозначается квадратными скобками с терминами, разделенными запятыми, или, в случае пустого списка,
[]
. Например,[1,2,3,4]
или[red,green,blue]
. - Строки : последовательность символов, заключенная в кавычки, эквивалентна списку (числовых) кодов символов, списку символов (атомов длины 1) или атому в зависимости от значения флага Пролога.
double_quotes
. Например,"to be, or not to be"
. [13]
Правила и факты [ править ]
Программы на Прологе описывают отношения, определяемые посредством предложений. Чистый Пролог ограничен предложениями Horn . Для определения программ Пролога используются два типа предложений Хорна: факты и правила. Правило имеет вид
Голова : - Тело .
и читается как «Голова верна, если Тело истинно». правила Тело правила состоит из вызовов предикатов, которые называются целями . Встроенный логический оператор ,/2
арности 2 (имеется в виду оператор с именем ,
) обозначает соединение целей, а ;/2
обозначает дизъюнкцию . Союзы и дизъюнкции могут появляться только в теле, а не в начале правила.
Предложения с пустым телом называются фактами . Пример факта:
человек ( Сократ ).
что эквивалентно правилу:
человек ( сократ ) :- правда .
Встроенный предикат true/0
всегда верно.
Учитывая вышеизложенный факт, можно спросить:
Сократ человек?
?- человек ( Сократ ).
Да
что такое люди?
?- человек ( Х ).
Х = Сократ
Предложения с телом называются правилами . Пример правила:
смертный ( 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
). По этой причине для многих программ на Прологе достаточно сравнительно небольшого набора библиотечных предикатов.
В качестве языка общего назначения Пролог также предоставляет различные встроенные предикаты для выполнения рутинных действий, таких как ввод/вывод , использование графики и иное взаимодействие с операционной системой. Этим предикатам не придается реляционного значения, и они полезны только для побочных эффектов, которые они оказывают на систему. Например, предикат write/1
отображает термин на экране.
Циклы и рекурсия [ править ]
Итерационные алгоритмы могут быть реализованы с помощью рекурсивных предикатов. [14]
Рассмотрим parent_child/2
предикат, определенный в программе семейных отношений выше. Следующая программа на Прологе определяет отношение предка :
предок ( X , Y ) : - родительский_ребенок ( X , Y ).
предок ( X , Y ) :- родитель_ребенок ( X , Z ), предок ( Z , Y ).
Он выражает, что X является предком Y, если X является родителем Y или X является родителем предка Y. Он рекурсивен, поскольку определяется в терминах самого себя (существует вызов предиката ancestor/2
в тексте второго пункта).
Исполнение [ править ]
Выполнение программы на Прологе инициируется сообщением пользователем единственной цели, называемой запросом. Логично, что движок Пролога пытается найти решение , опровергающее отрицательный запрос. Метод разрешения, используемый Прологом, называется разрешением SLD . Если отрицательный запрос можно опровергнуть, из этого следует, что запрос с соответствующими привязками переменных является логическим следствием программы. В этом случае пользователю сообщается обо всех сгенерированных привязках переменных, и считается, что запрос выполнен успешно. С функциональной точки зрения стратегию выполнения Пролога можно рассматривать как обобщение вызовов функций в других языках, единственное отличие состоит в том, что одному вызову может соответствовать несколько заголовков предложений. В этом случае система создает точку выбора, объединяет цель с заголовком предложения первой альтернативы и продолжает работу над целями этой первой альтернативы. Если какая-либо цель не удалась в ходе выполнения программы, все привязки переменных, которые были сделаны с момента создания самой последней точки выбора, отменяются, и выполнение продолжается со следующей альтернативой этой точки выбора. Такая стратегия исполнения называется хронологической. обратный путь . Например, с учетом программы семейных отношений, определенной выше, следующий запрос будет оценен как true:
?- брат ( Салли , Эрика ).
Да
Это достигается следующим образом: изначально единственный совпадающий заголовок предложения для запроса 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)
. Опять же, это можно доказать соответствующим фактом. Поскольку все цели могут быть доказаны, запрос завершается успешно. Поскольку запрос не содержал переменных, пользователю не сообщается ни о каких привязках. Запрос с переменными, например:
?- отец_ребенок ( Отец , Ребенок ).
перечисляет все действительные ответы при возврате.
Обратите внимание, что в приведенном выше коде запрос ?- sibling(sally, sally).
также преуспевает. При желании можно было бы добавить дополнительные цели для описания соответствующих ограничений.
Отрицание [ править ]
Встроенный предикат Пролога \+/1
предоставляет отрицание как отказ , что позволяет проводить немонотонные рассуждения. Цель \+ illegal(X)
в правиле
законно ( X ) :- \+ незаконно ( X ).
оценивается следующим образом: Пролог пытается доказать illegal(X)
. Если доказательство этой цели может быть найдено, первоначальная цель (т. е. \+ illegal(X)
) терпит неудачу. Если доказательств не найдено, первоначальная цель достигнута. Следовательно \+/1
префиксный оператор называется «недоказуемым» оператором, поскольку запрос ?- \+ Goal.
успешна, если цель недоказуема. Этот вид отрицания является правильным, если его аргумент «основной» (т. е. не содержит переменных). Разумность теряется, если аргумент содержит переменные и процедура доказательства завершена. В частности, запрос ?- legal(X).
теперь нельзя использовать для перечисления всего, что является законным.
Программирование на Прологе [ править ]
В Прологе загрузка кода называется консультацией . Пролог можно использовать в интерактивном режиме, вводя запросы в командной строке Пролога. ?-
. Если решения нет, Пролог пишет no
. Если решение существует, оно выводится на печать. Если для запроса существует несколько решений, их можно запросить, введя точку с запятой. ;
. Существуют рекомендации по хорошей практике программирования, позволяющие повысить эффективность, читаемость и удобство обслуживания кода. [15]
Ниже приведены примеры программ, написанных на Прологе.
Привет, мир [ править ]
Пример базового запроса на нескольких популярных диалектах Пролога:
SWI-Пролог | GNU Пролог |
---|---|
?- напишите ( «Привет, мир!» ), nl .
Привет, мир !
истинный .
?-
|
| ?- напишите ( «Привет, мир!» ), nl .
Привет, мир !
да
| ?-
|
Это сравнение показывает, что приглашение («?-» vs «| ?-») и статус разрешения («истина» vs «да», «ложь» vs «нет») могут отличаться от одной реализации Пролога к другой.
Оптимизация компилятора [ править ]
Любое вычисление может быть выражено декларативно как последовательность переходов состояний. Например, оптимизирующий компилятор с тремя проходами оптимизации может быть реализован как связь между исходной программой и ее оптимизированной формой:
program_optimized ( Prog0 , Prog ) : -
оптимизация_pass_1 ( Prog0 , Prog1 ),
оптимизация_pass_2 ( Prog1 , Prog2 ),
оптимизация_pass_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 ]) -->
{ раздел ( Xs , X , Меньше , Больше ) } ,
быстрая сортировка ( Меньше ), [ X ], быстрая сортировка ( Больше ).
Пролога Шаблоны проектирования
Шаблон проектирования — это общее многократно используемое решение часто встречающейся проблемы при проектировании программного обеспечения . Некоторые шаблоны проектирования в Прологе представляют собой скелеты, методы, [16] [17] клише, [18] диаграммы программ [19] схемы логического описания, [20] и программирование высшего порядка . [21]
Программирование высшего порядка [ править ]
Предикат более высокого порядка — это предикат, который принимает в качестве аргументов один или несколько других предикатов. Хотя поддержка программирования высшего порядка выводит Пролог за пределы области логики первого порядка, которая не позволяет количественно оценивать предикаты, [22] ISO Prolog теперь имеет несколько встроенных предикатов более высокого порядка, таких как call/1
, call/2
, call/3
, findall/3
, setof/3
, и bagof/3
. [23] Более того, поскольку произвольные цели Пролога могут быть созданы и оценены во время выполнения, легко писать предикаты более высокого порядка, такие как maplist/2
, который применяет произвольный предикат к каждому члену данного списка и sublist/3
, который фильтрует элементы, удовлетворяющие заданному предикату, а также допускает каррирование . [21]
Для преобразования решений из временного представления (замены ответов при возврате) в пространственное представление (термины) в Прологе имеются различные предикаты всех решений, которые собирают в список все замены ответов данного запроса. Это можно использовать для понимания списка . Например, совершенные числа равны сумме своих собственных делителей:
Perfect ( N ) :-
между ( 1 , inf , N ), U равно N // 2 ,
findall ( D , ( между ( 1 , U , D ), N mod D =:= 0 ), Ds ),
sumlist ( Дс , Н ).
Это можно использовать для перечисления совершенных чисел и для проверки того, является ли число совершенным.
Другой пример: предикат maplist
применяет предикат P
ко всем соответствующим позициям в паре списков:
список карт ( _ , [], []).
список карт ( P , [ X | Xs ], [ Y | Ys ]) : -
вызов ( P , X , Y ),
список карт ( P , Xs , Ys ).
Когда P
это предикат, который для всех X
, P(X,Y)
объединяет Y
с одним уникальным значением, maplist(P, Xs, Ys)
эквивалентно применению функции карты в функциональном программировании как Ys = map(Function, Xs)
.
Стиль программирования высшего порядка на Прологе был впервые использован в HiLog и λProlog .
Модули [ править ]
Для программирования в целом Пролог предоставляет систему модулей , соответствующую стандарту ISO. [24] Однако, хотя большинство систем Пролога поддерживают структурирование кода по модулям, практически ни одна реализация не соответствует модулям, являющимся частью стандарта ISO. Вместо этого большинство систем Пролога решили поддерживать в качестве де-факто стандарта модульную систему Quintus / SICStus . Однако дополнительные предикаты удобства, касающиеся модулей, предоставляются только некоторыми реализациями и часто имеют небольшие различия в своей семантике. [25]
Некоторые системы решили реализовать концепцию модуля в виде компиляции из исходного кода в базовый ISO Prolog, как в случае с Logtalk . [26] GNU Prolog изначально отказался от модулей ISO, выбрав вместо этого контекстное логическое программирование , в котором загрузка и выгрузка модуля (модуля) может выполняться динамически. [27] Чао разработал строгую систему модулей, которая, будучи в основном совместимой со стандартом де-факто, используемым другими системами Пролога, поддается точному статическому анализу, поддерживает сокрытие терминов и облегчает программирование в целом. [28] XSB использует другой подход и предлагает систему модулей на основе атомов . [29] Последние две системы Пролога позволяют контролировать терминов . видимость не только предикатов, но и [30]
Разбор [ править ]
Существует специальная нотация, называемая грамматиками определенного предложения (DCG). Правило, определенное через -->/2
вместо :-/2
расширяется препроцессором ( expand_term/2
, средство, аналогичное макросам в других языках) в соответствии с несколькими простыми правилами переписывания, в результате чего получаются обычные предложения Пролога. В частности, перезапись снабжает предикат двумя дополнительными аргументами, которые можно использовать для неявного связывания состояния: [ нужны разъяснения ] аналогично монадам в других языках. DCG часто используются для написания анализаторов или генераторов списков, поскольку они также предоставляют удобный интерфейс для списков различий.
Метаинтерпретаторы и рефлексия [ править ]
Пролог является гомоиконным языком и предоставляет множество возможностей для рефлексивного программирования (рефлексии). Его стратегия неявного выполнения позволяет написать краткий метациклический вычислитель (также называемый метаинтерпретатором ) для чистого кода Пролога:
решить ( верно ).
решить (( Подцель1 , Подцель2 )) :-
решить ( Подцель1 ),
решить ( Подцель2 ).
решить ( Глава ) :-
предложение ( Глава , Тело ),
решить ( Тело ).
где true
представляет собой пустой союз, и clause(Head, Body)
унифицируется с предложениями в базе данных формы Head :- Body
.
Поскольку программы Пролога сами по себе являются последовательностями терминов Пролога ( :-/2
— инфиксный оператор ), которые легко читаются и проверяются с помощью встроенных механизмов (например, read/1
), можно писать собственные интерпретаторы, которые дополняют Пролог специфичными для предметной области функциями. Например, Стерлинг и Шапиро представляют метаинтерпретатор, который выполняет рассуждения с неопределенностью, воспроизведенный здесь с небольшими изменениями: [31] : 330
решить ( верно , 1 ) :- !.
решить (( Подцель1 , Подцель2 ), Определенность : -
!,
решить ( Подцель1 , Определенность1 ),
решить ( Подцель2 , Определенность2 ),
Определенность минимальна ( , Определенность1 ) Определенность2 .
решить ( Цель , 1 ) :-
встроенный ( Цель ), !,
Цель .
решить ( Глава , Уверенность ) :-
section_cf ( Глава , Тело , Уверенность1 ),
решить ( Тело , Уверенность2 ),
Определенность есть Уверенность1 * Уверенность2 .
Этот интерпретатор использует таблицу встроенных предикатов Пролога в форме [31] : 327
встроенный ( A есть B ).
встроенный ( читай ( 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 , Action )),
действие ( Action , 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 ).
Ц знак равно [ 1 , 1 , 1 , 1 ] ;
Это иллюстрирует, как любое вычисление может быть выражено декларативно как последовательность переходов состояний, реализованных в Прологе как отношение между последовательными интересующими состояниями.
Реализация [ править ]
Пролог ISO [ править ]
Prolog Международной организации по стандартизации (ISO) Технический стандарт состоит из двух частей. ИСО/МЭК 13211-1, [23] [32] опубликованный в 1995 году, он направлен на стандартизацию существующих практик многих реализаций основных элементов Пролога. Он прояснил аспекты языка, которые ранее были неоднозначными, и привел к созданию переносимых программ. Есть три исправления: Кор.1:2007, [33] Кор.2:2012, [34] и Кор.3:2017. [35] ИСО/МЭК 13211-2, [23] опубликованный в 2000 году, добавляет в стандарт поддержку модулей. Стандарт поддерживается ISO/IEC JTC1 / SC22 /WG17. [36] рабочая группа. ANSI X3J17 — это Техническая консультативная группа США по этому стандарту. [37]
Сборник [ править ]
(WAM) на основе регистров . абстрактной машины Уоррена Для повышения эффективности код Пролога обычно компилируется в абстрактный машинный код, на который часто влияет набор команд [38] Некоторые реализации используют абстрактную интерпретацию для получения информации о типе и режиме предикатов во время компиляции или компиляции в реальный машинный код для повышения производительности. [39] Разработка эффективных методов реализации кода Пролога является областью активных исследований в сообществе логического программирования, и в некоторых реализациях используются различные другие методы выполнения. К ним относятся бинаризация предложений и виртуальные машины на основе стека . [ нужна цитата ]
Хвостовая рекурсия [ править ]
Системы Пролога обычно реализуют хорошо известный метод оптимизации, называемый оптимизацией хвостового вызова (TCO), для детерминированных предикатов, демонстрирующих хвостовую рекурсию или, в более общем плане, хвостовые вызовы: кадр стека предложения отбрасывается перед выполнением вызова в хвостовой позиции. Таким образом, детерминированные предикаты хвостовой рекурсии выполняются с постоянным пространством стека, как циклы в других языках.
Индексация терминов [ править ]
Поиск предложений, которые можно объединить с термином в запросе, линеен по количеству предложений. Индексирование терминов использует структуру данных , которая обеспечивает поиск в сублинейном времени . [40] Индексирование влияет только на производительность программы и не влияет на семантику. Большинство Прологов используют индексацию только первого термина, поскольку индексирование всех терминов является дорогостоящим, но методы, основанные на словах, закодированных в полях , или наложенных кодовых словах, обеспечивают быструю индексацию по всему запросу и заголовку. [41] [42]
Хеширование [ править ]
Некоторые системы Пролога, такие как WIN-PROLOG и SWI-Prolog, теперь реализуют хеширование, чтобы помочь более эффективно обрабатывать большие наборы данных. Это имеет тенденцию давать очень большой прирост производительности при работе с большими корпусами, такими как WordNet .
Таблица [ править ]
Некоторые системы Пролога ( B-Prolog , XSB , SWI-Prolog , YAP и Ciao ) реализуют метод запоминания , называемый табличным , который освобождает пользователя от необходимости вручную сохранять промежуточные результаты. Таблизация — это компромисс между пространством и временем ; время выполнения можно сократить, используя больше памяти для хранения промежуточных результатов: [43] [44]
Подцели, встречающиеся при оценке запроса, сохраняются в таблице вместе с ответами на эти подцели. Если подцель встречается повторно, при оценке повторно используется информация из таблицы, а не повторно выполняется разрешение пунктов программы. [45]
Таблица может быть расширена в различных направлениях. Он может поддерживать рекурсивные предикаты посредством разрешения SLG или линейного табличного представления. В многопоточной системе Пролога результаты табличного представления могут оставаться конфиденциальными для потока или совместно использоваться всеми потоками. А при поэтапном составлении таблиц составление таблиц может реагировать на изменения.
Аппаратная реализация [ править ]
В ходе проекта «Компьютерные системы пятого поколения» предпринимались попытки реализовать Пролог на аппаратном уровне с целью добиться более быстрого выполнения с помощью специализированных архитектур. [46] [47] [48] Более того, Пролог имеет ряд свойств, которые позволяют ускорить выполнение за счет параллельного выполнения. [49] Более поздний подход заключался в компиляции ограниченных программ на Прологе в программируемую вентильную матрицу . [50] Однако быстрый прогресс в аппаратном обеспечении общего назначения постоянно опережает развитие более специализированных архитектур.
Sega реализовала Prolog для использования с Sega AI Computer, выпущенным для японского рынка в 1986 году. Prolog использовался для чтения ввода на естественном языке на японском языке через сенсорную панель . [51]
Ограничения [ править ]
Хотя Пролог широко используется в исследованиях и образовании, [52] Пролог и другие языки логического программирования не оказали существенного влияния на компьютерную индустрию в целом. [53] Большинство приложений невелики по промышленным стандартам, и лишь немногие из них превышают 100 000 строк кода. [53] [54] Программирование в целом считается сложным, поскольку не все компиляторы Пролога поддерживают модули, и существуют проблемы совместимости между системами модулей основных компиляторов Пролога. [26] Переносимость кода Пролога между реализациями также была проблемой, но события, произошедшие с 2007 года, означали: «переносимость внутри семейства реализаций Пролога, производных от Эдинбурга/Квинтуса, достаточно хороша, чтобы обеспечить поддержку переносимых реальных приложений». [55]
Программное обеспечение, разработанное на Прологе, подвергалось критике за высокие потери производительности по сравнению с традиционными языками программирования. В частности, стратегия недетерминированного вычисления Пролога может быть проблематичной при программировании детерминированных вычислений или даже при использовании «не заботящегося о недетерминизме» (когда делается единственный выбор вместо возврата ко всем возможностям). Для достижения желаемой производительности, возможно, придется использовать сокращения и другие языковые конструкции, разрушая одну из главных достопримечательностей Пролога - возможность запускать программы «назад и вперед». [56]
Пролог не является чисто декларативным: из-за таких конструкций, как оператор вырезания , для его понимания необходимо процедурное чтение программы Пролога. [57] Порядок предложений в программе на Прологе важен, поскольку от него зависит стратегия выполнения языка. [58] Другие языки логического программирования, такие как Datalog , действительно декларативны, но ограничивают язык. В результате многие практические программы на Прологе написаны в соответствии с порядком поиска в глубину Пролога , а не как чисто декларативные логические программы. [56]
Расширения [ править ]
На основе Пролога были разработаны различные реализации, расширяющие возможности логического программирования во многих направлениях. К ним относятся типы , режимы, логическое программирование с ограничениями (CLP), объектно-ориентированное логическое программирование (OOLP), параллелизм, линейная логика (LLP), и логического программирования высшего порядка возможности функционального логического программирования , а также совместимость с базами знаний :
Типы [ править ]
Пролог — нетипизированный язык. Попытки ввести и расширить Пролог типами начались в 1980-х годах. [59] [60] и продолжится с 2008 г. [update]. [61] Информация о типах полезна не только для обеспечения безопасности типов , но и для рассуждений о программах на Прологе. [62]
Режимы [ править ]
Спецификатор режима | Интерпретация |
---|---|
+
|
nonvar при входе
|
-
|
var при входе
|
?
|
Не указан |
Синтаксис Пролога не определяет, какие аргументы предиката являются входными, а какие выходными. [63] Однако эта информация существенна, и ее рекомендуется включить в комментарии. [64] Режимы предоставляют ценную информацию при обсуждении программ на Прологе. [62] а также может использоваться для ускорения выполнения. [65]
Ограничения [ править ]
Программирование логики ограничений расширяет Пролог, включив в него концепции удовлетворения ограничений . [66] [67] Программа логики ограничений допускает ограничения в теле предложений, например: A(X,Y) :- X+Y>0.
Он подходит для крупномасштабных комбинаторной оптимизации . задач [68] и, таким образом, полезен для приложений в промышленных условиях, таких как автоматическое составление расписаний и планирование производства . Большинство систем Пролога поставляются по крайней мере с одним решателем ограничений для конечных областей, а часто также с решателями для других областей, таких как рациональные числа .
Объектная ориентация [ править ]
Flora-2 — это объектно-ориентированная система представления знаний и рассуждений, основанная на F-логике и включающая в себя HiLog , транзакционную логику и отменяемое рассуждение .
Logtalk — это объектно-ориентированный язык логического программирования, который может использовать большинство реализаций Пролога в качестве внутреннего компилятора. Будучи мультипарадигмальным языком, он включает поддержку как прототипов, так и классов.
Oblog — это небольшое портативное объектно-ориентированное расширение Пролога, созданное Маргарет МакДугалл из EdCAAD, Эдинбургский университет.
Objlog — это фреймовый язык, сочетающий объекты и Prolog II от CNRS, Марсель, Франция.
Prolog++ был разработан компанией Logic Programming Associates и впервые выпущен в 1989 году для ПК с MS-DOS. Была добавлена поддержка других платформ, и в 1995 году была выпущена вторая версия. Книга Криса Мосса о Прологе++ была опубликована издательством Addison-Wesley в 1994 году.
Visual Prolog — это мультипарадигмальный язык с интерфейсами, классами, реализациями и объектными выражениями.
Графика [ править ]
Системы Пролога, предоставляющие графическую библиотеку , — это SWI-Prolog . [69] Visual Prolog , WIN-PROLOG и B-Prolog .
Параллельность [ править ]
с открытым исходным кодом Prolog-MPI — это расширение SWI-Prolog для распределенных вычислений через интерфейс передачи сообщений . [70] Также существуют различные параллельные языки программирования Пролог. [71]
Веб-программирование [ править ]
Некоторые реализации Пролога, особенно Visual Prolog , SWI-Prolog и Ciao , поддерживают на стороне сервера веб-программирование с поддержкой веб-протоколов HTML и XML . [72] Существуют также расширения для поддержки форматов семантической сети , такие как платформа описания ресурсов (RDF) и язык веб-онтологии (OWL). [73] [74] Пролог также предлагался в качестве языка клиентской стороны . [75] Кроме того, Visual Prolog поддерживает JSON-RPC и Websockets .
Adobe Flash [ править ]
Cedar. Архивировано 19 октября 2010 г. на Wayback Machine. Это бесплатный базовый интерпретатор Пролога. Начиная с версии 4 и выше, Cedar имеет поддержку FCA (Flash Cedar App). Это обеспечивает новую платформу для программирования на Прологе с помощью ActionScript .
Другое [ править ]
- F-logic расширяет Пролог фреймами/объектами для представления знаний .
- Логика транзакций расширяет Пролог логической теорией операторов обновления, изменяющих состояние. Он имеет как теоретико-модельную, так и процедурную семантику.
- OW Prolog был создан, чтобы решить проблему отсутствия в Прологе графики и интерфейса.
Интерфейсы для других языков [ править ]
Существуют фреймворки, которые могут служить мостом между Прологом и другими языками:
- LPA Intelligence Server позволяет встраивать LPA Prolog для Windows в другие языки программирования, включая: C , C++ , C# , Java , Visual Basic (VB), Delphi , .NET , Lua , Python и другие. Он использует выделенный строковый тип данных, предоставляемый LPA Prolog.
- Интерфейс логического сервера прикладного программирования ( API ) позволяет расширять и встраивать Prolog в C , C++ , Java , Visual Basic (VB), Delphi , .NET и любой язык или среду, которые могут вызывать .dll или .so. Реализовано для Амзи! Prolog + Logic Server , но спецификация API может быть доступна для любой реализации.
- JPL — это двунаправленный мост Java Prolog, который по умолчанию поставляется с SWI-Prolog, позволяя Java и Prolog вызывать друг друга (рекурсивно). Известно, что он имеет хорошую поддержку параллелизма и находится в стадии активной разработки.
- InterProlog программирования, , библиотека мост между Java и Prolog, реализующая двунаправленный вызов предикатов/методов между обоими языками. Объекты Java могут быть отображены в термины Пролога и наоборот. Позволяет разрабатывать графические пользовательские интерфейсы (GUI) и другие функции на Java, оставляя логическую обработку на уровне Пролога. Поддерживает XSB и SWI-Prolog .
- Prova обеспечивает встроенную интеграцию синтаксиса с Java, обмен сообщениями агентов и правила реагирования. Prova позиционирует себя как систему сценариев на основе правил (RBS) для промежуточного программного обеспечения. Этот язык открывает новые возможности в сочетании императивного и декларативного программирования .
- PROL Встраиваемый движок Пролога для Java. Он включает в себя небольшую IDE и несколько библиотек.
- GNU Prolog для Java — это реализация ISO Prolog в виде библиотеки Java (gnu.prolog).
- Ciao предоставляет интерфейсы для C, C++, Java и реляционных баз данных.
- C#-Prolog — это интерпретатор Пролога, написанный на (управляемом) C#. Легко интегрируется в программы на C#. Характеристики: надежный и достаточно быстрый интерпретатор, интерфейс командной строки, Windows-интерфейс, встроенный DCG, XML-предикаты, SQL-предикаты, расширяемый. Доступен полный исходный код, включая генератор синтаксического анализатора, который можно использовать для добавления расширений специального назначения.
- Абстрактная машина Уоррена для PHP Компилятор и интерпретатор Пролога в PHP 5.3. Библиотека, которую можно использовать автономно или в рамках Symfony2.1, которая была переведена из работы Стефана Бюттчера на Java, которую можно найти [здесь Стефан
.буттчер ].org /кс /ты / - tuProlog — это легкая система Пролога для распределенных приложений и инфраструктур, специально разработанная на основе минимального ядра, которую можно статически или динамически настраивать путем загрузки/выгрузки библиотек предикатов. TuProlog изначально поддерживает мультипарадигмальное программирование, обеспечивая чистую, бесшовную модель интеграции между Прологом и основными объектно-ориентированными языками, а именно Java для версии TuProlog Java и любым языком на основе .NET (C#, F#..) для tuProlog. NET-версия.
- Janus — это двунаправленный интерфейс между Прологом и Python, использующий переносимые низкоуровневые примитивы. Первоначально он был разработан для XSB Андерсоном и Свифтом. [76] но был принят как совместная инициатива команд XSB, Ciao и SWI-Prolog.
История [ править ]
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Early_Prolog_timeline.svg/440px-Early_Prolog_timeline.svg.png)
Название Пролог было выбрано Филиппом Русселем по предложению жены как аббревиатура от programment en logique ( -французски по программирование в логике ). [77] Он был создан примерно в 1972 году Аленом Кольмерауэром и Филиппом Русселем на основе предложенной Робертом Ковальски процедурной интерпретации статей Хорна, . Частично это было мотивировано желанием согласовать использование логики как декларативного языка представления знаний с процедурным представлением знаний, которое было популярно в Северной Америке в конце 1960-х и начале 1970-х годов. По словам Роберта Ковальски , первая система Пролога была разработана в 1972 году Колмерауэром и Филиппом Русселем. [78] [79] [80] Первой реализацией Пролога был интерпретатор, написанный на Фортране Жераром Баттани и Анри Мелони. Дэвид Х.Д. Уоррен взял этот интерпретатор в Эдинбургский университет и там реализовал альтернативный интерфейс, который стал определять синтаксис «Эдинбургского Пролога», используемый в большинстве современных реализаций. Уоррен также реализовал первый компилятор для Пролога, создав влиятельный Пролог DEC-10 в сотрудничестве с Фернандо Перейрой. Позже Уоррен обобщил идеи, лежащие в основе Пролога DEC-10, и создал Абстрактную машину Уоррена .
Европейские исследователи ИИ отдавали предпочтение Прологу, а американцы — Лиспу , что, как сообщается, вызвало множество националистических дебатов о достоинствах языков. [81] Большая часть современного развития Пролога возникла благодаря проекту «Компьютерные системы пятого поколения» (FGCS), который разработал вариант Пролога под названием «Kernel Language» для своей первой операционной системы .
Первоначально чистый Пролог был ограничен использованием средства доказательства резолюционной теоремы с предложениями Хорна вида:
Ч:- Б 1 , ..., Б н .
Применение средства доказательства теорем рассматривает такие предложения как процедуры:
чтобы показать/решить H, показать/решить B 1 и ... и B n .
Однако вскоре чистый Пролог был расширен, включив в него отрицание как неудачу , в которой отрицательные условия формы not(B i ) проявляются в попытке и неудаче решить соответствующие положительные условия B i .
Последующие расширения Пролога, созданные первоначальной командой, добавили программирования логики ограничений в реализации возможности .
Использование в промышленности [ править ]
Пролог использовался в Watson . Watson использует программное обеспечение IBM DeepQA и платформу Apache UIMA (архитектура управления неструктурированной информацией). Система написана на различных языках, включая Java, C++ и Prolog, и работает под управлением операционной системы SUSE Linux Enterprise Server 11 с использованием инфраструктуры Apache Hadoop для обеспечения распределенных вычислений. Пролог используется для сопоставления с образцом деревьев синтаксического анализа естественного языка. Разработчики заявили: «Нам нужен был язык, на котором мы могли бы удобно выражать правила сопоставления с образцом для деревьев синтаксического анализа и других аннотаций (например, результатов распознавания именованных объектов), а также технология, которая могла бы очень эффективно выполнять эти правила. Мы обнаружили, что Пролог был идеальным выбором языка из-за его простоты и выразительности ». [12] Пролог используется в платформе разработки Low-Code GeneXus , ориентированной на искусственный интеллект. [ нужна цитата ] с открытым исходным кодом Графическая база данных TerminusDB реализована на Прологе. [82] TerminusDB предназначен для совместного построения и управления графами знаний .
См. также [ править ]
- Сравнение реализаций Пролога
- Логико-лингвистическое моделирование . Метод построения системы, основанной на знаниях, использующей Пролог.
- Программирование набора ответов . Полностью декларативный подход к логическому программированию.
- Ассоциация логического программирования
Родственные языки [ править ]
- Язык Gödel — это строго типизированная реализация параллельного программирования логики с ограничениями . Он построен на SICStus Prolog .
- Visual Prolog , ранее называвшийся PDC Prolog и Turbo Prolog, представляет собой строго типизированный объектно-ориентированный диалект Пролога, который сильно отличается от стандартного Пролога. Как Turbo Prolog, он продавался компанией Borland, но теперь разрабатывается и продается датской фирмой Prolog Development Center (PDC), которая первоначально его производила.
- Datalog — это подмножество Пролога. Он ограничен отношениями, которые могут быть стратифицированы, и не допускает составных терминов. В отличие от Пролога, Datalog не является полным по Тьюрингу .
- Mercury — это ответвление Пролога, предназначенное для разработки программного обеспечения в целом, со статической, полиморфной системой типов, а также системой режимов и детерминизма.
- GraphTalk — это собственная реализация абстрактной машины Уоррена с дополнительными объектно-ориентированными свойствами.
- В какой-то степени [ который? ] Пролог — это подмножество Planner . Идеи Planner позже получили дальнейшее развитие в « Метафоре научного сообщества» .
- AgentSpeak — вариант Пролога для программирования поведения агентов в многоагентных системах .
- Erlang начал свою жизнь с реализации на основе Пролога и поддерживает большую часть синтаксиса, основанного на унификации Пролога.
- Pilog — декларативный язык, построенный на основе PicoLisp , который имеет семантику Пролога, но использует синтаксис Лиспа.
- λProlog — это расширение ядра Пролога, которое включает полиморфную типизацию, модульное программирование и программирование высшего порядка, включая прямую поддержку терминов с операторами привязки переменных посредством так называемого синтаксиса λ-дерева и унификации шаблонов высшего порядка.
Примечания [ править ]
- ^ Терминология Пролога отличается от терминологии логики . Термин Пролога — это (в зависимости от контекста) термин или атомарная формула логики. Атом в стандартной логической терминологии означает атомную формулу ; атом Пролога (в зависимости от контекста) — константа, функция символ или предикат-символ логики.
Ссылки [ править ]
- ^ Клоксин, Уильям Ф.; Меллиш, Кристофер С. (2003). Программирование на Прологе . Берлин; Нью-Йорк: Springer-Verlag. ISBN 978-3-540-00678-7 .
- ^ Братко, Иван (2012). Программирование на Прологе для искусственного интеллекта (4-е изд.). Харлоу, Англия; Нью-Йорк: Эддисон Уэсли. ISBN 978-0-321-41746-6 .
- ^ Ковингтон, Майкл А. (1994). Обработка естественного языка для программистов на Прологе . Энглвуд Клиффс, Нью-Джерси: Прентис Холл. ISBN 978-0-13-629213-5 .
- ^ Перейти обратно: а б Ллойд, JW (1984). Основы логического программирования . Берлин: Springer-Verlag. ISBN 978-3-540-13299-8 .
- ^ См. Логическое программирование § История .
- ^ Стикель, Мэн (1988). «Доказательство теорем технологии пролога: реализация расширенным компилятором пролога». Журнал автоматизированного рассуждения . 4 (4): 353–380. CiteSeerX 10.1.1.47.3057 . дои : 10.1007/BF00297245 . S2CID 14621218 .
- ^ Мерритт, Деннис (1989). Создание экспертных систем на Прологе . Берлин: Springer-Verlag. ISBN 978-0-387-97016-5 .
- ^ Фелти, Эми. «Подход к логическому программированию для реализации переписывания терминов более высокого порядка». Расширения логического программирования (1992): 135–161.
- ^ Кент Д. Ли (19 января 2015 г.). Основы языков программирования . Спрингер. стр. 298–. ISBN 978-3-319-13314-0 .
- ^ Уте Шмид (21 августа 2003 г.). Индуктивный синтез функциональных программ: универсальное планирование, свертывание конечных программ и абстракция схемы посредством аналогичных рассуждений . Springer Science & Business Media. ISBN 978-3-540-40174-2 .
- ^ Фернандо К. Н. Перейра ; Стюарт М. Шибер (2005). Пролог и анализ естественного языка . Микротом.
- ^ Перейти обратно: а б Адам Лалли; Пол Фодор (31 марта 2011 г.). «Обработка естественного языка с помощью Prolog в системе IBM Watson» . Ассоциация логического программирования. Архивировано из оригинала 3 сентября 2014 года . Проверено 13 июня 2014 г. См. также Watson (компьютер) .
- ^ ISO/IEC 13211-1:1995 Пролог, 6.3.7 Термины — обозначение списка в двойных кавычках. Международная организация по стандартизации , Женева.
- ^ Карлссон, Матс (27 мая 2014 г.). Руководство пользователя SICStus Prolog 4.3: Основная справочная документация . Совет директоров – Книги по запросу. ISBN 978-3-7357-3744-1 – через Google Книги.
- ^ Ковингтон, Майкл А.; Баньяра, Роберто; О'Киф, Ричард А .; Вилемакер, Ян; Прайс, Саймон (2011). «Руководство по кодированию для Пролога». Теория и практика логического программирования . 12 (6): 889–927. arXiv : 0911.2899 . дои : 10.1017/S1471068411000391 . S2CID 438363 .
- ^ Киршенбаум, М.; Стерлинг, Л.С. (1993). «Применение методов к скелетам — шаблоны программирования на Прологе». Построение логических программ (ред. Ж. М. Жаке) . Конспекты лекций по информатике / Конспекты лекций по искусственному интеллекту: 27–140. CiteSeerX 10.1.1.56.7278 .
- ^ Стерлинг, Леон (2002). Вычислительная логика: логическое программирование и не только . Том. 2407. стр. 17–26. дои : 10.1007/3-540-45628-7_15 . ISBN 978-3-540-43959-2 .
- ^ Д. Баркер-Пламмер. Клише-программирование на Прологе. У М. Брюйнуге, редактора Proc. Второй семинар по метапрограммированию в логике, страницы 247–256. Отдел комп. наук, Католический университет. Левен, 1990.
- ^ Гегг-Харрисон, Т.С. (1995). Представление схемы логической программы на Прологе . Материалы Двенадцатой международной конференции по логическому программированию. стр. 467–481.
- ^ Девиль, Ив (1990). Логическое программирование: систематическая разработка программ . Уокингем, Англия: Аддисон-Уэсли. ISBN 978-0-201-17576-9 .
- ^ Перейти обратно: а б Нэйш, Ли (1996). Логическое программирование высшего порядка на Прологе (Отчет). Кафедра компьютерных наук Мельбурнского университета . CiteSeerX 10.1.1.35.4505 .
- ^ «Что касается переменных Пролога, то переменные только в голове неявно выражаются универсально, а переменные только в теле неявно определяются экзистенциально» . Проверено 4 мая 2013 г.
- ^ Перейти обратно: а б с ISO/IEC 13211: Информационные технологии. Языки программирования. Пролог. Международная организация по стандартизации , Женева.
- ^ ISO/IEC 13211-2: Модули.
- ^ Филипп Кёрнер; Майкл Леушель; Жоао Барбоза; Виктор Сантос Коста; Вероника Даль; Мануэль В. Эрменегильдо; Хосе Ф. Моралес; Ян Вилемейкер; Дэниел Диас; Сальвадор Абреу; Джованни Чиатто (ноябрь 2022 г.), «Пятьдесят лет пролога и далее», Теория и практика логического программирования , 22 (6): 776–858, doi : 10.1017/S1471068422000102 , hdl : 10174/33387
- ^ Перейти обратно: а б Моура, Пауло (август 2004 г.), «Logtalk» , Ассоциация логического программирования , 17 (3), заархивировано из оригинала 12 апреля 2010 г. , получено 16 февраля 2010 г.
- ^ Абреу; Ногейра (2005), «Использование языка логического программирования с сохранением и контекстами», конспекты лекций в Artificia Intelligence , 4369
- ^ Кабеса; Hermenegildo (2000), Новая система модулей для Prolog , Конспект лекций по информатике, том. 1861 г.
- ^ Сагонас; Быстрый; Уоррен (1994), «XSB как эффективный дедуктивный механизм базы данных», SIGMOD
- ^ Филипп Кёрнер; Майкл Леушель; Жоао Барбоза; Виктор Сантос Коста; Вероника Даль; Мануэль В. Эрменегильдо; Хосе Ф. Моралес; Ян Вилемейкер; Дэниел Диас; Сальвадор Абреу; Джованни Чиатто (ноябрь 2022 г.), «Пятьдесят лет пролога и далее», Теория и практика логического программирования , 22 (6): 776–858, doi : 10.1017/S1471068422000102 , hdl : 10174/33387
- ^ Перейти обратно: а б Шапиро, Эхуд Ю.; Стерлинг, Леон (1994). Искусство Пролога: продвинутые методы программирования . Кембридж, Массачусетс: MIT Press. ISBN 978-0-262-19338-2 .
- ^ Эд-Дбали, А.; Дерансар, Пьер; Червони, Л. (1996). Пролог: стандарт: справочное руководство . Берлин: Шпрингер. ISBN 978-3-540-59304-1 .
- ^ «ИСО/МЭК 13211-1:1995/Кор 1:2007» . ИСО .
- ^ «ИСО/МЭК 13211-1:1995/Кор 2:2012» . ИСО .
- ^ «ИСО/МЭК 13211-1:1995/Кор 3:2017» . ИСО .
- ^ «ISO/IEC JTC1 SC22 WG17» . [ постоянная мертвая ссылка ]
- ^ «X3J17 и стандарт Пролога» . Архивировано из оригинала 23 августа 2009 г. Проверено 2 октября 2009 г.
- ^ Дэвид HD Уоррен. «Абстрактный набор команд Пролога» . Техническое примечание 309, SRI International , Менло-Парк, Калифорния, октябрь 1983 г.
- ^ Ван Рой, П.; Деспейн, AM (1992). «Высокопроизводительное логическое программирование с помощью компилятора Aquarius Prolog». Компьютер . 25 : 54–68. дои : 10.1109/2.108055 . S2CID 16447071 .
- ^ Граф, Питер (1995). Индексация сроков . Спрингер. ISBN 978-3-540-61040-3 .
- ^ Уайз, Майкл Дж.; Пауэрс, Дэвид М.В. (1986). Индексирование предложений Пролога с помощью наложенных кодовых слов и слов, закодированных в полях . Международный симпозиум по логическому программированию . стр. 203–210.
- ^ Коломб, Роберт М. (1991). «Улучшение унификации в PROLOG посредством индексации предложений». Журнал логического программирования . 10 : 23–44. дои : 10.1016/0743-1066(91)90004-9 .
- ^ Свифт, Т. (1999). «Таблицы немонотонного программирования». Анналы математики и искусственного интеллекта . 25 (3/4): 201–240. дои : 10.1023/A:1018990308362 . S2CID 16695800 .
- ^ Чжоу, Нэн-Фа; Сато, Тайсуке (2003). «Эффективное вычисление фиксированных точек в линейных таблицах» (PDF) . Материалы 5-й Международной конференции ACM SIGPLAN по принципам и практике декларативного программирования : 275–283.
- ^ Свифт, Т.; Уоррен, DS (2011). «XSB: расширение Пролога с помощью программирования табличной логики». Теория и практика логического программирования . 12 (1–2): 157–187. arXiv : 1012.5123 . дои : 10.1017/S1471068411000500 . S2CID 6153112 .
- ^ Абэ, С.; Бандох, Т.; Ямагучи, С.; Куросава, К.; Кирияма, К. (1987). «Высокопроизводительный интегрированный процессор Prolog IPP». Материалы 14-го ежегодного международного симпозиума по компьютерной архитектуре - ISCA '87 . п. 100. дои : 10.1145/30350.30362 . ISBN 978-0-8186-0776-9 . S2CID 10283148 .
- ^ Робинсон, Ян (1986). Процессор Пролога, основанный на запоминающем устройстве, согласующемся с образцом . Третья международная конференция по логическому программированию. Конспекты лекций по информатике. Том. 225. Спрингер. стр. 172–179. дои : 10.1007/3-540-16492-8_73 . ISBN 978-3-540-16492-0 .
- ^ Таки, К.; Накадзима, К.; Накашима, Х.; Икеда, М. (1987). «Производительность и архитектурная оценка машины PSI» . Уведомления ACM SIGPLAN . 22 (10): 128. дои : 10.1145/36205.36195 .
- ^ Гупта, Г.; Понтелли, Э.; Али, КАМ; Карлссон, М.; Эрменегильдо, М.В. (2001). «Параллельное выполнение программ на прологе: обзор» . Транзакции ACM в языках и системах программирования . 23 (4): 472. дои : 10.1145/504083.504085 . S2CID 2978041 .
- ^ «Статически распределенные системы» .
- ^ «Программное обеспечение, которое серьезно относится к играм» . Новый учёный . Деловая информация Рида . 26 марта 1987 г. с. 34 – через Google Книги . [ постоянная мертвая ссылка ]
- ^ «Информатика — Языки программирования, синтаксис, алгоритмы | Британника» . www.britanica.com . Проверено 12 июля 2023 г.
- ^ Перейти обратно: а б Логическое программирование для реального мира. Золтан Шомоджи, Фергюс Хендерсон, Томас Конвей, Ричард О’Киф. Материалы постконференционного семинара ILPS'95 по взглядам на будущее логического программирования.
- ^ «Часто задаваемые вопросы: Руководство по ресурсам Prolog 1/2 [Ежемесячные публикации]Раздел — [1-8] База данных Prolog 1000» . Faqs.org .
- ^ Ян Вилемейкер и Витор Сантос Коста: Переносимость программ на Прологе: теория и тематические исследования . Семинар CICLOPS-WLPE 2010. Архивировано 16 июля 2010 г. в Wayback Machine .
- ^ Перейти обратно: а б Киселев Олег; Камеяма, Юкиёси (2014). Переосмысление Пролога . Учеб. 31-е собрание Японского общества науки и технологий в области программного обеспечения.
- ^ Франзен, Торкель (1994), «Декларативный против процедурного» , Ассоциация логического программирования , 7 (3)
- ^ Даньцин, Евгений; Эйтер, Томас; Готтлоб, Георг; Воронков, Андрей (2001). «Сложность и выразительная сила логического программирования». Обзоры вычислительной техники ACM . 33 (3): 374–425. CiteSeerX 10.1.1.616.6372 . дои : 10.1145/502807.502810 . S2CID 518049 .
- ^ Майкрофт, А.; О'Киф, РА (1984). «Система полиморфных типов для пролога». Искусственный интеллект . 23 (3): 295. дои : 10.1016/0004-3702(84)90017-1 .
- ^ Пфеннинг, Франк (1992). Типы в логическом программировании . Кембридж, Массачусетс: MIT Press. ISBN 978-0-262-16131-2 .
- ^ Шрийверс, Том; Сантос Коста, Витор; Вилемакер, Ян; Демоэн, Барт (2008). «На пути к типизированному Прологу» . В Марии Гарсиа де ла Банда ; Энрико Понтелли (ред.). Логическое программирование: 24-я международная конференция ICLP 2008, Удине, Италия, 9-13 декабря 2008 г.: материалы . Конспекты лекций по информатике. Том. 5366. стр. 693–697. дои : 10.1007/978-3-540-89982-2_59 . ISBN 978-3-540-89982-2 .
- ^ Перейти обратно: а б Апт, КР; Маркиори, Э. (1994). «Рассуждения о программах на Прологе: от режимов через типы к утверждениям» . Формальные аспекты вычислений . 6 (S1): 743. CiteSeerX 10.1.1.57.395 . дои : 10.1007/BF01213601 . S2CID 12235465 .
- ^ О'Киф, Ричард А. (1990). Искусство Пролога . Кембридж, Массачусетс: MIT Press. ISBN 978-0-262-15039-2 .
- ^ Ковингтон, Майкл; Баньяра, Роберто; и другие. (2010). «Руководство по кодированию для Пролога». arXiv : 0911.2899 [ cs.PL ].
- ^ Рой, П.; Демоен, Б.; Виллемс, Ю.Д. (1987). «Улучшение скорости выполнения скомпилированного Пролога с помощью режимов, выбора предложений и детерминизма» . Тапсофт '87 . Конспекты лекций по информатике. Том. 250. С. 111 . дои : 10.1007/BFb0014976 . ISBN 978-3-540-17611-4 .
- ^ Джаффар, Дж. (1994). «Программирование логики ограничений: обзор» . Журнал логического программирования . 19–20: 503–581. дои : 10.1016/0743-1066(94)90033-7 .
- ^ Кольмерауэр, Ален (1987). «Открытие вселенной Пролога III». Байт . Август.
- ^ Уоллес, М. (2002). «Программирование логики ограничений». Вычислительная логика: логическое программирование и не только . Конспекты лекций по информатике. Том. 2407. стр. 512–556. дои : 10.1007/3-540-45628-7_19 . ISBN 978-3-540-45628-5 .
- ^ «XPCE: собственная библиотека графического интерфейса SWI-Prolog» . swi-prolog.org .
- ^ "пролог-mpi" . Apps.lumii.lv . Проверено 16 сентября 2010 г.
- ^ Эхуд Шапиро. Семейство языков программирования параллельной логики ACM Computing Surveys . Сентябрь 1989 года.
- ^ Вилемейкер, Дж.; Хуанг, З.; Ван дер Мейдж, Л. (2008). «SWI-Пролог и Интернет» (PDF) . Теория и практика логического программирования . 8 (3): 363. дои : 10.1017/S1471068407003237 . S2CID 5404048 .
- ^ Вилемакер, Ян; Хильдебранд, Мишель; ван Оссенбрюгген, Жакко (2007), Хейманс, С.; Поллерес, А.; Рукхаус, Э.; Пирс, Д.; Гупта, Г. (ред.), «Использование {Prolog} в качестве основы для приложений в семантической сети» (PDF) , Материалы 2-го семинара по приложениям логического программирования и в Интернете, семантической сети и семантическим веб-службам , Материалы семинара CEUR, том. 287, Порту, Португалия: CEUR-WS.org, стр. 84–98.
- ^ Обработка онтологий OWL2 с использованием Thea: приложение логического программирования . Вангелис Василиадис, Ян Вилемакер и Крис Мангалл. Материалы 5-го международного семинара по OWL: опыт и направления (OWLED 2009), Шантильи, Вирджиния, США, 23–24 октября 2009 г.
- ^ Локи, Юго-Запад; Дэвисон, А. (2001). «Безопасный мобильный код на основе Prolog». Теория и практика логического программирования . 1 (3): 321. arXiv : cs/0406012 . CiteSeerX 10.1.1.58.6610 . дои : 10.1017/S1471068401001211 . S2CID 11754347 .
- ^ Андерсен К. и Свифт Т., 2023. Система Янус: мост к новым приложениям пролога. В Прологе: Следующие 50 лет (стр. 93–104). Чам: Springer Nature, Швейцария.
- ^ Колмерауэр А. и Руссель П., 1996. Рождение Пролога. В истории языков программирования --- II (стр. 331–367).
- ^ Ковальский, Р.А. (1988). «Ранние годы логического программирования» (PDF) . Коммуникации АКМ . 31:38 . дои : 10.1145/35043.35046 . S2CID 12259230 .
- ^ Кольмерауэр, А.; Руссель, П. (1993). «Рождение Пролога» (PDF) . Уведомления ACM SIGPLAN . 28 (3): 37. дои : 10.1145/155360.155362 .
- ^ «Пролог: краткая история» . Проверено 21 ноября 2021 г.
- ^ Паунтейн, Дик (октябрь 1984 г.). «ПОП и SNAP» . Байт . п. 381 . Проверено 23 октября 2013 г.
- ^ terminusdb/terminusdb , TerminusDB, 13 декабря 2020 г. , получено 15 декабря 2020 г.
Дальнейшее чтение [ править ]
- Блэкберн, Патрик; Бос, Йохан; Стригниц, Кристина (2006). Изучите Пролог прямо сейчас! . Публикации колледжа. ISBN 978-1-904987-17-8 . Архивировано из оригинала 26 августа 2007 г. Проверено 2 декабря 2008 г.
- Иван Братко , Программирование на Прологе для искусственного интеллекта , 4-е изд., 2012, ISBN 978-0-321-41746-6 . Дополнения к книге и исходный код [ постоянная мертвая ссылка ]
- Уильям Ф. Клоксин, Кристофер С. Меллиш: Программирование на Прологе: использование стандарта ISO . Спрингер, 5-е изд., 2003 г., ISBN 978-3-540-00678-7 . (Это издание обновлено для ISO Prolog. В предыдущих выпусках описывался Edinburgh Prolog.)
- Уильям Ф. Клоксин: пункт и эффект. Программирование на Прологе для работающего программиста . Спрингер, 2003 г., ISBN 978-3-540-62971-9 .
- Майкл А. Ковингтон , Дональд Нут, Андре Веллино, «Углубленное программирование на Прологе» , 1996, ISBN 0-13-138645-X .
- Майкл А. Ковингтон, Обработка естественного языка для программистов на Прологе , 1994 г., ISBN 978-0-13-629213-5
- М. С. Доу и К. М. Даве, Пролог для компьютерных наук , Springer Verlag, 1992.
- ISO/IEC 13211: Информационные технологии. Языки программирования. Пролог . Международная организация по стандартизации , Женева.
- Феликс Клюзак и Станислав Шпакович (при участии Януша С. Биня). Пролог для программистов . Академик Пресс Инк. (Лондон), 1985, 1987 г. (доступно по лицензии Creative Commons на сайтах
.Google [ постоянная мертвая ссылка ] ). ISBN 0-12-416521-4 ..с /сайт /прологпрепрограммерс / - Ричард О'Киф , «Искусство Пролога» , ISBN 0-262-15039-5 .
- Роберт Смит, Джон Гибсон, Аарон Сломан : «Поддержка двухуровневой виртуальной машины POPLOG для интерактивных языков», в «Направлениях исследований в области когнитивной науки», том 5: Искусственный интеллект , Эдс Д. Слиман и Н. Бернсен, Lawrence Erlbaum Associates, стр. 203– 231, 1992.
- Леон Стерлинг и Эхуд Шапиро , Искусство Пролога: продвинутые методы программирования , 1994, ISBN 0-262-19338-8 .
- Дэвид Х.Д. Уоррен, Луис М. Перейра и Фернандо Перейра, Пролог — язык и его реализация по сравнению с Лиспом. Архив бюллетеня ACM SIGART, выпуск 64. Материалы симпозиума 1977 года по искусственному интеллекту и языкам программирования, стр. 109–115.
![](http://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Wikibooks-logo-en-noslogan.svg/40px-Wikibooks-logo-en-noslogan.svg.png)