Если вы хотите несколько этапов (скажем, больше двух), я бы придерживался подхода Гари Райли.Однако, если ваше желание - это простое правило предварительного запуска, я бы предложил сделать первоначальное объявление фактов в зависимости от контрольного флага.
(defrule prerequisites
(preinit-done)
=>
(assert
(after COP1000 take COP2000)
(after COP1001 take COP2001)
(after MAC1000 take MAC2000)
(after MAC1001 take MAC2001)
(after ENG1000 and ENG1001 take ENG2000))
)
(defrule welcome
(not (preinit-done))
=>
(printout t "Welcome to the advising system." crlf)
(assert (preinit-done))
)
(defrule rule2
(after ?course1 take ?course2)
(student ?name $? ?course1 $?)
=>
(printout t "Since " ?name " has taken " ?course1 " , I suggest taking " ?course2 "." crlf)
)
Таким образом, вам не нужно добавлять фазовый факт в каждое правило, посколькуони как-то зависят от ваших исходных фактов.