
Завдання 1
Побудувати автоматизовану СПР на основі дерева сімейних відносин вашої сім’ї. Дерево має містити не менше 10 родичів і мати не менше чотирьох рівнів. Допускається використовувати уявні імена.
Перевірити правильність СПР, виконавши наступні запити і навести їх результат:
визначити ваших братів і сестер,
визначити ваших батьків,
визначити вашого дідуся і бабусю,
перевірити, чи є певна людина одним із ваших родичів.
Лістинг 1.1– База даних
parent(masha, kolia).
parent(misha, kolia).
parent(julia, lena).
parent(roman, lena)
parent(katia, ann).
parent(kostia, ann).
parent(julia, kiril).
parent(roman, kiril).
parent(lena, marina).
parent(kolia, marina).
parent(alexander, alex).
parent(natasha, alex).
parent(ann, alexander).
parent(kiril, alexander).
parent(ann, oleg).
parent(kiril, oleg).
parent(marina, pasha).
parent(oleg, pasha).
parent(marina, sasha).
parent(oleg, sasha).
parent(marina, dasha).
parent(oleg, dasha).
parent(pasha, sofia).
parent(olga, sofia).
parent(pasa, lili).
parent(olga, lili).
female(sofi).
female(olga).
female(marina).
female(sasha).
female(ann).
female(lena).
female(julia).
female(masha).
female(natasha).
female(lili).
male(pasha).
male(oleg).
male(kiril).
male(alexander).
male(kolia).
male(roman).
male(misha).
male(alex).
Лістинг 1.1– Визначення предикатів
offspring(Y, X) :-
parent(X, Y).
great-grandfahter(X, Z) :-
parent(X, Y),
parent(Y, Z).
great-grandmother(X, Z) :-
parent(X, Y),
parent(Y, Z).
grandparent(X, Z) :-
parent(X, Y),
parent(Y, Z).
grandmother(X, Z) :-
parent(X, Y),
parent(Y, Z).
female(X).
grandfather(X, Z) :-
parent(X, Y),
parent(Y, Z).
male(Y).
mother(X, Y) :-
parent(X, Y),
female(X).
father(X, Y) :-
parent(X, Y),
male(Y).
sister(X, Y) :-
parent(Z, X),
parent(Z, Y),
female(X),
different(X, Y).
brother(X, Y) :-
parent(Z, X),
parent(Z, Y),
male(X),
different(X, Y).
uncle(X, Y) :-
parent(Z, Y),
parent(A, Z),
parent(A, X),
male(X).
aunt(X, Y) :-
parent(Z, Y),
parent(A, Z),
parent(A, X),
female(X).
predecessor(X, Z) :-
parent(X, Z).
predecessor(X, Z) :-
parent(X, Y),
predecessor(Y, Z).
Запустимо даний лістинг коду. Виконаємо декілька запитів згідно завданням.
Рисунок 1.1 – Запит визначення сестри
Рисунок 1.1 – Завантаження модуля xpath завершено успішно
Наступним кроком необхідно звернутися до сайту (дивись лістинг 1.2).
Лістинг 1.2 – Звернення до сайту
?- sister(X,sasha).
Даний запит являє собою приклад недетермінірованного предиката кількість його «рішень» залежить від структури сайту (рисунок 1.2). В даному випадку, ми розбираємо сторінку нашого першого сайту (www.classicfm.co.uk) і виділяємо всі теги <a ..> ... </ a>. Сам тег уніфікується зі змінною A і, як бачимо, представляє в Пролозі собою структуру element / 3 (взагалі, всі sgml теги мають таку структуру).
Рисунок 1.2 – Результат запиту
Перший елемент структури – це ім'я тега, в даному випадку «a», другий – це вже зустрічався нам список, в даному випадку, список пар атрибут = значення, і, нарешті, третій аргумент – це список того, що міститься між <a ...> і <a> (у нашому прикладі – це просто текст, який і представлений у вигляді атома). Наш запит дає стільки рішень, скільки тегів міститься на строрінці, ми заздалегідь це число не знаємо (може бути і не одного), тому цей предикат (вираз) називається недетермінірованним.
Найпростіший недетермінірованний предикат можна написати наступним чином (рисунок 1.3).
Рисунок 1.3 – Недетермінірованний предикат
Крапка з комою означає операцію «або». Ми говоримо «A дорівнює або a або b». При початку виконання управління йде по першому шляху і A уніфікуєся з атомом a. Предикат повертає керування, але залишає, т.н. choiсe point як би залишає закладку в те місце, в яке бажає повернутися. При відповіді «;» користувача Пролог повертається в choice point і вибирає інший шлях.
Природно choice points може бути кілька, Пролог робить декілька вкладок (рисунок 1.4).
Рисунок 1.4 – Приклад декількох вкладок
Рисунок 1.5 – Приклад вкладених закладок