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

Представление знаний на основе продукций

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

Представление продукций

Под продукцией или правилом понимается объект, состоящий из 2-х частей, - условия и следствия: «ЕСЛИ условие ТО следствие».

Интерпретатор продукций (машина вывода) применяет продукции к базе данных, где хранятся факты и строит доказательства для сформулированных гипотез. Для представления условий в продукциях обычно используются образцы, аналогичные тем, которые были рассмотрены в предыдущей лекции. Следствия также представлены образцами. Факты представляют собой некоторые образы и обычно имеют вид списков:

((животное имеет шерсть)

(животное полосатое)

(животное жвачное)).

Гипотеза обычно имеет вид списка, включающего переменные, заменяемые некоторыми значениями в процессе построения вывода. В дальнейшем рассмотрении будем рассматривать простые списковые образцы в правилах, - без переменных, предикатов и заменителей отдельных элементов или сегментов. (Прим. В используемых на практике Лисп-системах символы кодируются буквами латинского алфавита).

Правила необходимо рассматривать с 2-х точек зрения: (1) с точки зрения их определения в программе и удобства анализа и (2) с точки зрения их представления в форме удобной для вычислений (использования машиной вывода). Например, следующая форма достаточно удобна для размещения правил в программе:

(setq rule12 ;; переменная rule12 имеет в качестве значения одну из продукций

¢(if животное жвачное

and животное полосатое

then животное зебра))

Эта форма неудобна для работы машины вывода. Ее преобразуют в такую форму, чтобы условия и следствие были представлены списками, подобно представлению фактов. Так, каждое правило можно представить тройкой, которая будет включать имя правила, список, представляющий условие, и список, представляющий заключение. Для реализации этого, например, в Common Lisp’е можно воспользоваться механизмом структур. Объявление структурного типа выглядит следующим образом:

(defstruct имя-типа

имя-поля1 имя-поля2 …………имя-поляN).

Собственно структурные данные создаются конструктором следующего вида:

(make-имя-типа выражения инициализации полей структуры).

Когда определяется структурный тип данных автоматически создаются:

  • предикат проверки структурного типа в виде (имя-типа объект-данных),

  • функции для доступа к полям структурного объекта данных - (имя-типа-имя-поля объект-данных).

Т.о., имеем следующий вариант объявления структур для представления правил и пример выражения создания некоторого правила:

(defstruct rule name cond concl),

где rule – структурный тип данных, name – поле для имени правила, cond – поле для условия (посылки), concl – поле для размещения заключения.

(make-rule :name ¢rule12

:cond ¢((животное жвачное) (животное полосатое))

:concl ¢((животное зебра))

).

Пусть, теперь, в программе имеется следующий набор переменных, которым сопоставлены в качестве значений правила: rule1, rule2,…, rule10,… . Объединим все имена переменных в список, следующим образом:

(setq knowledgebase ¢(rule1 rule2…rule10…))

Исходные правила из формы удобной для анализа преобразуются к структурному виду функцией analyse:

(setq rules (analyse knowledgebase),

которая берет список имен правил, преобразует правила к структурному виду и объединяет их в список.

(defun analyse (rules)

(mapcar ¢do_rule rules))

Преобразование отдельного правила выполняет функция do_rule:

(defun do_rule (oldform)

(prog (rule)

(setq rule (eval oldform) ;; oldform – имя переменной (имя правила)

(return (make-rule

:name oldform

:cond (conditions rule)

:concl (conclusion rule))

))

)

Формирование списков, представляющих условие и следствие, соответственно, выполняют функции conditions и conclusion:

(defun conditions (sent)

(term (cdr sent) nil nil)) ;; атом if пропускается

(defun conclusion (sent)

(term (cdr (member ¢then sent)) nil nil)) ;; все начальные символы

;; включая then пропускаются

Функция member выделяет подсписок из исходного списка, начинающийся атомом, который указывается 2-м параметром. Следующая функция (term) выделяет отдельные предложения из условия и следствия и объединяет их в список.

(defun term (sent part rez) ;; sent-исх.список, part-частично сформир-й список,

(cond ;; rez список списков (результат)

((null sent) ;; весь список обработан

(append rez (list part)))

((eq (car sent) ;; завершена обработка условия

(append rez (list part)))

((eq (car sent) ¢and) ;; завершена обработка части условия до симв. and

(term (cdr sent) nil (append rez (list part))))

(t ;; продолжение обработки исходного списка

(term (cdr sent) (append part (list (car sent))) rez))

))

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