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.

349 lines
15 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 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.