Задание которое было на таком предмете как "Функциональное и логическое программирование" . Для человека у которого сложилась уже система программирования сложно привыкнуть
1. Напишите функцию (count L X), считающую число элементов, меньших X в список L на всех уровнях.
(defun count (s x) (cond ((null s) 0) ((listp (first s)) (+ (count (first s) x) (count (rest s) x))) ((and (numberp (first s)) (< (first s) x)) (+ 1 (count (rest s) x))) ( t (count (rest s) x)) ) )
(princ (count '(1 9 1 2 (2 1 (0 5)) 5 4 7) 3) )
2. Пусть s1 и s2 - "множества с повторяющими элементами". Определите функцию (f s1 s2), которая вычисляет "объединение множеств". Так, например, вызов (f 'i, 1 2 12 13) '(5 3 3 1 2 2)) должен давать результат (1 1 1 1 2 2 2 2 3 3 3 5).
(defun f (s1 s2)
(treeSort (append s1 s2) )
)
(defun treeSort (x)
(flatten (makeTree x)))
(defun makeTree (x)
(if (null x) nil (insert (first x) (makeTree (rest x)))
)
)
(defun flatten (x)
(if (null x) nil
(append (flatten (first x))
(cons (second x) (flatten (third x)))
)
)
)
(defun insert (n x)
(if (null x) (list nil n nil)
(let ( (left (first x))
(node (second x))
(right (third x))
)
(if (<= n node) (list (insert n left) node right)
(list left node (insert n right))
)
)))
(defun append (s1 s2)
(if (null s1) s2
(cons (first s1) (append (rest s1) s2)))
)
(princ (f '(1 2 1 2 1 3) '(5 3 3 1 2 2) ))
3. Напишите функцию (f L), которая считает количество различных элементов списка L.
(defun f (L)
(cond ((null L) 0)
(t (1+ ( f (remove-all (first L) (rest L)) ) ))
)
)
(defun remove-all (x s)
(cond ((null s) nil)
((eql x (first s)) (remove-all x (rest s)))
(t (cons (first s) (remove-all x (rest s)))))
)
(trace f)
(princ (f '(1 2 1 2 5 1 2 3 ) ))