Page 49 - 4800
P. 49

domains
                         name= string
                         age = integer
                         sex = m; f  /* домени m і f складаються тільки з одного функтора */
                  database
                         реrson(name, age, sex)
                  predicates
                         male(name, age)
                         female(name, age)
                         child(name, age, sex)
                  clauses
                         male(Name, Age) :- person(Name, Age, m).
                         female(Name, Age) :- person(Name, Age, f).
                         child(Name, Age, Sex) :- person(Name, Age, Sex), Age<15.
                         Якщо запустити дану програму на виконання та сформувати до неї запит Goal:
                  реrson(X, Y, Z), то Пролог відповість "ні" що викликане відсутністю даних в динамічні
                  БД. Якщо ж тепер ввести послідовно дві цілі:
                         Goal: asserta(реrson(„Тарас”, 20, m))
                         Goal: asserta(реrson(„Світлана”, 21, f))
                  і знову ввести початковий запит, то отримаємо наступну відповідь:
                         X = „Світлана”      Y=21      Z=f
                         X = „Тарас”         Y=20      Z=m
                         Одержана  відповідь  характеризує  наявність  в  БД  реrson()  відомостей  про  дві
                  особи,  їх  імена,  вік  та  стать,  хоча  ніяких  додаткових  фактів  в  текст  програми  не
                  вводилося.  У  цьому  принципова  відмінність  динамічних  БД,  які  організовуються
                  Прологом в пам'яті ПК, окремо від основної Пролог-програми.
                         Занести  інформацію  про  Тараса  і  Світлану  в  динамічну  БД  нам  дозволив
                  предикат  asserta().  Особливість  його  роботи  видно  із  порівняння  двох  цілей  та
                  результату запиту. Дані про Миколу вводилися першими, а потім дані про Світлану. В
                  отриманій  відповіді  першими  наведено  дані  про  Світлану.  Це  пов'язано  з  тим,  що
                  предикат  asserta(реrson(„Світлана”,  21,  f))  додав  дані  про  Світлану  в  початок
                  динамічної БД. Додамо в БД інформацію ще про дві особи, послідовно вводячи ще дві
                  цілі:
                         Goal: assertz(реrson(„Степан”, 9, m))
                         Goal: asserta(реrson(„Ольга”, 8, f))
                         Якщо тепер сформулювати запит про видачу всієї інформації, що зберігається в
                  динамічній БД person(), то відповідь на нього буде одержана в наступній формі:
                         Goal: реrson(Name,Age,Sex),
                         Name = „Ольга”                      Age=8         Sex=f
                         Name = „Світлана”           Age=21                Sex=f
                         Name = „Микола”             Age=20                Sex=m
                         Name = „Степан”             Age=9          Sex=m
                         Із  співставлення  донаних  цілей  і  результатів  запиту  видно,  що  один  з  нових
                  фактів  поміщений  в  початок  динамічної  БД,  а  другий  –  в  кінець,  що  пов’язане  з
                  відмінністю в роботі предикатів asserta() і assertz().
                         З елементами динамічної  БД Пролог  може  виконувати всі операції, допустимі
                  для  фактів  аналогічної  структури.  Їх  можна  шукати,  уніфікувати,  використовувати  у
                  вигляді  підзадач  правил  і  т.д.  Так,  в  програмі  6_1  динамічна  БД  входить  у  вигляді
                  підцелі трьох правил формування неявних БД. Використовуючи предикати неявних БД,
                  можна сформувати запити про дані про чоловіків, жінок або дітей:
                         Goal: male(Name, Age)
                         Name = „Тарас”              Age=20
                         Narne = „Степан”   Age=9
                         Goal: female(Name, Age)
                         Name = „Світлана”           Age=21
                         Name = „Ольга”              Age=8
                         Goal: child(N, A, S)
                         N = „Ольга”  A=8   S=f
                         N = „Степан”         A=9   S=m





                                                              49
   44   45   46   47   48   49   50   51   52   53   54