推理引擎根据内部规则计算匹配集

Zec*_*tes 7 java logic rule-engine rules inference-engine

我有一组带有属性和一系列规则的对象,当应用于对象集时,它们提供了这些对象的子集.为了使这更容易理解,我将提供一个具体的例子.

我的对象是人,每个人都有三个属性:原籍国,性别和年龄组(所有属性都是离散的).我有一堆规则,比如"来自美国的所有男性",它们与这组较大的对象的子集相对应.

我正在寻找现有的Java"推理引擎"或类似的东西,它将能够从规则映射到一部分人,或者建议如何创建我自己的.我已阅读过规则引擎,但该术语似乎专门用于外部化业务规则的专家系统,通常不包括任何高级形式的推理.以下是我必须处理的更复杂场景的一些示例:

  1. 我需要规则的结合.因此,当提出"包括所有男性"和"排除10-20岁年龄组中的所有美国人"时,我只对美国以外的男性以及美国境内10岁以外的男性感兴趣 - 20岁年龄组.

  2. 规则可能有不同的优先级(明确定义).因此,"排除所有男性"的规则将覆盖"包括所有美国男性"的规则.

  3. 规则可能存在冲突.因此,我可以同时拥有"包括所有男性"和"排除所有男性",在这种情况下,优先级必须解决问题.

  4. 规则是对称的.所以"包括所有男性"相当于"排除所有女性".

  5. 规则(或更确切地说子集)可以具有与它们相关联的元规则(明确定义).必须在应用原始规则的任何情况下应用这些元规则,或者如果通过推理到达子集,则必须应用这些元规则.因此,如果"排除美国"的元规则附加到"包括所有男性"的规则,并且我向引擎提供"排除所有女性"的规则,那么它应该能够推断"排除所有女性"子集相当于"包括所有男性"子集,因此另外应用"排除美国"规则.

我很可能没有项目5,但我确实需要提到的所有其他属性.我的规则和对象都存储在数据库中,并且可以在任何阶段更新,因此我需要在需要时实例化"推理引擎"并在之后销毁它.

Cha*_*art 3

Java 有很多类似 Prolog 的嵌入式 SLD 求解器;我最喜欢的方法是对 Scala 使用mini-Kanren,因为它很干净,并且允许您使用 Scala 延迟处理查询结果,但我还没有深入使用它。请参阅Embedded Prolog Interpreter/Compiler for Java了解其他选项,以及 Ross 的答案。

SLD 求解器可以处理您的所有条件,只要它们具有 Prolog 所具有的一些额外功能:

  1. 规则结合:基本SLD目标处理;
  2. 规则可能有不同的优先级:Prolog 的剪切规则允许表示否定,前提是查询是可判定的;
  3. 规则可能会发生冲突:同样,通过 cut,您可以确保在满足较高优先级目标的情况下不应用较低优先级条款。有几种方法可以做到这一点。
  4. 规则是对称的:通过剪切,对于可判定谓词可以轻松确保这一点。
  5. 规则(或者更确切地说子集)可能有与之关联的元规则(明确定义):您的示例似乎表明这相当于 4,所以我不确定我是否明白您在这里所追求的内容。

与基于描述逻辑的工具相比,SLD 求解器的优点和缺点是:

  1. 编程能力、灵活性:您通常可以找到解决建模困难的编程解决方案,其中描述逻辑可能需要您重新考虑您的模型。但当然,没有胶带意味着描述逻辑解决方案迫使你保持干净,这可能是一个很好的纪律。
  2. 鲁棒性:SLD 求解器是一项非常容易理解的技术,而描述逻辑工具通常距离博士论文的诞生只有几步之遥。
  3. 缺乏语义工具:描述逻辑与一阶逻辑和模型逻辑有很好的联系,并为您提供了一套非常丰富的技术来推理它们。Prolog 的灵活性通常使这变得非常困难。

如果您在描述逻辑方面没有特殊的专业知识,我会推荐 SLD 求解器。