Ця стаття є сирим перекладом з англійської мови. Можливо, вона створена за допомогою машинного перекладу або перекладачем, який недостатньо володіє обома мовами. Будь ласка, допоможіть поліпшити переклад.(березень 2018)
Логі́чне програмува́ння — парадигма програмування, а також розділ дискретної математики, що базується на використанні логіки для опису проблем і пошуку їх рішень. Логічне програмування засноване на теорії математичної логіки. Найвідомішою мовою логічного програмування є Prolog, що є за своєю суттю універсальною машиною виводу, що працює в припущенні замкненості системи фактів.
Першою мовою логічного програмування була мова Planner, в якій була закладена можливість автоматичного виведення результату з даних і заданих правил перебору варіантів. Planner використовували для, зниження вимог до обчислювальних ресурсів (за допомогою методу пошуку з поверненням) і для виведення фактів без активного використання стеку. Потім була розроблена мова Prolog, яка не вимагала плану перебору варіантів і була, в цьому сенсі, спрощенням мови Planner.
Використання математичної логіки для представлення і виконання комп'ютерних програм також є властивістю лямбда-числення, розробленого Алонзом Черч в 1930-х роках. Однак, першим запропонував використовувати кон'юнктивну нормальну форму логіки для представлення комп'ютерних програм — Корделл Грін.[1] Було використано аксіоматизацію підмножини LISP разом з представленням відношення вводу-виводу для обчислення відношення шляхом моделювання виконання програми в LISP. З іншого боку, мова Absys, розроблена Фостером і Елкоком, використовувала комбінацію рівнянь і лямбда-числення у вигляді тверджень без обмежень на порядок виконання операцій.[2]
Хоча Planner був заснований на методах доведення логіки, розроблений Карлом Хьюіттом в Массачусетському технологічному інституті, він став першою мовою, що з'явилася в рамках цієї процесуалістичної парадигми.Planner показував шаблонне звернення процедурних планів від цілей (наприклад, метаскорочення або зворотний ланцюжок) і від тверджень (тобто прямий вивід). Найбільш впливова реалізація Planner була підмножиною під назвою Micro-Planner, реалізованого Джеррі Суссманом[en], Юджином Чарняком[en] і Террі Виноградом. Він був використаний для реалізації програми WinRED з вивченням природної мови SHRDLU, яка була орієнтиром в той час. Щоб впоратися з дуже обмеженими системами пам'яті, Планувальник використовував структуру управління зворотним трасуванням, щоб одночасно зберігати тільки один можливий шлях обчислення. Планувальник привів до появи мов програмування таких як: QA-4, Popler, Conniver, QLISP і паралельні мови Ether.
Гейс і Ковальський в Единбурзі намагалися узгодити логічний підхід декларативного підходу до подання знань з процедурних підходів Планера. Hayes (1973) розробив екваціональну мову, Golux, в якому різні процедури можуть бути отримані шляхом зміни поведінки доведення теорем. Ковальський, з іншого боку, розробив SLD-резолюція, варіант SL-резолюції і показав, як він розглядає наслідки «процедури скорочення мети». Ковальський співпрацював з Colmerauer[en] в Марселі, який розробив ці ідеї при розробці та впровадженні мови програмування Prolog.
Формальна логіка як основа логічного програмування. Метод резолюцій
Для будь-якої системи логічного програмування характерним є те, що для виконання програми (побудови виведення результату) використовується вмонтована система автоматичного пошуку. Механізм пошуку логічного висновку Prolog-у бере свій початок від методу резолюцій Робінсона. Правило резолюції виведення логічного висновку працює наступним чином: дві фрази можуть резольвувати між собою, коли одна з них має позитивний, а друга — негативний літерал з одним і тим самим позначенням предиката та однаковою кількістю аргументів і в разі, якщо аргументи обох літералів можуть бути уніфіковані (погоджені). Наприклад, фраза P(a, b) o Q(c, d) і фраза Q(c, d) o R(b, c) дають резольвенту P(a, b) o R(b, c). Якщо ж аргументом відношення є змінна, то вона уніфікується з константою, а резольвента буде мати дану константу на місцях попереднього розташування змінної. Розглянемо дві фрази спеціального вигляду: Р(а) — висловлювання без умови і oP(а) — умова без висловлювання. Наявність цих двох фраз в одній теорії є протиріччям. Якщо вони резольвуються між собою, тоді отримана резольвента називається порожньою фразою. Якщо при резолюції двох фраз, що входять до складу теорії, отримується порожня фраза, то теорія буде непослідовною.
Логічне програмування можна розглядати як контрольований висновок. Важливою концепцією у логічному програмуванні є розділення програм на їх логічний компонент і їх компонент управління. З чистими логічними мовами програмування, тільки логічний компонент визначає отримані рішення. Компонент управління може бути змінений для забезпечення альтернативних способів виконання логічної програми. Це поняття зафіксовано гаслом: Алгоритм = Логіка + Управління. Де «Логіка» являє собою логічну програму, а «Контроль» являє собою різні стратегії доказу теорем.[3]
Рішення проблем
У спрощеному пропозиціональному випадку, коли логічна програма і атомна мета верхнього рівня не містять змінних, зворотне міркування визначає дерево and-or[en], яке являє собою простір для пошуку рішення завдання. Мета верхнього рівня — корінь дерева. Для будь-якого вузла у дереві і будь-якої пропозиції, головка якого збігається з вузлом, існує набір дочірніх вузлів, відповідних під цілі в тексті пропозиції. Ці дочірні вузли групуються разом «і». Альтернативні набори дітей, відповідні альтернативні способи вирішення вузла, групуються разом «або».
Будь-яка пошукова стратегія може використовуватися для пошуку цього простору. У Prolog використовується послідовна стратегія «назад-у-перших», зворотне трасування, в якій одночасно розглядається тільки одна альтернатива і одна підціль. Можливі також інші стратегії пошуку, такі як паралельний пошук, інтелектуальний відкат або кращий початковий пошук для пошуку оптимального рішення.
У більш загальному випадку, коли змінні спільного використання під цілей можуть використовуватися, можна використовувати інші стратегії, такі як вибір найбільш підходящої під цілі або достатнього примірника, так що застосовується тільки одна процедура. Такі стратегії, які використовуються, наприклад, при паралельному логічному програмуванні[en].
Для більшості практичних додатків, а також для додатків, які вимагають немонотонного міркування в штучному інтелекті, логічні програми клаузули Хорна необхідно поширювати на звичайні логічні програми з негативними умовами. Положення в нормальній логічній програмі має вигляд:
читається декларативно як логічне вираження:
де H та всі і — атомні формули. Заперечення негативних літералах, а не , зазвичай називається «запереченний збій», оскільки в більшості реалізацій показано негативна умова, а не , показуючи, що позитивна умова не виконується. Наприклад:
Існує два рішення, які вирішують першу під цільну птицю (X), а саме X = john і X = mary. Друга під ціль не є ненормальним (john) для першого рішення, кандидату не вдається, бо поранений (john) досягає успіху отже і ненормальний (john) досягає успіху. Тим не менш, друга під ціль не є ненормальним (mary) для другого рішення, кандидат успішний, бо поранений (mary) але зазнає невдачу, а отже і ненормальний (mary) зазнає невдачі. Отже, X = mary — єдине рішення цілі.
Мікро-планувальник який було побудовано, називається «thnot», який при нанесенні на вираз повертає значення True, якщо (і тільки якщо) оцінка вираження завершується. Еквівалентний оператор зазвичай вбудований в сучасний «Пролог». Це зазвичай пишуться not(Goal) або \+ Goal , де Goal є (пропозиція) для програми. Цей оператор відрізняється від заперечення в логіці першого порядку: заперечення, наприклад \+ х == 1 завершується, коли змінна х зв'язана з атомом 1, але він досягає успіху у всіх інших випадках, у тому числі, коли x є неприв'язаний. Це робить міркування у Пролозі немонотонно: х = 1, \+ х == 1 і завжди зазнає невдачі, А \+ Х == 1, х = 1 може досягти успіху, прив'язки до 1 в залежності від x ,якщо x був спочатку прив'язаний (зверніть увагу, що стандартний Пролог виконує цілі зліва направо).
Логічний статус заперечення як невдачі, так і залишився невирішеним, поки Кейт Кларк [1978] показали, що при певних природних умовах, це правильне (а іноді і повне) виконання класичного заперечення щодо завершення програми. Завершення приблизно збігається з набором всіх пропозицій програми, з тим же предикатом на лівій стороні, скажімо: H :- Body1.
…
H :- Bodyk.
Визначення предиката
H iff (Body1 or … or Bodyk)
де «iff» означає «якщо і тільки якщо». Написання завершення також вимагає явного використання предиката рівності і включення набору відповідних аксіом для рівності. Тим не менш, реалізація заперечення невдачею вимагає тільки if-половин визначень без аксіом рівності.
Наприклад, завершення вищенаведеної програми:
canfly(X) iff bird(X), not abnormal(X).
abnormal(X) iff wounded(X).
bird(X) iff X = john or X = mary.
X = X.
not john = mary.
not mary = john.
В якості альтернативи семантики завершення, заперечення як невдача може інтерпретуватися епістемічно, як і в семантиці стійких моделей та у відповідь множин програмування. У цій інтерпретації () не означає буквально, що не відома або не враховується. Епітимічна інтерпретація має перевагу, що її можна комбінувати дуже просто з класичним запереченням, як у «розширеному логічному програмуванні», для формалізації таких фраз, як «протилежне не можна показати», де «навпаки» є класичним запереченням і «навпаки не може бути показаним» є епістичною інтерпретацією заперечення як невдачі.
Той факт, що пропозиції Хорна можуть бути дані процедурної інтерпретацією, і навпаки, що процедури усунення мети можна зрозуміти як пропозиції Хорна + зворотнє міркування означає, що логічні програми об'єднують декларативні і процедурні представлення знань. Включення заперечення як відмови означає, що логічне програмування є свого роду немонотонною логікою.
Попри свою простоту порівняно із класичною логікою, ця комбінація пропозицій Хорна і заперечення невдачі виявилася напрочуд виразним. Наприклад, він забезпечує природне подання для здорового глузду законів причини і слідства, а формалізується як ситуаційне числення та числення подій[en].Було також показано, що він цілком природно відповідає напівформальній мові законодавства. Зокрема, Праккен і Сартор кредитують подання Британського закону про громадянство як логічної програми будучи «надзвичайно впливовим для розробки обчислювальних уявлень законодавства, показуючи, як логічне програмування дозволяє інтуїтивно привабливими уявленнями, які можуть бути безпосередньо розгорнуті для створення автоматичних висновків».
Пролог (англ.Prolog) — мова логічного програмування загального призначення, пов'язана зі штучним інтелектом та математичною лінгвістикою.
Пролог має корені в логіці першого порядку, математичній логіці, та, на відміну від багатьох інших мов програмування, є декларативною: логіка програми виражається в термінах відношень, представлених як факти та правила. Обчислення ініціюється запуском запиту над цими відношеннями.
Цю мову програмування спочатку було задумано групою навколо Алана Кольмерое в Марселі на початку 1970-тих, а першу систему Пролог було розроблено в 1972-му Аланом Кольмерое та Філіпом Русселем.
Пролог була однією з перших логічних мов програмування, й залишається найпопулярнішою серед таких мов і на сьогодні, маючи декілька безкоштовних та комерційних реалізацій. Її застосовували як для доведення теорем, експертних систем, так і для її початкової області призначення, обробки природної мови. Сучасні середовища Прологу підтримують як створення графічних інтерфейсів користувача, так і адміністративні або мережеві застосування.
Пролог добре підходить для розв'язання специфічних задач, що виграю́ть від логічних запитів на базі правил, таких як пошук базами даних, системи голосового керування та заповнення шаблонів.
Варіанти та розширення
Абдуктивне логічне програмування
Абдуктивне логічне програмування — це розширення нормального логічного програмування, яке дозволяє деяким предикатам, оголошеним як предикати, бути «відкритими» або невизначеними. Речення в логічній програмі абдуктивної логіки має вигляд:
де H — атомна формула, яка не є неприводимою, всі є текстовими значеннями, предикат яких не є неприводимим, а — атомними формулами, предикат яких є неприводимим. Неприводимі предикати можуть бути обмежені обмеженнями цілісності, які можуть мати форму:
де — довільні літерали (визначені або неприводимі, а також атомні або негативні). Наприклад:
Рішення проблем досягається шляхом виведення гіпотез, що виражаються в термінах відтворюваних предикатів, як рішень розв'язуваних завдань. Цими проблемами можуть бути або спостереження, які необхідно пояснити (як у класичних абдуктивних міркуваннях), так і цілі, які необхідно вирішити (як у звичайному логічному програмуванні). Наприклад, гіпотеза нормальна (mary) пояснює наглядову метелика (mary). Більше того, та ж сама гіпотеза тягне за собою єдине рішення X = mary мета знайти щось, що може літати:
:-canfly(X).
Логічне програмування абдукції було використано для діагностики несправностей, планування, обробки природної мови і машинного навчання. Він також використовувався для інтерпретації Заперечення як Відмова як форми абдуктивного міркування.
Металогічне програмування
Оскільки математична логіка має давню традицію розрізнення між мовою об'єктів[en] і метамовою, логічне програмування також дозволяє метарівневе програмування. Найпростіша металогічна програма — це так званий мета-інтерпретатор «ванілі»:
де true являє собою порожню кон'юнкцію, а пропозиція (A, B) означає, що існує пропозиція рівня об'єкта форми A: — B.
Метаномічне програмування дозволяє комбінувати уявлення об'єктів і метарівнів, як на природній мові. Він також може використовуватися для реалізації будь-якої логіки, яка задається за допомогою правил виведення. Metalogic використовується в логічному програмуванні для реалізації метапрограм, які маніпулюють іншими програмами, базами даних, базами знань або аксіоматичними теоріями в якості даних.
де H та всі - атомні формули, а — обмеження. Декларативно такі положення розглядаються як звичайні логічні наслідки: H, якщо
Однак, у той час як предикати є в главах розділів і визначаються програмою логіки обмежень, предикати обмеження зумовлені певною теоретико-просторовою структурою або теорією.
Процедурні під цілі, предикат який визначається програмою, вирішуються шляхом усунення мети, як у звичайному логічному програмуванні, але обмеження перевіряються на здійснимість за допомогою спеціалізованого вирішувача обмежень, який реалізує семантику предикатів обмежень. Вихідна задача вирішується шляхом її скорочення до здійсненним кон'юнкції обмежень.
Наступна логічна програма обмеження являє собою іграшкову тимчасову базу даних історії Джона як вчителя:
Тут ≤ та < — предикати обмеження, з їх звичайною передбачуваною семантикою. Наступне речення мети запитує базу даних, щоб дізнатися, коли Джон викладав логіку і був професором:
:- teaches(john, logic, T), rank(john, professor, T).
Паралельна логічна програма являє собою набір захищених диз'юнктів Горна форми:
Кон'юнкція називається захистом пропозиції, а | є оператором зобов'язання. Декларативно охоронювані положення Горна читаються як звичайні логічні наслідки: H, якщо
Тим не менш, процедурно, коли є кілька пропозицій, голови H яких відповідають заданої мети, тоді всі параграфи виконуються паралельно, перевіряючи, чи перебувають їх гвардії . Якщо огорожі більш ніж однієї пропозиції зберігаються, то в один з пропозицій робиться рішучий вибір, а виконання виконується з допомогою під цілей вибраної пропозиції. Ці під цілі можуть також виконуватися паралельно. Таким чином, паралельне логічне програмування реалізує форму «не піклується про недетермінізм», а не «не знає недетермінізм».
Наприклад, наступна паралельна логічна програма визначає предикат shuffle (Left, Right, Merge) , який можна використовувати для перемішування двох списків вліво і вправо, об'єднуючи їх в один список Merge, який зберігає порядок двох списків вліво і вправо:
Представляє [ ] порожній список, а [Head|Tail] представляє список з першим елементом Head, за яким слідує список Tail, як Prolog. (Зверніть увагу, що перше входження | у другому і третьому реченнях є конструктором списку, тоді як друге входження | є оператором зобов'язання.) Програма може використовуватися, наприклад, для перетасовки списків [ace, queen, king ] та [1, 4, 2], викликаючи пропозицію цілі:
shuffle([ace,queen,king],[1,4,2],Merge)
Програма буде детерміновано генерувати одне рішення, наприклад Merge = [ace, queen, 1, king, 4, 2].
Можливо, паралельне логічне програмування засноване на передачі повідомлень і, отже, піддається тій же невизначеності, що і інші паралельні системи передачі повідомлень, такі як «Актори» (див. «Невизначеність при паралельному обчисленні[en]»). Карл Хьюітт стверджував, що паралельне логічне програмування не засноване на логіці в його розумінні того, що обчислювальні етапи не можуть бути логічно виведені. Однак у паралельному логічному програмуванні будь-який результат завершального обчислення є логічним наслідком програми, і будь-який частковий результат часткового обчислення є логічним наслідком програми і залишкової мети (мережі процесів). Отже, невизначеність обчислень є наувазі, що не всі логічні наслідки програми можуть бути виведені.
Паралельне логічне програмування обмежень[en] об'єднує паралельне логічне програмування та програмування логіки обмежень[en], використовуючи обмеження для управління паралелізмом. Пропозиція може містити охорону, яка являє собою набір обмежень, які можуть блокувати застосовність цієї пропозиції. Коли захист кількох пропозицій виконується, паралельне програмування логіки обмежень робить рішучий вибір для використання тільки одного.
Logtalk[en] розширює Пролог підтримкою об'єктів, протоколів та інших понять ООП.
Лінійне логічне програмування
Логічне програмування на основі логіки в лінійній логіці[en] призвело до створення мов логічного програмування, які значно виразніші, ніж ті, які засновані на класичній логіці. Програми пропозиції Horn можуть представляти тільки зміну станом шляху, зміни аргументів в предикаті. У лінійному логічному програмуванні можна використовувати лінійну логіку для підтримки зміни стану. Деякі ранні розробки логічних мов програмування на основі лінійної логіки включають LO [Andreoli & Pareschi, 1991], Lolli, [14] ACL, і Forum [Miller, 1996]. Форум забезпечує цілеспрямовану інтерпретацію всієї лінійної логіки.
Програмування логіки транзакцій
Логіка транзакцій[en] — це розширення логічного програмування з логічної теорією оновлень, що змінюють стан. Він має як теоретико-модельну семантику, так і процедурну. Реалізація підмножини логіки транзакцій доступна в системі Flora-2[en]. Інші прототипи також доступні.
↑J.M. Foster and E.W. Elcock. ABSYS 1: An Incremental Compiler for Assertions: an Introduction, Machine Intelligence 4, Edinburgh U Press, 1969, pp. 423–429
↑R.A.Kowalski (July 1979). Algorithm=Logic + Control. Communications of the ACM. 22 (7): 424—436. doi:10.1145/359131.359136.
Логічне і функціональне програмування: навч. посіб. [для студентів ВНЗ України] / В. М. Заяць, М. М. Заяць ; Нац. ун-т «Львів. політехніка». — Кам'янець-Подільський (Хмельниц. обл.) ; Львів: Гордукова І. Є., 2016. — 398 с. : іл., табл., портр.
Иван Братко. Алгоритмы искусственного интеллекта на языке PROLOG (Оригінал Prolog Programming For Artificial Intelligence)
John McCarthy. Programs with common sense Symposium on Mechanization of Thought Processes. National Physical Laboratory. Teddington, England. 1958.
Fisher Black. A deductive question answering system Harvard University. Thesis. 1964.
James Slagle. Experiments with a Deductive Question-Answering Program CACM. December, 1965.
Cordell Green. Application of Theorem Proving to Problem Solving IJCAI 1969.
Carl Hewitt. Planner: A Language for Proving Theorems in Robots IJCAI 1969.
Earl Sacerdoti, et al.QLISP: A Language for the Interactive Development of Complex Systems AFIPS National Computer Conference. 1976.
Bill Kornfeld and Carl Hewitt. The Scientific Community Metaphor IEEE Transactions on Systems, Man, and Cybernetics. January 1981.
Bill Kornfeld. The Use of Parallelism to Implement a Heuristic Search IJCAI 1981.
Bill Kornfeld. Parallelism in Problem Solving MIT EECS Doctoral Dissertation. August 1981.
Bill Kornfeld. Combinatorially Implosive Algorithms CACM. 1982
Carl Hewitt. The Challenge of Open Systems Byte Magazine. April 1985.
Robert Kowalski. The limitation of logic Proceedings of the 1986 ACM fourteenth annual conference on Computer science.
Ehud Shapiro (Editor). Concurrent Prolog MIT Press. 1987.
Robert Kowalski. The Early Years of Logic Programming CACM. January 1988.
Ehud Shapiro. The family of concurrent logic programming languages ACM Computing Surveys. September 1989.
Carl Hewitt and Gul Agha. Guarded Horn clause languages: are they deductive and Logical? International Conference on Fifth Generation Computer Systems, Ohmsha 1988. Tokyo. Also in Artificial Intelligence at MIT, Vol. 2. MIT Press 1991.
Shunichi Uchida and Kazuhiro Fuchi Proceedings of the FGCS Project Evaluation Workshop Institute for New Generation Computer Technology (ICOT). 1992.
Зубенко В. В. Програмування: навчальний посібник (гриф МОН України) / В. В. Зубенко, Л. Л. Омельчук. — К. : ВПЦ «Київський університет», 2011. — 623 c.
Нікітченко М. С. Теоретичні основи програмування: навчальний посібник / М.С Нікітченко — Ніжин: Видавництво НДУ імені Миколи Гоголя, 2010. — 121с.
Лавров С. С. Програмирование. Математические основи, средства, теория / С. С. Лавров. — СПб. : БХВ-Петербург,2001. — 251с.
Непейвода Н. Н. Основания програмирования: учеб. пособие / Н. Н. Непейвода, И. Н. Скопин. — Ижевск, 2003.
Pratt T.W., Zelkovitz M.V. Programming languages, design and implementation (4th ed.). Prentice Hall, 2000 (англ.) (Пратт Т., Зелкович М., Языки программирования: разработка и реализация.- Спб.: Питер, 2002.-688 с.)(рос.)
Gabbrielli, Maurizio (2010). Programming languages principles and paradigms. London, New York: Springer,. ISBN9781848829145.
Robert W. Sebesta: Concepts of Programming Languages, 9th ed., Addison Wesley 2009.
Ця стаття є сирим перекладом з іншої мови. Можливо, вона створена за допомогою машинного перекладу або перекладачем, який недостатньо володіє обома мовами. Будь ласка, допоможіть поліпшити переклад.(грудень 2017)