【问题标题】:Outlook-style rule engineOutlook 风格的规则引擎
【发布时间】:2009-03-12 14:16:32
【问题描述】:

我正在尝试构建一个基于规则的系统来解释数据。但是,我在决定如何构建存储和解释规则的逻辑时遇到问题。

目前,有一个相当复杂的数据库结构,但会处理存储规则数据的各个方面。这个想法是系统将能够模仿 MS Outlook 允许用户添加规则的方式。

我的问题如下:

  1. 我应该使用什么模式将这些规则存储在对象中?
  2. 我应该使用 eval() 还是正确的面向对象来执行规则?

示例规则可能是:

必须有项圈在公园

其中每个元素(狗、必须拥有、项圈、区域、公园)都是要解释的单独逻辑。

非常感谢对上述问题的任何一般性建议!

【问题讨论】:

    标签: php oop rule-engine


    【解决方案1】:

    我从来没有在“现实世界”环境中实现过像您描述的系统,但作为业余项目,我与他们玩过相当多的时间。我首选的方法是使用某种逻辑语言,如Prolog 来进行断言并检查它们。你会断言公园在哪里,拥有什么意味着什么,狗是什么,然后你会制定一个规则,就像你帖子底部括号中的例子一样。很抱歉,我的 Prolog 太生疏了,无法给你一个有用的例子……我玩本土推理语言太久了。

    有可用于嵌入大多数语言的 Prolog 解释器,但我不确定 PHP5。如果您找不到 Prolog 解释器,您可以在相当短的时间内将一些简单的东西组合在一起,以在您自己创建的规则数据结构上执行 forward-chaining inference。您可能对这些关于自动推理的notes 感兴趣。

    【讨论】:

    • Prolog 可能离 PHP 太远了,但这是个好主意。您能否建议一阶逻辑的实现?
    • “FOL 的实现”是什么意思?我帖子中的最后一个链接基本上是实现您自己的 FOL 推理引擎的方法。您可能还想查看 Cyc 项目:opencyc.org
    • 是的,我希望也许有人已经做出了实现这个逻辑过程的东西。至少我可以回顾一下他们是如何构建它的代码库的!
    【解决方案2】:

    可能这个答案对你来说太微不足道/太明显了,但我只是想在我当前的现有项目中如何解决类似的问题,这是一个 Zend 框架应用程序。我想到了 ZF 使用的过滤器和验证器链。我假设您有有限数量的可能输入对象、有限数量的条件/约束和有限数量的操作。在这种情况下,您将首先实例化一个对象并针对一系列条件(验证器)运行它,如果满足所有条件,您将针对 actionChain 运行该对象。在这里,我可能必须实施某种行动优先系统,因为某些行动必须在其他行动之前执行。就像“发送通知”然后“删除”有问题的对象。所以在 ZF 中,我会为每个条件/约束构建一个自定义验证器。我不认为 Outlook 系统非常智能,这意味着我不认为验证器非常通用。

    在数据库中可能有一张用于实际规则的表,一张用于条件,一张用于操作。然后可能有两个多对多表将规则与所有需要的条件和操作链接起来。

    【讨论】:

    • 使用链的想法实际上非常有趣,将链包含在一个对象中,然后可以链接到另一个链等等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多