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

Основні випадки застосування механізму відсічки

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

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

  2. цей випадок використовується для негайного припинення пошуку альтернативних рішень, оскільки підтвердження цілі є неможливим. Тут використовується поєднання відсічки і предикату fаі1, який є завжди погоджений з базою і означає неуспіх цільового твердження, в якому зустрівся цей предикат.

  3. у такому разі відсічка вимагає негайного припинення пошуку альтернатив, оскільки знайдений єдиний розв’язок і неможливо знайти інші.

Відзначимо, що у всіх цих випадках суть механізму залишається однією і тією самою.

У Пролозі часто для описання одного предиката застосовується кілька тверджень з різними типами аргументів. В реальних ситуаціях не завжди можливо передбачити види всіх можливих аргументів, а тому доцільно вводити правило-капкан для неврахованих чи непередбачених видів аргументів. Як приклад розглянемо предикат визначення суми N чисел сума (N,5), де ЇМ- ціле число, X - значення суми цих чисел:

сума(1,1):-!.

сума (N,R) : - N1 = N-1,сума (N1,1(R1) ,R = R1+Н.

Наведений приклад відповідає вимозі 1, коли вказується Прологу, що при досягненні N=1 необхідно припинити будь-який пошук альтернатив, оскільки досягнуто граничне значення параметра. Якщо N = 2, спрацьовує друге правило, яке рекурсивно викликає само себе, присвоюючи результат підсумовування чисел змінній К. Оскільки змінна N1 кожен раз зменшується на 1, то рано чи пізно буде здійснене погодження цілі сума (N1, RІ) першим правилом, далі зустрінеться відсічка і пошук альтернатив припиниться.

Загальний принцип полягає в тому, що використання відсічки для вказання Прологу на вибір єдиного правильного правила може бути замінене застосуванням предиката not (X), який є істинним, якщо твердження X не може бути погоджено з базою даних. Наведений варіант предиката сума (N,R) може бути записаний без відсічки:

сума(1,1).

сума(N, R) : - not(N = 1),N1 = N-l,cyмa(N1,R1), R = R1+R.

Використання цього предиката not замість відсічки властиве доброму стилю програмування, оскільки програми з відсічкою є значно складнішими для розуміння. Однак часто використання not призводить до втрати ефективності програми.

Так, в програмі А:- В,Е.

A:- not(В),D.

для успішного закінчення буде зроблено дві спроби доведення твердження В. Щоб цього не було, слід використовувати відсічку А:- В,!,Е.

A:- D.

в результаті чого програма стає ефективнішою.

Отже, необхідно порівнювати переваги ясності програми з перевагами її швидкого виконання.

Типові способи використання механізму відсічки та повернення Комбінація відсічки та предиката fail

Розглянемо другий випадок використання відсічки в комбінації з вбудованим предикатом fail, який не має аргументів. Дія цього предиката полягає в тому, що він завжди непогоджений з базою даних, а тому його наявність в кон’юнкції цілей приводить до активації механізму повернення.

Якщо перед fail поставити предикат !, то природний хід погодження цілей між батьківською ціллю і fail буде змінений і всі цілі вважаються непогодженими і немає ніякого шансу отримати позитивний результат. Ця комбінація ! і fail має широке практичне використання.

Розглянемо, ж доцільно використовувати цю комбінацію для написання програми нарахування податку, який необхідно заплатити тій чи іншій людині. Визначимо предикат сер_податоплатівник (X), який означатиме, що об’єкт X є середнім податкоплатниюм, якщо він має прибуток, який не перевищує певної величини, а також більший за певний мінімум. Очевидно, окремо слід виділити випадок, коли людина є іноземцем і не може бути середнім податкоплагником через податкові обов’язки щодо своєї країни. Фрагмент такої програми міг би виглядати так:

сер_податкоплатник(X) :- іноземець,!,fail. сер_податкоплатник(X)дохід(X,D),D>200, D<2000.

дохід(X,Y)заробітна_плата(X,Z), дохід_від_капіталовкладень(X,W),Y = Z+W. дохід_від_капіталовкладень(X,W)

Перше правило у разі, якщо людина є іноземцем, не дає змогу по-іншому погодити ціль, а наявність предиката fail призводить до того, що вся ціль є неуспішною. Друге правило визначає середнього податкоплатника при знаходженні всіх видів доходів в певному діапазоні, який диктується Податковим кодексом.

Цікавий приклад використання ! і fail містить визначення предикату not (X). Незважаючи на те, що це вбудований предикат, наведемо його визначення:

not(X):- call(X),!,fail.

not(X).

Предикат call інтерпретує свій аргумент і намагається погодити його з базою даних. Якщо погодження відбудеться, то відсічка (!) не дасть змоги перепогодити твердження, а наявність fail забезпечує неуспіх всієї цілі. У разі непогодження твердження X спрацьовує другий факт і предикат not є істинним.

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