Pyke 逻辑编程入门(15):知识库之“规则库”
规则库规则库是规则的集合。创建规则库,就是用你喜欢的文本编辑器,编写 .krb 规则文件。 规则库中,可同时包含正向和反向两种推理规则。 为了断言新事实而激活规则库时,正向推理规则即自动运行。可见,正向推理规则不直接用于确定具体事实是否真实。 反向推理规则,直接用于确定某一具体规则的真实性。因此,如果一个事实陈述的名称中,包括知识库名字(更确切地说,是规则库的类型名称),那么,它是这个规则库里的反向推理规则。
注 意
Pyke 首先运行正向规则,然后运行反向规则。 多个规则库并存的原因多个规则库(.krb)文件并存的理由有两个:
以上需求的实现,依靠以下三项功能:
规则库分类规则库是分类组成的。每一类规则库只能有一个规则库处于激活状态。 若要同时激活一些规则库,就应把它们分别放到不同的规则库类别中,并且,这些规则库之间是互相排斥的关系。例如,把 mysql,postgresql 和 oracle 相关的规则库,置入同一规则库类别中。 每个规则库类别,有唯一的名称。在上例中,你要的是两个规则库类别:数据库生成,和 HTML 文档生成。 规则库类别名称,是作为规则库名称,供规则中的事实陈述使用的。这些规则处在某一规则库类别中,但要引用另一规则库类别。例如,在类别 html_generation 中的规则库,需要用名称 database.insert(...) 引用在类别 database 中的规则。 规则库的继承同类别的规则库,通过规则库的继承,共享相关规则。 规则库继承另一规则库的规则,是单向继承。单向继承可达任意深度。正向和反向的推理规则均可继承。 这使得互相排斥的规则库,可以共享上级规则库的规则,从而避免了复制它们。 下面是关于规则库类别的定义:
示例中的 database 和 html_generation,看上去是这样的: 规则库类别 底层规则库名叫 database,由它派生出的规则库,叫做 mysql,postgresql 和 oracle。还有个底层规则库,名叫 html_generation,它派生出了 firefox 和 internet_explorer。 这两个底层规则库,定义了两个规则库类别:
注 意
作为规则库的 .krb 文件,可以保存在你的 Pyke 源文件目录的任何地方,也就是说,文件目录不必与规则库的继承关系相匹配。 任何时候,在规则库类别中,只许有一个规则库激活。 在规则库中,如果某个反向推理规则中的事实陈述,省略了知识库名称,则其默认的名称是规则库类别名,不是规则库名。例如,在 规则库 postgresql 中,事实 insert(...),是指 database.insert(...);而在规则库 firefox 中,make_tag(...) 是指 html_generation.make_tag(...)。
重 要
无论直接或间接地引用规则库类别,引用总会指向处于激活状态的规则库。指向的不会是底层规则库,也不会隐含使用规则库类别。例如,在派生的规则库 postgresql 中,如果规则库 oracle 处于激活,那么,事实陈述 insert(...) 就会结束它对 oracle 中 insert 规则的引用。 如果引用的规则属于外部规则库类别,必须直接引用规则库类别名称。例如,引用规则库类别 html_generation 中规则库 databases 的 insert 规则,应当写出 database.insert(...)。 如此,各个规则库类别中,处于激活的规则库,都可使用。 规则的继承在 Pyke 规则库中,反向推理规则的继承方式,与 Python 类中方法的继承方式,二者之间有重要区别:
注 意
上级规则库中的正向推理规则,必须全部包含在派生规则库中。without 子句,只适用于反向推理规则。 激活规则库把规则库载入内存,只能使其可用,但并未激活运行。要激活它,必须直接用你的 Python 程序。它可以根据不同情况,决定激活不同规则库。 另外,正向推理规则,可根据推理需要,激活多个规则库。但是,如果规则库已经作为规则库类别而激活,那么,只有它的下级子库,可以接着被激活。由于子库继承了已经激活的上级库,因此得到新的规则,而不会使规则减少。规则库激活、正向规则运行时,不会受到其后激活的规则库的干扰妨碍。 在我们的数据库示例中,你的程序会激活底层规则库 database,使其正向推理规则,根据此时正在运行的数据库的情况,确定哪个规则库激活。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |