You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
8.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

% ===============================================
% Демонстрационные запросы для 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.