Page 36 - 4800
P. 36
наприклад, у даній програмі елементами списку list_worker є екземпляри структури
worker(name, salary).
Програма 4.4 демонструє, що елементами спискових структур можуть бути і
самі списки. Так, елементом списку list_office є структура office(number , list_worker),
одним з аргументів якої є список.
Слід особливо зазначити, що всі три програми служать для опису і збереження
баз даних однієї і тієї ж предметної області. При цьому логічні структури зберігання
інформації істотно розрізняються. Використання спискових і складних структур
істотно розширює можливості проектування і використання логічних моделей даних.
4.3. Найпростіші процедури роботи зі списками
У порграмі 4.1 мета year(All) забезпечувала присвоєння змінній All усього
списку в цілому. Навпаки, мета year(_,Х,_,_) дозволяла витягнути зі списку усього лише
один елемент. Однак, у цьому випадку було потрібне точне знання числа елементів у
списку. Якщо задати мету у вигляді year([Х,Y]), то вона не буде досягнута, через
невідповідність кількості елементів у списку і цільовому твердженні.
Разом з тим, можливість відділення від списку першого елемента дозволяє
обробляти його окремо поза залежністю від довжини списку. Причому, хвіст можна
знову розглядати як список, у якому можна виділити перший елемент. Аналогічні
відокремлення першого елемента можна проводити до того часу, поки весь список не
буде вичерпаний. Цей рекурсивний підхід складає основу побудови процедур обробки
спискових структур.
Розглянемо одну з найпростіших процедур обробки списків, що забезпечує
послідовний доступ до елементів списку і вивід їх на екран дисплею. Приклад її опису і
застосування приведений у програмі 4.5.
/* програма 4.5 */
domains
list_season=season*
season=string
predicates
year(list_season)
print_list(list_season)
goal
year(L), print_list(L).
clauses
year([“зима”, “весна”, “літо”, “осінь”]).
print_list([]).
print_list([Х|Y]):- write(X), nl, print_list(Y).
Процедура print_list() включає два правила. Перше – це факт, що визначає
граничну умову рекурсивної процедури, тобто кінець виводу елементів списку, якщо
він порожній.
Друге правило забезпечує поділ списку на голову і хвіст та вивід першого
елемента списку на екран дисплея, перевід курсору на новий рядок і рекурсивний
виклик цього ж правила, але вже стосовно до хвостової частини списку. У загальному
випадку це правило записується в такий спосіб
print_list([]):- L=[Х|Y], write(X), nl, print_list(Y).
Але приймаючи до увагу той факт, що Пролог зіставляє з метою заголовок
правила перш, ніж намагається погодити його тіло, можливий більш короткий запис
цього правила, приведений у програмі 4.5.
У програмі 4.5 використовується мета, що складається з двох підцілей. Перша з
них забезпечує формування списку пір року на основі наявної в БД інформації. Друга
забезпечує вивід сформованого списку на екран дисплею.
Однак, мета програми обмежує можливі дії з модифікації даних у базі:
додавання, пошукову, виключення і т.д.
У цих умовах, для виводу елементів списку на екран краще ввести новий
предикат і визначити для нього правила, відповідно до яких здійснюється пошук і вивід
необхідних даних з бази.
36