【问题标题】:Variable substitution in pattern matching?模式匹配中的变量替换?
【发布时间】:2010-11-02 01:43:29
【问题描述】:

我正在开发一个推理引擎,这意味着基本上我有一定数量的“事实”,这些“事实”基本上代表了某个时刻的世界。连同事实(通常只有两个,起始状态和目标状态),我有很多规则(对于某些问题,实际上可能有数百个)。推理引擎的目标是,给定一个起始状态和一组规则,找到到达可接受目标状态的最短路径。这可以通过多种算法来完成,例如 DFS、BFS 或 A*。该程序的基本结构是:

事实事实名称 属性1 =“价值”; 属性 2 = [ 1, 2, 3]; 属性3 = 4; 属性4 = 7; ... 最终事实 规则规则一 等于(属性,“值”)或 大于(属性,5) > 删除(属性); 结束规则 规则规则二 isprimeinteger(属性) > 添加(属性,1) 结束规则

在规则中,LHS(> 之前的部分)匹配事实 factname 中的 every 属性,它等于“值”。在这种情况下,它只有一个,但可能有很多。 这意味着我必须解析变量(通常为同一事实多次解析),并且规则的 LHS 可能有多个条件放入和/或具有适当的优先级解析。

问题是:有没有办法有效地解决这类变量?我现在正在做的是迭代事实中的每个属性,基本上我正在生成一个相当大的 n-ary 树,它甚至是不平衡的,这非常慢,尤其是考虑到上述条件。

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

【问题讨论】:

  • 你能更准确地解释你的问题吗?我很难理解它。您如何获得可以从给定状态到达的状态?你说的变量是什么意思? (我只能看到“属性”,这似乎是一个非常特殊的变量。还有其他的吗?)我无法检测到任何模式匹配(或统一),也无法看到标签“专家系统”的相关性'和'c++'。最后,如果您想要最短路径,DFS 似乎不是一个很好的选择。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这并不奇怪,您使用的是 O(N) 算法,其中简单的哈希表将是 O(1)。哈希表将为每个属性值存储相应的属性。

    【讨论】:

    • 不,哈希表在这种情况下没有用。也许这个例子没有给出这个想法,但我可能在 LHS 中有这样的东西:greaterthan(variable_name, 2) 这必须给 variable_name all 值大于 2 的事实属性(可能有很多)。
    • 最好使用该条件更新示例,并且当您使用它时,如果可能的话,添加“isprimeinteger(attribute)”。根本问题是任何有效的解决方案都将利用结构来消除 O(N) 列表遍历。没有结构,就没有效率。
    【解决方案3】:

    eduffy 有它:这叫做统一。 Prolog 是一种编程语言,在一般情况下,它的设计目的是完全按照您的意图去做,并且它使用统一来完成其繁琐的工作。

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

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多