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.

304 lines
16 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.

% ===============================================
% ДЕМОНСТРАЦИЯ 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.