我想知道你能否指出正确的方向。 我想编写一个基于规则的系统来审核一组机器-例如

  • 检查配置参数以查看是否正确设置
  • 检查机器状态以查看它们是否在可接受的范围内

我一直在努力的事情是为审计规则提出一种语法,这样我就不必编写拖尾代码。 我创建了一些简单的审计规则,但是我想出一个通用的表格。

这是我目前的尝试。

首先,我目前使用单个模板表示配置参数和运行状态(出于缺乏想象力,我将其称为audit-fact),以便我的审核语言可以同时适用于配置和状态。 我使用域插槽来指定配置与状态。

(deftemplate audit-fact 
    (slot domain (allowed-values config state))     ;; config vs. state
    (slot machine)                                  ;; machine to audit 
    (slot name)                                     ;; parameter or state to check/audit
    (slot value)                                    ;; parameter value 
    (slot already-checked (default FALSE))
)   

接下来,我编写了一个程序来读入并断言机器的配置和状态为审核事实。 以下是示例配置和状态审核情况

(assert (audit-fact 
    (domain config) 
    (machine drl-a-15_0) 
    (name os-version) (value 5.5))
)

(assert (audit-fact 
    (domain state) 
    (machine drl-a-15_0) 
    (name rpm) (value 5023))
)

这是我目前对审核语法/语言的尝试-

(deftemplate rule
    (slot domain) 
    (slot name) 
    (slot constraint (default ?NONE) (allowed-values should-remain-at-default should-equal should-be-between ignore-if-ends-with))
    (multislot values)
    (multislot reasons) 
    (multislot references) 
    (slot criticality (allowed-values critical info suggestion warning))
    (slot already-checked (default FALSE))
)

以下规则用于检查状态或参数是否在一定范围内

(assert (rule 
    (domain state)
    (name rpm) 
    (constraint should-be-between) 
    (values 5000 5500) 
    (criticality critical) 
    (reasons "Low values could cause engine to stall. Prolonged high value could cause engine to heat up") )
)

接下来,我使用以下规则检查状态或参数是否等于特定值

(assert (rule 
    (domain config)
    (name os-version) 
    (constraint should-equal) 
    (values 5.5) 
    (criticality critical) 
    (reasons "OS version must be at 5.5 – no other levels are currently certified.") )
)

以下规则实现了相等和两次检查

(defrule rule-should-eq
    (rule (domain ?d) (name ?n) (constraint should-equal) (values ?cv) (reasons ?r))
    ?p <- (audit-fact (domain ?d) (name ?n) (value ?v) (already-checked FALSE))
=>
    (if (eq ?v ?cv)
        then 
            (printout t "checking " ?d ": " ?n ". Passed "  crlf)
        else 
            (printout t "checking " ?d “: “ ?n " should be set to " ?cv ". " ?r ". Warning" crlf)
    )       
    (modify ?p (already-checked TRUE))  
)       

(defrule rule-should-be-between
    (rule (domain ?d) (name ?n) (constraint should-be-between) (values ?cv-low ?cv-high) (reasons ?r))
    ?p <- (audit-fact (domain ?d) (name ?n) (value ?v) (already-checked FALSE))
=>
    (if (and (>= ?v ?cv-low) (<= ?v ?cv-high))
        then 
            (printout t "checking " ?n ". Passed "  crlf)
        else 
            (printout t "checking " ?n " should be between " ?cv-low " and " ?cv-high ". " ?r ". Warning" crlf)
    )       
    (modify ?p (already-checked TRUE))  
)       

使用上面的代码,我可以实现简单的检查-例如,必须设置为,必须在中间,必须不等于,必须保持默认值,必须高于,必须低于等)

但是我想不出一种简单的方法来使语法使用ands或ors等处理多个条件。

题 - -

  • 是否有一篇论文描述了上述审计规则的设计模式。 我目前正在研究示例(CLIPS)中的wine.clp。
  • 我应该放弃,只是将简单的语法用于简单的审核规则,而对所有复杂的事情仅使用defrules -例如,如果config-A设置为X,则检查其他五个配置以确保它们也正确设置,然后断言状态检查。 断言后,然后检查状态是否在一定范围内。

提前致谢。

伯尼

#1楼 票数:1

1)如果RHS上的声明有代码味道:请不要! 2)由于不需要修改这些事实,因此不需要已检查的标志。

根据一台机器属性重写支票:

?p <- (Configuration (machine ?m)(param ?p)(value ?v))
(ConfigCheckRange (param ?p){?v < loBound || $v > hiBound})

(您可能需要其他变体,例如,ConfigCheckEnum允许值不在一个间隔内。)

检查参数值组合比较困难,因为您已选择通过单独的事实表示每个参数值。 你必须

 ?p1 <- (Configuration (machine ?m)(param ?p1)(value ?v1))
 ?p2 <- (Configuration (machine ?m)(param ?p2)(value ?v2)
         {?p2 != ?p1))
(ConfigCheckCombi (param1 ?p1)(param2 ?p2)
      {lowBound1 <= ?v1 && ?v2 <= lowBound2}
      {?v2 < loBound2 || $v2 > hiBound2})

右侧仅应记录(新)事实中的违规情况,我们称其为“发现”。 一个发现包含机器的ID和(违规的)ConfigCheck事实列表。

