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.

533 lines
23 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 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.