Not(probation(Name))
student("Betty Blue", 3.5).
student("David Smith", 2.0).
student("John Johnson", 3.7).
probation("Betty Blue").
probation("David Smith").
На запит honor_student(Name) вона видрукує список студентів, середній бал яких більший або ж дорівнює 3.5 за виключенням студентів Betty Blue і David Smith, які проходять випробувальний термін.
4.4.Труднощі у використанні відтинання і заперечення.
Виділимо спочатку переваги використання відтинання:
1.За допомогою предикату cutможна підвищити ефективність програми.
2.Використовуючи cut, можна описати взаємовиключні правила, тому є можливість запрограмувати твердження: якщо умоваP, тоді розв'язок Q, інакше розв'язок R.
Обмеження на використання відтинання виходять із декларативної сторони прологівської програми. Якщо в програмі немає відтинання, тоді ми можемо міняти місцями порядок речень і цілей. Якщо ж предикат cut присутній в програмі, тоді зміна порядку речень в програмі може вплинути на її декларативний зміст (дати інший розв'язок).
Якщо видалення відтинання з програми не міняє її декларативного змісту, тоді таке відтинання називають "зеленим". В іншому випадку відтинання називають "червоним".
Працювати з запереченням також треба обережно. Труднощі виникають тому, що заперечення, яке ми використовуємо, не повністю відповідає математичному запереченню.
Якщо ми побудуємо запит системі:
goal: not(dog(baks)),
вона, можливо, відповість "так". Але цю відповідь не можна розуміти як повідомлення про те, що "Бакс не собака", а потрібно трактувати те, що системі не вистачає інформації для доведення твердження " Бакс - собака". Такий підхід бере свій початок від припущення про замкнутість світу. В відповідності до цього постулату світ замкнутий в тому розумінні, що все, що в ньому існує або ж вказане в програмі, або може бути із неї виведене. І в іншому випадку, якщо щось не міститься в програмі (не може бути з неї виведеним), тоді воно хибне, і відповідно буде істинним його заперечення.
Ми ж традиційно не вважаємо світ замкнутим: якщо в програмі явно не сказано, що dog(baks), тоді це ще не значить, що ми хочемо сказати, що Бакс не собака.
Приведемо ще один приклад обережного використання not:
Predicates
R(symbol)
G(symbol)
P(symbol)
Clauses
R(a).
G(b).
p(X):-not(r(X)).
На запитgoal: g(X), p(X) cистема відповість Х=b, а на запит goal: p(X), g(X) система відповість no (ні). Вся різниця заключається у тому, що в першому випадку змінна Х до моменту обчислення Р(X) була вже зв'язана, а в другому випадку цього ще не трапилось.