% =============================================== % Демонстрационные запросы для lab8 task5 % Дизайн предметной области % =============================================== % Запуск демонстрации demo :- write('=== ДЕМОНСТРАЦИЯ ЗАДАНИЯ 5: ДИЗАЙН ПРЕДМЕТНОЙ ОБЛАСТИ ==='), nl, nl, % 1. Основная информация о предметной области write('1. ОСНОВНАЯ ИНФОРМАЦИЯ О ПРЕДМЕТНОЙ ОБЛАСТИ'), nl, write('=========================================='), nl, demo_basic_domain_info, nl, % 2. Анализ структуры вопросов write('2. АНАЛИЗ СТРУКТУРЫ ВОПРОСОВ'), nl, write('============================'), nl, demo_questions_structure, nl, % 3. Демонстрация групп объектов write('3. ГРУППИРОВКА ОБЪЕКТОВ'), nl, write('======================='), nl, demo_object_grouping, nl, % 4. Проверка различимости write('4. ПРОВЕРКА РАЗЛИЧИМОСТИ ОБЪЕКТОВ'), nl, write('================================='), nl, demo_distinguishability, nl, % 5. Тестирование идентификации write('5. ТЕСТИРОВАНИЕ ИДЕНТИФИКАЦИИ'), nl, write('============================='), nl, demo_identification_tests, nl, % 6. Статистический анализ write('6. СТАТИСТИЧЕСКИЙ АНАЛИЗ'), nl, write('========================'), nl, demo_statistical_analysis, nl, % 7. Рекомендации по оптимизации write('7. РЕКОМЕНДАЦИИ ПО ОПТИМИЗАЦИИ'), nl, write('==============================='), nl, demo_optimization_recommendations, nl, write('=== ДЕМОНСТРАЦИЯ ЗАДАНИЯ 5 ЗАВЕРШЕНА ==='), nl. % ----------------------------------------------- % Основная информация о предметной области % ----------------------------------------------- demo_basic_domain_info :- show_domain_stats, nl, write('ОПИСАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ:'), nl, write('Данная предметная область содержит различных животных,'), nl, write('которые можно классифицировать по 5 основным характеристикам.'), nl, write('Область охватывает домашних и диких животных различных типов.'), nl. % ----------------------------------------------- % Анализ структуры вопросов % ----------------------------------------------- demo_questions_structure :- write('Анализ покрытия и эффективности вопросов:'), nl, question_coverage_analysis, nl, write('ДЕТАЛЬНЫЙ АНАЛИЗ ВОПРОСОВ:'), nl, analyze_question_effectiveness, nl. % Анализ эффективности вопросов analyze_question_effectiveness :- findall(Q, question(Q, _), Questions), forall(member(Question, Questions), analyze_single_question(Question)). analyze_single_question(Question) :- question(Question, Text), findall(Obj, characteristic(Obj, Question, yes), YesObjects), findall(Obj, characteristic(Obj, Question, no), NoObjects), length(YesObjects, YesCount), length(NoObjects, NoCount), Total is YesCount + NoCount, ( Total > 0 -> YesPercent is (YesCount * 100) // Total, NoPercent is (NoCount * 100) // Total, write(' '), write(Question), write(' ('), write(Text), write(')'), nl, write(' ДА: '), write(YesCount), write(' ('), write(YesPercent), write('%)'), nl, write(' НЕТ: '), write(NoCount), write(' ('), write(NoPercent), write('%)'), nl ; write(' '), write(Question), write(': нет данных'), nl ). % ----------------------------------------------- % Демонстрация групп объектов % ----------------------------------------------- demo_object_grouping :- write('Группировка по основным характеристикам:'), nl, analyze_object_groups, nl, write('ПЕРЕСЕЧЕНИЯ ГРУПП:'), nl, demo_group_intersections. demo_group_intersections :- write('Домашние хищники: '), findall(Obj, (characteristic(Obj, is_domestic, yes), characteristic(Obj, is_predator, yes)), DomPred), print_list(DomPred), nl, write('Крупные летающие: '), findall(Obj, (characteristic(Obj, is_large, yes), characteristic(Obj, can_fly, yes)), LargeFlying), print_list(LargeFlying), nl, write('Мелкие дикие хищники: '), findall(Obj, (characteristic(Obj, is_large, no), characteristic(Obj, is_domestic, no), characteristic(Obj, is_predator, yes)), SmallWildPred), print_list(SmallWildPred), nl, write('Летающие без меха: '), findall(Obj, (characteristic(Obj, can_fly, yes), characteristic(Obj, has_fur, no)), FlyingNoFur), print_list(FlyingNoFur), nl. % ----------------------------------------------- % Проверка различимости % ----------------------------------------------- demo_distinguishability :- write('Проверка уникальности объектов:'), nl, check_uniqueness_detailed, nl, write('Примеры различающих вопросов:'), nl, demo_distinguishing_examples. check_uniqueness_detailed :- findall(Obj, object(Obj), Objects), check_uniqueness_for_objects(Objects). check_uniqueness_for_objects([]). check_uniqueness_for_objects([Obj|Rest]) :- find_identical_objects(Obj, Identical), ( Identical = [] -> write('✓ '), write(Obj), write(' - уникален'), nl ; write('✗ '), write(Obj), write(' - неуникален, идентичен: '), print_list(Identical), nl ), check_uniqueness_for_objects(Rest). demo_distinguishing_examples :- write('Примеры различения похожих объектов:'), nl, % Кошка vs хомяк (оба домашние с мехом) write('Кошка vs Хомяк:'), nl, find_distinguishing_questions(кошка, хомяк, Diff1), write(' Различающие вопросы: '), print_list(Diff1), nl, % Лев vs тигр (оба крупные дикие хищники с мехом) write('Лев vs Тигр:'), nl, find_distinguishing_questions(лев, тигр, Diff2), ( Diff2 = [] -> write(' Неразличимы текущими вопросами!'), nl ; write(' Различающие вопросы: '), print_list(Diff2), nl ), % Попугай vs канарейка (обе домашние летающие птицы) write('Попугай vs Канарейка:'), nl, find_distinguishing_questions(попугай, канарейка, Diff3), ( Diff3 = [] -> write(' Неразличимы текущими вопросами!'), nl ; write(' Различающие вопросы: '), print_list(Diff3), nl ). % ----------------------------------------------- % Тестирование идентификации % ----------------------------------------------- demo_identification_tests :- write('Тестирование поиска объектов по характеристикам:'), nl, test_object_identification, nl, write('ДОПОЛНИТЕЛЬНЫЕ ТЕСТЫ:'), nl, demo_additional_identification_tests. demo_additional_identification_tests :- % Тест: только домашние write('Поиск только по признаку "домашнее":'), nl, identify_object_by_characteristics([is_domestic-yes], Domestic), write(' Найдено объектов: '), length(Domestic, DCount), write(DCount), nl, write(' Объекты: '), print_list(Domestic), nl, nl, % Тест: летающие нехищники write('Поиск летающих нехищников:'), nl, identify_object_by_characteristics([can_fly-yes, is_predator-no], FlyingNonPred), write(' Найдено объектов: '), length(FlyingNonPred, FNPCount), write(FNPCount), nl, write(' Объекты: '), print_list(FlyingNonPred), nl, nl, % Тест: крупные без меха write('Поиск крупных без меха:'), nl, identify_object_by_characteristics([is_large-yes, has_fur-no], LargeNoFur), write(' Найдено объектов: '), length(LargeNoFur, LNFCount), write(LNFCount), nl, write(' Объекты: '), print_list(LargeNoFur), nl. % ----------------------------------------------- % Статистический анализ % ----------------------------------------------- demo_statistical_analysis :- write('Подробная статистика по категориям:'), nl, category_statistics, nl, write('АНАЛИЗ РАСПРЕДЕЛЕНИЯ:'), nl, analyze_distribution_balance, nl, write('ЭФФЕКТИВНОСТЬ КЛАССИФИКАЦИИ:'), nl, analyze_classification_efficiency. analyze_distribution_balance :- findall(Q, question(Q, _), Questions), forall(member(Question, Questions), check_question_balance(Question)). check_question_balance(Question) :- findall(_, characteristic(_, Question, yes), YesAnswers), findall(_, characteristic(_, Question, no), NoAnswers), length(YesAnswers, YesCount), length(NoAnswers, NoCount), Total is YesCount + NoCount, ( Total > 0 -> Diff is abs(YesCount - NoCount), Percentage is (Diff * 100) // Total, write(' '), write(Question), write(': '), ( Percentage < 20 -> write('сбалансирован ('), write(Percentage), write('% разброс)') ; Percentage < 40 -> write('умеренно сбалансирован ('), write(Percentage), write('% разброс)') ; write('несбалансирован ('), write(Percentage), write('% разброс)') ), nl ; write(' '), write(Question), write(': нет данных'), nl ). analyze_classification_efficiency :- findall(Obj, object(Obj), Objects), length(Objects, Total), findall(Obj, is_unique_object(Obj), UniqueObjects), length(UniqueObjects, UniqueCount), DuplicateCount is Total - UniqueCount, write('Общее количество объектов: '), write(Total), nl, write('Уникальных объектов: '), write(UniqueCount), nl, write('Неуникальных объектов: '), write(DuplicateCount), nl, ( DuplicateCount = 0 -> write('✓ Все объекты различимы текущими вопросами'), nl ; Efficiency is (UniqueCount * 100) // Total, write('Эффективность различения: '), write(Efficiency), write('%'), nl, ( Efficiency >= 90 -> write('✓ Отличная различимость'), nl ; Efficiency >= 70 -> write('⚠ Хорошая различимость'), nl ; write('✗ Требуется улучшение'), nl ) ). % ----------------------------------------------- % Рекомендации по оптимизации % ----------------------------------------------- demo_optimization_recommendations :- write('Анализ качества предметной области:'), nl, % Проверка покрытия findall(Q, question(Q, _), Questions), findall(Obj, object(Obj), Objects), length(Questions, QCount), length(Objects, OCount), MaxDistinguishable is 2^QCount, write('Текущая ситуация:'), nl, write(' Вопросов: '), write(QCount), nl, write(' Объектов: '), write(OCount), nl, write(' Максимум различимых: '), write(MaxDistinguishable), nl, nl, ( OCount =< MaxDistinguishable -> write('✓ ХОРОШО: Количество вопросов достаточно'), nl ; write('✗ ПРОБЛЕМА: Недостаточно вопросов'), nl, NeededQuestions is ceiling(log(OCount)/log(2)), write(' Рекомендуется минимум '), write(NeededQuestions), write(' вопросов'), nl ), nl, % Рекомендации по балансировке write('РЕКОМЕНДАЦИИ ПО УЛУЧШЕНИЮ:'), nl, provide_improvement_recommendations. provide_improvement_recommendations :- % Найти несбалансированные вопросы findall(Q, unbalanced_question(Q), UnbalancedQuestions), ( UnbalancedQuestions = [] -> write('✓ Все вопросы достаточно сбалансированы'), nl ; write('⚠ Несбалансированные вопросы: '), print_list(UnbalancedQuestions), nl, write(' Рекомендация: добавить объекты для балансировки'), nl ), nl, % Найти неуникальные объекты findall(Obj, \+ is_unique_object(Obj), NonUniqueObjects), ( NonUniqueObjects = [] -> write('✓ Все объекты уникальны'), nl ; write('⚠ Неуникальные объекты найдены'), nl, write(' Рекомендация: добавить дополнительные вопросы'), nl, write(' или изменить характеристики объектов'), nl ), nl, write('ПРЕДЛОЖЕНИЯ ПО ДОПОЛНИТЕЛЬНЫМ ВОПРОСАМ:'), nl, suggest_additional_questions. unbalanced_question(Question) :- findall(_, characteristic(_, Question, yes), YesAnswers), findall(_, characteristic(_, Question, no), NoAnswers), length(YesAnswers, YesCount), length(NoAnswers, NoCount), Total is YesCount + NoCount, Total > 0, Diff is abs(YesCount - NoCount), Percentage is (Diff * 100) // Total, Percentage >= 60. % Считаем несбалансированным если разброс >= 60% suggest_additional_questions :- write('Потенциальные дополнительные вопросы:'), nl, write(' - "Это млекопитающее?" (для различения птиц/рептилий/млекопитающих)'), nl, write(' - "Живет в воде?" (для различения водных и наземных)'), nl, write(' - "Имеет полосы?" (для различения зебры/тигра и других)'), nl, write(' - "Ночное животное?" (для различения по активности)'), nl, write(' - "Может быть домашним питомцем?" (дополнительное уточнение)'), nl. % ----------------------------------------------- % Интерактивные примеры % ----------------------------------------------- example_queries_task5 :- write('=== ПРИМЕРЫ ИНТЕРАКТИВНЫХ ЗАПРОСОВ ЗАДАНИЯ 5 ==='), nl, write('Вы можете выполнить следующие запросы в интерактивной сессии:'), nl, nl, write('1. Основная информация:'), nl, write(' ?- show_domain_stats. % Статистика предметной области'), nl, write(' ?- analyze_domain. % Полный анализ'), nl, write(' ?- category_statistics. % Статистика по категориям'), nl, nl, write('2. Анализ объектов:'), nl, write(' ?- object(X). % Найти все объекты'), nl, write(' ?- characteristic(собака, X, Y). % Характеристики собаки'), nl, write(' ?- object_characteristics(кошка, Chars). % Все характеристики кошки'), nl, nl, write('3. Поиск и идентификация:'), nl, write(' ?- identify_object_by_characteristics([is_domestic-yes], Objects).'), nl, write(' ?- characteristic(X, is_predator, yes). % Найти всех хищников'), nl, write(' ?- characteristic(X, can_fly, yes). % Найти всех летающих'), nl, nl, write('4. Анализ различимости:'), nl, write(' ?- objects_distinguishable(лев, тигр). % Различимы ли лев и тигр'), nl, write(' ?- find_distinguishing_questions(кошка, собака, Questions).'), nl, write(' ?- is_unique_object(попугай). % Уникален ли попугай'), nl, nl, write('5. Групповой анализ:'), nl, write(' ?- analyze_object_groups. % Анализ групп'), nl, write(' ?- check_object_distinguishability. % Проверка различимости'), nl, write(' ?- test_object_identification. % Тестирование идентификации'), nl, nl, write('6. Экспорт данных:'), nl, write(' ?- export_domain_structure(''domain_export.pl''). % Экспорт в файл'), nl, nl.