% =============================================== % Демонстрационные запросы для lab8 task2 % Отцовские и семейные отношения % =============================================== % Запуск демонстрации demo :- write('=== ДЕМОНСТРАЦИЯ ЗАДАНИЯ 2: ОТЦОВСКИЕ И СЕМЕЙНЫЕ ОТНОШЕНИЯ ==='), nl, nl, % 1. Демонстрация отцовских отношений write('1. ОТЦОВСКИЕ ОТНОШЕНИЯ'), nl, write('========================'), nl, demo_fathers, nl, % 2. Демонстрация семейных отношений (жена) write('2. СЕМЕЙНЫЕ ОТНОШЕНИЯ (ЖЕНА)'), nl, write('============================'), nl, demo_wives, nl, % 3. Демонстрация дополнительных отношений write('3. ДОПОЛНИТЕЛЬНЫЕ СЕМЕЙНЫЕ ОТНОШЕНИЯ'), nl, write('===================================='), nl, demo_additional, nl, % 4. Общая информация о семье write('4. ИНФОРМАЦИЯ О СЕМЬЕ'), nl, write('====================='), nl, demo_family_info, nl, write('=== ДЕМОНСТРАЦИЯ ЗАДАНИЯ 2 ЗАВЕРШЕНА ==='), nl. % Вспомогательные предикаты для демонстрации demo_fathers :- write('Проверка отцовства:'), nl, write('?- father(ivan, petr). -> '), (father(ivan, petr) -> write('true') ; write('false')), nl, write('?- father(anna, petr). -> '), (father(anna, petr) -> write('true') ; write('false')), nl, write('?- father(petr, dmitry). -> '), (father(petr, dmitry) -> write('true') ; write('false')), nl, write('?- father(alex, mikhail). -> '), (father(alex, mikhail) -> write('true') ; write('false')), nl, nl, write('Поиск отца конкретного человека:'), nl, write('father(petr):'), nl, father(petr), write('father(dmitry):'), nl, father(dmitry), write('father(mikhail):'), nl, father(mikhail), nl, write('Список всех отцов:'), nl, fathers. demo_wives :- write('Проверка супружеских отношений:'), nl, write('?- wife(anna, ivan). -> '), (wife(anna, ivan) -> write('true') ; write('false')), nl, write('?- wife(elena, petr). -> '), (wife(elena, petr) -> write('true') ; write('false')), nl, write('?- wife(maria, alex). -> '), (wife(maria, alex) -> write('true') ; write('false')), nl, write('?- wife(ivan, anna). -> '), (wife(ivan, anna) -> write('true') ; write('false')), nl, nl, write('Поиск жены конкретного человека:'), nl, write('wife(ivan):'), nl, wife(ivan), write('wife(petr):'), nl, wife(petr), write('wife(alex):'), nl, wife(alex), nl, write('Список всех жен:'), nl, wives. demo_additional :- write('Проверка мужских отношений:'), nl, write('?- husband(ivan, anna). -> '), (husband(ivan, anna) -> write('true') ; write('false')), nl, write('?- husband(petr, elena). -> '), (husband(petr, elena) -> write('true') ; write('false')), nl, nl, write('Поиск мужа:'), nl, write('husband(anna):'), nl, husband(anna), write('husband(elena):'), nl, husband(elena), nl, write('Проверка брачных отношений:'), nl, write('?- married(anna, ivan). -> '), (married(anna, ivan) -> write('true') ; write('false')), nl, write('?- married(ivan, anna). -> '), (married(ivan, anna) -> write('true') ; write('false')), nl, nl, write('Все семейные пары:'), nl, couples. demo_family_info :- family_info_task2, write('Подробная информация о семьях:'), nl, write('------------------------------'), nl, % Показать детей каждой пары forall( couple(Wife, Husband), ( write('Семья '), write(Wife), write(' и '), write(Husband), write(':'), nl, findall(Child, (parent(Wife, Child), parent(Husband, Child)), Children), (Children = [] -> write(' (детей нет)'), nl ; (write(' Дети: '), write_list(Children), nl) ), nl ) ). % Вспомогательный предикат для красивого вывода списка write_list([]). write_list([H|T]) :- write(H), (T = [] -> true ; (write(', '), write_list(T))). % ----------------------------------------------- % Специальные демонстрационные запросы % ----------------------------------------------- % Показать генеалогическое дерево семьи show_family_tree :- write('=== ГЕНЕАЛОГИЧЕСКОЕ ДЕРЕВО ==='), nl, % Старшее поколение write('СТАРШЕЕ ПОКОЛЕНИЕ:'), nl, forall( (man(X), \+ parent(_, X)), (write(' Дедушка: '), write(X), (wife(W, X) -> (write(' (жена: '), write(W), write(')')) ; true), nl) ), forall( (woman(X), \+ parent(_, X), \+ wife(X, _)), (write(' Бабушка: '), write(X), nl) ), nl, % Среднее поколение write('СРЕДНЕЕ ПОКОЛЕНИЕ:'), nl, forall( couple(Wife, Husband), (write(' Семья: '), write(Wife), write(' и '), write(Husband), nl) ), nl, % Младшее поколение write('МЛАДШЕЕ ПОКОЛЕНИЕ:'), nl, forall( (\+ parent(X, _), parent(_, X)), ( (man(X) -> write(' Сын: '); write(' Дочь: ')), write(X), write(' (родители: '), father(F, X), write(F), write(' и '), mother(M, X), write(M), write(')'), nl ) ), nl. % Интерактивные примеры example_queries :- write('=== ПРИМЕРЫ ИНТЕРАКТИВНЫХ ЗАПРОСОВ ЗАДАНИЯ 2 ==='), nl, write('Вы можете выполнить следующие запросы в интерактивной сессии:'), nl, nl, write('1. Отцовские отношения:'), nl, write(' ?- father(ivan, petr). % Проверить, отец ли иван петра'), nl, write(' ?- father(X, dmitry). % Найти отца дмитрия'), nl, write(' ?- father(petr). % Показать отца петра'), nl, write(' ?- fathers. % Показать всех отцов'), nl, nl, write('2. Семейные отношения (жена):'), nl, write(' ?- wife(anna, ivan). % Проверить, жена ли анна ивана'), nl, write(' ?- wife(X, petr). % Найти жену петра'), nl, write(' ?- wife(ivan). % Показать жену ивана'), nl, write(' ?- wives. % Показать всех жен'), nl, nl, write('3. Дополнительные отношения:'), nl, write(' ?- husband(ivan, anna). % Проверить, муж ли иван анны'), nl, write(' ?- married(anna, ivan). % Проверить, женаты ли анна и иван'), nl, write(' ?- couple(X, Y). % Найти все пары'), nl, write(' ?- couples. % Показать все пары'), nl, nl, write('4. Информационные запросы:'), nl, write(' ?- family_info_task2. % Общая информация о семье'), nl, write(' ?- show_family_tree. % Показать генеалогическое дерево'), nl, write(' ?- show_relationships. % Показать все отношения'), nl, nl.