在java中实现推理过程的前向链接和后向链接的最佳方法是什么?
我们已经获得了喇叭形式的知识库,其中有一组陈述。
我尝试在互联网上搜索,但找不到任何有关如何将此类人工智能概念实施到编码中的描述。
我的理解:
到目前为止我想我会阅读每个句子(Horn-Form)并创建它的一个对象。每个句子类对象都将具有关系变量,当我向知识库询问后向或前向链时,它将检查这些对象的数组并构造我想要的链。
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");
我是否走在正确的轨道上,抱歉,我对这种复杂的编程很菜鸟,根据我的预测,我可能需要大量优化才能在非常高的水平上运行这些推理。但似乎我需要有人的充分理解,谢谢你们,如果你们中的一些人能帮忙的话……
谢谢!
在尝试为自己编写此内容之前,我会使用像 Drools 或 JESS 这样的规则引擎。
除非你的目的是学习如何编写Rete规则引擎,否则我将撤回我的答案。 我会去找Charles Forgy 的论文。
嗯,也可能有帮助的是使用:
HashMap 映射 = new HashMap(); map.put(impliedBy,impliedVar);
要简单地获取 var:String value = map.get(impliedBy)。
查看here了解如何在变量数量的线性时间内进行前向链接工作(注意片段中的实现如何循环遍历议程中每个变量的子句)。它没有代码,但 Hornsat 确实不难编码。
OPS5 等系统通常具有推理组件 使用前向链接。另一方面,Prolog 通常 使用向后链接。
前向和后向链接都可以被视为不同的 处理决议的策略。而前向链接 对应于单位分辨率,向后链接将 对应输入分辨率。
还可以构建包含以下内容的系统: 受控中的前向链接内的后向链接 方式。其中一个系统是Jekejeke Minlog。
马文·明斯基(Marvin Minsky)的可能实现是 将 HornClauses 视为一个网络。霍恩条款 有头部 X 和角子句,主体有 X 将连接。
A <- D, X X <- G
| |
+------+
现在 HornClause 的主体充当一种 AND 门, 并且由于不同的 HornClause 可以有相同的中心词 还涉及一个或门。现在尝试编程 沿着这些大门传播真理的东西。
再见
以下是可能对您有所帮助的前向链接算法。
函数 FOL-FC-ASK(KB,α) 返回替换或 false 输入:KB、知识库、一组 if 一阶定子句 α,查询,原子句子
虽然确实如此 new ← {} // 每次迭代推断的新句子集 对于 KB 中的每条规则执行 (p1 ∧...∧ pn ⟹ q) ← 标准化 - 变量(规则) 对于每个 θ,使得 SUBST (θ,p1 ∧...∧ pn) = SUBST(θ,p'1 ∧ ... ∧ p'n) 对于某些 p'1,...,p'n KB q' ← SUBST(θ,q) 如果 q' 与 KB 或新中已有的某些句子不统一那么 将 q' 添加到新的 ∅ ← 统一 (q',α) 如果 ∅ 没有失败则返回 ∅ 如果 new = {} 则返回 false 添加新内容到知识库
点击这个网站。这里对前向链接的解释更好了。