Page 26 - 4800
P. 26
parеnt(namе,child)
clauses
father( "іван", "петро").
father( "іван", "павло" ).
father( "петро", "оля" ).
father( "оля" , "борис" ).
/* пошук батька (батька) конкретної дитини */
parent(F,C) :- bound(C), fathеr(F,C),!.
/* пошук усіх дітей конкретного батька */
parent(F,C) :- free(C), fathеr(F,C).
Предикат bound(C) успішний у випадку, якщо змінна С зазначена, а предикат
free(C) успішний, якщо змінна С вільна.
Слід зазначити, що два правила процедури є взаємовиключними. А якщо це так,
то перевірку в другому правилі стану змінної С можна не виконувати, тому що якщо
вона буде зв’язаною, то буде оброблена першим правилом. Однак, якщо ці правила
поміняти місцями, то цього робити не можна.
2.11 Ступінчаті функції і відсікання
Часто в економічних розрахунках приходиться використовувати східчасті
функції для обчислення різних коефіцієнтів, що залежать від діапазонів зміни обсягів
виробництва, прибутку або сукупного річного доходу. Для прикладу розглянемо
двоступінчасту функцію, аналогічну обчисленню відсотка прибуткового податку,
вважаючи, що 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).
дає той же результат, що і вихідна, але вона значно більш ефективна при реалізації в
програмі на Пролозі.
2.12 Труднощі у використанні відсікання і заперечення
Виділимо спочатку переваги використання відсікання:
1. За допомогою предиката cut можна підвищити ефективність програми.
2. Використовуючи cut, можна описати взаємовиключні правила, тому є
можливість запрограмувати твердження: якщо умова P, тоді розв’язок Q, інакше
розв’язок R.
Обмеження на застосування відсікання виходять із декларативної сторони
прологової програми. Якщо в програмі немає відсікання, можна міняти місцями
порядок речень і цілей. Коли ж предикат cut присутній у програмі, тоді зміна порядку
речень у програмі може вплинути на її декларативний зміст (дати інший розв’язок).
Якщо вилучення відсікання з програми не змінює її декларативного змісту, то
його називають “зеленим”. В іншому випадку відтинання називають “червоним”.
Працювати із запереченням також треба обережно. Труднощі виникають тому,
що заперечення, яке використовується, не повністю відповідає математичному
запереченню.
26