Найти лучшее правило, соответствующее в клипах - PullRequest
0 голосов
/ 23 июня 2018

Я новичок в 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 Ответ

0 голосов
/ 24 июня 2018
         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>
...