% =============================================== % ДЕМОНСТРАЦИЯ LAB9 TASK3 % Полная демонстрация решений задач с массивами % =============================================== % Главная демонстрация demo :- write('=== ДЕМОНСТРАЦИЯ LAB9 TASK3: ЗАДАЧИ С МАССИВАМИ ==='), nl, write('Вариант 4: Задачи 4, 16, 28'), nl, nl, % Демонстрация задачи 4 write('ЗАДАЧА 4: ИНДЕКСЫ ЭЛЕМЕНТОВ В УБЫВАЮЩЕМ ПОРЯДКЕ'), nl, write('================================================'), nl, demo_task4, nl, % Демонстрация задачи 16 write('ЗАДАЧА 16: ЭЛЕМЕНТЫ МЕЖДУ ПЕРВЫМ И ВТОРЫМ МАКСИМАЛЬНЫМ'), nl, write('======================================================'), nl, demo_task16, nl, % Демонстрация задачи 28 write('ЗАДАЧА 28: ЭЛЕМЕНТЫ МЕЖДУ ПЕРВЫМ И ПОСЛЕДНИМ МАКСИМАЛЬНЫМ'), nl, write('========================================================='), nl, demo_task28, nl, % Анализ модульной структуры write('АНАЛИЗ МОДУЛЬНОЙ СТРУКТУРЫ'), nl, write('=========================='), nl, demo_modular_structure, nl, % Практические примеры write('ПРАКТИЧЕСКИЕ ПРИМЕРЫ'), nl, write('==================='), nl, demo_practical_examples, nl, write('=== ДЕМОНСТРАЦИЯ TASK3 ЗАВЕРШЕНА ==='), nl. % ----------------------------------------------- % Демонстрация задачи 4 % ----------------------------------------------- demo_task4 :- write('Задача: Дан целочисленный массив. Вывести индексы массива'), nl, write('в том порядке, в котором соответствующие им элементы'), nl, write('образуют убывающую последовательность.'), nl, nl, write('ПРИНЦИП РАБОТЫ:'), nl, write('1. Создаем пары (индекс, значение)'), nl, write('2. Сортируем пары по убыванию значений'), nl, write('3. Извлекаем индексы из отсортированных пар'), nl, nl, % Примеры TestCases4 = [ ([3,1,4,1,5], "Смешанные числа"), ([5,4,3,2,1], "Уже убывающая"), ([1,2,3,4,5], "Возрастающая"), ([2,2,2,2], "Одинаковые элементы"), ([7], "Один элемент") ], write('ПРИМЕРЫ РАБОТЫ:'), nl, write('Массив | Индексы в порядке убывания | Пояснение'), nl, write('----------------|----------------------------|----------'), nl, forall(member((List, Description), TestCases4), demo_task4_case(List, Description)), nl, write('МОДУЛЬНАЯ СТРУКТУРА ЗАДАЧИ 4:'), nl, write('• task4_read/1 - чтение массива (List неунифицированная)'), nl, write('• task4_logic/2 - логика работы (List унифицированная, Result неунифицированная)'), nl, write('• task4_output/1 - вывод результата (Result унифицированная)'), nl, nl, write('УНИФИКАЦИЯ В task4_logic([3,1,4,1,5], Result):'), nl, write('1. List = [3,1,4,1,5] (унифицированная при вызове)'), nl, write('2. create_index_value_pairs создает [(1,3),(2,1),(3,4),(4,1),(5,5)]'), nl, write('3. sort_pairs_by_value_desc сортирует по убыванию: [(5,5),(3,4),(1,3),(2,1),(4,1)]'), nl, write('4. extract_indices извлекает индексы: [5,3,1,2,4]'), nl, write('5. Result унифицируется с [5,3,1,2,4]'), nl. demo_task4_case(List, Description) :- task4_logic(List, Result), format('~w~15| | ~w~25| | ~w~n', [List, Result, Description]). % ----------------------------------------------- % Демонстрация задачи 16 % ----------------------------------------------- demo_task16 :- write('Задача: Дан целочисленный массив. Найти элементы,'), nl, write('расположенные между первым и вторым максимальным.'), nl, nl, write('ПРИНЦИП РАБОТЫ:'), nl, write('1. Находим максимальный элемент массива'), nl, write('2. Находим позицию первого вхождения максимума'), nl, write('3. Находим позицию второго вхождения максимума'), nl, write('4. Извлекаем элементы между этими позициями'), nl, nl, % Примеры TestCases16 = [ ([1,5,2,3,5,4], "Максимум встречается дважды"), ([9,1,2,3,9], "Максимум в начале и конце"), ([1,7,7,2], "Максимумы рядом"), ([3,8,1,4,8,2,8], "Максимум встречается трижды"), ([1,2,9,3,4], "Только один максимум") ], write('ПРИМЕРЫ РАБОТЫ:'), nl, write('Массив | Элементы между 1-м и 2-м макс. | Пояснение'), nl, write('-------------------|----------------------------------|----------'), nl, forall(member((List, Description), TestCases16), demo_task16_case(List, Description)), nl, write('МОДУЛЬНАЯ СТРУКТУРА ЗАДАЧИ 16:'), nl, write('• task16_read/1 - чтение массива'), nl, write('• task16_logic/2 - логика работы'), nl, write('• task16_output/1 - вывод результата'), nl, nl, write('УНИФИКАЦИЯ В task16_logic([1,5,2,3,5,4], Result):'), nl, write('1. List = [1,5,2,3,5,4] (унифицированная)'), nl, write('2. find_max_element находит MaxElement = 5'), nl, write('3. find_first_occurrence находит FirstPos = 2'), nl, write('4. find_second_occurrence находит SecondPos = 5'), nl, write('5. extract_elements_between_positions извлекает элементы: [2,3]'), nl, write('6. Result унифицируется с [2,3]'), nl. demo_task16_case(List, Description) :- ( task16_logic(List, Result) -> format('~w~18| | ~w~31| | ~w~n', [List, Result, Description]) ; format('~w~18| | ~w~31| | ~w~n', [List, "Ошибка/Нет второго макс.", Description]) ). % ----------------------------------------------- % Демонстрация задачи 28 % ----------------------------------------------- demo_task28 :- write('Задача: Дан целочисленный массив. Найти элементы,'), nl, write('расположенные между первым и последним максимальным.'), nl, nl, write('ПРИНЦИП РАБОТЫ:'), nl, write('1. Находим максимальный элемент массива'), nl, write('2. Находим позицию первого вхождения максимума'), nl, write('3. Находим позицию последнего вхождения максимума'), nl, write('4. Извлекаем элементы между этими позициями'), nl, nl, % Примеры TestCases28 = [ ([1,5,2,3,5,4,5], "Максимум встречается трижды"), ([9,1,2,3,9], "Максимум в начале и конце"), ([1,2,9,3,4], "Только один максимум"), ([1,8,8,8,2], "Максимум повторяется подряд"), ([6,3,6,1,4,6], "Максимум в разных местах") ], write('ПРИМЕРЫ РАБОТЫ:'), nl, write('Массив | Элементы между 1-м и последним макс. | Пояснение'), nl, write('---------------------|---------------------------------------|----------'), nl, forall(member((List, Description), TestCases28), demo_task28_case(List, Description)), nl, write('МОДУЛЬНАЯ СТРУКТУРА ЗАДАЧИ 28:'), nl, write('• task28_read/1 - чтение массива'), nl, write('• task28_logic/2 - логика работы'), nl, write('• task28_output/1 - вывод результата'), nl, nl, write('УНИФИКАЦИЯ В task28_logic([1,5,2,3,5,4,5], Result):'), nl, write('1. List = [1,5,2,3,5,4,5] (унифицированная)'), nl, write('2. find_max_element находит MaxElement = 5'), nl, write('3. find_first_occurrence находит FirstPos = 2'), nl, write('4. find_last_occurrence находит LastPos = 7'), nl, write('5. extract_elements_between_positions извлекает: [2,3,5,4]'), nl, write('6. Result унифицируется с [2,3,5,4]'), nl. demo_task28_case(List, Description) :- task28_logic(List, Result), format('~w~20| | ~w~36| | ~w~n', [List, Result, Description]). % ----------------------------------------------- % Анализ модульной структуры % ----------------------------------------------- demo_modular_structure :- write('ПРИНЦИПЫ МОДУЛЬНОЙ СТРУКТУРЫ В TASK3:'), nl, nl, write('1. РАЗДЕЛЕНИЕ ОБЯЗАННОСТЕЙ:'), nl, write(' • Предикат чтения: отвечает только за ввод данных'), nl, write(' • Предикат логики: содержит основной алгоритм'), nl, write(' • Предикат вывода: отвечает только за отображение результата'), nl, nl, write('2. МИНИМАЛЬНОЕ КОЛИЧЕСТВО АРГУМЕНТОВ:'), nl, write(' ✓ Правильно: task4_logic(List, Result)'), nl, write(' ✗ Неправильно: task4_logic(List, 0, Helper, Result)'), nl, write(' Логический предикат не содержит вспомогательных переменных'), nl, nl, write('3. СОСТОЯНИЯ УНИФИКАЦИИ:'), nl, write(' • При вызове логики: входные данные унифицированы'), nl, write(' • При завершении: результат унифицирован с ответом'), nl, write(' • Промежуточные переменные унифицируются в процессе'), nl, nl, write('4. ПЕРЕИСПОЛЬЗОВАНИЕ ПРЕДИКАТОВ:'), nl, write(' • read_list/1 переиспользуется из task1'), nl, write(' • Общие алгоритмы вынесены в отдельные предикаты'), nl, write(' • Избегается дублирование кода'), nl, nl, write('5. ПРИМЕРЫ КОРРЕКТНОЙ УНИФИКАЦИИ:'), nl, demo_unification_examples. demo_unification_examples :- write(' Пример для task4_logic([3,1,4], Result):'), nl, write(' ├─ Входные: List=[3,1,4] (унифицированная)'), nl, write(' ├─ Выходные: Result (неунифицированная)'), nl, write(' ├─ Промежуточные переменные унифицируются пошагово:'), nl, write(' │ ├─ Pairs = [(1,3),(2,1),(3,4)]'), nl, write(' │ ├─ SortedPairs = [(3,4),(1,3),(2,1)]'), nl, write(' │ └─ SortedIndices = [3,1,2]'), nl, write(' └─ Result унифицируется с [3,1,2]'), nl. % ----------------------------------------------- % Практические примеры % ----------------------------------------------- demo_practical_examples :- write('ПРАКТИЧЕСКИЕ ПРИМЕНЕНИЯ РЕШЕННЫХ ЗАДАЧ:'), nl, nl, write('СЦЕНАРИЙ 1: Анализ результатов соревнований'), nl, write('─────────────────────────────────────────'), nl, demo_competition_analysis, nl, write('СЦЕНАРИЙ 2: Обработка временных рядов'), nl, write('────────────────────────────────────'), nl, demo_time_series_analysis, nl, write('СЦЕНАРИЙ 3: Игровая механика'), nl, write('────────────────────────────'), nl, demo_game_mechanics. demo_competition_analysis :- CompetitionScores = [85, 92, 78, 92, 88, 90, 92], write('Результаты участников: '), write(CompetitionScores), nl, % Задача 4: Ранжирование участников task4_logic(CompetitionScores, RankOrder), write('Ранжирование (лучшие первые): участники '), write(RankOrder), nl, % Задача 16: Участники между первым и вторым призером task16_logic(CompetitionScores, BetweenWinners), write('Участники между 1-м и 2-м призером: '), write(BetweenWinners), nl, % Задача 28: Все участники между призерами task28_logic(CompetitionScores, AllBetween), write('Все участники между призерами: '), write(AllBetween), nl. demo_time_series_analysis :- TemperatureData = [22, 25, 23, 25, 24, 26, 25], write('Температурные данные: '), write(TemperatureData), nl, % Задача 4: Дни по убыванию температуры task4_logic(TemperatureData, TempOrder), write('Дни по убыванию температуры: '), write(TempOrder), nl, % Задача 28: Данные между пиками task28_logic(TemperatureData, BetweenPeaks), write('Данные между температурными пиками: '), write(BetweenPeaks), nl. demo_game_mechanics :- PlayerScores = [100, 150, 120, 150, 140, 160, 150], write('Очки игроков: '), write(PlayerScores), nl, % Задача 4: Таблица лидеров task4_logic(PlayerScores, Leaderboard), write('Таблица лидеров (игроки): '), write(Leaderboard), nl, % Задача 16: Игроки между лидерами task16_logic(PlayerScores, BetweenLeaders), write('Игроки между лидерами: '), write(BetweenLeaders), nl. % ----------------------------------------------- % Интерактивные примеры % ----------------------------------------------- demo_interactive_examples :- write('=== ИНТЕРАКТИВНЫЕ ПРИМЕРЫ TASK3 ==='), nl, write('Вы можете попробовать следующие запросы:'), nl, nl, write('1. Задача 4 - Индексы в убывающем порядке:'), nl, write(' ?- task4_logic([3,1,4,1,5], Result).'), nl, write(' Result = [5,3,1,2,4]'), nl, nl, write('2. Задача 16 - Между первым и вторым максимальным:'), nl, write(' ?- task16_logic([1,5,2,3,5,4], Result).'), nl, write(' Result = [2,3]'), nl, nl, write('3. Задача 28 - Между первым и последним максимальным:'), nl, write(' ?- task28_logic([1,5,2,3,5,4,5], Result).'), nl, write(' Result = [2,3,5,4]'), nl, nl, write('4. Полный интерактивный режим:'), nl, write(' ?- interactive_demo.'), nl, nl, write('5. Примеры с готовыми данными:'), nl, write(' ?- show_examples.'), nl, nl.