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.
..
task1
task2
task3
task4
Makefile
README.md

README.md

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:

# Основные команды
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:

make run               # Базовая информация
make demo              # Полная демонстрация
make test              # Автоматические тесты
make interactive       # Интерактивная сессия Prolog
make info              # Подробная информация
make trace             # Запуск с трассировкой

Примеры использования

Математические операции:

?- 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

Проверка свободности от квадратов:

?- square_free(15).              % true
?- square_free(12).              % false (делится на 4)

Операции со списками:

?- 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]

Интерактивные программы:

?- list_sum_program.             % Интерактивная работа со списками
?- interactive_demo.             % Интерактивное меню всех функций

Особенности реализации

Рекурсия вверх vs вниз:

  • Рекурсия вверх: традиционная рекурсия, вычисления при возврате
  • Рекурсия вниз: с аккумулятором, хвостовая рекурсия, эффективнее по памяти

Обработка списков:

  • Поддержка пустых списков
  • Корректная обработка отрицательных чисел
  • Сохранение порядка элементов

Проверка свободности от квадратов:

  • Алгоритм проверяет деление на квадраты простых чисел
  • Оптимизирован для чисел любого размера

Тестирование

Система включает:

  • Автоматические тесты для всех предикатов
  • Тесты производительности для сравнения рекурсий
  • Стресс-тесты для проверки надежности
  • Демонстрационные примеры для обучения

Запуск тестов: make test-task1

Docker

Все задания выполняются в изолированной Docker среде с SWI-Prolog:

  • Базовый образ: swipl:stable
  • Автоматическая сборка при запуске
  • Поддержка интерактивного режима

Требования

  • Docker
  • Make
  • Терминал с поддержкой UTF-8 (для корректного отображения русского текста)