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

2.12 Труднощі у використанні відсікання і заперечення

Виділимо спочатку переваги використання відсікання:

1. За допомогою предиката cut можна підвищити ефективність програми.

2. Використовуючи cut, можна описати взаємовиключні правила, тому є можливість запрограмувати твердження: якщо умова P, тоді розв’язок Q, інакше розв’язок R.

Обмеження на застосування відсікання виходять із декларативної сторони прологової програми. Якщо в програмі немає відсікання, можна міняти місцями порядок речень і цілей. Коли ж предикат cut присутній у програмі, тоді зміна порядку речень у програмі може вплинути на її декларативний зміст (дати інший розв’язок).

Якщо вилучення відсікання з програми не змінює її декларативного змісту, то його називають “зеленим”. В іншому випадку відтинання називають “червоним”.

Працювати із запереченням також треба обережно. Труднощі виникають тому, що заперечення, яке використовується, не повністю відповідає математичному запереченню.

Якщо побудуємо запит системі goal: not(dog(„Шарік”)), вона, можливо, відповість “так”. Але цю відповідь не можна розуміти як повідомлення про те, що “Шарік не собака”, а потрібно трактувати так, що системі не вистачає інформації для доведення твердження “Шарік – собака”. Такий підхід бере свій початок від припущення про замкнутість світу. Відповідно до цього постулату світ замкнутий у тому розумінні, що все існуюче в ньому або указане в програмі, або може бути з неї виведене. І в іншому випадку, коли чогось немає в програмі (не може бути з такої виведено), тоді воно хибне, і відповідно буде істинним його заперечення.

Ми ж традиційно не вважаємо світ замкнутим: якщо в програмі явно не сказано, що dog(„Шарік”), то це ще не означає, що ми хочемо сказати: “Шарік не собака”.

Розглянемо напраклад наступну програму

/* Програма 2.6 */

predicates

r(symbol)

g(symbol)

p(symbol)

clauses

r(a).

g(b).

p(X):-not(r(X)).

На запит g(X), p(X) cистема дасть відповість Х=b, а на p(X), g(X) система дасть відповідь no (ні). Уся різниця в тому, що в першому випадку змінна Х до моменту обчислення Р(X) була вже зв’язана, а в другому цього ще не трапилось.

2.13 Зміст звіту з лабораторної роботи

1. Вказати номер, тему й мету лабораторної роботи.

2. Навести результати дослідження програми 2.3 при наявності і відсутності предиката fail у програмі.

2. Додати процедури подібні до процедури do_answer() в індивідуальному завданні (додаток Б).

3. Вдосконалити розроблену раніше програму з використанням меню для вибору різних варіантів запитів. Організувати повний інтерфейс програми (повторне виконання запитів, вихід з програми по ключовому слові і т.п.).

Лабораторна робота № 3 Рекурсія і рекурсивні процедури в Пролозі

Мета роботи: ознайомитися з рекурсією, як з алгоритмічним методом, та її особливостями в Пролог-програмах вивчити способи побудови рекурсивних процедур та забезпечення цілісності відносин.

3.1 Визначення поняття рекурсії

Рекурсія – алгоритмічний метод, що часто використовується у Пролозі. Рекурсію застосовують для тих самих цілей, що і циклічні конструкції в процедурних мовах. У рекурсивних правилах більш складні вхідні аргументи виражаються через менш складні. Наприклад, рекурсивний набір інструкцій з завантаження контейнерів може мати такий вид:

Для того, щоб завантажити N контейнерів, потрібно:

Якщо N=0, то зупинитися.

Якщо N>0, то завантажити один контейнер, потім завантажити ще N–1 контейнер.

Будемо вважати, що тут дано визначення процедури “завантаження N контейнерів”, де N – аргумент процедури і позначає деяке ціле число.

Дана процедура рекурсивна, тому що останній рядок – “завантажити N–1 контейнер” – є викликом процедурою самої себе. Слід відмітити, що аргумент при рекурсивному виклику простіший, ніж вихідний аргумент N, у тому розумінні, що (N1) – це число менше, ніж число N. Тому “завантаження N контейнерів” є більш складний випадок, що виражається через менш складний випадок виконання тих же самих дій, тобто через “завантажити N1 контейнер”.

Класичним прикладом рекурсивного визначення в Пролозі може бути процедура “предок”, що складається з двох правил:

предок(А, Б):-батько(А,Б).

предок(А, Б):-батько(В, Б), предок(А, В)

Сукупність цих правил визначає два способи, відповідно до яких одна особа (А) може бути предком іншої особи (Б). Відповідно до першого правила, А є предком Б, якщо А – батько Б, тобто А є найближчим предком Б (рис. 3.1,а).

Відповідно до другого правила А буде предком Б, якщо є дехто В, що, будучи батьком Б, має своїм предком А. Іншими словами, А – предок Б, якщо А – предок батька Б, тобто А – віддаленим предком Б (рис. 3.1,б). У такий спосіб друге правило залежить від більш простої версії самого себе, тобто від підмети “предок”.

Рисунок 3.1 – Приклади відношення “предок” і його зв'язок з відношенням “батько”: а) А найближчий предок Б; б) А віддалений предок Б; в) приклад схеми програми.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]