Пролог (мова програмування): відмінності між версіями

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
м Додано шаблон Перекладається
Немає опису редагування
Рядок 1: Рядок 1:
{{Otheruses|Пролог}}
{{Otheruses|Пролог}}
{{Перекладаю|Olexa Riznyk}}
{{Infobox programming language |
{{Infobox programming language |
name = Prolog |
name = Prolog |
Рядок 6: Рядок 5:
year = [[1972]] |
year = [[1972]] |
paradigm = [[логічне програмування]] |
paradigm = [[логічне програмування]] |
developer = [[Алан Кольмерауер]] |
developer = {{Не перекладено|треба=Алан Кольмерое|є=:en:Alain Colmerauer}} |
genre = [[Мова програмування]] |
genre = [[Мова програмування]] |
implementations = {{Не перекладено|треба=BProlog|є=:en:BProlog}}, {{Не перекладено|треба=Ciao (мова програмування)|текст=Ciao|є=:en:Ciao (programming language)}}, {{Не перекладено|треба=ECLiPSe|є=:en:ECLiPSe}}, {{Не перекладено|треба=GNU Prolog|є=:en:GNU Prolog}}, [http://www.jekejeke.ch/ Jekejeke Prolog], {{Не перекладено|треба=Logic Programming Associates|є=:en:Logic Programming Associates}}, Пролог {{Не перекладено|треба=Poplog|є=:en:Poplog}}, {{Не перекладено|треба=P Sharp|текст=P#|є=:en:P Sharp}}, Quintus, {{Не перекладено|треба=SICStus|є=:en:SICStus}}, {{Не перекладено|треба=Strawberry Prolog|текст=Strawberry|є=:en:Strawberry Prolog}}, [[SWI-Prolog]], {{Не перекладено|треба=tuProlog|є=:en:tuProlog}}, {{Не перекладено|треба=XSB|є=:en:XSB}}, {{Не перекладено|треба=YAP-Prolog|є=:en:YAP-Prolog}} |
dialects = ISO Пролог, Едінбург Пролог |
dialects = Пролог ISO, Единбурзька Пролог |
influenced by = [[PLANNER]] |
influenced = {{Не перекладено|треба=Visual Prolog|є=:en:Visual Prolog}}, {{Не перекладено|треба=Mercury (мова програмування)|текст=Mercury|є=:en:Mercury (programming language)}}, {{Не перекладено|треба=Oz (мова програмування)|текст=Oz|є=:en:Oz (programming language)}}, {{Не перекладено|треба=Erlang (мова програмування)|текст=Erlang|є=:en:Erlang (programming language)}}, {{Не перекладено|треба=Strand (мова програмування)|текст=Strand|є=:en:Strand (programming language)}}, {{Не перекладено|треба=KL0|є=:en:KL0}}, {{Не перекладено|треба=KL1|є=:en:KL1}}, {{Не перекладено|треба=Datalog|є=:en:Datalog}} |
file_ext = .pl .pro .P |
wikibooks = Prolog |
}}
}}


'''Проло́г'''&nbsp;— мова [[Логічне програмування|логічного програмування]] загального призначення, пов’язана зі [[Штучний інтелект|штучним інтелектом]] та [[Математична лінгвістика|математичною лінгвістикою]].<ref name=Clocksin2003>{{Citation | last = Clocksin | first = William F. | last2 = Mellish | first2 = Christopher S. | title = Programming in Prolog | year = 2003 | publisher = Springer-Verlag | location = Berlin ; New York | isbn = 978-3-540-00678-7 | pages = }}</ref><ref name=Bratko2001>{{Citation | last = Bratko | first = Ivan | title = Prolog programming for artificial intelligence | year = 2001 | publisher = Addison Wesley | location = Harlow, England ; New York | isbn = 0-201-40375-7 | pages = }}</ref><ref name=Covington1994>{{Citation | last = Covington | first = Michael A. | title = Natural language processing for Prolog programmers | year = 1994 | publisher = Prentice Hall | location = Englewood Cliffs, N.J. | isbn = 978-0-13-629213-5 | pages = }}</ref>
'''Проло́г'''&nbsp;— мова [[логічне програмування|логічного програмування]]. Пролог заснований на [[Теорія предикатів першого порядку|теорії предикатів першого порядку]]. Назва мови програмування розшифровується як ('''Про'''грамування в '''лог'''іці). Ідея використання можливостей наведення теорії предикатів першого порядку&nbsp;— одна з головних переваг мови Пролог для комп'ютерних наук взагалі та [[штучний інтелект|штучного інтелекту]].


Пролог має корені в [[Логіка першого порядку|логіці першого порядку]], [[Математична логіка|математичній логіці]], та, на відміну від багатьох інших [[Мова програмування|мов програмування]], є [[Декларативне програмування|декларативною]]: логіка програми виражається в термінах відношень, представлених як факти та {{Не перекладено|треба=Правило умовиводу|текст=правила|є=:en:Rule of inference}}. Обчислення ініціюється запуском ''запиту'' над цими відношеннями.<ref name=lloyd84/>
Основними поняттями у мові Пролог є факти, правила логічного висновку та запити, що дозволяють описувати [[база знань|бази знань]], процедури логічного виводу та прийняття рішень.


Цю мову програмування спочатку було задумано групою навколо {{Не перекладено|треба=Алан Кольмерое|текст=Алана Кольмерое|є=:en:Alain Colmerauer}} у [[Марсель|Марселі]] на початку [[1970-ті|1970-тих]], а першу систему Пролог було розроблено у [[1972]]-му Аланом Кольмерое та {{Не перекладено|мова=фр.|треба=Філіп Руссель|текст=Філіпом Русселем|є=:fr:Philippe Roussel}}.<ref name="Kowalski">{{Citation | unused_data = DUPLICATE DATA: doi = 10.1145/35043.35046 | doi = 10.1145/35043.35046 | last = Kowalski | first = R. A. | title = The early years of logic programming | journal = Communications of the ACM | volume = 31 | pages = 38 | year = 1988}}</ref><ref>{{Citation | doi = 10.1145/155360.155362 | first = A. | last = Colmerauer | first2 = P. | last2 = Roussel | title = The birth of Prolog | journal = ACM SIGPLAN Notices | volume = 28 | issue = 3 | pages = 37 | year = 1993}}</ref>
[[Факти]] у мові Пролог описуються логічними предикатами з конкретними значеннями. Правила в Пролозі записуються у формі правил логічного виводу з логічними висновками і списком логічних умов.


Пролог була однією з перших логічних мов програмування,<ref>Див. [[Логічне програмування#Історія]].</ref> й залишається найпопулярнішою серед таких мов і на сьогодні, маючи багато безкоштовних та комерційних реалізацій. Хоча спочатку цю мову програмування і було націлено на [[Обробка природної мови|обробку природної мови]], вона з тих пір простяглася далеко в інші області, як-то {{Не перекладено|треба=Автоматичне доведення теорем|текст=доведення теорем|є=:en:Automated theorem proving}},<ref>{{Citation | last = Stickel | first = M. E. | title = A prolog technology theorem prover: Implementation by an extended prolog compiler | journal = Journal of Automated Reasoning | volume = 4 | issue = 4 | pages = 353–380 | year = 1988 | doi = 10.1007/BF00297245}}</ref> [[експертні системи]],<ref>{{citation |last=Merritt |first=Dennis |title=Building expert systems in Prolog |publisher=Springer-Verlag |location=Berlin |year=1989 |pages= |isbn=0-387-97016-9 |oclc= |doi= |accessdate=}}</ref> ігри, системи автоматичних відповідей, [[Онтологія (інформатика)|онтології]] та складні [[Система керування|системи керування]]. Сучасні середовища Прологу підтримують як створення [[Графічний інтерфейс користувача|графічних інтерфейсів користувача]], так і адміністративні або мережеві застосування.
Особливу роль у [[інтерпретатор]]і Прологу відіграють конкретні запити до баз знань, на які система логічного програмування генерує відповіді «істина» і «брехня».Для узагальнених запитів із змінними у якості аргументів система Пролог виводить конкретні дані на підтвердження істинності узагальнених відомостей і правил виводу.


== Синтаксис та семантика ==
Факти в базах знань на мові Пролог представляють конкретні відомості (знання). Узагальнені відомості і знання в мові Пролог задаються правилами логічного виводу (визначеннями) і наборами таких правил виводу (визначень) над конкретними фактами і узагальненими відомостями.
{{Докладніше1|{{Не перекладено|треба=Синтаксис та семантика Прологу|є=:en:Prolog syntax and semantics}}}}
Програмна логіка у Пролозі виражається в термінах відношень, а обчислення ініціюється запуском ''запиту'' над цими відношеннями. Відношення та запити створюються з використанням єдиного типу даних Прологу, ''терму''.<ref name=lloyd84>{{citation |last=Lloyd |first=J. W. |title=Foundations of logic programming |publisher=Springer-Verlag |location=Berlin |year=1984 |pages= |isbn=3-540-13299-6 |oclc= |doi= |accessdate=}}</ref> Відношення виражаються ''реченнями''. Отримавши запит, рушій Прологу намагається знайти {{Не перекладено|треба=спростування|є=:en:Refutation}} [[Правило резолюцій|резолюції]] [[заперечення]] запиту. Якщо заперечення запиту може бути спростовано, тобто, знайдено набір значень всіх вільних змінних, що робить об’єднання атомарних формул та множини-[[Синґлетон (математика)|синґлетону]], що складається із заперечення запиту, хибним, то з цього випливає, що початковий запит, із застосуванням знайденого набору значень, є [[Логічна імплікація|логічним висновком]] програми. Це робить Пролог (та інші логічні мови програмування) надзвичайно зручною для застосування у базах даних, символьній математиці та граматичному аналізі мов. Оскільки Пролог дозволяє нечисті [[предикат]]и, перевірка [[Значення істинності|істинності]] певних спеціальних предикатів може мати деякий навмисний [[Побічний ефект (програмування)|побічний ефект]], як-то виведення значення на екран. Через це програмістові дозволено певною мірою використовувати звичайне [[імперативне програмування]], коли логічна парадигма є незручною. Пролог має як чисту логічну підмножину, що називається «чиста Пролог», так і ряд позалогічних властивостей.


=== Типи даних ===
Початок історії мови відноситься до 1970-х років. Будучи декларативною мовою програмування, Пролог сприймає у якості програми певний опис завдання або баз знань і сам робить логічний висновок, а також пошук розв'язків задач, користуючись механізмом [[бектрекінг|бектрекінгу]] ({{lang-en|backtracking}}) і уніфікацією.


Єдиним [[Тип даних|типом даних]] Прологу є ''терм''. Терми можуть бути ''атомами'', ''числами'', ''змінними'' або ''складеними термами''.
== Історія ==
Перша Пролог-програма була написана на початку 1970-х років у Франції в рамках проекту розуміння природної мови. Основний етап розвитку мови Пролог припадає на 1975—79 роки, коли на кафедрі штучного інтелекту [[Единбурзький університет|університету Единбургу]] [[Девід Воррен]] ({{lang-en|David H.D. Warren}}) і [[Фернандо Перейра]] ({{lang-en|Fernando Pereira}}) відповідали за реалізацію цієї мови. Вони створили перший [[інтерпретатор]] «Пролог». Ця версія стала першим стандартом мови «Пролог».


*'''Атом''' це загальна назва без притаманного значення. Прикладами атомів є <code>x</code>, <code>синій</code>, <code>'Бутерброд'</code> та <code>'якийсь атом'</code>.
== Декларативний і процедурний сенс пролог-програм ==
*'''Числа''' можуть бути {{Не перекладено|треба=Числа з плаваючою комою|текст=з плаваючою комою|є=:en:Floating point}}, або [[Цілі числа|цілими]].
У всіх прикладах завжди можна було зрозуміти результати роботи програми, точно не знаючи, як система насправді їх знайшла. Тому варто розрізняти два рівні сенсу програми на Пролозі, а саме: декларативний зміст і процедурний сенс.
*'''Змінні''' позначаються стрічками, що складаються з літер, цифр та символів підкреслення, і починаються з великої літери або символу підкреслення. Змінні дуже подібні до змінних в логіці в тім, що вони є позначками-заповнювачами для довільних термів.
*'''Складений терм''' складається з атому, що зветься [[функтор]], та певної кількості аргументів, що в свою чергу теж є термами. Складені терми зазвичай записуються у вигляді функтора, за яким у дужках слідує перелік термів-аргументів через кому. Кількість аргументів називається [[Арність|арністю]] терму. Атом може розглядатися як складений терм нульової арності. <code>рік_машини('Таврія', 1988)</code> та <code>'Друзі_Особи'(грай,[око,тур])</code> є прикладами складених термів.


Особливі випадки складених термів:
Декларативний сенс стосується лише відносин, визначених у програмі. Таким чином, декларативний зміст визначає, що повинно бути результатом роботи програми. З іншого боку, процедурний зміст визначає ще й як цей результат був отриманий, тобто як відносини реально обробляються пролог-системою.
Здатність пролог-системи опрацьовувати багато процедурних деталей самостійно вважається одним із специфічних переваг Прологу. Ця властивість спонукає програміста розглядати декларативний сенс програми незалежно від її процедурного сенсу. Оскільки результати роботи програми в принципі визначаються її декларативним глуздом, останнього (Знову ж таки в принципі) достатньо для написання програм. Цей факт має практичне значення, оскільки декларативні аспекти програми є, звичайно, більш легкими для розуміння, ніж процедурні деталі. Щоб витягти з цієї обставини найбільшу користь, програмісту слід зосередитися головним чином на декларативному сенсі і по можливості не відволікатися на деталі процесу обчислень. Останні варто в якомога більшій мірі надати самій пролог-системі.


*''Список'' є впорядкованою колекцією термів. Він позначається квадратними дужками з термами, розділеними комами, або, у випадку порожнього списку, <code>[]</code>. Наприклад, <code>[1,2,3]</code>, або <code>[червоний,зелений,синій]</code>.
Такий декларативний підхід і справді часто робить програмування на Пролозі більш легким, ніж на таких типових процедурно-орієнтованих мовах, як Паскаль. На жаль, однак, декларативного підходу не завжди виявляється, достатньо. Далі стане ясно, що, особливо у великих програмах, програміст не може повністю ігнорувати процедурні аспекти з міркувань ефективності обчислень. Тим не менше слід заохочувати декларативний стиль мислення при написанні пролог-програм, а процедурні аспекти ігнорувати в тих межах, які встановлюються практичними обмеженнями.
*''Стрічки'': послідовність символів у лапках, еквівалентна спискові (числових) кодів символів, зазвичай у місцевому [[Кодування символів|кодуванні]], або в [[Юнікод]]і, якщо система підтримує Юнікод. Наприклад, <code>"бути чи не бути"</code>.


=== Правила та факти ===
Пролог-програму можна розуміти по-різному: з декларативної і процедурної точок зору. Ще раз глянемо на відмінності між цими двома семантиками.


Прологові програми описують відношення, визначені реченнями. Чиста Пролог обмежена {{Не перекладено|треба=Диз’юнкт Хорна|текст=диз’юнктами Хорна|є=:en:Horn clauses}}. Є два типи речень: факти та правила. Правило має вигляд
Розглянемо пропозицію.


Голова :- Тіло.
:: Р:&nbsp;— Q, R.


і читається як «голова істинна, якщо тіло істинне». Тіло правила складається з викликів предикатів, що називаються '''цілями''' правила. Вбудований [[предикат]] <code>,/2</code> (що значить двоарний [[Оператор (програмування)|оператор]] з ім’ям <code>,</code>) позначає [[Кон'юнкція|кон’юнкцію]] цілей, а <code>;/2</code> — [[Диз'юнкція (логіка)|диз’юнкцію]]. Кон’юнкції та диз’юнкції можуть бути присутні лише в тілі, але не в голові правила.
де Р, Q і R мають синтаксис термів. Наведемо деякі способи декларативної інтерпретації цього речення:


Речення з порожніми тілами називаються '''фактами'''. Наприклад:
:: Р&nbsp;— істинно, якщо Q і R істинні.
:: З Q і R слід Р.


кіт(мурко).
А ось два варіанти його «процедурного» прочитання:


що рівноцінне правилу:
Щоб вирішити завдання Р, спочатку виріши підзадачі Q, а потім&nbsp;— підзадачі R.
Щоб досягти Р, спочатку досягни Q, а потім R.


кіт(мурко) :- true.
Таким чином, різниця між «декларативним» та «процедурним» прочитанні полягає в тому, що останнє визначає не тільки логічні зв'язки між головою пропозиції і цілями у його тілі, але ще і порядок, у якому ці цілі обробляються.


Вбудований предикат <code>true/0</code> є завжди істинним.
Формалізуємо тепер декларативний зміст.


Маючи наведений вище факт, можна спитати:
Декларативний сенс програми визначає, чи є дана мета справжньою (досяжною) і, якщо так, при яких значеннях змінних вона досягається. Для точного визначення декларативного сенсу нам буде потрібно поняття конкретизації пропозиції. Конкретизацією пропозиції З називається результат підстановки в нього на місце кожної змінної деякого терма. Варіантом пропозиції З називається така конкретизація С, при якій кожна змінна замінена на іншу зміну. Наприклад, розглянемо пропозицію:


''чи є мурко котом?''
:: маєдитину (X):&nbsp;— батько (X, Y).


?- кіт(мурко).
Наведемо два варіанти цієї пропозиції:
Yes


''що є котами?''
:: маєдитину (А):&nbsp;— батько (А, В).
:: маєдитину (X1):&nbsp;— батько (X1, Х2).


?- кіт(X).
Приклади конкретизацій цієї ж пропозиції:
X = мурко


Речення з тілами називаються '''правилами'''. Наприклад:
:: маєдитину (пітер):&nbsp;— батько (пітер, Z).
:: маєдитину (Баррі):&nbsp;— батько (Баррі, маленька (кароліна)).


тварина(X):- кіт(X).
Нехай дана деяка програма і мета G, тоді, відповідно до декларативної семантики, можна стверджувати, що Мета G істинна (тобто досяжна або логічно випливає з програми) тоді і тільки тоді, коли
(1) в програмі існує пропозиція С, таке, що
(2) існує така його (С) конкретизація I, що
:: (A) голова I збігається з G і
:: (Б) всі цілі в тілі I істинні.


Якщо ми додамо це правило та спитаємо, ''що є тваринами?''
Це визначення можна поширити на питання наступним чином.

У загальному випадку питання в пролог-системі є список цілей, розділених комами. Список цілей називається істинним (досяжним), якщо всі цілі в цьому списку правдиві (досяжні) при однакових конкретизація змінних. Значення змінних виходять з найзагальнішої конкретизації.
?- тварина(X).
X = мурко

Оскільки природа багатьох вбудованих предикатів є відносною, їх зазвичай можна використовувати в кількох напрямках. Наприклад, <code>length/2</code> може використовуватися як для визначення довжини списку (<code>length(List, L)</code>, коли задано список <code>List</code>), так і для створення кістяка списку заданої довжини (<code>length(X, 5)</code>), а також і для створення кістяків списків та їх довжин одночасно (<code>length(X, L)</code>). Так само, <code>append/3</code> може використовуватися як для з’єднання двох списків (<code>append(ListA, ListB, X)</code> коли задано списки <code>ListA</code> та <code>ListB</code>), так і для розділення заданого списку на частини (<code>append(X, Y, List)</code>, коли задано список <code>List</code>). Тому відносно невеликий набір бібліотечних предикатів є достатнім для великої кількості прологових програм.

Як мова загального призначення, Пролог також пропонує різноманітні вбудовані предикати для виконання всякої поточної діяльності, як-то {{Не перекладено|треба=введення/виведення|є=:en:Input/output}}, використання графіки, та іншої взаємодії з операційною системою. Ці предикати не мають значення відношень, і корисні лише для побічних ефектів, що вони спричиняють у системі. Наприклад, предикат <code>write/1</code> відображає терм на екрані.

=== Виконання ===

Виконання прологової програми починається задаванням користувачем єдиної цілі, що зветься запитом. З точки зору логіки, рушій Прологу намагається знайти спростування [[Правило резолюцій|резолюції]] заперечення цього запиту. Метод резолюції, що використовується у Пролозі, називається {{Не перекладено|треба=SLD-резолюція|текст=SLD-резолюцією|є=:en:SLD resolution}}. Якщо заперечення запиту може бути спростовано, з цього випливає, що запит, з відповідними зв’язуваннями змінних, є логічним висновком програми. У такому разі всі створені зв’язування змінних повідомляються користувачеві, і про запит повідомляється, що він досяг успіху. З практичної точки зору, стратегію виконання Прологу можна уявити як узагальнення викликів функцій в інших мовах, з тією різницею, що заданому запитові можуть відповідати голови кількох речень. В такому випадку система створює точку вибору, об’єднує ціль з головою речення першої альтернативи, і продовжує цілями цієї першої альтернативи. Якщо у напрямку виконання програми будь-яка ціль зазнає невдачі, всі зв’язування змінних, що було зроблено від останньої на той момент точки вибору, скасовуються, і виконання продовжується з наступною альтернативою цієї точки вибору. Ця стратегія виконання називається хронологічним [[Пошук з вертанням|пошуком з вертанням]]. Наприклад:


<source lang="prolog">
мати_дитини(ірина, святослав).
батько_дитини(ярослав, святослав).
батько_дитини(ярослав, анна).
батько_дитини(володимир, ярослав).
брат_або_сестра(X, Y) :- батько_або_мати_дитини(Z, X), батько_або_мати_дитини(Z, Y).
батько_або_мати_дитини(X, Y) :- батько_дитини(X, Y).
батько_або_мати_дитини(X, Y) :- мати_дитини(X, Y).
</source>


Виходячи з цього, наступний запит оцінюється як істинний:

?- брат_або_сестра(святослав, анна).
Yes

Це отримується наступним чином: Спочатку єдиною відповідною головою речення до запиту <code>брат_або_сестра(святослав, анна)</code> є перша, тому надавання запиту є рівноцінним надаванню тіла того речення з відповідними зв’язуваннями змінних, тобто, кон’юнкція <code>(батько_або_мати_дитини(Z,святослав), батько_або_мати_дитини(Z,анна))</code>. Наступною ціллю для доведення є крайня зліва з цієї кон’юнкції, тобто, <code>батько_або_мати_дитини(Z,святослав)</code>. Цій цілі відповідають голови двох правил. Система створює точку вибору, і пробує перший вибір, чиїм тілом є <code>батько_дитини(Z, святослав)</code>. Цю ціль може бути доведено з використанням факту <code>батько_дитини(ярослав, святослав)</code>, тому створюється зв’язування <code>Z = ярослав</code>, і наступною ціллю для доведення стає друга частина наведеної вище кон’юнкції: <code>батько_або_мати_дитини(ярослав, анна)</code>. І знову, це може бути доведено відповідним фактом. Оскільки всі цілі доведено, запит досягає успіху. Оскільки запит не містить жодних змінних, користувачеві не повідомляються жодні зв’язування. Запит зі змінними, як-то:

?- батько_дитини(Батько, Дитина).

перелічує всі дійсні відповіді пошуку з вертанням.

Зверніть увагу, що з наведеним вище кодом запит <code>?- брат_або_сестра(святослав, святослав).</code> також досягає успіху. Якщо потрібно, можна додати додаткові цілі для опису відповідних обмежень.

=== Цикли та рекурсія ===

Ітеративні алгоритми може бути реалізовано засобами [[Рекурсія|рекурсивних]] предикатів.

=== Заперечення ===

Вбудований предикат Прологу <code>\+/1</code> забезпечує {{Не перекладено|треба=Заперечення як невдача|текст=заперечення як невдачу|є=:en:Negation as failure}}, що уможливлює {{Не перекладено|треба=Немонотонна логіка|текст=немонотонну|є=:en:Non-monotonic logic}} аргументацію. Ціль <code>\+ легальне(X)</code> у правилі

нелегальне(X) :- \+ легальне(X).

обчислюється наступним чином. Пролог намагається довести <code>легальне(X)</code>. Якщо доведення цієї цілі знайдено, то початкова ціль (тобто, <code>\+ легальне(X)</code>) зазнає невдачі. Якщо доведення не може бути знайдено, то початкова ціль досягає успіху. Отже, префіксний оператор <code>\+/1</code> називається оператором «недовідне», оскільки запит <code>?- \+ Ціль.</code> досягає успіху, якщо Ціль не є довідною. Цей вид заперечення є [[Правильність|правильним]], якщо його аргумент є {{Не перекладено|треба=Замкнений вираз|текст=замкненим|є=:en:Ground expression}} (тобто, не містить змінних). Правильність втрачається, якщо аргумент містить змінні, та процедура доведення є повною. Зокрема, запит <code>?- нелегальне(X).</code> тепер вже не може бути використано для перелічення усіх речей, що є нелегальними.

== Приклади ==

Далі слідують деякі приклади програм, написаних Прологом.

=== Вітання світові ===

Приклад запиту:
<source lang="prolog">
?- write('Привіт, світе!'), nl.
Привіт, світе!
true.

?-
</source>

=== Оптимізація компілятора ===
Будь-яке обчислення може бути виражено декларативно як послідовність переходу станів. Як приклад, оптимізуючий компілятор з трьома проходами оптимізації може бути реалізовано як відношення між початковою програмою та її оптимізованою формою:

<source lang="prolog">
програма_оптимізована(Прог0, Прог) :-
оптимізація_прохід_1(Прог0, Прог1),
оптимізація_прохід_2(Прог1, Прог2),
оптимізація_прохід_3(Прог2, Прог).
</source>

або рівнозначно з використанням запису {{Не перекладено|треба=Граматика визначених речень|текст=граматики визначених речень|є=:en:Definite clause grammar}}:

<source lang="prolog">
програма_оптимізована --> оптимізація_прохід_1, оптимізація_прохід_2, оптимізація_прохід_3.
</source>

=== Швидке сортування ===

Алгоритм [[Швидке сортування|швидкого сортування]], що ставить у відповідність спискові його відсортовану версію:
<source lang="prolog">
розділення([], _, [], []).
розділення([X|Xs], Опорне, Малі, Великі) :-
( X @< Опорне ->
Малі = [X|Решта],
розділення(Xs, Опорне, Решта, Великі)
; Великі = [X|Решта],
розділення(Xs, Опорне, Малі, Решта)
).
швидке_сортування([]) --> [].
швидке_сортування([X|Xs]) -->
{ розділення(Xs, X, Менші, Більші) },
швидке_сортування(Менші), [X], швидке_сортування(Більші).
</source>

== Шаблони проектування ==

[[Шаблони проектування програмного забезпечення|Шаблон проектування]] це загальне рішення багаторазового використання поширеної проблеми у [[Проектування програмного забезпечення|проектуванні програмного забезпечення]]. У Пролозі шаблони проектування можуть носити різні назви: кістяки та техніки,<ref>{{Citation
| title = Applying Techniques to Skeletons
| year = 1993
| journal = Constructing Logic Programs, (ed. J.M.J. Jacquet)
| pages = 27–140
| last = Kirschenbaum | first = M.
| last2 = Sterling | first2 = L.S.}}</ref><ref>{{citation
|title=Computational Logic: Logic Programming and Beyond
|first=Leon
|last=Sterling
|journal=Lecture Notes in Computer Science
|year=2002
|volume=2407
|pages=17–26
|doi=10.1007/3-540-45628-7_15
|chapter=Patterns for Prolog Programming
|series=Lecture Notes in Computer Science
|isbn=978-3-540-43959-2
}}</ref> кліше,<ref>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.</ref> програмні схеми<ref name=Gegg-harrison1995>{{Citation
| title = Representing Logic Program Schemata in Prolog
| year = 1995
| last = Gegg-harrison
| first = T. S.
| journal = Procs. Twelfth International Conference on Logic Programming
| pages = 467–481
}}</ref> та схеми опису логіки.<ref>{{Citation | last = Deville | first = Yves | title = Logic programming: systematic program development | year = 1990 | publisher = Addison-Wesley | location = Wokingham, England | isbn = 0-201-17576-2 | pages = }}</ref> Альтернативою до шаблонів проектування є програмування вищих порядків.<ref name=Naish1996>{{Citation
| title = Higher-order logic programming in Prolog
| url = http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.35.4505
| year = 1996
| last = Naish
| first = Lee
| journal = Higher-order logic programming in Prolog
| accessdate = 2010-11-02
}}</ref>

== Програмування вищих порядків ==
{{Докладніше1|{{Не перекладено|треба=Логіка вищих порядків|є=:en:Higher-order logic}} та {{Не перекладено|треба=Програмування вищих порядків|є=:en:Higher-order programming}}}}
За визначенням, [[логіка першого порядку]] не дозволяє квантифікації предикатів. Предикат вищих порядків це предикат, що має один або більше інших предикатів у якості аргументів. Пролог вже має деякі вбудовані предикати вищих порядків, такі як <code>call/1</code>, <code>call/2</code>, <code>call/3</code>, <code>findall/3</code>, <code>setof/3</code> та <code>bagof/3</code>.<ref name="ISO 13211"/> Крім того, оскільки довільні цілі Прологу можуть створюватись та оцінюватись у реальному часі, нескладно писати предикати вищих порядків на кшталт <code>maplist/2</code>, що застосовує довільний предикат до кожного елемента наданого списку, та <code>sublist/3</code>, що відфільтровує елементи, що задовольняють наданому предикатові, беручи до уваги й {{Не перекладено|треба=карування|є=:en:Currying}}.<ref name="Naish1996"/>

Для перетворення рішень з часового представлення (підстановки відповідей при зворотному пошуку) до просторового представлення (термів) Пролог має різноманітні предикати для всіх рішень, що збирають всі підстановки відповідей для заданого запиту до списку. Це може використовуватися у [[Спискові вирази|спискових виразах]]. Наприклад, [[Досконале число|досконалі числа]] дорівнюють сумі своїх дільників:
<source lang="prolog">
perfect(N) :-
between(1, inf, N), U is N // 2,
findall(D, (between(1,U,D), N mod D =:= 0), Ds),
sumlist(Ds, N).
</source>
Це може бути використано для перелічування досконалих чисел, а також для перевірки, чи є число досконалим.

== Модулі ==

Для {{Не перекладено|треба=Велике і мале програмування|текст=великого програмування|є=:en:Programming in the large and programming in the small}} Пролог пропонує [[Модульне програмування|систему модулів]]. Цю систему модулів стандартизовано ISO.<ref>ISO/IEC 13211-2: Modules.</ref> Проте, не всі компілятори Прологу підтримують модулі, а також існують проблеми сумісності між системами модулів основних компіляторів Прологу.<ref name="cs.kuleuven.ac.be">Paulo Moura, Logtalk in Association of Logic Programming Newsletter. Vol 17 n. 3, August 2004. [http://www.cs.kuleuven.ac.be/~dtai/projects/ALP/newsletter/aug04/nav/print/all.html#logtalk]</ref> Отже, модулі, написані на одному компіляторі Прологу, не обов’язково працюватимуть на інших.

== Граматичний розбір ==
{{Докладніше1|{{Не перекладено|треба=Синтаксис та семантика Прологу#Граматики визначених речень|є=:en:Prolog syntax and semantics#Definite clause grammars}} та {{Не перекладено|треба=Граматика визначених речень|є=:en:Definite clause grammar}}}}
Існує спеціальний запис, що називається {{Не перекладено|треба=Граматика визначених речень|текст=граматики визначених речень|є=:en:Definite clause grammar}}. Правило, визначене через <code>-->/2</code> замість <code>:-/2</code>, розкривається препроцесором (<code>expand_term/2</code>, засіб, аналогічний макросам в інших мовах) відповідно до кількох прямих правил переписування, маючи результатом звичайні речення Прологу. Найважливіше, що переписування споряджає предикат двома додатковими аргументами, що можуть використовуватися для неявного прокручування стану через них, аналогічно до [[Монади (програмування)|монад]] в інших мовах. Граматики визначених речень часто використовуються для написання синтаксичних аналізаторів або генераторів списків, оскільки вони надають зручний інтерфейс до списків відмінностей.

== Мета-інтерпретатори та рефлексія ==
Пролог є {{Не перекладено|треба=Гомоіконічність|текст=гомоіконічною|є=:en:Homoiconicity}} мовою та забезпечує багато засобів для {{Не перекладено|треба=Рефлексія (програмування)|текст=рефлексії|є=:en:Reflection (computer programming)}}. Її неявна стратегія виконання робить можливим написання стислого {{Не перекладено|треба=Мета-циклічний інтерпретатор|текст=мета-циклічного інтерпретатора|є=:en:Meta-circular evaluator}} (що також називають ''мета-інтерпретатором'') коду чистої Пролог.<ref name=AOP94>{{citation |last=Shapiro|last2=Ehud|first2=Y.|last3=Sterling|first3=Leon |title=The art of Prolog: advanced programming techniques |publisher=MIT Press |location=Cambridge, Mass |year=1994 |pages= |isbn=0-262-19338-8 |oclc= |doi= |accessdate=}}</ref> Оскільки прологові програми самі є послідовностями термів Прологу (<code>:-/2</code> є інфіксним [[Оператор (програмування)|оператором]]), що легко читаються та аналізуються з використанням вбудованих механізмів (як-то <code>read/1</code>), нескладно писати спеціальні інтерпретатори, що розширюють Пролог специфічними особливостями.

== Повнота за Тюрингом ==
Чиста Пролог базується на підмножині {{Не перекладено|треба=Логіка предикатів|текст=логіки предикатів|є=:en:Predicate logic}} першого порядку, {{Не перекладено|треба=Диз’юнкт Хорна|текст=диз’юнктах Хорна|є=:en:Horn clauses}}, що є [[Повнота за Тюрингом|повною за Тюрингом]]. Повноту за Тюрингом Прологу може бути показано шляхом використання її для імітації машини Тюрінга:
<source lang="prolog">
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]).
</source>

Простий приклад машини Тюринга визначається фактами:
<source lang="prolog">
rule(q0, 1, q0, 1, right).
rule(q0, b, qf, 1, stay).
</source>

Ця машина виконує збільшення на одиницю числа в унарному кодуванні: вона проходить будь-яке число комірок «1» та додає додаткову «1» у кінці. Приклад запиту та результату:
<source lang="prolog">
?- turing([1,1,1], Ts).
Ts = [1, 1, 1, 1] ;
</source>

Це показує, як будь-яке обчислення може бути представлено декларативно як послідовність переходів станів, реалізована у Пролозі як відношення між послідовними станами, що нас цікавлять.

== Реалізація ==
{{Докладніше1|{{Не перекладено|треба=Порівняння реалізацій Прологу|є=:en:Comparison of Prolog implementations}}}}
=== Пролог ISO ===
Стандарт Прологу [[ISO]] складається з двох частин. ISO/IEC 13211-1,<ref name="ISO 13211">ISO/IEC 13211: Information technology &mdash; Programming languages &mdash; Prolog. [[International Organization for Standardization]], Geneva.</ref><ref>{{citation |first=A.|last=Ed-Dbali|last2=Deransart|first2=Pierre|first3=L.|last3=Cervoni |title=Prolog: the standard: reference manual |publisher=Springer |location=Berlin |year=1996 |pages= |isbn=3-540-59304-7 |oclc= |doi= |accessdate=}}</ref> опублікована у [[1995]] році, намагається стандартизувати наявні застосування багатьох реалізацій ключових елементів Прологу. Вона прояснила аспекти цієї мови, що раніше були неоднозначними, і веде до [[Портування|переносимості]] програм. Є дві [[Еррата|еррати]]: Cor.1:2007<ref name="Cor.1">[http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50405 ISO/IEC 13211-1:1995/Cor.1:2007]</ref> та Cor.2:2012.<ref name="Cor.2">[http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=58033 ISO/IEC 13211-1:1995/Cor 2:2012]</ref> ISO/IEC 13211-2,<ref name="ISO 13211" /> опублікована у [[2000]] році, додає до стандарту підтримку модулів. Стандарт підтримується робочою групою {{Не перекладено|треба=JTC1|текст=ISO/IEC JTC1|є=:en:JTC1}}/{{Не перекладено|треба=SC22|є=:en:SC22}}/WG17<ref name="WG17">[http://www.sju.edu/~jhodgson/wg17/ WG17 Working Group]</ref>. Технічною дорадчою групою [[США]] для цього стандарту є [[ANSI]] X3J17.<ref name="X3J17">[http://www.sju.edu/~jhodgson/x3j17.html X3J17 Committee]</ref>

=== Компіляція ===

Для більшої ефективності код Прологу зазвичай компілюється в код абстрактної машини, що часто знаходиться під впливом набору інструкцій {{Не перекладено|треба=Регістрова машина|текст=базованої на регістрах|є=:en:Register machine}} {{Не перекладено|треба=Абстрактна машина Уоррена|текст=абстрактної машини Уоррена|є=:en:Warren Abstract Machine}}.<ref>David H. D. Warren. [http://www.ai.sri.com/pubs/files/641.pdf "An abstract Prolog instruction set"]. Technical Note 309, {{Не перекладено|треба=SRI International|є=:en:SRI International}}, Menlo Park, CA, October 1983.</ref> Деякі реалізації вживають {{Не перекладено|треба=Абстрактна інтерпретація|текст=абстрактну інтерпретацію|є=:en:abstract interpretation}} для встановлення інформації про тип та напрямок предикатів під час компіляції, або, для вищої продуктивності, компілюють у код реальної машини.<ref>{{Citation | doi = 10.1109/2.108055 | last = Van Roy | first = P. | last2 = Despain | first2 = A. M. | title = High-performance logic programming with the Aquarius Prolog compiler | journal = Computer | volume = 25 | pages = 54 | year = 1992
}}</ref> У спільноті логічного програмування придумування ефективних методів реалізації коду Прологу є полем активних досліджень, і в деяких реалізаціях вживається багато інших методів виконання. Вони включають перетворення речень у двійкову форму та {{Не перекладено|треба=Стекова машина|текст=віртуальні машини, базовані на стеку|є=:en:Stack machine}}.{{Citation needed}}

=== Хвостова рекурсія ===

Для детермінованих предикатів, що демонструють [[Хвостова рекурсія|хвостову рекурсію]], або, загальніше, хвостові виклики, прологові системи зазвичай реалізують добре відомий метод оптимізації, що зветься [[Хвостова рекурсія|оптимізацією хвостового виклику]] ({{lang-en|Tail Call Optimization, TCO}}): Кадр стеку скасовується перед виконанням виклику у хвостовій позиції. Отже, детерміновані предикати з хвостовою рекурсією виконуються з незмінним простором стеку, як цикли в інших мовах.

=== Індексування термів ===
{{Докладніше1|{{Не перекладено|треба=Індексування термів|є=:en:Term indexing}}}}
Пошук речень, що є об’єднуваними із термом у запиті, є лінійним відносно кількості речень. {{Не перекладено|треба=Індексування термів|є=:en:Term indexing}} використовує [[Структура даних|структуру даних]], що уможливлює [[Обчислювальна складність|суб-лінійний]] пошук.<ref>{{Citation | last = Graf | first = Peter | title = Term indexing | year = 1995 | publisher = Springer | location = Berlin ; New York | isbn = 978-3-540-61040-3 | pages = }}</ref> Індексування впливає лише на продуктивність програми, семантики воно не зачіпає.

=== Табулювання ===

Деякі прологові системи ({{Не перекладено|треба=BProlog|є=:en:BProlog}}, {{Не перекладено|треба=XSB|є=:en:XSB}} та Yap) реалізують метод {{Не перекладено|треба=Мемоїзація|текст=мемоїзації|є=:en:Memoization}}, що зветься ''табулювання'', що звільняє користувача від необхідності зберігати проміжні результати вручну.<ref>{{Citation
| last = Swift | first = T.
| journal = Annals of Mathematics and Artificial Intelligence
| volume = 25
| issue = 3/4
| pages = 201–200
| year = 1999
| doi = 10.1023/A:1018990308362
}}</ref><ref>[http://www.sci.brooklyn.cuny.edu/~zhou/papers/ppdp03.pdf Neng-Fa Zhou and Taisuke Sato (2003): Efficient Fixpoint Computation in Linear Tabling, In Proceedings of the 5th ACM SIGPLAN Conference on Principles and practice of declaritive programming, pp. 275–283.]</ref>

=== Апаратна реалізація ===
Під час розробки {{Не перекладено|треба=Комп’ютер п’ятої генерації|текст=проекту комп’ютерних систем п’ятої генерації|є=:en:Fifth generation computer}} були спроби реалізувати Пролог в апаратному вигляді з метою отримання швидшого виконання спеціальними архітектурами.<ref>{{Citation | first5 = K.
| last5 = Kiriyama
| title = High performance integrated Prolog processor IPP
| pages = 100
| doi = 10.1145/30350.30362
| year = 1987 | first4 = K.
| last4 = Kurosawa
| last2 = Bandoh | first1 = S. | first2 = T.
| last3 = Yamaguchi | first3 = S.
| last = Abe
}}</ref><ref>{{cite web|doi=10.1007/3-540-16492-8_73 |title=A Prolog processor based on a pattern matching memory device - Third International Conference on Logic Programming - Lecture Notes in Computer Science |publisher= Springer Berlin / Heidelberg |year= 1986|accessdate=2010-09-16 DOI=10.1007/3-540-16492-8_73}}</ref><ref>{{Citation
| journal = ACM SIGPLAN Notices
| title = Performance and architectural evaluation of the PSI machine
| volume = 22
| pages = 128
| doi = 10.1145/36205.36195
| year = 1987
| last = Taki | first4 = M.
| last2 = Nakajima | first = K.
| last4 = Ikeda | first2 = K.
| last3 = Nakashima | first3 = H.
| issue = 10
}}</ref> До того ж, Пролог має ряд властивостей, що можуть дозволити прискорення шляхом паралельного виконання.<ref>{{Citation
| journal = ACM Transactions on Programming Languages and Systems
| title = Parallel execution of prolog programs: a survey | first5 = M. V.
| volume = 23
| pages = 472
| doi = 10.1145/504083.504085
| year = 2001
| last = Gupta
| last5 = Hermenegildo
| last2 = Pontelli | first = G. | first2 = E.
| last3 = Ali
| last4 = Carlsson | first3 = K. A. M. | first4 = M.
| issue = 4
}}</ref> Новішими підходами було компілювати обмежені прологові програми у [[FPGA|програмовані користувачем вентильні матриці]].<ref>http://www.cl.cam.ac.uk/~am21/research/sa/byrdbox.ps.gz</ref> Однак, швидкий розвиток апаратного забезпечення загального призначення послідовно випередив більш спеціалізовані архітектури.

== Критика ==

Хоча Пролог широко застосовується у дослідницькій роботі та освіті, вона та інші логічні мови програмування не справили істотного впливу на комп’ютерну промисловість у цілому.<ref name="RealWorld">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.</ref> Більшість застосунків є малими за промисловими стандартами, лише деякі з них мають понад 100,000 рядків коду.<ref name="RealWorld"/><ref>The Prolog 1000 database http://www.faqs.org/faqs/prolog/resource-guide/part1/section-9.html</ref> {{Не перекладено|треба=Велике і мале програмування|текст=Велике програмування|є=:en:Programming in the large and programming in the small}} вважається складним, оскільки не всі компілятори Прологу підтримують модулі, а також існують проблеми сумісності між системами модулів основних прологових компіляторів.<ref name="cs.kuleuven.ac.be"/> Переносимість коду Прологу між реалізаціями також була проблемою, але розробка після 2007 року означала: «переносимість всередині сімейства реалізацій Прологу, що походять від Единбурзької Пролог або Quintus, достатньо гарна для підтримки реальних переносимих програм».<ref>Jan Wielemaker and Vıtor Santos Costa: [http://www.swi-prolog.org/download/publications/porting.pdf Portability of Prolog programs: theory and case-studies]. [http://www.floc-conference.org/CICLOPS-WLPE-accepted.html CICLOPS-WLPE Workshop 2010].</ref>

Програмне забезпечення, розроблене на Пролозі, критикувалося за високі втрати продуктивності у порівнянні зі звичайними мовами програмування. Однак, вдосконалення методів реалізації зменшило втрати аж до 25%-50% для деяких застосунків.<ref>{{Citation
| last = Sterling | first = Leon
| title = The Practice of Prolog
| publisher = {{Не перекладено|треба=MIT Press|є=:en:MIT Press}} | year = 1990
| page = 32
| isbn = 0-262-19301-9
| quote = Although some CAD algorithms run between 2 to 4 times slower than their counterparts in C, the interactive response of the editor is comparable to a similar program written in C.}}
</ref>

Пролог не є чисто декларативною: оскільки вона має оператор відсікання, для її розуміння потрібне також і процедурне прочитання написаних нею програм.<ref>[http://dtai.cs.kuleuven.be/projects/ALP/newsletter/archive_93_96/comment/decl.html Declarative vs procedural]</ref> Порядок речень у прологовій програмі є суттєвим. Інші логічні мови програмування, такі як {{Не перекладено|треба=Datalog|є=:en:Datalog}}, є чисто декларативними: речення можуть надаватися у довільному порядку.

== Розширення ==

З Прологу було розвинуто різноманітні реалізації для розширення можливостей логічного програмування у численних напрямках. Вони включають [[Система типізації|типи]], режими, {{Не перекладено|треба=логічне програмування з обмеженнями|є=:en:constraint logic programming}}, об’єктно-орієнтоване логічне програмування ({{lang-en|object-oriented logic programming, OOLP}}), [[Паралелізм (інформатика)|паралелізм]], {{Не перекладено|треба=Лінійна логіка|текст=лінійну логіку|є=:en:Linear logic}}, можливості функціонального програмування та програмування {{Не перекладено|треба=Логіка вищих порядків|текст=логіки вищих порядків|є=:en:Higher-order logic}}, плюс функціональну сумісність з базами знань:

=== Типи ===

Пролог є нетипізованою мовою. Спроби запровадити типи сходять до [[1980-ті|1980-х]] років,<ref>{{Citation | doi = 10.1016/0004-3702(84)90017-1 | last = Mycroft | first = A. | last2 = O'Keefe | first2 = R. A. | title = A polymorphic type system for prolog☆ | journal = Artificial Intelligence | volume = 23 | issue = 3 | pages = 295 | year = 1984
}}</ref><ref>{{citation |last=Pfenning |first=Frank |title=Types in logic programming |publisher=MIT Press |location=Cambridge, Mass |year=1992 |pages= |isbn=0-262-16131-1 |oclc= |doi= |accessdate=}}</ref> і станом на [[2008]] рік все ще існують спроби розширити Пролог типами.<ref>{{Citation
| last = Schrijvers | first = Tom
| last2 = Santos Costa | first2 = Vitor
| last3 = Wielemaker | first3 = Jan
| last4 = Demoen | first4 = Bart
| year = 2008
| chapter = Towards Typed Prolog
| editor1=Maria Garcia de la Banda
| editor2=Enrico Pontelli
| title=Logic programming : 24th international conference, ICLP 2008, Udine, Italy, December 9-13, 2008 : proceedings
| series = Lecture Notes in Computer Science
| volume = 5366 | pages = 693–697
| doi = 10.1007/978-3-540-89982-2_59
| isbn = 9783540899822
}}</ref> Ця інформація корисна не лише для {{Не перекладено|треба=Безпечна типізація|текст=безпечної типізації|є=:en:Type safety}}, а й для обмірковування прологових програм.<ref name="cite doi|10.1007/BF01213601">{{Citation | doi = 10.1007/BF01213601 | last = Apt | first = K. R. | last2 = Marchiori | first2 = E. | title = Reasoning about Prolog programs: From modes through types to assertions | journal = Formal Aspects of Computing | volume = 6 | issue = 6 | pages = 743 | year = 1994
}}</ref>

=== Режими ===

Синтаксис Прологу не визначає, які з аргументів предикату є вхідними, а які вихідними.<ref name="craft">{{citation |last=O'Keefe |first=Richard A. |title=The craft of Prolog |publisher=MIT Press |location=Cambridge, Mass |year=1990 |pages= |isbn=0-262-15039-5 |oclc= |doi= |accessdate=}}</ref> Проте ця інформація є істотною, і рекомендується включати її до коментарів.<ref>{{cite arXiv|last=Covington et al|title=Coding guidelines for Prolog|date=2010|eprint=0911.2899|author1=Covington|author2=Roberto Bagnara|author3=O'Keefe|author4=Jan Wielemaker|author5=Simon Price|class=cs.PL}}</ref> Режими надають цінну інформацію при обмірковуванні прологових програм,<ref name="cite doi|10.1007/BF01213601"/> а також можуть використовуватися для прискорення виконання.<ref>{{Citation | doi = 10.1007/BFb0014976 | last = Roy | first = P. | last2 = Demoen | first2 = B. | isbn = 3-540-17611-X | last3 = Willems | first3 = Y. D. | chapter = Improving the execution speed of compiled Prolog with modes, clause selection, and determinism | title = Tapsoft '87 | series = Lecture Notes in Computer Science | volume = 250 | pages = 111 | year = 1987}}</ref>

=== Обмеження ===

{{Не перекладено|треба=Логічне програмування з обмеженнями|є=:en:Constraint logic programming}} розширює Пролог включенням концепцій із {{Не перекладено|треба=задоволення обмежень|є=:en:Constraint satisfaction}}.<ref>{{Citation | doi = 10.1016/0743-1066(94)90033-7 | last = Jaffar | first = J. | title = Constraint logic programming: a survey | journal = The Journal of Logic Programming | volume = 19-20 | pages = 503–581 | year = 1994}}</ref><ref>{{citation
| first=Alain
| last = Colmerauer
| title=Opening the Prolog III Universe
| journal=Byte
| volume= August
| year=1987
}}</ref> Програма з логікою обмежень дозволяє обмеження в тілах речень, як, наприклад, <code>A(X,Y) :- X+Y>0.</code> Це підходить для великомасштабних задач [[Комбінаторна оптимізація|комбінаторної оптимізації]]<ref>{{Citation | doi = 10.1007/3-540-45628-7_19 | last = Wallace | first = M. | chapter = Constraint Logic Programming | isbn = 3540456287 | title = Computational Logic: Logic Programming and Beyond | series = Lecture Notes in Computer Science | volume = 2407 | pages = 512 | year = 20022002}}</ref> й, отже, для застосувань у промислових умовах, таких як автоматизоване складання розкладів та {{Не перекладено|треба=планування виробництва|є=:en:Production scheduling}}. Більшість прологових систем постачаються із щонайменше одним розв'язувачем обмежень для зліченних областей визначення, а часто також і з розв'язувачами для інших областей визначення, таких як дійсні числа.

=== Програмування вищих порядків ===
[[HiLog]] та {{Не перекладено|треба=λProlog|є=:en:λProlog}} розширюють Пролог властивостями {{Не перекладено|треба=програмування вищих порядків|є=:en:Higher-order programming}}. Пролог ISO зараз підтримує вбудовані предикати <code>call/2</code>, <code>call/3</code>, ... що слугують програмуванню вищих порядків та [[Лямбда-числення|лямбда-абстракціям]].

<source lang="prolog">
maplist(_Cont, [], []).
maplist(Cont, [X1|X1s], [X2|X2s]) :-
call(Cont, X1, X2),
maplist(Cont, X1s, X2s).
</source>

=== Об'єктна орієнтація ===

{{Не перекладено|треба=Logtalk|є=:en:Logtalk}} це об'єктно-орієнтована мова логічного програмування, що може використовувати більшість реалізацій Прологу в якості внутрішнього компілятора. Як мультипарадигмова мова, вона включає підтримку як прототипів, так і класів.

{{Не перекладено|треба=Oblog|є=:en:Oblog}} це невелике переносне об’єктно-орієнтоване розширення Прологу від Маргарити Макдугалл ({{lang-en|Margaret McDougall}}) з EdCAAD [[Единбурзький університет|Единбурзького університету]].

{{Не перекладено|треба=Objlog|є=:en:Objlog}} була фреймовою мовою, що поєднувала об’єкти та Пролог II від [[Національний центр наукових досліджень|НЦНД]] [[Франція|Франції]] у Марселі.

=== Графіка ===

Прологовими системами, що пропонують {{Не перекладено|треба=Графічна бібліотека|текст=графічну бібліотеку|є=:en:Graphics library}}, є SWI-prolog,<ref>{{cite web|url=http://www.swi-prolog.org/packages/xpce/|title=XPCE graphics library}}</ref> Visual-prolog, LPA Prolog для Windows та B-Prolog.

=== Паралелізм ===

[[Prolog-MPI]] є розширенням [[SWI-Prolog]] з [[Відкрите програмне забезпечення|відкритим кодом]] для розподілених обчислень через [[Message Passing Interface|інтерфейс передачі повідомлень]] ({{lang-en|Message Passing Interface}}).<ref>{{cite web|url=http://apps.lumii.lv/prolog-mpi/ |title=prolog-mpi |publisher=Apps.lumii.lv |date= |accessdate=2010-09-16}}</ref> Також існує декілька паралельних мов програмування Пролог.<ref>Ehud Shapiro. ''The family of concurrent logic programming languages'' {{Не перекладено|треба=ACM Computing Surveys|є=:en:ACM Computing Surveys}}. September 1989.</ref>

=== Веб-програмування ===

Деякі реалізації Прологу, особливо SWI-Prolog та Ciao, підтримують {{Не перекладено|треба=веб-програмування|є=:en:Web programming}} на {{Не перекладено|треба=Серверний бік|текст=серверному боці|є=:en:Server-side}} з підтримкою веб-протоколів, [[HTML]] та [[XML]].<ref>{{Citation
| journal = Theory and Practice of Logic Programming
| volume = 8
| year = 2008
| doi = 10.1017/S1471068407003237
| title = SWI-Prolog and the web | first3 = L. | first = J.
| last2 = Huang | first2 = Z.
| last = Wielemaker
| last3 = Van Der Meij
| issue = 03
}}</ref> Існують також розширення для підтримки форматів [[Семантична павутина|семантичної павутини]], таких як [[Resource Description Framework|RDF]] та [[Web Ontology Language|OWL]].<ref>{{Citation
| author = Jan Wielemaker and Michiel Hildebrand and Jacco van Ossenbruggen
| title = Using {Prolog} as the fundament for applications on the semantic web
| periodical = Proceedings of the 2nd Workshop on Applicatiions of Logic Programming and to the web, Semantic Web and Semantic Web Services
| publisher = CEUR-WS.org
| series = CEUR Workshop Proceedings
| volume = 287
| year = 2007
| pages = 84–98
| publication-place = Porto, Portugal
| editor = S.Heymans, A. Polleres, E. Ruckhaus, D. Pearse, and G. Gupta
| url = http://ftp.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-287/paper_1.pdf
}}</ref><ref>[http://ceur-ws.org/Vol-529/owled2009_submission_43.pdf 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</ref> Пролог також пропонувалася як мова {{Не перекладено|треба=Клієнтський бік|текст=клієнтського боку|є=:en:Client-side}}.<ref>{{Citation
| last = Loke | first = S. W.
| last2 = Davison | first2 = A.
| title = Secure Prolog-based mobile code
| journal = Theory and Practice of Logic Programming
| volume = 1
| year = 2001
| doi = 10.1017/S1471068401001211
}}</ref>

=== Adobe Flash ===

[http://sites.google.com/site/cedarprolog/ Cedar] є безкоштовним та елементарним інтерпретатором Прологу. Від версії 4 та вище Cedar має підтримку FCA (Flash Cedar App). Це забезпечує нову платформу для програмуванні на Пролозі через [[ActionScript]].

=== Інші ===

* {{Не перекладено|треба=F-logic|є=:en:F-logic}} розширює Пролог фреймами/об’єктами для [[представлення знань]].
* [[OW Prolog]] було створено, щоби дати відповідь на брак графіки та інтерфейсу в Пролозі.

== Інтерфейси до інших мов ==

Існують каркаси для сполучення між Прологом та іншими мовами:
* [http://www.lpa.co.uk/int.htm LPA Intelligence Server] дозволяє включення LPA Prolog до [[C (мова програмування)|C]], [[C Sharp|C#]], [[C++]], [[Java]], [[Visual Basic|VB]], [[Delphi (мова програмування)|Delphi]], [[.NET Framework|.NET]], [[Lua]], [[Python]] та інших мов. Він використовує спеціальний стрічковий тип даних, до надає LPA Prolog
* Logic Server API дозволяє як розширення Прологом, так і його включення до C, C++, Java, VB, Delphi, .NET та будь-яких інших мов/середовищ, що можуть викликати [[Dynamic-link library|.dll]] або [[Бібліотека (програмування)#Динамічні бібліотеки|.so]]. Його реалізовано для [http://www.amzi.com/ Amzi! Prolog + Logic Server], але специфікацію [[Прикладний програмний інтерфейс|API]] може бути зроблено доступною для будь-якої реалізації.
* JPL це двоспрямований міст між Java та Прологом, що постачається з SWI-Prolog за замовчуванням, і що дозволяє Java та Прологові викликати одне одного (рекурсивно). Він відомий гарною підтримкою паралельності, та знаходиться в активній розробці.
* [http://www.declarativa.com/interprolog/ InterProlog], програмна бібліотека мосту між Java та Прологом, що реалізує двоспрямовані виклики предикатів/методів між обома мовами. Об’єкти Java можуть відображатися у терми Прологу, і навпаки. Дозволяє розробку [[Графічний інтерфейс користувача|графічного інтерфейсу користувача]] та іншої функціональності в Java, залишаючи обробку логіки у шарі Прологу. Підтримує {{Не перекладено|треба=XSB|є=:en:XSB}}, із запланованою на [[2013]] рік підтримкою [[SWI-Prolog]] та YAP.
* {{Не перекладено|треба=Prova|є=:en:Prova}} надає інтеграцію рідного синтаксису з Java, обмін повідомленнями між програмними агентами та правила реакції. Prova позиціонує себе як скриптову систему на базі правил ({{lang-en|rule-based scripting, RBS}}) для [[Підпрограмне забезпечення|підпрограмного забезпечення]]. Ця мова відкриває нові обрії у поєднанні [[Імперативне програмування|імперативного]] та [[Декларативне програмування|декларативного програмування]].
* [http://igormaznitsa.com/projects/prol/index.html PROL] це вбудовуваний рушій Прологу для Java. Він включає невелике [[інтегроване середовище розробки]] та декілька бібліотек.
* [http://www.gnu.org/software/gnuprologjava/ GNU Prolog для Java] є реалізацією Прологу ISO як бібліотеки Java (gnu.prolog)
* {{Не перекладено|треба=Ciao (мова програмування)|текст=Ciao|є=:en:Ciao (programming language)}} надає інтерфейси до C, C++, Java та [[Реляційна база даних|реляційних баз даних]].
* [http://sourceforge.net/projects/cs-prolog/ C#-Prolog] є інтерпретатором Прологу, написаним ([[Керований код|керованою]]) C#. Може легко інтегруватися у програми мовою C#. Характеристики: надійний та досить швидкий інтерпретатор, інтерфейс командного рядка, інтерфейс Windows, вбудована граматика визначених речень, XML-предикати, [[SQL]]-предикати, розширюваний. Доступний повний джерельний код, включно з генератором синтаксичного аналізатора, що може бути використано для додавання розширень особливого призначення.
* [http://www.jekejeke.ch/idatab/doclet/prod/en/docs/05_run/03_interface/01_contents.html Jekejeke Prolog API] надає сильнозв’язані можливості паралельних вхідних та вихідних викликів між Прологом та Java або [[Android]], з визначною можливістю створення індивідуальних об’єктів баз знань. Він може застосовуватися для вбудовування Прологу ISO до самостійних [[Застосунок|застосунків]], [[аплет]]ів, [[сервлет]]ів, {{Не перекладено|треба=APK|є=:en:APK (file format)}} тощо.
* [https://github.com/Trismegiste/WamBundle Абстрактна машина Уоррена для PHP], компілятор та інтерпретатор Прологу в [[PHP]] 5.3. Бібліотека, що може використовуватися самостійно, або з каркасом [[Symfony]]2.1.

== Історія ==

Назву ''Пролог'' ({{lang-fr|Prolog}}) було обрано {{Не перекладено|мова=фр.|треба=Філіп Руссель|текст=Філіпом Русселем|є=:fr:Philippe Roussel}} як абревіатуру від ''програмування в логіці'' ({{lang-fr|programmation en logique}}). Пролог було створено у [[1972]] році {{Не перекладено|треба=Алан Кольмерое|текст=Аланом Кольмерое|є=:en:Alain Colmerauer}} з Філіпом Русселем на основі процедурної інтерпретації {{Не перекладено|треба=Диз’юнкт Хорна|текст=диз’юнктів Хорна|є=:en:Horn clauses}} {{Не перекладено|треба=Роберт Ковальський|текст=Роберта Ковальського|є=:en:Robert Kowalski}}. Це було частково мотивоване бажанням примирити використання логіки як мови декларативного представлення знань з процедурним представленням знань, що було популярне в [[Північна Америка|Північній Америці]] в кінці [[1960-ті|1960-х]] і на початку [[1970-ті|1970-х]] років. Згідно {{Не перекладено|треба=Роберт Ковальський|текст=Роберта Ковальського|є=:en:Robert Kowalski}}, першу прологову систему було розроблено у [[1972]] році Аланом Кольмерое та Філіпом Русселем.<ref name="Kowalski"/> Перші реалізації Прологу були інтерпретаторами, однак, {{Не перекладено|треба=Девід Уоррен|є=:en:David H. D. Warren}} створив {{Не перекладено|треба=Абстрактна машина Уоррена|текст=абстрактну машину Уоррена|є=:en:Warren Abstract Machine}}, ранній та впливовий компілятор Прологу, що прийшов, щоби визначити "Единбурзький" діалект Прологу, що послужив основою синтаксису більшості сучасних реалізацій.

Більшість сучасних розробок Прологу пішли від поштовху {{Не перекладено|треба=Комп’ютер п’ятої генерації|текст=проекту комп’ютерних систем п’ятої генерації|є=:en:Fifth generation computer}}, в рамках якого було розроблено варіант Прологу під назвою {{Не перекладено|треба=Kernel Language|є=:en:KL1}} для його першої [[Операційна система|операційної системи]].

Чисту Пролог було спочатку обмежено використанням системи доведення теорем з {{Не перекладено|треба=Диз’юнкт Хорна|текст=диз’юнктами Хорна|є=:en:Horn clauses}} форми:

Г :- Т<sub>1</sub>, ..., Т<sub>n</sub>.

Застосунок системи доведення теорем обробляє такі речення як процедури:

щоби показати/розв’язати Г, покажи/розв’яжи Т<sub>1</sub> та ... та Т<sub>n</sub>.

Однак, чисту Пролог незабаром було розширено включенням {{Не перекладено|треба=Заперечення як невдача|текст=заперечення як невдачі|є=:en:Negation as failure}}, у якому заперечні умови форми not(Т<sub>i</sub>) показуються шляхом спроби і невдачі доведення відповідних позитивних умов Т<sub>i</sub>.

Подальші розширення Прологу оригінальною командою ввели до реалізацій можливості {{Не перекладено|треба=логічне програмування з обмеженнями|текст=логічного програмування з обмеженнями|є=:en:constraint logic programming}}.


== Див. також ==
== Див. також ==
* {{Не перекладено|треба=Порівняння реалізацій Прологу|є=:en:Comparison of Prolog implementations}}
* [[SWI-Prolog]]
* {{Не перекладено|треба=Логіко-лінгвістичне моделювання|є=:en:Logico-linguistic modeling}}. Метод побудови систем на основі знань, що використовує Пролог.


=== Споріднені мови ===
== Джерела ==

* ''Трушевський В. М.'' Технології та мови програмування для штучного інтелекту. Частина 1: Основи програмування мовою Prolog.&nbsp;— Львів 2006
* Мова {{Не перекладено|треба=Gödel|є=:en:Gödel (programming language)}} є суворо типізованою реалізацією {{Не перекладено|треба=Паралельне програмування логіки з обмеженнями|текст=паралельного програмування логіки з обмеженнями|є=:en:Concurrent constraint logic programming}}. Її побудовано на базі SICStus Prolog.
* {{Не перекладено|треба=Visual Prolog|є=:en:Visual Prolog}}, раніше відома як PDC Prolog та Turbo Prolog, є [[Тип даних|суворо типізованим]] [[Об'єктно-орієнтоване програмування|об’єктно-орієнтованим]] діалектом Прологу, що дуже сильно відрізняється від стандартного Прологу. Як Turbo Prolog вона просувалася компанією [[Borland]], але тепер вона розробляється та просувається данською фірмою [http://www.pdc.dk PDC] (Prolog Development Center), яка її спочатку і створила.
* {{Не перекладено|треба=Datalog|є=:en:Datalog}} є підмножиною Прологу. Вона обмежена відношеннями, що можуть [[Стратифікація|стратифіковуватися]], і не дозволяє складених термів. На відміну від Прологу, Dalalog не є [[Повнота за Тюрингом|повною за Тюрингом]].
* {{Не перекладено|треба=Mercury (мова програмування)|текст=Mercury|є=:en:Mercury (programming language)}} є відгалуженням від Прологу, спрямованим на {{Не перекладено|треба=Велике і мале програмування|текст=велику розробку програмного забезпечення|є=:en:Programming in the large and programming in the small}}, і має статичну, поліморфну [[Система типізації|систему типізації]], а також систему режимів та детермінізму.
* {{Не перекладено|треба=CSC|є=:en:Computer Sciences Corporation}} {{Не перекладено|треба=GraphTalk|є=:en:GraphTalk}} є власною реалізацією абстрактної машини Уоррена, з додатковими об’єктно-орієнтованими властивостями.
* У певному сенсі{{Якому}} Пролог є підмножиною мови {{Не перекладено|треба=Planner|є=:en:Planner (programming language)}}. Пізніше ідеї мови Planner було розвинуто у {{Не перекладено|треба=Метафора наукової спільноти|текст=метафору наукової спільноти|є=:en:Scientific community metaphor}}.
* [[AgentSpeak]] є варіантом Прологу для програмування поведінки агентів у [[Багатоагентна система|багатоагентних системах]].

== Примітки ==
{{Reflist|2}}

== Література ==
{{Refbegin|2}}

* Blackburn P. ''Learn Prolog Now!'' / Bos J., Striegnitz K. — Kings College Publications, 2006 — 265 с. — ISBN 1-904987-17-6. {{ref-en}}
* {{Не перекладено|треба=Іван Братко|текст=Братко И.|є=:en:Ivan Bratko (computer scientist)}} ''Алгоритмы искусственного интеллекта на языке PROLOG''. — М, СПб, К: Вильямс, 2004 — 640 с. — ISBN 5-8459-0664-4. {{ref-ru}}
* Clocksin W. F. ''Programming in Prolog: Using the ISO Standard'' / Mellish C. S. — Вид. 5 — Springer, 2003 — 299 с. — ISBN 978-3-540-00678-7. ''(Це видання оновлено для Прологу ISO. Попередні видання описували Единбурзьку Пролог.)'' {{ref-en}}
* Clocksin W. F. ''Clause and Effect. Prolog Programming for the Working Programmer''. — Springer, 2003 — 152 с. — ISBN 978-3-540-62971-9. {{ref-en}}
* Colmerauer A. [http://www.lim.univ-mrs.fr/~colmer/ArchivesPublications/HistoireProlog/19november92.pdf The birth of Prolog] / Roussel P. // ''The second ACM SIGPLAN conference on History of programming languages''. — 1992 — с.&nbsp;37-52. {{ref-en}}
* Covington M. A. ''Prolog Programming in Depth'' / Nute D., Vellino A. — 1996 — 516 с. — ISBN 0-13-138645-X. {{ref-en}}
* Covington M. A. ''Natural Language Processing for Prolog Programmers''. — 1994 — 348 с. — ISBN 0-13-62921. {{ref-en}}
* Smith R. POPLOG's two-level virtual machine support for interactive languages / Gibson J., {{Не перекладено|треба=Аарон Сломан|текст=Sloman A.|є=:en:Aaron Sloman}} // ''Research Directions in Cognitive Science Volume 5: Artificial Intelligence''. — Eds D. Sleeman and N. Bernsen, Lawrence Erlbaum Associates — 1992 — с. 203–231. {{ref-en}}
* {{Не перекладено|треба=Леон Стерлінг|текст=Стерлинг Л.|є=:en:Leon Sterling}} ''Искусство программирования на языке Пролог'' / {{Не перекладено|треба=Ехуд Шапіро|текст=Шапиро Э.|є=:en:Ehud Shapiro}} — М: Мир, 1990 — 333 с. — ISBN 5-03-000406-8. {{ref-ru}}
* Kowalski R. [http://www.doc.ic.ac.uk/~rak/papers/the%20early%20years.pdf The Early Years of Logic Programming] // ''CACM''. — січень 1988. {{ref-en}}
* ''ISO/IEC 13211: Information technology &mdash; Programming languages &mdash; Prolog''. — Geneva: [[International Organization for Standardization]]. {{ref-en}}
* {{Не перекладено|треба=Richard O'Keefe|текст=O'Keefe R.|є=:en:Richard O'Keefe}} ''The Craft of Prolog''. — 387 с. — ISBN 0-262-15039-5. {{ref-en}}
* 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. {{ref-en}}
* Трушевський В. М. ''Технології та мови програмування для штучного інтелекту. Частина 1: Основи програмування мовою Prolog''. — Львів: 2006 — 120 с.
{{Refend}}


== Посилання ==
== Посилання ==
{{wikibooks|Пролог}}
{{wikibooks|Пролог}}
* [http://www.logic.at/prolog/faq/ comp.lang.prolog FAQ] {{ref-en}}
* [http://www.sju.edu/~jhodgson/wg17/wg17web.html Міжнародний стандарт ISO для мови Пролог]
* [http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/prolog/doc/intro/prolog.doc Посібник користувача Прологу DECsystem-10] (текстовий формат) описує типову Единбурзьку Пролог {{ref-en}}
* [http://progopedia.ru/language/prolog/ Progopedia:Prolog]
* [http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/contents.html Prolog Tutorial] від J. R. Fisher {{ref-en}}

* [http://www.allisons.org/ll/Logic/Prolog/Examples/ Виконувані приклади] від Lloyd Allison {{ref-en}}
{{compu-stub}}
* [http://kti.ms.mff.cuni.cz/~bartak/prolog/index.html On-line guide to Prolog Programming] від Roman Bartak {{ref-en}}
* [http://www.learnprolognow.org/ Learn Prolog Now!] від Patrick Blackburn, Johan Bos та Kristina Striegnitz {{ref-en}} {{ref-fr}}
* [http://www.cs.bham.ac.uk/~pjh/prolog_course/se207.html Prolog and Logic Programming] від Dr Peter Hancox {{ref-en}}
* [http://www.amzi.com/AdventureInProlog/ Adventure in Prolog], навчальний інтернет-посібник від Dennis Merritt {{ref-en}}
* [http://www.amzi.com/ExpertSystemsInProlog/ Building Expert Systems in Prolog], інтернет-книга від Dennis Merritt {{ref-en}}
* [http://en.literateprograms.org/Category:Programming_language:Prolog Literate programming in Prolog] {{ref-en}}
* [http://www.amzi.com/AmziPrologLogicServer/index.php Amzi! Prolog + Logic Server™] від Dennis Merritt {{ref-en}}
* [http://progopedia.ru/language/prolog/ Progopedia:Prolog] {{ref-ru}}


[[Категорія:Мови програмування]]
[[Категорія:Мови програмування]]

Версія за 14:41, 10 грудня 2012

Prolog
Парадигма логічне програмування
Дата появи 1972
Творці Алан Кольмероеd, Роберт Ковальський і Філіп Руссельd
Розробник Алан Кольмерое[en]
Основні реалізації BProlog[en], Ciao[en], ECLiPSe[en], GNU Prolog[en], Jekejeke Prolog, Logic Programming Associates[en], Пролог Poplog[en], P#[en], Quintus, SICStus[en], Strawberry[en], SWI-Prolog, tuProlog[en], XSB, YAP-Prolog[en]
Діалекти Пролог ISO, Единбурзька Пролог
Під впливом від Planner
Вплинула на Visual Prolog[en], Mercury[en], Oz[en], Erlang, Strand[en], KL0[en], KL1[en], Datalog
Звичайні розширення файлів .pl .pro .P

Проло́г — мова логічного програмування загального призначення, пов’язана зі штучним інтелектом та математичною лінгвістикою.[1][2][3]

Пролог має корені в логіці першого порядку, математичній логіці, та, на відміну від багатьох інших мов програмування, є декларативною: логіка програми виражається в термінах відношень, представлених як факти та правила. Обчислення ініціюється запуском запиту над цими відношеннями.[4]

Цю мову програмування спочатку було задумано групою навколо Алана Кольмерое[en] у Марселі на початку 1970-тих, а першу систему Пролог було розроблено у 1972-му Аланом Кольмерое та Філіпом Русселем[фр.].[5][6]

Пролог була однією з перших логічних мов програмування,[7] й залишається найпопулярнішою серед таких мов і на сьогодні, маючи багато безкоштовних та комерційних реалізацій. Хоча спочатку цю мову програмування і було націлено на обробку природної мови, вона з тих пір простяглася далеко в інші області, як-то доведення теорем,[8] експертні системи,[9] ігри, системи автоматичних відповідей, онтології та складні системи керування. Сучасні середовища Прологу підтримують як створення графічних інтерфейсів користувача, так і адміністративні або мережеві застосування.

Синтаксис та семантика

Детальніші відомості з цієї теми ви можете знайти в статті Синтаксис та семантика Прологу.

Програмна логіка у Пролозі виражається в термінах відношень, а обчислення ініціюється запуском запиту над цими відношеннями. Відношення та запити створюються з використанням єдиного типу даних Прологу, терму.[4] Відношення виражаються реченнями. Отримавши запит, рушій Прологу намагається знайти спростування резолюції заперечення запиту. Якщо заперечення запиту може бути спростовано, тобто, знайдено набір значень всіх вільних змінних, що робить об’єднання атомарних формул та множини-синґлетону, що складається із заперечення запиту, хибним, то з цього випливає, що початковий запит, із застосуванням знайденого набору значень, є логічним висновком програми. Це робить Пролог (та інші логічні мови програмування) надзвичайно зручною для застосування у базах даних, символьній математиці та граматичному аналізі мов. Оскільки Пролог дозволяє нечисті предикати, перевірка істинності певних спеціальних предикатів може мати деякий навмисний побічний ефект, як-то виведення значення на екран. Через це програмістові дозволено певною мірою використовувати звичайне імперативне програмування, коли логічна парадигма є незручною. Пролог має як чисту логічну підмножину, що називається «чиста Пролог», так і ряд позалогічних властивостей.

Типи даних

Єдиним типом даних Прологу є терм. Терми можуть бути атомами, числами, змінними або складеними термами.

  • Атом це загальна назва без притаманного значення. Прикладами атомів є x, синій, 'Бутерброд' та 'якийсь атом'.
  • Числа можуть бути з плаваючою комою[en], або цілими.
  • Змінні позначаються стрічками, що складаються з літер, цифр та символів підкреслення, і починаються з великої літери або символу підкреслення. Змінні дуже подібні до змінних в логіці в тім, що вони є позначками-заповнювачами для довільних термів.
  • Складений терм складається з атому, що зветься функтор, та певної кількості аргументів, що в свою чергу теж є термами. Складені терми зазвичай записуються у вигляді функтора, за яким у дужках слідує перелік термів-аргументів через кому. Кількість аргументів називається арністю терму. Атом може розглядатися як складений терм нульової арності. рік_машини('Таврія', 1988) та 'Друзі_Особи'(грай,[око,тур]) є прикладами складених термів.

Особливі випадки складених термів:

  • Список є впорядкованою колекцією термів. Він позначається квадратними дужками з термами, розділеними комами, або, у випадку порожнього списку, []. Наприклад, [1,2,3], або [червоний,зелений,синій].
  • Стрічки: послідовність символів у лапках, еквівалентна спискові (числових) кодів символів, зазвичай у місцевому кодуванні, або в Юнікоді, якщо система підтримує Юнікод. Наприклад, "бути чи не бути".

Правила та факти

Прологові програми описують відношення, визначені реченнями. Чиста Пролог обмежена диз’юнктами Хорна[en]. Є два типи речень: факти та правила. Правило має вигляд

Голова :- Тіло.

і читається як «голова істинна, якщо тіло істинне». Тіло правила складається з викликів предикатів, що називаються цілями правила. Вбудований предикат ,/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 відображає терм на екрані.

Виконання

Виконання прологової програми починається задаванням користувачем єдиної цілі, що зветься запитом. З точки зору логіки, рушій Прологу намагається знайти спростування резолюції заперечення цього запиту. Метод резолюції, що використовується у Пролозі, називається SLD-резолюцією. Якщо заперечення запиту може бути спростовано, з цього випливає, що запит, з відповідними зв’язуваннями змінних, є логічним висновком програми. У такому разі всі створені зв’язування змінних повідомляються користувачеві, і про запит повідомляється, що він досяг успіху. З практичної точки зору, стратегію виконання Прологу можна уявити як узагальнення викликів функцій в інших мовах, з тією різницею, що заданому запитові можуть відповідати голови кількох речень. В такому випадку система створює точку вибору, об’єднує ціль з головою речення першої альтернативи, і продовжує цілями цієї першої альтернативи. Якщо у напрямку виконання програми будь-яка ціль зазнає невдачі, всі зв’язування змінних, що було зроблено від останньої на той момент точки вибору, скасовуються, і виконання продовжується з наступною альтернативою цієї точки вибору. Ця стратегія виконання називається хронологічним пошуком з вертанням. Наприклад:


мати_дитини(ірина, святослав).
 
батько_дитини(ярослав, святослав).
батько_дитини(ярослав, анна).
батько_дитини(володимир, ярослав).
 
брат_або_сестра(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). тепер вже не може бути використано для перелічення усіх речей, що є нелегальними.

Приклади

Далі слідують деякі приклади програм, написаних Прологом.

Вітання світові

Приклад запиту:

?- 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], швидке_сортування(Більші).

Шаблони проектування

Шаблон проектування це загальне рішення багаторазового використання поширеної проблеми у проектуванні програмного забезпечення. У Пролозі шаблони проектування можуть носити різні назви: кістяки та техніки,[10][11] кліше,[12] програмні схеми[13] та схеми опису логіки.[14] Альтернативою до шаблонів проектування є програмування вищих порядків.[15]

Програмування вищих порядків

Детальніші відомості з цієї теми ви можете знайти в статті Логіка вищих порядків[en] та Програмування вищих порядків.

За визначенням, логіка першого порядку не дозволяє квантифікації предикатів. Предикат вищих порядків це предикат, що має один або більше інших предикатів у якості аргументів. Пролог вже має деякі вбудовані предикати вищих порядків, такі як call/1, call/2, call/3, findall/3, setof/3 та bagof/3.[16] Крім того, оскільки довільні цілі Прологу можуть створюватись та оцінюватись у реальному часі, нескладно писати предикати вищих порядків на кшталт maplist/2, що застосовує довільний предикат до кожного елемента наданого списку, та sublist/3, що відфільтровує елементи, що задовольняють наданому предикатові, беручи до уваги й карування[en].[15]

Для перетворення рішень з часового представлення (підстановки відповідей при зворотному пошуку) до просторового представлення (термів) Пролог має різноманітні предикати для всіх рішень, що збирають всі підстановки відповідей для заданого запиту до списку. Це може використовуватися у спискових виразах. Наприклад, досконалі числа дорівнюють сумі своїх дільників:

 perfect(N) :-
     between(1, inf, N), U is N // 2,
     findall(D, (between(1,U,D), N mod D =:= 0), Ds),
     sumlist(Ds, N).

Це може бути використано для перелічування досконалих чисел, а також для перевірки, чи є число досконалим.

Модулі

Для великого програмування[en] Пролог пропонує систему модулів. Цю систему модулів стандартизовано ISO.[17] Проте, не всі компілятори Прологу підтримують модулі, а також існують проблеми сумісності між системами модулів основних компіляторів Прологу.[18] Отже, модулі, написані на одному компіляторі Прологу, не обов’язково працюватимуть на інших.

Граматичний розбір

Детальніші відомості з цієї теми ви можете знайти в статті Синтаксис та семантика Прологу#Граматики визначених речень та Граматика визначених речень.

Існує спеціальний запис, що називається граматики визначених речень. Правило, визначене через -->/2 замість :-/2, розкривається препроцесором (expand_term/2, засіб, аналогічний макросам в інших мовах) відповідно до кількох прямих правил переписування, маючи результатом звичайні речення Прологу. Найважливіше, що переписування споряджає предикат двома додатковими аргументами, що можуть використовуватися для неявного прокручування стану через них, аналогічно до монад в інших мовах. Граматики визначених речень часто використовуються для написання синтаксичних аналізаторів або генераторів списків, оскільки вони надають зручний інтерфейс до списків відмінностей.

Мета-інтерпретатори та рефлексія

Пролог є гомоіконічною мовою та забезпечує багато засобів для рефлексії. Її неявна стратегія виконання робить можливим написання стислого мета-циклічного інтерпретатора[en] (що також називають мета-інтерпретатором) коду чистої Пролог.[19] Оскільки прологові програми самі є послідовностями термів Прологу (:-/2 є інфіксним оператором), що легко читаються та аналізуються з використанням вбудованих механізмів (як-то read/1), нескладно писати спеціальні інтерпретатори, що розширюють Пролог специфічними особливостями.

Повнота за Тюрингом

Чиста Пролог базується на підмножині логіки предикатів першого порядку, диз’юнктах Хорна[en], що є повною за Тюрингом. Повноту за Тюрингом Прологу може бути показано шляхом використання її для імітації машини Тюрінга:

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] ;

Це показує, як будь-яке обчислення може бути представлено декларативно як послідовність переходів станів, реалізована у Пролозі як відношення між послідовними станами, що нас цікавлять.

Реалізація

Детальніші відомості з цієї теми ви можете знайти в статті Порівняння реалізацій Прологу[en].

Пролог ISO

Стандарт Прологу ISO складається з двох частин. ISO/IEC 13211-1,[16][20] опублікована у 1995 році, намагається стандартизувати наявні застосування багатьох реалізацій ключових елементів Прологу. Вона прояснила аспекти цієї мови, що раніше були неоднозначними, і веде до переносимості програм. Є дві еррати: Cor.1:2007[21] та Cor.2:2012.[22] ISO/IEC 13211-2,[16] опублікована у 2000 році, додає до стандарту підтримку модулів. Стандарт підтримується робочою групою ISO/IEC JTC1[en]/SC22[en]/WG17[23]. Технічною дорадчою групою США для цього стандарту є ANSI X3J17.[24]

Компіляція

Для більшої ефективності код Прологу зазвичай компілюється в код абстрактної машини, що часто знаходиться під впливом набору інструкцій базованої на регістрах абстрактної машини Уоррена[en].[25] Деякі реалізації вживають абстрактну інтерпретацію[en] для встановлення інформації про тип та напрямок предикатів під час компіляції, або, для вищої продуктивності, компілюють у код реальної машини.[26] У спільноті логічного програмування придумування ефективних методів реалізації коду Прологу є полем активних досліджень, і в деяких реалізаціях вживається багато інших методів виконання. Вони включають перетворення речень у двійкову форму та віртуальні машини, базовані на стеку[en].[джерело?]

Хвостова рекурсія

Для детермінованих предикатів, що демонструють хвостову рекурсію, або, загальніше, хвостові виклики, прологові системи зазвичай реалізують добре відомий метод оптимізації, що зветься оптимізацією хвостового виклику (англ. Tail Call Optimization, TCO): Кадр стеку скасовується перед виконанням виклику у хвостовій позиції. Отже, детерміновані предикати з хвостовою рекурсією виконуються з незмінним простором стеку, як цикли в інших мовах.

Індексування термів

Детальніші відомості з цієї теми ви можете знайти в статті Індексування термів[en].

Пошук речень, що є об’єднуваними із термом у запиті, є лінійним відносно кількості речень. Індексування термів[en] використовує структуру даних, що уможливлює суб-лінійний пошук.[27] Індексування впливає лише на продуктивність програми, семантики воно не зачіпає.

Табулювання

Деякі прологові системи (BProlog[en], XSB та Yap) реалізують метод мемоїзації, що зветься табулювання, що звільняє користувача від необхідності зберігати проміжні результати вручну.[28][29]

Апаратна реалізація

Під час розробки проекту комп’ютерних систем п’ятої генерації були спроби реалізувати Пролог в апаратному вигляді з метою отримання швидшого виконання спеціальними архітектурами.[30][31][32] До того ж, Пролог має ряд властивостей, що можуть дозволити прискорення шляхом паралельного виконання.[33] Новішими підходами було компілювати обмежені прологові програми у програмовані користувачем вентильні матриці.[34] Однак, швидкий розвиток апаратного забезпечення загального призначення послідовно випередив більш спеціалізовані архітектури.

Критика

Хоча Пролог широко застосовується у дослідницькій роботі та освіті, вона та інші логічні мови програмування не справили істотного впливу на комп’ютерну промисловість у цілому.[35] Більшість застосунків є малими за промисловими стандартами, лише деякі з них мають понад 100,000 рядків коду.[35][36] Велике програмування[en] вважається складним, оскільки не всі компілятори Прологу підтримують модулі, а також існують проблеми сумісності між системами модулів основних прологових компіляторів.[18] Переносимість коду Прологу між реалізаціями також була проблемою, але розробка після 2007 року означала: «переносимість всередині сімейства реалізацій Прологу, що походять від Единбурзької Пролог або Quintus, достатньо гарна для підтримки реальних переносимих програм».[37]

Програмне забезпечення, розроблене на Пролозі, критикувалося за високі втрати продуктивності у порівнянні зі звичайними мовами програмування. Однак, вдосконалення методів реалізації зменшило втрати аж до 25%-50% для деяких застосунків.[38]

Пролог не є чисто декларативною: оскільки вона має оператор відсікання, для її розуміння потрібне також і процедурне прочитання написаних нею програм.[39] Порядок речень у прологовій програмі є суттєвим. Інші логічні мови програмування, такі як Datalog, є чисто декларативними: речення можуть надаватися у довільному порядку.

Розширення

З Прологу було розвинуто різноманітні реалізації для розширення можливостей логічного програмування у численних напрямках. Вони включають типи, режими, логічне програмування з обмеженнями[en], об’єктно-орієнтоване логічне програмування (англ. object-oriented logic programming, OOLP), паралелізм, лінійну логіку[en], можливості функціонального програмування та програмування логіки вищих порядків[en], плюс функціональну сумісність з базами знань:

Типи

Пролог є нетипізованою мовою. Спроби запровадити типи сходять до 1980-х років,[40][41] і станом на 2008 рік все ще існують спроби розширити Пролог типами.[42] Ця інформація корисна не лише для безпечної типізації, а й для обмірковування прологових програм.[43]

Режими

Синтаксис Прологу не визначає, які з аргументів предикату є вхідними, а які вихідними.[44] Проте ця інформація є істотною, і рекомендується включати її до коментарів.[45] Режими надають цінну інформацію при обмірковуванні прологових програм,[43] а також можуть використовуватися для прискорення виконання.[46]

Обмеження

Логічне програмування з обмеженнями[en] розширює Пролог включенням концепцій із задоволення обмежень[en].[47][48] Програма з логікою обмежень дозволяє обмеження в тілах речень, як, наприклад, A(X,Y) :- X+Y>0. Це підходить для великомасштабних задач комбінаторної оптимізації[49] й, отже, для застосувань у промислових умовах, таких як автоматизоване складання розкладів та планування виробництва[en]. Більшість прологових систем постачаються із щонайменше одним розв'язувачем обмежень для зліченних областей визначення, а часто також і з розв'язувачами для інших областей визначення, таких як дійсні числа.

Програмування вищих порядків

HiLog та λProlog[en] розширюють Пролог властивостями програмування вищих порядків. Пролог ISO зараз підтримує вбудовані предикати call/2, call/3, ... що слугують програмуванню вищих порядків та лямбда-абстракціям.

maplist(_Cont, [], []).
maplist(Cont, [X1|X1s], [X2|X2s]) :-
   call(Cont, X1, X2),
   maplist(Cont, X1s, X2s).

Об'єктна орієнтація

Logtalk[en] це об'єктно-орієнтована мова логічного програмування, що може використовувати більшість реалізацій Прологу в якості внутрішнього компілятора. Як мультипарадигмова мова, вона включає підтримку як прототипів, так і класів.

Oblog[en] це невелике переносне об’єктно-орієнтоване розширення Прологу від Маргарити Макдугалл (англ. Margaret McDougall) з EdCAAD Единбурзького університету.

Objlog[en] була фреймовою мовою, що поєднувала об’єкти та Пролог II від НЦНД Франції у Марселі.

Графіка

Прологовими системами, що пропонують графічну бібліотеку, є SWI-prolog,[50] Visual-prolog, LPA Prolog для Windows та B-Prolog.

Паралелізм

Prolog-MPI є розширенням SWI-Prolog з відкритим кодом для розподілених обчислень через інтерфейс передачі повідомлень (англ. Message Passing Interface).[51] Також існує декілька паралельних мов програмування Пролог.[52]

Веб-програмування

Деякі реалізації Прологу, особливо SWI-Prolog та Ciao, підтримують веб-програмування на серверному боці з підтримкою веб-протоколів, HTML та XML.[53] Існують також розширення для підтримки форматів семантичної павутини, таких як RDF та OWL.[54][55] Пролог також пропонувалася як мова клієнтського боку.[56]

Adobe Flash

Cedar є безкоштовним та елементарним інтерпретатором Прологу. Від версії 4 та вище Cedar має підтримку FCA (Flash Cedar App). Це забезпечує нову платформу для програмуванні на Пролозі через ActionScript.

Інші

Інтерфейси до інших мов

Існують каркаси для сполучення між Прологом та іншими мовами:

  • 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[en] надає інтеграцію рідного синтаксису з Java, обмін повідомленнями між програмними агентами та правила реакції. Prova позиціонує себе як скриптову систему на базі правил (англ. rule-based scripting, RBS) для підпрограмного забезпечення. Ця мова відкриває нові обрії у поєднанні імперативного та декларативного програмування.
  • PROL це вбудовуваний рушій Прологу для Java. Він включає невелике інтегроване середовище розробки та декілька бібліотек.
  • GNU Prolog для Java є реалізацією Прологу ISO як бібліотеки Java (gnu.prolog)
  • Ciao[en] надає інтерфейси до C, C++, Java та реляційних баз даних.
  • C#-Prolog є інтерпретатором Прологу, написаним (керованою) C#. Може легко інтегруватися у програми мовою C#. Характеристики: надійний та досить швидкий інтерпретатор, інтерфейс командного рядка, інтерфейс Windows, вбудована граматика визначених речень, XML-предикати, SQL-предикати, розширюваний. Доступний повний джерельний код, включно з генератором синтаксичного аналізатора, що може бути використано для додавання розширень особливого призначення.
  • Jekejeke Prolog API надає сильнозв’язані можливості паралельних вхідних та вихідних викликів між Прологом та Java або Android, з визначною можливістю створення індивідуальних об’єктів баз знань. Він може застосовуватися для вбудовування Прологу ISO до самостійних застосунків, аплетів, сервлетів, APK тощо.
  • Абстрактна машина Уоррена для PHP, компілятор та інтерпретатор Прологу в PHP 5.3. Бібліотека, що може використовуватися самостійно, або з каркасом Symfony2.1.

Історія

Назву Пролог (фр. Prolog) було обрано Філіпом Русселем[фр.] як абревіатуру від програмування в логіці (фр. programmation en logique). Пролог було створено у 1972 році Аланом Кольмерое[en] з Філіпом Русселем на основі процедурної інтерпретації диз’юнктів Хорна[en] Роберта Ковальського. Це було частково мотивоване бажанням примирити використання логіки як мови декларативного представлення знань з процедурним представленням знань, що було популярне в Північній Америці в кінці 1960-х і на початку 1970-х років. Згідно Роберта Ковальського, першу прологову систему було розроблено у 1972 році Аланом Кольмерое та Філіпом Русселем.[5] Перші реалізації Прологу були інтерпретаторами, однак, Девід Уоррен[en] створив абстрактну машину Уоррена[en], ранній та впливовий компілятор Прологу, що прийшов, щоби визначити "Единбурзький" діалект Прологу, що послужив основою синтаксису більшості сучасних реалізацій.

Більшість сучасних розробок Прологу пішли від поштовху проекту комп’ютерних систем п’ятої генерації, в рамках якого було розроблено варіант Прологу під назвою Kernel Language[en] для його першої операційної системи.

Чисту Пролог було спочатку обмежено використанням системи доведення теорем з диз’юнктами Хорна[en] форми:

Г :- Т1, ..., Тn.

Застосунок системи доведення теорем обробляє такі речення як процедури:

щоби показати/розв’язати Г, покажи/розв’яжи Т1 та ... та Тn.

Однак, чисту Пролог незабаром було розширено включенням заперечення як невдачі, у якому заперечні умови форми not(Тi) показуються шляхом спроби і невдачі доведення відповідних позитивних умов Тi.

Подальші розширення Прологу оригінальною командою ввели до реалізацій можливості логічного програмування з обмеженнями[en].

Див. також

Споріднені мови

Примітки

  1. Clocksin, William F.; Mellish, Christopher S. (2003), Programming in Prolog, Berlin ; New York: Springer-Verlag, ISBN 978-3-540-00678-7
  2. Bratko, Ivan (2001), Prolog programming for artificial intelligence, Harlow, England ; New York: Addison Wesley, ISBN 0-201-40375-7
  3. Covington, Michael A. (1994), Natural language processing for Prolog programmers, Englewood Cliffs, N.J.: Prentice Hall, ISBN 978-0-13-629213-5
  4. а б Lloyd, J. W. (1984), Foundations of logic programming, Berlin: Springer-Verlag, ISBN 3-540-13299-6
  5. а б Kowalski, R. A. (1988), The early years of logic programming, Communications of the ACM, 31: 38, doi:10.1145/35043.35046 {{citation}}: Проігноровано невідомий параметр |unused_data= (довідка)
  6. Colmerauer, A.; Roussel, P. (1993), The birth of Prolog, ACM SIGPLAN Notices, 28 (3): 37, doi:10.1145/155360.155362
  7. Див. Логічне програмування#Історія.
  8. 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
  9. Merritt, Dennis (1989), Building expert systems in Prolog, Berlin: Springer-Verlag, ISBN 0-387-97016-9
  10. Kirschenbaum, M.; Sterling, L.S. (1993), Applying Techniques to Skeletons, Constructing Logic Programs, (ed. J.M.J. Jacquet): 27—140
  11. Sterling, Leon (2002), Computational Logic: Logic Programming and Beyond, Lecture Notes in Computer Science, Lecture Notes in Computer Science, 2407: 17—26, doi:10.1007/3-540-45628-7_15, ISBN 978-3-540-43959-2 {{citation}}: Проігноровано |chapter= (довідка)
  12. 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.
  13. Gegg-harrison, T. S. (1995), Representing Logic Program Schemata in Prolog, Procs. Twelfth International Conference on Logic Programming: 467—481
  14. Deville, Yves (1990), Logic programming: systematic program development, Wokingham, England: Addison-Wesley, ISBN 0-201-17576-2
  15. а б Naish, Lee (1996), Higher-order logic programming in Prolog, Higher-order logic programming in Prolog, процитовано 2 листопада 2010
  16. а б в ISO/IEC 13211: Information technology — Programming languages — Prolog. International Organization for Standardization, Geneva.
  17. ISO/IEC 13211-2: Modules.
  18. а б Paulo Moura, Logtalk in Association of Logic Programming Newsletter. Vol 17 n. 3, August 2004. [1]
  19. Shapiro; Ehud, Y.; Sterling, Leon (1994), The art of Prolog: advanced programming techniques, Cambridge, Mass: MIT Press, ISBN 0-262-19338-8
  20. Ed-Dbali, A.; Deransart, Pierre; Cervoni, L. (1996), Prolog: the standard: reference manual, Berlin: Springer, ISBN 3-540-59304-7
  21. ISO/IEC 13211-1:1995/Cor.1:2007
  22. ISO/IEC 13211-1:1995/Cor 2:2012
  23. WG17 Working Group
  24. X3J17 Committee
  25. David H. D. Warren. "An abstract Prolog instruction set". Technical Note 309, SRI International[en], Menlo Park, CA, October 1983.
  26. Van Roy, P.; Despain, A. M. (1992), High-performance logic programming with the Aquarius Prolog compiler, Computer, 25: 54, doi:10.1109/2.108055
  27. Graf, Peter (1995), Term indexing, Berlin ; New York: Springer, ISBN 978-3-540-61040-3
  28. Swift, T. (1999), Annals of Mathematics and Artificial Intelligence, 25 (3/4): 201—200, doi:10.1023/A:1018990308362 {{citation}}: Пропущений або порожній |title= (довідка)
  29. Neng-Fa Zhou and Taisuke Sato (2003): Efficient Fixpoint Computation in Linear Tabling, In Proceedings of the 5th ACM SIGPLAN Conference on Principles and practice of declaritive programming, pp. 275–283.
  30. Abe, S.; Bandoh, T.; Yamaguchi, S.; Kurosawa, K.; Kiriyama, K. (1987), High performance integrated Prolog processor IPP, с. 100, doi:10.1145/30350.30362
  31. A Prolog processor based on a pattern matching memory device - Third International Conference on Logic Programming - Lecture Notes in Computer Science. Springer Berlin / Heidelberg. 1986. doi:10.1007/3-540-16492-8_73. {{cite web}}: |access-date= вимагає |url= (довідка); Пропущений або порожній |url= (довідка)
  32. 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
  33. 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
  34. http://www.cl.cam.ac.uk/~am21/research/sa/byrdbox.ps.gz
  35. а б 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.
  36. The Prolog 1000 database http://www.faqs.org/faqs/prolog/resource-guide/part1/section-9.html
  37. Jan Wielemaker and Vıtor Santos Costa: Portability of Prolog programs: theory and case-studies. CICLOPS-WLPE Workshop 2010.
  38. Sterling, Leon (1990), The Practice of Prolog, MIT Press, с. 32, ISBN 0-262-19301-9, Although some CAD algorithms run between 2 to 4 times slower than their counterparts in C, the interactive response of the editor is comparable to a similar program written in C.
  39. Declarative vs procedural
  40. 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
  41. Pfenning, Frank (1992), Types in logic programming, Cambridge, Mass: MIT Press, ISBN 0-262-16131-1
  42. 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, ISBN 9783540899822
  43. а б 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
  44. O'Keefe, Richard A. (1990), The craft of Prolog, Cambridge, Mass: MIT Press, ISBN 0-262-15039-5
  45. Covington et al; Roberto Bagnara; O'Keefe; Jan Wielemaker; Simon Price (2010). «Coding guidelines for Prolog». arXiv:0911.2899 [cs.PL]. 
  46. 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, ISBN 3-540-17611-X
  47. 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
  48. Colmerauer, Alain (1987), Opening the Prolog III Universe, Byte, August
  49. Wallace, M. (20022002), Constraint Logic Programming, Computational Logic: Logic Programming and Beyond, Lecture Notes in Computer Science, т. 2407, с. 512, doi:10.1007/3-540-45628-7_19, ISBN 3540456287
  50. XPCE graphics library.
  51. prolog-mpi. Apps.lumii.lv. Процитовано 16 вересня 2010.
  52. Ehud Shapiro. The family of concurrent logic programming languages ACM Computing Surveys[en]. September 1989.
  53. 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
  54. 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 Applicatiions of Logic Programming and to the web, Semantic Web and Semantic Web Services, CEUR Workshop Proceedings, Porto, Portugal: CEUR-WS.org, т. 287, с. 84—98
  55. 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
  56. Loke, S. W.; Davison, A. (2001), Secure Prolog-based mobile code, Theory and Practice of Logic Programming, 1, doi:10.1017/S1471068401001211

Література

  • Blackburn P. Learn Prolog Now! / Bos J., Striegnitz K. — Kings College Publications, 2006 — 265 с. — ISBN 1-904987-17-6. (англ.)
  • Братко И.[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. (англ.)
  • Colmerauer A. The birth of Prolog / Roussel P. // The second ACM SIGPLAN conference on History of programming languages. — 1992 — с. 37-52. (англ.)
  • 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 0-13-62921. (англ.)
  • Smith R. POPLOG's two-level virtual machine support for interactive languages / Gibson J., Sloman A.[en] // Research Directions in Cognitive Science Volume 5: Artificial Intelligence. — Eds D. Sleeman and N. Bernsen, Lawrence Erlbaum Associates — 1992 — с. 203–231. (англ.)
  • Стерлинг Л.[en] Искусство программирования на языке Пролог / Шапиро Э.[en] — М: Мир, 1990 — 333 с. — ISBN 5-03-000406-8. (рос.)
  • Kowalski R. The Early Years of Logic Programming // CACM. — січень 1988. (англ.)
  • ISO/IEC 13211: Information technology — Programming languages — Prolog. — Geneva: International Organization for Standardization. (англ.)
  • O'Keefe R.[en] The Craft of Prolog. — 387 с. — ISBN 0-262-15039-5. (англ.)
  • 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 с.

Посилання

Шаблон:Link GA Шаблон:Link FA