Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Компютерні системи штучного інтелекту_методичні...doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
521.73 Кб
Скачать

Лабораторне заняття № 13

Тема: Обробка динамічних баз даних та файлів

Мета роботи. Розглянути на прикладі основні вбудовані предикати обробки баз даних та предикати роботи з файлами; проаналізувати отримані результати.

1. Теоретичні відомості

Існує 4 способи представлення баз даних у системі Turbo Prolog :

1. Представлення у вигляді файлів.

Вважатимемо, що кожен факт є записом деякого цілісного інформаційного елемента, тобто : a) кожен цілісний інформаційний елемент представляється у вигляді факту, на-приклад :

domains

ts = slb (string, integer, symbol, integer)

slb (“Brajen”, 100, operator, 2000).

slb (“Nensi”, 200, programmer, 7100).

slb (“Ralph”, 100, manager, 9100).

Goal: slb (N, 100, P, O).

b) представлення атрибутів (властивостей) у вигляді окремих фактів. Тут один з атрибутів є ключем, тобто ключовим, який у разі необхідності з’єднує факти у єдине ціле. Приклад :

vtd (“Brajen”, 100).

pos (“Brajen”, operator).

okl (“Brajen”, 2000).

slb1 (N, V, P, O) :- vtd (N,V), pos (N, P), okl (N, O).

Даний тип визначає неявну базу даних і є більш гнучким, оскільки нові атрибути можна додавати без переписування вже існуючої БД.

2. Представлення у вигляді списку структур.

Базу даних можна вважати потоком інформаційних елементів. Приклад :

domains

ts = slb (string, integer, symbol, integer)

lists = ts*

[slb (“Brajen”,…]

3. Представлення у вигляді лінійних рекурсивних структур.

Структуру (2) можна легко перетворити у дану за допомогою додавання додаткового елементу посилки. Приклад :

domains

ts = slb (string, integer, symbol, integer)

lists = ts*

rstype = rs (string, integer, symbol, integer, rstype); end

rs (“Brajen”, 100, operator, 2000, rs (“Nansi”, 200, programmer, 7100, rs (“Ralph”, 100, manager, 9100, end))).

4. Представлення у вигляді двійкового дерева.

Перетворимо структуру rs у двійкове дерево bttype = bt (string, integer, symbol, integer, bttype, bttype); end.

Приклад : ключем буде прізвище.

Nansi

/ \

Brajen” “Ralph

Таку структуру можна оформити у вигляді :

Bt (“Nansi”, 200, programmer, 7100, bt (“Brajen”, 100, operator, 2000, end, end), bt (“Ralph”, 100, manager, 9100, end, end)).

Прикладом реалізації може бути :

one_element_bt (slb (N, V, P, O), bt (N, V, P, O, _, _)).

one_element_bt (slb (N, V, P, O), bt (_, _, _, _, Pop, Next)) :- one_element_bt (slb (N, V, P, O),Pop).

Для роботи з файлами застосовуються наступні предикати :

Openread (SymbName(file), FileName(string)), openwrite (SymbName(file), FileName (string)), openappend (SymbName(file), FileName(string)), openmodify (SymbName(file), FileName(string)), writedevice (SymbName (symbol(i)), readdevice(symbol(o)), closefile (File-Name(string(i)), deletefile(string), existfile(string), renamefile([NameOld, NameNew](string)), filepos (FileName(file), Pos(real), R(integer)).

2. Практична частина

Приклад 1.

domains

x=integer

database

time1(x)

predicates

change_time

clauses

time1(10).

change_time:-time1(X),New_time=X+1,retract(time1(X)),asserta(time1(New_time)).

goal: change_time

YES

goal: time1(X)

X=11

Приклад2.

domains

person=symbol

lang=symbol

database

know(person,lang)

predicates

language(lang)

start

goal

start.

clauses

language(ukrainian).

language(italian).

language(russian).

language(german).

language(english).

language(japan).

start:-write("Input your name"),read(Name),language(Lan),write("Do you know"),

write(Lan),write("language"),nl,read(Y),Y=yes, asserta(know(Name,Lan)),fail.

goal: know("Bob",X).

X=

Приклад 3.

domains

myfile=file

predicates

start

readin(char)

goal

srart.

clauses

start:-write("This program reads input \n from the keyboard \n writes it to FILE.ONE\n"),

write("Press # when done entering \n"),

openwrite(myfile,"file.one"),readchar(X),readin(X),closefile(myfile),

writedevice(screen), write("Your input has been transferred to a file").

readin("#"):-!.

readin("\13"):-!,writedevice(myfile), write("\13\10"),writedevice(screen),

write("\13\10"),readchar(X),readin(X).

readin(X):-writedevice(myfile),write(X),writedevice(screen),write(X), readchar(Y),readin(Y).