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

[перевірена версія][перевірена версія]
Вилучено вміст Додано вміст
м +lang-en
м стильові правлення, зв'язність, уточнення перекладу
Рядок 15:
}}
 
'''Проло́г''' ({{lang-fr|Prolog}}, {{lang-en|Prolog}})&nbsp;— мова [[Логічне програмування|логічного програмування]] загального призначення, пов'язана зі [[Штучний інтелект|штучним інтелектом]] та [[Математична лінгвістика|математичною лінгвістикою]].<ref name=Clocksin2003>
 
{{Citation
Рядок 59:
Пролог має корені в [[Логіка першого порядку|логіці першого порядку]], [[Математична логіка|математичній логіці]], та, на відміну від багатьох інших [[Мова програмування|мов програмування]], є [[Декларативне програмування|декларативною]]: логіка програми виражається в термінах відношень, представлених як факти та [[Правило умовиводу|правила]]. Обчислення ініціюється запуском ''запиту'' над цими відношеннями<ref name=lloyd84/>.
 
Цю мову програмування спочатку було задумано групою навколо {{Не перекладено|Алан Кольмерое|Алана Кольмерое||Alain Colmerauer}} ув [[Марсель|Марселі]] на початку [[1970-ті|1970-тих]], а першу систему Пролог було розроблено ув [[1972]]-му Аланом Кольмерое та {{Не перекладено|Філіп Руссель|Філіпом Русселем|fr|Philippe Roussel}}<ref name="Kowalski">
 
{{Citation
Рядок 160:
}} {{ref-en}}
 
</ref> Відношення виражаються ''твердженнями''. Отримавши запит, рушій Прологу намагається знайти [[спростування]] [[Правило резолюцій|резолюції]] [[заперечення]] запиту. Якщо заперечення запиту може бути спростовано, тобто, знайдено конкретизацію всіх вільних змінних, що робить об'єднання атомарних формул та множини-[[Синґлетон (математика)|синґлетону]], що складається із заперечення запиту, хибним, то з цього випливає, що початковий запит, із застосуванням знайденої конкретизації, є [[Логічна імплікація|логічним висновком]] програми. Це робить Пролог (та інші логічні мови програмування) надзвичайно зручною для застосування ув базах даних, символьній математиці та граматичному аналізі мов. Оскільки Пролог дозволяє нечисті [[предикат]]и, перевірка [[Значення істинності|істинності]] певних спеціальних предикатів може мати деякий навмисний [[Побічний ефект (програмування)|побічний ефект]], як-то виведення значення на екран. Через це програмістові дозволено певною мірою використовувати звичайне [[імперативне програмування]], коли логічна парадигма є незручною. Пролог має як чисту логічну підмножину, що називається «чиста Пролог», так і ряд позалогічних властивостей.
 
=== Типи даних ===
Рядок 166:
Єдиним [[Тип даних|типом даних]] Прологу є ''терм''. Терми можуть бути ''атомами'', ''числами'', ''змінними'' або ''складеними термами''.
 
* '''Атом'''&nbsp;— це загальна назва без притаманного значення. Прикладами атомів є <code>x</code>, <code>синій</code>, <code>'Пиріжок'</code> та <code>'якийсь атом'</code>.
* '''Числа''' можуть бути [[Число з плаваючою комою|з плаваючою комою]], або [[Цілі числа|цілими]].
* '''Змінні''' позначаються стрічками, що складаються з літер, цифр та символів підкреслення, і починаються з великої літери або символу підкреслення. Змінні дуже подібні до змінних в логіці в тімтим, що вони є позначками-заповнювачами для довільних термів.
* '''Складений терм''' складається з атому, що зветься [[функтор]], та певної кількості аргументів, що в свою чергу теж є термами. Складені терми зазвичай записуються у вигляді функтора, за яким у дужках слідує перелік термів-аргументів через кому. Кількість аргументів називається [[Арність|арністю]] терму. Атом може розглядатися як складений терм нульової арності. <code>рік_машини('Таврія', 1988)</code> та <code>'Друзі_Особи'(грай,[око,тур])</code> є прикладами складених термів.
 
Рядок 178:
=== Правила та факти ===
 
Прологові програми описують відношення, визначені твердженнями. Чиста Пролог обмежена {{Не перекладено|Диз’юнкт Хорна|диз’юнктами Хорна||Horn clausesclause}}. Є два типи тверджень: факти та правила. Правило має вигляд
 
<syntaxhighlight lang="prolog">Голова :- Тіло.</syntaxhighlight>
Рядок 227:
=== Виконання ===
 
Виконання прологової програми починається задаванням користувачем єдиної цілі, що зветься запитом. З точки зору логіки, рушій Прологу намагається знайти спростування [[Правило резолюцій|резолюції]] заперечення цього запиту. Метод резолюції, що використовується у Пролозі, називається {{Не перекладено|SLD-резолюція|SLD-резолюцією||SLD resolution}}. Якщо заперечення запиту може бути спростовано, з цього випливає, що запит, з відповідними зв'язуваннями змінних, є логічним висновком програми. У такому разі всі створені зв'язування змінних повідомляються користувачеві, і про запит повідомляється, що він досяг успіху. З практичної точки зору, стратегію виконання Прологу можна уявити як узагальнення викликів функцій в інших мовах, з тією різницею, що заданому запитові можуть відповідати голови кількох тверджень. В такому випадку система створює точку вибору, [[{{нп|Уніфікація (інформатика)|об'єднує]]||Unification (computer science)}} ціль з головою твердження першої альтернативи, і продовжує цілями цієї першої альтернативи. Якщо ув напрямку виконання програми будь-яка ціль зазнає невдачі, всі зв'язування змінних, що було зроблено від останньої на той момент точки вибору, скасовуються, і виконання продовжується з наступною альтернативою цієї точки вибору. Ця стратегія виконання називається хронологічним [[Пошук з вертанням|пошуком з вертанням]]. Наприклад:
 
 
Рядок 269:
<syntaxhighlight lang="prolog">легальне(X) :- \+ нелегальне(X).</syntaxhighlight>
 
обчислюється таким чином. Пролог намагається довести <code>нелегальне(X)</code>. Якщо доведення цієї цілі знайдено, то початкова ціль (тобто, <code>\+ нелегальне(X)</code>) зазнає невдачі. Якщо доведення не може бути знайдено, то початкова ціль досягає успіху. Отже, префіксний оператор <code>\+/1</code> називається оператором «недовідне», оскільки запит <code>?- \+ Ціль.</code> досягає успіху, якщо Ціль не є довідною. Цей вид заперечення є [[Правильність|правильним]], якщо його аргумент є {{Не перекладено|Замкнений вираз|замкненим||Ground expression}} (тобто, не містить змінних). Правильність втрачається, якщо аргумент містить змінні, таі процедура доведення є повною. Зокрема, запит <code>?- легальне(X).</code> тепер вже не може бути використано для перелічення усіх речей, що є легальними.
 
== Програмування мовою Пролог ==
Рядок 304:
</source>
 
=== Оптимізація компіляторакомпілятором ===
Будь-яке обчислення може бути виражено декларативно як послідовність переходу станів. Як приклад, оптимізуючий компілятор з трьома проходами оптимізації може бути реалізовано як відношення між початковою програмою та її оптимізованою формою:
 
Рядок 408:
== Програмування вищих порядків ==
{{Докладніше1|{{Не перекладено|Логіка вищих порядків|||Higher-order logic}} та {{Не перекладено|Програмування вищих порядків|||Higher-order programming}}}}
Предикат вищихвищого порядківпорядку&nbsp;— це предикат, що має один або більше інших предикатів як аргументи. Хоча підтримка програмування вищих порядків і виводить Пролог з області [[логіка першого порядку|логіки першого порядку]], щояка не дозволяє квантифікації предикатів,<ref>
 
{{Cite web
Рядок 416:
}} {{ref-en}}
 
</ref> Пролог ISO вже має деякі вбудовані предикати вищих порядків, такі як <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>, що відфільтровує елементи, щоякі задовольняють наданому предикатові, беручиуможливлюючи дотакож уваги йі [[каррування]].<ref name="Naish1996"/>
 
Для перетворення рішень з часового представлення (підстановки відповідей при зворотному пошуку) до просторового представлення (термів) Пролог має різноманітні предикати для всіх рішень, що збирають всі підстановки відповідей для заданого запиту до списку. Це може використовуватися у [[Спискові вирази|спискових виразах]]. Наприклад, [[Досконале число|досконалі числа]] дорівнюють сумі своїх дільників:
Рядок 436:
</source>
 
Коли <code>P</code> є таким предикатом, що для кожного <code>X</code> <code>P(X,Y)</code> [[{{нп|Уніфікація (інформатика)|об'єднує]]||Unification (computer science)}} <code>Y</code> з єдиним унікальним значенням, <code>maplist(P, Xs, Ys)</code> є еквівалентом застосування функції [[Map (функція вищого порядку)|map]] у [[Функційне програмування|функційному програмуванні]] як <code>Ys = map(Function, Xs)</code>.
 
Програмування вищих порядків було започатковано у Пролозі в {{Не перекладено|HiLog|||HiLog}} та {{Не перекладено|λProlog|||λProlog}}.
Рядок 442:
== Модулі ==
 
Для {{Не перекладено|Велике і мале програмування|великого програмування||Programming in the large and programming in the small}} Пролог пропонує [[Модульне програмування|систему модулів]]. Цю систему модулів стандартизовано ISO.<ref>ISO/IEC 13211-2: Modules. {{ref-en}}</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-en}}</ref> Отже, модулі, написані напід одномуодним компіляторікомпілятором Прологу, не обов'язково працюватимуть напід іншихіншими.
 
== Граматичний розбір ==
{{Main|Синтаксис та семантика Прологу#Граматики визначених тверджень|Граматика визначених тверджень}}
 
Існує спеціальний запис, що називається [[Граматика визначених тверджень|граматикиграматиками визначених тверджень]]. Правило, визначене через <code>-->/2</code> замість <code>:-/2</code>, розкривається препроцесором (<code>expand_term/2</code>, засіб, аналогічний [[макрос]]ам в інших мовах) відповідно до кількох прямих правил переписування, маючи результатом звичайні твердження Прологу. Найважливіше, що переписування споряджає предикат двома додатковими аргументами, що можуть використовуватися для неявного прокручування стану через них, аналогічно до [[Монади (програмування)|монад]] в інших мовах. Граматики визначених тверджень часто використовуються для написання синтаксичних аналізаторів або генераторів списків, оскільки вони надають зручний інтерфейс до списків відмінностей.
 
== Мета-інтерпретатори та рефлексія ==
 
Пролог є [[ГомоіконічністьГомоіконність|гомоіконічноюгомоіконною]] мовою, таі забезпечує багато засобів для [[Рефлексія (програмування)|рефлексії]]. Її неявна стратегія виконання робить можливим написання стислого {{Не перекладено|Мета-циклічний інтерпретатор|мета-циклічного інтерпретатора||Meta-circular evaluator}} (що також називають ''мета-інтерпретатором'') коду чистої Пролог:
 
<syntaxhighlight lang="prolog">
Рядок 462:
solve(Body).
</syntaxhighlight>
де <code>true</code> представляє порожню conjunctionкон'юнкцію, іа <code>clause(Head, Body)</code> [[{{нп|Уніфікація (інформатика)|об'єднується]]||Unification (computer science)}} з твердженнями бази даних вигляду <code>Head :- Body</code>.
 
Оскільки прологові програми самі є послідовностями термів Прологу (<code>:-/2</code> є інфіксним [[Оператор (програмування)|оператором]]), що легко читаються та аналізуються з використанням вбудованих механізмів (як-то <code>read/1</code>), можливо писати спеціальні інтерпретатори, що розширюють Пролог предметно-орієнтованими властивостями. Наприклад, Стерлінг та Шапіро представляють мета-інтерпретатор, що виконує міркування з неточностями, відтворений тут із незначними видозмінами:<ref name="AOP94">
Рядок 512:
 
== Повнота за Тюрингом ==
Чиста Пролог базується на підмножині [[Предикатна логіка|предикатної логіки]] першого порядку, {{Не перекладено|Диз’юнкт Хорна|диз’юнктах Хорна||Horn clauses}}, що є [[Повнота за Тюрингом|повною за Тюрингом]]. Повноту Прологу за Тюрингом Прологу може бути показано шляхом використання її для імітації машини Тюрінга:
<source lang="prolog">
turing(Tape0, Tape) :-
Рядок 549:
</source>
 
Це показує, як будь-яке обчислення може бути представлено декларативно як послідовність переходів станів, реалізованареалізовану ув Пролозі як відношення між послідовними станами, що нас цікавлять.
 
== Реалізація ==
Рядок 575:
}} {{ref-en}}
 
</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-en}}</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-en}}</ref> ISO/IEC 13211-2,<ref name="ISO 13211" /> опублікована ув [[2000]] році, додає до стандарту підтримку модулів. Стандарт підтримується робочою групою {{Не перекладено|JTC1|ISO/IEC JTC1||JTC1}}/{{Не перекладено|SC22|||SC22}}/WG17<ref name="WG17">[http://www.sju.edu/~jhodgson/wg17/ WG17 Working Group] {{ref-en}}</ref>. Технічною дорадчою групою [[США]] для цього стандарту є [[ANSI]] X3J17.<ref name="X3J17">[http://www.sju.edu/~jhodgson/x3j17.html X3J17 Committee] {{ref-en}}</ref>
 
=== Компіляція ===
 
Для більшої ефективності код Прологу зазвичай компілюється ув код абстрактної машини, що часто знаходиться під впливом набору інструкцій {{Не перекладено|Регістрова машина|базованої на регістрах||Register machine}} {{Не перекладено|Абстрактна машина Уоррена|абстрактної машини Уоррена||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|||SRI International}}, Menlo Park, CA, October 1983. {{ref-en}}</ref> Деякі реалізації вживають {{Не перекладено|Абстрактна інтерпретація|абстрактну інтерпретацію||abstract interpretation}} для встановлення інформації про тип та напрямок предикатів під час компіляції, або, для вищої продуктивності, компілюють у код реальної машини.<ref>
 
{{Citation
Рядок 594:
}} {{ref-en}}
 
</ref> У спільноті логічного програмування придумування ефективних методів реалізації коду Прологу є полем активних досліджень, і в деяких реалізаціях вживаєтьсязастосовується багато інших методів виконання. Вони включають перетворення тверджень у двійкову форму та {{Не перекладено|Стекова машина|віртуальні машини, базовані на стеку||Stack machine}}.{{Citation needed}}
 
=== Хвостова рекурсія ===
 
Для детермінованих предикатів, що демонструють [[Хвостова рекурсія|хвостову рекурсію]], або, загальніше, хвостові виклики, прологові системи зазвичай реалізують добре відомий метод оптимізації, що зветься [[Хвостова рекурсія|оптимізацією хвостового виклику]] ({{lang-en|Tail Call Optimization, TCO}}): Перед виконанням виклику ув хвостовій позиції кадр стеку твердження скасовується. Отже, детерміновані предикати з хвостовою рекурсією виконуються з незмінним простором стеку, як цикли в інших мовах.
 
=== Індексування термів ===
{{Докладніше1|{{Не перекладено|Індексування термів|||Term indexing}}}}
Пошук тверджень, що є [[{{нп|Уніфікація (інформатика)|об'єднуваними]]||Unification (computer science)}} із термом у запиті, є лінійним відносно кількості тверджень. {{Не перекладено|Індексування термів|||Term indexing}} використовує [[Структура даних|структуру даних]], що уможливлює [[Обчислювальна складність|суб-лінійний]] пошук.<ref>
 
{{Citation
Рядок 749:
}} {{ref-en}}
 
</ref> Новішими підходами було компілювати обмежені прологові програми у [[FPGA|програмовані користувачем вентильні матриці]].<ref>http://www.cl.cam.ac.uk/~am21/research/sa/byrdbox.ps.gz {{ref-en}}</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-en}}</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}}</ref> {{Не перекладено|Велике і мале програмування|Велике програмування||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-en}}</ref>
 
Програмне забезпечення, розроблене на Пролозі, критикувалося за високі втрати продуктивності у порівнянні зі звичайними мовами програмування. Зокрема, прологова недетерміністська стратегія виконання може бути проблематичною при програмуванні детерміністських обчислень, або навіть при використанні «незважання на недетермінізм» (коли робиться єдиний вибір замість зворотнього пошуку всіма можливими). Для досягнення бажаної продуктивності може доводитися застосовувати відсікання та інші мовні конструкції, руйнуючи одну з головних принад Прологу, здатність виконувати програми «назад і вперед».<ref name="rethinking">
Рядок 792:
== Розширення ==
 
З Прологу було розвинуто різноманітні реалізації для розширення можливостей логічного програмування у численних напрямках. Вони включають [[Система типізації|типи]], режими, {{Не перекладено|логічне програмування з обмеженнями|||constraint logic programming}} ({{lang-en|CLP}}), {{нп|об'єктно-орієнтоване логічне програмування ({{lang-en|object||Object-oriented logic programming,}} ({{lang-en|OOLP}}), [[Паралелізм (інформатика)|паралелізм]], {{Не перекладено|Лінійна логіка|лінійну логіку||Linear logic}}, можливості функціонального[[Функційне програмування|функційного програмування]] та програмування {{Не перекладено|Логіка вищих порядків|логіки вищих порядків||Higher-order logic}}, плюс функціональну сумісність з базами знань:
 
=== Типи ===
Рядок 979:
{{Не перекладено|Flora-2|||Flora-2}} є об'єктно-орієнтованим представленням знань та системою міркувань на базі {{Не перекладено|F-logic|||F-logic}}, і включає {{Не перекладено|HiLog|||HiLog}}, {{Не перекладено|Транзакційна логіка|транзакційну логіку||Transaction logic}} та {{Не перекладено|Міркування методом виключення|міркування методом виключення||Defeasible reasoning}}.
 
{{Не перекладено|Logtalk|||Logtalk}}&nbsp;— це об'єктно-орієнтована мова логічного програмування, що може використовуватизастосовувати більшість реалізацій Прологу якв якості внутрішнього компілятора. Як {{нп|Мультипарадигмова мова програмування|мультипарадигмова мова||Multi-paradigm programming language}}, вона включає підтримку як прототипів, так і класів.
 
{{Не перекладено|Oblog|||Oblog}}&nbsp;— це невелике переносне об'єктно-орієнтоване розширення Прологу від Маргарити Макдугалл ({{lang-en|Margaret McDougall}}) з EdCAAD [[Единбурзький університет|Единбурзького університету]].
 
{{Не перекладено|Objlog|||Objlog}} була фреймовою мовою, що поєднувала об'єкти та Пролог II від [[Національний центр наукових досліджень|НЦНД]] [[Франція|Франції]] у Марселі.
 
{{Не перекладено|Prolog++|||Prolog++}} було розроблено компанією {{Не перекладено|Logic Programming Associates|||Logic Programming Associates}}, і вперше випущено у 1989 році для ПК [[MS-DOS]]. Було додано підтримку для інших платформ, і 1995 року випущено другу версію. У 1994 році видавництвом [[Addison-Wesley]] було опубліковано книгу Кріса Мосса ({{lang-en|Chris Moss}}) про Prolog++.
 
=== Графіка ===
Рядок 1002:
=== Паралелізм ===
 
[[Prolog-MPI]] є розширенням [[SWI-Prolog]] з [[Відкрите програмне забезпечення|відкритим кодом]] для розподілених обчислень через [[Message Passing Interface|інтерфейс передачі повідомлень]] ({{lang-en|Message Passing InterfaceMPI}}).<ref>
 
{{Cite web
Рядок 1014:
}} {{ref-en}}
 
</ref> Також існує декілька паралельних{{нп|Конкурентні обчислення|конкурентних||Concurrent computing}} мов програмування Пролог.<ref>Ehud Shapiro. ''The family of concurrent logic programming languages'' {{Не перекладено|ACM Computing Surveys|||ACM Computing Surveys}}. September 1989. {{ref-en}}</ref>
 
=== Веб-програмування ===
Рядок 1048:
}} {{ref-en}}
 
</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}}</ref> Пролог також пропонувалася якв моваякості мови {{Не перекладено|Клієнтський бік|клієнтського боку||Client-side}}.<ref>
 
{{Citation
Рядок 1064:
=== Adobe Flash ===
 
[http://sites.google.com/site/cedarprolog/ Cedar] є безкоштовним та елементарним інтерпретатором Прологу. Від версії 4 та вище Cedar має підтримку FCA (Flash Cedar App). Це забезпечує нову платформу для програмуванніпрограмування на ПролозіПрологом через [[ActionScript]].
 
=== Інші ===
Рядок 1077:
* [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&nbsp;— це двоспрямований міст між Java та Прологом, що постачається з SWI-Prolog за замовчуванням, і що дозволяє Java та Прологові викликати одне одного (рекурсивно). Він відомий гарною підтримкою паралельності, та знаходиться в активній розробці.
* [http://www.declarativa.com/interprolog/ InterProlog], програмна бібліотека мосту між Java та Прологом, що реалізує двоспрямовані виклики предикатів/методів між обома мовами. Об'єкти Java можуть відображатися у терми Прологу, і навпаки. Дозволяє розробку [[Графічний інтерфейс користувача|графічного інтерфейсу користувача]] та іншої функціональності в Java, залишаючи обробку логіки ув шарі Прологу. Підтримує {{Не перекладено|XSB|||XSB}}, із запланованою на [[2013]] рік підтримкою [[SWI-Prolog]] та YAP.
* {{Не перекладено|Prova|||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||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 (формат файлу)|APK]] тощо.
* [https://github.com/Trismegiste/WamBundle Абстрактна машина Уоррена для PHP], компілятор та інтерпретатор Прологу в [[PHP]] 5.3. Бібліотека, що може використовуватися самостійно, або з каркасом [[Symfony]]2.1.
Рядок 1089:
== Історія ==
 
Назву ''Пролог'' ({{lang-fr|Prolog}}) було обрано {{Не перекладено|Філіп Руссель|Філіпом Русселем|fr|Philippe Roussel}} як абревіатуру від ''програмування в логіці'' ({{lang-fr|programmation en logique}}). Пролог було створено ув [[1972]] році {{Не перекладено|Алан Кольмерое|Аланом Кольмерое||Alain Colmerauer}} з Філіпом Русселем на основі процедурної інтерпретації {{Не перекладено|Диз’юнкт Хорна|диз’юнктів Хорна||Horn clauses}} {{Не перекладено|Роберт Ковальський|Роберта Ковальського||Robert Kowalski}}. Це було частково мотивоване бажанням примирити використання логіки як мови декларативного представлення знань з процедурним представленням знань, що було популярне в [[Північна Америка|Північній Америці]] в кінці [[1960-ті|1960-х]] і на початку [[1970-ті|1970-х]] років. Згідно з {{Не перекладено|Роберт Ковальський|РобертомРоберта КовальськимКовальського||Robert Kowalski}}, першу прологову систему було розроблено ув [[1972]] році Аланом Кольмерое та Філіпом Русселем.<ref name="Kowalski"/> Перші реалізації Прологу були інтерпретаторами. Однак, {{Не перекладено|Девід Уоррен|||David H. D. Warren}} створив {{Не перекладено|Абстрактна машина Уоррена|абстрактну машину Уоррена||Warren Abstract Machine}}, ранній та впливовий компілятор Прологу, що прийшов, щоби визначити «Единбурзький» діалект Прологу, що послужив основою синтаксису більшості сучасних реалізацій.
 
Європейські дослідники штучного інтелекту віддавали перевагу Прологу, тоді як американці віддавали перевагу [[LISP|Ліспу]], що, як повідомлялося, призводило до численних націоналістичних дебатів про переваги цих мов.<ref name="pountain198410">
Рядок 1113:
щоби показати/розв’язати Г, покажи/розв’яжи Т<sub>1</sub> та ... та Т<sub>n</sub>.
 
Однак, чисту Пролог незабаром було розширено включенням [[{{нп|Заперечення як відмова|заперечення як відмови]]||Negation as failure}}, ув якому заперечні умови форми not(Т<sub>i</sub>) показуються шляхом спроби і невдачі доведення відповідних позитивних умов Т<sub>i</sub>.
 
Подальші розширення Прологу оригінальною командою ввели до реалізацій можливості {{Не перекладено|Логічне програмування з обмеженнями|логічного програмування з обмеженнями||Constraint logic programming}}.
Рядок 1119:
== Використання у промисловості ==
 
Пролог використовувалася ув комп'ютерній системі [[IBM Watson|Watson]]. Watson використовує програмне забезпечення DeepQA компанії [[IBM]] та програмний каркас Apache {{Не перекладено|UIMA|||UIMA}} ({{lang-en|Unstructured Information Management Architecture}}, Архітектура Керування Неструктурованою Інформацією). Цю систему було написано багатьма мовами, включно з Java, C++ та Пролог, вона працює на операційній системі {{Не перекладено|SUSE Linux Enterprise Server|||SUSE Linux Enterprise Server}} 11 з використанням програмного каркасу [[Apache Hadoop]] для забезпечення [[Розподілені обчислення|розподілених обчислень]]. Пролог використовується для {{Не перекладено|Зіставлення зі зразками|зіставлення зі зразками||Pattern matching}} над [[Синтаксичне дерево|синтаксичними деревами]] природної мови. Розробники цієї системи заявили:
 
{{Цитата|Ми потребували мови, якою ми могли би зручно виражати правила зіставлення зі зразками над синтаксичними деревами та іншими тлумаченнями (такими як результати розпізнавання іменованих сутностей), і технології, здатної виконувати ці правила дуже ефективно. Ми виявили, що Пролог була ідеальним вибором такої мови через свою простоту та виразність.<ref name=lally/>
{{oq||We required a language in which we could conveniently express pattern matching rules over the parse trees and other annotations (such as named entity recognition results), and a technology that could execute these rules very efficiently. We found that Prolog was the ideal choice for the language due to its simplicity and expressiveness.<ref name=lally/>}}
}}
 
Рядок 1154:
* У певному сенсі{{Якому}} Пролог є підмножиною мови {{Не перекладено|Planner|||Planner (programming language)}}. Пізніше ідеї мови Planner було розвинуто у {{Не перекладено|Метафора наукової спільноти|метафору наукової спільноти||Scientific community metaphor}}.
* [[AgentSpeak]] є варіантом Прологу для програмування поведінки агентів у [[Багатоагентна система|багатоагентних системах]].
* [[Erlang (мова програмування)|Erlang]] почала життя з реалізації на базі Прологу, і зберігає більшість синтаксису Прологу на базі [[{{нп|Уніфікація (інформатика)|об'єднань]]||Unification (computer science)}}.
 
== Примітки ==