目录

Rete算法运行时推理

发布于 2023/10/30 更新于 2023/10/30

作者 趣宽科技 码云上的源文件

在”Rete算法和逻辑推理“中介绍了基于规则的Rete网络的构建和数据匹配,进行数据筛选等。本文详细介绍Rete算法的执行及其推理过程。

H1

准备规则和数据

先假设有下面两个规则:

IF (?person 想要 ?item)
    (?store 销售 ?item)
THEN (?person 去了 ?store)

IF (?person 去了 ?store)
    (?employee 工作在 ?store)
THEN (?person 看见了 ?employee)
                    

为了表述方便,规则描述使用英文:

IF (?person wants ?item)
    (?store sells ?item)
THEN (?person visits ?store)

IF (?person visits ?store)
    (?employee  works-at ?store)
THEN (?person sees ?employee)
                    

初始化有以下10条数据:

1.张伟想要汽水
2.王芳想要鞋子
3.李娜想要汽车
4.张敏想要汽车
5.张三工作在4S店
6.李四工作在士多店
7.王五工作在百货商场
8.百货商场销售鞋子
9.4S店销售汽车
10.士多店销售汽水
                    

上面的规则使用rete图来表示就是:

/assets/images/article/math/b8dbfaf7-b9c8-4411-8f54-59b9cf4e7fa6

由于R3规则是B12的结果,所以也可以表示为:

/assets/images/article/math/959b19ae-52ab-42d8-a277-c74e814c4668

使用=>来表示THEN后面的结果。

H1

Rete算法的执行

使用简单的表格来记录每一步执行时需要存储的推断数据。下图针对每一个规则设置一个表格,其中上面的表格存储每个规则匹配的数据;下面表格是规则执行的结果部分,严格来说这里的R1,R2只是规则中的一个模式(Patern)。方便说明我们直接将该模式视为一个规则。

/assets/images/article/math/5fc70cf0-91bc-4d2e-ab30-10be732c0c93

逐个读取事实数据,在读取完前7条数据时,并没有触发需要推断的事实,可以得到:
/assets/images/article/math/7b1f8583-58a3-46be-b177-cb72f2eccd0a

在读取第8条数据"百货商场销售鞋子"时:
/assets/images/article/math/b62ce2f1-4606-4c43-898b-3586a769e091

在读取“百货商场销售鞋子”匹配规则R2,同时也触发了规则一中的THEN部分,也就是"Join R1, R2, with B=D => A visits C”。因此在下面的表格规则一THEN部分,增加了一条“王芳 鞋子, 百货商场”的三元组。由于规则一的结果的触发,同时触发了规则R3和,执行了规则二的结果,也就是“Join R3, R3 with F=H ==> E sees G", 在下面的规则二的THEN部分,增加了”(王芳 百货商场 王五)的三元组。该过程可以理解为“王芳想要鞋子,百货商场卖鞋子,所以王芳去了百货商场,由于王五在百货商场工作,所以王芳在百货商场看到了王五。”

继续读取数据,在读取“4S店销售汽车”后推断数据发生了如下变化:

/assets/images/article/math/74cc7fd9-4f65-4a67-9607-115333707165

最后在读取“士多店销售汽水”后,推断数据的结果如下:

/assets/images/article/math/2b0c73cb-ac86-4327-b7aa-291563ea6d89

H1

推理结果

在将所有数据匹配完成后,可以看到规则匹配的结果也就是Rete算法根据规则推理的结果,也就是规则一和规则二的执行结果,上述表格,可以这样描述推理结果:

张伟想要汽水,去了士多店,看到了李四。
王芳想要鞋子,去了百货商店,看到了王五。
李娜,张敏想要汽车去了4店,看到了张三。