Использование логических операторов в CLIPS

Я пытаюсь определить правило «больше, чем» в CLIPS, но, похоже, оно не работает. Есть идеи, как я могу это исправить. Проблема, похоже, возникает при defrule btwn100and120.

(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))
)

person methuselah    schedule 25.11.2012    source источник


Ответы (1)


Используйте функцию 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> 
person bogatron    schedule 26.11.2012