2012-11-25 6 views
2

CLIPS에서보다 큰 규칙을 정의하려고하지만 작동하지 않는 것 같습니다. 내가 어떻게 고칠 수 있는지에 대한 생각. 문제가 defrule btwn100and120에 발생하는 것으로 보입니다.CLIPS에서 논리 연산자 사용

(defrule part-credits 
    (or (current-part "a") 
     (current-part "b") 
     (current-part "c")) 
    => 
    (bind ?reply (get-text-from-user "How many points did you achieve?")) 
    (assert (part-credits ?reply)) 
) 

(defrule btwn100and120 
    (part-credits => 100) 
    (part-credits <= 120) 
    => 
    (bind ?reply (get-text-from-user "Did you Part A before the changes? (y/n)")) 
    (assert (btwn100and120 ?reply)) 
) 

답변

4

숫자 비교를 위해 test 함수를 사용하십시오. 또한 CLIPS는 수학 연산자에 접두사 표기법을 사용합니다. 여기에 간단한 규칙은 당신이 원하는 않는다는 것입니다 :

(defrule MAIN::btwn100and120 
    (part-credits ?val) 
    (test (<= ?val 120)) 
    (test (>= ?val 100)) 
=> 
    (printout t "Value " ?val " is in range." crlf) 
) 

그리고 여기에 규칙의 테스트입니다 :

CLIPS> (watch facts) 
CLIPS> (watch activations) 
CLIPS> (assert (part-credits 99)) 
==> f-0  (part-credits 99) 
<Fact-0> 
CLIPS> (assert (part-credits 110)) 
==> f-1  (part-credits 110) 
==> Activation 0  btwn100and120: f-1 
<Fact-1> 
CLIPS> (run) 
Value 110 is in range. 
CLIPS>