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,包含着:
    • database
    • mysql
    • postgresql
    • oracle
  • 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,使其正向推理规则,根据此时正在运行的数据库的情况,确定哪个规则库激活。


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值