# Lab 9: Основные предикаты Prolog ## Описание Lab 9 содержит реализацию основных предикатов языка Prolog, включая математические операции, рекурсивные алгоритмы и операции со списками. ## Структура ``` lab9/ ├── task1/ # Основные предикаты Prolog │ ├── predicates.pl # Реализация всех предикатов │ ├── tests.pl # Автоматические тесты │ ├── demo.pl # Демонстрация функциональности │ ├── Dockerfile # Docker контейнер │ └── Makefile # Команды сборки и запуска ├── Makefile # Главный Makefile └── README.md # Документация ``` ## Task 1: Основные предикаты ### Реализованные предикаты: 1. **max(+X, +Y, +U, -Z)** - максимальное из трех чисел 2. **fact_up(+N, -X)** - факториал (рекурсия вверх) 3. **fact_down(+N, -X)** - факториал (рекурсия вниз) 4. **digit_sum_up(+N, -Sum)** - сумма цифр (рекурсия вверх) 5. **digit_sum_down(+N, -Sum)** - сумма цифр (рекурсия вниз) 6. **square_free(+N)** - проверка свободности от квадратов 7. **read_list(-List)** - чтение списка с клавиатуры 8. **write_list(+List)** - вывод списка на экран 9. **sum_list_down(+List, ?Sum)** - сумма списка (рекурсия вниз) 10. **sum_list_up(+List, ?Sum)** - сумма списка (рекурсия вверх) 11. **remove_by_digit_sum(+List, +TargetSum, -Result)** - удаление по сумме цифр 12. **list_sum_program** - интерактивная программа работы со списками ## Команды ### Из корневой директории lab9: ```bash # Основные команды make task1 # Запуск task1 (базовая информация) make demo-task1 # Демонстрация всех предикатов make test-task1 # Автоматические тесты make interactive-task1 # Интерактивная сессия make info-task1 # Подробная информация # Служебные команды make build-task1 # Сборка Docker образа make clean-task1 # Очистка Docker образов make help # Справка по командам ``` ### Из директории task1: ```bash make run # Базовая информация make demo # Полная демонстрация make test # Автоматические тесты make interactive # Интерактивная сессия Prolog make info # Подробная информация make trace # Запуск с трассировкой ``` ## Примеры использования ### Математические операции: ```prolog ?- max(5, 3, 7, Z). % Z = 7 ?- fact_up(5, X). % X = 120 ?- fact_down(5, X). % X = 120 ?- digit_sum_up(123, Sum). % Sum = 6 ?- digit_sum_down(123, Sum). % Sum = 6 ``` ### Проверка свободности от квадратов: ```prolog ?- square_free(15). % true ?- square_free(12). % false (делится на 4) ``` ### Операции со списками: ```prolog ?- sum_list_down([1,2,3,4], S). % S = 10 ?- sum_list_up([1,2,3,4], S). % S = 10 ?- write_list([a,b,c]). % [a, b, c] ?- remove_by_digit_sum([12,21,34,43], 3, R). % R = [34,43] ``` ### Интерактивные программы: ```prolog ?- list_sum_program. % Интерактивная работа со списками ?- interactive_demo. % Интерактивное меню всех функций ``` ## Особенности реализации ### Рекурсия вверх vs вниз: - **Рекурсия вверх**: традиционная рекурсия, вычисления при возврате - **Рекурсия вниз**: с аккумулятором, хвостовая рекурсия, эффективнее по памяти ### Обработка списков: - Поддержка пустых списков - Корректная обработка отрицательных чисел - Сохранение порядка элементов ### Проверка свободности от квадратов: - Алгоритм проверяет деление на квадраты простых чисел - Оптимизирован для чисел любого размера ## Тестирование Система включает: - **Автоматические тесты** для всех предикатов - **Тесты производительности** для сравнения рекурсий - **Стресс-тесты** для проверки надежности - **Демонстрационные примеры** для обучения Запуск тестов: `make test-task1` ## Docker Все задания выполняются в изолированной Docker среде с SWI-Prolog: - Базовый образ: `swipl:stable` - Автоматическая сборка при запуске - Поддержка интерактивного режима ## Требования - Docker - Make - Терминал с поддержкой UTF-8 (для корректного отображения русского текста)