PHP:Outlook样式规则引擎

时间:2009-03-12 14:16:33

标签: php oop rule-engine

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

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

我的问题如下:

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

      

    必须公园

    每个元素(狗,必须有,项圈,区域,公园)是一个单独的逻辑来解释。

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

2 个答案:

答案 0 :(得分:1)

我从来没有实现像你在“现实世界”环境中所描述的那样的系统,但是我已经将它们作为业余爱好项目玩了很多。我首选的方法是使用某种逻辑语言,如Prolog来进行断言并检查它们。你有关于公园在哪里,拥有什么意味着什么,狗是什么的断言,然后你的规则几乎就像你帖子底部括号中的例子一样。对不起,我的Prolog太生疏了,无法给你一个有用的例子......我已经玩过本土的推理语言太久了。

虽然我不确定PHP5,但Prolog解释器可用于嵌入大多数语言。如果你找不到Prolog解释器,你可以把你自己创建的规则数据结构上的forward-chaining inference简单的东西放在一起。您可能对自动推理中的这些notes感兴趣。

答案 1 :(得分:1)

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

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