我已经试着搜索了很多,即便如此,如果有类似的帖子,我道歉。
我知道规则引擎基本上有两种推理方法,前向链接和后向链接。我也相信我理解两者是如何单独工作的,但是一个具有混合推理功能的引擎将如何工作,它会先执行正向链接,然后向后执行,还是反之亦然?或者,引擎是否有可能根据工作内存中的知识库和事实来决定使用哪种推理?
另外,如果我想构建一个具有两种推理方法的引擎,那么增强正在使用的匹配算法(Rete,Treat等)是开始的方法吗?
我知道我问了很多问题,如果有人能回答我或向我推荐一些关于任何部分的文献,我将不胜感激。
谢谢!
发布于 2014-12-24 06:50:19
我建议你看看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.")))在这种情况下,提出问题的规则得到了简化,并且更易于维护。只要有特定类型的事实的目标,就会询问用户其值。不需要对问题的先决条件信息进行编码。自动目标生成允许油箱耗尽规则驱动包含目标的规则。如果还没有确定修复,那么( engine -starts no)模式会在引擎-启动事实不存在的情况下自动生成一个目标(规则引擎可以确定存在另一个规则,确定-引擎-状态,它与这个目标事实相匹配)。如果用户回答否,则将匹配(engine-starts no )模式,从而为engine-rotation事实生成目标(触发确定-旋转-状态规则)。如果用户回答是,那么(engine-starts no)模式将不会匹配,并且由于没有其他规则可用,因此执行将停止。
通过这种目标生成方法,反向链接基本上用于获取前向链接规则所需的数据。
https://stackoverflow.com/questions/27607815
复制相似问题