ВУЗ:
Составители:
Рубрика:
Это правило выполняется в случае, если общее состояние двигателя определено и известно, что он не заводится. Кроме 
того, условный элемент (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)   
