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.

134 lines
5.8 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.

# 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 (для корректного отображения русского текста)