ВУЗ:
Составители:
Рубрика:
Это правило выполняется в случае, если общее состояние двигателя определено и известно, что он не заводится. Кроме
того, условный элемент (not (rotation-state engine ?)) гарантирует, что это правило еще не вызывалось. В зависимости от того
или иного ответа пользователя правило добавляет соответствующий набор фактов (см. правило 4).
Далее реализуем довольно простые правила 5 и 6. Выполняемые ими действия вы поймете без дополнительных ком-
ментариев.
(defrule determine-gas-level ""
(working-state engine does-not-start)
(rotation-state engine rotates)
(not (repair ?))
=>
(if (not (yes-or-no-p "Does the tank have any gas in it (yes/no)? "))
then
(assert (repair "Add gas."))))
(defrule determine-battery-state ""
(rotation-state engine does-not-rotate)
(not (charge-state battery ?))
(not (repair ?))
=>
(if (yes-or-no-p "Is the battery charged (yes/no)? ")
then
(assert (charge-state battery charged))
else
(assert (repair "Charge the battery."))
(assert (charge-state battery dead))))
Обратите внимание, что правило determine-battery-state, помимо определения возможной неисправности, также приме-
няется для добавления в систему факта, описывающего текущее состояние аккумулятора, который может быть использован
другими правилами.
При реализации правила 7 необходимо обратить внимание на то, что рекомендации, предоставляемые этим правилом,
подходят для двух в корне отличающихся ситуаций. Во-первых, в случае, если двигатель не заводится и существует вероят-
ность плохой искры в системе зажигания (правило 7). Во-вторых, в случае, если двигатель запускается, но не развивает нор-
мальной мощности (правило 12). Поэтому выполним реализацию этих правил так, как представлено ниже.
(defrule determine-low-output ""
(working-state engine unsatisfactory)
(not (symptom engine low-output | not-low-output))
(not (repair ?))
=>
(if (yes-or-no-p "Is the output of the engine low (yes/no)? ")
then
(assert (symptom engine low-output))
else
(assert (symptom engine not-low-output))))
(defrule determine-point-surface-state ""
(or (and (working-state engine does-not-start)
(spark-state engine irregular-spark))
(symptom engine low-output))
(not (repair ?))
=>
(bind ?response
(ask-question "What is the surface state of the points (normal/burned/contaminated)? "
normal burned contaminated))
(if (eq ?response burned)
then
(assert (repair "Replace the points."))
else (if (eq ?response contaminated)
then (assert (repair "Clean the points.")))))
Правило determine-low-output определяет, имеет ли место низкая мощность двигателя или нет. Правило determine-point-
surface-state адекватно реагирует на условия, заданные в правилах 7 и 12. Обратите внимание на использование условных
элементов оr и end, которые обеспечивают одинаковое поведение правила в двух абсолютно разных ситуациях. Кроме того,
правило determine-point-surface-state отличается от приведенных ранее тем, что непосредственно использует функцию ask-
question вместо yes-or-no-p, так как в данный момент пользователю задается вопрос, подразумевающий три варианта ответа.
Реализация оставшихся диагностических правил (8 – 11) также не должна вызвать у вас затруднений.
(defrule determine-conductivity-test ""
(working-state engine does-not-start)