2016-05-04 2 views
0

Неуверенный, почему это не работает.Клипы OR Заявление не обжига

(defrule contain-red? 
(initial-fact) 
=> 
(bind ?reply (get-text-from-user "Does it contain x (y/n?")) 
(assert (existing-text ?reply))) 

(defrule partOne 
(existing-text "y") 
=> 
(bind ?reply (get-text-from-user "give me a number")) 
(assert (credit-value-bsc-first-result (explode$ ?reply)))) 

(defrule partTwo 
(existing-text "n") 
=> 
(bind ?reply (get-text-from-user "give me a number")) 
(assert (credit-value-bsc-second-result (explode$ ?reply)))) 

(defrule learn-about-120? 
(credit-value-bsc-first-result ?n) 
(credit-value-bsc-second-result ?x) 
(test (or (<= ?n 20) (<= ?x 20))) 
=> 
(bind ?reply (get-text-from-user "Reponse here)")) 
(assert (learn-about-120-response ?reply))) 

Я могу получить окончательное правило для работы с использованием и в другом сценарии. При загрузке в wxCLIPS ошибок не возникает, но когда я запускаю его и вводя соответствующие данные, последнее правило не срабатывает.

ответ

0

Фактическое значение credit-value-bc-first-result создается только в том случае, если существующий текст является «y». Фактор credit-value-bc-second-result создается только в том случае, если существующий-текст «n». Если существует только один существующий текстовый факт, то эти условия являются взаимоисключающими. Так как правило узнает-о-120? требует, чтобы оба этих факта не срабатывали.

Запись правила таким образом, вероятно, что вы хотите:

(defrule learn-about-120? 
    (or (credit-value-bsc-first-result ?n) 
     (credit-value-bsc-second-result ?n)) 
    (test (<= ?n 20)) 
    => 
    (bind ?reply (get-text-from-user "Reponse here)")) 
    (assert (learn-about-120-response ?reply))) 
+0

спасибо! У меня было ощущение, что переменные пустые, возможно, были проблемой. – Joe

 Смежные вопросы

  • Нет связанных вопросов^_^