|
|
% ===============================================
|
|
|
% ДИЗАЙН ПРЕДМЕТНОЙ ОБЛАСТИ - ЗАДАНИЕ 5
|
|
|
% Структура для акинатора: 30 объектов, 5 вопросов
|
|
|
% ===============================================
|
|
|
|
|
|
% ===============================================
|
|
|
% ОПРЕДЕЛЕНИЕ ОБЪЕКТОВ (30 ОБЪЕКТОВ)
|
|
|
% ===============================================
|
|
|
|
|
|
% Домашние животные
|
|
|
object(собака).
|
|
|
object(кошка).
|
|
|
object(попугай).
|
|
|
object(хомяк).
|
|
|
object(рыбка).
|
|
|
object(черепаха).
|
|
|
object(канарейка).
|
|
|
object(кролик).
|
|
|
|
|
|
% Дикие животные
|
|
|
object(лев).
|
|
|
object(тигр).
|
|
|
object(слон).
|
|
|
object(жираф).
|
|
|
object(зебра).
|
|
|
object(волк).
|
|
|
object(медведь).
|
|
|
object(лиса).
|
|
|
object(олень).
|
|
|
object(заяц).
|
|
|
|
|
|
% Птицы
|
|
|
object(орел).
|
|
|
object(сова).
|
|
|
object(ворон).
|
|
|
object(голубь).
|
|
|
object(ласточка).
|
|
|
|
|
|
% Рептилии и земноводные
|
|
|
object(игуана).
|
|
|
object(змея).
|
|
|
object(лягушка).
|
|
|
object(крокодил).
|
|
|
|
|
|
% Насекомые
|
|
|
object(бабочка).
|
|
|
object(пчела).
|
|
|
object(муравей).
|
|
|
|
|
|
% ===============================================
|
|
|
% ВОПРОСЫ (5 ОСНОВНЫХ ВОПРОСОВ)
|
|
|
% ===============================================
|
|
|
|
|
|
question(is_domestic, 'Это домашнее животное?').
|
|
|
question(has_fur, 'Есть ли у животного шерсть или мех?').
|
|
|
question(can_fly, 'Умеет ли животное летать?').
|
|
|
question(is_large, 'Это крупное животное (больше кошки)?').
|
|
|
question(is_predator, 'Это хищник?').
|
|
|
|
|
|
% ===============================================
|
|
|
% ХАРАКТЕРИСТИКИ ОБЪЕКТОВ
|
|
|
% ===============================================
|
|
|
|
|
|
% Домашние животные
|
|
|
characteristic(собака, is_domestic, yes).
|
|
|
characteristic(собака, has_fur, yes).
|
|
|
characteristic(собака, can_fly, no).
|
|
|
characteristic(собака, is_large, yes).
|
|
|
characteristic(собака, is_predator, no).
|
|
|
|
|
|
characteristic(кошка, is_domestic, yes).
|
|
|
characteristic(кошка, has_fur, yes).
|
|
|
characteristic(кошка, can_fly, no).
|
|
|
characteristic(кошка, is_large, no).
|
|
|
characteristic(кошка, is_predator, yes).
|
|
|
|
|
|
characteristic(попугай, is_domestic, yes).
|
|
|
characteristic(попугай, has_fur, no).
|
|
|
characteristic(попугай, can_fly, yes).
|
|
|
characteristic(попугай, is_large, no).
|
|
|
characteristic(попугай, is_predator, no).
|
|
|
|
|
|
characteristic(хомяк, is_domestic, yes).
|
|
|
characteristic(хомяк, has_fur, yes).
|
|
|
characteristic(хомяк, can_fly, no).
|
|
|
characteristic(хомяк, is_large, no).
|
|
|
characteristic(хомяк, is_predator, no).
|
|
|
|
|
|
characteristic(рыбка, is_domestic, yes).
|
|
|
characteristic(рыбка, has_fur, no).
|
|
|
characteristic(рыбка, can_fly, no).
|
|
|
characteristic(рыбка, is_large, no).
|
|
|
characteristic(рыбка, is_predator, no).
|
|
|
|
|
|
characteristic(черепаха, is_domestic, yes).
|
|
|
characteristic(черепаха, has_fur, no).
|
|
|
characteristic(черепаха, can_fly, no).
|
|
|
characteristic(черепаха, is_large, no).
|
|
|
characteristic(черепаха, is_predator, no).
|
|
|
|
|
|
characteristic(канарейка, is_domestic, yes).
|
|
|
characteristic(канарейка, has_fur, no).
|
|
|
characteristic(канарейка, can_fly, yes).
|
|
|
characteristic(канарейка, is_large, no).
|
|
|
characteristic(канарейка, is_predator, no).
|
|
|
|
|
|
characteristic(кролик, is_domestic, yes).
|
|
|
characteristic(кролик, has_fur, yes).
|
|
|
characteristic(кролик, can_fly, no).
|
|
|
characteristic(кролик, is_large, no).
|
|
|
characteristic(кролик, is_predator, no).
|
|
|
|
|
|
% Дикие животные - крупные хищники
|
|
|
characteristic(лев, is_domestic, no).
|
|
|
characteristic(лев, has_fur, yes).
|
|
|
characteristic(лев, can_fly, no).
|
|
|
characteristic(лев, is_large, yes).
|
|
|
characteristic(лев, is_predator, yes).
|
|
|
|
|
|
characteristic(тигр, is_domestic, no).
|
|
|
characteristic(тигр, has_fur, yes).
|
|
|
characteristic(тигр, can_fly, no).
|
|
|
characteristic(тигр, is_large, yes).
|
|
|
characteristic(тигр, is_predator, yes).
|
|
|
|
|
|
characteristic(волк, is_domestic, no).
|
|
|
characteristic(волк, has_fur, yes).
|
|
|
characteristic(волк, can_fly, no).
|
|
|
characteristic(волк, is_large, yes).
|
|
|
characteristic(волк, is_predator, yes).
|
|
|
|
|
|
characteristic(медведь, is_domestic, no).
|
|
|
characteristic(медведь, has_fur, yes).
|
|
|
characteristic(медведь, can_fly, no).
|
|
|
characteristic(медведь, is_large, yes).
|
|
|
characteristic(медведь, is_predator, yes).
|
|
|
|
|
|
characteristic(лиса, is_domestic, no).
|
|
|
characteristic(лиса, has_fur, yes).
|
|
|
characteristic(лиса, can_fly, no).
|
|
|
characteristic(лиса, is_large, no).
|
|
|
characteristic(лиса, is_predator, yes).
|
|
|
|
|
|
% Дикие животные - крупные травоядные
|
|
|
characteristic(слон, is_domestic, no).
|
|
|
characteristic(слон, has_fur, no).
|
|
|
characteristic(слон, can_fly, no).
|
|
|
characteristic(слон, is_large, yes).
|
|
|
characteristic(слон, is_predator, no).
|
|
|
|
|
|
characteristic(жираф, is_domestic, no).
|
|
|
characteristic(жираф, has_fur, no).
|
|
|
characteristic(жираф, can_fly, no).
|
|
|
characteristic(жираф, is_large, yes).
|
|
|
characteristic(жираф, is_predator, no).
|
|
|
|
|
|
characteristic(зебра, is_domestic, no).
|
|
|
characteristic(зебра, has_fur, no).
|
|
|
characteristic(зебра, can_fly, no).
|
|
|
characteristic(зебра, is_large, yes).
|
|
|
characteristic(зебра, is_predator, no).
|
|
|
|
|
|
characteristic(олень, is_domestic, no).
|
|
|
characteristic(олень, has_fur, yes).
|
|
|
characteristic(олень, can_fly, no).
|
|
|
characteristic(олень, is_large, yes).
|
|
|
characteristic(олень, is_predator, no).
|
|
|
|
|
|
% Дикие животные - мелкие
|
|
|
characteristic(заяц, is_domestic, no).
|
|
|
characteristic(заяц, has_fur, yes).
|
|
|
characteristic(заяц, can_fly, no).
|
|
|
characteristic(заяц, is_large, no).
|
|
|
characteristic(заяц, is_predator, no).
|
|
|
|
|
|
% Птицы - хищные
|
|
|
characteristic(орел, is_domestic, no).
|
|
|
characteristic(орел, has_fur, no).
|
|
|
characteristic(орел, can_fly, yes).
|
|
|
characteristic(орел, is_large, yes).
|
|
|
characteristic(орел, is_predator, yes).
|
|
|
|
|
|
characteristic(сова, is_domestic, no).
|
|
|
characteristic(сова, has_fur, no).
|
|
|
characteristic(сова, can_fly, yes).
|
|
|
characteristic(сова, is_large, no).
|
|
|
characteristic(сова, is_predator, yes).
|
|
|
|
|
|
% Птицы - всеядные/зерноядные
|
|
|
characteristic(ворон, is_domestic, no).
|
|
|
characteristic(ворон, has_fur, no).
|
|
|
characteristic(ворон, can_fly, yes).
|
|
|
characteristic(ворон, is_large, no).
|
|
|
characteristic(ворон, is_predator, no).
|
|
|
|
|
|
characteristic(голубь, is_domestic, no).
|
|
|
characteristic(голубь, has_fur, no).
|
|
|
characteristic(голубь, can_fly, yes).
|
|
|
characteristic(голубь, is_large, no).
|
|
|
characteristic(голубь, is_predator, no).
|
|
|
|
|
|
characteristic(ласточка, is_domestic, no).
|
|
|
characteristic(ласточка, has_fur, no).
|
|
|
characteristic(ласточка, can_fly, yes).
|
|
|
characteristic(ласточка, is_large, no).
|
|
|
characteristic(ласточка, is_predator, no).
|
|
|
|
|
|
% Рептилии и земноводные
|
|
|
characteristic(игуана, is_domestic, no).
|
|
|
characteristic(игуана, has_fur, no).
|
|
|
characteristic(игуана, can_fly, no).
|
|
|
characteristic(игуана, is_large, no).
|
|
|
characteristic(игуана, is_predator, no).
|
|
|
|
|
|
characteristic(змея, is_domestic, no).
|
|
|
characteristic(змея, has_fur, no).
|
|
|
characteristic(змея, can_fly, no).
|
|
|
characteristic(змея, is_large, no).
|
|
|
characteristic(змея, is_predator, yes).
|
|
|
|
|
|
characteristic(лягушка, is_domestic, no).
|
|
|
characteristic(лягушка, has_fur, no).
|
|
|
characteristic(лягушка, can_fly, no).
|
|
|
characteristic(лягушка, is_large, no).
|
|
|
characteristic(лягушка, is_predator, no).
|
|
|
|
|
|
characteristic(крокодил, is_domestic, no).
|
|
|
characteristic(крокодил, has_fur, no).
|
|
|
characteristic(крокодил, can_fly, no).
|
|
|
characteristic(крокодил, is_large, yes).
|
|
|
characteristic(крокодил, is_predator, yes).
|
|
|
|
|
|
% Насекомые
|
|
|
characteristic(бабочка, is_domestic, no).
|
|
|
characteristic(бабочка, has_fur, no).
|
|
|
characteristic(бабочка, can_fly, yes).
|
|
|
characteristic(бабочка, is_large, no).
|
|
|
characteristic(бабочка, is_predator, no).
|
|
|
|
|
|
characteristic(пчела, is_domestic, no).
|
|
|
characteristic(пчела, has_fur, no).
|
|
|
characteristic(пчела, can_fly, yes).
|
|
|
characteristic(пчела, is_large, no).
|
|
|
characteristic(пчела, is_predator, no).
|
|
|
|
|
|
characteristic(муравей, is_domestic, no).
|
|
|
characteristic(муравей, has_fur, no).
|
|
|
characteristic(муравей, can_fly, no).
|
|
|
characteristic(муравей, is_large, no).
|
|
|
characteristic(муравей, is_predator, no).
|
|
|
|
|
|
% ===============================================
|
|
|
% АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ
|
|
|
% ===============================================
|
|
|
|
|
|
% Получить все характеристики объекта
|
|
|
object_characteristics(Object, Characteristics) :-
|
|
|
findall(Char-Value, characteristic(Object, Char, Value), Characteristics).
|
|
|
|
|
|
% Проверить уникальность объекта по характеристикам
|
|
|
is_unique_object(Object) :-
|
|
|
object_characteristics(Object, Chars1),
|
|
|
\+ (object(OtherObject),
|
|
|
OtherObject \= Object,
|
|
|
object_characteristics(OtherObject, Chars2),
|
|
|
Chars1 = Chars2).
|
|
|
|
|
|
% Найти объекты с одинаковыми характеристиками
|
|
|
find_identical_objects(Object, IdenticalObjects) :-
|
|
|
object_characteristics(Object, Chars),
|
|
|
findall(Other,
|
|
|
(object(Other),
|
|
|
Other \= Object,
|
|
|
object_characteristics(Other, Chars)),
|
|
|
IdenticalObjects).
|
|
|
|
|
|
% Анализ покрытия вопросами
|
|
|
question_coverage_analysis :-
|
|
|
findall(Q, question(Q, _), Questions),
|
|
|
length(Questions, QCount),
|
|
|
findall(Obj, object(Obj), Objects),
|
|
|
length(Objects, OCount),
|
|
|
write('Анализ покрытия:'), nl,
|
|
|
write('Количество вопросов: '), write(QCount), nl,
|
|
|
write('Количество объектов: '), write(OCount), nl,
|
|
|
MaxCombinations is 2^QCount,
|
|
|
write('Максимум комбинаций: '), write(MaxCombinations), nl,
|
|
|
( OCount =< MaxCombinations ->
|
|
|
write('✓ Вопросов достаточно для различения всех объектов'), nl
|
|
|
; write('✗ Недостаточно вопросов для различения всех объектов'), nl
|
|
|
).
|
|
|
|
|
|
% Проверить различимость всех объектов
|
|
|
check_object_distinguishability :-
|
|
|
write('Проверка различимости объектов:'), nl,
|
|
|
findall(Obj, object(Obj), Objects),
|
|
|
check_all_pairs_distinguishable(Objects).
|
|
|
|
|
|
check_all_pairs_distinguishable([]).
|
|
|
check_all_pairs_distinguishable([H|T]) :-
|
|
|
check_object_against_list(H, T),
|
|
|
check_all_pairs_distinguishable(T).
|
|
|
|
|
|
check_object_against_list(_, []).
|
|
|
check_object_against_list(Obj1, [Obj2|Rest]) :-
|
|
|
( objects_distinguishable(Obj1, Obj2) ->
|
|
|
write('✓ '), write(Obj1), write(' и '), write(Obj2), write(' различимы'), nl
|
|
|
; write('✗ '), write(Obj1), write(' и '), write(Obj2), write(' неразличимы'), nl
|
|
|
),
|
|
|
check_object_against_list(Obj1, Rest).
|
|
|
|
|
|
% Проверить, различимы ли два объекта
|
|
|
objects_distinguishable(Obj1, Obj2) :-
|
|
|
characteristic(Obj1, Question, Value1),
|
|
|
characteristic(Obj2, Question, Value2),
|
|
|
Value1 \= Value2, !.
|
|
|
|
|
|
% Найти минимальный набор вопросов для различения объектов
|
|
|
find_distinguishing_questions(Obj1, Obj2, Questions) :-
|
|
|
findall(Q,
|
|
|
(characteristic(Obj1, Q, V1),
|
|
|
characteristic(Obj2, Q, V2),
|
|
|
V1 \= V2),
|
|
|
Questions).
|
|
|
|
|
|
% Анализ групп объектов
|
|
|
analyze_object_groups :-
|
|
|
write('Анализ групп объектов:'), nl,
|
|
|
|
|
|
% Домашние vs дикие
|
|
|
findall(Obj, characteristic(Obj, is_domestic, yes), Domestic),
|
|
|
findall(Obj, characteristic(Obj, is_domestic, no), Wild),
|
|
|
length(Domestic, DomCount),
|
|
|
length(Wild, WildCount),
|
|
|
write('Домашние животные ('), write(DomCount), write('): '),
|
|
|
print_list(Domestic), nl,
|
|
|
write('Дикие животные ('), write(WildCount), write('): '),
|
|
|
print_list(Wild), nl, nl,
|
|
|
|
|
|
% С мехом vs без меха
|
|
|
findall(Obj, characteristic(Obj, has_fur, yes), Furry),
|
|
|
findall(Obj, characteristic(Obj, has_fur, no), NoFur),
|
|
|
length(Furry, FurCount),
|
|
|
length(NoFur, NoFurCount),
|
|
|
write('С мехом ('), write(FurCount), write('): '),
|
|
|
print_list(Furry), nl,
|
|
|
write('Без меха ('), write(NoFurCount), write('): '),
|
|
|
print_list(NoFur), nl, nl,
|
|
|
|
|
|
% Летающие vs нелетающие
|
|
|
findall(Obj, characteristic(Obj, can_fly, yes), Flying),
|
|
|
findall(Obj, characteristic(Obj, can_fly, no), NonFlying),
|
|
|
length(Flying, FlyCount),
|
|
|
length(NonFlying, NoFlyCount),
|
|
|
write('Летающие ('), write(FlyCount), write('): '),
|
|
|
print_list(Flying), nl,
|
|
|
write('Нелетающие ('), write(NoFlyCount), write('): '),
|
|
|
print_list(NonFlying), nl, nl,
|
|
|
|
|
|
% Крупные vs мелкие
|
|
|
findall(Obj, characteristic(Obj, is_large, yes), Large),
|
|
|
findall(Obj, characteristic(Obj, is_large, no), Small),
|
|
|
length(Large, LargeCount),
|
|
|
length(Small, SmallCount),
|
|
|
write('Крупные ('), write(LargeCount), write('): '),
|
|
|
print_list(Large), nl,
|
|
|
write('Мелкие ('), write(SmallCount), write('): '),
|
|
|
print_list(Small), nl, nl,
|
|
|
|
|
|
% Хищники vs нехищники
|
|
|
findall(Obj, characteristic(Obj, is_predator, yes), Predators),
|
|
|
findall(Obj, characteristic(Obj, is_predator, no), NonPredators),
|
|
|
length(Predators, PredCount),
|
|
|
length(NonPredators, NoPredCount),
|
|
|
write('Хищники ('), write(PredCount), write('): '),
|
|
|
print_list(Predators), nl,
|
|
|
write('Нехищники ('), write(NoPredCount), write('): '),
|
|
|
print_list(NonPredators), nl.
|
|
|
|
|
|
% Вывести список
|
|
|
print_list([]).
|
|
|
print_list([H]) :- write(H).
|
|
|
print_list([H|T]) :- write(H), write(', '), print_list(T).
|
|
|
|
|
|
% ===============================================
|
|
|
% ДЕМОНСТРАЦИОННЫЕ ФУНКЦИИ
|
|
|
% ===============================================
|
|
|
|
|
|
% Показать статистику предметной области
|
|
|
show_domain_stats :-
|
|
|
findall(Obj, object(Obj), Objects),
|
|
|
findall(Q, question(Q, _), Questions),
|
|
|
length(Objects, ObjCount),
|
|
|
length(Questions, QCount),
|
|
|
|
|
|
write('=== СТАТИСТИКА ПРЕДМЕТНОЙ ОБЛАСТИ ==='), nl,
|
|
|
write('Количество объектов: '), write(ObjCount), nl,
|
|
|
write('Количество вопросов: '), write(QCount), nl,
|
|
|
nl,
|
|
|
|
|
|
write('ОБЪЕКТЫ:'), nl,
|
|
|
forall(object(Obj), (write(' - '), write(Obj), nl)),
|
|
|
nl,
|
|
|
|
|
|
write('ВОПРОСЫ:'), nl,
|
|
|
forall(question(Q, Text),
|
|
|
(write(' '), write(Q), write(': '), write(Text), nl)).
|
|
|
|
|
|
% Показать анализ вопросов
|
|
|
show_questions_analysis :-
|
|
|
write('=== АНАЛИЗ ВОПРОСОВ ==='), nl,
|
|
|
question_coverage_analysis,
|
|
|
nl,
|
|
|
analyze_object_groups.
|
|
|
|
|
|
% Анализ предметной области
|
|
|
analyze_domain :-
|
|
|
write('=== ПОЛНЫЙ АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ ==='), nl, nl,
|
|
|
|
|
|
show_domain_stats,
|
|
|
nl,
|
|
|
|
|
|
show_questions_analysis,
|
|
|
nl,
|
|
|
|
|
|
write('=== ПРОВЕРКА РАЗЛИЧИМОСТИ ==='), nl,
|
|
|
check_object_distinguishability,
|
|
|
nl,
|
|
|
|
|
|
write('=== ПОИСК НЕУНИКАЛЬНЫХ ОБЪЕКТОВ ==='), nl,
|
|
|
find_non_unique_objects,
|
|
|
nl,
|
|
|
|
|
|
write('=== АНАЛИЗ ЗАВЕРШЕН ==='), nl.
|
|
|
|
|
|
% Найти неуникальные объекты
|
|
|
find_non_unique_objects :-
|
|
|
findall(Obj, object(Obj), Objects),
|
|
|
find_non_unique_in_list(Objects).
|
|
|
|
|
|
find_non_unique_in_list([]).
|
|
|
find_non_unique_in_list([H|T]) :-
|
|
|
find_identical_objects(H, Identical),
|
|
|
( Identical = [] ->
|
|
|
true
|
|
|
; write('Объект '), write(H), write(' имеет идентичные характеристики с: '),
|
|
|
print_list(Identical), nl
|
|
|
),
|
|
|
find_non_unique_in_list(T).
|
|
|
|
|
|
% Симуляция определения объекта по характеристикам
|
|
|
identify_object_by_characteristics(Characteristics, PossibleObjects) :-
|
|
|
findall(Obj,
|
|
|
(object(Obj),
|
|
|
forall(member(Char-Value, Characteristics),
|
|
|
characteristic(Obj, Char, Value))),
|
|
|
PossibleObjects).
|
|
|
|
|
|
% Тестирование различения объектов
|
|
|
test_object_identification :-
|
|
|
write('=== ТЕСТИРОВАНИЕ ОПРЕДЕЛЕНИЯ ОБЪЕКТОВ ==='), nl,
|
|
|
|
|
|
% Тест 1: Домашняя кошка
|
|
|
write('Тест 1: Поиск домашнего, мелкого, хищника с мехом'), nl,
|
|
|
TestChars1 = [is_domestic-yes, is_large-no, is_predator-yes, has_fur-yes],
|
|
|
identify_object_by_characteristics(TestChars1, Results1),
|
|
|
write('Найденные объекты: '), print_list(Results1), nl, nl,
|
|
|
|
|
|
% Тест 2: Крупный дикий хищник
|
|
|
write('Тест 2: Поиск дикого, крупного хищника'), nl,
|
|
|
TestChars2 = [is_domestic-no, is_large-yes, is_predator-yes],
|
|
|
identify_object_by_characteristics(TestChars2, Results2),
|
|
|
write('Найденные объекты: '), print_list(Results2), nl, nl,
|
|
|
|
|
|
% Тест 3: Летающие домашние
|
|
|
write('Тест 3: Поиск домашних летающих'), nl,
|
|
|
TestChars3 = [is_domestic-yes, can_fly-yes],
|
|
|
identify_object_by_characteristics(TestChars3, Results3),
|
|
|
write('Найденные объекты: '), print_list(Results3), nl, nl.
|
|
|
|
|
|
% ===============================================
|
|
|
% ЭКСПОРТ И ИМПОРТ ДАННЫХ
|
|
|
% ===============================================
|
|
|
|
|
|
% Экспорт структуры предметной области
|
|
|
export_domain_structure(Filename) :-
|
|
|
tell(Filename),
|
|
|
write('% Экспорт предметной области'), nl,
|
|
|
write('% Сгенерировано автоматически'), nl, nl,
|
|
|
|
|
|
% Экспорт объектов
|
|
|
write('% Объекты'), nl,
|
|
|
forall(object(Obj),
|
|
|
(write('object('), write(Obj), write(').'), nl)),
|
|
|
nl,
|
|
|
|
|
|
% Экспорт вопросов
|
|
|
write('% Вопросы'), nl,
|
|
|
forall(question(Q, Text),
|
|
|
(write('question('), write(Q), write(', '),
|
|
|
write(''''), write(Text), write(''''), write(').'), nl)),
|
|
|
nl,
|
|
|
|
|
|
% Экспорт характеристик
|
|
|
write('% Характеристики'), nl,
|
|
|
forall(characteristic(Obj, Char, Value),
|
|
|
(write('characteristic('), write(Obj), write(', '),
|
|
|
write(Char), write(', '), write(Value), write(').'), nl)),
|
|
|
|
|
|
told,
|
|
|
write('Предметная область экспортирована в файл: '), write(Filename), nl.
|
|
|
|
|
|
% Подсчет статистики по категориям
|
|
|
category_statistics :-
|
|
|
write('=== СТАТИСТИКА ПО КАТЕГОРИЯМ ==='), nl,
|
|
|
|
|
|
% Подсчет по типам животных
|
|
|
count_domestic_wild,
|
|
|
count_by_size,
|
|
|
count_by_mobility,
|
|
|
count_by_diet,
|
|
|
count_by_covering.
|
|
|
|
|
|
count_domestic_wild :-
|
|
|
findall(_, characteristic(_, is_domestic, yes), Domestic),
|
|
|
findall(_, characteristic(_, is_domestic, no), Wild),
|
|
|
length(Domestic, DomCount),
|
|
|
length(Wild, WildCount),
|
|
|
write('Домашние/дикие: '), write(DomCount), write('/'), write(WildCount), nl.
|
|
|
|
|
|
count_by_size :-
|
|
|
findall(_, characteristic(_, is_large, yes), Large),
|
|
|
findall(_, characteristic(_, is_large, no), Small),
|
|
|
length(Large, LargeCount),
|
|
|
length(Small, SmallCount),
|
|
|
write('Крупные/мелкие: '), write(LargeCount), write('/'), write(SmallCount), nl.
|
|
|
|
|
|
count_by_mobility :-
|
|
|
findall(_, characteristic(_, can_fly, yes), Flying),
|
|
|
findall(_, characteristic(_, can_fly, no), Ground),
|
|
|
length(Flying, FlyCount),
|
|
|
length(Ground, GroundCount),
|
|
|
write('Летающие/наземные: '), write(FlyCount), write('/'), write(GroundCount), nl.
|
|
|
|
|
|
count_by_diet :-
|
|
|
findall(_, characteristic(_, is_predator, yes), Predators),
|
|
|
findall(_, characteristic(_, is_predator, no), NonPredators),
|
|
|
length(Predators, PredCount),
|
|
|
length(NonPredators, NonPredCount),
|
|
|
write('Хищники/нехищники: '), write(PredCount), write('/'), write(NonPredCount), nl.
|
|
|
|
|
|
count_by_covering :-
|
|
|
findall(_, characteristic(_, has_fur, yes), Furry),
|
|
|
findall(_, characteristic(_, has_fur, no), NonFurry),
|
|
|
length(Furry, FurCount),
|
|
|
length(NonFurry, NonFurCount),
|
|
|
write('С мехом/без меха: '), write(FurCount), write('/'), write(NonFurCount), nl. |