我已经尝试过很多搜索,即便如此,如果有类似的帖子我也会道歉。
据我所知,规则引擎基本上有两种推理方法,即前向和后向链接。我也相信我理解两者是如何单独工作的,但是具有混合推理功能的引擎将如何首先执行前向链接然后向后执行,反之亦然?或者引擎是否有可能根据知识库和工作记忆中的事实来决定使用哪种推理?
另外,如果我想用两种推理方法构建引擎,是否正在增强使用的匹配算法(Rete,Treat等)的启动方式?
我知道我问了很多问题,如果有人可以回答或参考我的一些文献,我会真的很感激。
谢谢!
答案 0 :(得分:1)
我建议看看Jess和Drools。这两个工具都实现了向前和向后链接,因此您可以看看它是如何实际实现的。
在正向链接工具中实现反向链接的一种方法是实现自动目标生成,同时提供可以匹配这些目标的模式。例如,以下是用CLIPS编写的汽车维修程序的一些规则摘录(仅支持正向链接):
(defrule determine-engine-state ""
(not (engine-starts ?))
(not (repair ?))
=>
(assert (engine-starts (yes-or-no-p "Does the engine start (yes/no)? "))))
(defrule determine-rotation-state ""
(engine-starts no)
(not (repair ?))
=>
(assert (engine-rotates (yes-or-no-p "Does the engine rotate (yes/no)? "))))
(defrule determine-gas-level ""
(engine-starts no)
(engine-rotates yes)
(not (repair ?))
=>
(assert (tank-has-gas
(yes-or-no-p "Does the tank have any gas in it (yes/no)? "))))
(defrule tank-out-of-gas ""
(tank-has-gas no)
(not (repair ?))
=>
(assert (repair "Add gas.")))
提出问题的规则将先决条件信息包含在更难以维护的条件中。
使用自动目标生成,规则可以像这样重写:
(defrule determine-engine-state ""
(goal (engine-starts ?))
=>
(assert (engine-starts (yes-or-no-p "Does the engine start (yes/no)? "))))
(defrule determine-rotation-state ""
(goal (engine-rotates ?))
=>
(assert (engine-rotates (yes-or-no-p "Does the engine rotate (yes/no)? "))))
(defrule determine-gas-level ""
(goal (tank-has-gas ?))
=>
(assert (tank-has-gas
(yes-or-no-p "Does the tank have any gas in it (yes/no)? "))))
(defrule tank-out-of-gas ""
(not (repair ?))
(engine-starts no)
(engine-rotates yes)
(tank-has-gas no)
=>
(assert (repair "Add gas.")))
在这种情况下,提出问题的规则被简化并且更容易维护。只要存在特定类型事实的目标,就会询问用户其值。无需编码问题的先决条件信息。自动目标生成允许坦克气体规则驱动包含目标的规则。如果尚未确定修复,则如果不存在引擎启动事实,则(引擎启动否)模式会自动生成目标(规则引擎可以确定还有另一个规则,确定引擎 - 状态,匹配这个目标事实)。如果用户响应否,则匹配(引擎启动否)模式将导致为引擎旋转事实生成目标(触发确定 - 旋转状态规则)。如果用户回答是,那么(引擎启动否)模式将不会匹配,并且由于没有其他规则适用,执行将停止。
使用这种目标生成方法,反向链接主要用于获取正向链规则所需的数据。