% =============================================== % Демонстрационные запросы для lab8 task4 % Акинатор с модификациями % =============================================== % Запуск демонстрации demo :- write('=== ДЕМОНСТРАЦИЯ ЗАДАНИЯ 4: МОДИФИЦИРОВАННЫЙ АКИНАТОР ==='), nl, nl, % 1. Основная информация write('1. ОСНОВНАЯ ИНФОРМАЦИЯ'), nl, write('======================'), nl, demo_basic_info, nl, % 2. Демонстрация простых объектов write('2. ОБЪЕКТЫ БЕЗ ДОПОЛНИТЕЛЬНЫХ ВОПРОСОВ'), nl, write('======================================'), nl, demo_simple_objects_detailed, nl, % 3. Демонстрация сложных объектов write('3. ОБЪЕКТЫ С ДОПОЛНИТЕЛЬНЫМИ ВОПРОСАМИ'), nl, write('====================================='), nl, demo_complex_objects_detailed, nl, % 4. Тестирование распознавания write('4. ТЕСТИРОВАНИЕ РАСПОЗНАВАНИЯ ОБЪЕКТОВ'), nl, write('===================================='), nl, demo_recognition_tests, nl, % 5. Сравнение типов объектов write('5. СРАВНЕНИЕ ТИПОВ ОБЪЕКТОВ'), nl, write('==========================='), nl, demo_object_comparison, nl, % 6. Инструкции по использованию write('6. ИНСТРУКЦИИ ПО ИСПОЛЬЗОВАНИЮ'), nl, write('=============================='), nl, demo_usage_instructions, nl, write('=== ДЕМОНСТРАЦИЯ ЗАДАНИЯ 4 ЗАВЕРШЕНА ==='), nl. % ----------------------------------------------- % Основная информация % ----------------------------------------------- demo_basic_info :- write('Модифицированный акинатор включает:'), nl, akinator_stats, nl, write('Типы объектов:'), nl, write('- Простые: определяются базовыми вопросами'), nl, write('- Сложные: требуют дополнительных вопросов'), nl. % ----------------------------------------------- % Демонстрация простых объектов % ----------------------------------------------- demo_simple_objects_detailed :- write('Простые объекты определяются базовыми характеристиками:'), nl, SimpleObjects = [собака, кошка, рыбка, попугай], forall(member(Obj, SimpleObjects), demo_simple_object_rules(Obj)). demo_simple_object_rules(собака) :- write('СОБАКА:'), nl, write(' - Есть шерсть: ДА'), nl, write(' - Умеет летать: НЕТ'), nl, write(' - Живет в воде: НЕТ'), nl, write(' - Издает звуки: ДА'), nl, test_object_recognition_simple(собака), nl. demo_simple_object_rules(кошка) :- write('КОШКА:'), nl, write(' - Есть шерсть: ДА'), nl, write(' - Умеет летать: НЕТ'), nl, write(' - Живет в воде: НЕТ'), nl, write(' - Издает звуки: ДА'), nl, write(' - НЕ маленькая'), nl, test_object_recognition_simple(кошка), nl. demo_simple_object_rules(рыбка) :- write('РЫБКА:'), nl, write(' - Есть шерсть: НЕТ'), nl, write(' - Умеет летать: НЕТ'), nl, write(' - Живет в воде: ДА'), nl, test_object_recognition_simple(рыбка), nl. demo_simple_object_rules(попугай) :- write('ПОПУГАЙ:'), nl, write(' - Есть шерсть: НЕТ'), nl, write(' - Умеет летать: ДА'), nl, write(' - Издает звуки: ДА'), nl, write(' - НЕ поет специально'), nl, test_object_recognition_simple(попугай), nl. % ----------------------------------------------- % Демонстрация сложных объектов % ----------------------------------------------- demo_complex_objects_detailed :- write('Сложные объекты требуют дополнительных вопросов:'), nl, ComplexObjects = [хомяк, черепаха, игуана, канарейка], forall(member(Obj, ComplexObjects), demo_complex_object_rules(Obj)). demo_complex_object_rules(хомяк) :- write('ХОМЯК (требует дополнительный вопрос "is_small"):'), nl, write(' - Есть шерсть: ДА'), nl, write(' - Умеет летать: НЕТ'), nl, write(' - Живет в воде: НЕТ'), nl, write(' - Маленький: ДА'), nl, write(' - Издает звуки: НЕТ'), nl, test_object_recognition_complex(хомяк), nl. demo_complex_object_rules(черепаха) :- write('ЧЕРЕПАХА (требует дополнительные вопросы "has_shell", "is_reptile"):'), nl, write(' - Есть шерсть: НЕТ'), nl, write(' - Умеет летать: НЕТ'), nl, write(' - Есть панцирь: ДА'), nl, write(' - Рептилия: ДА'), nl, test_object_recognition_complex(черепаха), nl. demo_complex_object_rules(игуана) :- write('ИГУАНА (требует дополнительный вопрос "is_reptile"):'), nl, write(' - Есть шерсть: НЕТ'), nl, write(' - Умеет летать: НЕТ'), nl, write(' - Живет в воде: НЕТ'), nl, write(' - Рептилия: ДА'), nl, write(' - Панцирь: НЕТ'), nl, test_object_recognition_complex(игуана), nl. demo_complex_object_rules(канарейка) :- write('КАНАРЕЙКА (требует дополнительные вопросы "can_sing", "is_small"):'), nl, write(' - Есть шерсть: НЕТ'), nl, write(' - Умеет летать: ДА'), nl, write(' - Издает звуки: ДА'), nl, write(' - Умеет петь: ДА'), nl, write(' - Маленькая: ДА'), nl, test_object_recognition_complex(канарейка), nl. % ----------------------------------------------- % Тестирование распознавания объектов % ----------------------------------------------- demo_recognition_tests :- write('Проверка правильности определения объектов:'), nl, nl, % Тесты простых объектов write('ПРОСТЫЕ ОБЪЕКТЫ:'), nl, test_simple_objects, nl, % Тесты сложных объектов write('СЛОЖНЫЕ ОБЪЕКТЫ:'), nl, test_complex_objects, nl. test_simple_objects :- SimpleObjects = [собака, кошка, рыбка, попугай], forall(member(Obj, SimpleObjects), test_simple_object_full(Obj)). test_complex_objects :- ComplexObjects = [хомяк, черепаха, игуана, канарейка], forall(member(Obj, ComplexObjects), test_complex_object_full(Obj)). test_simple_object_full(Object) :- setup_answers_for_object(Object), ( knows(Object) -> write('✓ '), write(Object), write(' - определен правильно'), nl ; write('✗ '), write(Object), write(' - ошибка определения'), nl ), retractall(answer(_, _)). test_complex_object_full(Object) :- setup_answers_for_object(Object), ( knows(Object) -> write('✓ '), write(Object), write(' - определен правильно'), nl ; write('✗ '), write(Object), write(' - ошибка определения'), nl ), retractall(answer(_, _)). % Настройка ответов для каждого объекта setup_answers_for_object(собака) :- retractall(answer(_, _)), assert(answer(has_fur, yes)), assert(answer(can_fly, no)), assert(answer(lives_in_water, no)), assert(answer(makes_sound, yes)). setup_answers_for_object(кошка) :- retractall(answer(_, _)), assert(answer(has_fur, yes)), assert(answer(can_fly, no)), assert(answer(lives_in_water, no)), assert(answer(makes_sound, yes)), assert(answer(is_small, no)). setup_answers_for_object(рыбка) :- retractall(answer(_, _)), assert(answer(has_fur, no)), assert(answer(can_fly, no)), assert(answer(lives_in_water, yes)). setup_answers_for_object(попугай) :- retractall(answer(_, _)), assert(answer(has_fur, no)), assert(answer(can_fly, yes)), assert(answer(makes_sound, yes)), assert(answer(can_sing, no)). setup_answers_for_object(хомяк) :- retractall(answer(_, _)), assert(answer(has_fur, yes)), assert(answer(can_fly, no)), assert(answer(lives_in_water, no)), assert(answer(is_small, yes)), assert(answer(makes_sound, no)). setup_answers_for_object(черепаха) :- retractall(answer(_, _)), assert(answer(has_fur, no)), assert(answer(can_fly, no)), assert(answer(has_shell, yes)), assert(answer(is_reptile, yes)). setup_answers_for_object(игуана) :- retractall(answer(_, _)), assert(answer(has_fur, no)), assert(answer(can_fly, no)), assert(answer(lives_in_water, no)), assert(answer(is_reptile, yes)), assert(answer(has_shell, no)). setup_answers_for_object(канарейка) :- retractall(answer(_, _)), assert(answer(has_fur, no)), assert(answer(can_fly, yes)), assert(answer(makes_sound, yes)), assert(answer(can_sing, yes)), assert(answer(is_small, yes)). % ----------------------------------------------- % Сравнение типов объектов % ----------------------------------------------- demo_object_comparison :- write('Анализ различий между типами объектов:'), nl, nl, write('БАЗОВЫЕ ВОПРОСЫ (для всех объектов):'), nl, BaseQuestions = [has_fur, can_fly, lives_in_water, makes_sound], forall(member(Q, BaseQuestions), (question(Q, Text), write(' - '), write(Text), nl)), nl, write('ДОПОЛНИТЕЛЬНЫЕ ВОПРОСЫ (только для сложных объектов):'), nl, AdditionalQuestions = [is_small, has_shell, is_reptile, can_sing], forall(member(Q, AdditionalQuestions), (question(Q, Text), write(' - '), write(Text), nl)), nl, write('ПРИМЕРЫ РАЗЛИЧЕНИЯ:'), nl, write('- Кошка vs Хомяк: размер (is_small)'), nl, write('- Попугай vs Канарейка: умение петь (can_sing)'), nl, write('- Черепаха vs Игуана: наличие панциря (has_shell)'), nl, nl. % ----------------------------------------------- % Инструкции по использованию % ----------------------------------------------- demo_usage_instructions :- write('Как использовать акинатор:'), nl, nl, write('1. ИНТЕРАКТИВНАЯ ИГРА:'), nl, write(' ?- start_akinator.'), nl, write(' Загадайте одно из животных и отвечайте на вопросы'), nl, nl, write('2. ДЕМОНСТРАЦИОННЫЕ КОМАНДЫ:'), nl, write(' ?- demo. % Полная демонстрация'), nl, write(' ?- show_objects. % Показать все объекты'), nl, write(' ?- show_questions. % Показать все вопросы'), nl, write(' ?- akinator_stats. % Статистика системы'), nl, write(' ?- test_object_recognition. % Тестирование'), nl, nl, write('3. ПРОВЕРКА КОНКРЕТНЫХ ОБЪЕКТОВ:'), nl, write(' Настройте ответы и проверьте распознавание:'), nl, write(' ?- retractall(answer(_,_)), assert(answer(has_fur,yes)), knows(X).'), nl, nl, write('4. MAKEFILE КОМАНДЫ:'), nl, write(' make run % Запуск с основной информацией'), nl, write(' make demo % Запуск демонстрации'), nl, write(' make interactive % Интерактивная сессия'), nl, write(' make test % Запуск тестов'), nl, nl. % ----------------------------------------------- % Вспомогательные тесты % ----------------------------------------------- test_object_recognition_simple(Object) :- setup_answers_for_object(Object), ( knows(Object) -> write(' → Распознавание: УСПЕШНО') ; write(' → Распознавание: ОШИБКА') ), retractall(answer(_, _)). test_object_recognition_complex(Object) :- setup_answers_for_object(Object), ( knows(Object) -> write(' → Распознавание: УСПЕШНО') ; write(' → Распознавание: ОШИБКА') ), retractall(answer(_, _)). % ----------------------------------------------- % Интерактивные примеры % ----------------------------------------------- example_queries_task4 :- write('=== ПРИМЕРЫ ИНТЕРАКТИВНЫХ ЗАПРОСОВ ЗАДАНИЯ 4 ==='), nl, write('Вы можете выполнить следующие запросы в интерактивной сессии:'), nl, nl, write('1. Запуск акинатора:'), nl, write(' ?- start_akinator. % Интерактивная игра'), nl, nl, write('2. Проверка объектов:'), nl, write(' ?- object(X). % Найти все объекты'), nl, write(' ?- knows(собака). % Проверить правила для собаки'), nl, write(' ?- knows(хомяк). % Проверить правила для хомяка'), nl, nl, write('3. Работа с ответами:'), nl, write(' ?- assert(answer(has_fur,yes)). % Установить ответ'), nl, write(' ?- answer(has_fur, X). % Проверить ответ'), nl, write(' ?- retractall(answer(_,_)). % Очистить все ответы'), nl, nl, write('4. Тестирование:'), nl, write(' ?- test_object_recognition. % Полное тестирование'), nl, write(' ?- demo_recognition_tests. % Демо-тесты'), nl, nl, write('5. Информационные запросы:'), nl, write(' ?- show_objects. % Показать объекты'), nl, write(' ?- show_questions. % Показать вопросы'), nl, write(' ?- akinator_stats. % Статистика'), nl, write(' ?- demo. % Полная демонстрация'), nl, nl.