Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Conspekt.doc
Скачиваний:
11
Добавлен:
31.08.2019
Размер:
1.39 Mб
Скачать

2.8 Удаление элемента из списка

Функция содержит два аргумента X и U, и удаляет X из U.

(DEFUN DELETE (X U)

(COND ((NULL U) NIL)

((EQUAL X (CAR U)) (CDR U))

(T (CONS (CAR U) (DELETE X (CDR U))))

)

)

С помощью EQUAL проверяют, совпадает ли X с первым элементом списка U, если да, то для исключения X из U применяется функция CDR, иначе результирующий список получают путем добавления первого элемента списка U в начало списка, который соответствует остатку списка U с исключенным элементом X.

Определим функцию, удаляющую все элементы, входящие в список V из списка U, используя функцию DELETE.

(DEFUN DELETELIST (U V)

(COND ((NULL V) U)

(T (DELETE (CAR V) (DELETELIST (CDR V) U)))

)

)

Если V не (), то удаляем первый элемент списка V из списка U, из которого уже удален остаток списка V.

2.9 Функция, вычисляющая список общих элементов двух списков

(DEFUN INTERSECTION (U,V)

(COND ((NULL U) NIL)

((MEMBER (CAR U) V)

(CONS (CAR U)(INTERSECTION (CDR U) V)))

(T (INTERSECTION (CDR U) V))

))

Первая проверка U – пустой? Если да, то общих элементов между U и V нет. Поэтому результирующий список тоже будет пустым.

Второе условие: проверка вхождения 1-го элемента из U в список V. Если условие выполняется, то 1-й элемент U добовляется к списку общих элементов, списков V и (CDR U).

Рекурсивное обращение к функции INTERSECTION; аргументы функции: усеченный список U(“хвост списка”) и список V.

В ЛИСПе имеется встроенная функция INTERSECTION.

2.10 Функция, объединяющая два списка и не включающая повторяющиеся элементы

Отличается от APPEND тем, что в результирующий список не добавляется повторно элемент, встречающийся в обоих списках.

(DEFUN UNION (U,V)

(COND ((NULL U) V)

((MEMBER (CAR U) V)

(UNION (CDR U) V))

(T (CONS (CAR U)(UNION (CDR U) V)))

))

Функция UNION проверяет, является ли U пустым списком. Если U- пустой список, то результат V. Иначе, если первый элемент списка U входит в список V, то результат есть объединение хвоста списка U со списком V. Иначе, первый элемент добавляем в начало объединенного списка, который является результатом объединения списка U без первого элемента списка V.

2.11 Ассоциативные списки

Ассоциативным списком или списком соответствия называют список, состоящий из точечных пар ((X1 . Y1),...,(Xn . Yn)).

<ассоциативный список>::=

NIL|<точечная пара>.<ассоциативный список>

В таком списке каждому Yi соответствует Xi. Основное назначение ассоциативных списков - хранение промежуточной информации. Такие списки широко применяются, как основные структуры данных в программах и могут интерпритироваться как атрибут и его данные.

Имеются специальные функции для работы с такими списками:

1. (PAIR arg1 arg2)- позволяет образовывать из двух списков один ассоциативный. Если длина одного списка больше длины другого, то функция неопределена.

(PAIR '(A B C) '(1 2 3))->((A . 1)(B . 2)(C . 3))

2.Выбор элементов из ассоциативных списков

(ASSOC <арг.поиска> <асс.список>)

Проверяет, содержится ли в ассоциативном списке <асс.список> точечная пара, первый элемент которой есть <арг.поиска>, и если содержится, то функция возвращает s-выражение , в которое входит точечная пара. Если не содержится- NIL.

(ASSOC 'B '((H . K)(B . F)) -> (B . F)

ASSOC выполняет ассоциативный поиск.

3.(SUBLIST <асс.список> <список>)- производит замены, заданные в виде ассоциативного списка в списке, который является вторым аргументом функции.

(SUBLIST '((A . f)(B . P)(C . Q R X) '(A B (E A) C)->

(F P (E F) (Q R X))

Определим такую функцию:

(DEFUN SUBLIST (A W)

(COND ((NULL A) W)

(COND ((ASSOC W A) (CDR (ASSOC W A))) ((ATOM W) W))

(T (CONS (SUBLIST A (CAR W)) (SUBLIST A (CDR W)))

))

Здесь А - ассоциативный список, W - произвольное выражение, т.е. функция в заданном выражении W заменяет все входящие в него атомы элементами из ассоциативного списка А, которым имеется соответствие.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]