- •2.1. Теоретичні відомості 24
- •Передмова
- •1. Арифметика та порівняння
- •1.1. Теоретичні відомості
- •1.1.1. Арифметичний вираз
- •1.1.2. Типи операндів і результатів арифметичних операцій
- •1.1.3. Властивості операцій
- •1.1.4. Стандартні функції і предикати
- •1.1.5. Бінарні предикати
- •1.1.6. Операції порівняння
- •1.1.7. Приклади програм на Пролозі
- •1.2. Методичні вказівки до виконання самостійної роботи
- •1.4. Контрольні питання
- •1.5. Література
- •1.6. Індивідуальні завдання
- •2. Об’єкти даних складеної структури
- •2.1. Теоретичні відомості
- •2.1.1. Загальні відомості про об’єкти складеної структури
- •2.1.2. Відмінність об’єкту складеної структури від предикату
- •2.1.3. Увід - вивід об’єктів складеної структури
- •2.1.4. Робота з об’єктами складеної структурами
- •2.1.5. Призначення об’єктів складеної структури
- •2.1.6. Оголошення складених доменів
- •2.1.7. Об’єкти багаторівневих складених структур
- •2.1.8. Робота з об’єктами багаторівневих складених структур Побудова об’єктів багаторівневих складених структур
- •Одержування компонент об’єкту складеної багаторівневої структури
- •3. Рекурсивні структури даних. Дерева як типи даних
- •3.1. Теоретичні відомості
- •3.1.1. Рекурсивні дерева
- •3.1.2.Увід - вивід дерева
- •3.1.3. Обхід рекурсивного дерева
- •3.1.4. Створення дерева
- •3.1.5. Сортування рекурсивних дерев
- •3.2. Методичні вказівки до виконання самостійної роботи
- •3.4. Контрольні питання
- •3.5. Література
- •3.6. Індивідуальні завдання
- •Література
2.1.4. Робота з об’єктами складеної структурами
Привласнювання структур
Структуру можна привласнити вільній змінній за допомогою процедури уніфікації при використанні предикату ‘=’ або при зіставленні предикатів.
Приклад1:
X = date ("Травень", 1, 2005)
Вільній змінній X привласнюється значення date ("Mай", 1, 2005) при використанні предикату ‘=’.
Приклад2:
Domains
dat = data(mis, chuslo, rik )
mis = string
chuslo, rik = integer
Predicates
do(dat)
Goal
Do(data(“Березень”, 8, 2005)).
Clauses
Do(Dat):- write(Dat).
Цільове твердження Do(data(“Березень”, 8, 2005)) зіставляється з умовним твердженням Do(Dat). При цьому структура data(“Березень”, 8, 2005) уніфікується з вільною змінною Dat. В результаті вільній змінній Dat привласнюється структура data(“Березень”, 8, 2005).
Виділення компонент структури
При роботі зі структурами часто потрібно вміти виділяти компоненти структури.
Виділити зі структури компоненти можна за допомогою процедури уніфікації при використанні предикату ‘=’ або при зіставленні предикатів.
Приклад1.
Do :- date ("Mай", 1, 2005) = date (M, D, G), write(M, ‘ ’, D, ‘ ‘,G ).
Структура-константа зіставляється зі структурою, компоненти якої подані як вільні змінні M,D,G, за допомогою предикату ‘=’. При цьому змінні одержують значення: M = "Май", D = 1, G = 2005.
Розглянемо приклад програми, де виділяються компоненти структур при зіставленні предикатів.
Приклад2.
Завдання: Нехай подано набір фактів з адресами школярів. Адреса складається з назви вулиці та № дому. Вивести на екран адреси всіх школярів.
Domains
fam, vul, dim = string
adr = address ( vul, dim ) /*Структура описує адрес */
Predicates
do
inform (fam, adr) /*Предикат описує факт: Прізвище, адреса */
Goal
do.
Clauses
inform (“Іванов”, address (“Київська”,”10-а”)).
inform (“Петров”, address (“Дніпровська”,”18”)).
inform (“Сидорів”, address (“Київська”,”1”)).
do:- inform (F, address (Vul, Dim )), write (F, ' ' ,Vul, ‘ ‘, Dim), fail.
do.
Результат: Іванов Київська 10-а
Петров Дніпровська 18
Сидорів Київська 1
При зіставленні першого факту і поточної цілі
inform (F, adress (Vul, Dim )), змінній F привласнюється прізвище школяра, а змінним Vul, Dim привласнюються компоненти структури - назва вулиці і № дому з факту. Після чого одержана інформація виводиться на екран. Механізм звороту повторює ці дії для кожного факту.
Побудова структури
Приклад. Розглянемо програму, в якій будується об’єкт складеної структури.
Завдання: Побудувати програмно структуру, яка описує властивості кубика.
Domains
Color, mat = string
Rebro = real
kub = kubik ( rebro, color, mat )
Predicates
do
Goal
do.
Clauses
do:- write(“Введіть довжину ребра ”), readreal(D),
write(“Введіть колір кубика ”), readln(C),
write(“Введіть матеріал кубика”), readln(M),
K= kub(D, C ,M ), write (K).
do.
2.1.5. Призначення об’єктів складеної структури
Використання об’єктів складеної структури для спрощення програми.
Структуру можна використовувати для того, щоб передавати великий набір значень як єдиний об'єкт, а при необхідності застосовувати уніфікацію для їхнього поділу. Такий підхід спрощує програму, не треба оголошувати велику кількість аргументів предикату.
Приклад.
Завдання: Нехай у предмета є такі характеристики: довжина, ширина, висота, вага, матеріал, колір. Написати програму, що вводить характеристики предмету і передає їх в програму пошуку, яка шукає назву предмету з такими характеристиками.
Domains
pr = predmet (dovg, shir, vusot, vaga, mater, color)
dovg, shir, vusot, vaga = real
nazv, mater, color = string
Predicates
Vvid(pr)
Poshuk(pr)
Svedeny(nazv, dovg, shir, vusot, vaga, mater, color)
Goal
Vvid (Strukt)), poshuk(Strukt).
Clauses
Svedeny(„статуетка”,6.2, 4.0, 15.0, 300.5, „мармур”,
„білий”).
Svedeny(„ваза”, 10.0, 10.0, 30.1, 150.6, „скло”,
„синій”).
Svedeny(„книга”, 21.4, 13.2, 3.1, 80.0, „бумага”,
„червоний”).
Vvid(Strukt):- write(“ Уведіть характеристики
Предмета як структуру ”), nl,
Write(predmet, “(Довжина, ”, “Ширина, ”, “Висота, ”),
write(“Вага, ”, “Матеріал, ”, “Колір”)”), nl, readterm (pr, Strukt).
Poshuk(Strukt):- Strukt = predmet(Dov, Sh, Vus, Vag, Mat, Col),
Svedeny(Naz, Dov, Sh, Vus, Vag, Mat,
Col), Write(Naz).
Процедура Poshuk одержує характеристики предмету у вигляді структури. Після чого застосовуючи уніфікацію виділяє компоненти у змінні Dov, Sh, Vus, Vag, Mat, Col для пошуку; шукає назву предмету з такими характеристиками і видає на екран.
Використання об’єктів складеної структури для опису предметної області.
Нехай предметною областю буде певна мова програмування. Опишемо тип даного „integer” фактом:
term („integer”, -32768, 32767, 16).
Але в факті не зафіксовано, що означає кожний аргумент.
Факт, що використовує замість простого об’єкту структуру, фіксує властивості об’єкту.
Наприклад:
term ( tip (“integer”), min (-32768), max (32767), platforma_bit (16))
Розглянемо програму в якій опис об’єкту подається фактом, а властивості об’єкту подані у вигляді структури.
Приклад.
Завдання: Вивести на екран відомості про типи даних певної мови. Для кожного типу вказується ідентифікатор типу, мінімальне і максимальне значення, платформа в бітах.
Domains
tp= tip(string) /* Опис властивостей об’єкту */
mn= min(integer)
mx= max(integer)
bit= platforma_bit(integer)
Predicates
Term(tp, mn, mx, bit) /* Опис об’єкту фактом */
Clauses
term ( tip (“integer”), min (-32768), max (32767), platforma_bit (16)).
term ( tip (“short”), min (-32768), max (32767), platforma_bit (16)).
Goal
term(T, Mn, Mx, Pl), write(T,’ ‘,Mn, ’ ‘,Mx, ’ ‘,Pl), nl, fail.
Результат: tip (“integer”) min (-32768) max (32767) platforma_bit (16)
tip (“short”) min (-32768) max (32767) platforma_bit (16)
