Pyke 逻辑编程入门(15):知识库之“规则库”

前端之家收集整理的这篇文章主要介绍了Pyke 逻辑编程入门(15):知识库之“规则库”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

规则库


规则库是规则的集合。创建规则库,就是用你喜欢的文本编辑器,编写 .krb 规则文件

规则库中,可同时包含正向和反向两种推理规则。

为了断言新事实而激活规则库时,正向推理规则即自动运行。可见,正向推理规则不直接用于确定具体事实是否真实。

反向推理规则,直接用于确定某一具体规则的真实性。因此,如果一个事实陈述的名称中,包括知识库名字(更确切地说,是规则库的类型名称),那么,它是这个规则库里的反向推理规则。

注 意

Pyke 首先运行正向规则,然后运行反向规则。
正向推理规则中的事实陈述,禁止以规则库名称当做知识库名称,因为这扰乱了两种规则的运行顺序。


多个规则库并存的原因

多个规则库(.krb)文件并存的理由有两个:

  • 把大量规则分解成便于人工管理的单位。

    因此要求 Pyke 把全部规则库组合起来。

    例如,你有些规则控制 sql 语句的自动生成,还有些规则控制 HTML 文档的生成。为了便于管理这些规则,把它们放在不同规则库中。
  • 为了让你的 Python 程序,能在不同规则库之间,做出适合不同需要的选择。

    例如,一些控制 sql 语句自动生成的规则,可能非常依赖所运行的数据库(如 MysqL,postgresql,oracle 等)。
    这时,你可以要求 Pyke,根据所要运行的数据库,选择相应的规则库。在同一时间段,你只需要一个规则库,因而,这些规则库是各自独立、互相排斥的。

以上需求的实现,依靠以下三项功能

  • 规则库分类
  • 规则库继承
  • 规则库激活

规则库分类

规则库是分类组成的。每一类规则库只能有一个规则库处于激活状态。

若要同时激活一些规则库,就应把它们分别放到不同的规则库类别中,并且,这些规则库之间是互相排斥的关系。例如,把 MysqL,postgresql 和 oracle 相关的规则库,置入同一规则库类别中。

每个规则库类别,有唯一的名称。在上例中,你要的是两个规则库类别:数据库生成,和 HTML 文档生成

规则库类别名称,是作为规则库名称,供规则中的事实陈述使用的。这些规则处在某一规则库类别中,但要引用另一规则库类别。例如,在类别 html_generation 中的规则库,需要用名称 database.insert(...) 引用在类别 database 中的规则。

规则库的继承

同类别的规则库,通过规则库的继承,共享相关规则。

规则库继承另一规则库的规则,是单向继承。单向继承可达任意深度。正向和反向的推理规则均可继承。

这使得互相排斥的规则库,可以共享上级规则库的规则,从而避免了复制它们。

下面是关于规则库类别的定义:

  • 处于继承关系最底层的规则库,定义了唯一的规则库类别。从这一规则库类别中,直接或间接继承产生的规则,属于同一规则库类别。
  • 规则库类别的名称,就是继承关系中最底层规则库的名称

示例中的 database 和 html_generation,看上去是这样的:

规则库类别

底层规则库名叫 database,由它派生出的规则库,叫做 MysqL,postgresql 和 oracle。还有个底层规则库,名叫 html_generation,它派生出了 firefox 和 internet_explorer。

这两个底层规则库,定义了两个规则库类别:

  • database,包含着:
  • html_generation,包含着:
    • 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 类中方法的继承方式,二者之间有重要区别:

  • 在 Python 的派生类中,定义的方法名字,若与其父类的相同,只有派生类中的方法会被调用
  • 与此相反。在 Pyke 派生的规则库中,如果为某一目标定义了反向推理规则,而且,在上级规则库中也有这种规则,那么,派生的规则会扩展使用上级规则,以便证明这一目标。派生规则首先试用证明目标,若其全部失败,再去尝试上级规则。

    对于某一具体目标,如果不用上级规则,那么,在派生规则库开头扩展子句 without 处,必须列出该目标的名称
注 意

上级规则库中的正向推理规则,必须全部包含在派生规则库中。without 子句,只适用于反向推理规则。


激活规则库

把规则库载入内存,只能使其可用,但并未激活运行。要激活它,必须直接用你的 Python 程序。它可以根据不同情况,决定激活不同规则库。

另外,正向推理规则,可根据推理需要,激活多个规则库。但是,如果规则库已经作为规则库类别而激活,那么,只有它的下级子库,可以接着被激活。由于子库继承了已经激活的上级库,因此得到新的规则,而不会使规则减少。规则库激活、正向规则运行时,不会受到其后激活的规则库的干扰妨碍。

在我们的数据库示例中,你的程序会激活底层规则库 database,使其正向推理规则,根据此时正在运行的数据库的情况,确定哪个规则库激活。

猜你在找的Postgre SQL相关文章