查询符合剪辑条件的事实

时间:2015-04-14 08:34:24

标签: clips

(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".

我试图将其概括为指定过滤器为任何剪辑条件构造。有办法吗?

2 个答案:

答案 0 :(得分:0)

实际上查询(查询vlanStatus vlan 100 intf" eth12")将不起作用,因为该函数不超出多字段arg的第二个插槽。 (查询vlanStatus vlan 100)将起作用。

想要概括一下,将过滤器指定为通用剪辑条件,以便克服上述限制,并进一步过滤通用。

答案 1 :(得分: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>