Jump to content

Пролог

Пролог
Парадигма Логика
Разработано Ален Кольмерауэр
Впервые появился 1972 год ; 52 года назад ( 1972 )
Стабильная версия
Часть 1: General core-Edition 1 (июнь 1995 г .; 29 лет назад ( 1995-06 ) )
Часть 2: Модули, издание 1 (июнь 2000 г .; 24 года назад ( 2000-06 ) )
Дисциплина набора текста Нетипизированный (единственный тип данных — «термин»)
Расширения имен файлов .pl, .pro, .P
Веб-сайт Часть 1: www. .iso .org /стандартный /21413 .html
Часть 2: www. .iso .org /стандартный /20775 .html
Основные реализации
Амзи! Пролог , 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 г. . [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 .

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 — это расширение ядра Пролога, которое включает полиморфную типизацию, модульное программирование и программирование высшего порядка, включая прямую поддержку терминов с операторами привязки переменных посредством так называемого синтаксиса λ-дерева и унификации шаблонов высшего порядка.

Примечания

[ редактировать ]
  1. ^ Терминология Пролога отличается от терминологии логики . Термин Пролога — это (в зависимости от контекста) термин или атомарная формула логики. Атом в стандартной логической терминологии означает атомную формулу ; атом Пролога (в зависимости от контекста) — константа, функция символ или предикат-символ логики.
  1. ^ Клоксин, Уильям Ф.; Меллиш, Кристофер С. (2003). Программирование в Прологе . Берлин; Нью-Йорк: Издательство Springer. ISBN  978-3-540-00678-7 .
  2. ^ Братко, Иван (2012). Программирование на Прологе для искусственного интеллекта (4-е изд.). Харлоу, Англия; Нью-Йорк: Эддисон Уэсли. ISBN  978-0-321-41746-6 .
  3. ^ Ковингтон, Майкл А. (1994). Обработка естественного языка для программистов на Прологе . Энглвуд Клиффс, Нью-Джерси: Прентис Холл. ISBN  978-0-13-629213-5 .
  4. ^ Перейти обратно: а б Ллойд, JW (1984). Основы логического программирования . Берлин: Springer-Verlag. ISBN  978-3-540-13299-8 .
  5. ^ См. Логическое программирование § История .
  6. ^ Стикель, Мэн (1988). «Доказательство теорем технологии пролога: реализация расширенным компилятором пролога». Журнал автоматизированного рассуждения . 4 (4): 353–380. CiteSeerX   10.1.1.47.3057 . дои : 10.1007/BF00297245 . S2CID   14621218 .
  7. ^ Мерритт, Деннис (1989). Создание экспертных систем на Прологе . Берлин: Springer-Verlag. ISBN  978-0-387-97016-5 .
  8. ^ Фелти, Эми. «Подход к логическому программированию для реализации переписывания терминов более высокого порядка». Расширения логического программирования (1992): 135–161.
  9. ^ Кент Д. Ли (19 января 2015 г.). Основы языков программирования . Спрингер. стр. 298–. ISBN  978-3-319-13314-0 .
  10. ^ Уте Шмид (21 августа 2003 г.). Индуктивный синтез функциональных программ: универсальное планирование, свертывание конечных программ и абстракция схемы посредством аналогичных рассуждений . Springer Science & Business Media. ISBN  978-3-540-40174-2 .
  11. ^ Фернандо К. Н. Перейра ; Стюарт М. Шибер (2005). Пролог и анализ естественного языка . Микротом.
  12. ^ Перейти обратно: а б Адам Лалли; Пол Фодор (31 марта 2011 г.). «Обработка естественного языка с помощью Prolog в системе IBM Watson» . Ассоциация логического программирования. Архивировано из оригинала 3 сентября 2014 года . Проверено 13 июня 2014 г. См. также Watson (компьютер) .
  13. ^ ISO/IEC 13211-1:1995 Пролог, 6.3.7 Термины — обозначение списка в двойных кавычках. Международная организация по стандартизации , Женева.
  14. ^ Карлссон, Матс (27 мая 2014 г.). Руководство пользователя SICStus Prolog 4.3: Основная справочная документация . Совет директоров – Книги по запросу. ISBN  978-3-7357-3744-1 – через Google Книги.
  15. ^ Ковингтон, Майкл А.; Баньяра, Роберто; О'Киф, Ричард А .; Вилемакер, Ян; Прайс, Саймон (2011). «Руководство по кодированию для Пролога». Теория и практика логического программирования . 12 (6): 889–927. arXiv : 0911.2899 . дои : 10.1017/S1471068411000391 . S2CID   438363 .
  16. ^ Киршенбаум, М.; Стерлинг, Л.С. (1993). «Применение методов к скелетам — шаблоны программирования на Прологе». Построение логических программ (ред. Ж. М. Жаке) . Конспекты лекций по информатике / Конспекты лекций по искусственному интеллекту: 27–140. CiteSeerX   10.1.1.56.7278 .
  17. ^ Стерлинг, Леон (2002). Вычислительная логика: логическое программирование и не только . Том. 2407. стр. 17–26. дои : 10.1007/3-540-45628-7_15 . ISBN  978-3-540-43959-2 .
  18. ^ Д. Баркер-Пламмер. Клише-программирование на Прологе. У М. Брюйнуге, редактора Proc. Второй семинар по метапрограммированию в логике, страницы 247–256. Отдел комп. наук, Католический университет. Левен, 1990.
  19. ^ Гегг-Харрисон, Т.С. (1995). Представление схемы логической программы на Прологе . Материалы Двенадцатой международной конференции по логическому программированию. стр. 467–481.
  20. ^ Девиль, Ив (1990). Логическое программирование: систематическая разработка программ . Уокингем, Англия: Аддисон-Уэсли. ISBN  978-0-201-17576-9 .
  21. ^ Перейти обратно: а б Нэйш, Ли (1996). Логическое программирование высшего порядка на Прологе (Отчет). Кафедра компьютерных наук Мельбурнского университета . CiteSeerX   10.1.1.35.4505 .
  22. ^ «Что касается переменных Пролога, то переменные только в голове неявно выражаются универсально, а переменные только в теле неявно определяются экзистенциально» . Проверено 4 мая 2013 г.
  23. ^ Перейти обратно: а б с ISO/IEC 13211: Информационные технологии. Языки программирования. Пролог. Международная организация по стандартизации , Женева.
  24. ^ ISO/IEC 13211-2: Модули.
  25. ^ Перейти обратно: а б Филипп Кёрнер; Майкл Леушел; Жоао Барбоза; Витор Сантос Коста; Вероника Даль; Маноэль В. Эрменегильдо; Хосе Ф. Моралес; Ян Вилемакер; Дэниел Диас; Сальвадор Абреу; Джованни Чиатто (ноябрь 2022 г.), «Пятьдесят лет Пролога и далее», Теория и практика логического программирования , 22 (6): 776–858, doi : 10.1017/S1471068422000102 , hdl : 10174/33387
  26. ^ Перейти обратно: а б Моура, Пауло (август 2004 г.), «Logtalk» , Ассоциация логического программирования , 17 (3), заархивировано из оригинала 12 апреля 2010 г. , получено 16 февраля 2010 г.
  27. ^ Абреу; Ногейра (2005), «Использование языка логического программирования с сохранением и контекстами», конспекты лекций в Artificia Intelligence , 4369
  28. ^ Кабеса; Hermenegildo (2000), Новая система модулей для Prolog , Конспект лекций по информатике, том. 1861 г.
  29. ^ Сагонас; Быстрый; Уоррен (1994), «XSB как эффективный дедуктивный механизм базы данных», SIGMOD
  30. ^ Перейти обратно: а б Шапиро, Эхуд Ю.; Стерлинг, Леон (1994). Искусство Пролога: продвинутые методы программирования . Кембридж, Массачусетс: MIT Press. ISBN  978-0-262-19338-2 .
  31. ^ Эд-Дбали, А.; Дерансар, Пьер; Червони, Л. (1996). Пролог: стандарт: справочное руководство . Берлин: Шпрингер. ISBN  978-3-540-59304-1 .
  32. ^ «ИСО/МЭК 13211-1:1995/Кор 1:2007» . ИСО .
  33. ^ «ИСО/МЭК 13211-1:1995/Кор 2:2012» . ИСО .
  34. ^ «ИСО/МЭК 13211-1:1995/Кор 3:2017» . ИСО .
  35. ^ «ISO/IEC JTC1 SC22 WG17» . [ постоянная мертвая ссылка ]
  36. ^ «X3J17 и стандарт Пролога» . Архивировано из оригинала 23 августа 2009 г. Проверено 2 октября 2009 г.
  37. ^ Дэвид HD Уоррен. «Абстрактный набор команд Пролога» . Техническое примечание 309, SRI International , Менло-Парк, Калифорния, октябрь 1983 г.
  38. ^ Ван Рой, П.; Деспейн, AM (1992). «Высокопроизводительное логическое программирование с помощью компилятора Aquarius Prolog». Компьютер . 25 : 54–68. дои : 10.1109/2.108055 . S2CID   16447071 .
  39. ^ Граф, Питер (1995). Индексация сроков . Спрингер. ISBN  978-3-540-61040-3 .
  40. ^ Уайз, Майкл Дж.; Пауэрс, Дэвид М.В. (1986). Индексирование предложений Пролога с помощью наложенных кодовых слов и слов, закодированных в полях . Международный симпозиум по логическому программированию . стр. 203–210.
  41. ^ Коломб, Роберт М. (1991). «Улучшение унификации в PROLOG посредством индексации предложений». Журнал логического программирования . 10 : 23–44. дои : 10.1016/0743-1066(91)90004-9 .
  42. ^ Свифт, Т. (1999). «Таблицы немонотонного программирования». Анналы математики и искусственного интеллекта . 25 (3/4): 201–240. дои : 10.1023/А:1018990308362 . S2CID   16695800 .
  43. ^ Чжоу, Нэн-Фа; Сато, Тайсуке (2003). «Эффективное вычисление фиксированных точек в линейных таблицах» (PDF) . Материалы 5-й Международной конференции ACM SIGPLAN по принципам и практике декларативного программирования : 275–283.
  44. ^ Свифт, Т.; Уоррен, DS (2011). «XSB: расширение Пролога с помощью программирования табличной логики». Теория и практика логического программирования . 12 (1–2): 157–187. arXiv : 1012.5123 . дои : 10.1017/S1471068411000500 . S2CID   6153112 .
  45. ^ Абэ, С.; Бандох, Т.; Ямагучи, С.; Куросава, К.; Кирияма, К. (1987). «Высокопроизводительный интегрированный процессор Prolog IPP». Материалы 14-го ежегодного международного симпозиума по компьютерной архитектуре - ISCA '87 . п. 100. дои : 10.1145/30350.30362 . ISBN  978-0-8186-0776-9 . S2CID   10283148 .
  46. ^ Робинсон, Ян (1986). Процессор Пролога, основанный на запоминающем устройстве, согласующемся с образцом . Третья международная конференция по логическому программированию. Конспекты лекций по информатике. Том. 225. Спрингер. стр. 172–179. дои : 10.1007/3-540-16492-8_73 . ISBN  978-3-540-16492-0 .
  47. ^ Таки, К.; Накадзима, К.; Накашима, Х.; Икеда, М. (1987). «Производительность и архитектурная оценка машины PSI» . Уведомления ACM SIGPLAN . 22 (10): 128. дои : 10.1145/36205.36195 .
  48. ^ Гупта, Г.; Понтелли, Э.; Али, КАМ; Карлссон, М.; Эрменегильдо, М.В. (2001). «Параллельное выполнение программ на прологе: обзор» . Транзакции ACM в языках и системах программирования . 23 (4): 472. дои : 10.1145/504083.504085 . S2CID   2978041 .
  49. ^ «Статически распределенные системы» .
  50. ^ «Программное обеспечение, которое серьезно относится к играм» . Новый учёный . Деловая информация Рида . 26 марта 1987 г. с. 34 – через Google Книги . [ постоянная мертвая ссылка ]
  51. ^ «Информатика — Языки программирования, синтаксис, алгоритмы | Британника» . www.britanica.com . Проверено 12 июля 2023 г.
  52. ^ Перейти обратно: а б Логическое программирование для реального мира. Золтан Шомоджи, Фергюс Хендерсон, Томас Конвей, Ричард О’Киф. Материалы постконференционного семинара ILPS'95 по взглядам на будущее логического программирования.
  53. ^ «Часто задаваемые вопросы: Руководство по ресурсам Prolog 1/2 [Ежемесячные публикации]Раздел — [1-8] База данных Prolog 1000» . Faqs.org .
  54. ^ Ян Вилемейкер и Витор Сантос Коста: Переносимость программ на Прологе: теория и тематические исследования . Семинар CICLOPS-WLPE 2010. Архивировано 16 июля 2010 г. в Wayback Machine .
  55. ^ Перейти обратно: а б Киселев Олег; Камеяма, Юкиёси (2014). Переосмысление Пролога . Учеб. 31-е собрание Японского общества науки и технологий в области программного обеспечения.
  56. ^ Франзен, Торкель (1994), «Декларативный против процедурного» , Ассоциация логического программирования , 7 (3)
  57. ^ Данцин, Евгений; Эйтер, Томас; Готтлоб, Георг; Воронков, Андрей (2001). «Сложность и выразительная сила логического программирования». Обзоры вычислительной техники ACM . 33 (3): 374–425. CiteSeerX   10.1.1.616.6372 . дои : 10.1145/502807.502810 . S2CID   518049 .
  58. ^ Майкрофт, А.; О'Киф, РА (1984). «Система полиморфных типов для пролога». Искусственный интеллект . 23 (3): 295. дои : 10.1016/0004-3702(84)90017-1 .
  59. ^ Пфеннинг, Франк (1992). Типы в логическом программировании . Кембридж, Массачусетс: MIT Press. ISBN  978-0-262-16131-2 .
  60. ^ Писатель Том; Сантос Коста, Витор; Вилемакер, Джон; Демоэн, Барт (2008). «На пути к типизированному Прологу» . В Марии Гарсиа из группы ; Энрико Понтелли (ред.). Логическое программирование: 24-я международная конференция ICLP 2008, Удине, Италия, 9–13 декабря 2008 г.: материалы . Конспекты лекций по информатике. Полный. 5366. стр. 693–697. дои : 10.1007/978-3-540-89982-2_59 . ISBN  978-3-540-89982-2 .
  61. ^ Перейти обратно: а б Апт, КР; Маркиори, Э. (1994). «Рассуждения о программах на Прологе: от режимов через типы к утверждениям» . Формальные аспекты вычислений . 6 (S1): 743. CiteSeerX   10.1.1.57.395 . дои : 10.1007/BF01213601 . S2CID   12235465 .
  62. ^ О'Киф, Ричард А. (1990). Искусство Пролога . Кембридж, Массачусетс: MIT Press. ISBN  978-0-262-15039-2 .
  63. ^ Ковингтон, Майкл; Баньяра, Роберто; и др. (2010). «Руководство по кодированию для Пролога». arXiv : 0911.2899 [ cs.PL ].
  64. ^ Рой, П.; Демоен, Б.; Виллемс, Ю.Д. (1987). «Улучшение скорости выполнения скомпилированного Пролога с помощью режимов, выбора предложений и детерминизма» . Тапсофт '87 . Конспекты лекций по информатике. Том. 250. С. 111 . дои : 10.1007/BFb0014976 . ISBN  978-3-540-17611-4 .
  65. ^ Джаффар, Дж. (1994). «Программирование логики ограничений: обзор» . Журнал логического программирования . 19–20: 503–581. дои : 10.1016/0743-1066(94)90033-7 .
  66. ^ Кольмерауэр, Ален (1987). «Открытие вселенной Пролога III». Байт . Август.
  67. ^ Уоллес, М. (2002). «Программирование логики ограничений». Вычислительная логика: логическое программирование и не только . Конспекты лекций по информатике. Том. 2407. стр. 512–556. дои : 10.1007/3-540-45628-7_19 . ISBN  978-3-540-45628-5 .
  68. ^ «XPCE: собственная библиотека графического интерфейса SWI-Prolog» . swi-prolog.org .
  69. ^ "пролог-mpi" . Apps.lumii.lv . Проверено 16 сентября 2010 г.
  70. ^ Эхуд Шапиро. Семейство языков программирования параллельной логики ACM Computing Surveys . Сентябрь 1989 года.
  71. ^ Вилемейкер, Дж.; Хуанг, З.; Ван дер Мейдж, Л. (2008). «SWI-Пролог и Интернет» (PDF) . Теория и практика логического программирования . 8 (3): 363. дои : 10.1017/S1471068407003237 . S2CID   5404048 .
  72. ^ Вилемакер, Ян; Хильдебранд, Мишель; ван Оссенбрюгген, Жакко (2007), Хейманс, С.; Поллерес, А.; Рукхаус, Э.; Пирс, Д.; Гупта, Г. (ред.), «Использование {Prolog} в качестве основы для приложений в семантической сети» (PDF) , Материалы 2-го семинара по приложениям логического программирования и в Интернете, семантической сети и семантическим веб-службам , Материалы семинара CEUR, том. 287, Порту, Португалия: CEUR-WS.org, стр. 84–98.
  73. ^ Обработка онтологий OWL2 с использованием Thea: приложение логического программирования . Вангелис Василиадис, Ян Вилемакер и Крис Мангалл. Материалы 5-го международного семинара по OWL: опыт и направления (OWLED 2009), Шантильи, Вирджиния, США, 23–24 октября 2009 г.
  74. ^ Локи, Юго-Запад; Дэвисон, А. (2001). «Безопасный мобильный код на основе Prolog». Теория и практика логического программирования . 1 (3): 321. arXiv : cs/0406012 . CiteSeerX   10.1.1.58.6610 . дои : 10.1017/S1471068401001211 . S2CID   11754347 .
  75. ^ Андерсен К. и Свифт Т., 2023. Система Янус: мост к новым приложениям пролога. В Прологе: Следующие 50 лет (стр. 93–104). Чам: Springer Nature, Швейцария.
  76. ^ Колмерауэр А. и Руссель П., 1996. Рождение Пролога. В истории языков программирования --- II (стр. 331–367).
  77. ^ Ковальский, Р.А. (1988). «Ранние годы логического программирования» (PDF) . Коммуникации АКМ . 31:38 . дои : 10.1145/35043.35046 . S2CID   12259230 .
  78. ^ Кольмерауэр, А.; Руссель, П. (1993). «Рождение Пролога» (PDF) . Уведомления ACM SIGPLAN . 28 (3): 37. дои : 10.1145/155360.155362 .
  79. ^ «Пролог: краткая история» . Проверено 21 ноября 2021 г.
  80. ^ Паунтейн, Дик (октябрь 1984 г.). «ПОП и SNAP» . Байт . п. 381 . Проверено 23 октября 2013 г.
  81. ^ terminusdb/terminusdb , TerminusDB, 13 декабря 2020 г. , получено 15 декабря 2020 г.

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

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 7f79d18574a788074f684e7789e25b90__1721096340
URL1:https://arc.ask3.ru/arc/aa/7f/90/7f79d18574a788074f684e7789e25b90.html
Заголовок, (Title) документа по адресу, URL1:
Prolog - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)