ДИСЦИПЛИНА: Рекурсивно-логическое программирование
ЗАНЯТИЕ: Лабораторная работа №1
ТЕМА: Основные механизмы работы Пролога, списки
10 Знакомство со средой Visual Prolog.
· Настройка системы, интерфейс
· Структура программы: domains, database, predicates, goal, clauses
20 Изучение основных механизмов работы Пролога: объекты и отношения между ними.
· Управление перебором. Отсечение (cut,!) и откат (fail). Сопоставление аргументов. Определение отношения “различны”.
· Арифметические операции:
сравнения чисел, факториал, максимальное/минимальное/среднее двух и более чисел.
· Родственные отношения:
· Ввести в программу факты следующего вида:
человек, родитель;
· На базе приведенных выше фактов определить отношения:
· мужчина, женщина;
· отец, мать, сын, дочь;
· брат, сестра, братья, сестры;
· дедушка, бабушка;
· дядя, тетя, племянник, племянница;
· предок, отпрыск, люди одного поколения.
· Определить отношения: ребенок, взрослый.
30 Сформулировать все возможные вопросы, касающиеся отношений, определенных в программе.
40 Выполнить индивидуальное задание к лабораторной работе №1 в соответствии со своим вариантом.
Управление перебором. Отсечение (cut,!) и откат (fail). Списки.
Общие задания.
/****************************************************************************/
% ЗАДАЧА 1.
% Дана программа.
% 1.1. Исполните согласование внешней цели p(a,Y,Z).
% 1.2. В комментариях запишите и прокомментируйте результат
% согласования цели.
% 1.3. Укажите системе вывода, чтобы выполнила согласование только
% первого определения предиката p(X,Y,Z).
% 1.4. Исполните согласование внешней цели p(a,Y,Z).
% 1.5. В комментариях запишите и прокомментируйте результат
% согласования цели.
% 1.6. Удалите из текста программы все внесенные Вами изменения.
% 1.7. Добавьте факт p1(a,11). в базу данных.
% 1.8. Исполните согласование внешней цели p(a,Y,Z).
% 1.9. В комментариях запишите и прокомментируйте результат
% согласования цели.
% 1.10. Внесите в программу изменения, соответствующие выполнению
% требования 1.3.
% 1.11. Исполните согласование внешней цели p(a,Y,Z).
% 1.12. В комментариях запишите и прокомментируйте результат
% согласования цели.
% 1.13. Поместите в комментарий текст программы и перейдите к
% выполнению требований к работе с программой задачи 2.
domains
x = symbol
y, z = integer
predicates
p(x, y, z)
p1(x, y)
p2(x, z)
p3(x, y)
clauses
p1(a, 1).
p2(a, 2).
p3(a, 3).
p(X, Y, Z):- p1(X, Y), p2(X, Z).
p(X, Y, Z):- p2(X, Z), p3(X, Y).
/****************************************************************************/
% ЗАДАЧА 2.
% Дана программа.
% Удалите символы /* и */, ограничивающие текст программы.
% 1.1. Исполните согласование внешней цели r(X).
% 1.2. В комментариях запишите и прокомментируйте результат
% согласования цели.
% 1.3. Исполните согласование внешней цели r(1).
% 1.4. В комментариях запишите и прокомментируйте результат
% согласования цели.
% 1.5. Исполните согласование внешней цели r(2).
% 1.6. В комментариях запишите и прокомментируйте результат
% согласования цели.
% 1.7. Укажите системе вывода, чтобы выполнила согласование только
% первого определения предиката r(X) или никакого.
% 1.8. Исполните согласование внешней цели r(X).
% 1.9. В комментариях запишите и прокомментируйте результат
% согласования цели.
% 1.10. Исполните согласование внешней цели r(1).
% 1.11. В комментариях запишите и прокомментируйте результат
% согласования цели.
% 1.12. Исполните согласование внешней цели r(2).
% 1.13. В комментариях запишите и прокомментируйте результат
% согласования цели.
% 1.14. Поместите в комментарий текст программы и перейдите к
% выполнению требований к работе с программой задачи 3.
/*
domains
x = integer
predicates
r(x)
r1(x)
r2(x)
clauses
r1(1).
r2(2).
r(X):- r1(X), write("согласовано первое определение").
r(X):- r2(X), write("согласовано второе определение").
*/
/****************************************************************************/
% ЗАДАЧА 3.
% Дана программа.
% Удалите символы /* и */, ограничивающие текст программы.
% 1.1. Какие цели можно сформулировать к базе знаний,
% представленной в данной программе?
% 1.2. Исполните согласование целей.
% 1.3. В комментариях запишите и прокомментируйте результат
% согласования целей.
% 1.4. Какую задачу выполняет отсечение?
% 1.5. Поместите в комментарий текст программы и перейдите к
% выполнению требований к работе с программой задачи 4.
/*
domains
l = integer*
predicates
append2(l, l, l)
clauses
append2([], L, L):-!.
append2([H|L1], L2, [H|L3]):- append2(L1, L2, L3).
*/
/****************************************************************************/
% ЗАДАЧА 4.
% Дана программа.
% Удалите символы /* и */, ограничивающие текст программы.
% Укажите системе, чтобы пpогpамма возвpатила
% только пеpвые pешения для каждого опpеделения
% пpедиката p(X).
/*
domains
x = integer
predicates
p(x)
p1(x)
p2(x)
p4(x)
clauses
p1(1).
p1(11).
p2(1).
p2(11).
p4(X):- X = 10 + 10.
p(X):- p1(X), write("p1 ").
p(Y):- p2(Y), write("p2 ").
p(Z):- p4(Z), write("p4 ").
*/
Индивидуальные задания по вариантам (списки).
%
% ВАРИАНТ: 1
% ЗАДАНИЕ: Добавить список l1 после k-го элемента списка l.
% l - список, элементами которого являются списки.
%
% ВАРИАНТ: 2
% ЗАДАНИЕ: Удалить m элементов списка l, следующих после
% k-го элемента l.
% l - список, элементами которого являются списки.
%
% ВАРИАНТ: 3
% ЗАДАНИЕ: Заменить k-й элемент списка l списком l1.
% l - список, элементами которого являются списки.
%
% ВАРИАНТ: 4
% ЗАДАНИЕ: Обратить отрезок списка l между k1-ым и k2-ым
% его элементами.
% l - список, элементами которого являются атомы.
%
% ВАРИАНТ: 5
% ЗАДАНИЕ: Получить "простой" список включением элементов
% списка l1 между i-ым и i+1 -ым элементами списка l,
% если некоторый объект obj совпадает с k-ым элементом
% списка l1.
%
% ВАРИАНТ: 6
% ЗАДАНИЕ: Получить "простой" список, в котором одинаковые
% элементы данного списка l сгруппированы в "отрезки"
% списка, например,
% l = (a b b a c a b c).
% Получить l' = (a a a b b b c c).
%
% ВАРИАНТ: 7
% ЗАДАНИЕ: Обратить данный список l, удалив из него элементы,
% совпадающие с первым элементом списка l.
% l - список, элементами которого являются списки.
%
% ВАРИАНТ: 8
% ЗАДАНИЕ: Дано: l - "простой" список, obj - атом.
% Сформировать списки из заданного obj с каждым
% элементом списка l.
% Возвратить список, элементами которого являются
% сформированные по указанному правилу списки.
%
% ВАРИАНТ: 9
% ЗАДАНИЕ: Исключить все повторные вхождения элементов списка l.
% l - список, элементами которого являются списки.
%
% ВАРИАНТ: 10
% ЗАДАНИЕ: Обратить отрезок из m элементов, следующих за k-ым
% элементом данного списка l.
% l - список, элементами которого являются списки.
% Списки из обращенного отрезка не обращать.
%
% ВАРИАНТ: 11
% ЗАДАНИЕ: l - список, элементами которого являются списки.
% Обратить списки, составляющие отрезок из m элементов
% списка l, следующих после k-го элемента.
%
% ВАРИАНТ: 12
% ЗАДАНИЕ: Упорядочить по возрастанию все нечетные элементы
% списка l.
% l - список, элементами которого являются атомы.
%
% ВАРИАНТ: 13
% ЗАДАНИЕ: l - список, элементами которого являются списки.
% Определить позицию и длину наиболее "длинного"
% элемента списка l.
%
% ВАРИАНТ: 14
% ЗАДАНИЕ: l1 - список, элементами которого являются списки.
% Удалить из каждого подсписка списка l1 все элементы,
% расположенные посередине, но только если длина
% соответствующего подсписка нечетная.
%
% ВАРИАНТ: 15
% ЗАДАНИЕ: l - список, элементами которого являются списки,
% состоящие из чисел.
% Определить номер элемента списка l, содержащего
% наименьшее число.
% Например, в случае l = ((1 3) (0) (6 1)),
% ответ: n = 2.
% Не рассматривать случай, когда такой элемент
% не единственный.
%
% ВАРИАНТ: 16
% ЗАДАНИЕ: l - список, элементами которого являются атомы.
% Проверить, является ли список l упорядоченным.
%
% ВАРИАНТ: 17
% ЗАДАНИЕ: Упорядочить по убыванию все четные подсписки списка l.
%
% ВАРИАНТ: 18
% ЗАДАНИЕ: Удалить из списка l все подсписки, длины которых равны
% их порядковым номерам в l.
% Например, в случае l = ((a) (b) (c d e)),
% необходимо удалить подсписки (a) и (c d e).
%
% ВАРИАНТ: 19
% ЗАДАНИЕ: l1 - список списков списков чисел.
% Необходимо получить список чисел l2, в котором каждый
% элемент равен сумме чисел соответствующих подсписков.
% Например, в случае l1 = (((1 2 3)(4 5 6))((7 8 9))),
% l2 = (A B), где A = 1+2+3+4+5+6, B = 7+8+9.
%
% ВАРИАНТ: 20
% ЗАДАНИЕ: l - список, элементами которого являются списки.
% Возвратить позицию того элемента списка l, который
% содержит наибольшее число. Известно, что
% повторяющихся чисел в списке l нет.
%
% ВАРИАНТ: 21
% ЗАДАНИЕ: Удалить m элементов списка l, следующих за k-ым
% его элементом.
% l - список, элементами которого являются списки.
%
% ВАРИАНТ: 22
% ЗАДАНИЕ: Заменить элементы списка l1 после k-го
% элементами списка l2 начиная с k-го,
% если первые k-1 элементов этих списков
% совпадают.
% l1 и l1 - простые списки.
%
% ВАРИАНТ: 23
% ЗАДАНИЕ: Даны списки списков чисел l1 b l2.
% Определить, какой из списков меньше (как по значениям
% элементов, так и по длинам подсписков и самих списков).
%
% ВАРИАНТ: 24
% ЗАДАНИЕ: Дан список чисел l.
% Проверить, являются ли его элементы, начиная с
% третьего, суммами двух предыдущих элементов.
%
% ВАРИАНТ: 25
% ЗАДАНИЕ: Удалить из списка чисел l все элементы, кратные
% числу n.
%
% ВАРИАНТ: 26
% ЗАДАНИЕ: Найти среднее арифметическое чисел, составляющих
% список l.
% l - список, элементами которого являются атомы.
%
% ВАРИАНТ: 27
% ЗАДАНИЕ: l1,l2 - списки, элементами которых являются атомы.
% Найти список l3, являющийся подсписком и l1 и l2.
%
% ВАРИАНТ: 28
% ЗАДАНИЕ: l1,l2 - списки, элементами которых являются атомы.
% Выяснить, содержит ли список l1 все элементы из
% списка l2 (только одно вхождение).
%
% ВАРИАНТ: 29
% ЗАДАНИЕ: l1,l2,l3 - списки, элементами которых являются атомы.
% Заменить в списке l1 все вхождения элементов из
% списка l2 на элементы из списка l3 под
% соответствующими порядковыми номерами.
%
% ВАРИАНТ: 30
% ЗАДАНИЕ: l1 - список, элементами которого являются символы
% (тип char). Преобразовать все прописные буквы в
% строчные, а строчные - в прописные.
% Для получения кода символа применяется предикат
% char_int(char, integer).
%
% ВАРИАНТ: 31
% ЗАДАНИЕ: l - список, элементами которого являются числа в
% диапазоне от 0 до 9. Подсчитать число, получающееся
% по следующему правилу:
% если l = (5 1 2 6),
% то число = 5*1000 + 1*100 + 2*10 + 6 = 5126.
%
% ВАРИАНТ: 32
% ЗАДАНИЕ: l1,l2 - списки, элементами которых являются атомы.
% Выяснить, содержит ли список l1 все элементы из
% списка l2 (только три вхождения).
%
% ВАРИАНТ: 33
% ЗАДАНИЕ: Построить список l, элементами которого являются
% значения факториала от 1 до n.
%
% ВАРИАНТ: 34
% ЗАДАНИЕ: l1 - список, элементами которого являются атомы.
% Построить список l2, содержащий все подсписки
% списка l1, имеющие длину не менее n и не более m.
%
% ВАРИАНТ: 35
% ЗАДАНИЕ: Данный список l имеет структуру вложения вида:
% (((...))). Определить "глубину" вложения.
% Например, в случае (((a b))) "глубина"
% вложения равна 3.
%
% ВАРИАНТ: 36
% ЗАДАНИЕ: l1 - список, элементами которого являются атомы.
% Сформировать список списков l2, содержащий элементы
% из списка l1, сгруппированные в подсписки длины n.
%
% ВАРИАНТ: 37
% ЗАДАНИЕ: l1,l2 - списки, элементами которых являются атомы.
% Построить список l3, нечетные элементы которого
% содержат соответствующие нечетные элементы списка l1,
% а четные - четные из l2.
%
% ВАРИАНТ: 38
% ЗАДАНИЕ: l1,l2 - списки, элементами которых являются атомы.
% Построить список l3, элементы которого содержат
% сначала элемент из списка l1, затем элемент из списка
% l2, затем следующий элемент из l1 и т.д.
%
% ВАРИАНТ: 39
% ЗАДАНИЕ: l1 - список, элементами которого являются структуры,
% в которых хранятся дневные сводки температуры за
% месяц. Сформировать список l2, содержащий только те
% дни месяца, в которые температура была одинаковой.
% Например, 5-го и 26-го числа температура была 26 С.
%
% ВАРИАНТ: 40
% ЗАДАНИЕ: l1 - список, элементами которого являются списки.
% Сформировать список l2, элементами которого должны
% быть списки, содержащие два элемента: минимальное
% и максимальное значения элементов соответствующих
% подсписков списка l1.
%
/****************************************************************************/