最后(使用低显着性规则),您可以找到Findings事实并在其上调用report方法。 (使用某些适当的Java bean作为事实可能会更方便。)

#2楼 票数:1

这是一种根据通用规则评估任意表达式的方法:

CLIPS> 
(deffunction str-replace (?str ?rpl ?fnd)
   (if (eq ?fnd "") then (return ?str))
   (bind ?rv "")
   (bind ?i (str-index ?fnd ?str))
   (while ?i
      (bind ?rv (str-cat ?rv (sub-string 1 (- ?i 1) ?str) ?rpl))
      (bind ?str (sub-string (+ ?i (str-length ?fnd)) (str-length ?str) ?str))
      (bind ?i (str-index ?fnd ?str)))
   (bind ?rv (str-cat ?rv ?str)))
CLIPS>    
(deftemplate audit-fact 
    (slot domain)   
    (slot machine)                                   
    (slot name)                                   
    (slot value))
CLIPS>   
(deftemplate rule
    (slot domain) 
    (slot name) 
    (slot constraint)
    (multislot reasons) 
    (multislot references) 
    (slot criticality))
CLIPS> 
(deffacts initial
   (audit-fact 
      (domain config) 
      (machine drl-a-15_0) 
      (name os-version) 
      (value 5.4))
   (audit-fact 
      (domain state) 
      (machine drl-a-15_0) 
      (name rpm) 
      (value 5023))
   (rule 
      (domain state)
      (name rpm) 
      (constraint "(and (>= ?v 5000) (<= ?v 5500))")
      (criticality critical) 
      (reasons "Low values could cause engine to stall. Prolonged high value could cause engine to heat up."))
   (rule 
      (domain config)
      (name os-version) 
      (constraint "(eq ?v 5.5)")
      (criticality critical) 
      (reasons "OS version must be at 5.5 – no other levels are currently certified.")))
CLIPS> 
(defrule rule-check
   (rule (domain ?d) (name ?n) (constraint ?constraint) (reasons ?r))
   ?p <- (audit-fact (domain ?d) (name ?n) (value ?v))
   =>
   (bind ?constraint (str-replace ?constraint ?v "?v"))
   (if (eval ?constraint)
      then 
      (printout t "checking " ?d ": " ?n " Passed"  crlf)
      else 
      (printout t "checking " ?d ": " ?n " Warning : " ?r crlf)))
CLIPS> (reset)
CLIPS> (run)
checking config: os-version Warning : OS version must be at 5.5 – no other levels are currently certified.
checking state: rpm Passed
CLIPS> 

  ask by Bernie translate from so

未解决问题?本站智能推荐:

2回复

如何使用jsp在Web上部署Clips Expert系统

在听说Jess之前,我已经读完了有关clips专家系统外壳的书。 我正在尝试实现基于Web的专家系统。 我已经在剪辑上编写了代码,但是该程序必须从命令行运行,但是我想在jess中实现它,以便可以与jsp一起使用。 我需要使用jsp提出问题并从用户那里检索答案,然后将这些答案用作事实
4回复

编写专家系统的最佳语言是什么? [关闭]

LISP或Jess之类的东西是最好的选择吗? 我有兴趣编写一个基于用户答案提出建议的程序。 计算方面的考虑并不是一个真正的因素,它几乎就是模式匹配引擎。 此外,我想为此制作一个应用程序并将其放在网上。 更新:我想把它放在博客或网站上,让人们从那里使用它。 我想我的问题是,是否有一个
1回复

从规则jess或drools返回值(专家系统)

在jess中,从规则返回字符串的方式如下: 我的问题是如何实现return函数,这就是我想要的: 如果不可能的话,如何在流口水?
1回复

杰西:使用“非”语法定义规则

杰西不知何故不检查不存在的事实。 我想定义一个这样的规则: 但这似乎是不可能的,因为无论工作内存中是否存在此规则,该规则都永远不会成真! (它确实可以在没有(not ...)的情况下工作,当然,如果存在此事实!)
1回复

我的 CLIPS 代码有什么不好 - 或/和变化或其他 - 如果语法?

这是我将要与 Java 代码连接的 CLIPS 代码。 当我尝试在 WinCLIPS 中加载时,它被写为 FALSE。 我认为问题可能出在 or/and 或 if-else 语法上。
1回复

CLIPS 中的语法

我必须在 CLIPS 中实现一个专家系统,该系统使用的语法可以生成: 我看到了一个教程。 我去了一个图书馆。 在图书馆我看到了一个教程。 我收到来自用户的输入 - 让我们假设它是第一句话 - 我必须打印一条消息,如:YES G1 G4 G3 G8,如果我可以用我的系统解析输入或否,否则
1回复

CLIPS 系统停止,不再继续执行

我正在按照 APG 文档集成 CLIPS 专家系统,感谢伟大的文档,我成功地将 CLIPS 集成到我的 C++ 项目中,我的应用程序持续运行并使用 EnvAssert 方法将事实提供给 CLIPS 系统并调用 EnvRun,一切正常,直到我收到此错误。 一旦我收到此错误,进一步的 Assert
1回复

CLIPS中的输入匹配,语法错误

我必须输入一个症状并想获得问题的名称,但是当我编写去污检查输入时,出现了错误。 代码在后面,请帮忙我认为,问题在调试检查输入中