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