Page 53 - 4800
P. 53
вільної оперативної пам'яті. Для збільшення об’єму інформації, що зберігається, можна
організувати базу даних, яка зберігається не в оперативній пам’яті, а у файлах на диску.
Це розширює можливість баз даних, оскільки при їх розміщенні у файлах
єдиним обмеженням є розмір вільного дискового простору. Це означає, що бази даних
Прологу можуть досягати значних розмірів.
Предикат readterm забезпечує доступ до фактів в файлі та має наступний вигляд:
readterm(DomainName, TermRecord),
де DomainName – це ім’я області типів даних, TermRecord – це терм, який зв’язується з
заданим об’єктом, за умови узгодження його з описом домену.
Факти, які описують предикати бази даних, можуть бути оброблені так, ніби
вони були термами. Це можливо завдяки домену dbasedom, який автоматично
декларується системою Пролог і утворює ОДНУ альтернативу для кожного предиката
бази даних. Він описує кожен предикат бази даних функтором і доменами аргументів
даного предиката. Наприклад, нехай в Пролог-програмі є такі описи бази даних:
database
реrson(name, age, sex)
address(firm, street, house, grоup)
У цьому випадку система Пролог автоматично створить відповідний цим описам
домен dbasedom:
domains
dbasedom = реrson(name, age, sex); address(firm, street, house, grоup),
який може бути використаний, як і будь-який інший оголошений домен Пролог-
програми.
Розглянемо простий приклад організації бази даних з використанням файлу на
диску. За основу приймемо спрощений варіант програми 6_2, в якому база даних
address() розміщується у файлі послідовного доступу „adres.dba”.
Даному прикладу відповідає програма 6_3, в якій інтерфейс з явною БД
забезпечується з використанням предиката рlасе(), структура якого аналогічна програмі
6_2. Проте процедура, його визначення, відрізняється тим, що в цих правилах
передбачено звернення до фактів дискової БД.
/* Програма 6_3 */
/* запитальна система, що навчається, для БД „adres.dba” */
domains
firm, street, group = symbol
house = integer
file = file_bd
database
address(firm, street, house, group)
predicates
place(firm, street, house, group)
my_read(dbasedom)
my_append(dbasedom)
next_rec(file)
clauses
my_read(Record):- openread(file_bd, “adres.dba”), readdevice(file_bd),
next_rec(file_bd), readterm(dbasedom, Record).
my_append(Record):- openappend( file_bd, “adres.dba), writedevice(file_bd),
write(Record), nl, closefile(file_bd).
next_rec(_).
next_rec(File):- not(eof(File)), next_rec(File).
place(F, S, N, G):- bound(F), my_read(R), R=address(F, S, N, G),!.
place(F, S, N, G):- free(F), my_read(R), R=address(F, S, N, G).
place(F, S, N, G):- bound(F), free(S), free(N), readdevice(key board), write(„введіть
для ”, F), nl, write(„назву вулиці: ”), readln(S), write(„номер будинку: ”), readreal(N),
write(„групу: ”), readln(G), closefile(file_bd), my_append(address(F, S, N, G)).
Для використання в програмі файлів, слід ввести файловий домен, де
визначається логічне ім’я файлу. У нашій програмі таким логічним ім’ям є file_bd. Це
ім’я предикатами програми зв’язується з ім’ям файлу БД.
53