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

3.11.4 Присваивание значений при сопоставлении с образцом

Cледующим направлением усовершенствования функции match будет то, чтобы при успешном сопоставлении факта с образцом, функция возвращала в переменных то, с чем она сопоставима.

Введем в образце дополнительные обозначения - атомы, начинающиеся со знаков > и &. Например,

(A >X B) (A &X B)

Если будем сопоставлять

(A &X B):=: (A X Y B), то &X  (X Y)

(цвет &X красный):=:(цвет яблоко красный), >X  яблоко

(+ <A <B):=:(+ 1 2), <A1 <B2

Если в образце встречается знак >, то соответствующей пе-

ременной присваивается одно значение; если &, то список значе-

ний. Для того, чтобы определить функцию , учитывающую эти осо-

бенности необходимо проанализировать , с какого символа начи-

нается атом в образце.

3.11.5 Функции Explope, Compress, AtomCar, AtomCdr

Функция (EXPLODE A) "разрывает" атом на части и получает список.

Например,

(EXPLODE 'ATOM)  (A T O M)

В ЛИСПе имеется также обратная функция, которая воссоздает атом из составных частей.

Например,

(COMPRESS '(A T O M))  ATOM

Определим ряд вспомогательных функций:

ATOMCAR- выделяет первый элемент из имени атома;

ATOMCDR- остаток без первого элемента.

(DEFUN ATOMCAR (A)

(CAR (EXPLODE A))

)

(DEFUN ATOMCDR (A)

(COMPRESS (CDR (EXPLODE A)))

)

работа этой функции:

ABC  (A B C)  (B C)  (BC)

Рассмотрим применение этих функций при сравнении с образцом. Чтобы match присваивала значения, требуется в ее определениии заменить символ * на >.

Фрагмент программы для 1-го случая:

((AND (EQUAL (ATOMCAR (CAR P)) '>)

(MATCH (CDR P)(CDR D)))

(SETQ (ATOMCDR (CAR P)(CAR D))

Т)

Если имя первого элемента образца начинается с > и сопоставление хвостов образца и факта прошло успешно, то параметру образца, который начинался с > присваивается список из первого элемента факта.

Изменим также и правила, связанные со знаком &.

((EQUAL (ATOMCAR (CAR P)) '&)

(COND ((MATCH (CDR P) (CDR D)) (2)

(SETQ (ATOMCDR (CAR P)) (LIST (CAR D)))

Т)

Возвращаем не один атом, а список из элементов:

((MATCH P (CDR D)) (3)

(SET (ATOMCDR (CAR P))

(CONS (CAR D)(EVAL (ATOMCDR (CAR P))))

Т)))

В приведенном фрагменте проверяется, является ли первый символ элемента из первого элемента списка P знаком &, если да, то с помощью COND реализуется одна из проверок 2 и 3.

Проверка 2 предполагает, что символу & соответствует первый элемент из D, далее проверяется, совпадают ли хвосты. Если да, то образец и факт совпали, тогда в переменную, которая начиналась с & записывается сделанная подстановка.

Например,

Образец (&L B D)

Образ (X B D)

Присваивание L(X)

Проверка 3 реализется когда & ставится в соответствие несколько элементов. Например,

Образец (&L B D)

Образ (X Y B D)

Ставим в соответствие L(X), хвосты не совпадают, ставим в соответсвие следующий элемент L(X Y), хвосты совпадают. Поэтому выполняется присваивание L(X Y) Если неудача, то присвоение не делается.

Рассмотренное определение функции требует изменений. Часто требуется не только подстановка в переменные, но и удовлетворение определенным свойствам при сопоставлении. Тогда в образец вписывают список "пакет ограничений".

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