% =============================================== % Лабораторная работа 8 - Задание 2: SWI-Prolog % Семейное дерево - Отцовские и семейные отношения % =============================================== % ----------------------------------------------- % 1. База данных пола всех членов семьи (из task1) % ----------------------------------------------- % Мужчины man(ivan). man(petr). man(alex). man(sergey). man(dmitry). man(mikhail). man(nikolay). man(andrey). man(vladimir). % Женщины woman(anna). woman(elena). woman(maria). woman(olga). woman(svetlana). woman(natasha). woman(irina). woman(victoria). woman(katya). % ----------------------------------------------- % 2. База данных отношения "является родителем" (из task1) % ----------------------------------------------- % parent(Родитель, Ребенок) % Старшее поколение (дедушки и бабушки) parent(ivan, petr). parent(ivan, elena). parent(anna, petr). parent(anna, elena). parent(sergey, maria). parent(sergey, alex). parent(olga, maria). parent(olga, alex). % Среднее поколение (родители) parent(petr, dmitry). parent(petr, svetlana). parent(elena, dmitry). parent(elena, svetlana). parent(alex, mikhail). parent(alex, irina). parent(maria, mikhail). parent(maria, irina). % Младшее поколение parent(dmitry, nikolay). parent(dmitry, victoria). parent(svetlana, nikolay). parent(svetlana, victoria). parent(mikhail, andrey). parent(mikhail, katya). parent(irina, andrey). parent(irina, katya). parent(nikolay, vladimir). parent(victoria, vladimir). % ----------------------------------------------- % 3. НОВЫЕ ПРЕДИКАТЫ ДЛЯ ЗАДАНИЯ 2 % ----------------------------------------------- % father(X, Y) - проверяет, является ли X отцом Y father(X, Y) :- parent(X, Y), man(X). % father(X) - выводит отца X father(X) :- write('Отец '), write(X), write(': '), father(F, X), write(F), nl. % ----------------------------------------------- % 4. ПРЕДИКАТЫ ДЛЯ СЕМЕЙНЫХ ОТНОШЕНИЙ (ЖЕНА) % ----------------------------------------------- % wife(X, Y) - проверяет, является ли X женой Y % Логика: X жена Y, если у них есть общий ребенок и X - женщина, Y - мужчина wife(X, Y) :- parent(X, Child), parent(Y, Child), woman(X), man(Y), X \= Y. % wife(X) - выводит жену X wife(X) :- write('Жена '), write(X), write(': '), wife(W, X), write(W), nl. % ----------------------------------------------- % 5. ДОПОЛНИТЕЛЬНЫЕ ПОЛЕЗНЫЕ ПРЕДИКАТЫ % ----------------------------------------------- % husband(X, Y) - проверяет, является ли X мужем Y husband(X, Y) :- wife(Y, X). % husband(X) - выводит мужа X husband(X) :- write('Муж '), write(X), write(': '), husband(H, X), write(H), nl. % married(X, Y) - проверяет, женаты ли X и Y married(X, Y) :- wife(X, Y). married(X, Y) :- wife(Y, X). % couple(X, Y) - выводит пары (муж и жена) couple(X, Y) :- wife(X, Y). % ----------------------------------------------- % 6. ПРЕДИКАТЫ ИЗ TASK1 (для совместимости) % ----------------------------------------------- % mother(X, Y) - проверяет, является ли X матерью Y mother(X, Y) :- parent(X, Y), woman(X). % mother(X) - выводит маму X mother(X) :- write('Мать '), write(X), write(': '), mother(M, X), write(M), nl. % brother(X, Y) - проверяет, является ли X братом Y brother(X, Y) :- parent(Z, X), parent(Z, Y), man(X), X \= Y. % sister(X, Y) - проверяет, является ли X сестрой Y sister(X, Y) :- parent(Z, X), parent(Z, Y), woman(X), X \= Y. % b_s(X, Y) - проверяет, являются ли X и Y братьями/сестрами b_s(X, Y) :- parent(Z, X), parent(Z, Y), X \= Y. % ----------------------------------------------- % 7. ПРЕДИКАТЫ ДЛЯ ВЫВОДА ИНФОРМАЦИИ % ----------------------------------------------- % fathers - выводит всех отцов fathers :- write('Все отцы в семье:'), nl, father(X, _), write('- '), write(X), nl, fail. fathers. % wives - выводит всех жен wives :- write('Все жены в семье:'), nl, wife(X, _), write('- '), write(X), nl, fail. wives. % couples - выводит все пары couples :- write('Все семейные пары:'), nl, couple(Wife, Husband), write('- '), write(Wife), write(' и '), write(Husband), nl, fail. couples. % children(X) - выводит всех детей X children(X) :- write('Дети '), write(X), write(':'), nl, parent(X, Child), write('- '), write(Child), nl, fail. children(_) :- write('(перечисление завершено)'), nl. % ----------------------------------------------- % 8. ПРЕДИКАТЫ ДЛЯ ОТОБРАЖЕНИЯ СЕМЕЙНОЙ ИНФОРМАЦИИ % ----------------------------------------------- % family_info_task2 - выводит информацию о семье для задания 2 family_info_task2 :- write('=== ИНФОРМАЦИЯ О СЕМЬЕ (ЗАДАНИЕ 2) ==='), nl, findall(X, father(X, _), Fathers), list_to_set(Fathers, UniqueFathers), length(UniqueFathers, FathersCount), write('Всего отцов: '), write(FathersCount), nl, findall(Y, wife(Y, _), Wives), list_to_set(Wives, UniqueWives), length(UniqueWives, WivesCount), write('Всего жен: '), write(WivesCount), nl, findall(couple(W, H), couple(W, H), Couples), length(Couples, CouplesCount), write('Всего семейных пар: '), write(CouplesCount), nl, nl. % show_relationships - показывает все отношения show_relationships :- write('=== СЕМЕЙНЫЕ ОТНОШЕНИЯ ==='), nl, couples, nl, fathers, nl, wives, nl.