我正在开发一个推理引擎,这意味着基本上我有一定数量的“事实”,它们基本上代表了某个时刻的世界。连同事实(通常只有两个,起始状态和目标状态)我有很多规则(对于某些问题,可能确实是数百个)。在给定起始状态和一组规则的情况下,推理引擎的目的是找到到达可接受目标状态之一的最短路径。这可以通过DFS,BFS或A *等几种算法来完成。该计划的基本结构是:
fact factname attribute1 = "value"; attribute2 = [ 1, 2, 3]; attribute3 = 4; attribute4 = 7; ... endFact rule ruleOne equalsto(attribute, "value") or greaterthan(attribute, 5) > remove(attribute); endRule rule ruleTwo isprimeinteger(attribute) > add(attribute, 1) endRule
在规则中,LHS(>之前的部分)匹配事件factname
中等于“value”的每个属性。在这种情况下,它只有一个,但可能有很多。
这意味着我必须解决变量(通常多次为同一事实),并且规则的LHS可能有多个条件放入和/或具有适当的优先级解析。
问题是:有没有办法解决这种变量有效?我现在正在做的是迭代事实中的每个属性,基本上我生成一个非常大的n-ary树,甚至是不平衡的,这非常慢,特别是考虑到上述条件。
我喜欢指向这种模式匹配的论文
答案 0 :(得分:2)
我注意到你的帖子中没有使用统一这个词。这就是你试图实现的算法通常被称为。查看Wikipedia文章;底部有一些参考文献......包括70年代的空间和周期重要的参考文献。
答案 1 :(得分:0)
这里没什么大惊喜,你使用的是O(N)算法,其中一个简单的哈希表就是O(1)。哈希表将为每个属性值存储相应的属性。
答案 2 :(得分:0)
eduffy有它:这称为统一。 Prolog是一种编程语言,旨在完成您正在尝试做的事情,在一般情况下,它使用统一来完成其肮脏的工作。
然而,任何尝试使用Prolog中的Peano公理实现算术的人都可以告诉你它并不总能以最快的方式实现。有一些“约束编程”语言大致相同,但强调提供启发式方法,以帮助求解器尽快找到最佳解决方案。其中一个是Comet。