Опубликован: 19.03.2004 | Доступ: свободный | Студентов: 2799 / 417 | Оценка: 3.98 / 3.79 | Длительность: 17:50:00
ISBN: 978-5-9556-0008-6
Лекция 13:

Функции высших порядков

< Лекция 12 || Лекция 13: 123 || Лекция 14 >

Конструирование распознавателей

Результативность функций высших порядков Хендерсон показывает на модельной задаче построения распознавателя   контекстно-свободного языка [ 3 ] .

В качестве примера такого языка рассмотрен синтаксис понятия "слог", образованный по правилам из гласных и согласных букв, что можно представить грамматикой вида:

<а-гр> ::= А | А <а-гр>
 
<в-гр> ::= В | В <в-гр>
 
<слог> ::= <а-гр> <в-гр> 
          | <в-гр> <а-гр> 
          | <в-гр> <а-гр> <в-гр>

В этой грамматике " А " и " В " — терминальные символы, "слог", "а-гр" и "в-гр" — нетерминальные символы (метапонятия), "слог" — основное понятие. Необходимо быстро построить предикат is-syllable, выделяющий списки, представляющие правильно построенные слоги в соответствии с приведенными правилами.

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

Пусть тексты этого языка представляются списками из однобуквенных атомов A и B. Допустим, имеются предикаты is-A и is-B, выделяющие одноэлементные списки (A) и (B), соответственно.

(DEFUN is-a (x)(COND ((EQ(CAR x) 'a)
                      (null (CDR x))) ))
   ; распознаватель A

(DEFUN is-b (x)(COND ((EQ(CAR x) 'b)
                      (null (CDR x))) )) 
   ; распознаватель B

Типовые ранги этих функций одинаковы: List (X) -> Bool. Таким же должен быть и ранг результирующей функции is-syllable. При ее построении будет применена вспомогательная функция более высокого порядка is-alt, которая из произвольных предикатов конструирует новый предикат, перебирающий варианты правил и выдающий NIL, если ни одно из них не подходит. Функция is-alt может быть определена следующим образом:

(DEFUN is-alt (p q) 
 ; конструктор распознавателя альтернатив
     #'(LAMBDA (x) 
          (COND ((funcall p x )T) 
                ((funcall q x) T)
                (T NIL))))

Ее типовый ранг имеет вид:

(List(X)->Bool List(X))->Bool ) )-> List(X))->Bool

Можно использовать эквивалент:

(DEFUN is-alt (p q)
    #'(LAMBDA (x)
        (if (funcall p x) T (funcall q x))
)

Предикат both, работающий как логическая связка "и", можно реализовать как обычную функцию с типовым рангом (Bool Bool) -> Bool.

(DEFUN both (x y) (COND ( x y)(T NIL)) ) 
; проверка одновременности условий

Еще одна вспомогательная функция высокого порядка is-chain из произвольных предикатов конструирует новый предикат, выясняющий, не выделяют ли исходные предикаты смежные звенья цепочки. Типовый ранг этой функции должен быть таким же, как у is-alt, т.к. их результаты используются при разборе и анализе текста в одинаковых позициях.

(DEFUN is-chain (p q) #'(LAMBDA (x ) 
; конструктор распознавателя цепочек
      (COND ((null x) (both (funcall p x) 
                            (funcall q NIL)) ) 
; пустая цепочка 
            ((both (funcall p x) (funcall q NIL)) T) 
; префикс без суффикса 
            ((both (funcall p NIL) (funcall q x)) T) 
; суффикс без префикса 
            ((both (funcall p (CONS (CAR x)NIL)) 
                   (funcall q (CDR x)) ) T) 
; допустимое разбиение
   (T(funcall (is-chain (LAMBDA(y)(funcall p(CONS(CAR x)y)))
                         q )
              ( CDR x)       )) 
; сдвиг границы разбиения вправо 
)))

Из данного распознавателя is-a можно бы и без функций высших порядков построить распознаватель is-a-gr, распознающий группу из любого числа символов A:

(defun is-a-gr (x ) (if x 
; распознаватель цепочек из A
   (cond ((eq (car x) 'a) (is-a-tl (cdr x)) ) 
; <а-гр> ::= А | А <а-гр>
   (t nil) ) Nil))

(defun is-a-tl (x)(cond ((null x)T)((eq (car
   x)'A)(is-a-tl (cdr x )) )))) 
; хвост цепочки из A

Но использование конструкторов is-alt и is-chain, показанное на примере распознавателя is-b-gr, позволяет построить определение, синтаксически подобное правилу грамматики:

(DEFUN is-b-gr (x ) (funcall (is-alt #'is-b 
   is-chain #'is-b #'is-b-gr)) x )) 
; распознаватель цепочек из B
; <в-гр> ::= В | В <в-гр>

Теперь опробованные приемы конструирования распознавателей применяем к построению функции is-syllable, активно опираясь на чисто внешнее, синтаксическое подобие определению заданной грамматики:

(DEFUN is-syllable (x ) 
; распознаватель слога
   (funcall (is-alt (is-chain #'is-b-gr #'is-a-gr) 
; слог вида  BA
      (is-alt (is-chain #'is-a-gr #'is-b-gr) 
; слог вида  AB
(is-chain #'is-b-gr (is-chain #'is-a-gr #'is-b-gr)) 
; слог вида BAB
      ) ) x ))
 
(is-syllable '(a b))
(is-syllable '(b a))
(is-syllable '(b a b ))
(is-syllable '(b b b b a a b b ))

Сопоставляя правила и полученное определение распознавателя, можно убедиться, что собственно конструирование распознавателя осуществляется и модернизируется сравнительно быстро: достаточно свести распознаваемый язык к композиции альтернатив и цепочек.

Таблица 13.1. Сопоставление грамматики слога и распознавателя is-syllable
Грамматика Распознаватель
<слог>::= (defun is-syllable (x ) (funcall
<в-гр> <а-гр> (is-alt (is-chain #'is-b-gr #'is-a-gr)
<а-гр> <в-гр> (is-alt (is-chain #'is-a-gr #'is-b-gr)
<в-гр>
      <а-гр> <в-гр>
(is-chain #'is-b-gr 
    (is-chain #'is-a-gr #'is-b-gr))
) ) x ))

Результат сопоставления показывает, что достигнуто синтаксическое подобие определения грамматики и построенного распознавателя. Это значит, что определение можно автоматически отобразить в такой распознаватель . Отображениефункция высокого порядка, вырабатывающая в качестве результата распознаватель языка, порождаемого исходной грамматикой.

< Лекция 12 || Лекция 13: 123 || Лекция 14 >
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?