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