2- 3_Функциональное программирование
.docНомер варианта (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)
)