Шаг 94.
Поиск в списках

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

    Приведем небольшую библиотеку функций языка LISP, позволяющих выполнять поиск и замену элементов в списках.


    Пример 1.
   (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 )
      )
   ))
Текст этой библиотеки можно взять здесь.

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




Предыдущий шаг Содержание Следующий шаг