2015-04-14 3 views
0
(deffunction query (?templ $?filters) 
    (do-for-all-facts ((?fi ?templ)) (eq (fact-slot-value ?fi (nth$ 1 $?filters)) (nth$ 2 $?filters)) (ppfact ?fi))) 

Используя описанную выше функцию можно запросить/список фактов передаются имя шаблона ?templ, который удовлетворяет пройденный $?filters, который представляет собой последовательность пар значений слотов slotname; например:запрашивающих факты, отвечающих условию клипов

(query vlanStatus vlan 100 intf "eth12") will print all facts of vlanStatus with valn 100 and intf "eth12". 

Я пытаюсь обобщить его, чтобы указать фильтр как конструкцию условий клипов. Есть ли способ сделать это?

ответ

0

На самом деле запрос (запрос vlanStatus vlan 100 intf «eth12») не будет работать, поскольку функция не выходит за пределы второго слота многополевого arg. (запрос vlanStatus vlan 100).

Хотите обобщить это, чтобы указать фильтр как условие общих клипов, чтобы преодолеть указанные ограничения и продолжить фильтр.

0
CLIPS> 
(deftemplate vlanStatus 
    (slot vlan) 
    (slot intf) 
    (slot info)) 
CLIPS>  
(deffacts testing 
    (vlanStatus (vlan 100) (intf "eth32") (info 3)) 
    (vlanStatus (vlan 100) (intf "eth12") (info 4)) 
    (vlanStatus (vlan 200) (intf "eth33") (info 5)) 
    (vlanStatus (vlan 200) (intf "eth33") (info 6)) 
    (vlanStatus (vlan 100) (intf "eth12") (info 7))) 
CLIPS> 
(deffunction apply-filters (?fact ?filters) 
    (loop-for-count (?i 1 (div (length$ ?filters) 3)) 
     (bind ?base (* (- ?i 1) 3)) 
     (if (not (funcall (nth$ (+ ?base 1) ?filters) 
         (fact-slot-value ?fact (nth$ (+ ?base 2) ?filters)) 
         (nth$ (+ ?base 3) ?filters))) 
     then 
     (return FALSE))) 
    (return TRUE)) 
CLIPS> 
(deffunction query (?templ $?filters) 
    (if (!= (mod (length$ ?filters) 3) 0) 
     then 
     (printout t "Function query expected the filter list to be a multiple of 3." crlf) 
     (return FALSE)) 
    (do-for-all-facts ((?fi ?templ)) 
     (apply-filters ?fi ?filters) 
     (ppfact ?fi))) 
CLIPS> (reset) 
CLIPS> (query vlanStatus eq vlan 100 eq intf "eth12") 
(vlanStatus 
    (vlan 100) 
    (intf "eth12") 
    (info 4)) 
(vlanStatus 
    (vlan 100) 
    (intf "eth12") 
    (info 7)) 
CLIPS> (query vlanStatus eq vlan 100 <= info 6) 
(vlanStatus 
    (vlan 100) 
    (intf "eth32") 
    (info 3)) 
(vlanStatus 
    (vlan 100) 
    (intf "eth12") 
    (info 4)) 
CLIPS>