【问题标题】:Seemingly unnecessary case in the unification algorithm in SICPSICP统一算法中看似不必要的情况
【发布时间】:2010-11-16 19:21:57
【问题描述】:

我正在尝试理解 SICP here 中描述的统一算法

特别是,在“extend-if-possible”过程中,有一个检查(第一个用星号“*”标记的地方)检查右手“表达式”是否是一个已经绑定的变量到当前帧中的某物:

(define (extend-if-possible var val frame)
  (let ((binding (binding-in-frame var frame)))
    (cond (binding
       (unify-match
        (binding-value binding) val frame))
      ((var? val)                      ; *** why do we need this?
       (let ((binding (binding-in-frame val frame)))
         (if binding
             (unify-match
              var (binding-value binding) frame)
             (extend var val frame))))
      ((depends-on? val var frame)
       'failed)
      (else (extend var val frame)))))

相关评论指出:

"在第一种情况下,如果我们试图匹配的变量没有被绑定,但是我们试图匹配的值本身是一个(不同的)变量,则需要检查该值是否是绑定,如果是,则匹配它的值。如果匹配的双方都未绑定,我们可以将任何一方绑定到另一方。"

但是,我想不出实际上有必要这样做的情况。

认为说的是您当前可能存在以下框架绑定的地方:

{?y = 4}

然后被要求“扩展IfPossible”从 ?z 到 ?y 的绑定。

有了“*”检查,当被要求用“?y”扩展“?z”时,我们看到“?y”已经绑定到4,然后递归地尝试将“?z”与“ 4",这导致我们用 "?z = 4" 扩展框架。

如果没有检查,我们最终会用“?z = ?y”来扩展框架。但在这两种情况下,只要 ?z 还没有绑定到其他东西,我就看不到问题所在。

注意,如果 ?z 已经绑定到其他东西,那么代码不会到达标记为“*”的部分(我们已经递归到与 ?z 已经是匹配)。

经过深思熟虑,我意识到生成“最简单”的 MGU(最通用统一器)可能存在某种争论。例如您可能想要一个具有最少数量的变量引用其他变量的 MGU...也就是说,我们宁愿生成替换 {?x = 4, ?y = 4} 而不是替换 {?x = ?y, ? y = 4}... 但我认为这个算法在任何情况下都不能保证这种行为,因为如果你要求它统一 "(?x 4)" 和 "(?y ?y)" 那么你仍然会以 {?x = ?y, ?y = 4} 结束。如果无法保证行为,为什么还要增加复杂性?

我的推理都正确吗?如果不是,那么需要“*”检查以生成正确 MGU 的反例是什么?

【问题讨论】:

    标签: computer-science scheme sicp unification


    【解决方案1】:

    这是个好问题!

    我认为原因是您不想以循环绑定结束,例如{ ?x = ?y, ?y = ?x }。特别是,如果您省略检查,将(?x ?y)(?y ?x) 统一会给您上面的圆形框架。通过检查,您可以按预期获得框架 { ?x = ?y }。

    帧中的循环绑定是不好的,因为它们可能会导致使用该帧执行替换的函数(例如instantiate)在无限循环中运行。

    【讨论】:

    • 第1点是合理的。赞成。但我不能将其标记为正确,因为我不同意第二个,因为“绑定框架”检查(这就是为什么我说“注意,如果 ?z 已经绑定到其他东西...... ”)。在您的示例中:将 ?x 与 ​​(1 2) 统一服从 { ?y = (1 3), ?x = ?y },首先检查返回 ?y 的 (binding-in-frame ?x frame),因此它是递归的将 ?y 与 (1 2) 统一...再次 (binding-in-frame ?y frame) 返回 (1 3),因此它尝试将 (1 3) 与 (1 2) 统一,这将失败,无需检查右侧是否为变量。
    • 顺便说一句,对于延迟回复感到抱歉-我正在度假,然后我花了一段时间才正确考虑您的答案!感谢您的回答...
    【解决方案2】:

    没有它,您将无法获得最通用的统一器。还有很多工作要做:统一 x 和 y。

    【讨论】:

    • 定义“最一般”? { ?x = ?y, ?y = 4} 如何比 { ?x = 4, ?y = 4 } 更一般?满足第一个不满足第二个的 x 和 y 没有绑定...
    • 是的,你是对的,它与“最通用”的统一器无关。我在这里将变量与定义中的值混淆了:cs.ualberta.ca/~you/courses/325/Mynotes/Log/unif.html 实际上,我还没有看到不尝试尽可能统一的实现...
    • 如果你在它中间停下来,它甚至被称为统一吗?我记得如果你没有统一所有可能的东西,逻辑编程中的教授会扣除一些分数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    相关资源
    最近更新 更多