Проверка переменной переменной в правиле клипов 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?
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)
)
В качестве альтернативы вы можете проверить наличие факта из RHS правила, используя функции запроса фактов:
(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)))