Изменение текущего факта, запускающего правило

Скажем, я определил шаблон и некоторые факты, как показано ниже:

(deftemplate student
    (slot name (type SYMBOL) (default ?NONE))
    (slot grade (type SYMBOL) (default C) (allowed-symbols A B C D))
    (slot graduated (type SYMBOL) (default no) (allowed-symbols yes no))
)

(deffacts insert-facts
    (student (name George) (grade A))
    (student (name Nick) (grade C))
    (student (name Bob))
    (student (name Mary) (grade B))
)

Скажем, я хочу создать правило, которое проверяет оценку каждого ученика и устанавливает для соответствующей градуированной переменной символ «да». Как я мог это сделать?


person George Tseres    schedule 07.06.2014    source источник


Ответы (2)


Вот немного менее подробная версия правила, которое вы придумали для решения вашей проблемы:

CLIPS> 
(deftemplate student
    (slot name (type SYMBOL) (default ?NONE))
    (slot grade (type SYMBOL) (default C) (allowed-symbols A B C D))
    (slot graduated (type SYMBOL) (default no) (allowed-symbols yes no)))
CLIPS> 
(deffacts insert-facts
    (student (name George) (grade A))
    (student (name Nick) (grade C))
    (student (name Bob))
    (student (name Mary) (grade B)))
CLIPS> 
(defrule rule-1
   ?s <- (student (grade A|B) (name ?n) (graduated ~yes))
   =>
   (modify ?s (graduated yes))
   (printout t "Congratulations " ?n "!" crlf))
CLIPS> (reset)
CLIPS> (run)
Congratulations Mary!
Congratulations George!
CLIPS> 
person Gary Riley    schedule 07.06.2014

Я решил проблему. Я оставляю это здесь на случай, если это понадобится кому-то другому.

Я создал правило следующим образом

(defrule rule-1
    ?s <- (student (grade ?g&A|B) (name ?n) (graduated ?gr) (classified ?c&no))
=>
    (retract ?s)
    (assert (student (name ?n)(grade ?g) (graduated yes) (classified yes)))
    (printout t "Congratulations " ?n "!" crlf)
)

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

(deftemplate student
    (slot name (type SYMBOL) (default ?NONE))
    (slot grade (type SYMBOL) (default C) (allowed-symbols A B C D))
    (slot graduated (type SYMBOL) (default no) (allowed-symbols yes no))
    (slot classified (type SYMBOL) (default no) (allowed-symbols yes no))
)
person George Tseres    schedule 07.06.2014