
- •ОгЛавление
- •8 Литература 93
- •Лабораторная работа №1 Знакомство с языком логического программирования Пролог
- •1.1 Цель работы
- •1.2 Теоретические сведения
- •1.3 Среда VisualProlog
- •1.4 Выполнение работы
- •1.5 Задание на лабораторную работу
- •2.3 Выполнение работы
- •2.4 Задание на лабораторную работу
- •2.5 Контрольные вопросы
- •Лабораторная работа №3 Рекурсивные структуры данных
- •3.1 Цель работы
- •3.2 Теоретические сведения
- •3.3 Выполнение работы
- •3.4 Задание на лабораторную работу
- •3.5 Контрольные вопросы
- •Лабораторная работа №4 Знакомство с языком списочных структур Лисп
- •4.1 Цель работы
- •4.2 Теоретические сведения
- •4.3 Среда FreeLisp
- •4.4 Выполнение работы
- •4.5 Задание на лабораторную работу
- •4.6 Контрольные вопросы
- •Лабораторная работа №5 Рекурсия и итерация в языке Лисп
- •5.1 Цель работы
- •5.2 Теоретические сведения
- •5.3 Выполнение работы
- •5.4 Задание на лабораторную работу
- •5. 5. Контрольные вопросы
- •6.2.2 Замыкания
- •6.2.3 Макросы
- •6.3 Задание на лабораторную работу
- •6.4 Контрольные вопросы
- •Лабораторная работа №7 Методы поиска решений в пространствах состояний
- •7.1 Цель работы
- •7.2 Теоретические сведения
- •7.4 Выполнение работы
- •7.5 Задание на лабораторную работу
- •7.6 Контрольные вопросы
- •8 Литература
2.4 Задание на лабораторную работу
Написать функцию, использующую метод Ньютона для вычисления квадратного корня. Метод Ньютона вычисления квадратного корня из числа x начинается с выбора начального приближения y. Это приближение считается достаточно точным, если | x - y2 | <= err, где err – некоторая заранее определенная погрешность. В противном случае более точным приближением будет 1/2 *(y + x/y), которое можно вычислить и точно так же подвергнуть проверке на погрешность. Для получения абсолютной величины числа используйте функция abs: abs(-5) = 5.
Пример:
% вычисления квадратного корня из числа 5
% начальное приближение 1
% уровень допустимой погрешности 0.05
?- newton(5, 1, 0.05, Z)
Z=2.2380953
Написать рекурсивную и итерационную программы возведения числа в степень. Предполагается использование только натуральных чисел. Возведение в степень представить как повторяющееся умножение.
Написать функции для вычисления N-го числа последовательности Фибоначчи. Каждое следующее число последовательности Фибоначчи вычисляется как сумма двух предыдущих. Два первых числа равны единице.
2.5 Контрольные вопросы
Треугольное число с индексом N – это сумма всех натуральных чисел до N включительно. Напишите рекурсивную и итерационную программы, задающую отношение triangle(N, T), истинное, если T – треугольное число с индексом N.
Написать рекурсивную и итерационную программы, реализующую вычисления, заданные формулой:
Определить процедуру between(N1, N2, X), которая порождает все целые числа X, отвечающие условию N1 X N2.
Написать процедуру, результатом которой будет выражение, являющееся факториалом числа, и в котором числа (сомножители) упорядочены в порядке возрастания.
Например,
?- fact(3, S)
S=1*2*3
Лабораторная работа №3 Рекурсивные структуры данных
3.1 Цель работы
Изучить возможности определения и работы с рекурсивными структурами данных в языке Пролог.
3.2 Теоретические сведения
Рекурсия используется в двух случаях: для описания программ, выполнению которых предшествует выполнение их собственной копии и для описания структур данных частично состоящих или определяемых с помощью самих себя. Примерами таких рекурсивных структур данных являются списки и деревья. Например, список можно определить следующим образом: <список>:=<пустой>|<элемент>|<список><элемент>
Достоинство рекурсивного определения объекта состоит в том, что оно позволяет с помощью конечного высказывания определить бесконечное множество объектов.
Бинарные деревья
Бинарное дерево – это конечное множество элементов, которое либо пусто, либо содержит один элемент, называемый корнем дерева, а остальные элементы делятся на два непересекающихся подмножества, каждое из которых само является бинарным деревом. Обычно их называют поддеревьями. В языке Паскаль объявить тип, описывающий бинарное дерево можно следующим образом:
type TreeType = ^Tree;
Tree = record
Element: string;
Left, Right: TreeType;
end;
Здесь Element – элемент, находящийся в вершине, а Left и Right – соответственно левое и правое поддерево.
В языке Пролог бинарное дерево можно задать с помощью тернарного функтора tree(Element, Left, Right):
domains
treetype = tree(string, treetype, treetype);
empty()
Например, дерево
можно задать следующим образом:
tree(“1”,
tree(“2”,
tree(“4”, empty, empty),
tree(“5”, empty, empty)),
tree(“3”,
tree(“6”, empty, empty),
tree(“7”, empty, empty)))
Списки
Список является набором объектов одного и того же типа. Элементами списка могут быть любые термы – константы, переменные, структуры, которые включают и другие списки. Списковых структур достаточно для большинства вычислений. Списки широко используются для представления деревьев синтаксического разбора, грамматик, карт городов и т. д. Совокупность элементов списка заключается в квадратные скобки ([]), а друг от друга элементы списка отделяются запятыми. Пустой список записывается как [] – открывающая квадратная скобка, за которой следует закрывающая квадратная скобка. Список может быть представлен как специального вида дерево. Список – это либо пустой список, не содержащий ни одного элемента, либо структура, имеющая две компоненты: голову и хвост списка. Головой списка является первый его элемент. Хвост списка представляет список, состоящий из всех элементов исходного списка, за исключением первого его элемента. Конец списка обычно представляют как хвост, который является пустым списком.
Например:
[1, 2, 3]
1 – голова, [2, 3] – хвост списка
2 – голова, [3] – хвост списка
3 – голова, [] – хвост
списка
В языке Пролог введена специальная форма для представления списка с головой X и хвостом Y. Такой список записывается как [X|Y], где для разделения X и Y используется вертикальная черта. При конкретизации структуры подобного вида X сопоставляется с головой списка, а Y – с хвостом списка. В приведенном выше примере при сопоставлении списка [1, 2, 3] со структурой [X|Y] переменная X примет значение 1, а переменная Y – [2, 3]. Представление списка в виде головы и хвоста было принято для удобной рекурсивной обработки элементов списка.
В языке Паскаль объявить тип list, описывающий список целых чисел можно следующим образом:
type list = ^TElemList;
TElemList = record;
Inf: char;
Next: list;
end;
В языке Пролог списковый тип объявляется так:
domains
name_of_list_type = type_of_elements*
Здесь name_of_list_type является доменом списка элементов типа type_of_elements. Например, тип list, описывающий список целых чисел, можно объявить следующим образом:
domains
list = integer*
Составной список – это список элементов, принадлежащих разным типам. Для представления составного списка в Прологе все его элементы должны быть объявлены через функторы.
Например,
llist = l(list); s(symbol); i(integer); c(char)
list = llist*
Тогда список [a, 1, [b, c]] будет представлен следующим образом: [s(a), i(1), l([s(b), s(c)])].