Пролог
Парадигма | Логика |
---|---|
Разработано | Ален Кольмерауэр |
Впервые появился | 1972 год |
Стабильная версия | Часть 1: General core-Edition 1 (июнь 1995 г ) Часть 2: Модули, издание 1 (июнь 2000 г ) |
Дисциплина набора текста | Нетипизированный (единственный тип данных — «термин») |
Расширения имен файлов | .pl , .pro , .P |
Веб-сайт | Часть 1: www. Часть 2: www. |
Основные реализации | |
Амзи! Пролог , B-Пролог , Ciao , ECLiPSe , GNU Пролог , LPA Пролог , 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 . Для определения программ на Прологе используются два типа предложений Хорна: правила и факты. Правило имеет вид
Head :- Body.
и читается как «Голова верна, если Тело истинно». правила Тело правила состоит из вызовов предикатов, которые называются целями . Встроенный логический оператор ,/2
арности 2 (имеется в виду оператор с именем ,
) обозначает соединение целей, а ;/2
обозначает дизъюнкцию . Союзы и дизъюнкции могут появляться только в теле, а не в начале правила.
Предложения с пустым телом называются фактами . Пример факта:
human(socrates).
что эквивалентно правилу:
human(socrates) :- true.
Встроенный предикат true/0
всегда верно.
Учитывая вышеизложенный факт, можно спросить:
Сократ человек?
?- human(socrates).
Yes
что такое люди?
?- human(X).
X = socrates
Предложения с телом называются правилами . Пример правила:
mortal(X) :- human(X).
Если мы добавим это правило и спросим, что такое смертные?
?- mortal(X).
X = socrates
Предикаты и программы
[ редактировать ]Предикат . (или определение процедуры ) — это набор предложений, заголовки которых имеют одинаковое имя и арность Мы используем обозначение имя/арность для обозначения предикатов. Логическая программа представляет собой набор предикатов. Например, следующая программа на Прологе, определяющая некоторые семейные отношения, имеет четыре предиката:
mother_child(trude, sally).
father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).
sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y).
parent_child(X, Y) :- father_child(X, Y).
parent_child(X, Y) :- mother_child(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
предикат, определенный в программе семейных отношений выше. Следующая программа на Прологе определяет отношение предка :
ancestor(X, Y) :- parent_child(X, Y).
ancestor(X, Y) :- parent_child(X, Z), ancestor(Z, Y).
Он выражает, что X является предком Y, если X является родителем Y или X является родителем предка Y. Он рекурсивен, поскольку определяется в терминах самого себя (существует вызов предиката ancestor/2
в тексте второго пункта).
Исполнение
[ редактировать ]Выполнение программы на Прологе инициируется сообщением пользователем единственной цели, называемой запросом. Логично, что механизм Пролога пытается найти решение, опровергающее отрицательный запрос. Метод разрешения, используемый Прологом, называется разрешением SLD . Если отрицательный запрос можно опровергнуть, из этого следует, что запрос с соответствующими привязками переменных является логическим следствием программы. В этом случае пользователю сообщается обо всех сгенерированных привязках переменных, и считается, что запрос выполнен успешно. С функциональной точки зрения стратегию выполнения Пролога можно рассматривать как обобщение вызовов функций в других языках, единственное отличие состоит в том, что одному вызову может соответствовать несколько заголовков предложений. В этом случае система создает точку выбора, объединяет цель с заголовком предложения первой альтернативы и продолжает работу над целями этой первой альтернативы. Если какая-либо цель не удалась в ходе выполнения программы, все привязки переменных, которые были сделаны с момента создания самой последней точки выбора, отменяются, и выполнение продолжается со следующей альтернативой этой точки выбора. Такая стратегия выполнения называется хронологической. обратный путь . Например, с учетом программы семейных отношений, определенной выше, следующий запрос будет оценен как true:
?- sibling(sally, erica).
Yes
Это достигается следующим образом: изначально единственный совпадающий заголовок предложения для запроса 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(Father, Child).
перечисляет все действительные ответы при возврате.
Обратите внимание, что в приведенном выше коде запрос ?- sibling(sally, sally).
также преуспевает. При желании можно было бы добавить дополнительные цели для описания соответствующих ограничений.
Отрицание
[ редактировать ]Встроенный предикат Пролога \+/1
предоставляет отрицание как отказ , что позволяет проводить немонотонные рассуждения. Цель \+ illegal(X)
в правиле
legal(X) :- \+ illegal(X).
оценивается следующим образом: Пролог пытается доказать illegal(X)
. Если доказательство этой цели может быть найдено, первоначальная цель (т. е. \+ illegal(X)
) терпит неудачу. Если доказательств не найдено, первоначальная цель достигнута. Таким образом, \+/1
префиксный оператор называется «недоказуемым» оператором, поскольку запрос ?- \+ Goal.
успешна, если цель недоказуема. Этот вид отрицания является правильным , если его аргумент «основной» (т. е. не содержит переменных). Разумность теряется, если аргумент содержит переменные и процедура доказательства завершена. В частности, запрос ?- legal(X).
теперь нельзя использовать для перечисления всего, что является законным.
Программирование на Прологе
[ редактировать ]В Прологе загрузка кода называется консультацией . Пролог можно использовать в интерактивном режиме, вводя запросы в командной строке Пролога. ?-
. Если решения нет, Пролог пишет no
. Если решение существует, оно выводится на печать. Если для запроса существует несколько решений, их можно запросить, введя точку с запятой. ;
. Существуют рекомендации по хорошей практике программирования для повышения эффективности, читаемости и удобства обслуживания кода. [15]
Ниже приведены примеры программ, написанных на Прологе.
Привет, мир
[ редактировать ]Пример базового запроса на нескольких популярных диалектах Пролога:
SWI-Пролог | GNU Пролог |
---|---|
?- write('Hello World!'), nl.
Hello World!
true.
?-
|
| ?- write('Hello World!'), nl.
Hello World!
yes
| ?-
|
Это сравнение показывает, что приглашение («?-» vs «| ?-») и статус разрешения («истина» vs «да», «ложь» vs «нет») могут отличаться от одной реализации Пролога к другой.
Оптимизация компилятора
[ редактировать ]Любое вычисление может быть выражено декларативно как последовательность переходов состояний. Например, оптимизирующий компилятор с тремя проходами оптимизации может быть реализован как связь между исходной программой и ее оптимизированной формой:
program_optimized(Prog0, Prog) :-
optimization_pass_1(Prog0, Prog1),
optimization_pass_2(Prog1, Prog2),
optimization_pass_3(Prog2, Prog).
или, что эквивалентно, используя DCG обозначение :
program_optimized --> optimization_pass_1, optimization_pass_2, optimization_pass_3.
Быстрая сортировка
[ редактировать ]Алгоритм быстрой сортировки, связывающий список с его отсортированной версией:
partition([], _, [], []).
partition([X|Xs], Pivot, Smalls, Bigs) :-
( X @< Pivot ->
Smalls = [X|Rest],
partition(Xs, Pivot, Rest, Bigs)
; Bigs = [X|Rest],
partition(Xs, Pivot, Smalls, Rest)
).
quicksort([]) --> [].
quicksort([X|Xs]) -->
{ partition(Xs, X, Smaller, Bigger) },
quicksort(Smaller), [X], quicksort(Bigger).
Шаблоны проектирования Пролога
[ редактировать ]Шаблон проектирования — это общее многократно используемое решение часто встречающейся проблемы при проектировании программного обеспечения . Некоторые шаблоны проектирования в Прологе представляют собой скелеты, методы, [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) :-
between(1, inf, N), U is N // 2,
findall(D, (between(1,U,D), N mod D =:= 0), Ds),
sumlist(Ds, N).
Это можно использовать для перечисления совершенных чисел и для проверки того, является ли число совершенным.
Другой пример: предикат maplist
применяет предикат P
ко всем соответствующим позициям в паре списков:
maplist(_, [], []).
maplist(P, [X|Xs], [Y|Ys]) :-
call(P, X, Y),
maplist(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] Последние две системы Пролога позволяют контролировать терминов . видимость не только предикатов, но и [25]
Разбор
[ редактировать ]Существует специальная нотация, называемая грамматиками определенного предложения (DCG). Правило, определенное через -->/2
вместо :-/2
расширяется препроцессором ( expand_term/2
, средство, аналогичное макросам в других языках) в соответствии с несколькими простыми правилами переписывания, в результате чего получаются обычные предложения Пролога. В частности, переписывание снабжает предикат двумя дополнительными аргументами, которые можно использовать для неявного связывания состояния: [ нужны разъяснения ] аналогично монадам в других языках. DCG часто используются для написания анализаторов или генераторов списков, поскольку они также предоставляют удобный интерфейс для списков различий.
Метаинтерпретаторы и рефлексия
[ редактировать ]Пролог является гомоиконным языком и предоставляет множество возможностей для рефлексивного программирования (рефлексии). Его стратегия неявного выполнения позволяет написать краткий метациклический вычислитель (также называемый метаинтерпретатором ) для чистого кода Пролога:
solve(true).
solve((Subgoal1,Subgoal2)) :-
solve(Subgoal1),
solve(Subgoal2).
solve(Head) :-
clause(Head, Body),
solve(Body).
где true
представляет собой пустой союз, и clause(Head, Body)
унифицируется с предложениями в базе данных формы Head :- Body
.
Поскольку программы Пролога сами по себе являются последовательностями терминов Пролога ( :-/2
— инфиксный оператор ), которые легко читаются и проверяются с помощью встроенных механизмов (например, read/1
), можно писать собственные интерпретаторы, которые дополняют Пролог специфичными для предметной области функциями. Например, Стерлинг и Шапиро представляют метаинтерпретатор, который выполняет рассуждения с неопределенностью, воспроизведенный здесь с небольшими изменениями: [30] : 330
solve(true, 1) :- !.
solve((Subgoal1,Subgoal2), Certainty) :-
!,
solve(Subgoal1, Certainty1),
solve(Subgoal2, Certainty2),
Certainty is min(Certainty1, Certainty2).
solve(Goal, 1) :-
builtin(Goal), !,
Goal.
solve(Head, Certainty) :-
clause_cf(Head, Body, Certainty1),
solve(Body, Certainty2),
Certainty is Certainty1 * Certainty2.
Этот интерпретатор использует таблицу встроенных предикатов Пролога в форме [30] : 327
builtin(A is B).
builtin(read(X)).
% etc.
и пункты, представленные как clause_cf(Head, Body, Certainty)
. Учитывая это, его можно назвать solve(Goal, Certainty)
выполнить Goal
и получить определенную степень уверенности в результате.
Полнота по Тьюрингу
[ редактировать ]Чистый Пролог основан на подмножестве логики предикатов первого порядка , предложений Хорна , которая является полной по Тьюрингу . Полноту Тьюринга Пролога можно показать, используя его для моделирования машины Тьюринга:
turing(Tape0, Tape) :-
perform(q0, [], Ls, Tape0, Rs),
reverse(Ls, Ls1),
append(Ls1, Rs, Tape).
perform(qf, Ls, Ls, Rs, Rs) :- !.
perform(Q0, Ls0, Ls, Rs0, Rs) :-
symbol(Rs0, Sym, RsRest),
once(rule(Q0, Sym, Q1, NewSym, Action)),
action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),
perform(Q1, Ls1, Ls, Rs1, Rs).
symbol([], b, []).
symbol([Sym|Rs], Sym, Rs).
action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs).
action(stay, Ls, Ls, Rs, Rs).
action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).
left([], [], Rs0, [b|Rs0]).
left([L|Ls], Ls, Rs, [L|Rs]).
Простой пример машины Тьюринга определяется фактами:
rule(q0, 1, q0, 1, right).
rule(q0, b, qf, 1, stay).
Эта машина выполняет приращение на одно число в унарном кодировании: она перебирает любое количество ячеек «1» и добавляет в конце дополнительную «1». Пример запроса и результата:
?- turing([1,1,1], Ts).
Ts = [1, 1, 1, 1] ;
Это иллюстрирует, как любое вычисление может быть выражено декларативно как последовательность переходов состояний, реализованных в Прологе как отношение между последовательными интересующими состояниями.
Выполнение
[ редактировать ]ISO-пролог
[ редактировать ]Пролога Международной организации по стандартизации (ISO) Технический стандарт состоит из двух частей. ИСО/МЭК 13211-1, [23] [31] опубликованный в 1995 году, он направлен на стандартизацию существующих практик многих реализаций основных элементов Пролога. Он прояснил аспекты языка, которые ранее были неоднозначными, и привел к созданию переносимых программ. Есть три исправления: Кор.1:2007, [32] Кор.2:2012, [33] и Кор.3:2017. [34] ИСО/МЭК 13211-2, [23] опубликованный в 2000 году, добавляет в стандарт поддержку модулей. Стандарт поддерживается ISO/IEC JTC1 / SC22 /WG17. [35] рабочая группа. ANSI X3J17 — это Техническая консультативная группа США по этому стандарту. [36]
Сборник
[ редактировать ](WAM) на основе регистров Для повышения эффективности код Пролога обычно компилируется в абстрактный машинный код, на который часто влияет набор команд абстрактной машины Уоррена . [37] Некоторые реализации используют абстрактную интерпретацию для получения информации о типе и режиме предикатов во время компиляции или компиляции в реальный машинный код для повышения производительности. [38] Разработка эффективных методов реализации кода Пролога является областью активных исследований в сообществе логического программирования, и в некоторых реализациях используются различные другие методы выполнения. К ним относятся бинаризация предложений и виртуальные машины на основе стека . [ нужна ссылка ]
Хвостовая рекурсия
[ редактировать ]Системы Пролога обычно реализуют хорошо известный метод оптимизации, называемый оптимизацией хвостового вызова (TCO), для детерминированных предикатов, демонстрирующих хвостовую рекурсию или, в более общем смысле, хвостовые вызовы: кадр стека предложения отбрасывается перед выполнением вызова в хвостовой позиции. Таким образом, детерминированные предикаты хвостовой рекурсии выполняются с постоянным пространством стека, как циклы в других языках.
Индексация сроков
[ редактировать ]Поиск предложений, которые можно объединить с термином в запросе, линеен по количеству предложений. Индексирование терминов использует структуру данных , которая обеспечивает поиск в сублинейном времени . [39] Индексирование влияет только на производительность программы и не влияет на семантику. Большинство Прологов используют индексацию только для первого термина, поскольку индексирование для всех терминов является дорогостоящим, но методы, основанные на словах, закодированных в полях , или наложенных кодовых словах, обеспечивают быструю индексацию по всему запросу и заголовку. [40] [41]
Хеширование
[ редактировать ]Некоторые системы Пролога, такие как WIN-PROLOG и SWI-Prolog, теперь реализуют хеширование, чтобы помочь более эффективно обрабатывать большие наборы данных. Это имеет тенденцию давать очень большой прирост производительности при работе с большими корпусами, такими как WordNet .
Таблица
[ редактировать ]Некоторые системы Пролога ( B-Prolog , XSB , SWI-Prolog , YAP и Ciao ) реализуют метод запоминания, называемый табличным , который освобождает пользователя от необходимости вручную сохранять промежуточные результаты. Таблизация — это компромисс между пространством и временем ; время выполнения можно сократить, используя больше памяти для хранения промежуточных результатов: [42] [43]
Подцели, встречающиеся при оценке запроса, сохраняются в таблице вместе с ответами на эти подцели. Если подцель встречается повторно, при оценке повторно используется информация из таблицы, а не повторно выполняется разрешение пунктов программы. [44]
Таблицы можно расширять в различных направлениях. Он может поддерживать рекурсивные предикаты посредством разрешения SLG или линейного табличного представления. В многопоточной системе Пролога результаты табличного представления могут оставаться конфиденциальными для потока или совместно использоваться всеми потоками. А при поэтапном составлении таблиц, составление таблиц может реагировать на изменения.
Аппаратная реализация
[ редактировать ]В ходе проекта «Компьютерные системы пятого поколения» предпринимались попытки реализовать Пролог на аппаратном уровне с целью добиться более быстрого выполнения с помощью специализированных архитектур. [45] [46] [47] Более того, Пролог имеет ряд свойств, которые позволяют ускорить выполнение за счет параллельного выполнения. [48] Более поздний подход заключался в компиляции ограниченных программ на Прологе в программируемую вентильную матрицу . [49] Однако быстрый прогресс в аппаратном обеспечении общего назначения постоянно опережает развитие более специализированных архитектур.
Sega реализовала Prolog для использования с Sega AI Computer, выпущенным для японского рынка в 1986 году. Prolog использовался для чтения естественном языке ввода на на японском языке через сенсорную панель . [50]
Пределы
[ редактировать ]Хотя Пролог широко используется в исследованиях и образовании, [51] Пролог и другие языки логического программирования не оказали существенного влияния на компьютерную индустрию в целом. [52] Большинство приложений невелики по промышленным стандартам, и лишь немногие из них превышают 100 000 строк кода. [52] [53] Программирование в целом считается сложным, поскольку не все компиляторы Пролога поддерживают модули, и существуют проблемы совместимости между системами модулей основных компиляторов Пролога. [26] Переносимость кода Пролога между реализациями также была проблемой, но события, произошедшие с 2007 года, означали: «переносимость внутри семейства реализаций Пролога, производных от Эдинбурга/Квинтуса, достаточно хороша, чтобы обеспечить поддержку переносимых реальных приложений». [54]
Программное обеспечение, разработанное на Прологе, подвергалось критике за высокие потери производительности по сравнению с традиционными языками программирования. В частности, недетерминированная стратегия оценки Пролога может быть проблематичной при программировании детерминированных вычислений или даже при использовании «не заботящегося о недетерминизме» (когда делается единственный выбор вместо возврата ко всем возможностям). Для достижения желаемой производительности, возможно, придется использовать сокращения и другие языковые конструкции, разрушая одну из главных достопримечательностей Пролога - возможность запускать программы «назад и вперед». [55]
Пролог не является чисто декларативным: из-за таких конструкций, как оператор вырезания , для его понимания необходимо процедурное чтение программы Пролога. [56] Порядок предложений в программе на Прологе важен, поскольку от него зависит стратегия выполнения языка. [57] Другие языки логического программирования, такие как Datalog , действительно декларативны, но ограничивают язык. В результате многие практические программы на Прологе написаны в соответствии с порядком поиска в глубину Пролога , а не как чисто декларативные логические программы. [55]
Расширения
[ редактировать ]На основе Пролога были разработаны различные реализации, расширяющие возможности логического программирования во многих направлениях. К ним относятся типы , режимы, логическое программирование с ограничениями (CLP), объектно-ориентированное логическое программирование (OOLP), параллелизм, линейная логика функционального логического программирования и логического программирования высшего порядка (LLP), возможности , а также совместимость с базами знаний :
Типы
[ редактировать ]Пролог — нетипизированный язык. Попытки ввести и расширить Пролог типами начались в 1980-х годах. [58] [59] и продолжится с 2008 г. [update]. [60] Информация о типах полезна не только для обеспечения безопасности типов , но и для рассуждений о программах на Прологе. [61]
Режимы
[ редактировать ]Спецификатор режима | Интерпретация |
---|---|
+
|
nonvar при входе
|
-
|
var при входе
|
?
|
Не указан |
Синтаксис Пролога не определяет, какие аргументы предиката являются входными, а какие выходными. [62] Однако эта информация важна и рекомендуется включить ее в комментарии. [63] Режимы предоставляют ценную информацию при обсуждении программ на Прологе. [61] а также может использоваться для ускорения выполнения. [64]
Ограничения
[ редактировать ]Программирование логики ограничений расширяет Пролог, включив в него концепции удовлетворения ограничений . [65] [66] Программа логики ограничений допускает ограничения в теле предложений, например: A(X,Y) :- X+Y>0.
Он подходит для крупномасштабных комбинаторной оптимизации. задач [67] и, таким образом, полезен для приложений в промышленных условиях, таких как автоматическое составление расписаний и планирование производства . Большинство систем Пролога поставляются по крайней мере с одним решателем ограничений для конечных областей, а часто также с решателями для других областей, таких как рациональные числа .
Объектно-ориентированность
[ редактировать ]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 . [68] Visual Prolog , WIN-PROLOG и B-Prolog .
Параллелизм
[ редактировать ]с открытым исходным кодом Prolog-MPI — это расширение SWI-Prolog для распределенных вычислений через интерфейс передачи сообщений . [69] Также существуют различные параллельные языки программирования Пролог. [70]
Веб-программирование
[ редактировать ]Некоторые реализации Пролога, особенно Visual Prolog , SWI-Prolog и Ciao , поддерживают на стороне сервера веб-программирование с поддержкой веб-протоколов HTML и XML . [71] Существуют также расширения для поддержки форматов семантической сети , такие как платформа описания ресурсов (RDF) и язык веб-онтологии (OWL). [72] [73] Пролог также предлагался в качестве языка клиентской стороны . [74] Кроме того, 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 Андерсоном и Свифтом. [75] но был принят как совместная инициатива команд XSB, Ciao и SWI-Prolog.
История
[ редактировать ]Название Пролог было выбрано Филиппом Русселем по предложению жены как аббревиатура от Programming en logique ( по-французски программирование в логике ). [76] Он был создан примерно в 1972 году Аленом Кольмерауэром и Филиппом Русселем на основе предложенной Робертом Ковальски процедурной интерпретации статей Хорна, . Частично это было мотивировано желанием согласовать использование логики как декларативного языка представления знаний с процедурным представлением знаний, которое было популярно в Северной Америке в конце 1960-х и начале 1970-х годов. По словам Роберта Ковальски , первая система Пролога была разработана в 1972 году Колмерауэром и Филиппом Русселем. [77] [78] [79] Первой реализацией Пролога был интерпретатор, написанный на Фортране Жераром Баттани и Анри Мелони. Дэвид Х.Д. Уоррен взял этот интерпретатор в Эдинбургский университет и там реализовал альтернативный интерфейс, который стал определять синтаксис «Эдинбургского Пролога», используемый в большинстве современных реализаций. Уоррен также реализовал первый компилятор для Пролога, создав влиятельный Пролог DEC-10 в сотрудничестве с Фернандо Перейрой. Позже Уоррен обобщил идеи, лежащие в основе Пролога DEC-10, и создал Абстрактную машину Уоррена .
Европейские исследователи ИИ отдавали предпочтение Прологу, а американцы — Лиспу , что, как сообщается, вызвало множество националистических дебатов о достоинствах языков. [80] Большая часть современного развития Пролога возникла благодаря проекту «Компьютерные системы пятого поколения » (FGCS), который разработал вариант Пролога под названием « Kernel Language» для своей первой операционной системы .
Первоначально чистый Пролог был ограничен использованием средства доказательства резолюционной теоремы с предложениями Хорна вида:
H :- B1, ..., Bn.
Применение средства доказательства теорем рассматривает такие предложения как процедуры:
to show/solve H, show/solve B1 and ... and Bn.
Однако вскоре чистый Пролог был расширен, включив в него отрицание как неудачу , в котором отрицательные условия формы 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 реализована на Прологе. [81] 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. 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
- ^ Перейти обратно: а б Шапиро, Эхуд Ю.; Стерлинг, Леон (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/А: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.