Новосибирский Государственный Университет
Опубликован: 05.02.2007 | Доступ: свободный | Студентов: 2222 / 413 | Оценка: 4.30 / 4.23 | Длительность: 10:15:00
Лекция 5:

Определение языка программирования

< Лекция 4 || Лекция 5: 12 || Лекция 6 >

Основные методы обработки списков

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

APPEND - функция двух аргументов x и y, сцепляющая два списка в один.

(DEFUN append (x y) (COND 
      ((null x) y)
      ((QUOTE T) (CONS
      (CAR x) 
      (append (CDR x) y)        
      )
      )
)
)
(append '(A B) '(C D E))   ;= (A B C D E)

MEMBER - функция двух аргументов x и y, выясняющая встречается ли S-выражение x среди элементов списка y.

(DEFUN member (x y) (COND ((null y) (QUOTE Nil))
                           ((equal x (CAR y)) (QUOTE T))
                           ((QUOTE T) (member x (CDR y)) )
  ) )
(member ' A '( B (A) C))
(member ' (A) '( B (A) C))

PAIRLIS - функция трех аргументов x, y, al, строит список пар соответствующих элементов из списков x и y - связывает и присоединяет их к списку al. Полученный список пар, похожий на таблицу с двумя столбцами, называется ассоциативным списком или ассоциативной таблицей. Такой список может использоваться для связывания имен переменных и функций при организации вычислений интерпретатором.

(DEFUN pairlis (x y al) (COND 
            ((null x) al)
            ((QUOTE T) (CONS (CONS (CAR x)
                     (CAR Y) )
               (pairlis (CDR x)
                        (CDR y)
                        al) 
             )  )         )
)

