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