Найти лучшее правило, соответствующее в клипах
Я новичок в CLIPS, и во время разработки личного проекта я хотел бы реализовать функциональность, которая позволит мне видеть правила, которые соответствуют большинству шаблонов после вставки факта. Для лучшего понимания:
>(defrule one
(fact a)
(fact b)
=>
(assert (fact i)))
>(defrule two
(fact b)
(fact c)
=>
(assert (fact d) (fact f)))
>(defrule three
(fact a)
(fact d)
(fact c)
=>
(assert (fact g)))
> (assert (fact a) (fact c))
> (trace-rule)
rule three
Matches for Pattern 1
f-1
Matches for Pattern 2
None
Matches for Pattern 3
f-2
Может быть, я мог бы использовать команду совпадений, но я не знаю, как поступить.
Спасибо за ваше время.
1 ответ
Решение
CLIPS (6.30 3/17/15)
CLIPS>
(deffunction most-matches ()
(bind ?rules (create$))
(bind ?most -1)
(foreach ?r (get-defrule-list)
(bind ?matches (nth$ 1 (matches ?r terse)))
(if (= ?matches ?most)
then
(bind ?most ?matches)
(bind ?rules (create$ ?rules ?r))
else
(if (> ?matches ?most)
then
(bind ?most ?matches)
(bind ?rules (create$ ?r)))))
?rules)
CLIPS>
(defrule one
(fact a)
(fact b)
=>
(assert (fact i)))
CLIPS>
(defrule two
(fact b)
(fact c)
=>
(assert (fact d)
(fact f)))
CLIPS>
(defrule three
(fact a)
(fact d)
(fact c)
=>
(assert (fact g)))
CLIPS> (assert (fact a) (fact c))
<Fact-2>
CLIPS> (most-matches)
(three)
CLIPS> (reset)
CLIPS> (assert (fact b))
<Fact-1>
CLIPS> (most-matches)
(one two)
CLIPS> (reset)
CLIPS> (most-matches)
(one two three)
CLIPS>