Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
48
Добавлен:
05.03.2016
Размер:
1.28 Mб
Скачать

7.2 Використання списків в Пролог-програмах

Застосування списків у програмі відображається у трьох її розділах. Домен списку повинен бути описаний у секції domains, а працюючий зі списком предикат – у секції predicates. Нарешті, потрібно задати сам список у секції clauses або goal. Розглянемо приклад простої програми, що використовує у своєму складі список.

/* програма 7.1 */

domains

list_sеаsоn=season*

season=string

predicates

year(list_season)

clauses

year([„зима”, „весна”, „літо”, „осінь”])

Ця програма містить список пір року. Найменування сезонів є даними символьного типу і являють собою домен елементів списку. Відмінною рисою в описі списку є наявність символу зірочки (*) після імені домену елементів.

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

Завдання 1.

Введіть програму 7.1 і введіть ряд запитів, аналізуючи одержуваний результат:

“Який весь список пір року?” – year(All)

“Який друга пора року?” – year([_,Х,_,_]) або year([_,X |_])

“Які сезони складають другу половину року?” – year([_,| X]) або year([_ | [_|X]])

Який буде результат від запиту – year([X|Y])?

Придумайте ще ряд запитів, введіть їх у програму. Результати діалогу з ЕОМ привести в звіті по роботі.

Розглянемо ще три приклади програм. Програма 7.2 показує можливість використання в предикатах спискових структур разом з іншими доменними структурами (предикат office містить цілочисльний і списковий домени).

/* програма 7.2 */

domains

number=integer

worker=string

list_worker=worker*

predicates

office(number,list_worker)

clauses

office(101,["Кардаш", "Петренко", "Маслов"]).

office(211,[ "Денега" ]).

/* програма 7.3 */

domains

number,salary=integer

name=string

member=worker(name,salary)

list_worker=member*

predicates

office(number,list_worker)

clauses

office(101,[worker("Кардаш",500), worker("Петренко",300), worker("Маслов", 200)]).

office(211,[ worker("Денега", 400)]).

/* програма 7.4 */

domains

name = string

list_worker = name*

number = integer

office = office(number , list_worker)

list_office = office*

predicates

all_office( list_offlce )

clauses

all_office([office(101,["Кардаш","Петренко","Маслов"]), office(211,["Денега"]) ]).

Програма 7.3 ілюструє той факт, що елементами списку можуть бути не тільки стандартні домени, але і будь-які, обумовлені користувачем складні структури. Так, наприклад, у даній програмі елементами списку list_worker є екземпляри структури worker(name, salary).

Програма 7.4 демонструє, що елементами спискових структур можуть бути і самі списки. Так, елементом списку list_office є структура office(number , list_worker), одним з аргументів якої є список.

Слід особливо зазначити, що всі три програми служать для опису і збереження баз даних однієї і тієї ж предметної області. При цьому логічні структури зберігання інформації істотно розрізняються. Використання спискових і складних структур істотно розширює можливості проектування і використання логічних моделей даних.

Завдання 2.

Ретельно розберіться зі структурною організацією кожної з програм, завантажте їх в ЕОМ і введіть ряд запитів.

По програмі 7.2: “Хто працює в 101 відділі?” – office(101, All) “Хто начальник (перший за списком) 101 відділу?” – office(101,[N|_]) “Які є відділи у фірмі?” – office(X,_) “Який склад усієї фірми?” – office(_,L)

По програмі 7.3: “Хто зам. начальника (2-ий за списком) 101 відділу?” - office(101,[_,worker(X,_)|_]) “Які оклади в начальників відділів?” – office(_,[worker(X,Y)|_])

По програмі 7.4: “Хто входить у раду директорів (перший підрозділ у складі фірми)?” – all_office([office(_,X)|_]) Придумайте ще кілька запитів, та введіть їх у програму. Результати діалогу з ЕОМ привести в звіті по роботі.