Задача 31.
; ------------------------------------------------- ;
; Отыскать в списке такой атом, который встречается ;
; за один атом перед заданным ;
; ------------------------------------------------- ;
(DEFUN PATOM (X LST)
(COND ( (NULL LST) NIL )
( (< (LENGTH LST) 3) NIL )
( T (NTH (- (NATOM X LST) 2)
LST) )
)
)
; ---------------------- ;
(DEFUN NTH (N LST)
; Функция возвращает N-й элемент списка LST ;
(COND ( (< N 1) 0 )
( (EQ N 1) (CAR LST) )
( T (NTH (- N 1) (CDR LST)) )
)
)
; ------------------------ ;
(DEFUN NATOM (X LST)
; Функция возвращает позицию заданного элемента ;
(COND ( (NULL LST) 0)
( (EQ X (CAR LST)) 1)
( (MEMBER X LST) (+ 1 (NATOM X (CDR LST))) )
( T 0 )
)
)
Задача 32.
; -------------------------------------------- ;
; Напишите функцию INSLIST, зависящую от трех ;
; аргументов N, U и V, вставляющую в список U, ;
; начиная с N-го элемента список V ;
; -------------------------------------------- ;
(DEFUN MAIN (LST1 N LST2)
(COND ( (EQ (LENGTH LST1) N) (APPEND LST1 LST2) )
( T (APPEND (FIRSTN LST1 N)
(APPEND LST2
(LASTN LST1
(-
(LENGTH LST1) N)))
) ) ) )
; ------------------------- ;
(DEFUN FIRSTN (LST N)
(COND ( (EQ N 1) (LIST (CAR LST)) )
( T (CONS (CAR LST)
(FIRSTN (CDR LST)
(- N 1))))
) )
; ------------------------ ;
(DEFUN LASTN (LST N)
(REVERSE (FIRSTN (REVERSE LST) N))
)
; ----------------------------- ;
(DEFUN APPEND (LST1 LST2)
(COND ( (NULL LST1) LST2 )
( T (CONS (CAR LST1)
(APPEND (CDR LST1) LST2) ))
) )
Задача 33.
; ----------------------------------------------------- ;
; Составить список, конгруэнтный данному и состоящий из ;
; глубин погружения каждого элемента исходного списка ;
; ----------------------------------------------------- ;
(DEFUN AA (LST)
(AA1 1 LST)
)
; ---------------------- ;
(DEFUN AA1 (N LST)
(COND ( (NULL LST) NIL)
( T (CONS (GETN N (CAR LST))
(AA1 N (CDR LST))) )
)
)
; ---------------------- ;
(DEFUN GETN (N LS)
(COND ( (ATOM LS) N )
( T (COND ( (< (LENGTH LS) 2)
(LIST (GETN (+ 1 N)
(CAR LS))) )
( T (AA1 (+ 1 N) LS) )
) ) ) )
Задача 34.
; ------------------------------------------------- ;
; Функция, преобразует список чисел в список чисел, ;
; встречающихся в нем более одного раза ;
; ------------------------------------------------- ;
(DEFUN KOLAM (LAMBDA (LST)
(EL (LIST-SET (TH LST LST)))
))
; ------------------- ;
(DEFUN EL (LAMBDA (LST)
(COND
( (NULL LST) NIL )
( (>; (CADR (CAR LST)) 1)
(CONS (CAR (CAR LST)) (EL (CDR LST))) )
( T (EL (CDR LST)) )
)
))
; ------------------------- ;
(DEFUN LIST-SET (LAMBDA (LST)
; Функция LIST-SET преобразует список LST в множество ;
(COND ( (NULL LST) NIL )
( (MEMBER (CAR LST) (CDR LST))
(LIST-SET (CDR LST)) )
( T (CONS (CAR LST) (LIST-SET (CDR LST))) )
)
))
; ------------------------ ;
(DEFUN TH (LAMBDA (LST LST0)
; Построение нового списка, содержащего подсписки вида ;
; (Элемент Количество_повторений_этого_элемента_в_списке) ;
(COND ( (NULL LST) NIL)
( T (CONS (LIST (CAR LST)
(KOL (CAR LST) LST0))
(TH (CDR LST) LST0)) )
)
))
; ---------------------- ;
(DEFUN KOL (LAMBDA (M LST)
; Подсчет количества повторений элемента M в списке LST ;
(COND ( (NULL LST) 0 )
( (EQ (CAR LST) M)
(+ (KOL M (CDR LST)) 1) )
( T (KOL M (CDR LST)) )
)
))
