Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2- 3_Функциональное программирование

.doc
Скачиваний:
25
Добавлен:
23.06.2014
Размер:
26.62 Кб
Скачать

Номер варианта (42*7) div 100=3.

ЗАДАНИЕ.

1.Напишите функцию, определяющую глубину первого вхождения элемента y в список w.

2.Напишите функцию, которая делает из списка множество, т.е. удаляет все повторяющиеся элементы.

3.Напишите функцию (exists p x), которая проверяет “Существует ли элемент списка х, удовлетворяющий предикату р?”

РЕШЕНИЕ.

1. Имеется функция f с двумя параметрами. При вызове функции f, она передает свои параметры в следующую подфункцию f2, которая и выполняет основную работу. В функцию передается элемент y, список w и “накапливающийся” элемент р (счетчик). Далее определяется список, если он пустой или уже закончился, то выдается значение nil. Если список не пустой, то сравнивается его первый элемент с заданным элементом. При совпадении элементов, выводится порядковый номер элемента в списке. Если элементы не совпадают, то опять вызывается функция f2, в которую передается оставшаяся часть списка и значение счетчика увеличивается на еденицу.

(defun f(y w)

(f2 y w 1)

)

(defun f2(x s p)

(cond

((null s) nil)

((equal (first s) x) (list p))

(t (f2 x (rest s) (+ p 1)))

)

)

2. Имеется функция f, которой передается входящее значение в виде списка. Далее определяется форма f1 с параметрами y и z. В y передается список, а в z значение nil.

Далее проверяется список на пустоту. Далее берется первый элемент списка и сравнивается со значением z. Т.к. они не равны, то вызывается опять функция f1, в качестве списка передается оставшаяся часть без первого элемента, в качестве z передается z с присоединенным первым элементом y. И так пока не закончиться весь список.

(defun f(x)

(labels

((fl (y z)

(cond ((null y)z)

((member (first y)z) (fl (rest y)z))

(t (fl(rest y) (append z(list (first y))))))))

(fl x nil))

)

3. Определяем предекат or, который будет сравнивать х с nil и выдавать x, если не равно Nil, и выдавать y в противном случае. После задания аргументов предикату exists будет выполняться предикат reduce, который будет сравнивать результаты выполнения предиката mapcar между собой.

Таким образом мы проверим, существует ли елемент списка х удовлетворяющий предикату р.

(defun or(x y)

(if x t y)

)

(defun exists(p x)

(reduce (function or) (mapcar p x) nil)

)