Главная страница
Навигация по странице:

  • VARIABLE). Ниже приведена кон- (deftemplate person (multislot пате (type SYMBOL)) (slot age (type INTEGER) (range 0

  • дб. Четвертое издание джозеф Джарратано Университет Хьюстон клиэрЛэйк Гари Райли People5oft, Издательский дом "Вильямс" Москва СанктПетербург Киев 2007 ббк 32. 973. 26 018 75 Д


    Скачать 3.73 Mb.
    НазваниеЧетвертое издание джозеф Джарратано Университет Хьюстон клиэрЛэйк Гари Райли People5oft, Издательский дом "Вильямс" Москва СанктПетербург Киев 2007 ббк 32. 973. 26 018 75 Д
    Дата19.05.2022
    Размер3.73 Mb.
    Формат файлаpdf
    Имя файла[Dzharratano Dzhozef, Raili Gar - Nieizviestnyi.pdf
    ТипДокументы
    #538649
    страница57 из 74
    1   ...   53   54   55   56   57   58   59   60   ...   74

    imi t> задает максимальное значение для слота. Обозначение ?
    VARIABLE указывает, что не задано либо минимальное, либо максимальное значение (в зависимости оттого, находится ли оно на первом или на втором месте. Например, чтобы предотвратить возможность помещать в слот отрицательные значения, слот age в конструкции deftemplate с именем person можно изменить следующим образом Атрибут Атрибут cardinality позволяет задавать минимальное и максимальное количество значений, которые могут храниться в конструкции multislot. Атрибут cardinality имеет общий формат ),â котором термы — limit> и представляют собой либо обозначение ? VARIABLE, либо положительное целое число.
    Терм показывает минимальное количество значений, которое может содержаться в слоте, а терм limit> позволяет указать максимально допустимое количество значений, содержащихся в слоте. Обозначение показывает, что не задано либо минимальное, либо максимальное количество значений, которое может быть указано в слоте (в зависимости оттого, находится это обозначение на первом или втором месте. По умолчанию атрибут cardinality для любого многозначного значения для конструкции mu1 t is lot имеет вид (cardinality ?VARIABLE ?

    VARIABLE). Ниже приведена кон- (deftemplate person (multislot пате (type SYMBOL)) (slot age (type INTEGER) (range 0 ?
    VARIABLE))) А если бы потребовалось явно сформулировать предположение, что никто не сможет прожить больше 125 лети ввести тем самым дополнительное ограничение, то можно было бы заменить это определение атрибута range определением 0 125). Как ив случае атрибутов допустимого значения,
    атрибут range не ограничивает тип значения слота таким образом, что если в нем заданы числа, то и тип должен быть числовым. Этот атрибут ограничивает только допустимые числовые значения слота заданным диапазоном, если значение
    слота является числовым. По умолчанию в качестве атрибута range для слотов применяется (range ?VARIABLE ?VARIABLE).
    700 Глава 9. Модульное проектирование, управление выполнением. струкция deftemplate, которая может использоваться для представления состава волейбольной команды, в которую входят сотрудники компании в этой команде должно быть шесть игроков, а количество запасных игроков может достигать двух. Обратите внимание на то, что к каждому значению, содержащемуся в конструкции multis lot, применяются ограничения типа допустимого значения и диапазона volleyball-team (slot пате (type STRING)) (multislot players (type STRING) (cardinality б б) (multislot alternates (type
    STRING) (cardinality О 2))) Атрибут default В предыдущих главах каждый факт бей1етр1а1:е, вводимый в список фактов, всегда имел явно заданное значение для каждого слота. Но часто бывает удобно автоматически сохранять в слоте указанное значение, если в команде assert явно не задано какое-либо значение. Возможность задавать применяемое по умолчанию значение обеспечивается атрибутом default. Атрибут default имеет общий формат (default ), в котором терм может представлять собой обозначение ?DERIVE или ? NONE, единственное выражение
    (для однозначного слота, либо от нуля и больше выражений
    (для многозначного слота. Если в атрибуте de Йаы11 задано обозначение DERIVE, то для данного слота должно быть выведено логическим путем определенное значение, которое соответствует всем атрибутам слота. Если для слота не задан атрибут default, то предполагается, что этот атрибут имеет вид ? DERIVE). Применительно к однозначному слоту это означает, что выбирается значение, которое удовлетворяет всем требования к атрибутам типа, диапазона и допустимого значения для этого слота. Выведенным логическим путем и заданным по умолчанию значением для многозначного слота становится список идентичных значений, которые имеют
    минимально допустимую кардинальность для данного слота (по умолчанию равную нулю. Если в заданном по умолчанию значении для многозначного слота содержится одно или несколько значений, то каждое из этих значений должно соответствовать атрибутам типа, диапазона и допустимого значения для этого слота. Ниже приведен пример значений,
    выведенных логическим путем. CLIPS> (clear)J CLIPS>
    (бей

    евр1ае ехавр1е (slot а. Атрибуты de f template 701 (slot b (type INTEGER) ) (slot се О (example асе а total of 1 fact. CLIPS> Система CLIPS гарантирует только то, что выведенное логическим путем и заданное по умолчанию значение для слота удовлетворяет атрибутам ограничения для этого слота. Иными словами, программа не должна зависеть от конкретных производных значений (таких как символ типа nil для слота а или целое число О для слота b в предыдущем примере, помещаемых в слоты. Если же программа зависит от какого-то конкретного применяемого по умолчанию значения, то должно использоваться некоторое выражение с атрибутом default (сведения по этой теме приведены ниже. Если в атрибуте default задано обозначение ?
    NONE, то необходимо предусматривать применение некоторого значения для данного слота вовремя ввода факта в список фактов. Иными словами, в таком случае применяемое по умолчанию значение не предусмотрено. В качестве примера можно привести следующий диалога Ь (default ?NONE)))J CLIPS>
    (assert (ezample))J [TMPLTRHS1] Slot b requires а value because of its (default ?NONE) attribute. CLIPS> (assert (example (b 1))) 1
    CLIPS> (facts)J

    702 Глава 9. Модульное проектирование, управление выполнением. f — 0 (example (а nil) (Ь 1)) For а total of 1 fact.
    CLIPS> Если используется одно или несколько выражений с атрибутом default, то вовремя синтаксического анализа слота эти выражения вычисляются и полученное значение сохраняется в слоте каждый раз, когда значение остается не заданным в команде assert. Атрибут default для однозначного слота должен содержать одно и только одно выражение. Если же в атрибуте бе fault для многозначного слота выражения не заданы, то для применяемого по умолчанию значения используется многозначная величина с количеством значений,
    равным нулю. В противном случае возвращаемые значения всех выражений группируются вместе для формирования одного многозначного значения. Ниже приведен пример, в котором применяются выражения с атрибутом default. CLIPS> (clear)J
    CLIPS> (deftemplate example (slot аса с) (multislot d (default (+ 1 2) (+ 3 4))))J
    CLIPS> (assert (example))J CLIPS> (facts)J f — 0
    (example аса с) (d 3 7)) For а total of 1 fact. Атрибут default-dynamic Если используется атрибут default, то применяемое по умолчанию значение для слота определяется вовремя синтаксического анализа объявления слота.
    Предусмотрена также возможность обеспечить выработку применяемого по умолчанию значения вовремя ввода в список фактов того факта, в котором будет использоваться это значение, предусмотренное по умолчанию. Для выполнения такой задачи используется атрибут default-dynamic. Если значение слота, в котором применяется атрибут остается не заданным в команде assert, то вычисляется выражение, заданное с помощью атрибута default — которое затем используется в качестве значения слота. В
    качестве примера рассмотрим, какие проблемы могут быть связаны с решением такой задачи, когда требуется удалить некоторые факты по истечении определенного времени. Прежде всего необходимо найти некоторый способ, поз

    9.2. Атрибуты de f template 703 воляющий узнать, когда произошла вставка интересующих нас фактов в список фактов.
    В данном случае для проставления в фактах отметки времени создания фактов будет использоваться функция предусмотренная в языке CLIPS. Эта функция возвращает данные о количестве секунд, истекших сначала отсчета времени, зависящего от системы. Как таковое возвращаемое значение функции time не имеет смысла. Оно применимо только при сравнении с другими значениями, возвращаемыми этой функцией. В рассматриваемом примере будет использоваться следующая конструкция de f template, в которой содержится слот creation — time, предназначенный для хранения значения времени создания, и слот value, в котором хранится значение,
    связанное с фактом (deftemplate data (slot creation-time (default- dynamic (time))) (slot value)) После создания каждого факта data и определения того, что слот creation— time не задан,
    вызывается функция time и возвращаемое ею значение сохраняется в слоте creation — time следующим образом (watch facts)J CLIPS> (assert (data (value 3))) ! > f-0 (data
    (creation-time 12002.45) (value 3)) CLIPS> (assert (data
    (value b)))J > f-1 (data (creation-time 12010.25) (value b))
    CLIPS> (assert (ба1.а (value с) > f-2 (data (creation-time
    12018.65) (value с) CLIPS> Если принято предположение, что факт current — time вводится в список фактов и обновляется другими правилами для включения в него текущего системного времени, то следующее правило позволяет извлекать факты data, вставка которых была выполнена минуту назад (defrule retract-data-facts-after-one-minute ?f <- (data
    (creation-time ?t1)) (current-time ?t2) (test (> (- ?t2 ?tl) Глава 9. Модульное проектирование, управление выполнением. 704 — > (retract ?f)) (retract ?f)) В этом правиле значение функции time проверяется в условном элементе test только при согласовании первого шаблона с фактом data. А
    поскольку возвращаемое значение может представлять собой
    примерно такое же значение времени, как и значение в слоте creation — time, то проверка правила не будет завершаться успешно. С другой стороны, система CLIPS не будет непрерывно выполнять повторную проверку условных элементов test для определения того, приводит ли их вычисление к получению других значений они проверяются, только если возникают изменения в предшествующих им условных элементах. Именно поэтому приходится обновлять факт current — time в первоначальной версии правила, чтобы периодически повторно проверялся данный условный элемент test. Конфликтующие атрибуты слота Система CLIPS не позволяет задавать для слота конфликтующие атрибуты. Например, заданное по умолчанию значение слота должно соответствовать типу слота,
    определению allowed- а также атрибутами. Если задан атрибут allowed —..., то тип, связанный с этим атрибутом,
    должен соответствовать атрибуту type слота. С атрибутом range не могут использоваться атрибуты allowed — numbers, allowed- integers и allowed — floats. 9.3 Значимость До сих пор для неявного управления выполнением программ использовались управляющие факты. Кроме того, в системе предусмотрены два явных метода управления исполнением правил, основанных на применении понятия значимости и модулей. Метод управления исполнением правил с использованием модулей будет рассматриваться ниже в этой главе, а в данном разделе речь идет о применении понятия значимости. Ключевое слово salience (значимость) позволяет явно задавать приоритеты правил. При обычных условиях рабочий список Обратите внимание на то, что замена правила retract-data — facts— after-one — minute следующим правилом не позволяет получить такие же результаты (defrule retract-data- facts-after-one-minute ?f <- (data (creation-time ?t1)) (test (> (-
    (time) ?t1) 60)) — >
    9.3. Значимость 705 правил действует по принципу стека. Это означает, что запускается активизированное правило, которое
    было помещено в рабочий список правил самым последним повремени. С другой стороны, средства определения значимости позволяют оставлять в верхней части рабочего списка правил более важные правила независимо оттого, когда произошло введение этих правила правила с более низкой значимостью задвигаются в рабочем списке правил ниже правил с более высокой значимостью. Значимость задается с помощью числового значения, изменяющегося в пределах от наименьшего значения, равного — 10 0 О О, до наибольшего, равного 10 0 О
    О. Если некоторому правилу программистом не было явно присвоено значение значимости, то система CLIPS принимает предположение, что значимость этого правила равна О.
    Заслуживает внимания то, что значимость, равная О, занимает среднее положение между максимальными минимальным значениями значимости. Значение значимости, равное О,
    означает не то, что правило не имеет значимости, а, скорее, то,
    что данное правило находится на промежуточном уровне приоритета. Вновь активизированное правило помещается в рабочий список правил перед всеми правилами с равной или меньшей значимостью и после всех правил с большей значимостью. Одно из направлений использования значимости состоит в том, чтобы принудительно обеспечивать запуск правил в определенной последовательности. Рассмотрим следующее множество правил, в которых значения значимости не объявлены (defrule fire-first (priority first) — > (printout t "Print first"
    crlf)) (defrule fire-second (priority second) => (printout t "Print second" crlf)) (defrule fire-third (priority third) => (printout t "Print third" crlf)) Порядок, в котором будет осуществляться запуск этих правил, зависит оттого, в каком порядке в список фактов вводились те факты, которые соответствуют условным элементам в левых частях правил. Например, если правила уже введены в систему, то ввод следующих команд приведет к формированию приведенного ниже вывода

    706 Глава 9. Модульное проектирование, управление выполнением. CLIPS> (unwatch all)J CLIPS> (reset)J CLIPS>
    (assert (priority first))J CLIPS> (assert (prioritó second))J
    CLIPS> (assert (priority third)) 1 CLIPS> (run)J
    Print third Print second Print first CLIPS> Обратите внимание на то, какова последовательность операторов вывода. Вначале на устройстве вывода появляется строка "Print third", затем "Print second" и наконец "Print first". Первый факт (priority активизирует правило fire — first. После ввода в список правил второго факта он активизирует правило fire — second, которое задвигается в стек поверх активизации, соответствующей правилу fire-first. Наконец происходит ввод в список фактов третьего факта, и его активизированное правило, fire — задвигается в стек поверх активизации для правила fire —
    second. В системе CLIPS приоритеты правил с равной значимостью, которые активизируются в результате сопоставления с разными шаблонами, определяются с учетом порядка фактов в стеке. А запуск правил из рабочего списка правил происходит от вершины стека в направлении вниз.
    Поэтому вначале происходит запуск правила fire — поскольку оно находится в верхней части стека, затем запускается правило fire — second и наконец — правило fire —
    first. Если бы порядок вставки фактов был обратным, то порядок,
    в котором происходит запуск правил, также был бы обратным. В
    этом можно убедиться, ознакомившись со следующим выводом (reset)J CLIPS> (assert (priority third))J CLIPS>
    (assert (priority second))J CLIPS> (assert (priority first))J
    CLIPS> (run)J Print first Print second
    9.3. Значимость 707 Print third CLIPS> Необходимо учитывать также еще одно важное соображение если под действием одного итого же факта активизируется два или несколько правил с одинаковой значимостью, то невозможно гарантировать определенный порядок помещения этих правил в рабочий список правил. Для принудительного обеспечения
    запуска правил в последовательности fire — first, fire — second и fire — third, независимо оттого, в каком порядке происходил ввод фактов, активизирующих эти правила, в список фактов,
    можно использовать значимость. Такой подход может быть осуществлен путем объявления значений значимости,
    например, следующим образом (defrule fire-first (declare
    (salience 30)) (priority first) — > (printout t "Print first" crlf)) (defrule fire-second (declare (salience 20)) (priority second) — > (printout t
    "Print second" crlf)) (defrule fire-third (declare (salience 10)) (priority third) > (printout t "Print third" crlf)) В этом случае, независимо оттого, в каком порядке будет происходить ввод в список фактов рассматриваемых фактов priority, рабочий список правил всегда будет иметь одну и туже упорядоченность. Выполнение команды agenda после ввода фактов priority в список фактов приведет к получению следующего вывода CLIPS> (reset)J
    CLIPS> (assert (priority second) (priority first) (priority third)) ! 3> CLIPS> (agenda)J 30 fire-first: f-2 20 fire-second: f-1 10 fire —
    third: f — Глава 9. Модульное проектирование, управление выполнением. 708 For а total of 3 activations. CLIPS> Обратите внимание на то, как были переупорядочены правила в рабочем списке правил согласно приоритетами благодаря использованию значений значимости. После вызова программы на выполнение порядок запуска правил будет всегда одинаковым fire — first, fire-second, fire-third. 9.4 Фазы и управляющие факты Определению понятия экспертной системы, основанной на правилах, в наибольшей степени соответствует такая система, в которой правила действуют оппортунистически (иначе говоря, подчиняясь обстоятельствам),
    т.е. вызываются в любых обстоятельствах, когда они являются применимыми. Нов большинстве экспертных систем приходится также учитывать некоторые процедурные аспекты. Например, в программе Sticks имеются различные правила, применимость которых зависит оттого, принадлежит ли очередность хода
    игроку-человеку или компьютеру. Управление этой программой осуществляется с помощью фактов, которые указывают, кто должен сделать следующий ход. Такие управляющие факты позволяют включать в состав правил, относящихся к рассматриваемой области знаний, информацию о структуре управления программой. Но такой подход имеет определенный недостаток знания о том, как организовано управление правилами, смешиваются со знаниями о том, как играть в игру. В случае программы Sticks указанный недостаток не имеет существенного значения, поскольку эта программа невелика. А что касается программ, состоящих из сотен или тысяч правил, то смешивание знаний предметной области и управляющих знаний приводит к тому, что разработка и сопровождение существенно усложняются. В качестве примера рассмотрим проблему осуществления этапов обнаружения неисправностей, локализации неисправностей и возобновления нормальной работы в такой системе, как электронное устройство. Обнаружение неисправностей — это процесс,
    позволяющий признать, что электронное устройство не функционирует должным образом. Локализация — это процесс определения того, какие компоненты устройства вызвали нарушение в работе. А возобновление нормальной работы это процесс определения этапов, необходимых для устранения нарушения в работе (если это возможно. Вообще говоря, в экспертной системе, предназначенной для решения задач рассматриваемого типа, должны быть одни правила,
    позволяющие определить, имеет ли место неисправность,
    другие правила, позволяющие локализовать источник неисправности, а также еще одна категория правил,
    позволяющих найти способ возобновления нормальной работы после устранения возникшей неисправности. Затем система должна возвратиться в начало цикла, состоящего из этих трех этапов. Пример того, как должно быть

    709 9.4. фазы и управляющие факты организовано управление ходом выполнения этапов в системе рассматриваемого типа, приведен на рис. 9.1. Рис. Различные фазы решения задачи обнаружения неисправности,
    локализации неисправности и возобновления нормальной работы Реализация способа передачи управления в этой системе может быть осуществлена с использованием по крайней мере четырех подходов. В первых трех подходах используется значимость эти подходы рассматриваются в настоящем разделе. Четвертый подход, в котором применяются модули, будет рассматриваться ниже в данной главе. Первый подход к реализации возможностей передачи управления состоит в том, чтобы представить управляющие знания непосредственно в правилах. Например, правила, применяемые в фазе обнаружения неисправностей, могут включать правила,
    указывающие, когда должен быть осуществлен переход в фазу локализации. В таком случае каждой группе правил присваивается шаблон, указывающий, в какой фазе являются применимыми эти правила. Но такой метод имеет два недостатка. Во-первых, как уже было сказано, управляющие знания вкладываются вправила, которые представляют знания проблемной области, в результате чего эти правила становятся более сложными для понимания. Во-вторых, не всегда легко определить, когда завершилась некоторая фаза. В связи с этим,
    вообще говоря, требуется предусматривать определенное правило, применимое, только если произошел запуск всех других правил. Второй подход состоит в том, что для упорядочения правил используется понятие значимости (рис. Но этот подход также имеет два существенных недостатка.
    Во-первых, управляющие знания по-прежнему вкладываются вправила с применением значимости. Во-вторых, этот подход не гарантирует, что исполнение правил будет происходить в правильном порядке. Безусловно, правила фазы обнаружения будут всегда активизироваться перед правилами фазы локализации

    710 Глава 9. Модульное проектирование, управление выполнением. Рис. 9.2. Подход, в котором правилам различных фаз присваиваются разные значения значимости Третий и лучший подход к управлению потоком исполнения правил состоит в том, чтобы отделить управляющие знания от знаний в проблемной области (рис. 9.3). При использовании этого подхода в каждом правиле предусматривается управляющий шаблон, который показывает, в какой фазе это правило применимо. Затем формулируются управляющие правила для передачи управления между различными фазами, как показано ниже. (defrule detection-to-isolation (declare (salience -10)) ?phase
    <- (phase detection) — > (retract ?phase) (assert (phase isolation)))
    (defrule isolation-to-recovery (declare (salience -10)) ?phase <-
    (phase isolation) — > (retract ?phase) (assert (phase recovery)))
    (defrule recovery-to-detection (declare (salience -10)) ?phase <-
    (phase recovery) Но, после того как начнется запуск правил фазы локализации, они могут активизировать правила фазы обнаружения и немедленный запуск последних из-за их более высокой значимости 9.4. Фазы и управляющие факты 711 Рис. 9.3. Отделение экспертных знаний от управляющих (retract ?phase) (assert
    (phase detection))) Затем каждому из правил, применимому в конкретной фазе, присваивается управляющий шаблон, который позволяет проверить наличие соответствующего управляющего факта. Например, правило фазы возобновления нормальной работы может выглядеть следующим образом (defrule find-fault- location-and-recovery (phase recovery) (recovery-solution switch- device ?replacement on) => (printout t "Switch device" ?replacement
    "on" crlf)) Иерархия значимостей представляет собой описание значений значимости, используемых в экспертной системе.
    Каждый уровень в иерархии значимостей соответствует конкретному множеству правил, всем элементам которого присваивается одинаковая значимость. Если правилам,
    используемым в фазах обнаружения неисправностей
    локализации и возобновления нормальной работы,
    присваивается применяемое по умолчанию значение значимости, равное нулю, то формируется иерархия значимостей (рис. 9.4). Обратите внимание на то, что правило detection — to — isolation будет находиться в рабочем списке правил до тех пор, пока факт (phase detection) присутствует в списке фактов. Но 712 Глава 9. Модульное проектирование, управление выполнением. правило detection — to — isolation имеет более низкую значимость по сравнению с правилами фазы обнаружения неисправностей, поэтому его запуск не произойдет до тех пор, пока все правила фазы обнаружения не получат возможность запуска. Ниже приведен вывод, в котором показан пример прогона трех описанных ранее управляющих правил.
    Рис. 9.4. Иерархия значимостей, создаваемая при использовании экспертных и управляющих правил CLIPS>
    (reset)J CLIPS> (assert (phase detection CLIPS> (watch rules)J CLIPS> (run 10)J FIRE 1 detection-to-isolation FIRE 2
    isolation-to-recovery: FIRE 3 recovery-to-detection: FIRE 4
    detection-to-isolation FIRE 5 isolation-to-recovery: FIRE б recovery- to-detection: FIRE 7 detection-to-isolation FIRE 8 isolation-to- recovery: FIRE 9 recovery — to — detection: FIRE 10 detection-to- isolation CLIPS> f — 2 f — 3 f — 4 f — 5 f — б f — 7 f — 8 f — 9 f
    — 10 Следует отметить, что в данном примере происходит запуск управляющих правил одного за другим, поскольку отсутствуют правила со знаниями в проблемной области,
    которые могли бы быть применены в каждой из рассматриваемых фаз. А если бы такие правила были предусмотрены, то правила со знаниями в проблемной области использовались бы в качестве активизированных правил вовремя прохождения соответствующих фаз

    9.4. фазы и управляющие факты 713 Для формулировки приведенных выше управляющих правил можно применить более обобщенную форму записи с конструкцией бей и единственным правилом (deffacts control-information (phase detection) (phase-after detection isolation) (phase-after isolation recovery) (phase-after recovery detection)) (defrule change-phase
    (declare (salience -10)) ?phase <- (phase ?current-phase) (phase- after ?current-phase ?next-phase) > (retract ?phase) (assert (phase
    ?next-phase))) Еще один вариант состоит в том, что эти правила могут быть записаны с использованием циклически осуществляемой последовательности фаз (deffacts control- information (phase detection) (phase-sequence isolation recovery detection)) (defrule change-phase (declare (salience -10)) ?phase <-
    (phase ?current-phase) ?list <- (phase-sequence ?next-phase $?
    other-phases) — > (retract ?phase ?list) (assert (phase ?next- phase)) (assert (phase-sequence ?other-phases ?next-phase))) К
    такой иерархии значимостей можно легко добавить дополнительные уровни. Пример иерархии с двумя дополнительными уровнями показан на рис. Ограничивающие правила представляют собой правила,
    позволяющие обнаруживать недопустимые или непроизводительные состояния, которые могут возникнуть в экспертной системе. В частности, экспертная система,
    применяемая для составления графиков, в соответствии с которыми люди выполняют различные задания, может выработать график с нарушением некоторого ограничения. Но ограничивающие правила смогут немедленно устранить нарушения в графике, не позволяя продолжить работу над графиком с помощью правил с более низкой значимостью. В
    качестве еще одного примера можно указать, что пользователь Глава 9. Модульное проектирование, управление выполнением. 714 Рис. 9.5. Иерархия значимостей с четырьмя уровнями Правила запроса (см. рис. 9.5) представляют собой правила, с помощью которых пользователю могут быть заданы
    конкретные вопросы, чтобы можно было оказать помощь экспертной системе при определении ответа. Эти правила имеют более низкую значимость, чем экспертные правила,
    поскольку нежелательно задавать пользователю такие вопросы,
    ответы на которые можно определить с помощью экспертной системы. Поэтому запуск правил запроса происходит, только если с помощью экспертных правил невозможно получить логическим путем дополнительную информацию. Неправильное употребление подхода на основе значимости
    Безусловно, значимость представляет собой мощное средство управления выполнением программы, но при его использовании можно легко допустить ошибку. Особенно злоупотребляют применением значений значимости те, кто только приступает к изучению программирования на основе правил, поскольку стремятся обеспечить явный контроль над выполнением с помощью значимости. Формируемая при этом программа в большей степени напоминает программы, созданные может ввести в ответ наряд вопросов ряд допустимых значений, но программа выработает недопустимое значение. Для обнаружения подобных нарушений могут использоваться ограничивающие правила. Неправильное употребление подхода на основе значимости по принципам процедурного программирования (к которому привыкли эти программисты, когда операторы программы выполняются последовательно. В результате злоупотребления подходом на основе значимости создаются плохо закодированные программы. Основным преимуществом программирования на основе правил является то, что программисту не приходится заботиться об управлении выполнением программы. Поэтому правильно спроектированная программа на основе правил действует в естественном режиме выполнения, который позволяет машине логического вывода управлять запуском правил оптимальным образом. Значимость следует использовать главным образом как механизм
    определения порядка, в котором должен происходить запуск правил. При этом подразумевается, что правило, помещенное в рабочий список правил, вообще говоря, когда-либо все равно будет запущено. Это означает, что значимость не следует использовать как метод выбора единственного правила из группы правил, поскольку для выражения критериев выбора могут применяться шаблоны. Кроме того, значимость не следует использовать как способ "быстрого исправления" дефектов программы, чтобы обеспечить запуск правил в надлежащем порядке. Вообще говоря, любое значение значимости,
    применяемое в правиле, должно соответствовать одному из уровней в иерархии значимостей экспертной системы. То, что диапазон значений значимости составляет от — 10000 до немного сбивает столку. При разработке программы для любой экспертной системы редко приходится использовать больше семи значений значимости, а в большинстве успешно запрограммированных экспертных систем применяется не больше трех или четырех значений значимости. Настоятельно рекомендуется, чтобы программисты при создании крупных экспертных систем применяли для управления потоком выполнения модули (как описано в следующем разделе) и чтобы количество используемых значений значимости не превышало двух или трех. В качестве примера того, как можно обойтись без применения значимости, ниже приведено простое множество правил, позволяющее определить, в каких клетках следует ставить отметку в игре в крестики-нолики. Правила перечислены в том порядке, в каком они должны использоваться. IF а winning square is open, THEN take it. IF а blocking square is open, THEN
    take it. IF а square is open, THEN take Если факт choose — move показывает, что должен быть сделан хода факты open —
    square позволяют прийти к выводу, что открыт выигрывающий, блокирующий (blocking), средний (middle), угловой) или боковой (side) квадрат, то выбор подходящего хода осуществляется с помощью следующих правил

    716 Глава 9. Модульное проектирование, управление выполнением. (defrule pick-to-win (declare (salience 10)) ?phase
    <- (choose-move) (open-square win) — > (retract ?phase) (assert
    (move-to win))) (defrule pick-to-block (declare (salience 5)) ?phase
    <- (choose-move) (open square block) — > (retract ?phase) (assert
    (move-to block))) (defrule pick — any ?phase <- (choose-move)
    (open-square ?any&corner middle side) — > (retract ?phase)
    (assert (move-to ?any))) Следует отметить, что если доступны квадраты больше чем одного типа, тов рабочий список правил помещаются все три правила. А после запуска правила pick — to
    — win, pick — to — block или pick — any извлечение управляющего факта приводит к удалению из рабочего списка правил всех остальных правил. Таким образом, все три правила очень тесно взаимосвязаны. Поэтому невозможно определить назначение каждого из этих правил, не рассматривая их все вместе. Таким образом, нарушается фундаментальный принцип программирования на основе правил. Любое правило в максимально возможной степени должно представлять какую-то полностью выраженную эвристику. В данном случае для выражения неявных связей между этими правилами используется значимость, тогда как связи между правилами могут быть показаны явно с помощью дополнительных шаблонов, заданных в правилах. Указанные правила могут быть переформулированы без определения значимости следующим образом (defrule pick-to-win ?phase <- (choose-move) (open- square win) — > (retract ?phase) (assert (move-to win))) (defrule pick-to-block
    9.6. Конструкция de module 717 ?phase <- (choose-move) (open- square block) (not (open-square win)) — > (retract ?phase) (assert
    (move-to block))) (defrule pick-any ?phase <- (choose-move) (open
    — square ?any&corner middle side) (not (open-square win)) (not
    (open-square block)) => (retract ?phase) (assert (move-to ?апу)))
    Ввод в эти правила дополнительных шаблонов позволяет явно указать условия, при которых эти правила являются
    применимыми. Тем самым устраняется необходимость обеспечения тесного взаимодействия правила правила приобретают способность действовать оппортунистически
    (подчиняясь обстоятельствам. Применяемый способ формулировки правил показывает также, что вместо эвристик,
    использовавшихся первоначально, можно ввести в действие более явно выраженные эвристики, следующим образом IF а winning square is open, THEN take IF а blocking square is open,
    and а winning square is not open, THEN take it. IF а corner, middle,
    or side square is open, and а winning square is not open, and а blocking square is not open, THEN take 9.6 Конструкция de fmodule До сих пор все конструкции de f rule, de f template и de f f acts находились водном рабочем пространстве, нов языке предусмотрена конструкция defmodule, позволяющая секционировать базу знаний путем определения различных модулей. Основной синтаксис для этой конструкции выглядит так (defmodule []) По умолчанию в программе CLIPS определяется единственный модуль MAIN. В
    предыдущих примерах имя модуля MAIN появлялось в результатах структурированного вывода содержимого конструкций, например, как показано ниже. CLIPS> (clear)J
    718 Глава 9. Модульное проектирование, управление выполнением. CLIPS> (def templclte зюпзог (з1о1 IlcLRe) ) J
    CLIPS> (ppdeftemplate sensor)J (deftemplate MAIN::sensor (slot name)) CLIPS> Символ в имени MAIN: sensor называется отделителем имени модуля. Справа от отделителя имени модуля находится имя конструкции, а слева — имя модуля, в котором содержится конструкция. Безусловно, до сих пор все определяемые конструкции по умолчанию помещались в модуль, поэтому в результатах структурированного вывода содержимого конструкций и появляется имя модуля Синтаксис конструкции de fmodule позволяет определять новые модули. Используя приведенный выше пример системы обнаружения неисправностей, создадим модули, которые
    соответствуют фазам DETECTION (Обнаружение, Локализация) и RECOVERY (Возобновление нормальной работы CLIPS> (defmodule DETECTION)J CLIPS> (defmodule
    ISOLATION)J CLIPS> (defmodule RECOVERY)J После определения дополнительных модулей, кроме модуля необходимо найти ответ на вопрос о том, в какие модули должны быть помещены те или иные новые конструкции. По умолчанию система CLIPS помещает вновь созданные конструкции в текущий модуль. После первоначального запуска или очистки среды системы CLIPS текущим модулем автоматически становится модуль MAIN. Таким образом, во всех предыдущих примерах был только один модуль, а использовался лишь текущий модуль, поэтому все определяемые конструкции помещались в модуль MAIN. Сразу после определения нового модуля система CLIPS назначает в качестве текущего модуля именно его. А в приведенном выше диалоге последним был определен модуль RECOVERY, поэтому он становится текущим модулем и вновь определяемое правило будет помещено именно в него, как показано ниже. CLIPS>
    (defrule example1 >) J CLIPS> (ppdefrule ezample1) 1 (defrule
    RECOVERY::example1 =>) CLIPS>
    9.6. Конструкция de f module 719 Модуль, в который должна быть помещена конструкция, может быть также указан в имени конструкции. В таком случаев имени должен быть вначале указан модуль, затем — отделитель имени модуля, а после этого имя конструкции, например CLIPS> (defrule
    ISOLATION::example2 >)J CLIPS> (ppdefrule example2)J (defrule
    ISOLATION::example2 =>) CLIPS> Если в имени конструкции задано имя какого-то модуля, то указанный модуль становится текущим модулем. Имя текущего модуля можно определить с помощью функции get-current-module, которая не принимает параметров и возвращает имя текущего модуля. С другой стороны, для изменения текущего модуля используется функция set-current-module. Она принимает единственный параметр (имя
    нового текущего модуля) и возвращает имя модуля, который был текущим перед этим, как показано ниже. CLIPS> (get-current- module)J ISOLATION CLIPS> (set-current-module DETECTION)J
    ISOLATION CLIPS> Способы задания имен модулей в командах
    А если бы потребовалось просмотреть конструкции de f содержащиеся в модуле ISOLATION, то можно было бы установить в качестве текущего модуль ISOLATION, а затем вызвать на выполнение другую команду 1ist — de f rules: CLIPS>
    (set-current-module ISOLATION)J DETECTION CLIPS> (list- defrules)J example 2 По умолчанию большинство команд действия которых распространяются на конструкции, работают только с конструкциями, содержащимися в текущем модуле.
    Например, команда list — de f rules не сформирует какого-либо вывода, если текущим модулем является поскольку в этом модуле еще не содержатся какие-либо правила CLIPS>(liSt-бейги1ез) 1 CLIPS>
    720 Глава 9. Модульное проектирование, управление выполнением. For а total of 1 defrule. CLIPS> Еще один вариант состоит в использовании того свойства команды listde f rules, что она принимает имя модуля в качестве необязательного параметра. Этот параметр указывает, для какого модуля должен быть подготовлен список правила Если в качестве параметра команде list — def rules передается символ, то создается список всех правил, содержащихся во всех модулях. Каждому списку предшествует имя модуля, аза ним находится список правил, содержащихся в этом модуле CLIPS>
    (list-defrules *)J MAIN! DETECTION: ISOLATION: example2
    RECOVERY: example1 For а total of 2 defrules ° CLIPS> Функции формирования списков list — de f templates и list — de f f acts действуют аналогично команде list — def rules. Команда show —
    breaks также позволяет указать, для какого модуля должны быть выведены все его точки останова. Модифицированный синтаксис для этих функций приведен ниже. (list-defrules

    []) (list-deftemplates []) (list-deffacts
    []) (show-breaks []) Указывать имя модуля позволяют также команды, применяемые к конкретным конструкциям. Например, команда ppde f rule осуществляет поиск только в текущем модуле, если имя модуля не указано (ppdefrule ехавр1е2) ! (defrule ISOLATION::example2 =>)
    CLIPS> (ppdefrule ezample1)J
    9.6. Конструкция de йтобы1е 721 [PRNTUTIL1] Unable to find defrule example1. CLIPS> В этом примере в формате структурированного вывода отображено только правило example2, поскольку оно действительно содержится в модуле. Но правило example1 не задано в модуле, поэтому не было найдено командой ppde f Модуль, в котором необходимо выполнить поиск некоторой конструкции, может быть указан путем задания имени модуля,
    за которым следует отделитель имени модуля, перед именем конструкции CLIPS> (ppdefrule RECOVERY::ezample1)J (defrule
    RECOVERY::example1 =>) CLIPS> В разных модулях могут находиться конструкции с одинаковыми именами. Ниже приведен пример, в котором перед именами конструкций задаются спецификаторы модулей, что позволяет применять водной команде две разные конструкции с одинаковыми именами. CLIPS> (defrule DETECTION: ехашр1е1 >)J CLIPS>
    (list-defrules *)J MAIN! DETECTION: example1 ISOLATION:
    example2 RECOVERY: example1 For а total of 3 defrules. CLIPS>
    (ppdefrulå RECOVERY::ezamplel) 1 (defrule RECOVERY::example1
    =>) CLIPS> (ppdefrule DETECTION::ezample1)J (defrule
    DETECTION::example1 =>) CLIPS> Кроме того, задавать имя модуля в составе имени конструкции позволяют следующие команды ppde f rule, unde f rule, ppde f template, unde f template,
    ppde f f acts, unde f f acts, matches, refresh, remove — break и setbreak.

    722 Глава 9. Модульное проектирование, управление выполнением. 9.7 Импорт и экспорт фактов В предыдущем разделе было показано, как секционировать в программе конструкции, помещая их в отдельные модули. Предусмотрена также возможность секционировать сами факты. Факты,
    помещенные в список фактов, автоматически ассоциируются стем модулем, в котором определены соответствующие им конструкции de f template: CLIPS> (deftemplate DETECTION::fault
    (slot component))J CLIPS> (assert (fault (component А
    CLIPS> (facts)J f-0 (fault (component А) For а total of 1 fact.
    CLIPS> (deftemplate ISOLATION::possible-Юа11иге (slot component))J CLIPS> (assert (possible-failure (component B)))J
    CLIPS> (facts)J f — 1 (possible-failure (component В) For а total of 1 fact. CLIPS> (set-current-module DETECTION)J
    ISOLATION CLIPS> (facts)J f — 0 (fault (component А) For а total of 1 fact. CLIPS> Обратите внимание на то, что к модулю относится единственный факт — possible — так как в этом модуле содержится соответствующая ему конструкция deftemplate. Тоже самое относится к факту содержащемуся в модуле DETECTION. Команда facts, как и list- defrules, и аналогичные команды, может принимать имя модуля в качестве необязательного параметра. Команда йася имеет следующий синтаксис (facts [] [ [
    []]]) Как и при использовании команды list — при указании имени модуля в команде facts формируется список только тех фактов, которые содер-
    9.7. Импорт и экспорт фактов 723 жатся в указанном модуле.
    Кроме того, как показано ниже, если в качестве имени модуля применяется символ *, тов список включаются все факты (facts DETECTION)J f — 0 (fault (component А) For а total of 1 fact. CLIPS> (facts ISOLATION)J f — 1 (possible-failure
    (component В) For а total of 1 fact. CLIPS> (facts RECOVERY)J
    CLIPS> (facts *)J f — 0 (fault (component А) f — 1 (possible-failure
    (component В) For а total of 2 facts. CLIPS> В отличие от
    конструкций de f rule и de f f acts, конструкции de f template (а также все факты, в которых используются соответствующие конструкции deftemplate) могут поступать в совместное распоряжение с другими модулями. Факт "принадлежит"
    модулю, в котором содержится его конструкция deftemplate, но модуль-владелец может экспортировать конструкцию de f template, связанную с этим фактом, сделав тем самым данный факт (и все другие факты, в котором применяется эта конструкция deftemplate, видимым в других модулях. Но недостаточно просто экспортировать конструкцию def чтобы факт стал видимым в другом модуле. Для использования конструкции def template, определенной в другом модуле,
    необходимо также импортировать конструкцию de f template в этом модуле. Если в модуле должен выполняться экспорт конструкций deftemplate, тов определении defmodule этого модуля необходимо использовать атрибут export. Атрибут export должен иметь один из следующих форматов (export ?ALL)

    1   ...   53   54   55   56   57   58   59   60   ...   74


    написать администратору сайта