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.

374 lines
18 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.

% ===============================================
% Демонстрационные запросы для 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.