Условные элементы CLIPS не соответствуют, но правило активировано - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть скрипт CLIPS ниже.Я пытаюсь получить значения p1, p2, p3 Последнее правило get-p2-2 должно быть активировано, если p2 неизвестно и p3 известно.

(defrule main
(initial-fact) 
=>
(assert(fact (read))) ; user enters 1
(assert(p1 unknown))
(assert(p2 unknown))
(assert(p3 unknown))
)

;;;=====================================================
(defrule get-p1
(fact 1)
(p1 unknown)
=>
(printout t"p1 known"crlf)
(assert (p1 known)))

;;;======================================================
(defrule get-p2
(fact 1)
(p1 known)
(p2 unknown)
=>
(printout t "p2 known"crlf)
(assert (p2 known))
(assert (fact 2)))



;;;======================================================
(defrule get-p3
(fact 2)
(p3 unknown)
=>
(printout t"p3 known"crlf)
(assert (p3 known)))

;;;======================================================
(defrule get-p2-2
(fact 2)
(p2 unknown)
(p3 known)
=>
(printout t "p2 known"crlf)
(assert (p2 known)))

Но p2 становится известным в правиле get-p2.Таким образом, правило get-p2-2 никогда не должно было активироваться.Но он активируется, и я получаю вывод

 p1 known
 p2 known
 p3 known
 p2 known ; this should not be here

Почему get-p2-2 активирован?

1 Ответ

0 голосов
/ 06 декабря 2018

Вы не убираете ни один из неизвестных фактов, поэтому p1, p2 и p3 известны и неизвестны, что позволяет активировать get-p2-2.

CLIPS> (reset)
CLIPS> (run)
1
p1 known
p2 known
p3 known
p2 known
CLIPS> (facts)
f-0     (initial-fact)
f-1     (fact 1)
f-2     (p1 unknown)
f-3     (p2 unknown)
f-4     (p3 unknown)
f-5     (p1 known)
f-6     (p2 known)
f-7     (fact 2)
f-8     (p3 known)
For a total of 9 facts.
CLIPS>

Отменить неизвестные фактыв get-p1, get-p2 и get-p3 вы получите желаемые результаты.

(defrule get-p1
  (fact 1)
  ?f <- (p1 unknown)
   =>
   (retract ?f)
   (printout t "p1 known" crlf)
   (assert (p1 known)))
...