在 CLIPS 中,我必须使用冲突解决策略,有人可以帮我添加策略吗?

问题描述

;;; ***************************
;;; *DEF TEMPLATES AND DEF FACTS  *
;;; ***************************

(deftemplate UI-state
   (slot id (default-dynamic (gensym*)))
   (slot display)
   (slot relation-asserted (default none))
   (slot response (default none))
   (multislot valid-answers)
   (slot state (default middle)))
   
(deftemplate state-list
   (slot current)
   (multislot sequence))
  
(deffacts startup
   (state-list))
   
;;;****************
;;;* STARTUP RULE  *
;;;****************

(defrule system-banner ""

  =>
  
  (assert (UI-state (display WelcomeMessage)
                    (relation-asserted start)
                    (state initial)
                    (valid-answers))))

;;;***************
;;;* QUERY RULES  *
;;;***************

(defrule determine-engine-state ""

   (logical (start))

   =>

   (assert (UI-state (display StartQuestion)
                     (relation-asserted engine-starts)
                     (response No)
                     (valid-answers No Yes))))
   
(defrule determine-runs-normally ""

   (logical (engine-starts Yes))

   =>

   (assert (UI-state (display RunQuestion)
                     (relation-asserted runs-normally)
                     (response No)
                     (valid-answers No Yes))))

(defrule determine-rotation-state ""

   (logical (engine-starts No))

   =>

   (assert (UI-state (display RotateQuestion)
                     (relation-asserted engine-rotates)
                     (response No)
                     (valid-answers No Yes))))
   
(defrule determine-sluggishness ""

   (logical (runs-normally No))

   =>

   (assert (UI-state (display SluggishQuestion)
                     (relation-asserted engine-sluggish)
                     (response No)
                     (valid-answers No Yes))))
   
(defrule determine-misfiring ""

   (logical (runs-normally No))

   =>

   (assert (UI-state (display MisfireQuestion)
                     (relation-asserted engine-misfires)
                     (response No)
                     (valid-answers No Yes))))

(defrule determine-knocking ""

   (logical (runs-normally No))

   =>

   (assert (UI-state (display KnockQuestion)
                     (relation-asserted engine-knocks)
                     (response No)
                     (valid-answers No Yes))))

(defrule determine-low-output ""

   (logical (runs-normally No))

   =>

   (assert (UI-state (display OutputQuestion)
                     (relation-asserted engine-output-low)
                     (response No)
                     (valid-answers No Yes))))

(defrule determine-gas-level ""

   (logical (engine-starts No)

            (engine-rotates Yes))

   =>

   (assert (UI-state (display GasQuestion)
                     (relation-asserted tank-has-gas)
                     (response No)
                     (valid-answers No Yes))))

(defrule determine-battery-state ""
  
   (logical (engine-rotates No))

   =>
   
   (assert (UI-state (display BatteryQuestion)
                     (relation-asserted battery-has-charge)
                     (response No)
                     (valid-answers No Yes))))

(defrule determine-point-surface-state ""

   (or (logical (engine-starts No)  
   
                (engine-rotates Yes))
                     
       (logical (engine-output-low Yes)))

   =>

   (assert (UI-state (display PointsQuestion)
                     (relation-asserted point-surface-state)
                     (response normal)
                     (valid-answers normal Burned Contaminated))))

(defrule determine-conductivity-test ""
   
   (logical (engine-starts No)  
   
            (engine-rotates No)
            
            (battery-has-charge Yes))

   =>

   (assert (UI-state (display CoilQuestion)
                     (relation-asserted conductivity-test-positive)
                     (response No)
                     (valid-answers No Yes))))

;;;****************
;;;* REPAIR RULES  *
;;;****************

(defrule normal-engine-state-conclusions ""

   (logical (runs-normally Yes))
   
   =>

   (assert (UI-state (display norepair)
                     (state final))))

(defrule engine-sluggish ""

   (logical (engine-sluggish Yes))
   
   =>

   (assert (UI-state (display FuelLineRepair)
                     (state final))))

(defrule engine-misfires ""

   (logical (engine-misfires Yes))

   =>

   (assert (UI-state (display PointGapRepair)
                     (state final))))

(defrule engine-knocks ""

   (logical (engine-knocks Yes))

   =>

   (assert (UI-state (display AdjustTimingRepair)
                     (state final))))

(defrule tank-out-of-gas ""

   (logical (tank-has-gas No))

   =>

   (assert (UI-state (display AddGasRepair)
                     (state final))))
   
(defrule battery-dead ""

   (logical (battery-has-charge No))
   
   =>

   (assert (UI-state (display ReplaceBatteryRepair)
                     (state final))))
   
