- •Практическое занятие 1. Основы логического программирования
- •Основные парадигмы программирования
- •Понятие предиката
- •Унификация - процесс нахождения решения в Прологе
- •Факты и правила в Прологе
- •Пример программы на Прологе
- •Практикум 1-1
- •Практикум 1-2
- •Практикум 1-3
- •Контрольное задание 1 Исходные данные
- •Задание 1. Генеалогическое дерево
- •Задание 2. Представление правил
- •Практикум 2-1
- •Практикум 2-2
- •Стандартные предикаты
- •Ввод и вывод
- •Практикум 2-3
- •Описание арифметических операций
- •Практикум 2-4
- •Самостоятельные задания
- •Практическое занятие 3. Управление процессом решения задачи. Поиск с возвратом. Рекурсия
- •Использование предиката fail
- •Практикум 3-1
- •Использование предиката cut
- •Практикум 3-2
- •Использование рекурсии
- •Практикум 3-3
- •Практикум 3-4
- •Практикум 3-5
- •Практикум 3-6
- •Хвостовая рекурсия
- •[Head|Tail] [Голова|Хвост]
- •Практикум 4-1
- •Встроенный предикат findall
- •Практикум 4-2
- •Вычисление длины списка
- •Практикум 4-3
- •Проверка принадлежности элемента списку
- •Практикум 4-4
- •Слияние двух списков
- •Практикум 4-5
- •Вычисление суммы списка чисел
- •Практикум 4-6
- •Практикум 4-7
- •Удаление элемента из списка
- •Практикум 4-8
- •Получение элемента списка по его номеру
- •Практикум 4-9
- •Запись элементов списка в обратном порядке
- •Поиск максимального (минимального) элемента в списке
- •Практикум 4-10
- •Самостоятельные задания
- •Контрольное задание 2 Исходные данные
- •Практическое занятие 5. Решение логических задач
- •Пример простой логической задачи (два измерения)
- •Практикум 5-1
- •Практикум 5-2
- •Пример задачи (три измерения)
- •Практикум 5-3
- •Пример задачи (альтернативные высказывания)
- •Практикум 5-4
- •Практикум 5-5
- •Самостоятельные задания
- •Контрольное задание 3 Исходные данные
- •Задача 1
- •Задача 2
- •Задача 3
- •Задача 4
- •Задача 5
- •Задача 6
- •Задача 7
- •Задача 8
- •Задача 9
- •Задача 10
- •Задача 11
- •Задача 12
- •Задача 13
- •Задача 14
- •Задача 15
- •Задача 16
- •Задача 17
- •Задача 18
- •Задача 19
- •Задача 20
- •Задачи повышенной сложности
Вычисление суммы списка чисел
Для вычисления суммы элементов списка чисел нужно использовать рекурсию, которая может быть можно воспользоваТак как в пустом списке элементов нет, сумма элементов пустого списка равна нулю. Для вычисления суммы элементов непустого списка нужно к сумме элементов хвоста добавить первый элемент списка Пример программы, вычисляющей сумму всех элементов списка чисел, представлен на рис. 4.8
Рис. 4.8. Программы вычисления суммы списка чисел
Практикум 4-6
|
|
Практикум 4-7
|
По данным базы знаний из Практикума 2-1, в которой хранятся сведения о студентах и их средних баллах, вычислите общий средний балл по всем студентам.
|
Удаление элемента из списка
В большинстве практических задач не обойтись без предиката, удаляющего все вхождения заданного значения из списка. Предикат будет зависеть от трех параметров. Первый параметр будет соответствовать исходному списку, второй - значению элемента, который нужно найти в списке и удалить, а третий - результирующий список после удаления элементов.
Если первый элемент окажется удаляемым, то нужно перейти к удалению заданного значения из хвоста списка. Результатом в данном случае должен стать список, полученный путем удаления всех вхождений искомого значения из хвоста первоначального списка, а если первый элемент списка не совпадает с тем, который нужно удалять, то он должен остаться первым элементом результата, и нужно переходить к удалению заданного значения из хвоста исходного списка. Полученный в результате этих удалений список должен войти в ответ в качестве хвоста.
Рис. 4.9. Программа удаления всех вхождений элемента в список
Если нам нужно удалить не все вхождения определенного значения в список, а только первое, то можно добавить отсечение и работа программы прекратится после первого истинного решения.
Рис. 4.10. Программа вычисления элементов списка чисел
Практикум 4-8
|
Напишите программу для исключения из списка всех отрицательных чисел |
Получение элемента списка по его номеру
Предикат имеет арность три: первый аргумент — исходный список, второй аргумент — номер элемента и третий — элемент списка, имеющий заданный номер.
Правила для этой процедуры: отбрасываем по одному элементу с начала списка и отнимаем от N по 1 до тех пор, пока не дойдем до 1, значит этот элемент (голова списка) – искомый.
Рис. 4.11. Программа получения элемента по его порядковому номеру
Практикум 4-9
|
Создайте предикат, возвращающий по списку и двум числам N и M подсписок исходного списка длиной M, состоящий из элементов с номерами от N до N+M. |
Запись элементов списка в обратном порядке
Разработаем предикат, позволяющий "обратить" список (записать его элементы в обратном порядке). Предикат будет иметь два аргумента: первый — исходный список, второй — результат.
Для того чтобы получить "перевернутый" список, можно "перевернуть" его хвост и добавить в конец первый элемент исходного списка.
Рис. 4.12. Программа записи элементов списка в обратном порядке
Можно написать данный предикат без использования предиката conc. В этом случае нужно добавить дополнительный аргумент, в котором будет "накапливаться" результат. От исходного списка берется по элементу (голова) и дописывается к вспомогательному списку. Когда исходный список будет исчерпан, "накопленный" список передается в третий аргумент в качестве ответа. До этого момента третий аргумент остается от шага к шагу неконкретизированным. Реализация этой процедуры будет выглядеть следующим образом:
Рис. 4.13. Хвостовая рекурсия для записи элементов списка в обратном порядке