2

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

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

我的问题如下:

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

示例规则可能是:

狗在地区公园必须有项圈

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

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

4

2 回答 2

1

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

有可用于嵌入大多数语言的 Prolog 解释器,但我不确定 PHP5。如果您找不到 Prolog 解释器,您可以拼凑一些简单的东西,在相当短的时间内对您自己创建的规则数据结构进行前向链接推理。您可能对这些关于自动推理的说明感兴趣。

于 2009-03-12T14:31:15.957 回答
1

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

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

于 2009-03-12T15:15:00.033 回答