【问题标题】:What are hybrid inference engines?什么是混合推理引擎?
【发布时间】:2014-12-22 17:48:33
【问题描述】:

我已经为此尝试了很多搜索,即使如此,如果发布了类似的帖子,我深表歉意。

我知道规则引擎基本上有两种推理方法,前向链接和后向链接。我也相信我了解两者是如何单独工作的,但是具有混合推理功能的引擎将如何首先执行前向链接然后后向链接,反之亦然?或者引擎是否有可能根据工作记忆中的知识库和事实来决定使用哪种推理?

另外,如果我想用这两种推理方法构建一个引擎,增强正在使用的匹配算法(Rete、Treat 等)是开始的方式吗?

我知道我问了很多问题,如果有人可以回答或推荐我参考任何部分的文献,我将不胜感激。

谢谢!

【问题讨论】:

    标签: artificial-intelligence rule-engine inference-engine rete


    【解决方案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.")))
    

    在这种情况下,提问的规则被简化并且更容易维护。每当有针对特定类型事实的目标时,都会向用户询问其值。无需对问题的先决条件信息进行编码。自动目标生成允许油箱耗尽规则驱动包含目标的规则。如果尚未确定修复,则 (engine-starts no) 模式会在 engine-starts 事实不存在时自动生成一个目标(规则引擎可以确定存在另一个匹配的规则,define-engine-state关于这个目标事实)。如果用户响应否,则 (engine-starts no) 模式将被匹配,从而为 engine-rotates 事实生成一个目标(触发确定旋转状态规则)。如果用户回答是,则 (engine-starts no) 模式将不匹配,并且由于没有其他规则适用,因此将停止执行。

    通过这种目标生成方法,后向链接基本上用于获取前向链接规则所需的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 2010-11-03
      相关资源
      最近更新 更多