2017-12-01 23 views
0

일치하는 규칙을 정의하는 데 어려움이 있습니다. Jess 일치 규칙이 실행되지 않습니다.

(defrule set-current 
    ?desAct <- (Actuator (name 0) (StrokeLength ?sl) (Force ?f) 
    (nominalCurrent ?c3)) 
    (test (eq ?c3 0)) ; I have defined this to change only if value is not 
         ; set yet 
    ?act <- (Actuator (inputVoltage ?v1) ; actuator that has matching slots 
    (StrokeLength ?sl1) 
    (nominalCurrent ?c1)) 
    (test (eq ?sl1 ?sl)) ; for same stroke length I want to modify 
         ; nominalCurrent of ?desAct 
    => 
    (modify ?desAct (nominalCurrent ?c1)) 
    ) 

? 내가 몇 가지 기준에 따라 기존의 사실에 따라 변경하려는 값을 슬롯 사실을 나타냅니다 desAct. 나는이 규칙은 다음과 같은 사실에 대해 발생하지 않는 이유를 모르겠습니다 :이 규칙 이름을 0으로 그 액츄에이터를 기대하고

f-4 (MAIN::Actuator (name 4) (inputVoltage 12) (Force 17) (StrokeLength 10) (length 62) (width 18) (height 15.1) (motorType DC) (speedAtNomLoad 25) (weight 28) (nominalCurrent 0.46) (highTemp 50) (lowTemp -10) (price 90) (dutyCycle 20)) 
f-9 (MAIN::Actuator (name 0) (inputVoltage 12) (Force 17) (StrokeLength 10) (length 10) (width 10) (height 10) (motorType DC) (speedAtNomLoad 0) (weight 0) (nominalCurrent 0) (highTemp 0) (lowTemp 0) (price 0) (dutyCycle 0)) 

은 F-4와 동일한 nominalCurrent, 그러나 규칙은 발생하지 않습니다.

답변

1

규칙은 실행되지만 두 번 이상 실행됩니다. 동일한 템플릿에 대한 사실이있는 경우 1 또는 2 개의 사실을 여러 번 일치시키지 마십시오.

(defrule set-current 
    ?act1 <- (Actuator (name ?n1) 
        (inputVoltage ?v1) 
        (StrokeLength ?sl1) 
        (nominalCurrent ?c1&0)) 
    ?act2 <- (Actuator (name ?n2&~?n1)   ; avoid redundant matches 
        (inputVoltage ?v1)  ; same input voltage 
        (StrokeLength ?sl1)  ; same stroke length 
        (nominalCurrent ?c2)) ; bind current 
=> 
    (printout t "modify actuator " ?n1 " current=" ?c2 crlf) 
    (modify ?act1 (nominalCurrent ?c2)) 
) 

제약 (name ?n2&~?n1) 힘은 다른 이름 값과 임원 사이에 발생하는 일치합니다. 바운드 변수를 재사용하면 해당 값의 슬롯과 일치하게됩니다.

test을 사용하지 마십시오. 바인딩 변수의 이름과 일관성을 유지하십시오.