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.

233 lines
6.3 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.

% ===============================================
% Лабораторная работа 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.