Логічне програмування - це напрямок сучасного про- грам-мування, що виникло спочатку в рамках робіт по шу-кусства-ному інтелекту і який отримав свій розвиток у другій половині вось-мідесятих років, завдяки японському проекту ЕОМ п'ятого по-ко-ле-ня. Найбільш повне вираження ідеї логічного програмування наш-ли в мові Prolog (PROgramming in LOGic - програмування в термінах логіки). Початковий варіант мови Prolog був розроблений під керівництвом Алена Кольмерое (Alain Colmerauer) в Марсельському уні-тет в 1972 році. В даний час існують різноманітні версії для DOS (PDC Prolog, Arity Prolog і ін.), Windows (Visual Prolog, Strawberry Prolog, Trinc Prolog і ін.), Linux (Arity Prolog, Visual Prolog і ін.).
Теоретичною основою Prolog є розділ символьної логіки, на-зи-ва-емий обчисленням предикатів. Prolog притаманний ряд властивостей, ко-то-ри-ми не про - ладают традиційні мови програмування, що робить його потужним середовищ-ством в області логічного програмування. До та-ким властивостям від-но-сят - ся механізм виведення з пошуком і поверненням, вбудо-ен-ний механізм спів-постав-ле - ня зі зразком і проста, але ви-ра-зи-Тель ная струк-тура даних з можливістю її зміни. У Prolog відсутність про-ству - ють вка-за-ті-ли, оператори при-сва-ивания і GOTO. Природним ме-то-будинок про-грам-мі-ро-вання є ре-курей-ся.
Програма на Prolog є сукупність тверджень. Утверж-де-ня складаються з цілей. В кінці затвердження ставиться крапка «.». Іноді ут - вір-ж-дення називається пропозицією.
Основна операція Prolog - доказ цілей, що входять в ут - Верже-дення.
Існують два типи тверджень:
- факт - це одиночна мета, яка, безумовно, істинна;
- правило складається з одним головним мети і однієї або більше хвостових цілей, які істинні при деяких умовах.
Правило зазвичай має кілька хвостових цілей в формі кон'юнкції цілей.
Кон'юнкцію можна розглядати як логічну функцію І. Таким чином, правило узгоджено, якщо узгоджені всі його хвостові мети.
Виберемо для реалізації систему Visual Prolog (www.visual-prolog.com).
Вирішимо задачу про родинні стосунки, так як Prolog добре пристосований для обробки нечислової інформації.
Той факт, що Том є батьком Боба, можна записати на Prolog так:
Тут ми вибрали батько в якості імені відносини, тому і боб - як аргументи цього відносини. Записуємо імена, як те. починаючи з малої літери. Все дерево родинних відносин (семантична мережа)
описується наступною програмою на мові Visual Prolog:
Для програмування необхідно
1. Запустити систему Visual Prolog.
Мал. 12.1. Вікно Visual Prolog 5.0
2. Ввести програму File ® New.
3. Протестувати мета Project ® Test Goal.
На поставлене запитання: «Чи є Боб батьком Пат?» - система відповість yes (та), знайшовши такий факт в програмі.
Інше питання: «Хто є батьком Ліз?»
Питання «Хто діти Боба?» Можна передати в такій формі:
Програмі можна задавати і більш загальні питання: «Хто чий батько?» Сформулюємо його таким чином:
Знайти X і Y такі, що X - батько Y.
На Prolog це записується так:
Система буде по черзі знаходити все пари виду «батько-дитина».
Визначити правила: жінка, чоловік, батько, батьки, дідусь, бабуся.
Визначимо правило жінка, виходячи з тільки описуваного світу.
Аналогічно правило чоловік.
Цілі можна поставити наступні.
Вирішимо задачу про родинні стосунки сім'ї Романових, і знайдемо дітей Олексія Михайловича.
Знайдемо всіх цариць за допомогою складеного питання.
Додамо кілька правил: брат (brother), сколько_правіл (how_reign).
Правило визначення брата можна прочитати так:
Для будь-яких X і Y, X є братом Y, якщо
- у X і Y є загальний батько, і
- X - чоловік, і
- X сам собі не брат.
У процесі досягнення мети Prolog здійснює автоматичний перебір варіантів, роблячи повернення при неуспіху будь-якого з них. Іноді потрібно його обмежити або виключити зовсім.
Для цього в Prolog існує обмежує перебір мета «відсікання» (!), Яка безумовна вірна.
Знайдемо тільки одного сина Олексія Михайловича
Наведемо предикат, який визначає з двох цілих чисел максимальне.
Ці правила є взаємовиключними. Якщо виконується перше, друге обов'язково зазнає невдачі. Можна видозмінити за допомогою відсікання правила.
Prolog містить стандартний предикат, виконання якого закан-чивается завжди невдачею - fail. Предикат fail ініціює процес бектрекінга (backtracking), тобто пошуку нових рішень, або передоказательства цілей. Покажемо на прикладі.
Для реалізації заперечення використовується предикат not. Особливість його ис-користування полягає в тому, що всі передані пе-ре-менниє належні бути свя-заннимі, тобто конкретизованими. Наприклад, відповідь на питання: «Леонард не батько Джейсону?» Буде знайдений.
не сприйматиметься системою. Можна переформулювати мету: «Хто з відомих системі батьків не є батьком Джейсона?».
Таким чином, не можна отримати знання з незнання, і предикат not використовується тільки для перевірки цілей.
У наведених програмах на Visual Prolog можна виділити і доповнити: