Page 23 - 4800
P. 23
Для реалізації цього на Пролозі використаємо предикат fail, який завжди
завершується невдало, вимагаючи також невдалого завершення і тієї мети, що є її
предком.
like(”Іван”, X):- basketball(X),!,fail.
like(”Іван”, X):- game(X).
Тут відсікання відкине з розгляду друге правило, коли гра – баскетбол, а fail
викличе неуспіх.
Цей приклад показує, що бажано мати унарний предикат not, такий, що not(Ціль)
буде істинним у випадку, коли Ціль не є істиною. На Пролозі його можна описати так:
not(P):- P,!, fail;
true.
Пролог-система має вмонтований предикат not, реалізований подібним чином.
Тоді наш приклад можна переписати в такому вигляді:
like(„Іван”, X):- game(X), not(basketball(X)).
Наступна программа показує використання предиката not.
Єдине, що варто зазначити: предикат not виконується успішно, коли підціль не є
істиною, тобто тоді, коли асоційована з ним підціль не може довести істинність.
/* програма 2.4 */
domains
name = symbol
gpa = real
predicates
honor_student(name)
student(name, gpa)
probation(name)
clauses
honor_student(Name):- student(Name, GPA), GPA>=3.5, not(probation(Name)).
student("Сюрпіта", 3.5).
student("Петров", 2.0).
student("Михайлів", 3.7).
probation("Сюрпіта").
probation("Петров").
На запит honor_student(Name) вона видрукує список студентів, середній бал яких
більший або ж дорівнює 3,5 за виключенням студентів Петрова і Сюрпіти, котрі
проходять випробувальний термін.
2.9 Використання методу відкату і відсікання
Використання цього методу почнемо з розгляду задачі про товаришів по службі,
коли виникають питання видачі відповідей на більш широке коло питань, чим
визначення товаришів по службі тільки одного конкретного службовця, що задається з
клавіатури (як це було в попередньому прикладі). Припустимо, що перелік можливих
запитів до системи містить у собі вимоги щодо:
– пошуку всіх товаришів по службі;
– пошуку всіх товаришів по службі конкретного працівника;
– з’ясуванню наявності товаришів по службі в конкретного працівника;
– видачі списку всіх товаришів по службі, обмеженого знизу деяким
службовцем.
Один з варіантів реалізації даних вимог може мати вигляд розширеної
процедури do_answer()
/* правило 1 */
do_answer("stop") :- write("good bye").
/* правило 2 */
do_answer(X) :- X="all", colleague(Z,Y), write(" ", Z, " -> ", Y), nl, fail, !.
/* правило 3 */
do_answer(X):- frontchar(X,"!",Z), colleague(Z,_),!, write(Z," має товаришів по
службі"), nl, fail.
/* правило 4 */
23