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.

557 lines
21 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.

% ===============================================
% ДИЗАЙН ПРЕДМЕТНОЙ ОБЛАСТИ - ЗАДАНИЕ 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.