特別描述的,在程序的統一算法「延長-IF-可能」,有一個檢查(第1名標有星號「*」),其檢查,看看是否右手「表達」是已經被綁定到的東西在當前幀中一個變量:
(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}
,然後被要求「extendIfPossible」從Z A結合到y
連稱「*」檢查目前,當aske?。 d將「?z」擴展爲「?y」,我們看到「?y」已經綁定到4,然後遞歸地嘗試將「?z」與「4」統一起來,這導致我們將幀擴展爲「 ?z = 4「。
沒有檢查,我們最終會延長框架,只是「?z =?y」。但是在這兩種情況下,只要?z沒有被綁定到別的東西上,我就沒有看到問題。請注意,如果?z 已有已被綁定到其他東西,那麼代碼不會到達標記爲「*」的部分(我們已經遞歸與已經匹配的內容進行了統一)。
經過深思熟慮後,我意識到可能存在某種用於生成「最簡單」MGU(最一般統一體)的論點。例如你可能想要一個具有最少數量變量的MGU來引用其他變量......也就是說,我們寧願生成替換{?x = 4,?y = 4}而不是替換{?x =?y,? y = 4} ...但我不認爲這個算法會在任何情況下保證這種行爲,因爲如果你要求它將「(?x 4)」與「(?y?y)」統一起來,那麼你仍然會最終得到{?x =?y,?y = 4}。如果行爲無法得到保證,爲什麼會增加複雜性?
我的推理在這裏都是正確的嗎?如果不是,那麼需要使用「*」檢查以產生正確的 MGU的反例是什麼?
定義「最一般」? {?x =?y,?y = 4}如何比{?x = 4,?y = 4}更普遍?對x和y沒有約束力,滿足第一個不滿足第二個的要求...... – 2009-08-10 14:09:25
是的,你說得對,它與'最普通'的統一者無關。我將這些變量與定義處的值混淆在一起:http://www.cs.ualberta.ca/~you/courses/325/Mynotes/Log/unif.html 實際上,我還沒有看到一個實現儘量不要儘量統一...... – 2009-08-10 14:46:02