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

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)