Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод.вказ.Самост.роб.Логічне прогр..doc
Скачиваний:
2
Добавлен:
02.05.2019
Размер:
472 Кб
Скачать
☆

2.1.6. Оголошення складених доменів

Об’єкт можна описувати з різних аспектів. Тому опис об’єкту може складатися з властивостей різних типів. Наприклад, нехай суб’єкт має наступні властивості: роботу, місце проживання, хист. Кожну властивість суб’єкту можна описувати доменом простим чи складеним.

domains

rb = rab (sub, prof, stag, posada) /* суб’єкт, професія, стаж роботи, посада */

msc = misce (sub, adr) /* суб’єкт, адреса */

adr = address(misto, vul, dim, kvart) /* місто, вулиця, дім, квартира */

xst = xust (sub, x) /* суб’єкт, хист */

sub, prof, posada, misto, vul, x = string

stag, dim, kvart = integer

При такому описі структур для кожного типу властивостей суб’єкту треба вводити в предикат новий аргумент.

Predicates

obj (rb, msc, xst)

Пролог дозволяє оголошувати складений домен, який дозволяє для опису об’єкту використовувати тільки один аргумент, який описує ту чи іншу властивість.

Domaіns

vlast = rab (sub, prof, stag, posada);

misce (sub, adr);

xst = xust (sub, x)

adr = address(misto, vul, dim, kvart)

sub, prof, posada, misto, vul, x = string

stag, dim, kvart = integer

Predicates

Obj(vlast)

Крапка з комою читається як "або".

Складений домен дозволяє записувати будь-який тип властивостей з перелічених на місці одного аргументу.

Розглянемо приклад програми, яка записує в динамічну базу даних властивості об’єктів.

Приклад1.

domaіns

vlast = rab (sub, prof, stag, posada);

misce (sub, adr);

xst = xust (sub, x)

adr = address(misto, vul, dim, kvart)

sub, prof, posada, misto, vul, x = string

stag, dim, kvart = integer

Facts

Obj(vlast)

Predicates

obj(vlast)

do(X)

Goal

Readterm(vlast, X), do(X).

Clauses

do(X):- assertz(obj(X)).

Вводяться і заносяться у внутрішню базу даних:

Obj (rub (“Кузьменко”, “програміст”, 3, “ст. інженер”))

Obj (misce (“Кузьменко”, address (“Шкільна”, “2” , “127”)))

Obj (xust (“Кузьменко”, “графіка”))

Застосовуючи складений домен, до визначення об’єкту легко можна додати інші властивості, додавши новий тип властивостей в секції Domains до типу Vlast.

Останній приклад програми показує, що одним аргументом можна визначати різну кількість компонент структур.

За допомогою структур, можна також задавати один аргумент предикату для різних типів даних.

Приклад2.

Ввести одним предикатом вводу дані різних типів, сформувати внутрішню базу даних і зберегти її у файлі.

Domains

n=i(integer);

r(real);

s(string)

database

fact(n)

Predicates

do

repeat

Goal

Do,save("ST.asc").

Clauses

repeat.

repeat:-repeat.

Do:-repeat, readterm(n,T), assertz(fact(T)), nl, write("Закончить?(y/n)"),

readchar(C), nl, C='y'.

2.1.7. Об’єкти багаторівневих складених структур

Visual Prolog дозволяє конструювати структури о декількох рівнях. Тобто компоненти структури можуть самі бути структурами.

Розглянемо приклад: Побудувати структуру речення „На столі стояла ваза” за частинами мови.

Структуру речення за частинами мови називають деревом граматичного розбору. Її компонентами є групи іменника і групи дієслова. В свою чергу групи іменника можуть складатися з іменника, прийменника, тощо. А група дієслова складається з дієслова і групи іменника. Наприклад для вище вказаного речення дерево граматичного розбору буде:

  • 1 рівень

2 рівень

3 рівень

4 рівень

Рис.1 Дерево граматичного розбору

В дереві на Рис.1 показано функтори(імена структур) і значення аргументів внутрішніх структур(слова).

Опис багаторівневих структур виконується по рівням. Для вказаної структури опис буде:

domains

struktura_r = dgr ( gr_im, gr_di) % 1 рівень

gr_im = grupa_imennuka1 (pr, im); % 2 рівень

grupa_imennuka2 (im) % 3 рівень

gr_di = grupa_dieslova (di, gr_im) % 2 рівень

pr = prujmennuk(string) % 3 рівень

im = imennuk(string) % 4 рівень

di = dieslovo(string) % 3 рівень

В програмі для речення „На столі стояла ваза” структура, що описана буде мати вигляд:

DGR = dgr(grupa_imennuka1(prujmennuk(“На”),

imennuk(“столі”)),

grupa_dieslova (dieslovo(“стояла”),

grupa_imennuka2(imennuk(“ваза”))))

Структура не може мати однакові функтори, тому групи іменників мають № : grupa_imennuka1, grupa_imennuka2.