Пролог була однією з перших логічних мов програмування,[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 відображає терм на екрані.
Виконання
Виконання прологової програми починається задаванням користувачем єдиної цілі, що зветься запитом. З точки зору логіки, рушій Прологу намагається знайти спростування резолюції заперечення цього запиту. Метод резолюції, що використовується у Пролозі, називається ВЛВ-резолюцією. Якщо заперечення запиту може бути спростовано, з цього випливає, що запит, з відповідними зв'язуваннями змінних, є логічним висновком програми. У такому разі всі створені зв'язування змінних повідомляються користувачеві, і про запит повідомляється, що він досяг успіху. З практичної точки зору, стратегію виконання Прологу можна уявити як узагальнення викликів функцій в інших мовах, з тією різницею, що заданому запитові можуть відповідати голови кількох тверджень. В такому випадку система створює точку вибору, об'єднує ціль з головою твердження першої альтернативи, і продовжує цілями цієї першої альтернативи. Якщо в напрямку виконання програми будь-яка ціль зазнає невдачі, всі зв'язування змінних, що було зроблено від останньої на той момент точки вибору, скасовуються, і виконання продовжується з наступною альтернативою цієї точки вибору. Ця стратегія виконання називається хронологічним пошуком з вертанням. Наприклад:
Виходячи з цього, наступний запит оцінюється як істинний:
?-брат_або_сестра(святослав,анна).Yes
Це отримується таким чином: Спочатку єдиною відповідною головою твердження до запиту брат_або_сестра(святослав, анна) є перша, тому надавання запиту є рівноцінним надаванню тіла того твердження з відповідними зв'язуваннями змінних, тобто, кон'юнкція (батько_або_мати_дитини(Z,святослав), батько_або_мати_дитини(Z,анна)). Наступною ціллю для доведення є крайня зліва з цієї кон'юнкції, тобто, батько_або_мати_дитини(Z,святослав). Цій цілі відповідають голови двох правил. Система створює точку вибору, і пробує перший вибір, чиїм тілом є батько_дитини(Z, святослав). Цю ціль може бути доведено з використанням факту батько_дитини(ярослав, святослав), тому створюється зв'язування Z = ярослав, і наступною ціллю для доведення стає друга частина наведеної вище кон'юнкції: батько_або_мати_дитини(ярослав, анна). І знову, це може бути доведено відповідним фактом. Оскільки всі цілі доведено, запит досягає успіху. Оскільки запит не містить жодних змінних, користувачеві не повідомляються жодні зв'язування. Запит зі змінними, як-то:
?-батько_дитини(Батько,Дитина).
перелічує всі дійсні відповіді пошуку з вертанням.
Зверніть увагу, що з наведеним вище кодом запит ?- брат_або_сестра(святослав, святослав). також досягає успіху. Якщо потрібно, можна додати додаткові цілі для опису відповідних обмежень.
Цикли та рекурсія
Ітеративні алгоритми може бути реалізовано засобами рекурсивних предикатів.
Заперечення
Вбудований предикат Прологу \+/1 забезпечує заперечення як відмову, що уможливлює немонотонну аргументацію. Ціль \+ нелегальне(X) у правилі
легальне(X):-\+нелегальне(X).
обчислюється таким чином. Пролог намагається довести нелегальне(X). Якщо доведення цієї цілі знайдено, то початкова ціль (тобто, \+ нелегальне(X)) зазнає невдачі. Якщо доведення не може бути знайдено, то початкова ціль досягає успіху. Отже, префіксний оператор \+/1 називається оператором «недовідне», оскільки запит ?- \+ Ціль. досягає успіху, якщо Ціль не є довідною. Цей вид заперечення є правильним, якщо його аргумент є замкненим (тобто, не містить змінних). Правильність втрачається, якщо аргумент містить змінні, і процедура доведення є повною. Зокрема, запит ?- легальне(X). тепер вже не може бути використано для перелічення усіх речей, що є легальними.
Програмування мовою Пролог
У Пролозі завантаження коду називається взяттям до уваги. Пролог може використовуватися інтерактивно шляхом введення запитів до підказки Прологу, ?-. Якщо розв'язку не існує, то Пролог пише no. Якщо розв'язок існує, то тоді друкується він. Якщо існує декілька розв'язків запиту, то їх може бути запитано введенням крапки з комою, ;. Існують керівні принципи з належної практики програмування для покращення ефективності, читабельності та підтримуваності коду.[12]
Далі слідують деякі приклади програм, написаних мовою Пролог.
"Hello, world!"
Приклад запиту:
?-write('Привіт, світе!'),nl.Привіт,світе!true.?-
Оптимізація компілятором
Будь-яке обчислення може бути виражено декларативно як послідовність переходу станів. Як приклад, оптимізувальний компілятор з трьома проходами оптимізації може бути реалізовано як відношення між початковою програмою та її оптимізованою формою:
Предикат вищого порядку — це предикат, що має один або більше інших предикатів як аргументи. Хоча підтримка програмування вищих порядків і виводить Пролог з області логіки першого порядку, яка не дозволяє квантифікації предикатів,[19] Пролог ISO вже має деякі вбудовані предикати вищих порядків, такі як call/1, call/2, call/3, findall/3, setof/3 та bagof/3.[20] Крім того, оскільки довільні цілі Прологу можуть створюватись та оцінюватись у реальному часі, нескладно писати предикати вищих порядків на кшталт maplist/2, що застосовує довільний предикат до кожного елемента наданого списку, та sublist/3, що відфільтровує елементи, які задовольняють наданому предикатові, уможливлюючи також і каррування.[18]
Для перетворення рішень з часового представлення (підстановки відповідей при зворотному пошуку) до просторового представлення (термів) Пролог має різноманітні предикати для всіх рішень, що збирають всі підстановки відповідей для заданого запиту до списку. Це може використовуватися у спискових виразах. Наприклад, досконалі числа дорівнюють сумі своїх дільників:
Коли P є таким предикатом, що для кожного XP(X,Y)об'єднуєY з єдиним унікальним значенням, maplist(P, Xs, Ys) є еквівалентом застосування функції map у функційному програмуванні як Ys = map(Function, Xs).
Програмування вищих порядків було започатковано у Пролозі в HiLog[en] та λProlog[en].
Модулі
Для великого програмування Пролог пропонує систему модулів. Цю систему модулів стандартизовано ISO.[21] Проте, не всі компілятори Прологу підтримують модулі, а також існують проблеми сумісності між системами модулів основних компіляторів Прологу.[22] Отже, модулі, написані під одним компілятором Прологу, не обов'язково працюватимуть під іншими.
Існує спеціальний запис, що називається граматиками визначених тверджень. Правило, визначене через -->/2 замість :-/2, розкривається препроцесором (expand_term/2, засіб, аналогічний макросам в інших мовах) відповідно до кількох прямих правил переписування, маючи результатом звичайні твердження Прологу. Найважливіше, що переписування споряджає предикат двома додатковими аргументами, що можуть використовуватися для неявного прокручування стану через них, аналогічно до монад в інших мовах. Граматики визначених тверджень часто використовуються для написання синтаксичних аналізаторів або генераторів списків, оскільки вони надають зручний інтерфейс до списків відмінностей.
Мета-інтерпретатори та рефлексія
Пролог є гомоіконною мовою, і забезпечує багато засобів для рефлексії. Її неявна стратегія виконання робить можливим написання стислого мета-циклічного інтерпретатора[en] (що також називають мета-інтерпретатором) коду чистої Пролог:
де true представляє порожню кон'юнкцію, а clause(Head, Body)об'єднується з твердженнями бази даних вигляду Head :- Body.
Оскільки прологові програми самі є послідовностями термів Прологу (:-/2 є інфіксним оператором), що легко читаються та аналізуються з використанням вбудованих механізмів (як-то read/1), можливо писати спеціальні інтерпретатори, що розширюють Пролог предметно-орієнтованими властивостями. Наприклад, Стерлінг та Шапіро представляють мета-інтерпретатор, що виконує міркування з неточностями, відтворений тут із незначними видозмінами:[23]:330
Цей інтерпретатор використовує таблицю вбудованих предикатів Пролог у вигляді[23]:327
builtin(AisB).builtin(read(X)).% etc.
та твердження, представлені як clause_cf(Голова, Тіло, Впевненість). Враховуючи це, його можна викликати як solve(Ціль, Впевненість), щоби виконати Ціль та отримати міру впевненості в результаті.
Повнота за Тюрингом
Чиста Пролог базується на підмножині предикатної логіки першого порядку, диз'юнктах Горна, що є повною за Тюрингом. Повноту Прологу за Тюрингом може бути показано шляхом використання її для імітації машини Тюрінга:
Простий приклад машини Тюринга визначається фактами:
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/IEC 13211-1,[20][24] опублікована в 1995 році, намагається стандартизувати наявні застосування багатьох реалізацій ключових елементів Прологу. Вона прояснила аспекти цієї мови, що раніше були неоднозначними, і веде до переносності програм. Є дві еррати: Cor.1:2007[25] та Cor.2:2012.[26] ISO/IEC 13211-2,[20] опублікована в 2000 році, додає до стандарту підтримку модулів. Стандарт підтримується робочою групою ISO/IEC JTC1[en]/SC22[en]/WG17[27]. Технічною дорадчою групою США для цього стандарту є ANSI X3J17.[28]
Компіляція
Для більшої ефективності код Прологу зазвичай компілюється в код абстрактної машини, що часто знаходиться під впливом набору інструкцій базованої на регістрахабстрактної машини Воррена[en].[29] Деякі реалізації вживають абстрактну інтерпретацію[en] для встановлення інформації про тип та напрямок предикатів під час компіляції, або, для вищої продуктивності, компілюють у код реальної машини.[30] У спільноті логічного програмування придумування ефективних методів реалізації коду Прологу є полем активних досліджень, і в деяких реалізаціях застосовується багато інших методів виконання. Вони включають перетворення тверджень у двійкову форму та віртуальні машини, базовані на стеку[en].[джерело?]
Хвостова рекурсія
Для детермінованих предикатів, що демонструють хвостову рекурсію, або, загальніше, хвостові виклики, прологові системи зазвичай реалізують добре відомий метод оптимізації, що зветься оптимізацією хвостового виклику (англ.Tail Call Optimization, TCO): Перед виконанням виклику в хвостовій позиції кадр стеку твердження скасовується. Отже, детерміновані предикати з хвостовою рекурсією виконуються з незмінним простором стеку, як цикли в інших мовах.
Пошук тверджень, що є об'єднуваними із термом у запиті, є лінійним відносно кількості тверджень. Індексування термів[en] використовує структуру даних, що уможливлює суб-лінійний пошук.[31] Індексування впливає лише на продуктивність програми, семантики воно не зачіпає. Більшість Прологів використовує індексування лише за першим термом, оскільки індексування за всіма термами є витратним, але прийоми на базі кодованих полямислів або наднакладених[en] кодових слів забезпечують швидке індексування по всьому запитові та голові.[32][33]
Табулювання
Деякі прологові системи (BProlog[en], 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]
Пролог є нетипізованою мовою. Спроби запровадити типи сходять до 1980-х років,[48][49] і станом на 2008 рік все ще існують спроби розширити Пролог типами.[50] Ця інформація корисна не лише для безпечної типізації, а й для розуміння прологових програм.[51]
Режими
Ознака режиму
Інтерпретація
+
nonvar на вході
-
var на вході
?
Не визначено
Синтаксис Прологу не визначає, які з аргументів предикату є вхідними, а які вихідними.[52] Проте ця інформація є істотною, і рекомендується включати її до коментарів.[53] Режими надають цінну інформацію для розуміння прологових програм,[51] а також можуть використовуватися для прискорення виконання.[54]
Обмеження
Логічне програмування з обмеженнями[en] розширює Пролог включенням концепцій із задоволення обмежень[en].[55][56] Програма з логікою обмежень дозволяє обмеження в тілах тверджень, як, наприклад, A(X,Y) :- X+Y>0. Це підходить для великомасштабних задач комбінаторної оптимізації[57] й, отже, для застосувань у промислових умовах, таких як автоматизоване складання розкладів та планування виробництва[en]. Більшість прологових систем постачаються із щонайменше одним розв'язувачем обмежень для зліченних областей визначення, а часто також і з розв'язувачами для інших областей визначення, таких як дійсні числа.
Logtalk[en] — це об'єктно-орієнтована мова логічного програмування, що може застосовувати більшість реалізацій Прологу як внутрішній компілятор. Як мультипарадигмова мова, вона включає підтримку як прототипів, так і класів.
Oblog — це невелике переносне об'єктно-орієнтоване розширення Прологу від Маргарити Макдугалл (англ.Margaret McDougall) з EdCAAD Единбурзького університету.
Objlog[en] була фреймовою мовою, що поєднувала об'єкти та Пролог II від НЦНДФранції у Марселі.
Prolog++[en] було розроблено компанією Logic Programming Associates[en], і вперше випущено у 1989 році для ПК MS-DOS. Було додано підтримку для інших платформ, і 1995 року випущено другу версію. У 1994 році видавництвом Addison-Wesley було опубліковано книгу Кріса Мосса (англ.Chris Moss) про Prolog++.
Графіка
Прологовими системами, що пропонують графічну бібліотеку, є SWI-prolog,[58] Visual-prolog, LPA Prolog для Windows та B-Prolog.
Cedar є безкоштовним та елементарним інтерпретатором Прологу. Від версії 4 та вище Cedar має підтримку FCA (Flash Cedar App). Це забезпечує нову платформу для програмування Прологом через ActionScript.
Транзакційна логіка[en] розширює Пролог теорією логіки операторів оновлення, що змінюють стан. Вона має як теоретико-модельну, так і процедурну семантику.
OW 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[en] надає інтеграцію рідного синтаксису з Java, обмін повідомленнями між програмними агентами та правила реакції. Prova позиціонує себе як скриптову систему на базі правил (англ.rule-based scripting, RBS) для підпрограмного забезпечення. Ця мова відкриває нові обрії у поєднанні імперативного та декларативного програмування.
C#-Prolog є інтерпретатором Прологу, написаним (керованою) C#. Може легко інтегруватися до програм мовою C#. Характеристики: надійний та досить швидкий інтерпретатор, інтерфейс командного рядка, інтерфейс Windows, вбудована граматика визначених тверджень, XML-предикати, SQL-предикати, розширюваний. Доступний повний джерельний код, включно з генератором синтаксичного аналізатора, що може бути використано для додавання розширень особливого призначення.
Jekejeke Prolog API[недоступне посилання з квітня 2019] надає сильнозв'язані можливості паралельних вхідних та вихідних викликів між Прологом та Java або Android, з визначною можливістю створення індивідуальних об'єктів баз знань. Він може застосовуватися для вбудовування Прологу ISO до самостійних застосунків, аплетів, сервлетів, APK тощо.
Назву Пролог (фр.Prolog) було обрано Філіпом Русселем[fr] як абревіатуру від програмування в логіці (фр.programmation en logique). Пролог було створено в 1972 році Аланом Кольмерое[en] з Філіпом Русселем на основі процедурної інтерпретації диз'юнктів ГорнаРоберта Ковальського. Це було частково мотивоване бажанням примирити використання логіки як мови декларативного представлення знань з процедурним представленням знань, що було популярне в Північній Америці наприкінці 1960-х і на початку 1970-х років. Згідно Роберта Ковальського, першу прологову систему було розроблено в 1972 році Аланом Кольмерое та Філіпом Русселем.[5] Перші реалізації Прологу були інтерпретаторами. Однак, Девід Воррен[en] створив абстрактну машину Воррена[en], ранній та впливовий компілятор Прологу, що прийшов, щоби визначити «Единбурзький» діалект Прологу, що послужив основою синтаксису більшості сучасних реалізацій.
Європейські дослідники штучного інтелекту віддавали перевагу Прологу, тоді як американці віддавали перевагу Ліспу, що, як повідомлялося, призводило до численних націоналістичних дебатів про переваги цих мов.[65] Більшість сучасних розробок Прологу пішли від поштовху проекту комп’ютерних систем п’ятої генерації, в рамках якого було розроблено варіант Прологу під назвою Kernel Language[en] для його першої операційної системи.
Чисту Пролог було спочатку обмежено використанням системи доведення теорем з диз'юнктами Горна форми:
Г :- Т1, ..., Тn.
Застосунок системи доведення теорем обробляє такі твердження як процедури:
щоби показати/розв'язати Г, покажи/розв'яжи Т1 та ... та Тn.
Однак, чисту Пролог незабаром було розширено включенням заперечення як відмови, в якому заперечні умови форми not(Тi) показуються шляхом спроби і невдачі доведення відповідних позитивних умов Тi.
Пролог використовувалася в комп'ютерній системі Watson. Watson використовує програмне забезпечення DeepQA компанії IBM та програмний каркас Apache UIMA[en] (англ.Unstructured Information Management Architecture, Архітектура Керування Неструктурованою Інформацією). Цю систему було написано багатьма мовами, включно з Java, C++ та Пролог, вона працює на операційній системі SUSE Linux Enterprise Server[en] 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.] Помилка: {{Lang}}: не вказано код мови (допомога)
Visual Prolog[en], раніше відома як PDC Prolog та Turbo Prolog, є суворо типізованимоб'єктно-орієнтованим діалектом Прологу, що дуже сильно відрізняється від стандартної Пролог. Як Turbo Prolog вона просувалася компанією Borland, але тепер вона розробляється та просувається данською фірмою PDC (Prolog Development Center), яка її спочатку і створила.
Datalog є підмножиною Прологу. Вона обмежена відношеннями, що можуть стратифіковуватися, і не дозволяє складених термів. На відміну від Прологу, Dalalog не є повною за Тюрингом.
Erlang почала життя з реалізації на базі Прологу, і зберігає більшість синтаксису Прологу на базі об'єднань.
Примітки
↑
Clocksin, William F.; Mellish, Christopher S. (2003), Programming in Prolog, Berlin ; New York: Springer-Verlag, ISBN978-3-540-00678-7(англ.)
↑
Bratko, Ivan (2001), Prolog programming for artificial intelligence, Harlow, England ; New York: Addison Wesley, ISBN0-201-40375-7(англ.)
↑
Covington, Michael A. (1994), Natural language processing for Prolog programmers, Englewood Cliffs, N.J.: Prentice Hall, ISBN978-0-13-629213-5(англ.)
↑ аб
Lloyd, J. W. (1984), Foundations of logic programming, Berlin: Springer-Verlag, ISBN3-540-13299-6(англ.)
↑
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. doi:10.1007/3-540-45628-7_15. ISBN978-3-540-43959-2. (англ.)
↑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. (англ.)
↑ абPaulo Moura, Logtalk in Association of Logic Programming Newsletter. Vol 17 n. 3, August 2004. [1] [Архівовано 2010-04-12 у Wayback Machine.] (англ.)
↑ аб
Shapiro; Ehud, Y.; Sterling, Leon (1994), The art of Prolog: advanced programming techniques, Cambridge, Mass: MIT Press, ISBN0-262-19338-8(англ.)
↑
Ed-Dbali, A.; Deransart, Pierre; Cervoni, L. (1996), Prolog: the standard: reference manual, Berlin: Springer, ISBN3-540-59304-7(англ.)
↑
Van Roy, P.; Despain, A. M. (1992). High-performance logic programming with the Aquarius Prolog compiler. Computer. 25: 54. doi:10.1109/2.108055. (англ.)
↑
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(PDF). 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. doi:10.1145/30350.30362. ISBN0818607769. (англ.)
↑
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. doi:10.1007/3-540-16492-8_73. ISBN978-3-540-16492-0. (англ.)
↑
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. (англ.)
↑ аб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. (англ.)
↑ аб
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). (англ.)
↑
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, ISBN0-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. doi:10.1007/978-3-540-89982-2_59. ISBN9783540899822. (англ.)
↑ аб
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, ISBN0-262-15039-5(англ.)
↑
Michael Covington та ін. (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. doi:10.1007/BFb0014976. ISBN3-540-17611-X. (англ.)
↑
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. doi:10.1007/3-540-45628-7_19. ISBN3540456287. (англ.)
↑prolog-mpi. Apps.lumii.lv. Архів оригіналу за 25 червня 2013. Процитовано 16 вересня 2010. (англ.)
↑Ehud Shapiro. The family of concurrent logic programming languagesACM Computing Surveys[en]. 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), S.Heymans, A. Polleres, E. Ruckhaus, D. Pearse, and G. Gupta (ред.), Using {Prolog} as the fundament for applications on the semantic web(PDF), 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 (англ.)
↑
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. (англ.)
Братко И.[en]Алгоритмы искусственного интеллекта на языке 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. (англ.)
Robert Smith, John Gibson, Sloman A.[en]: '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. (англ.)
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 с.