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