% =============================================== % Демонстрационные запросы для lab8 task6 % Полный акинатор % =============================================== % Запуск демонстрации demo :- write('=== ДЕМОНСТРАЦИЯ ЗАДАНИЯ 6: ПОЛНЫЙ АКИНАТОР ==='), nl, nl, % 1. Информация о системе write('1. ИНФОРМАЦИЯ О СИСТЕМЕ АКИНАТОРА'), nl, write('=================================='), nl, demo_system_info, nl, % 2. Демонстрация базы знаний write('2. ДЕМОНСТРАЦИЯ БАЗЫ ЗНАНИЙ'), nl, write('============================'), nl, demo_knowledge_base, nl, % 3. Тестирование логики определения write('3. ТЕСТИРОВАНИЕ ЛОГИКИ ОПРЕДЕЛЕНИЯ'), nl, write('=================================='), nl, demo_detection_logic, nl, % 4. Анализ эффективности write('4. АНАЛИЗ ЭФФЕКТИВНОСТИ'), nl, write('======================='), nl, demo_efficiency_analysis, nl, % 5. Симуляция игровых сценариев write('5. СИМУЛЯЦИЯ ИГРОВЫХ СЦЕНАРИЕВ'), nl, write('=============================='), nl, demo_game_scenarios, nl, % 6. Демонстрация обучения write('6. ДЕМОНСТРАЦИЯ СИСТЕМЫ ОБУЧЕНИЯ'), nl, write('================================='), nl, demo_learning_system, nl, % 7. Инструкции по использованию write('7. ИНСТРУКЦИИ ПО ИСПОЛЬЗОВАНИЮ'), nl, write('==============================='), nl, demo_usage_guide, nl, write('=== ДЕМОНСТРАЦИЯ ЗАДАНИЯ 6 ЗАВЕРШЕНА ==='), nl. % ----------------------------------------------- % Информация о системе % ----------------------------------------------- demo_system_info :- akinator_info, nl, write('РАСШИРЕННЫЕ ВОЗМОЖНОСТИ:'), nl, write('- Интеллектуальный алгоритм задавания вопросов'), nl, write('- Система обучения на ошибках'), nl, write('- Статистика игровых сессий'), nl, write('- Анализ эффективности различения'), nl, write('- Адаптивная стратегия угадывания'), nl. % ----------------------------------------------- % Демонстрация базы знаний % ----------------------------------------------- demo_knowledge_base :- write('СТРУКТУРА БАЗЫ ЗНАНИЙ:'), nl, % Показать количество объектов по категориям demo_category_breakdown, nl, % Показать примеры характеристик write('ПРИМЕРЫ ХАРАКТЕРИСТИК:'), nl, demo_sample_characteristics, nl, % Анализ покрытия write('АНАЛИЗ ПОКРЫТИЯ ВОПРОСОВ:'), nl, demo_coverage_analysis. demo_category_breakdown :- Categories = [ (is_domestic, 'Домашние животные'), (is_mammal, 'Млекопитающие'), (can_fly, 'Летающие'), (is_predator, 'Хищники'), (is_large, 'Крупные животные'), (has_stripes, 'Полосатые'), (is_nocturnal, 'Ночные'), (lives_in_water, 'Водные'), (can_swim, 'Умеющие плавать') ], forall(member((Category, Description), Categories), demo_single_category(Category, Description)). demo_single_category(Category, Description) :- findall(Obj, characteristic(Obj, Category, yes), Objects), length(Objects, Count), write(' '), write(Description), write(': '), write(Count), write(' ('), ( Count =< 5 -> write_list(Objects); write('много объектов') ), write(')'), nl. demo_sample_characteristics :- SampleAnimals = [собака, тигр, орел, лягушка, пчела], forall(member(Animal, SampleAnimals), demo_animal_characteristics(Animal)). demo_animal_characteristics(Animal) :- write(' '), write(Animal), write(': '), findall(Char-Value, characteristic(Animal, Char, Value), Characteristics), demo_compact_characteristics(Characteristics), nl. demo_compact_characteristics([]). demo_compact_characteristics([Char-yes|Rest]) :- write(Char), write('+'), ( Rest \= [] -> write(', '); true ), demo_compact_characteristics(Rest). demo_compact_characteristics([_-no|Rest]) :- demo_compact_characteristics(Rest). demo_coverage_analysis :- findall(Q, question(Q, _), Questions), findall(Obj, object(Obj), Objects), length(Questions, QCount), length(Objects, OCount), MaxCombinations is 2^QCount, write(' Вопросов: '), write(QCount), nl, write(' Объектов: '), write(OCount), nl, write(' Максимум различимых: '), write(MaxCombinations), nl, Coverage is (OCount * 100) // MaxCombinations, write(' Использование пространства: '), write(Coverage), write('%'), nl, ( OCount =< MaxCombinations -> write(' ✓ Покрытие достаточное'), nl ; write(' ⚠ Требуется больше вопросов'), nl ). % ----------------------------------------------- % Тестирование логики определения % ----------------------------------------------- demo_detection_logic :- write('ТЕСТИРОВАНИЕ АЛГОРИТМА ОПРЕДЕЛЕНИЯ:'), nl, % Тест поиска кандидатов write('Тест 1: Поиск по одному критерию'), nl, test_single_criterion_search, nl, % Тест поиска по нескольким критериям write('Тест 2: Поиск по нескольким критериям'), nl, test_multiple_criteria_search, nl, % Тест выбора лучшего вопроса write('Тест 3: Выбор оптимального вопроса'), nl, test_best_question_selection, nl. test_single_criterion_search :- TestCriteria = [ (is_domestic-yes, 'домашние'), (can_fly-yes, 'летающие'), (is_predator-yes, 'хищники'), (has_stripes-yes, 'полосатые') ], forall(member((Criterion-Value, Description), TestCriteria), test_single_search(Criterion, Value, Description)). test_single_search(Criterion, Value, Description) :- retractall(answer(_, _)), assert(answer(Criterion, Value)), get_current_candidates(Candidates), length(Candidates, Count), write(' '), write(Description), write(': '), write(Count), write(' кандидатов'), ( Count =< 5 -> (write(' ('), write_list(Candidates), write(')')) ; true ), nl. test_multiple_criteria_search :- TestCombinations = [ ([is_domestic-yes, is_predator-yes], 'домашние хищники'), ([can_fly-yes, is_large-yes], 'крупные летающие'), ([is_mammal-yes, lives_in_water-yes], 'водные млекопитающие'), ([has_stripes-yes, is_large-yes], 'крупные полосатые') ], forall(member((Criteria, Description), TestCombinations), test_multiple_search(Criteria, Description)). test_multiple_search(Criteria, Description) :- retractall(answer(_, _)), forall(member(Criterion-Value, Criteria), assert(answer(Criterion, Value))), get_current_candidates(Candidates), length(Candidates, Count), write(' '), write(Description), write(': '), write(Count), write(' кандидатов'), ( Count =< 3 -> (write(' ('), write_list(Candidates), write(')')) ; true ), nl. test_best_question_selection :- % Тест на разных наборах кандидатов TestScenarios = [ ([собака, кошка, кролик, хомяк], 'домашние животные'), ([лев, тигр, волк, медведь], 'крупные хищники'), ([попугай, канарейка, орел, сова], 'птицы') ], forall(member((Candidates, Description), TestScenarios), test_question_selection(Candidates, Description)). test_question_selection(Candidates, Description) :- write(' '), write(Description), write(': '), find_best_question(Candidates, BestQuestion), question(BestQuestion, Text), write('лучший вопрос - '), write(BestQuestion), write(' ('), write(Text), write(')'), nl. % ----------------------------------------------- % Анализ эффективности % ----------------------------------------------- demo_efficiency_analysis :- write('АНАЛИЗ ЭФФЕКТИВНОСТИ СИСТЕМЫ:'), nl, % Анализ уникальности demo_uniqueness_analysis, nl, % Анализ сложности различения demo_discrimination_complexity, nl, % Прогноз производительности demo_performance_prediction. demo_uniqueness_analysis :- write('АНАЛИЗ УНИКАЛЬНОСТИ ОБЪЕКТОВ:'), nl, findall(Obj, object(Obj), AllObjects), findall(Obj, is_unique_object(Obj), UniqueObjects), length(AllObjects, Total), length(UniqueObjects, Unique), Duplicates is Total - Unique, write(' Всего объектов: '), write(Total), nl, write(' Уникальных: '), write(Unique), nl, write(' Дубликатов: '), write(Duplicates), nl, ( Duplicates > 0 -> write(' Примеры дубликатов:'), nl, demo_duplicate_examples ; write(' ✓ Все объекты уникальны'), nl ). demo_duplicate_examples :- findall(Obj, \+ is_unique_object(Obj), NonUniqueObjects), FirstFew = [Obj1, Obj2, Obj3, Obj4, Obj5], ( append(FirstFew, _, NonUniqueObjects) -> Examples = FirstFew ; Examples = NonUniqueObjects ), forall(member(Example, Examples), demo_single_duplicate(Example)). demo_single_duplicate(Object) :- findall(Other, (object(Other), Other \= Object, same_characteristics(Object, Other)), Duplicates), ( Duplicates \= [] -> write(' '), write(Object), write(' = '), write_list(Duplicates), nl ; true ). demo_discrimination_complexity :- write('СЛОЖНОСТЬ РАЗЛИЧЕНИЯ:'), nl, % Анализ минимального количества вопросов для различения пар SamplePairs = [ (собака, кошка), (лев, тигр), (попугай, канарейка), (слон, жираф) ], forall(member((Obj1, Obj2), SamplePairs), demo_pair_discrimination(Obj1, Obj2)). demo_pair_discrimination(Obj1, Obj2) :- findall(Question, (characteristic(Obj1, Question, Val1), characteristic(Obj2, Question, Val2), Val1 \= Val2), DiffQuestions), length(DiffQuestions, DiffCount), write(' '), write(Obj1), write(' vs '), write(Obj2), write(': '), ( DiffCount = 0 -> write('неразличимы') ; DiffCount = 1 -> write('1 вопрос ('), write_list(DiffQuestions), write(')') ; write(DiffCount), write(' вопросов') ), nl. demo_performance_prediction :- write('ПРОГНОЗ ПРОИЗВОДИТЕЛЬНОСТИ:'), nl, % Оценка среднего количества вопросов findall(Obj, object(Obj), Objects), length(Objects, Total), AverageQuestions is ceiling(log(Total)/log(2)), write(' Теоретический минимум вопросов: '), write(AverageQuestions), nl, % Анализ реального количества вопросов для различных животных SampleAnimals = [собака, лев, попугай, рыбка, бабочка], write(' Практические тесты:'), nl, forall(member(Animal, SampleAnimals), demo_animal_questions(Animal)). demo_animal_questions(Animal) :- % Симуляция: сколько вопросов нужно для определения животного retractall(answer(_, _)), simulate_questions_for_animal(Animal, 0, QuestionCount), write(' '), write(Animal), write(': ~'), write(QuestionCount), write(' вопросов'), nl. simulate_questions_for_animal(Animal, Count, FinalCount) :- get_current_candidates(Candidates), length(Candidates, CandidateCount), ( CandidateCount =< 1 -> FinalCount = Count ; % Найти лучший вопрос и ответить на него согласно характеристикам животного find_best_question(Candidates, BestQuestion), characteristic(Animal, BestQuestion, Answer), assert(answer(BestQuestion, Answer)), NewCount is Count + 1, simulate_questions_for_animal(Animal, NewCount, FinalCount) ). % ----------------------------------------------- % Симуляция игровых сценариев % ----------------------------------------------- demo_game_scenarios :- write('СИМУЛЯЦИЯ РАЗЛИЧНЫХ ИГРОВЫХ СЦЕНАРИЕВ:'), nl, % Сценарий 1: Быстрое угадывание write('Сценарий 1: Легкое животное (собака)'), nl, demo_easy_scenario, nl, % Сценарий 2: Сложное угадывание write('Сценарий 2: Сложное животное (тигр vs лев)'), nl, demo_difficult_scenario, nl, % Сценарий 3: Редкое животное write('Сценарий 3: Редкое животное (игуана)'), nl, demo_rare_scenario, nl. demo_easy_scenario :- Animal = собака, write(' Загаданное животное: '), write(Animal), nl, retractall(answer(_, _)), % Симуляция последовательности вопросов Questions = [is_domestic, is_large, has_fur, is_predator], demo_question_sequence(Animal, Questions, 1). demo_difficult_scenario :- Animal = тигр, write(' Загаданное животное: '), write(Animal), nl, write(' Конкурент: лев (очень похожие характеристики)'), nl, retractall(answer(_, _)), % Найти различающий вопрос findall(Q, (characteristic(тигр, Q, V1), characteristic(лев, Q, V2), V1 \= V2), DiffQuestions), write(' Ключевые различающие вопросы: '), write_list(DiffQuestions), nl, % Симуляция до точки различения Questions = [is_domestic, is_mammal, is_large, is_predator, has_stripes], demo_question_sequence(Animal, Questions, 1). demo_rare_scenario :- Animal = игуана, write(' Загаданное животное: '), write(Animal), nl, retractall(answer(_, _)), % Показать, что делает это животное уникальным write(' Уникальные характеристики: рептилия, не хищник, не живет в воде'), nl, Questions = [is_mammal, is_predator, lives_in_water, can_fly], demo_question_sequence(Animal, Questions, 1). demo_question_sequence(_, [], _). demo_question_sequence(Animal, [Question|RestQuestions], Num) :- characteristic(Animal, Question, Answer), assert(answer(Question, Answer)), question(Question, Text), write(' Вопрос '), write(Num), write(': '), write(Text), write(' -> '), write(Answer), nl, get_current_candidates(Candidates), length(Candidates, Count), write(' Остается кандидатов: '), write(Count), ( Count =< 5 -> (write(' ('), write_list(Candidates), write(')')) ; true ), nl, NextNum is Num + 1, demo_question_sequence(Animal, RestQuestions, NextNum). % ----------------------------------------------- % Демонстрация системы обучения % ----------------------------------------------- demo_learning_system :- write('ВОЗМОЖНОСТИ СИСТЕМЫ ОБУЧЕНИЯ:'), nl, write('1. Анализ ошибок:'), nl, write(' - Система запоминает неправильные догадки'), nl, write(' - Анализирует различия между объектами'), nl, write(' - Предлагает улучшения базы знаний'), nl, nl, write('2. Адаптация стратегии:'), nl, write(' - Выбор оптимальных вопросов'), nl, write(' - Балансировка между скоростью и точностью'), nl, write(' - Учет частоты загадывания объектов'), nl, nl, write('3. Пример анализа ошибки:'), nl, demo_error_analysis_example, nl, write('4. Статистика обучения:'), nl, demo_learning_statistics. demo_error_analysis_example :- write(' Сценарий: Акинатор угадал "лев", а было "тигр"'), nl, write(' Анализ различий:'), nl, findall(Q-V1-V2, (characteristic(лев, Q, V1), characteristic(тигр, Q, V2), V1 \= V2), Differences), forall(member(Question-LionVal-TigerVal, Differences), (question(Question, Text), write(' '), write(Text), write(': лев='), write(LionVal), write(', тигр='), write(TigerVal), nl)). demo_learning_statistics :- write(' Метрики для отслеживания:'), nl, write(' - Процент успешных угадываний'), nl, write(' - Среднее количество вопросов'), nl, write(' - Частота ошибок по категориям'), nl, write(' - Эффективность различных стратегий'), nl. % ----------------------------------------------- % Инструкции по использованию % ----------------------------------------------- demo_usage_guide :- write('ПОЛНОЕ РУКОВОДСТВО ПО ИСПОЛЬЗОВАНИЮ:'), nl, nl, write('1. ЗАПУСК ИГРЫ:'), nl, write(' ?- start_akinator.'), nl, write(' Система проведет вас через весь процесс игры'), nl, nl, write('2. ДЕМОНСТРАЦИОННЫЕ КОМАНДЫ:'), nl, write(' ?- demo. % Полная демонстрация'), nl, write(' ?- demo_akinator. % Демо акинатора'), nl, write(' ?- akinator_info. % Информация о системе'), nl, write(' ?- akinator_statistics. % Статистика эффективности'), nl, nl, write('3. ТЕСТИРОВАНИЕ:'), nl, write(' ?- test_akinator_logic. % Тест логики'), nl, write(' ?- simulate_game(собака). % Симуляция для животного'), nl, write(' ?- random_animal(X). % Случайное животное'), nl, nl, write('4. АНАЛИЗ ДАННЫХ:'), nl, write(' ?- get_current_candidates(X). % Текущие кандидаты'), nl, write(' ?- find_best_question([собака,кошка], Q). % Лучший вопрос'), nl, write(' ?- is_unique_object(тигр). % Проверка уникальности'), nl, nl, write('5. УТИЛИТЫ:'), nl, write(' ?- reset_akinator. % Сброс состояния'), nl, write(' ?- show_session_stats. % Статистика сессии'), nl, write(' ?- export_session_stats(''stats.pl''). % Экспорт статистики'), nl, nl, write('6. MAKEFILE КОМАНДЫ:'), nl, write(' make run % Информация об акинаторе'), nl, write(' make interactive % Интерактивная игра'), nl, write(' make demo % Демонстрация возможностей'), nl, write(' make test % Запуск тестов'), nl, write(' make trace % Трассировка выполнения'), nl, nl, write('7. СОВЕТЫ ПО ИГРЕ:'), nl, write(' - Отвечайте честно на все вопросы'), nl, write(' - Если акинатор ошибся, сообщите правильный ответ'), nl, write(' - Система учится на ваших ответах'), nl, write(' - Попробуйте загадать разных животных'), nl, nl. % ----------------------------------------------- % Интерактивные примеры % ----------------------------------------------- example_queries_task6 :- write('=== ПРИМЕРЫ ИНТЕРАКТИВНЫХ ЗАПРОСОВ ЗАДАНИЯ 6 ==='), nl, write('Вы можете выполнить следующие запросы в интерактивной сессии:'), nl, nl, write('1. Запуск акинатора:'), nl, write(' ?- start_akinator. % Полная игра'), nl, write(' ?- demo_akinator. % Демонстрация'), nl, nl, write('2. Анализ и статистика:'), nl, write(' ?- akinator_info. % Информация о системе'), nl, write(' ?- akinator_statistics. % Подробная статистика'), nl, write(' ?- show_session_stats. % Статистика сессии'), nl, nl, write('3. Тестирование логики:'), nl, write(' ?- test_akinator_logic. % Тест алгоритмов'), nl, write(' ?- simulate_game(собака). % Симуляция игры'), nl, write(' ?- get_current_candidates(Candidates). % Поиск кандидатов'), nl, nl, write('4. Работа с вопросами:'), nl, write(' ?- find_best_question([лев,тигр], Question). % Лучший вопрос'), nl, write(' ?- question(X, Text). % Все вопросы'), nl, write(' ?- characteristic(собака, X, Y). % Характеристики'), nl, nl, write('5. Анализ уникальности:'), nl, write(' ?- is_unique_object(тигр). % Проверка уникальности'), nl, write(' ?- same_characteristics(лев, тигр). % Сравнение объектов'), nl, write(' ?- find_distinguishing_characteristics(лев, тигр). % Различия'), nl, nl, write('6. Утилиты:'), nl, write(' ?- reset_akinator. % Сброс состояния'), nl, write(' ?- random_animal(Animal). % Случайное животное'), nl, write(' ?- export_session_stats(''file.pl''). % Экспорт данных'), nl, nl.