% =============================================== % ДИЗАЙН ПРЕДМЕТНОЙ ОБЛАСТИ - ЗАДАНИЕ 5 % Структура для акинатора: 30 объектов, 5 вопросов % =============================================== % =============================================== % ОПРЕДЕЛЕНИЕ ОБЪЕКТОВ (30 ОБЪЕКТОВ) % =============================================== % Домашние животные object(собака). object(кошка). object(попугай). object(хомяк). object(рыбка). object(черепаха). object(канарейка). object(кролик). % Дикие животные object(лев). object(тигр). object(слон). object(жираф). object(зебра). object(волк). object(медведь). object(лиса). object(олень). object(заяц). % Птицы object(орел). object(сова). object(ворон). object(голубь). object(ласточка). % Рептилии и земноводные object(игуана). object(змея). object(лягушка). object(крокодил). % Насекомые object(бабочка). object(пчела). object(муравей). % =============================================== % ВОПРОСЫ (5 ОСНОВНЫХ ВОПРОСОВ) % =============================================== question(is_domestic, 'Это домашнее животное?'). question(has_fur, 'Есть ли у животного шерсть или мех?'). question(can_fly, 'Умеет ли животное летать?'). question(is_large, 'Это крупное животное (больше кошки)?'). question(is_predator, 'Это хищник?'). % =============================================== % ХАРАКТЕРИСТИКИ ОБЪЕКТОВ % =============================================== % Домашние животные characteristic(собака, is_domestic, yes). characteristic(собака, has_fur, yes). characteristic(собака, can_fly, no). characteristic(собака, is_large, yes). characteristic(собака, is_predator, no). characteristic(кошка, is_domestic, yes). characteristic(кошка, has_fur, yes). characteristic(кошка, can_fly, no). characteristic(кошка, is_large, no). characteristic(кошка, is_predator, yes). characteristic(попугай, is_domestic, yes). characteristic(попугай, has_fur, no). characteristic(попугай, can_fly, yes). characteristic(попугай, is_large, no). characteristic(попугай, is_predator, no). characteristic(хомяк, is_domestic, yes). characteristic(хомяк, has_fur, yes). characteristic(хомяк, can_fly, no). characteristic(хомяк, is_large, no). characteristic(хомяк, is_predator, no). characteristic(рыбка, is_domestic, yes). characteristic(рыбка, has_fur, no). characteristic(рыбка, can_fly, no). characteristic(рыбка, is_large, no). characteristic(рыбка, is_predator, no). characteristic(черепаха, is_domestic, yes). characteristic(черепаха, has_fur, no). characteristic(черепаха, can_fly, no). characteristic(черепаха, is_large, no). characteristic(черепаха, is_predator, no). characteristic(канарейка, is_domestic, yes). characteristic(канарейка, has_fur, no). characteristic(канарейка, can_fly, yes). characteristic(канарейка, is_large, no). characteristic(канарейка, is_predator, no). characteristic(кролик, is_domestic, yes). characteristic(кролик, has_fur, yes). characteristic(кролик, can_fly, no). characteristic(кролик, is_large, no). characteristic(кролик, is_predator, no). % Дикие животные - крупные хищники characteristic(лев, is_domestic, no). characteristic(лев, has_fur, yes). characteristic(лев, can_fly, no). characteristic(лев, is_large, yes). characteristic(лев, is_predator, yes). characteristic(тигр, is_domestic, no). characteristic(тигр, has_fur, yes). characteristic(тигр, can_fly, no). characteristic(тигр, is_large, yes). characteristic(тигр, is_predator, yes). characteristic(волк, is_domestic, no). characteristic(волк, has_fur, yes). characteristic(волк, can_fly, no). characteristic(волк, is_large, yes). characteristic(волк, is_predator, yes). characteristic(медведь, is_domestic, no). characteristic(медведь, has_fur, yes). characteristic(медведь, can_fly, no). characteristic(медведь, is_large, yes). characteristic(медведь, is_predator, yes). characteristic(лиса, is_domestic, no). characteristic(лиса, has_fur, yes). characteristic(лиса, can_fly, no). characteristic(лиса, is_large, no). characteristic(лиса, is_predator, yes). % Дикие животные - крупные травоядные characteristic(слон, is_domestic, no). characteristic(слон, has_fur, no). characteristic(слон, can_fly, no). characteristic(слон, is_large, yes). characteristic(слон, is_predator, no). characteristic(жираф, is_domestic, no). characteristic(жираф, has_fur, no). characteristic(жираф, can_fly, no). characteristic(жираф, is_large, yes). characteristic(жираф, is_predator, no). characteristic(зебра, is_domestic, no). characteristic(зебра, has_fur, no). characteristic(зебра, can_fly, no). characteristic(зебра, is_large, yes). characteristic(зебра, is_predator, no). characteristic(олень, is_domestic, no). characteristic(олень, has_fur, yes). characteristic(олень, can_fly, no). characteristic(олень, is_large, yes). characteristic(олень, is_predator, no). % Дикие животные - мелкие characteristic(заяц, is_domestic, no). characteristic(заяц, has_fur, yes). characteristic(заяц, can_fly, no). characteristic(заяц, is_large, no). characteristic(заяц, is_predator, no). % Птицы - хищные characteristic(орел, is_domestic, no). characteristic(орел, has_fur, no). characteristic(орел, can_fly, yes). characteristic(орел, is_large, yes). characteristic(орел, is_predator, yes). characteristic(сова, is_domestic, no). characteristic(сова, has_fur, no). characteristic(сова, can_fly, yes). characteristic(сова, is_large, no). characteristic(сова, is_predator, yes). % Птицы - всеядные/зерноядные characteristic(ворон, is_domestic, no). characteristic(ворон, has_fur, no). characteristic(ворон, can_fly, yes). characteristic(ворон, is_large, no). characteristic(ворон, is_predator, no). characteristic(голубь, is_domestic, no). characteristic(голубь, has_fur, no). characteristic(голубь, can_fly, yes). characteristic(голубь, is_large, no). characteristic(голубь, is_predator, no). characteristic(ласточка, is_domestic, no). characteristic(ласточка, has_fur, no). characteristic(ласточка, can_fly, yes). characteristic(ласточка, is_large, no). characteristic(ласточка, is_predator, no). % Рептилии и земноводные characteristic(игуана, is_domestic, no). characteristic(игуана, has_fur, no). characteristic(игуана, can_fly, no). characteristic(игуана, is_large, no). characteristic(игуана, is_predator, no). characteristic(змея, is_domestic, no). characteristic(змея, has_fur, no). characteristic(змея, can_fly, no). characteristic(змея, is_large, no). characteristic(змея, is_predator, yes). characteristic(лягушка, is_domestic, no). characteristic(лягушка, has_fur, no). characteristic(лягушка, can_fly, no). characteristic(лягушка, is_large, no). characteristic(лягушка, is_predator, no). characteristic(крокодил, is_domestic, no). characteristic(крокодил, has_fur, no). characteristic(крокодил, can_fly, no). characteristic(крокодил, is_large, yes). characteristic(крокодил, is_predator, yes). % Насекомые characteristic(бабочка, is_domestic, no). characteristic(бабочка, has_fur, no). characteristic(бабочка, can_fly, yes). characteristic(бабочка, is_large, no). characteristic(бабочка, is_predator, no). characteristic(пчела, is_domestic, no). characteristic(пчела, has_fur, no). characteristic(пчела, can_fly, yes). characteristic(пчела, is_large, no). characteristic(пчела, is_predator, no). characteristic(муравей, is_domestic, no). characteristic(муравей, has_fur, no). characteristic(муравей, can_fly, no). characteristic(муравей, is_large, no). characteristic(муравей, is_predator, no). % =============================================== % АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ % =============================================== % Получить все характеристики объекта object_characteristics(Object, Characteristics) :- findall(Char-Value, characteristic(Object, Char, Value), Characteristics). % Проверить уникальность объекта по характеристикам is_unique_object(Object) :- object_characteristics(Object, Chars1), \+ (object(OtherObject), OtherObject \= Object, object_characteristics(OtherObject, Chars2), Chars1 = Chars2). % Найти объекты с одинаковыми характеристиками find_identical_objects(Object, IdenticalObjects) :- object_characteristics(Object, Chars), findall(Other, (object(Other), Other \= Object, object_characteristics(Other, Chars)), IdenticalObjects). % Анализ покрытия вопросами question_coverage_analysis :- findall(Q, question(Q, _), Questions), length(Questions, QCount), findall(Obj, object(Obj), Objects), length(Objects, OCount), write('Анализ покрытия:'), nl, write('Количество вопросов: '), write(QCount), nl, write('Количество объектов: '), write(OCount), nl, MaxCombinations is 2^QCount, write('Максимум комбинаций: '), write(MaxCombinations), nl, ( OCount =< MaxCombinations -> write('✓ Вопросов достаточно для различения всех объектов'), nl ; write('✗ Недостаточно вопросов для различения всех объектов'), nl ). % Проверить различимость всех объектов check_object_distinguishability :- write('Проверка различимости объектов:'), nl, findall(Obj, object(Obj), Objects), check_all_pairs_distinguishable(Objects). check_all_pairs_distinguishable([]). check_all_pairs_distinguishable([H|T]) :- check_object_against_list(H, T), check_all_pairs_distinguishable(T). check_object_against_list(_, []). check_object_against_list(Obj1, [Obj2|Rest]) :- ( objects_distinguishable(Obj1, Obj2) -> write('✓ '), write(Obj1), write(' и '), write(Obj2), write(' различимы'), nl ; write('✗ '), write(Obj1), write(' и '), write(Obj2), write(' неразличимы'), nl ), check_object_against_list(Obj1, Rest). % Проверить, различимы ли два объекта objects_distinguishable(Obj1, Obj2) :- characteristic(Obj1, Question, Value1), characteristic(Obj2, Question, Value2), Value1 \= Value2, !. % Найти минимальный набор вопросов для различения объектов find_distinguishing_questions(Obj1, Obj2, Questions) :- findall(Q, (characteristic(Obj1, Q, V1), characteristic(Obj2, Q, V2), V1 \= V2), Questions). % Анализ групп объектов analyze_object_groups :- write('Анализ групп объектов:'), nl, % Домашние vs дикие findall(Obj, characteristic(Obj, is_domestic, yes), Domestic), findall(Obj, characteristic(Obj, is_domestic, no), Wild), length(Domestic, DomCount), length(Wild, WildCount), write('Домашние животные ('), write(DomCount), write('): '), print_list(Domestic), nl, write('Дикие животные ('), write(WildCount), write('): '), print_list(Wild), nl, nl, % С мехом vs без меха findall(Obj, characteristic(Obj, has_fur, yes), Furry), findall(Obj, characteristic(Obj, has_fur, no), NoFur), length(Furry, FurCount), length(NoFur, NoFurCount), write('С мехом ('), write(FurCount), write('): '), print_list(Furry), nl, write('Без меха ('), write(NoFurCount), write('): '), print_list(NoFur), nl, nl, % Летающие vs нелетающие findall(Obj, characteristic(Obj, can_fly, yes), Flying), findall(Obj, characteristic(Obj, can_fly, no), NonFlying), length(Flying, FlyCount), length(NonFlying, NoFlyCount), write('Летающие ('), write(FlyCount), write('): '), print_list(Flying), nl, write('Нелетающие ('), write(NoFlyCount), write('): '), print_list(NonFlying), nl, nl, % Крупные vs мелкие findall(Obj, characteristic(Obj, is_large, yes), Large), findall(Obj, characteristic(Obj, is_large, no), Small), length(Large, LargeCount), length(Small, SmallCount), write('Крупные ('), write(LargeCount), write('): '), print_list(Large), nl, write('Мелкие ('), write(SmallCount), write('): '), print_list(Small), nl, nl, % Хищники vs нехищники findall(Obj, characteristic(Obj, is_predator, yes), Predators), findall(Obj, characteristic(Obj, is_predator, no), NonPredators), length(Predators, PredCount), length(NonPredators, NoPredCount), write('Хищники ('), write(PredCount), write('): '), print_list(Predators), nl, write('Нехищники ('), write(NoPredCount), write('): '), print_list(NonPredators), nl. % Вывести список print_list([]). print_list([H]) :- write(H). print_list([H|T]) :- write(H), write(', '), print_list(T). % =============================================== % ДЕМОНСТРАЦИОННЫЕ ФУНКЦИИ % =============================================== % Показать статистику предметной области show_domain_stats :- findall(Obj, object(Obj), Objects), findall(Q, question(Q, _), Questions), length(Objects, ObjCount), length(Questions, QCount), write('=== СТАТИСТИКА ПРЕДМЕТНОЙ ОБЛАСТИ ==='), nl, write('Количество объектов: '), write(ObjCount), nl, write('Количество вопросов: '), write(QCount), nl, nl, write('ОБЪЕКТЫ:'), nl, forall(object(Obj), (write(' - '), write(Obj), nl)), nl, write('ВОПРОСЫ:'), nl, forall(question(Q, Text), (write(' '), write(Q), write(': '), write(Text), nl)). % Показать анализ вопросов show_questions_analysis :- write('=== АНАЛИЗ ВОПРОСОВ ==='), nl, question_coverage_analysis, nl, analyze_object_groups. % Анализ предметной области analyze_domain :- write('=== ПОЛНЫЙ АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ ==='), nl, nl, show_domain_stats, nl, show_questions_analysis, nl, write('=== ПРОВЕРКА РАЗЛИЧИМОСТИ ==='), nl, check_object_distinguishability, nl, write('=== ПОИСК НЕУНИКАЛЬНЫХ ОБЪЕКТОВ ==='), nl, find_non_unique_objects, nl, write('=== АНАЛИЗ ЗАВЕРШЕН ==='), nl. % Найти неуникальные объекты find_non_unique_objects :- findall(Obj, object(Obj), Objects), find_non_unique_in_list(Objects). find_non_unique_in_list([]). find_non_unique_in_list([H|T]) :- find_identical_objects(H, Identical), ( Identical = [] -> true ; write('Объект '), write(H), write(' имеет идентичные характеристики с: '), print_list(Identical), nl ), find_non_unique_in_list(T). % Симуляция определения объекта по характеристикам identify_object_by_characteristics(Characteristics, PossibleObjects) :- findall(Obj, (object(Obj), forall(member(Char-Value, Characteristics), characteristic(Obj, Char, Value))), PossibleObjects). % Тестирование различения объектов test_object_identification :- write('=== ТЕСТИРОВАНИЕ ОПРЕДЕЛЕНИЯ ОБЪЕКТОВ ==='), nl, % Тест 1: Домашняя кошка write('Тест 1: Поиск домашнего, мелкого, хищника с мехом'), nl, TestChars1 = [is_domestic-yes, is_large-no, is_predator-yes, has_fur-yes], identify_object_by_characteristics(TestChars1, Results1), write('Найденные объекты: '), print_list(Results1), nl, nl, % Тест 2: Крупный дикий хищник write('Тест 2: Поиск дикого, крупного хищника'), nl, TestChars2 = [is_domestic-no, is_large-yes, is_predator-yes], identify_object_by_characteristics(TestChars2, Results2), write('Найденные объекты: '), print_list(Results2), nl, nl, % Тест 3: Летающие домашние write('Тест 3: Поиск домашних летающих'), nl, TestChars3 = [is_domestic-yes, can_fly-yes], identify_object_by_characteristics(TestChars3, Results3), write('Найденные объекты: '), print_list(Results3), nl, nl. % =============================================== % ЭКСПОРТ И ИМПОРТ ДАННЫХ % =============================================== % Экспорт структуры предметной области export_domain_structure(Filename) :- tell(Filename), write('% Экспорт предметной области'), nl, write('% Сгенерировано автоматически'), nl, nl, % Экспорт объектов write('% Объекты'), nl, forall(object(Obj), (write('object('), write(Obj), write(').'), nl)), nl, % Экспорт вопросов write('% Вопросы'), nl, forall(question(Q, Text), (write('question('), write(Q), write(', '), write(''''), write(Text), write(''''), write(').'), nl)), nl, % Экспорт характеристик write('% Характеристики'), nl, forall(characteristic(Obj, Char, Value), (write('characteristic('), write(Obj), write(', '), write(Char), write(', '), write(Value), write(').'), nl)), told, write('Предметная область экспортирована в файл: '), write(Filename), nl. % Подсчет статистики по категориям category_statistics :- write('=== СТАТИСТИКА ПО КАТЕГОРИЯМ ==='), nl, % Подсчет по типам животных count_domestic_wild, count_by_size, count_by_mobility, count_by_diet, count_by_covering. count_domestic_wild :- findall(_, characteristic(_, is_domestic, yes), Domestic), findall(_, characteristic(_, is_domestic, no), Wild), length(Domestic, DomCount), length(Wild, WildCount), write('Домашние/дикие: '), write(DomCount), write('/'), write(WildCount), nl. count_by_size :- findall(_, characteristic(_, is_large, yes), Large), findall(_, characteristic(_, is_large, no), Small), length(Large, LargeCount), length(Small, SmallCount), write('Крупные/мелкие: '), write(LargeCount), write('/'), write(SmallCount), nl. count_by_mobility :- findall(_, characteristic(_, can_fly, yes), Flying), findall(_, characteristic(_, can_fly, no), Ground), length(Flying, FlyCount), length(Ground, GroundCount), write('Летающие/наземные: '), write(FlyCount), write('/'), write(GroundCount), nl. count_by_diet :- findall(_, characteristic(_, is_predator, yes), Predators), findall(_, characteristic(_, is_predator, no), NonPredators), length(Predators, PredCount), length(NonPredators, NonPredCount), write('Хищники/нехищники: '), write(PredCount), write('/'), write(NonPredCount), nl. count_by_covering :- findall(_, characteristic(_, has_fur, yes), Furry), findall(_, characteristic(_, has_fur, no), NonFurry), length(Furry, FurCount), length(NonFurry, NonFurCount), write('С мехом/без меха: '), write(FurCount), write('/'), write(NonFurCount), nl.