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