На этом шаге мы рассмотрим функции, организующие поиск элементов.
Приведем небольшую библиотеку функций языка LISP, позволяющих выполнять поиск и замену элементов в списках.
(DEFUN POSITION (LAMBDA (X LST) ; Функция POSITION возвращает положение атома X в ; ; одноуровневом списке LST, считая с первого по по- ; ; рядку элемента. ; ; Предполагается, что X встречается в LST ; (COND ( (NULL LST) 0 ) ( (EQ X (CAR LST)) 1 ) ( T (+ 1 (POSITION X (CDR LST))) ) ) )) ; ---------------------------- ; (DEFUN FIRST-EQUAL (LAMBDA (X Y) ; Функция FIRST-EQUAL возвращает первый элемент, вхо- ; ; дящий в оба списка X и Y, в противном случае функция ; ; возвращает NIL ; (COND ( (NULL X) NIL ) ( (NULL Y) NIL ) ( (MEMBER (CAR X) Y) (CAR X) ) ( T (FIRST-EQUAL (CDR X) Y)) ) )) ; ------------------------------- ; (DEFUN SUBSTRING1 (LAMBDA (LST A B) ; Функция заменяет в списке LST все вхождения атома A ; ; на атом B. Обратите внимание, что замена производится ; ; лишь на самом верхнем уровне списка LST ; (COND ( (NULL LST) NIL ) ( (EQ (CAR LST) A) (CONS B (SUBSTRING1 (CDR LST) A B)) ) ( T (CONS (CAR LST) (SUBSTRING1 (CDR LST) A B)) ) ) )) ; ----------------------------------- ; (DEFUN SUBSTRING2 (LAMBDA (OLD NEW LST) ; Функция возвращает выражение, являющееся результатом ; ; замены всех вхождений OLD на NEW в LST (на какой бы ; ; глубине они не находились) ; (COND ( (EQUAL OLD LST) NEW ) ( (ATOM LST) LST ) ( T (CONS (SUBSTRING2 OLD NEW (CAR LST)) (SUBSTRING2 OLD NEW (CDR LST))) ) ) )) ; ----------------------------- ; (DEFUN SUBSET (LAMBDA (LST1 LST2) ; Функция возвращает T, если список LST1 ; ; является подсписком списка LST2 ; (COND ( (NULL LST1) ) ( (MEMBER (CAR LST1) LST2) (SUBSET (CDR LST1) LST2) ) ( T NIL ) ) ))
На следующем шаге мы приведем дополнительные функции, которые можно использовать при организации поиска.