(defrule point-surface-state-burned ""

   (logical (point-surface-state Burned))

   =>

   (assert (UI-state (display ReplacePointsRepair)
                     (state final))))
                     
(defrule point-surface-state-contaminated ""
   
   (logical (point-surface-state Contaminated))
   
   =>

   (assert (UI-state (display CleanPointsRepair)
                     (state final))))

(defrule conductivity-test-positive-yes ""

   (logical (conductivity-test-positive Yes))
   
   =>

   (assert (UI-state (display LeadWireRepair)
                     (state final))))
                     
(defrule conductivity-test-positive-no ""

   (logical (conductivity-test-positive No))
      
   =>

   (assert (UI-state (display CoilRepair)
                     (state final))))
                     
(defrule no-repairs ""

   (declare (salience -10))
  
   (logical (UI-state (id ?id)))
   
   (state-list (current ?id))
     
   =>
  
   (assert (UI-state (display MechanicRepair)
                     (state final))))
                     
;;;*************************
;;;* GUI INteraCTION RULES  *
;;;*************************

(defrule ask-question

   (declare (salience 5))
   
   (UI-state (id ?id))
   
   ?f <- (state-list (sequence $?s&:(not (member$ ?id ?s))))
             
   =>
   
   (modify ?f (current ?id)
              (sequence ?id ?s))
   
   (halt))

(defrule handle-next-no-change-none-middle-of-chain

   (declare (salience 10))
   
   ?f1 <- (next ?id)

   ?f2 <- (state-list (current ?id) (sequence $? ?nid ?id $?))
                      
   =>
      
   (retract ?f1)
   
   (modify ?f2 (current ?nid))
   
   (halt))

(defrule handle-next-response-none-end-of-chain

   (declare (salience 10))
   
   ?f <- (next ?id)

   (state-list (sequence ?id $?))
   
   (UI-state (id ?id)
             (relation-asserted ?relation))
                   
   =>
      
   (retract ?f)

   (assert (add-response ?id)))   

(defrule handle-next-no-change-middle-of-chain

   (declare (salience 10))
   
   ?f1 <- (next ?id ?response)

   ?f2 <- (state-list (current ?id) (sequence $? ?nid ?id $?))
     
   (UI-state (id ?id) (response ?response))
   
   =>
      
   (retract ?f1)
   
   (modify ?f2 (current ?nid))
   
   (halt))

(defrule handle-next-change-middle-of-chain

   (declare (salience 10))
   
   (next ?id ?response)

   ?f1 <- (state-list (current ?id) (sequence ?nid $?b ?id $?e))
     
   (UI-state (id ?id) (response ~?response))
   
   ?f2 <- (UI-state (id ?nid))
   
   =>
         
   (modify ?f1 (sequence ?b ?id ?e))
   
   (retract ?f2))
   
(defrule handle-next-response-end-of-chain

   (declare (salience 10))
   
   ?f1 <- (next ?id ?response)
   
   (state-list (sequence ?id $?))
   
   ?f2 <- (UI-state (id ?id)
                    (response ?expected)
                    (relation-asserted ?relation))
                
   =>
      
   (retract ?f1)

   (if (neq ?response ?expected)
      then
      (modify ?f2 (response ?response)))
      
   (assert (add-response ?id ?response)))   

(defrule handle-add-response

   (declare (salience 10))
   
   (logical (UI-state (id ?id)
                      (relation-asserted ?relation)))
   
   ?f1 <- (add-response ?id ?response)
                
   =>
      
   (str-assert (str-cat "(" ?relation " " ?response ")"))
   
   (retract ?f1))   

(defrule handle-add-response-none

   (declare (salience 10))
   
   (logical (UI-state (id ?id)
                      (relation-asserted ?relation)))
   
   ?f1 <- (add-response ?id)
                
   =>
      
   (str-assert (str-cat "(" ?relation ")"))
   
   (retract ?f1))   

(defrule handle-prev

   (declare (salience 10))
      
   ?f1 <- (prev ?id)
   
   ?f2 <- (state-list (sequence $?b ?id ?p $?e))
                
   =>
   
   (retract ?f1)
   
   (modify ?f2 (current ?p))
   
   (halt))
   

解决方法

使用 set-strategy 命令更改冲突解决策略。

 grouped = df_fit.groupby(['ID','end_cutoff'])
 fig,ax = plt.subplots()
 for (ID,end_cutoff),df_fit in grouped:
     ax.plot(df_fit['date_x'],df_fit['value_y'],label=ID+' '+str(end_cutoff.date()))
 plt.show()

您可以在通常可以调用命令的任何地方调用此命令,但通常您会在命令提示符或规则操作中调用它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...