(pairlis '(A B C) '(u t v) '((D . y)(E . y)))       ;= ((A . u)(B . t)(C . v)(D . y)(E . y))

ASSOC - функция двух аргументов x и al. Если al - ассоциативный список, подобный тому, что формирует функция pairlis, то assoc выбирает из него первую пару, начинающуюся с x. Таким образом, это функция поиска определения или значения по таблице, реализованной в форме ассоциативного списка.

(DEFUN assoc (x al) (COND 
               ((equal x (CAAR al)) (CAR al))
               ((QUOTE T) (assoc x (CDR al))
               )    )
)
(assoc 'B '((A . (m n)) (B . (CAR x)) (C . w) (B . (QUOTE T))))     ;= (B . (CAR x))

Частичная функция - рассчитана на наличие ассоциации.

SUBLIS - функция двух аргументов al и y, предполагается, что первый из аргументов AL устроен как ассоциативный список вида ((u1 . v1) ... (uK . vK)), где u есть атомы, а второй аргумент Y - любое S-выражение. Действие sublis заключается в обработке Y, такой что вхождения переменных Ui, связанные в ассоциативном списке со значениями Vi, заменяются на эти значения. Другими словами в S-выражении Y вхождения переменных U заменяются на соответствующие им V из списка пар AL. Вводим вспомогательную функцию SUB2, обрабатывающую атомарные S-выражения, а затем - полное определение SUBLIS:

(DEFUN sub2 (al z) (COND 
               ((null al) z)
               ((equal (CAAR al) z) (CDAR al))
               ((QUOTE T) (sub2 (CDR al) z))
              ) )

(DEFUN sublis (al y) (COND 
         ((ATOM y) (sub2 al y))
         ((QUOTE T)(CONS 
             (sublis al (CAR y)) 
             (sublis al (CDR y))
            ) )))

(sublis '((x . Шекспир)(y . (Ромео и Джульетта))) '(x написал трагедию y))
;= (Шекспир написал трагедию (Ромео и Джульетта))
5.1.

INSERT – вставка z перед вхождением ключа x в список al.

(DEFUN insert (al x z) (COND 
               ((null al) Nil)
               ((equal (CAR al) x) (CONS z al))
               ((QUOTE T) (CONS (CAR al) (insert (CDR al) x z)))
              )
)

 (insert '(a b c) 'b 's)      ; =  (a s b c)

ASSIGN – модель присваивания переменным, хранящим значения в ассоциативном списке. Происходит замена значения, связанного с данной переменной в первой найденной паре, на новое заданное значение. Если не было пары вообще, то новую пару из переменной и ее значения размещаем в конец а-списка, чтобы она могла работать как глобальная.

(DEFUN assign (x v al) (COND 
         ((Null al) (CONS (CONS x v) Nil ))
               ((equal x (CAAR al))(CONS (CONS x v) (CDR al)))
               ((QUOTE T) (CONS (CAR al) (assign x v (CDR al))))
              )
)
(assign 'a 111 '((a . 1)(b . 2)(a . 3)))     ;= ((a . 111)(b . 2)(a . 3))
(assign 'a 111 '((c . 1)(b . 2)(a . 3)))     ;= ((c . 1)(b . 2)(a . 111))
(assign 'a 111 '((c . 1)(d . 3)))       ;= ((c . 1)(d . 3) (a . 111))

Упражнение 5.1: Введите функции с именами – Пусто, Пара_в_список, Список_в_пару, входит_ли, Соединение, Элемент, Связывание, Ассоциация, Ряд_подстановок, Вставка, Присваивание, как аналоги вышеприведенных функций.

Упражнение 5.2: Напишите определение функции REVERSE – обращение списка, т.е. перечисление его элементов в обратном порядке.

Ответ:

(defun reverse (m) 
       (cond ((null m) NIL)
          (T (append(reverse(cdr m)) 
                     (list(car m))         ))       ))

Теперь посмотрим ее вариант как пример использования накапливающих параметров и вспомогательных функций:.

(defun rev (m n) 
      (cond ((null m) N)
               (T  (rev(cdr m) (cons (car m) n)))      )) 

(defun reverse (m) (rev m Nil)   )

Такое определение экономнее расходует память.

Таблица 5.1. Clisp: Дополнительные функции для работы с данными
(Append Список … ) Сцепляет списки, полученные как аргументы
(Assoc Атом А-список) Находит в А-списке пару, левая часть которой - Атом
(Eq Данное1 Данное2) Истина при идентичных данных
(Equal Структура1 Структура2 ) Истина при эквивалентных структурах
(Delete Объект Список ) Строит копию Списка без заданного объекта
(Intersection Список … ) Пересечение списков
(Last Список ) Последний элемент сруктуры, представляющей список. Можно задавать длину завершающего отрезка списка.
(Length Список ) Длина списка
(List Форма … ) Строит список из значений Форм
(Member Объект Список ) Ищет Объект в Списке
(Null Форма) Истина для Nil
(Pairlis Атомы Данные А-список) Пополняет А-список парми из Атомов и значений соответсвующих Данных.
(Reverse Список ) Копия Списка с обратным порядком элементов
(Set-difference Список … ) Разность множеств, представленных Списками
(Sort Список Предикат ) Упорядочивает Список согласно Предикату
(Sublis А-список Структура ) Преобразует Структуру согласно А-списку методом подстановки данных вместо связанных с ними атомов.
(Subst Новое Старое Структура ) Преобразует Структуру, заменяя Старое на Новое.
(Union Список … ) Объединение множеств, представленных Списками.

Выводы:

  • Синтаксис Лиспа очень прост. В некотором смысле это сосредотачивает разработчиков на семантике, что породило большое количество диалектов.
  • Форма - это выражение, которое может быть вычислено. Формами являются переменные и списки, начинающиеся с QUOTE, COND или с представления некоторой функции.
  • Выполнение программы на Лиспе устроено как интерпретация данных, представляющих выражения, имеющие значение.
< Лекция 4 || Лекция 5: 12 || Лекция 6 >