模式匹配中的变量替换?

时间:2009-06-11 08:27:57

标签: c++ variables pattern-matching expert-system

我正在开发一个推理引擎,这意味着基本上我有一定数量的“事实”,它们基本上代表了某个时刻的世界。连同事实(通常只有两个,起始状态和目标状态)我有很多规则(对于某些问题,可能确实是数百个)。在给定起始状态和一组规则的情况下,推理引擎的目的是找到到达可接受目标状态之一的最短路径。这可以通过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树,甚至是不平衡的,这非常慢,特别是考虑到上述条件。

我喜欢指向这种模式匹配的论文

3 个答案:

答案 0 :(得分:2)

我注意到你的帖子中没有使用统一这个词。这就是你试图实现的算法通常被称为。查看Wikipedia文章;底部有一些参考文献......包括70年代的空间和周期重要的参考文献。

答案 1 :(得分:0)

这里没什么大惊喜,你使用的是O(N)算法,其中一个简单的哈希表就是O(1)。哈希表将为每个属性值存储相应的属性。

答案 2 :(得分:0)

eduffy有它:这称为统一。 Prolog是一种编程语言,旨在完成您正在尝试做的事情,在一般情况下,它使用统一来完成其肮脏的工作。

然而,任何尝试使用Prolog中的Peano公理实现算术的人都可以告诉你它并不总能以最快的方式实现。有一些“约束编程”语言大致相同,但强调提供启发式方法,以帮助求解器尽快找到最佳解决方案。其中一个是Comet