Логічне програмування
Логі́чне програмува́ння — парадигма програмування, а також розділ дискретної математики, що базується на використанні логіки для опису проблем і пошуку їх рішень. Логічне програмування засноване на теорії математичної логіки. Найвідомішою мовою логічного програмування є Prolog, що є за своєю суттю універсальною машиною виводу, що працює в припущенні замкненості системи фактів. Першою мовою логічного програмування була мова Planner, в якій була закладена можливість автоматичного виведення результату з даних і заданих правил перебору варіантів. Planner використовували для, зниження вимог до обчислювальних ресурсів (за допомогою методу пошуку з поверненням) і для виведення фактів без активного використання стеку. Потім була розроблена мова Prolog, яка не вимагала плану перебору варіантів і була, в цьому сенсі, спрощенням мови Planner. На основі ідей Planner були створені такі мови логічного програмування, як: QA-4, Popler, Conniver і QLISP. Мови програмування Mercury, Visual Prolog[en], Oz[en] і Fril[en] були створені на основі Prolog. На основі мови Planner було розроблене також декілька альтернативних мов логічного програмування, не заснованих на методі пошуку з поверненням, наприклад, Ether. ІсторіяВикористання математичної логіки для представлення і виконання комп'ютерних програм також є властивістю лямбда-числення, розробленого Алонзом Черч в 1930-х роках. Однак, першим запропонував використовувати кон'юнктивну нормальну форму логіки для представлення комп'ютерних програм — Корделл Грін.[1] Було використано аксіоматизацію підмножини LISP разом з представленням відношення вводу-виводу для обчислення відношення шляхом моделювання виконання програми в LISP. З іншого боку, мова Absys, розроблена Фостером і Елкоком, використовувала комбінацію рівнянь і лямбда-числення у вигляді тверджень без обмежень на порядок виконання операцій.[2] Логічне програмування в нинішньому вигляді можна простежити до дискусій в кінці 1960-х і початку 1970-х років про порівняння декларативного і процедурного представлення знань в штучному інтелекті. Прихильники декларативного представлення, працювали в Стенфорді, пов'язані з Джоном Маккарті, Бертрамом Рафаелем[en] і Корделлом Грін[en], а також в Единбурзі з Джоном Аланом Робінсоном (академічним гостем із Сіракузького університету), Пат Гейз[en] і Робертом Ковальські. Прихильники процедурного представлення були в основному зосереджені в Массачусетському технологічному інституті під керівництвом Марвіна Лі Мінського та Сеймура Пейперта. Хоча Planner був заснований на методах доведення логіки, розроблений Карлом Хьюіттом в Массачусетському технологічному інституті, він став першою мовою, що з'явилася в рамках цієї процесуалістичної парадигми.Planner показував шаблонне звернення процедурних планів від цілей (наприклад, метаскорочення або зворотний ланцюжок) і від тверджень (тобто прямий вивід). Найбільш впливова реалізація Planner була підмножиною під назвою Micro-Planner, реалізованого Джеррі Суссманом[en], Юджином Чарняком[en] і Террі Виноградом. Він був використаний для реалізації програми WinRED з вивченням природної мови SHRDLU, яка була орієнтиром в той час. Щоб впоратися з дуже обмеженими системами пам'яті, Планувальник використовував структуру управління зворотним трасуванням, щоб одночасно зберігати тільки один можливий шлях обчислення. Планувальник привів до появи мов програмування таких як: QA-4, Popler, Conniver, QLISP і паралельні мови Ether. Гейс і Ковальський в Единбурзі намагалися узгодити логічний підхід декларативного підходу до подання знань з процедурних підходів Планера. Hayes (1973) розробив екваціональну мову, Golux, в якому різні процедури можуть бути отримані шляхом зміни поведінки доведення теорем. Ковальський, з іншого боку, розробив SLD-резолюція, варіант SL-резолюції і показав, як він розглядає наслідки «процедури скорочення мети». Ковальський співпрацював з Colmerauer[en] в Марселі, який розробив ці ідеї при розробці та впровадженні мови програмування Prolog. Асоціація логічного програмування[en] була створена для підтримання логічного програмування в 1986 році. У Prolog з'явилися мови програмування ALF[en], Fril[en], Gödel[en], Mercury, Oz[en], Ciao[en], Visual Prolog[en], XSB і λProlog[en], а також безліч мов паралельного логічного програмування[en], мови логіки обмежень програмування[en] і Datalog. Формальна логіка як основа логічного програмування. Метод резолюційДля будь-якої системи логічного програмування характерним є те, що для виконання програми (побудови виведення результату) використовується вмонтована система автоматичного пошуку. Механізм пошуку логічного висновку 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 та всі і — атомні формули. Заперечення негативних літералах, а не , зазвичай називається «запереченний збій», оскільки в більшості реалізацій показано негативна умова, а не , показуючи, що позитивна умова не виконується. Наприклад: canfly(X) :- bird(X), not abnormal(X).
abnormal(X) :- wounded(X).
bird(john).
bird(mary).
wounded(john).
Враховуючи мету знайти щось, що може літати: :- canfly(X).
Існує два рішення, які вирішують першу під цільну птицю (X), а саме X = john і X = mary. Друга під ціль не є ненормальним (john) для першого рішення, кандидату не вдається, бо поранений (john) досягає успіху отже і ненормальний (john) досягає успіху. Тим не менш, друга під ціль не є ненормальним (mary) для другого рішення, кандидат успішний, бо поранений (mary) але зазнає невдачу, а отже і ненормальний (mary) зазнає невдачі. Отже, X = mary — єдине рішення цілі. Мікро-планувальник який було побудовано, називається «thnot», який при нанесенні на вираз повертає значення True, якщо (і тільки якщо) оцінка вираження завершується. Еквівалентний оператор зазвичай вбудований в сучасний «Пролог». Це зазвичай пишуться Логічний статус заперечення як невдачі, так і залишився невирішеним, поки Кейт Кларк [1978] показали, що при певних природних умовах, це правильне (а іноді і повне) виконання класичного заперечення щодо завершення програми. Завершення приблизно збігається з набором всіх пропозицій програми, з тим же предикатом на лівій стороні, скажімо: H :- Body1.
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] Маккарті для аргументації за замовчуванням і закритим світовим припущенням[en]. В якості альтернативи семантики завершення, заперечення як невдача може інтерпретуватися епістемічно, як і в семантиці стійких моделей та у відповідь множин програмування. У цій інтерпретації () не означає буквально, що не відома або не враховується. Епітимічна інтерпретація має перевагу, що її можна комбінувати дуже просто з класичним запереченням, як у «розширеному логічному програмуванні», для формалізації таких фраз, як «протилежне не можна показати», де «навпаки» є класичним запереченням і «навпаки не може бути показаним» є епістичною інтерпретацією заперечення як невдачі. Представлення знаньТой факт, що пропозиції Хорна можуть бути дані процедурної інтерпретацією, і навпаки, що процедури усунення мети можна зрозуміти як пропозиції Хорна + зворотнє міркування означає, що логічні програми об'єднують декларативні і процедурні представлення знань. Включення заперечення як відмови означає, що логічне програмування є свого роду немонотонною логікою. Попри свою простоту порівняно із класичною логікою, ця комбінація пропозицій Хорна і заперечення невдачі виявилася напрочуд виразним. Наприклад, він забезпечує природне подання для здорового глузду законів причини і слідства, а формалізується як ситуаційне числення та числення подій[en].Було також показано, що він цілком природно відповідає напівформальній мові законодавства. Зокрема, Праккен і Сартор кредитують подання Британського закону про громадянство як логічної програми будучи «надзвичайно впливовим для розробки обчислювальних уявлень законодавства, показуючи, як логічне програмування дозволяє інтуїтивно привабливими уявленнями, які можуть бути безпосередньо розгорнуті для створення автоматичних висновків». PrologПролог (англ. Prolog) — мова логічного програмування загального призначення, пов'язана зі штучним інтелектом та математичною лінгвістикою. Пролог має корені в логіці першого порядку, математичній логіці, та, на відміну від багатьох інших мов програмування, є декларативною: логіка програми виражається в термінах відношень, представлених як факти та правила. Обчислення ініціюється запуском запиту над цими відношеннями. Цю мову програмування спочатку було задумано групою навколо Алана Кольмерое в Марселі на початку 1970-тих, а першу систему Пролог було розроблено в 1972-му Аланом Кольмерое та Філіпом Русселем. Пролог була однією з перших логічних мов програмування, й залишається найпопулярнішою серед таких мов і на сьогодні, маючи декілька безкоштовних та комерційних реалізацій. Її застосовували як для доведення теорем, експертних систем, так і для її початкової області призначення, обробки природної мови. Сучасні середовища Прологу підтримують як створення графічних інтерфейсів користувача, так і адміністративні або мережеві застосування. Пролог добре підходить для розв'язання специфічних задач, що виграю́ть від логічних запитів на базі правил, таких як пошук базами даних, системи голосового керування та заповнення шаблонів. Варіанти та розширенняАбдуктивне логічне програмуванняАбдуктивне логічне програмування — це розширення нормального логічного програмування, яке дозволяє деяким предикатам, оголошеним як предикати, бути «відкритими» або невизначеними. Речення в логічній програмі абдуктивної логіки має вигляд:
де H — атомна формула, яка не є неприводимою, всі є текстовими значеннями, предикат яких не є неприводимим, а — атомними формулами, предикат яких є неприводимим. Неприводимі предикати можуть бути обмежені обмеженнями цілісності, які можуть мати форму:
де — довільні літерали (визначені або неприводимі, а також атомні або негативні). Наприклад: canfly(X) :- bird(X), normal(X).
false :- normal(X), wounded(X).
bird(john).
bird(mary).
wounded(john).
де нормаль предиката є неприводимою. Рішення проблем досягається шляхом виведення гіпотез, що виражаються в термінах відтворюваних предикатів, як рішень розв'язуваних завдань. Цими проблемами можуть бути або спостереження, які необхідно пояснити (як у класичних абдуктивних міркуваннях), так і цілі, які необхідно вирішити (як у звичайному логічному програмуванні). Наприклад, гіпотеза нормальна (mary) пояснює наглядову метелика (mary). Більше того, та ж сама гіпотеза тягне за собою єдине рішення X = mary мета знайти щось, що може літати: : - canfly ( X ).
Логічне програмування абдукції було використано для діагностики несправностей, планування, обробки природної мови і машинного навчання. Він також використовувався для інтерпретації Заперечення як Відмова як форми абдуктивного міркування. Металогічне програмуванняОскільки математична логіка має давню традицію розрізнення між мовою об'єктів[en] і метамовою, логічне програмування також дозволяє метарівневе програмування. Найпростіша металогічна програма — це так званий мета-інтерпретатор «ванілі»: solve(true).
solve((A,B)):- solve(A),solve(B).
solve(A):- clause(A,B),solve(B).
де true являє собою порожню кон'юнкцію, а пропозиція (A, B) означає, що існує пропозиція рівня об'єкта форми A: — B. Метаномічне програмування дозволяє комбінувати уявлення об'єктів і метарівнів, як на природній мові. Він також може використовуватися для реалізації будь-якої логіки, яка задається за допомогою правил виведення. Metalogic використовується в логічному програмуванні для реалізації метапрограм, які маніпулюють іншими програмами, базами даних, базами знань або аксіоматичними теоріями в якості даних. Програмування логіки обмежень
Логічне програмування з обмеженнями[en] поєднує в собі логічне програмування логіки[en] Horn з рішенням обмеження. Він розширює пропозиції Хорна, дозволяючи деяким предикатам, оголошеними предикатами обмеження, зустрічатися як літерали в сукупності статей. Логічна програма обмеження являє собою набір пропозицій виду:
де H та всі - атомні формули, а — обмеження. Декларативно такі положення розглядаються як звичайні логічні наслідки: H, якщо Однак, у той час як предикати є в главах розділів і визначаються програмою логіки обмежень, предикати обмеження зумовлені певною теоретико-просторовою структурою або теорією. Процедурні під цілі, предикат який визначається програмою, вирішуються шляхом усунення мети, як у звичайному логічному програмуванні, але обмеження перевіряються на здійснимість за допомогою спеціалізованого вирішувача обмежень, який реалізує семантику предикатів обмежень. Вихідна задача вирішується шляхом її скорочення до здійсненним кон'юнкції обмежень. Наступна логічна програма обмеження являє собою іграшкову тимчасову базу даних історії Джона як вчителя: teaches(john, hardware, T) :- 1990 ≤ T, T < 1999.
teaches(john, software, T) :- 1999 ≤ T, T < 2005.
teaches(john, logic, T) :- 2005 ≤ T, T ≤ 2012.
rank(john, instructor, T) :- 1990 ≤ T, T < 2010.
rank(john, professor, T) :- 2010 ≤ T, T < 2014.
Тут ≤ та < — предикати обмеження, з їх звичайною передбачуваною семантикою. Наступне речення мети запитує базу даних, щоб дізнатися, коли Джон викладав логіку і був професором: :- teaches(john, logic, T), rank(john, professor, T). Рішенням є : 2010 T, T 2012. Логічне програмування обмежень використовувалося для вирішення проблем у таких галузях, як цивільне будівництво, машинобудування, цифрова електроніка, автоматизоване планування та диспетчеризація, управління повітряним рухом і фінанси. Він тісно пов'язаний з абдуктивним логічним програмуванням[en]. Паралельне логічне програмування
Паралельне логічне програмування об'єднує концепції логічного програмування з паралельним програмуванням. Його розвиток отримав великий поштовх у 1980-х роках за його вибором для мови системного програмування японського проекту п'ятого покоління (FGCS). Паралельна логічна програма являє собою набір захищених диз'юнктів Горна форми:
Кон'юнкція називається захистом пропозиції, а | є оператором зобов'язання. Декларативно охоронювані положення Горна читаються як звичайні логічні наслідки: H, якщо Тим не менш, процедурно, коли є кілька пропозицій, голови H яких відповідають заданої мети, тоді всі параграфи виконуються паралельно, перевіряючи, чи перебувають їх гвардії . Якщо огорожі більш ніж однієї пропозиції зберігаються, то в один з пропозицій робиться рішучий вибір, а виконання виконується з допомогою під цілей вибраної пропозиції. Ці під цілі можуть також виконуватися паралельно. Таким чином, паралельне логічне програмування реалізує форму «не піклується про недетермінізм», а не «не знає недетермінізм». Наприклад, наступна паралельна логічна програма визначає предикат shuffle (Left, Right, Merge) , який можна використовувати для перемішування двох списків вліво і вправо, об'єднуючи їх в один список Merge, який зберігає порядок двох списків вліво і вправо: shuffle ([], [], []).
shuffle ( Left , Right , Merge ) : -
Left = [ First | Rest ] |
Merge = [ First | ShortMerge ],
shuffle ( Rest , Right , ShortMerge ).
shuffle ( Left , Right , Merge ) : -
Right = [ First | Rest ] |
Merge = [ First | ShortMerge ],
shuffle ( Left , Rest , ShortMerge ).
Представляє [ ] порожній список, а [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], використовуючи обмеження для управління паралелізмом. Пропозиція може містити охорону, яка являє собою набір обмежень, які можуть блокувати застосовність цієї пропозиції. Коли захист кількох пропозицій виконується, паралельне програмування логіки обмежень робить рішучий вибір для використання тільки одного. Індуктивно логічне програмування
Індуктивне логічне програмування пов'язане з узагальненням позитивних і негативних прикладів у контексті фонових знань: машинне навчання логічних програм. Недавня робота в цій області, що поєднує логічне програмування, навчання і ймовірність, породила нову область статистичного реляційного навчання[en] та ймовірнісного індуктивного логічного програмування[en]. Об'єктно-орієнтоване логічне програмуванняF-logic[en] розширює логічне програмування об'єктами та синтаксисом фреймів. Багато систем базуються на F-logic, включно з Flora-2[en] FLORID [Архівовано 24 березня 2017 у Wayback Machine.], і високомаштабовною комерційною системою Ontobroker. Logtalk[en] розширює Пролог підтримкою об'єктів, протоколів та інших понять ООП. Лінійне логічне програмуванняЛогічне програмування на основі логіки в лінійній логіці[en] призвело до створення мов логічного програмування, які значно виразніші, ніж ті, які засновані на класичній логіці. Програми пропозиції Horn можуть представляти тільки зміну станом шляху, зміни аргументів в предикаті. У лінійному логічному програмуванні можна використовувати лінійну логіку для підтримки зміни стану. Деякі ранні розробки логічних мов програмування на основі лінійної логіки включають LO [Andreoli & Pareschi, 1991], Lolli, [14] ACL, і Forum [Miller, 1996]. Форум забезпечує цілеспрямовану інтерпретацію всієї лінійної логіки. Програмування логіки транзакційЛогіка транзакцій[en] — це розширення логічного програмування з логічної теорією оновлень, що змінюють стан. Він має як теоретико-модельну семантику, так і процедурну. Реалізація підмножини логіки транзакцій доступна в системі Flora-2[en]. Інші прототипи також доступні. Логічне програмування вищого порядкуДеякі дослідники розширюють логічне програмування можливостями програмування вищого порядку успадкованих від логіки вищого порядку[en], таких як предикати-змінні. Реалізацією є наприклад розширення мови Пролог такі як HiLog[en] and λProlog[en]. Примітки
Див. також
Література
Посилання
Information related to Логічне програмування |