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
   18   19   20   21   22   23   24   25   26   27   28