Ступінчаті функції і відсікання

 

Часто в економічних розрахунках приходиться використовувати східчасті функції для обчислення різних коефіцієнтів, що залежать від діапазонів зміни обсягів виробництва, прибутку або сукупного річного доходу. Для прикладу розглянемо двоступінчасту функцію, аналогічну обчисленню відсотка прибуткового податку, вважаючи, що D – сукупний дохід, а N – величина податку:

На Пролозі дану функцію виражають за допомогою бінарного відношення F(N, D), який можна визначити набором правил виду

F(D, 0):- D< 17.

F(D, 10):- 17=<D, D< 186.

F(D, 20):- 186=<D.

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

F(D, 0) :- D< 17,!.

F(D, 10) :- D< 186,!.

F(D, 20).

дає той же результат, що і вихідна, але вона значно більш ефективна при реалізації в програмі на Пролозі.

 

 

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

 

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

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) була вже зв’язана, а в другому цього ще не трапилось.

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

 

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

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

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

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