在java中为推理过程实现正向链接和反向链接的最佳方法是什么?
我们获得了Horn形式的知识库,其中包含一系列陈述。
我曾尝试在互联网上搜索,但我无法找到有关如何将这些人工智能概念应用于编码的任何描述。
我的理解:
到目前为止,我已经想到我将阅读每个句子(Horn-Form)并创建它的对象。每个Sentence类对象都有关系变量,当我要求Backward或Forward链的知识库时,它将检查这些对象的数组并构造我想要的链。
public class Sentence{
private String impliedBy;
private String implementedVar;
public Sentence(String sentence){
String[] relation = sentence.split("=>");
this.impliedBy = relation[0];
this.implementedVar = relation[1];
}
...
}
通过说......
来打电话给上课Sentence s = new Sentence("a&b=>c");
我是否正确对不起我是这些复杂编程的菜鸟,根据我的预测,我可能需要进行大量优化才能在非常高的水平上运行这些推理。但似乎有些人需要很好的理解,如果你们中的一些人可以提供帮助,谢谢你......
谢谢!
答案 0 :(得分:6)
在我尝试为自己编写之前,我会使用Drools或JESS之类的规则引擎。
除非您的目的是学习如何编写Rete规则引擎,否则我将撤回我的答案。我去寻找Charles Forgy's篇论文。
答案 1 :(得分:2)
检查这些链接 - 可能有用
http://snipplr.com/view/56296/ai-forward-chaining-implementation-for-propositional-logic-horn-form-knowledge-bases/
http://snipplr.com/view/56297/ai-backward-chaining-implementation-for-propositional-logic-horn-form-knowledge-bases/
答案 2 :(得分:1)
查看here,了解如何在变量数量的线性时间内进行链接工作(请注意片段中的实现如何循环遍历议程中每个变量的子句)。它没有代码,但Hornsat真的不难编码。
答案 3 :(得分:1)
OPS5等系统通常都有一个推理组件 使用正向链接。另一方面通常是Prolog 使用反向链接。
向前和向前后向链接可以被视为不同的 处理决议的策略。而正向链接 对应于单位分辨率,反向链接将 对应于输入分辨率。
也可以构建可以包含的系统 在一个受控制的内向后链接内向链接 办法。其中一个系统是Jekejeke Minlog。
Marvin Minsky的可能实施方式 将HornClauses看作一个网络。 HornClauses那个 有一个头部X和HornClauses,身体有一个X. 会有联系。
A <- D, X X <- G
| |
+------+
现在HornClause的身体充当了一种AND门, 因为不同的HornClauses可以拥有相同的头部 还有一个OR门。现在尝试编程 在这些大门上传播真理的东西。
再见
答案 4 :(得分:0)
通过使用:
可能也会有所帮助HashMap map = new HashMap(); map.put(impliedBy,impliedVar);
简单地获取var:String value = map.get(impliedBy)。