проверка границы переменной в правиле клипов RHS

checkIntfIntVlanMemberConfigRule = """
    (defrule checkSubIntfIntVlanMemberConfigRule
    (checkIntf (intf ?intf) )
    (SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan          ?intVlan))
    (or (not (VlanStatus (vlan ?intVlan) (intf ?intf)) )
     ?f <- (VlanStatus (vlan ?intVlan) (intf ?intf)) )
    =>
    (if (isbound ?f) then (printout t "PASS: vlanStatus exists for " ?intf " " ?intVlan crlf) (return 0) )
    (printout t "vlanStatus does not exist for " ?intf " " ?intVlan crlf)
    )"""

В приведенном выше правиле клипов, какова эквивалентная функция сборки клипов для (isbound? F)? В общем, есть ли какая-либо встроенная функция для проверки в RHS, была ли переменная связана в LHS?


person Ramachandran    schedule 31.03.2015    source источник


Ответы (1)


Функциональности для определения привязки переменной нет. Условный элемент or реализуется путем создания правил для каждого условного элемента, содержащегося с помощью или, поэтому существующее правило преобразуется в следующее:

 (defrule checkSubIntfIntVlanMemberConfigRule-1
    (checkIntf (intf ?intf) )
    (SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan ?intVlan))
    (not (VlanStatus (vlan ?intVlan) (intf ?intf)) 
    =>
    (if (isbound ?f) then (printout t "PASS: vlanStatus exists for " ?intf " " ?intVlan crlf) (return 0) )
    (printout t "vlanStatus does not exist for " ?intf " " ?intVlan crlf)
    )

 (defrule checkSubIntfIntVlanMemberConfigRule-2
    (checkIntf (intf ?intf) )
    (SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan ?intVlan))
    ?f <- (VlanStatus (vlan ?intVlan) (intf ?intf)) 
    =>
    (if (isbound ?f) then (printout t "PASS: vlanStatus exists for " ?intf " " ?intVlan crlf) (return 0) )
    (printout t "vlanStatus does not exist for " ?intf " " ?intVlan crlf)
    )

Вам необходимо реализовать это как два отдельных правила, поэтому RHS для каждого может быть разным:

(defrule checkSubIntfIntVlanMemberConfigRule-1
    (checkIntf (intf ?intf) )
    (SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan ?intVlan))
    (not (VlanStatus (vlan ?intVlan) (intf ?intf))) 
    =>
    (printout t "vlanStatus does not exist for " ?intf " " ?intVlan crlf)
    )

 (defrule checkSubIntfIntVlanMemberConfigRule-2
    (checkIntf (intf ?intf) )
    (SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan ?intVlan))
    ?f <- (VlanStatus (vlan ?intVlan) (intf ?intf)) 
    =>
    (printout t "PASS: vlanStatus exists for " ?intf " " ?intVlan crlf)
    )

В качестве альтернативы вы можете проверить наличие факта из правой части правила, используя функции запроса фактов:

  (defrule checkSubIntfIntVlanMemberConfigRule
    (checkIntf (intf ?intf) )
    (SwitchIntfConfig (intf ?intf) (switchportMode "routed") (nativeVlan ?intVlan))
    (VlanStatus (vlan ?intVlan) (intf ?intf)) 
    =>
    (if (any-factp ((?f VlanStatus)) (and (eq ?f:vlan ?intVlan) (eq ?f:intf ?intf)))
      then
      (printout t "PASS: vlanStatus exists for " ?intf " " ?intVlan crlf)
      else 
     (printout t "vlanStatus does not exist for " ?intf " " ?intVlan crlf)))
person Gary Riley    schedule 31.03.2015
comment
Спасибо! последнее решение работает для меня. Я пытался сократить количество правил - поэтому разделение RHS не помогает. Я чувствую, что api для проверки привязки переменных помогает проверить в RHS, какой подфакт / подпункт или CE был поражен в LHS. Могут быть и другие варианты использования, где это помогает. Еще раз спасибо. - person Ramachandran; 01.04.2015