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