- •Практическое занятие 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
- •Задачи повышенной сложности
Поиск максимального (минимального) элемента в списке
Для пустого списка понятие максимального элемента не имеет смысла. В списке, состоящем из одного элемента, этот элемент и будет максимальным.
Рекурсивное правило для поиска максимального элемента можно записать так:
max_элемент=max(голова, max_элемент(хвост))
В правиле используется предикат max, который находит максимум из двух чисел (см. рис.2.1).
Поиск максимального числа можно осуществить попарным сравнением: найти максимум из двух первых элементов списка, оставить из них максимальное значение, продолжить сравнение, пока не останется только один элемент – он и будет максимальным во всем списке.
Практикум 4-10
|
Создайте предикат, для нахождения максимального значения в списке чисел |
Самостоятельные задания
1.Ниже представлен пример Пролог – программы:
DOMAINS
dog_list=symbol*
PREDICATES
dogs(dog_list).
find_it(symbol,dog_list).
CLAUSES
find_it(X,[X,_]).
find_it(X,[_,Y]):-find_it(X,[Y]).
GOAL
find_it(«болонка»,[«лайка», «дог» ]),write(“да”).
Что напечатает эта программа?
Напишите программу для определения максимального элемента в списке
Создайте предикат, находящий предпоследний элемент списка. Создайте предикат, удаляющий предпоследний элемент списка.
Контрольное задание 2 Исходные данные
Вариант |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
Задачи |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
28 |
30 |
|
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
Задачи
Создайте предикат, порождающий список, состоящий из случайного количества (но не более 10) случайных чисел от 0 до 100.
Напишите программу для отношения ДВОЙНОЙ_СПИСОК (Список1, Список2), в котором каждый элемент Списка1 удваивается и записывается в Список2, например, ДВОЙНОЙ_СПИСОК ( [1,2,3],[1,1,2,2,3,3] ).
Определить отношение РАЗНОСТЬ(Список1, Список2, Список3), где элементы списка Список3 принадлежат Списку1, но не принадлежат Списку2.
Определить отношение СДВИГ(Список1, Список2) таким образом, чтобы список Список2 представлял собой список Список1, "циклически сдвинутый" влево на один символ, например, СДВИГ([a,b,c,d], [d,a,b,c]).
Треугольное число с индексом N - это сумма всех натуральных чисел до N включительно. Напишите программу, задающую отношение triangle(N,T), истинное, если T - треугольное число с индексом N.
По кругу расположено N человек. Начиная с некоторой позиции, мы считаем по кругу и каждый второй человек выбывает из круга, при этом круг смыкается. Напишите программу, которая определяет порядок, в котором люди выбывают из круга, например, ВЫБ(2, [a,b,c,d,e,f,g], [b,d,f,a,e,c,g])
По кругу расположено N человек. Начиная с некоторой позиции, мы считаем по кругу и каждый третий человек выбывает из круга, при этом круг смыкается. Напишите программу, которая определяет порядок, в котором люди выбывают из круга, например, ВЫБ(3, [a,b,c,d,e,f,g], [c,f,b,g,e,a,d])
Напишите программу, которая подсчитывает число вхождений каждого элемента списка L и формирует новый список L1, в котором каждый элемент - это список, состоящий из элемента и числа его вхождений в список L. Например, если L=[f, d, f, g, a, f, d ], то L1=[[f, 3], [d, 2], [g, 1], [a, 1] ].
Определите два предиката ЧЕТНАЯ_ДЛИНА (Список) и НЕЧЕТНАЯ_ДЛИНА (Список) таким образом, чтобы они были истинными, если их аргументом является список четной или нечетной длины соответственно.
Напишите программу для предиката ПОДСТАНОВКА (X,Y, Список1, Список2), где Список2 - результат подстановки Y вместо всех вхождений X в Список1. Например, отношение ПОДСТАНОВКА (а , х , [а, b, а, с], [х, b, х, с]) - истинно, а отношение ПОДСТАНОВКА (а, х, [а, в, а, с], [ а, в, х, с]) - ложно.
Определите отношение ПЕРЕВОД (Список1, Список2) для перевода списка чисел от 0 до 9 и список соответствующих им названий (строк). Например, ПЕРЕВОД ([3, 5, 2, 3], [три, пять, два, три] ). Используйте следующее отношения:
ОЗНАЧАЕТ (0, ноль).
ОЗНАЧАЕТ (1, один).
ОЗНАЧАЕТ (2, два).
…
Определить отношение ПЕРЕСЕЧЕНИЕ(Список1, Список2, Список3), где элементы списка Список3 являются общими для списков Список1 и Список2.
Определить отношение ПРОИЗВЕДЕНИЕ(Список1,Список2,Список3), в котором элементы списка Список3 равны произведениям соответствующих элементов списков Список1 и Список2Создайте предикат, переводящий список цифр от 0 до 9 в список соответствующих им римских чисел.
Создайте предикат, переводящий список арабских чисел в список соответствующих им римских чисел.
Создайте предикат, переводящий список римских чисел в список соответствующих им арабских чисел.
Создайте предикат, удваивающий значения элементов списка.
Создайте предикат, порождающий по заданным числам M, K список, состоящий из К-М случайных чисел из промежутка от M до K.
Создайте предикат, преобразующий список, элементами которого являются числа, в список, элементы которого неотрицательны, т.е. отрицательные умножить на (-1), а положительные отставить без изменения.
Создайте предикат, преобразующий исходный список чисел в список позиций отрицательных элементов.
Создайте предикат, удаляющий из исходного списка элементы с четными номерами.
Создайте предикат, который разделит исходный список из целых чисел на два списка: список положительных чисел и список отрицательных чисел.
Создайте предикат, разделяющий исходный список на два подсписка. В первый из них должны попасть элементы с нечетными номерами, во второй - элементы с четными номерами.
Создайте предикат, вычисляющий по списку и числу, подсписок исходного списка, начинающийся с элемента с указанным номером.
Создайте предикат, осуществляющий удаление указанного количества последних элементов исходного списка.
Создайте предикат, осуществляющий разделение исходного списка на два подсписка. В первый из них должно попасть указанное количество элементов из начала списка, во второй - оставшиеся элементы.
Создайте предикат, осуществляющий разделение исходного списка на два подсписка. В первый из них должно попасть указанное количество элементов с конца списка, во второй - оставшиеся элементы.
Создайте предикат, заменяющий в исходном списке два подряд идущих одинаковых элемента одним.
Создайте предикат, удаляющий в исходном списке все повторные вхождения элементов.
Создайте предикат, осуществляющий перестановку двух элементов списка с заданными номерами.
Создайте предикат, генерирующий все перестановки элементов списка, указанного в качестве первого аргумента предиката.
Создайте предикат, осуществляющий замену всех отрицательных чисел нулями.
Создайте предикат, вычисляющий скалярное произведение векторов, заданных списками целых чисел.
Создайте предикат, определяющий первую позицию подсписка в списке.
Создайте предикат, добавляющий элементы одного списка во второй список, начиная с заданной позиции.
Создайте предикат, заменяющий в исходном списке первое вхождение заданного значения другим.
Создайте предикат, порождающий по заданному натуральному числу N список, состоящий из N случайных натуральных чисел из промежутка от 1 до 100.
Создайте предикат, который увеличивает элементы исходного списка на единицу.
Создайте предикат, порождающий по заданному натуральному числу N список, состоящий из натуральных чисел от 1 до N (по возрастанию).
Создайте предикат, порождающий по заданному натуральному числу N список, состоящий из натуральных чисел от N до 1 (по убыванию).
Даны два списка, имеющие ненулевое пересечение. Построить список, включающий все элементы указанных двух списков без повторений.
Создайте предикат, преобразующую исходную строку в список символов, например, ПРЕОБ( “кошка”, [“к”,”о”,”ш”,”к”,”а”]). Используйте стандартный предикат frontchar
Создайте предикат, вычисляющий позицию минимального элемента в списке
Создайте предикат, вычисляющий позицию максимального элемента в списке
Создайте предикат, преобразующую исходный список в строку символов, например, ПРЕОБ( [“к”,”о”,”ш”,”к”,”а”],“кошка”). Используйте стандартный предикат frontchar
Создайте предикат, преобразующую исходный список в строку символов, например, ПРЕОБ( [“к”,”о”,”ш”,”к”,”а”],“кошка”). Используйте стандартный предикат frontchar
