5.2.1. Синтаксис представления правил

В настоящее время порождающие правила обычно реализуются в форме правил, манипулирующих с символическими структурами типа списка векторов, а не строк символов. В этом сказывается влияние языков программирования вроде LISP и тех структур данных, которые они поддерживают. (В ранних реализациях использовались языки манипулирования символами, например SNOBOL.)

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

  • подмножества N имен объектов предметной области;
  • подмножества Р имен свойств, которые рассматриваются в качестве атрибутов объектов;
  • подмножества V допустимых значений атрибутов.
  • На практике подмножества N и V перекрываются.

    Используемая грамматика, как правило, имеет вид триад объект-атрибут-значение. Триада (v, л, w) существует, если v принадлежит N и л принадлежит Р, w принадлежит V. Например, триада

    (ОРГАНИЗМ-1, морфология, палочка)

    представляет определенный микроорганизм, имеющий форму палочки.

    Представленная синтаксическая форма обобщается в том случае, когда нужно для некоторого объекта v представить « вариантов пар атрибут-значение (л1,w1) ..., (лn,wn). В таком случае они объединяются в вектор в форме

    (v, л1, w1,..., лn, wn).

    На языке CLIPS тот факт, что определенный микроорганизм имеет форму палочки и активно развивается в воздушной среде, будет представлен вектором

    (organism-1 (morphology rod) (aerobicity aerobic)).

    В дальнейшем мы будем повсеместно использовать именно такой синтаксис, поскольку CLIPS будет нашим основным программным инструментом.

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

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

    Продукционная система (production system) состоит из множества правил (иногда этот набор правил называют продукционной памятью production memory), интерпретатора правил, который решает, когда надлежит применить каждое из них, и рабочей памяти, содержащей данные, описание цели и промежуточные результаты, в совокупности определяющие текущее состояние проблемы. Именно структуры данных в рабочей памяти анализируются и преобразуются порождающими правилами. Обращение к правилам синхронизируется текущими данными, а интерпретатор правил управляет выбором и активизацией определенных правил в каждом цикле.

    Схематически правила в продукционной системе имеют такую обобщенную форму:

    P1,..., Pm,->Q1,..., Qn

    которая читается следующим образом:

    если предпосылки Р1 и ... и Рт верны, то выполнить действия Q1 и ... и Qn.

    Предпосылки часто называются условиями, а действия — заключениями, поскольку один из видов действий — сделать заключение, если встретилось такое сочетание условий, которое делает истинным или вероятным определенное порождающее правило, как это было показано в главе 3. Иногда используется и другая терминология, согласно которой предпосылки называются левой частью правила, а действия — правой.

    Предпосылки обычно бывают представлены в форме вектора объект-атрибут— значение, как, например:

    (organism-1 (morphology rod) (aerobicity aerobic)).

    В данном случае предпосылка состоит в том, что определенный микроорганизм имеет форму палочки и размножается в воздушной среде.

    Правило, которое включает такую предпосылку, на языке CLIPS имеет вид, показанный в листинге 5.1.

    Листинг 5.1. Оргправило системы MYCIN, записанное на языке CLIPS

    (defrule diagnosis

    (patient (name Jones)

    (organism organism-1))

    (organism (name organism-1)

    (morphology rod)

    (aerobicity aerobic)) => (assert

    (organism

    (name organism-1)

    (identify enterobacteriaceae)

    (confidence 0.8)))

    На языке CLIPS представление правила имеет следующий формат:

    (defrule <наименование правила> <предпосылка1>

    <предпосылка m > =>

    <действие 1>

    <действие n>

    Перечень предпосылок в таком правиле представляет собой образец вектора, которому должно соответствовать состояние рабочей памяти. Действия, такие как (assert ...) в приведенном выше примере, задают изменения, которые должны быть внесены в состояние рабочей памяти. Например, специфицированное в приведенном выше правиле действие добавит в рабочую память новый вектор

    (organism (name organism-1)

    (identify enterobacteriaceae)

    (confidence 0.8)).

    Таким образом, правило diagnosis означает следующее: если у определенного пациента обнаружена связь с определенным микроорганизмом, который имеет перечисленные в правиле свойства, то мы можем с определенным шансом на успех предполагать, что этот микроорганизм принадлежит такому-то классу. Это правило не является общим, поскольку применимо только к конкретному пациенту (Jones) и конкретному микроорганизму (organism-1). Гораздо чаще нам придется применять правила, которые пригодны для любого пациента и любого микроорганизма. В такие правила поле имени пациента вовсе не включается.

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

    Листинг 5.2. Правило, в котором используются переменные

    (defrule diagnosis

    (patient (name ?pat)

    (organism ?org))

    (organism (name ?org)

    (morphology rod)

    (aerobicity aerobic)) => (assert

    (organism

    (name ?org)

    (identify enterobacteriaceae) (confidence 0.8)))

    При использовании правила интерпретатором вместо всех одноименных переменных подставляется одно и то же значение.