Пролог (мова програмування): відмінності між версіями
[перевірена версія] | [перевірена версія] |
Вилучено вміст Додано вміст
м +lang-en |
м стильові правлення, зв'язність, уточнення перекладу |
||
Рядок 15:
}}
'''Проло́г''' ({{lang-fr|Prolog}}, {{lang-en|Prolog}}) — мова [[Логічне програмування|логічного програмування]] загального призначення, пов'язана зі [[Штучний інтелект|штучним інтелектом]] та [[Математична лінгвістика|математичною лінгвістикою]].<ref name=Clocksin2003>
{{Citation
Рядок 59:
Пролог має корені в [[Логіка першого порядку|логіці першого порядку]], [[Математична логіка|математичній логіці]], та, на відміну від багатьох інших [[Мова програмування|мов програмування]], є [[Декларативне програмування|декларативною]]: логіка програми виражається в термінах відношень, представлених як факти та [[Правило умовиводу|правила]]. Обчислення ініціюється запуском ''запиту'' над цими відношеннями<ref name=lloyd84/>.
Цю мову програмування спочатку було задумано групою навколо {{Не перекладено|Алан Кольмерое|Алана Кольмерое||Alain Colmerauer}}
{{Citation
Рядок 160:
}} {{ref-en}}
</ref> Відношення виражаються ''твердженнями''. Отримавши запит, рушій Прологу намагається знайти [[спростування]] [[Правило резолюцій|резолюції]] [[заперечення]] запиту. Якщо заперечення запиту може бути спростовано, тобто, знайдено конкретизацію всіх вільних змінних, що робить об'єднання атомарних формул та множини-[[Синґлетон (математика)|синґлетону]], що складається із заперечення запиту, хибним, то з цього випливає, що початковий запит, із застосуванням знайденої конкретизації, є [[Логічна імплікація|логічним висновком]] програми. Це робить Пролог (та інші логічні мови програмування) надзвичайно зручною для застосування
=== Типи даних ===
Рядок 166:
Єдиним [[Тип даних|типом даних]] Прологу є ''терм''. Терми можуть бути ''атомами'', ''числами'', ''змінними'' або ''складеними термами''.
* '''Атом''' — це загальна назва без притаманного значення. Прикладами атомів є <code>x</code>, <code>синій</code>, <code>'Пиріжок'</code> та <code>'якийсь атом'</code>.
* '''Числа''' можуть бути [[Число з плаваючою комою|з плаваючою комою]], або [[Цілі числа|цілими]].
* '''Змінні''' позначаються стрічками, що складаються з літер, цифр та символів підкреслення, і починаються з великої літери або символу підкреслення. Змінні дуже подібні до змінних в логіці
* '''Складений терм''' складається з атому, що зветься [[функтор]], та певної кількості аргументів, що в свою чергу теж є термами. Складені терми зазвичай записуються у вигляді функтора, за яким у дужках слідує перелік термів-аргументів через кому. Кількість аргументів називається [[Арність|арністю]] терму. Атом може розглядатися як складений терм нульової арності. <code>рік_машини('Таврія', 1988)</code> та <code>'Друзі_Особи'(грай,[око,тур])</code> є прикладами складених термів.
Рядок 178:
=== Правила та факти ===
Прологові програми описують відношення, визначені твердженнями. Чиста Пролог обмежена {{Не перекладено|Диз’юнкт Хорна|диз’юнктами Хорна||Horn
<syntaxhighlight lang="prolog">Голова :- Тіло.</syntaxhighlight>
Рядок 227:
=== Виконання ===
Виконання прологової програми починається задаванням користувачем єдиної цілі, що зветься запитом. З точки зору логіки, рушій Прологу намагається знайти спростування [[Правило резолюцій|резолюції]] заперечення цього запиту. Метод резолюції, що використовується у Пролозі, називається {{Не перекладено|SLD-резолюція|SLD-резолюцією||SLD resolution}}. Якщо заперечення запиту може бути спростовано, з цього випливає, що запит, з відповідними зв'язуваннями змінних, є логічним висновком програми. У такому разі всі створені зв'язування змінних повідомляються користувачеві, і про запит повідомляється, що він досяг успіху. З практичної точки зору, стратегію виконання Прологу можна уявити як узагальнення викликів функцій в інших мовах, з тією різницею, що заданому запитові можуть відповідати голови кількох тверджень. В такому випадку система створює точку вибору,
Рядок 269:
<syntaxhighlight lang="prolog">легальне(X) :- \+ нелегальне(X).</syntaxhighlight>
обчислюється таким чином. Пролог намагається довести <code>нелегальне(X)</code>. Якщо доведення цієї цілі знайдено, то початкова ціль (тобто, <code>\+ нелегальне(X)</code>) зазнає невдачі. Якщо доведення не може бути знайдено, то початкова ціль досягає успіху. Отже, префіксний оператор <code>\+/1</code> називається оператором «недовідне», оскільки запит <code>?- \+ Ціль.</code> досягає успіху, якщо Ціль не є довідною. Цей вид заперечення є [[Правильність|правильним]], якщо його аргумент є {{Не перекладено|Замкнений вираз|замкненим||Ground expression}} (тобто, не містить змінних). Правильність втрачається, якщо аргумент містить змінні,
== Програмування мовою Пролог ==
Рядок 304:
</source>
=== Оптимізація
Будь-яке обчислення може бути виражено декларативно як послідовність переходу станів. Як приклад, оптимізуючий компілятор з трьома проходами оптимізації може бути реалізовано як відношення між початковою програмою та її оптимізованою формою:
Рядок 408:
== Програмування вищих порядків ==
{{Докладніше1|{{Не перекладено|Логіка вищих порядків|||Higher-order logic}} та {{Не перекладено|Програмування вищих порядків|||Higher-order programming}}}}
Предикат
{{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>, що відфільтровує елементи,
Для перетворення рішень з часового представлення (підстановки відповідей при зворотному пошуку) до просторового представлення (термів) Пролог має різноманітні предикати для всіх рішень, що збирають всі підстановки відповідей для заданого запиту до списку. Це може використовуватися у [[Спискові вирази|спискових виразах]]. Наприклад, [[Досконале число|досконалі числа]] дорівнюють сумі своїх дільників:
Рядок 436:
</source>
Коли <code>P</code> є таким предикатом, що для кожного <code>X</code> <code>P(X,Y)</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|Синтаксис та семантика Прологу#Граматики визначених тверджень|Граматика визначених тверджень}}
Існує спеціальний запис, що називається [[Граматика визначених тверджень|
== Мета-інтерпретатори та рефлексія ==
Пролог є [[
<syntaxhighlight lang="prolog">
Рядок 462:
solve(Body).
</syntaxhighlight>
де <code>true</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> опублікована
=== Компіляція ===
Для більшої ефективності код Прологу зазвичай компілюється
{{Citation
Рядок 594:
}} {{ref-en}}
</ref> У спільноті логічного програмування придумування ефективних методів реалізації коду Прологу є полем активних досліджень, і в деяких реалізаціях
=== Хвостова рекурсія ===
Для детермінованих предикатів, що демонструють [[Хвостова рекурсія|хвостову рекурсію]], або, загальніше, хвостові виклики, прологові системи зазвичай реалізують добре відомий метод оптимізації, що зветься [[Хвостова рекурсія|оптимізацією хвостового виклику]] ({{lang-en|Tail Call Optimization, TCO}}): Перед виконанням виклику
=== Індексування термів ===
{{Докладніше1|{{Не перекладено|Індексування термів|||Term indexing}}}}
Пошук тверджень, що є
{{Citation
Рядок 749:
}} {{ref-en}}
</ref> Новішими підходами було компілювати обмежені прологові програми у [[FPGA|програмовані користувачем вентильні матриці]].<ref>http://www.cl.cam.ac.uk/~am21/research/sa/byrdbox.ps.gz {{ref-en}}</ref> Однак, швидкий розвиток апаратного забезпечення загального призначення послідовно випередив
== Недоліки ==
Хоча Пролог широко застосовується
Програмне забезпечення, розроблене на Пролозі, критикувалося за високі втрати продуктивності у порівнянні зі звичайними мовами програмування. Зокрема, прологова недетерміністська стратегія виконання може бути проблематичною при програмуванні детерміністських обчислень, або навіть при використанні «незважання на недетермінізм» (коли робиться єдиний вибір замість зворотнього пошуку всіма можливими). Для досягнення бажаної продуктивності може доводитися застосовувати відсікання та інші мовні конструкції, руйнуючи одну з головних принад Прологу, здатність виконувати програми «назад і вперед».<ref name="rethinking">
Рядок 792:
== Розширення ==
З Прологу було розвинуто різноманітні реалізації для розширення можливостей логічного програмування у численних напрямках. Вони включають [[Система типізації|типи]], режими, {{Не перекладено|логічне програмування з обмеженнями|||constraint logic programming}} ({{lang-en|CLP}}), {{нп|об'єктно-орієнтоване логічне програмування
=== Типи ===
Рядок 979:
{{Не перекладено|Flora-2|||Flora-2}} є об'єктно-орієнтованим представленням знань та системою міркувань на базі {{Не перекладено|F-logic|||F-logic}}, і включає {{Не перекладено|HiLog|||HiLog}}, {{Не перекладено|Транзакційна логіка|транзакційну логіку||Transaction logic}} та {{Не перекладено|Міркування методом виключення|міркування методом виключення||Defeasible reasoning}}.
{{Не перекладено|Logtalk|||Logtalk}} — це об'єктно-орієнтована мова логічного програмування, що може
{{Не перекладено|Oblog|||Oblog}} — це невелике переносне об'єктно-орієнтоване розширення Прологу від Маргарити Макдугалл ({{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|
{{Cite web
Рядок 1014:
}} {{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> Пролог також пропонувалася
{{Citation
Рядок 1064:
=== Adobe Flash ===
[http://sites.google.com/site/cedarprolog/ Cedar] є безкоштовним та елементарним інтерпретатором Прологу. Від версії 4 та вище Cedar має підтримку FCA (Flash Cedar App). Це забезпечує нову платформу для
=== Інші ===
Рядок 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 — це двоспрямований міст між Java та Прологом, що постачається з SWI-Prolog за замовчуванням, і що дозволяє Java та Прологові викликати одне одного (рекурсивно). Він відомий гарною підтримкою паралельності, та знаходиться в активній розробці.
* [http://www.declarativa.com/interprolog/ InterProlog], програмна бібліотека мосту між Java та Прологом, що реалізує двоспрямовані виклики предикатів/методів між обома мовами. Об'єкти Java можуть відображатися у терми Прологу, і навпаки. Дозволяє розробку [[Графічний інтерфейс користувача|графічного інтерфейсу користувача]] та іншої функціональності в Java, залишаючи обробку логіки
* {{Не перекладено|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#. Може легко інтегруватися
* [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}}). Пролог було створено
Європейські дослідники штучного інтелекту віддавали перевагу Прологу, тоді як американці віддавали перевагу [[LISP|Ліспу]], що, як повідомлялося, призводило до численних націоналістичних дебатів про переваги цих мов.<ref name="pountain198410">
Рядок 1113:
щоби показати/розв’язати Г, покажи/розв’яжи Т<sub>1</sub> та ... та Т<sub>n</sub>.
Однак, чисту Пролог незабаром було розширено включенням
Подальші розширення Прологу оригінальною командою ввели до реалізацій можливості {{Не перекладено|Логічне програмування з обмеженнями|логічного програмування з обмеженнями||Constraint logic programming}}.
Рядок 1119:
== Використання у промисловості ==
Пролог використовувалася
{{Цитата|Ми потребували мови, якою ми могли би зручно виражати правила зіставлення зі зразками над синтаксичними деревами та іншими тлумаченнями (такими як результати розпізнавання іменованих сутностей), і технології, здатної виконувати ці правила дуже ефективно. Ми виявили, що Пролог була ідеальним вибором такої мови через свою простоту та виразність.<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.
}}
Рядок 1154:
* У певному сенсі{{Якому}} Пролог є підмножиною мови {{Не перекладено|Planner|||Planner (programming language)}}. Пізніше ідеї мови Planner було розвинуто у {{Не перекладено|Метафора наукової спільноти|метафору наукової спільноти||Scientific community metaphor}}.
* [[AgentSpeak]] є варіантом Прологу для програмування поведінки агентів у [[Багатоагентна система|багатоагентних системах]].
* [[Erlang (мова програмування)|Erlang]] почала життя з реалізації на базі Прологу, і зберігає більшість синтаксису Прологу на базі
== Примітки ==
|