gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:29:10 24 4
gpt4 key购买 nike

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

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

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

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

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

  3. 规则可能有冲突。所以我可以同时使用“包括所有男性”和“排除所有男性”,在这种情况下,优先级必须解决问题。

  4. 规则是对称的。所以“包括所有男性”等同于“排除所有女性”。

  5. 规则(或子集)可能具有与其关联的元规则(明确定义)。在应用原始规则的任何情况下,或者如果通过推理到达子集,都必须应用这些元规则。因此,如果“排除美国”的元规则附加到“包括所有男性”的规则,并且我为引擎提供“排除所有女性”的规则,它应该能够推断出“排除所有女性”子集等同于“包括所有男性”子集,因此额外应用“排除美国”规则。

我很可能没有第 5 项也能生活,但我确实需要提到的所有其他属性。我的规则和对象都存储在数据库中,并可能在任何阶段更新,因此我需要在需要时实例化“推理引擎”,然后销毁它。

最佳答案

有许多用于 Java 的嵌入式类 Prolog SLD 求解器;我最喜欢的方法是使用 mini-Kanren for Scala ,因为它很干净并且允许你使用 Scala 来懒惰地处理查询结果,但我没有深入使用它。参见 Embedded Prolog Interpreter/Compiler for Java对于其他选项,以及罗斯的回答。

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

  1. 规则的结合:基本 SLD 目标处理;
  2. 规则可能有不同的优先级:Prolog 的 cut 规则允许表示否定,前提是查询是可判定的;
  3. 规则可能会相互冲突:同样,使用 cut 可以确保在满足较高优先级目标的情况下不应用较低优先级的子句。有几种方法可以做到这一点。
  4. 规则是对称的:使用 cut,对于可判定谓词,这很容易得到保证。
  5. 规则(或更确切地说是子集)可能具有与其关联的元规则(明确定义):您的示例似乎表明这等同于 4,因此我不确定我是否明白您的意思。

SLD 求解器相对于基于描述逻辑的工具的优缺点是:

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

如果您在描述逻辑方面没有特别的专业知识,我建议您使用 SLD 求解器。

关于java - 推理引擎根据内部规则计算匹配集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2897484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com