智力
< COL/>
< COL/>
信息:intelligent是一个针对python的领域特定语言和规则引擎。
作者:迈克尔·约瑟夫·沃尔什
<H3>1。什么是智力
intelligent是一种dsl("领域特定语言")和python的规则引擎
我是为表达策略来编排和控制动态
网络防御网络安全平台的研究
米特公司的创新计划。
规则引擎提供了一种智能,一种人工智能,
客观地对工作记忆进行推理和理解的能力。
内存保留与系统相关的知识和一组规则
在dsl中编写,描述实现某些
目标.每个规则都有一个可选条件,以及一个或多个
行动。这些行为要么进一步引导系统的行为,
和/或进一步通知系统。引擎是从一些事实开始的,
关于过去或现在情况的真相,并用规则来推断
更多的事实。这些事实引发了更多的规则,从而推断出更多的事实
关于
对于创新计划中的平台,Network Defender使用
DSL授予策略,平台如何响应网络
事件通过隐蔽的网络通道挂载,但没有直接的
语言与规则引擎与网络安全的关系
因此,整个系统可以更广泛地应用于
其他域。
<H3>2。安装
通过设置工具安装
要通过pip安装,请使用pip install intelligent
要通过pypm安装,请使用pypm install intelligent
<H3>3。依赖关系python本身,如果你还没有它的话。我在Python2.7.1、2.7.2、2.7.3上测试了代码。
<H3>4。贡献
源代码在BSD4条款许可下可用。如果你有主意,
希望贡献的代码、错误报告或修复请这样做。
bug和功能请求可以在github上提交。
<H3>5。背景
许多生产规则系统实现都是开源的,例如
jboss drools,rools,jess,lisa,等等。如果你熟悉
Drools语法,Intelligent的语法看起来应该很熟悉。(我不是说
是以它为基础的,因为它并不完全,但我在工作时发现
我会用drools检查语法,如果有意义的话,可以将
流口水的方向,这就是我所做的。)上述实现
可用于其他语言来表示生产规则,但它是
我认为python的代表性不足,因此我认为
语言和规则引擎可以从开源中获益,所以我把
请求进入。
米特公司批准于2011年8月4日发布。
因此,将领域特定语言(DSL)和规则引擎释放到正常开放
希望这样做能扩大它的使用范围并增加它的机会
为可能的采用,同时使项目成熟
将感兴趣的眼球放在上面。
首先,最初假设上述平台
与可用于
python有无数的ruby、java和perl实现,
但令人惊讶的是,我发现没有一个符合这个项目的需要。这导致了
发明一个的想法;简单地键入关键字"python规则
引擎"进入谷歌虽然会返回给你的建议"不要发明
还有另一种规则语言",但是你应该"只写
你在python中的规则,导入并执行它们。
建议可以合并为这样做,否则不符合
"蟒蛇哲学"。当时,我不相信这是真的,也不相信
完全语境化,但不可否认,我还没有写一行
python代码(是的,您正在查看我的第一个python程序。所以,
请让我休息一下。)在此之前也不要使用antlr3。看
回到过去,我坚信发明一个规则引擎并将其抽象出来的行为
在描述和说明特定领域的术语后面是
在上述平台的情况下,网络防御程序的最佳方式
想想这个问题。就像我说的DSL和规则引擎
可用于任何需要"生产规则系统"的情况。
因为没有适合python平台的规则引擎
需要,建立了一个策略语言和朴素的前向链接规则引擎
从零开始。策略语言的语法基于python的一个子集
语言语法。策略dsl在
antlr3 python的解析生成器和运行时。
<H3>6。事实(数据经过推理)
解释器、规则引擎和代码的其余部分,如
用于授予离散网络条件的对象,称为"事实",
也是用python编写的。python的面向对象编程方法
范型中的对象由数据字段和方法组成,并不容易
善于描述"事实"。因为python对象的数据字段
在句法上被称为"属性"可以而且经常被设置在
类的实例,它们在类的实例化之前不存在。
为了让规则引擎工作,它必须能够完全反省
表示条件的对象实例。这证明是非常困难的
除非具有两个属性的属性decorator,"getter"和"setter",
在Python2.6中引入,被采用并正式用于编写这些对象。
巧合的是,在
在python开发人员社区中,java特别不受欢迎。
"python不是java"的欢呼声
因此,您需要将事实编写为python对象的who属性
形式化地表示为属性,对于您想要的属性
结束原因:class ClassA(object):
'''
An example fact
'''
def __init__(self, property0 = None, property1 = None):
'''
ClassA initializer
'''
self._property0 = property0
@property
def property0(self):
return self._property0
@property0.setter
def property0(self, value):
self._property0 = value
7.1导入语句(
importstmts
)
import语句基本上遵循python,但有一些限制。为了
例如,由于以下原因,不支持通配符形式的导入
详细阐述了
此处
并遵循Python2.7.2语法。
importstmt
语句只存在于同一个
根据语法,rulestmt语句的级别,通常位于
策略文件,但不限于。事实上,如果你把你的政策分成
将上次作为类或模块导入的文件作为正在命名的类或模块获胜。
7.2属性语句(
属性
)
< div >
a
attributestmt
的语法图
attributestmt
语句是用于创建策略属性的表达式,是
全局变量,可从规则中访问。
例如,可以编写策略:import logging
first_sum = 0
second_sum = 0
rule "set both first_sum and second_sum to 1":
agenda-group "test_d"
then:
attribute (first_sum, second_sum) = (1,1)
log("first_sum is {0}".format(first_sum), "example", logging.DEBUG)
log("second_sum is {0}".format(second_sum), "example", logging.DEBUG)
rule "add 2":
agenda-group "test_d"
then:
attribute first_sum += 2
attribute second_sum += 2
log("first_sum is {0}".format(first_sum), "example", logging.DEBUG)
log("second_sum is {0}".format(second_sum), "example", logging.DEBUG)
rule "add 3":
agenda-group "test_d"
then:
attribute first_sum += 3
attribute second_sum += 3
log("first_sum is {0}".format(first_sum), "example", logging.DEBUG)
log("second_sum is {0}".format(second_sum), "example", logging.DEBUG)
rule "add 4":
agenda-group "test_d"
then:
attribute first_sum += 4
attribute second_sum += 4
log("first_sum is {0}".format(first_sum), "example", logging.DEBUG)
log("second_sum is {0}".format(second_sum), "example", logging.DEBUG)
halt
rule "should never get here":
agenda-group "test_d"
then:
log("Then how did I get here?", "example", logging.DEBUG)
包含两条语句:first_sum = 0
second_sum = 0
以下规则将使用attributeAction增加这两个属性
声明。
执行此策略的代码如下:class MyIntellect(Intellect):
pass
if __name__ == "__main__":
# set up logging for the example
logger = logging.getLogger('example')
logger.setLevel(logging.DEBUG)
consoleHandler = logging.StreamHandler(stream=sys.stdout)
consoleHandler.setFormatter(logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s%(message)s'))
logger.addHandler(consoleHandler)
myIntellect = MyIntellect()
policy_d = myIntellect.learn(Intellect.local_file_uri("./rulesets/test_d.policy"))
myIntellect.reason(["test_d"])
执行上述操作的日志输出为:2011-10-04 23:56:51,681 example DEBUG __main__.MyIntellect :: first_sum is 1
2011-10-04 23:56:51,682 example DEBUG __main__.MyIntellect :: second_sum is 1
2011-10-04 23:56:51,683 example DEBUG __main__.MyIntellect :: first_sum is 3
2011-10-04 23:56:51,683 example DEBUG __main__.MyIntellect :: second_sum is 3
2011-10-04 23:56:51,685 example DEBUG __main__.MyIntellect :: first_sum is 6
2011-10-04 23:56:51,685 example DEBUG __main__.MyIntellect :: second_sum is 6
2011-10-04 23:56:51,687 example DEBUG __main__.MyIntellect :: first_sum is 10
2011-10-04 23:56:51,687 example DEBUG __main__.MyIntellect :: second_sum is 10
另一个例子,请参见第7.3.3.1.2节。