Пролог
Проло́г (фр. Prolog, англ. Prolog) — мова логічного програмування загального призначення, пов'язана зі штучним інтелектом та математичною лінгвістикою.[1][2][3]
Prolog | |
---|---|
Парадигма | логічне програмування |
Дата появи | 1972 |
Творці | Alain Colmerauerd, Роберт Ковальський і Philippe Rousseld |
Розробник | Алан Кольмерое |
Основні реалізації | BProlog, Ciao, ECLiPSe, GNU Prolog, Jekejeke Prolog, Logic Programming Associates, Пролог Poplog, P#, Quintus, SICStus, Strawberry, SWI-Prolog, tuProlog, XSB, YAP-Prolog |
Діалекти | Пролог ISO, Единбурзька Пролог |
Під впливом від | Planner |
Вплинула на | Visual Prolog, Mercury, Oz, Erlang, Strand, KL0, KL1, Datalog, CHR, XSB |
Звичайні розширення файлів |
. |
Пролог має корені в логіці першого порядку, математичній логіці, та, на відміну від багатьох інших мов програмування, є декларативною: логіка програми виражається в термінах відношень, представлених як факти та правила. Обчислення ініціюється запуском запиту над цими відношеннями[4].
Цю мову програмування спочатку було задумано групою навколо Алана Кольмерое в Марселі на початку 1970-х, а першу систему Пролог було розроблено в 1972-му Аланом Кольмерое та Філіпом Русселем[5][6].
Пролог була однією з перших логічних мов програмування,[7] й залишається найпопулярнішою серед таких мов і на сьогодні, маючи декілька безкоштовних та комерційних реалізацій. Її застосовували як для доведення теорем,[8] експертних систем,[9] так і для її початкової області призначення, обробки природної мови.[10][11] Сучасні середовища Прологу підтримують як створення графічних інтерфейсів користувача, так і адміністративні або мережеві застосування.
Пролог добре підходить для розв'язання специфічних задач, що виграю́ть від логічних запитів на базі правил, таких як пошук базами даних, системи голосового керування та заповнення шаблонів.
Синтаксис та семантика
Програмна логіка у Пролозі виражається в термінах відношень, а обчислення ініціюється запуском запиту над цими відношеннями. Відношення та запити створюються з використанням єдиного типу даних Прологу, терму.[4] Відношення виражаються твердженнями. Отримавши запит, рушій Прологу намагається знайти спростування резолюції заперечення запиту. Якщо заперечення запиту може бути спростовано, тобто, знайдено конкретизацію всіх вільних змінних, що робить об'єднання атомарних формул та множини-синґлетону, що складається із заперечення запиту, хибним, то з цього випливає, що початковий запит, із застосуванням знайденої конкретизації, є логічним висновком програми. Це робить Пролог (та інші логічні мови програмування) надзвичайно зручною для застосування в базах даних, символьній математиці та граматичному аналізі мов. Оскільки Пролог дозволяє нечисті предикати, перевірка істинності певних спеціальних предикатів може мати деякий навмисний побічний ефект, як-то виведення значення на екран. Через це програмістові дозволено певною мірою використовувати звичайне імперативне програмування, коли логічна парадигма є незручною. Пролог має як чисту логічну підмножину, що називається «чиста Пролог», так і ряд позалогічних властивостей.
Типи даних
Єдиним типом даних Прологу є терм. Терми можуть бути атомами, числами, змінними або складеними термами.
- Атом — це загальна назва без притаманного значення. Прикладами атомів є
x
,синій
,'Пиріжок'
та'якийсь атом'
. - Числа можуть бути з рухомою комою, або цілими.
- Змінні позначаються стрічками, що складаються з літер, цифр та символів підкреслення, і починаються з великої літери або символу підкреслення. Змінні дуже подібні до змінних в логіці тим, що вони є позначками-заповнювачами для довільних термів.
- Складений терм складається з атому, що зветься функтор, та певної кількості аргументів, що в свою чергу теж є термами. Складені терми зазвичай записуються у вигляді функтора, за яким у дужках слідує перелік термів-аргументів через кому. Кількість аргументів називається арністю терму. Атом може розглядатися як складений терм нульової арності.
рік_машини('Таврія', 1988)
та'Друзі_Особи'(грай,[око,тур])
є прикладами складених термів.
Особливі випадки складених термів:
- Список є впорядкованою колекцією термів. Він позначається квадратними дужками з термами, розділеними комами, або, у випадку порожнього списку,
[]
. Наприклад,[1,2,3]
, або[червоний,зелений,синій]
. - Стрічки: послідовність символів у лапках, еквівалентна спискові (числових) кодів символів, зазвичай у місцевому кодуванні, або в Юнікоді, якщо система підтримує Юнікод. Наприклад,
"бути чи не бути"
.
Правила та факти
Прологові програми описують відношення, визначені твердженнями. Чиста Пролог обмежена диз'юнктами Горна. Є два типи тверджень: факти та правила. Правило має вигляд
Голова :- Тіло.
і читається як «голова істинна, якщо тіло істинне». Тіло правила складається з викликів предикатів, що називаються цілями правила. Вбудований предикат ,/2
(що значить двоарний оператор з ім'ям ,
) позначає кон'юнкцію цілей, а ;/2
— диз'юнкцію. Кон'юнкції та диз'юнкції можуть бути присутні лише в тілі, але не в голові правила.
Твердження з порожніми тілами називаються фактами. Наприклад:
кіт(базиліо).
що рівноцінне правилу:
кіт(базиліо) :- true.
Вбудований предикат true/0
є завжди істинним.
Маючи наведений вище факт, можна спитати:
чи є базиліо котом?
?- кіт(базиліо).
Yes
що є котами?
?- кіт(X).
X = базиліо
Твердження з тілами називаються правилами. Наприклад:
тварина(X):- кіт(X).
Якщо ми додамо це правило та спитаємо, що є тваринами?
?- тварина(X).
X = базиліо
Оскільки природа багатьох вбудованих предикатів є відносною, їх зазвичай можна використовувати в кількох напрямках. Наприклад, 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
відображає терм на екрані.
Виконання
Виконання прологової програми починається задаванням користувачем єдиної цілі, що зветься запитом. З точки зору логіки, рушій Прологу намагається знайти спростування резолюції заперечення цього запиту. Метод резолюції, що використовується у Пролозі, називається ВЛВ-резолюцією. Якщо заперечення запиту може бути спростовано, з цього випливає, що запит, з відповідними зв'язуваннями змінних, є логічним висновком програми. У такому разі всі створені зв'язування змінних повідомляються користувачеві, і про запит повідомляється, що він досяг успіху. З практичної точки зору, стратегію виконання Прологу можна уявити як узагальнення викликів функцій в інших мовах, з тією різницею, що заданому запитові можуть відповідати голови кількох тверджень. В такому випадку система створює точку вибору, об'єднує ціль з головою твердження першої альтернативи, і продовжує цілями цієї першої альтернативи. Якщо в напрямку виконання програми будь-яка ціль зазнає невдачі, всі зв'язування змінних, що було зроблено від останньої на той момент точки вибору, скасовуються, і виконання продовжується з наступною альтернативою цієї точки вибору. Ця стратегія виконання називається хронологічним пошуком з вертанням. Наприклад:
мати_дитини(ірина, святослав).
батько_дитини(ярослав, святослав).
батько_дитини(ярослав, анна).
батько_дитини(володимир, ярослав).
брат_або_сестра(X, Y) :- батько_або_мати_дитини(Z, X), батько_або_мати_дитини(Z, Y).
батько_або_мати_дитини(X, Y) :- батько_дитини(X, Y).
батько_або_мати_дитини(X, Y) :- мати_дитини(X, Y).
Виходячи з цього, наступний запит оцінюється як істинний:
?- брат_або_сестра(святослав, анна).
Yes
Це отримується таким чином: Спочатку єдиною відповідною головою твердження до запиту брат_або_сестра(святослав, анна)
є перша, тому надавання запиту є рівноцінним надаванню тіла того твердження з відповідними зв'язуваннями змінних, тобто, кон'юнкція (батько_або_мати_дитини(Z,святослав), батько_або_мати_дитини(Z,анна))
. Наступною ціллю для доведення є крайня зліва з цієї кон'юнкції, тобто, батько_або_мати_дитини(Z,святослав)
. Цій цілі відповідають голови двох правил. Система створює точку вибору, і пробує перший вибір, чиїм тілом є батько_дитини(Z, святослав)
. Цю ціль може бути доведено з використанням факту батько_дитини(ярослав, святослав)
, тому створюється зв'язування Z = ярослав
, і наступною ціллю для доведення стає друга частина наведеної вище кон'юнкції: батько_або_мати_дитини(ярослав, анна)
. І знову, це може бути доведено відповідним фактом. Оскільки всі цілі доведено, запит досягає успіху. Оскільки запит не містить жодних змінних, користувачеві не повідомляються жодні зв'язування. Запит зі змінними, як-то:
?- батько_дитини(Батько, Дитина).
перелічує всі дійсні відповіді пошуку з вертанням.
Зверніть увагу, що з наведеним вище кодом запит ?- брат_або_сестра(святослав, святослав).
також досягає успіху. Якщо потрібно, можна додати додаткові цілі для опису відповідних обмежень.
Цикли та рекурсія
Ітеративні алгоритми може бути реалізовано засобами рекурсивних предикатів.
Заперечення
Вбудований предикат Прологу \+/1
забезпечує заперечення як відмову, що уможливлює немонотонну аргументацію. Ціль \+ нелегальне(X)
у правилі
легальне(X) :- \+ нелегальне(X).
обчислюється таким чином. Пролог намагається довести нелегальне(X)
. Якщо доведення цієї цілі знайдено, то початкова ціль (тобто, \+ нелегальне(X)
) зазнає невдачі. Якщо доведення не може бути знайдено, то початкова ціль досягає успіху. Отже, префіксний оператор \+/1
називається оператором «недовідне», оскільки запит ?- \+ Ціль.
досягає успіху, якщо Ціль не є довідною. Цей вид заперечення є правильним, якщо його аргумент є замкненим (тобто, не містить змінних). Правильність втрачається, якщо аргумент містить змінні, і процедура доведення є повною. Зокрема, запит ?- легальне(X).
тепер вже не може бути використано для перелічення усіх речей, що є легальними.
Програмування мовою Пролог
У Пролозі завантаження коду називається взяттям до уваги. Пролог може використовуватися інтерактивно шляхом введення запитів до підказки Прологу, ?-
. Якщо розв'язку не існує, то Пролог пише no
. Якщо розв'язок існує, то тоді друкується він. Якщо існує декілька розв'язків запиту, то їх може бути запитано введенням крапки з комою, ;
. Існують керівні принципи з належної практики програмування для покращення ефективності, читабельності та підтримуваності коду.[12]
Далі слідують деякі приклади програм, написаних мовою Пролог.
"Hello, world!"
Приклад запиту:
?- write('Привіт, світе!'), nl.
Привіт, світе!
true.
?-
Оптимізація компілятором
Будь-яке обчислення може бути виражено декларативно як послідовність переходу станів. Як приклад, оптимізувальний компілятор з трьома проходами оптимізації може бути реалізовано як відношення між початковою програмою та її оптимізованою формою:
програма_оптимізована(Прог0, Прог) :-
оптимізація_прохід_1(Прог0, Прог1),
оптимізація_прохід_2(Прог1, Прог2),
оптимізація_прохід_3(Прог2, Прог).
або рівнозначно з використанням запису граматики визначених тверджень:
програма_оптимізована --> оптимізація_прохід_1, оптимізація_прохід_2, оптимізація_прохід_3.
Швидке сортування
Алгоритм швидкого сортування, що ставить у відповідність спискові його відсортовану версію:
розділення([], _, [], []).
розділення([X|Xs], Опорне, Малі, Великі) :-
( X @< Опорне ->
Малі = [X|Решта],
розділення(Xs, Опорне, Решта, Великі)
; Великі = [X|Решта],
розділення(Xs, Опорне, Малі, Решта)
).
швидке_сортування([]) --> [].
швидке_сортування([X|Xs]) -->
{ розділення(Xs, X, Менші, Більші) },
швидке_сортування(Менші), [X], швидке_сортування(Більші).
Шаблони проектування
Шаблон проектування це загальне рішення багаторазового використання поширеної проблеми у проектуванні програмного забезпечення. У Пролозі шаблони проектування можуть носити різні назви: кістяки та техніки,[13][14] кліше,[15] програмні схеми[16] та схеми опису логіки.[17] Альтернативою до шаблонів проектування є програмування вищих порядків.[18]
Програмування вищих порядків
Детальніші відомості з цієї теми ви можете знайти в статті Логіка вищих порядків та Програмування вищих порядків.
Предикат вищого порядку — це предикат, що має один або більше інших предикатів як аргументи. Хоча підтримка програмування вищих порядків і виводить Пролог з області логіки першого порядку, яка не дозволяє квантифікації предикатів,[19] Пролог ISO вже має деякі вбудовані предикати вищих порядків, такі як call/1
, call/2
, call/3
, findall/3
, setof/3
та bagof/3
.[20] Крім того, оскільки довільні цілі Прологу можуть створюватись та оцінюватись у реальному часі, нескладно писати предикати вищих порядків на кшталт maplist/2
, що застосовує довільний предикат до кожного елемента наданого списку, та sublist/3
, що відфільтровує елементи, які задовольняють наданому предикатові, уможливлюючи також і каррування.[18]
Для перетворення рішень з часового представлення (підстановки відповідей при зворотному пошуку) до просторового представлення (термів) Пролог має різноманітні предикати для всіх рішень, що збирають всі підстановки відповідей для заданого запиту до списку. Це може використовуватися у спискових виразах. Наприклад, досконалі числа дорівнюють сумі своїх дільників:
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)
є еквівалентом застосування функції map у функційному програмуванні як Ys = map(Function, Xs)
.
Програмування вищих порядків було започатковано у Пролозі в HiLog та λProlog.
Модулі
Для великого програмування Пролог пропонує систему модулів. Цю систему модулів стандартизовано ISO.[21] Проте, не всі компілятори Прологу підтримують модулі, а також існують проблеми сумісності між системами модулів основних компіляторів Прологу.[22] Отже, модулі, написані під одним компілятором Прологу, не обов'язково працюватимуть під іншими.
Граматичний розбір
Існує спеціальний запис, що називається граматиками визначених тверджень. Правило, визначене через -->/2
замість :-/2
, розкривається препроцесором (expand_term/2
, засіб, аналогічний макросам в інших мовах) відповідно до кількох прямих правил переписування, маючи результатом звичайні твердження Прологу. Найважливіше, що переписування споряджає предикат двома додатковими аргументами, що можуть використовуватися для неявного прокручування стану через них, аналогічно до монад в інших мовах. Граматики визначених тверджень часто використовуються для написання синтаксичних аналізаторів або генераторів списків, оскільки вони надають зручний інтерфейс до списків відмінностей.
Мета-інтерпретатори та рефлексія
Пролог є гомоіконною мовою, і забезпечує багато засобів для рефлексії. Її неявна стратегія виконання робить можливим написання стислого мета-циклічного інтерпретатора (що також називають мета-інтерпретатором) коду чистої Пролог:
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
), можливо писати спеціальні інтерпретатори, що розширюють Пролог предметно-орієнтованими властивостями. Наприклад, Стерлінг та Шапіро представляють мета-інтерпретатор, що виконує міркування з неточностями, відтворений тут із незначними видозмінами:[23]
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.
Цей інтерпретатор використовує таблицю вбудованих предикатів Пролог у вигляді[23]
builtin(A is B).
builtin(read(X)).
% etc.
та твердження, представлені як clause_cf(Голова, Тіло, Впевненість)
. Враховуючи це, його можна викликати як solve(Ціль, Впевненість)
, щоби виконати Ціль
та отримати міру впевненості в результаті.
Повнота за Тюрингом
Чиста Пролог базується на підмножині предикатної логіки першого порядку, диз'юнктах Горна, що є повною за Тюрингом. Повноту Прологу за Тюрингом може бути показано шляхом використання її для імітації машини Тюрінга:
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 складається з двох частин. ISO/IEC 13211-1,[20][24] опублікована в 1995 році, намагається стандартизувати наявні застосування багатьох реалізацій ключових елементів Прологу. Вона прояснила аспекти цієї мови, що раніше були неоднозначними, і веде до переносності програм. Є дві еррати: Cor.1:2007[25] та Cor.2:2012.[26] ISO/IEC 13211-2,[20] опублікована в 2000 році, додає до стандарту підтримку модулів. Стандарт підтримується робочою групою ISO/IEC JTC1/SC22/WG17[27]. Технічною дорадчою групою США для цього стандарту є ANSI X3J17.[28]
Компіляція
Для більшої ефективності код Прологу зазвичай компілюється в код абстрактної машини, що часто знаходиться під впливом набору інструкцій базованої на регістрах абстрактної машини Воррена.[29] Деякі реалізації вживають абстрактну інтерпретацію для встановлення інформації про тип та напрямок предикатів під час компіляції, або, для вищої продуктивності, компілюють у код реальної машини.[30] У спільноті логічного програмування придумування ефективних методів реалізації коду Прологу є полем активних досліджень, і в деяких реалізаціях застосовується багато інших методів виконання. Вони включають перетворення тверджень у двійкову форму та віртуальні машини, базовані на стеку.[джерело?]
Хвостова рекурсія
Для детермінованих предикатів, що демонструють хвостову рекурсію, або, загальніше, хвостові виклики, прологові системи зазвичай реалізують добре відомий метод оптимізації, що зветься оптимізацією хвостового виклику (англ. Tail Call Optimization, TCO): Перед виконанням виклику в хвостовій позиції кадр стеку твердження скасовується. Отже, детерміновані предикати з хвостовою рекурсією виконуються з незмінним простором стеку, як цикли в інших мовах.
Індексування термів
Детальніші відомості з цієї теми ви можете знайти в статті Індексування термів.
Пошук тверджень, що є об'єднуваними із термом у запиті, є лінійним відносно кількості тверджень. Індексування термів використовує структуру даних, що уможливлює суб-лінійний пошук.[31] Індексування впливає лише на продуктивність програми, семантики воно не зачіпає. Більшість Прологів використовує індексування лише за першим термом, оскільки індексування за всіма термами є витратним, але прийоми на базі кодованих полями слів або наднакладених кодових слів забезпечують швидке індексування по всьому запитові та голові.[32][33]
Табулювання
Деякі прологові системи (BProlog, XSB, Yap, B-Prolog та Ciao) реалізують метод мемоізації, що зветься табулювання, що звільняє користувача від необхідності зберігати проміжні результати вручну.[34][35]
Підцілі, що зустрічаються під час виконання запиту, зберігаються в таблиці, разом із відповідями на ці підцілі. Якщо підціль зустрічається знову, то виконання використовує інформацію з таблиці, замість повторного виконання міркування над реченнями програми.[36]
Оригінальний текст (англ.) Subgoals encountered in a query evaluation are maintained in a table, along with answers to these subgoals. If a subgoal is re-encountered, the evaluation reuses information from the table rather than re-performing resolution against program clauses. |
Табулювання є просторово-часовим компромісом, тривалість виконання може бути зменшено за рахунок використання більшої кількості пам'яті для зберігання проміжних результатів.
Апаратна реалізація
Під час розробки проекту комп’ютерних систем п’ятої генерації були спроби реалізувати Пролог в апаратному вигляді з метою отримання швидшого виконання спеціальними архітектурами.[37][38][39] До того ж, Пролог має ряд властивостей, що можуть дозволити прискорення шляхом паралельного виконання.[40] Новішими підходами було компілювати обмежені прологові програми у програмовані користувачем вентильні матриці.[41] Однак, швидкий розвиток апаратного забезпечення загального призначення послідовно випередив спеціалізованіші архітектури.
Недоліки
Хоча Пролог широко застосовується в дослідницькій роботі та освіті, вона та інші логічні мови програмування не справили істотного впливу на комп'ютерну промисловість у цілому.[42] Більшість застосунків є малими за промисловими стандартами, лише деякі з них мають понад 100,000 рядків коду.[42][43] Велике програмування вважається складним, оскільки не всі компілятори Прологу підтримують модулі, а також існують проблеми сумісності між системами модулів основних прологових компіляторів.[22] Переносність коду Прологу між реалізаціями також була проблемою, але розробка після 2007 року означала: «переносність всередині сімейства реалізацій Прологу, що походять від Единбурзької Пролог або Quintus, є достатньо гарною для підтримки реальних переносних програм».[44]
Програмне забезпечення, розроблене на Пролозі, критикувалося за високі втрати продуктивності у порівнянні зі звичайними мовами програмування. Зокрема, прологова недетерміністська стратегія виконання може бути проблематичною при програмуванні детерміністських обчислень, або навіть при використанні «незважання на недетермінізм» (коли робиться єдиний вибір замість зворотнього пошуку всіма можливими). Для досягнення бажаної продуктивності може доводитися застосовувати відсікання та інші мовні конструкції, руйнуючи одну з головних принад Прологу, здатність виконувати програми «назад і вперед».[45]
Пролог не є чисто декларативною: оскільки вона має конструкції на кшталт оператора відсікання, для її розуміння потрібне також і процедурне прочитання написаних нею програм.[46] Порядок тверджень у прологовій програмі є суттєвим, оскільки стратегія виконання цієї мови залежить від нього.[47] Інші логічні мови програмування, такі як Datalog, є чисто декларативними, але це обмежує мову. В результаті багато практичних прологових програм написано так, щоби вони відповідали прологовому пошуку в глибину, а не як чисто декларативні логічні програми.[45]
Розширення
З Прологу було розвинуто різноманітні реалізації для розширення можливостей логічного програмування у численних напрямках. Вони включають типи, режими, логічне програмування з обмеженнями (англ. CLP), об'єктно-орієнтоване логічне програмування (англ. OOLP), паралелізм, лінійну логіку, можливості функційного програмування та програмування логіки вищих порядків, плюс функціональну сумісність з базами знань:
Типи
Пролог є нетипізованою мовою. Спроби запровадити типи сходять до 1980-х років,[48][49] і станом на 2008 рік все ще існують спроби розширити Пролог типами.[50] Ця інформація корисна не лише для безпечної типізації, а й для розуміння прологових програм.[51]
Режими
Ознака режиму | Інтерпретація |
---|---|
+ |
nonvar на вході |
- |
var на вході |
? |
Не визначено |
Синтаксис Прологу не визначає, які з аргументів предикату є вхідними, а які вихідними.[52] Проте ця інформація є істотною, і рекомендується включати її до коментарів.[53] Режими надають цінну інформацію для розуміння прологових програм,[51] а також можуть використовуватися для прискорення виконання.[54]
Обмеження
Логічне програмування з обмеженнями розширює Пролог включенням концепцій із задоволення обмежень.[55][56] Програма з логікою обмежень дозволяє обмеження в тілах тверджень, як, наприклад, A(X,Y) :- X+Y>0.
Це підходить для великомасштабних задач комбінаторної оптимізації[57] й, отже, для застосувань у промислових умовах, таких як автоматизоване складання розкладів та планування виробництва. Більшість прологових систем постачаються із щонайменше одним розв'язувачем обмежень для зліченних областей визначення, а часто також і з розв'язувачами для інших областей визначення, таких як дійсні числа.
Об'єктна орієнтація
Flora-2 є об'єктно-орієнтованим представленням знань та системою міркувань на базі F-logic, і включає HiLog, транзакційну логіку та міркування методом виключення.
Logtalk — це об'єктно-орієнтована мова логічного програмування, що може застосовувати більшість реалізацій Прологу як внутрішній компілятор. Як мультипарадигмова мова, вона включає підтримку як прототипів, так і класів.
Oblog — це невелике переносне об'єктно-орієнтоване розширення Прологу від Маргарити Макдугалл (англ. Margaret McDougall) з EdCAAD Единбурзького університету.
Objlog була фреймовою мовою, що поєднувала об'єкти та Пролог II від НЦНД Франції у Марселі.
Prolog++ було розроблено компанією Logic Programming Associates, і вперше випущено у 1989 році для ПК MS-DOS. Було додано підтримку для інших платформ, і 1995 року випущено другу версію. У 1994 році видавництвом Addison-Wesley було опубліковано книгу Кріса Мосса (англ. Chris Moss) про Prolog++.
Графіка
Прологовими системами, що пропонують графічну бібліотеку, є SWI-prolog,[58] Visual-prolog, LPA Prolog для Windows та B-Prolog.
Паралелізм
Prolog-MPI є розширенням SWI-Prolog з відкритим кодом для розподілених обчислень через інтерфейс передачі повідомлень (англ. MPI).[59] Також існує декілька конкурентних мов програмування Пролог.[60]
Вебпрограмування
Деякі реалізації Прологу, особливо SWI-Prolog та Ciao, підтримують веб-програмування на серверному боці з підтримкою веб-протоколів, HTML та XML.[61] Існують також розширення для підтримки форматів семантичної павутини, таких як RDF та OWL.[62][63] Пролог також пропонувалася як мова клієнтського боку.[64]
Adobe Flash
Cedar є безкоштовним та елементарним інтерпретатором Прологу. Від версії 4 та вище Cedar має підтримку FCA (Flash Cedar App). Це забезпечує нову платформу для програмування Прологом через ActionScript.
Інші
- F-logic розширює Пролог фреймами/об'єктами для представлення знань.
- Транзакційна логіка розширює Пролог теорією логіки операторів оновлення, що змінюють стан. Вона має як теоретико-модельну, так і процедурну семантику.
- OW Prolog було створено, щоби дати відповідь на брак графіки та інтерфейсу в Пролозі.
Інтерфейси до інших мов
Існують каркаси для сполучення між Прологом та іншими мовами:
- LPA Intelligence Server дозволяє включення LPA Prolog до C, C#, C++, Java, VB, Delphi, .NET, Lua, Python та інших мов. Він використовує спеціальний стрічковий тип даних, що надає LPA Prolog
- Logic Server API дозволяє як розширення Прологом, так і його включення до C, C++, Java, VB, Delphi, .NET та будь-яких інших мов/середовищ, що можуть викликати .dll або .so. Його реалізовано для Amzi! Prolog + Logic Server, але специфікацію API може бути зроблено доступною для будь-якої реалізації.
- JPL — це двоспрямований міст між Java та Прологом, що постачається з SWI-Prolog за замовчуванням, і що дозволяє Java та Прологові викликати одне одного (рекурсивно). Він відомий гарною підтримкою паралельності, та знаходиться в активній розробці.
- InterProlog, програмна бібліотека мосту між Java та Прологом, що реалізує двоспрямовані виклики предикатів/методів між обома мовами. Об'єкти Java можуть відображатися у терми Прологу, і навпаки. Дозволяє розробку графічного інтерфейсу користувача та іншої функціональності в Java, залишаючи обробку логіки в шарі Прологу. Підтримує XSB, із запланованою на 2013 рік підтримкою SWI-Prolog та YAP.
- Prova надає інтеграцію рідного синтаксису з Java, обмін повідомленнями між програмними агентами та правила реакції. Prova позиціонує себе як скриптову систему на базі правил (англ. rule-based scripting, RBS) для підпрограмного забезпечення. Ця мова відкриває нові обрії у поєднанні імперативного та декларативного програмування.
- PROL це вбудовуваний рушій Прологу для Java. Він включає невелике інтегроване середовище розробки та декілька бібліотек.
- GNU Prolog для Java є реалізацією Прологу ISO як бібліотеки Java (gnu.prolog)
- Ciao надає інтерфейси до C, C++, Java та реляційних баз даних.
- C#-Prolog є інтерпретатором Прологу, написаним (керованою) C#. Може легко інтегруватися до програм мовою C#. Характеристики: надійний та досить швидкий інтерпретатор, інтерфейс командного рядка, інтерфейс Windows, вбудована граматика визначених тверджень, XML-предикати, SQL-предикати, розширюваний. Доступний повний джерельний код, включно з генератором синтаксичного аналізатора, що може бути використано для додавання розширень особливого призначення.
- Jekejeke Prolog API[недоступне посилання з квітня 2019] надає сильнозв'язані можливості паралельних вхідних та вихідних викликів між Прологом та Java або Android, з визначною можливістю створення індивідуальних об'єктів баз знань. Він може застосовуватися для вбудовування Прологу ISO до самостійних застосунків, аплетів, сервлетів, APK тощо.
- Абстрактна машина Воррена для PHP, компілятор та інтерпретатор Прологу в PHP 5.3. Бібліотека, що може використовуватися самостійно, або з каркасом Symfony2.1.
Історія
Назву Пролог (фр. Prolog) було обрано Філіпом Русселем як абревіатуру від програмування в логіці (фр. programmation en logique). Пролог було створено в 1972 році Аланом Кольмерое з Філіпом Русселем на основі процедурної інтерпретації диз'юнктів Горна Роберта Ковальського. Це було частково мотивоване бажанням примирити використання логіки як мови декларативного представлення знань з процедурним представленням знань, що було популярне в Північній Америці наприкінці 1960-х і на початку 1970-х років. Згідно Роберта Ковальського, першу прологову систему було розроблено в 1972 році Аланом Кольмерое та Філіпом Русселем.[5] Перші реалізації Прологу були інтерпретаторами. Однак, Девід Воррен створив абстрактну машину Воррена, ранній та впливовий компілятор Прологу, що прийшов, щоби визначити «Единбурзький» діалект Прологу, що послужив основою синтаксису більшості сучасних реалізацій.
Європейські дослідники штучного інтелекту віддавали перевагу Прологу, тоді як американці віддавали перевагу Ліспу, що, як повідомлялося, призводило до численних націоналістичних дебатів про переваги цих мов.[65] Більшість сучасних розробок Прологу пішли від поштовху проекту комп’ютерних систем п’ятої генерації, в рамках якого було розроблено варіант Прологу під назвою Kernel Language для його першої операційної системи.
Чисту Пролог було спочатку обмежено використанням системи доведення теорем з диз'юнктами Горна форми:
Г :- Т1, ..., Тn.
Застосунок системи доведення теорем обробляє такі твердження як процедури:
щоби показати/розв'язати Г, покажи/розв'яжи Т1 та ... та Тn.
Однак, чисту Пролог незабаром було розширено включенням заперечення як відмови, в якому заперечні умови форми not(Тi) показуються шляхом спроби і невдачі доведення відповідних позитивних умов Тi.
Подальші розширення Прологу оригінальною командою ввели до реалізацій можливості логічного програмування з обмеженнями.
Використання у промисловості
Пролог використовувалася в комп'ютерній системі Watson. Watson використовує програмне забезпечення DeepQA компанії IBM та програмний каркас Apache UIMA (англ. Unstructured Information Management Architecture, Архітектура Керування Неструктурованою Інформацією). Цю систему було написано багатьма мовами, включно з Java, C++ та Пролог, вона працює на операційній системі SUSE Linux Enterprise Server 11 з використанням програмного каркаса Apache Hadoop для забезпечення розподілених обчислень. Пролог використовується для зіставлення зі зразками над синтаксичними деревами природної мови. Розробники цієї системи заявили:
Ми потребували мови, якою ми могли би зручно виражати правила зіставлення зі зразками над синтаксичними деревами та іншими тлумаченнями (такими як результати розпізнавання іменованих сутностей), і технології, здатної виконувати ці правила дуже ефективно. Ми виявили, що Пролог була ідеальним вибором такої мови через свою простоту та виразність.[11]
Оригінальний текст (англ.) We required a language in which we could conveniently express pattern matching rules over the parse trees and other annotations (such as named entity recognition results), and a technology that could execute these rules very efficiently. We found that Prolog was the ideal choice for the language due to its simplicity and expressiveness. |
Див. також
- Порівняння реалізацій Прологу
- Логіко-лінгвістичне моделювання. Метод побудови систем на основі знань, що використовує Пролог.
- Програмування наборами відповідей. Повністю декларативний підхід до логічного програмування.
- Асоціація логічного програмування
Споріднені мови
- Мова Gödel є суворо типізованою реалізацією паралельного програмування логіки з обмеженнями. Її побудовано на базі SICStus Prolog.
- Visual Prolog, раніше відома як PDC Prolog та Turbo Prolog, є суворо типізованим об'єктно-орієнтованим діалектом Прологу, що дуже сильно відрізняється від стандартної Пролог. Як Turbo Prolog вона просувалася компанією Borland, але тепер вона розробляється та просувається данською фірмою PDC (Prolog Development Center), яка її спочатку і створила.
- Datalog є підмножиною Прологу. Вона обмежена відношеннями, що можуть стратифіковуватися, і не дозволяє складених термів. На відміну від Прологу, Dalalog не є повною за Тюрингом.
- Mercury є відгалуженням від Прологу, спрямованим на велику розробку програмного забезпечення, і має статичну, поліморфну систему типізації, а також систему режимів та детермінізму.
- CSC GraphTalk є власною реалізацією абстрактної машини Воррена, з додатковими об'єктно-орієнтованими властивостями.
- У певному сенсі[якому?] Пролог є підмножиною мови Planner. Пізніше ідеї мови Planner було розвинуто у метафору наукової спільноти.
- AgentSpeak є варіантом Прологу для програмування поведінки агентів у багатоагентних системах.
- Erlang почала життя з реалізації на базі Прологу, і зберігає більшість синтаксису Прологу на базі об'єднань.
Примітки
- Clocksin, William F.; Mellish, Christopher S. (2003). Programming in Prolog. Berlin ; New York: Springer-Verlag. ISBN 978-3-540-00678-7. (англ.)
- Bratko, Ivan (2001). Prolog programming for artificial intelligence. Harlow, England ; New York: Addison Wesley. ISBN 0-201-40375-7. (англ.)
- Covington, Michael A. (1994). Natural language processing for Prolog programmers. Englewood Cliffs, N.J.: Prentice Hall. ISBN 978-0-13-629213-5. (англ.)
- Lloyd, J. W. (1984). Foundations of logic programming. Berlin: Springer-Verlag. ISBN 3-540-13299-6. (англ.)
- Kowalski, R. A. (1988). The early years of logic programming. Communications of the ACM 31: 38. doi:10.1145/35043.35046. (англ.)
- Colmerauer, A.; Roussel, P. (1993). The birth of Prolog. ACM SIGPLAN Notices 28 (3): 37. doi:10.1145/155360.155362. (англ.)
- Див. Логічне програмування#Історія.
- Stickel, M. E. (1988). A prolog technology theorem prover: Implementation by an extended prolog compiler. Journal of Automated Reasoning 4 (4): 353–380. doi:10.1007/BF00297245. (англ.)
- Merritt, Dennis (1989). Building expert systems in Prolog. Berlin: Springer-Verlag. ISBN 0-387-97016-9. (англ.)
- Fernando C. N. Pereira; Stuart M. Shieber (2005). Prolog and Natural Language Analysis. Microtome. (англ.)
- Adam Lally; Paul Fodor (31 березня 2011). Natural Language Processing With Prolog in the IBM Watson System. Association for Logic Programming. (англ.) Див. також IBM Watson.
- Covington, Michael A.; Bagnara, Roberto; O'Keefe, Richard A.; Wielemaker, Jan; Price, Simon (2011). Coding guidelines for Prolog. Theory and Practice of Logic Programming 12 (6): 889–927. arXiv:0911.2899. doi:10.1017/S1471068411000391. (англ.)
- Kirschenbaum, M.; Sterling, L.S. (1993). Applying Techniques to Skeletons. Constructing Logic Programs, (ed. J.M.J. Jacquet): 27–140. (англ.)
- Sterling, Leon (2002). Patterns for Prolog Programming. Computational Logic: Logic Programming and Beyond. Lecture Notes in Computer Science / Lecture Notes in Artificial Intelligence 2407. с. 17–26. ISBN 978-3-540-43959-2. doi:10.1007/3-540-45628-7_15. (англ.)
- D. Barker-Plummer. Cliche programming in Prolog. In M. Bruynooghe, editor, Proc. Second Workshop on Meta-Programming in Logic, pages 247–256. Dept. of Comp. Sci., Katholieke Univ. Leuven, 1990. (англ.)
- Gegg-harrison, T. S. (1995). Representing Logic Program Schemata in Prolog Procs. Twelfth International Conference on Logic Programming. с. 467–481. (англ.)
- Deville, Yves (1990). Logic programming: systematic program development. Wokingham, England: Addison-Wesley. ISBN 0-201-17576-2. (англ.)
- Naish, Lee (1996). Higher-order logic programming in Prolog. Department of Computer Science, University of Melbourne. Процитовано 2 листопада 2010. (англ.)
- With regard to Prolog variables, variables only in the head are implicitly universally quantified, and those only in the body are implicitly existentially quantified. Процитовано 04 травня 2013. (англ.)
- ISO/IEC 13211: Information technology — Programming languages — Prolog. International Organization for Standardization, Geneva. (англ.)
- ISO/IEC 13211-2: Modules. (англ.)
- Paulo Moura, Logtalk in Association of Logic Programming Newsletter. Vol 17 n. 3, August 2004. (англ.)
- Shapiro; Ehud, Y.; Sterling, Leon (1994). The art of Prolog: advanced programming techniques. Cambridge, Mass: MIT Press. ISBN 0-262-19338-8. (англ.)
- Ed-Dbali, A.; Deransart, Pierre; Cervoni, L. (1996). Prolog: the standard: reference manual. Berlin: Springer. ISBN 3-540-59304-7. (англ.)
- ISO/IEC 13211-1:1995/Cor.1:2007 (англ.)
- ISO/IEC 13211-1:1995/Cor 2:2012 (англ.)
- WG17 Working Group Архівовано 24 жовтня 2009 у Wayback Machine. (англ.)
- X3J17 Committee Архівовано 23 серпня 2009 у Wayback Machine. (англ.)
- David H. D. Warren. «An abstract Prolog instruction set». Technical Note 309, SRI International, Menlo Park, CA, October 1983. (англ.)
- Van Roy, P.; Despain, A. M. (1992). High-performance logic programming with the Aquarius Prolog compiler. Computer 25: 54. doi:10.1109/2.108055. (англ.)
- Graf, Peter (1995). Term indexing. Springer. ISBN 978-3-540-61040-3. (англ.)
- Wise, Michael J.; Powers, David M. W. (1986). Indexing Prolog Clauses via Superimposed Code Words and Field Encoded Words International Symposium on Logic Programming. с. 203–210. (англ.)
- Colomb, Robert M. (1991). Enhancing unification in PROLOG through clause indexing. The Journal of Logic Programming 10: 23. doi:10.1016/0743-1066(91)90004-9. (англ.)
- Swift, T. (1999). Tabling for non‐monotonic programming. Annals of Mathematics and Artificial Intelligence 25 (3/4): 201–200. doi:10.1023/A:1018990308362. (англ.)
- Zhou, Neng-Fa; Sato, Taisuke (2003). Efficient Fixpoint Computation in Linear Tabling. Proceedings of the 5th ACM SIGPLAN International Conference on Principles and Practice of Declarative Programming: 275–283. (англ.)
- Swift, T.; Warren, D. S. (2011). XSB: Extending Prolog with Tabled Logic Programming. Theory and Practice of Logic Programming 12: 157. doi:10.1017/S1471068411000500. (англ.)
- Abe, S.; Bandoh, T.; Yamaguchi, S.; Kurosawa, K.; Kiriyama, K. (1987). High performance integrated Prolog processor IPP. Proceedings of the 14th annual international symposium on Computer architecture - ISCA '87. с. 100. ISBN 0818607769. doi:10.1145/30350.30362. (англ.)
- Robinson, Ian (1986). A Prolog processor based on a pattern matching memory device Third International Conference on Logic Programming. Lecture Notes in Computer Science 225. Springer. с. 172–179. ISBN 978-3-540-16492-0. doi:10.1007/3-540-16492-8_73. (англ.)
- Taki, K.; Nakajima, K.; Nakashima, H.; Ikeda, M. (1987). Performance and architectural evaluation of the PSI machine. ACM SIGPLAN Notices 22 (10): 128. doi:10.1145/36205.36195. (англ.)
- Gupta, G.; Pontelli, E.; Ali, K. A. M.; Carlsson, M.; Hermenegildo, M. V. (2001). Parallel execution of prolog programs: a survey. ACM Transactions on Programming Languages and Systems 23 (4): 472. doi:10.1145/504083.504085. (англ.)
- http://www.cl.cam.ac.uk/~am21/research/sa/byrdbox.ps.gz (англ.)
- Logic programming for the real world. Zoltan Somogyi, Fergus Henderson, Thomas Conway, Richard O'Keefe. Proceedings of the ILPS'95 Postconference Workshop on Visions for the Future of Logic Programming. (англ.)
- The Prolog 1000 database http://www.faqs.org/faqs/prolog/resource-guide/part1/section-9.html (англ.)
- Jan Wielemaker and Vıtor Santos Costa: Portability of Prolog programs: theory and case-studies. CICLOPS-WLPE Workshop 2010. (англ.)
- Kiselyov, Oleg; Kameyama, Yukiyoshi (2014). Re-thinking Prolog Proc. 31st meeting of the Japan Society for Software Science and Technology. (англ.)
- Torkel Franzen (1994). Declarative vs procedural. Association of Logic Programming Newsletter. Vol 7(3). (англ.)
- Dantsin, Evgeny; Eiter, Thomas; Gottlob, Georg; Voronkov, Andrei (2001). Complexity and Expressive Power of Logic Programming. ACM Computing Surveys 33 (3): 374–425. doi:10.1145/502807.502810. (англ.)
- Mycroft, A.; O'Keefe, R. A. (1984). A polymorphic type system for prolog. Artificial Intelligence 23 (3): 295. doi:10.1016/0004-3702(84)90017-1. (англ.)
- Pfenning, Frank (1992). Types in logic programming. Cambridge, Mass: MIT Press. ISBN 0-262-16131-1. (англ.)
- Schrijvers, Tom; Santos Costa, Vitor; Wielemaker, Jan; Demoen, Bart (2008). Towards Typed Prolog. У Maria Garcia de la Banda; Enrico Pontelli. Logic programming : 24th international conference, ICLP 2008, Udine, Italy, December 9-13, 2008 : proceedings. Lecture Notes in Computer Science 5366. с. 693–697. ISBN 9783540899822. doi:10.1007/978-3-540-89982-2_59. (англ.)
- Apt, K. R.; Marchiori, E. (1994). Reasoning about Prolog programs: From modes through types to assertions. Formal Aspects of Computing 6 (6): 743. doi:10.1007/BF01213601. (англ.)
- O'Keefe, Richard A. (1990). The craft of Prolog. Cambridge, Mass: MIT Press. ISBN 0-262-15039-5. (англ.)
- Michael Covington; Roberto Bagnara; Richard O'Keefe; Jan Wielemaker; Simon Price (2010). «Coding guidelines for Prolog». arXiv:0911.2899 [cs.PL]. (англ.)
- Roy, P.; Demoen, B.; Willems, Y. D. (1987). Improving the execution speed of compiled Prolog with modes, clause selection, and determinism. Tapsoft '87. Lecture Notes in Computer Science 250. с. 111. ISBN 3-540-17611-X. doi:10.1007/BFb0014976. (англ.)
- Jaffar, J. (1994). Constraint logic programming: a survey. The Journal of Logic Programming. 19-20: 503–581. doi:10.1016/0743-1066(94)90033-7. (англ.)
- Colmerauer, Alain (1987). Opening the Prolog III Universe. Byte. August. (англ.)
- Wallace, M. (2002). Constraint Logic Programming. Computational Logic: Logic Programming and Beyond. Lecture Notes in Computer Science 2407. с. 512–556. ISBN 3540456287. doi:10.1007/3-540-45628-7_19. (англ.)
- XPCE graphics library. Архів оригіналу за 25 червня 2013. Процитовано 10 грудня 2012. (англ.)
- prolog-mpi. Apps.lumii.lv. Архів оригіналу за 25 червня 2013. Процитовано 16 вересня 2010. (англ.)
- Ehud Shapiro. The family of concurrent logic programming languages ACM Computing Surveys. September 1989. (англ.)
- Wielemaker, J.; Huang, Z.; Van Der Meij, L. (2008). SWI-Prolog and the web. Theory and Practice of Logic Programming 8 (03). doi:10.1017/S1471068407003237. (англ.)
- Jan Wielemaker and Michiel Hildebrand and Jacco van Ossenbruggen (2007). Using {Prolog} as the fundament for applications on the semantic web. У S.Heymans, A. Polleres, E. Ruckhaus, D. Pearse, and G. Gupta. Proceedings of the 2nd Workshop on Applications of Logic Programming and to the web, Semantic Web and Semantic Web Services. CEUR Workshop Proceedings (Porto, Portugal: CEUR-WS.org) 287: 84–98. (англ.)
- Processing OWL2 Ontologies using Thea: An Application of Logic Programming. Vangelis Vassiliadis, Jan Wielemaker and Chris Mungall. Proceedings of the 5th International Workshop on OWL: Experiences and Directions (OWLED 2009), Chantilly, VA, United States, October 23-24, 2009 (англ.)
- Loke, S. W.; Davison, A. (2001). Secure Prolog-based mobile code. Theory and Practice of Logic Programming 1. doi:10.1017/S1471068401001211. (англ.)
- Pountain, Dick (Жовтень 1984). POP and SNAP. BYTE. с. 381. Процитовано 23 жовтня 2013. (англ.)
Література
- Blackburn, Patrick; Bos, Johan; Striegnitz, Kristina (2006). Learn Prolog Now!. ISBN 1-904987-17-6. (англ.)
- Братко И. Алгоритмы искусственного интеллекта на языке PROLOG. — М, СПб, К: Вильямс, 2004–640 с. — ISBN 5-8459-0664-4. (рос.)
- Clocksin W. F. Programming in Prolog: Using the ISO Standard / Mellish C. S. — Вид. 5 — Springer, 2003–299 с. — ISBN 978-3-540-00678-7. (Це видання оновлено для Прологу ISO. Попередні видання описували Единбурзьку Пролог.) (англ.)
- Clocksin W. F. Clause and Effect. Prolog Programming for the Working Programmer. — Springer, 2003–152 с. — ISBN 978-3-540-62971-9. (англ.)
- Covington M. A. Prolog Programming in Depth / Nute D., Vellino A. — 1996–516 с. — ISBN 0-13-138645-X. (англ.)
- Covington M. A. Natural Language Processing for Prolog Programmers. — 1994–348 с. — ISBN 978-0-13-629213-5. (англ.)
- M. S. Dawe and C.M.Dawe, Prolog for Computer Sciences, Springer Verlag 1992. (англ.)
- ISO/IEC 13211: Information technology — Programming languages — Prolog. — Geneva: International Organization for Standardization. (англ.)
- Feliks Kluźniak and Stanisław Szpakowicz (with a contribution by Janusz S. Bień). Prolog for Programmers. Academic Press Inc. (London), 1985, 1987 (доступна під ліцензією Creative Commons на https://sites.google.com/site/prologforprogrammers/). ISBN 0-12-416521-4. (англ.)
- O'Keefe R. The Craft of Prolog. — 387 с. — ISBN 0-262-15039-5. (англ.)
- Robert Smith, John Gibson, Sloman A.: 'POPLOG's two-level virtual machine support for interactive languages', in Research Directions in Cognitive Science Volume 5: Artificial Intelligence, Eds D. Sleeman and N. Bernsen, Lawrence Erlbaum Associates, pp 203–231, 1992. (англ.)
- Стерлинг Л. Искусство программирования на языке Пролог / Шапиро Э. — М: Мир, 1990–333 с. — ISBN 5-03-000406-8. (рос.)
- Warren D. H. D. Prolog — the language and its implementation compared with Lisp / Pereira L. M., Pereira F. // ACM SIGART Bulletin archive, Issue 64. Proceedings of the 1977 symposium on Artificial intelligence and programming languages. — с. 109–115. (англ.)
- Трушевський В. М. Технології та мови програмування для штучного інтелекту. Частина 1: Основи програмування мовою Prolog. — Львів: 2006–120 с.
Посилання
- comp.lang.prolog FAQ (англ.)
- Посібник користувача Прологу DECsystem-10 (текстовий формат) описує типову Единбурзьку Пролог (англ.)
- Prolog Tutorial від J. R. Fisher (англ.)
- Виконувані приклади від Lloyd Allison (англ.)
- On-line guide to Prolog Programming від Roman Bartak (англ.)
- Learn Prolog Now! від Patrick Blackburn, Johan Bos та Kristina Striegnitz (англ.) (фр.)
- Prolog and Logic Programming від Dr Peter Hancox (англ.)
- Adventure in Prolog, навчальний інтернет-посібник від Dennis Merritt (англ.)
- Building Expert Systems in Prolog, інтернет-книга від Dennis Merritt (англ.)
- Literate programming in Prolog (англ.)
- Amzi! Prolog + Logic Server™ від Dennis Merritt (англ.)
- Prolog Tutorial I[недоступне посилання з квітня 2019] від Клайва Спенсера, LPA (англ.)
- Prolog Tutorial II[недоступне посилання з квітня 2019] від Клайва Спенсера, LPA (англ.)
- JIProlog від Уго Кірико (англ.)
- Progopedia:Prolog (рос.)