Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РК_19_03_2008.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
2.57 Mб
Скачать

Особливості розв’язування задач за допомогою мови програмування логіки Пролог

Пролог – мова програмування логіки. Основний режим використання Пролог – інтерактивний діалог з користувачем (або консультування, англ. Consult). Користувач ставить питання, це питання інтерпретується Прологом, і дається відповідь. Спеціальна підпрограма Пролога, що називається інтерпретатором, власне відповідальна за пошук відповіді у базі знань. Програма у Прологу представляє собою набір логічних тверджень, які і складають базу знань.

Факт декларує певну властивість об’єкту, або свідчить про певні відносини між двома (або більше) об’єктами; факт також стверджує, що дещо відоме нам є істиною.

Факти записуються з допомогою предикатів (констатує відносини або властивості об’єктів) та декількох аргументів (які власне є об’єктами), наприклад:

родитель(джозеф, джон).

родитель(роуз, джон).

родитель(джон, кароліна).

родитель(жаклін, кароліна).

родитель(джон, патрік).

родитель(жаклін, патрік).

Програма у Прологу може мати будь-яку кількість фактів. Коли програма завантажується в інтерпретатор Пролога (або консультується з ним), за умовчанням вважається, що всі факти програми є істинними. Вони є логічними твердженнями і складають базу знань програми.

Коли користувач ставить питання, інтерпретатор Пролога здійснює пошук у базі фактів для визначення того, чи є достатньо інформації для відповіді. Наприклад, якщо ми бажаємо знати, 1) чи є Жаклін родителем Кароліни та 2) хто родитель Джона, ми можемо поставити наступне питання Прологу:

?- родитель(жаклін, каролін).

і інтерпретатор Прологу відповість:

Yes (так)

Інтерпретатор Прологу ставить у відповідність питання та кожний факт (твердження) в базі знань наступним чином:

  1. Пролог знаходить факт, який відповідає питанню за предикатом.

  2. Якщо відповідність знайдено, то Пролог ставить у відповідність перший аргумент предикату.

  3. Якщо відповідність знайдено, то Пролог ставить у відповідність другий аргумент предикату, і так далі для інших аргументів.

  4. Якщо відповідності не знайдено на будь-якому кроці, то Пролог буде шукати наступне твердження, для якого співпадають предикати та пробувати знову знайти відповідності між аргументами.

  5. Якщо предикати та всі аргументи поставлені у відповідність, то процес закінчується, а інтерпретатор дає відповідь yes (так), що означає ‘знайдено відповідність – я знаю, що це істина, оскільки це є в моїй базі знань’. Мету знаходження відповідностей досягнуто.

  6. Якщо відповідностей немає, то відповідь буде no(ні), що означає ‘цього немає в моїй базі знань, отже це невірно’: Мету знаходження відповідностей не досягнуто.

Щоб поставити друге запитання, ми повинні використати змінну, наприклад Хто. У Пролог це запитання може бути записано наступним чином:

?- родитель(Хто, джон).

Зверніть увагу, що змінна ‘Хто’ починається з великої літери. Це не випадковість, велика літера позначує, що це змінна, тоді як константи завжди починаються з малих літер. Всі аргументи, що були введені досі, представляють собою об’єкти (джон, роуз, патрік та ін.) або властивості об’єктів, і вважається, що вони є незмінними.

Як константи, так і змінні представляють собою структури даних, що називаються атомами, тобто вони не можуть містити в собі інші дані (поділятися).

Коли знайдено відповідність, будь-яка змінна приймає значення будь-якої константи, з якою знайдено цю відповідність. Таким чином, наше питання буде поставлено у відповідність з двома твердженнями родитель(джозеф, джон). та родитель(роуз, джон). А тому змінна Хто буде мати два значення:

Хто = джозеф;

Хто = роуз;

No.

Тут знак “;” означає, що користувач хоче отримати всі інші можливі відповіді. Остання відповідь, no, означає, що всі можливі значення змінної Хто представлено та більше немає відповідей.

Основні правила синтаксису Пролога наступні:

  • всі предикати починаються з малих літер;

  • всі змінні починаються з великих літер;

  • формат кожного факту або твердження наступний:

  1. предикат з будь-якою кількістю аргументів;

  2. аргументи відокремлюються один від одного комами та заключаються у круглі дужки;

  3. точка ставиться після кожного факту.

Якщо ми хочемо задати складніше запитання, наприклад: Хто батьки Кароліни та Патріка?, ми повинні розбити його на простіші запитання та об’єднати їх з допомогою кон’юнкції.

?- родитель(Хто, патрік), родитель(Хто, кароліна).

Відповідь буде наступною:

Хто = джон;

Хто = жаклін;

No

Уніфікація

Процес поставлення у відповідність також називається уніфікацією. Коли два терми поставлено у відповідність, то про них кажуть, що вони уніфіковані. Саме завдяки процесу уніфікації змінні набувають певного значення. Уніфікація – процес двохсторонній. Він оперує будь-якою парою термів у Пролог. Наприклад, при уніфікації любити(джон, Х) та любити(Y, марі) результатом буде любити(джон, марі). У Пролог є спеціальний вбудований предикат для уніфікації двох термів. Це інфіксний предикат, який позначується як =/2. Зверніть увагу, що інфіксний означає, що він має бути розташований між двома термами, а ‘/2’ позначує арність предиката та визначає кількість аргументів у предиката. Декілька прикладів:

?-фред=X. X=фред yes

(змінна X уніфікується значенням константи фред)

?-c=letter(c). no

(константа не може бути уніфікована предикатом з одним аргументом)

?-f(t)=f(S). S=t yes

(ім’я предиката одне й те саме; змінна S уніфікується константою t)

?-батько(джон, том)=батько(том,Хто). No

(константи джон та том не можуть бути уніфіковані)

Правила уніфікації наступні.

1) Константа може бути уніфікована тільки іншою константою з тим самим ім’ям.

2) Змінна може бути уніфікована константою або іншою змінною.

3) Предикат уніфікується іншим предикатом, якщо в них однакові імена та однакова кількість аргументів, а їх аргументи можуть бути уніфіковані між собою.