4 Some complete constraint solvers

  1. Q: 解释"As such a repeated case analysis results in general in an exponential running time, we do not allow it to be a part of the constraint solvers."
    A: 对于incomplete constraint solvers,化简出的CSP可能需要指数复杂度的分类讨论才能解决。我们不把这些暴力运算看作求解器的一部分。

4.1 A proof theoretical framework

  1. Q: 如何理解equivalence preserving和consistency preserving的关系?
    A: consistency preserving表示关于空序列为equivalence preserving.
    具体地:回忆投影的定义,则对空序列投影为空元组。
    回忆equivalent w.r.t. \(X\)的定义,知道两个问题关于空序列等价相当于同时有解或同时无解。(如果同时有解则两个投影集合都是空元组构成的单元素集,否则是空集)
    所以

consistency preserving is a weaker property than equivalence preserving.

更一般地,对于某个序列满足equivalence preserving则对于其子序列也满足。

  1. Q: 举一例说明delete from the conclusion all solved constraints.
    A: 例如\(x=y;x\in \{0,1\},y\in\{1,2\}\),则推导出\(x=y;x=1,y=1\),则此时约束\(x=y\)相比\(x=1,y=1\)的定义域没有做任何进一步约束,根据定义\(x=y\) is solved. 所以在导出的结果中删去此约束,得到\(x=1,y=1\).
  2. Q: 对于Domain reduction和transformation,分别从fail,\(\mathcal D\mathcal E\)的变化角度作比较。
    A: 关于fail: Domain reduction的fail是定义域变为空,而transformation的fail是生成了\(\perp\).
    关于\(\mathcal D\mathcal E\): Domain reduction是变量不变,但每个变量各自定义域\(D_i\)可能改变。transformation(可能)在已有的基础上增加新的变量并指定其定义域。即"\(\mathcal D\mathcal E'\) extends \(\mathcal D\mathcal E\)".
  3. Q: 简要阐释"rename, replace, restrict".
    A: transform过程中可能引入新变量,为了防止重名引起混乱可能需要换名再应用规则。
    提示:一定程度上,类比多重积分代入时的换名。都是为了防止重名引起混乱。
    例如\(x=\int_0^1 f(z)dz,f(z)=\int_0^1 xdx\),则代入时变成了\(x=\int_0^1 \int_0^1 tdt dz\).
  4. Q: 一条理论上正确的规则,可能因为什么原因我们不采用它?
    A: 举例:对实际问题解决没有帮助或帮助不大(效率低)。
    证明不出其正确(可靠)。
    在执行过程中难以具体判断现有CSP是否在该规则下closed.(难以判断规则是否可用)
    可能生成无限的derivation序列(“不停机”)或者生成的序列太长。
  5. Q: successful, failed, stabilising三者一定是互斥的吗?
    A: 否。提示:stabilising只是说无法继续应用规则了,这时候可能是既不成功也不失败(一般人的理解),但实际上也有可能恰好成功(失败)。
    注:successful一定stabilising(因为约束被solved之后就被去除,successful一定是所有约束都被去除了,自然不可能再应用任何规则). 而failed时不一定stabilising.
    思考:和图灵机的计算结果对比理解。
  6. Q: In fact, many constraint solvers yield CSPs that are neither solved nor failed: their aim is ()
    A:

to bring the initial CSP to some specific, simpler form that usually satisfies some specific local consistency notion.

4.2 Term equations

  1. Q: 为什么本节引入符号\(\equiv\)
    A: 因为普通的等号被Definition 4.11用作了形式记号,表示term equation. \(\equiv\)才表示“真正的相同”。这样避免混淆。
  2. Q: 如何理解"simultaneously replaced"?
    A: 不可以先代换某个变量,再代换另一个变量。比如把\(x\)变成\(f(y)\)再把\(f(y)\)变成\(f(g(z))\)是不允许的。
  3. Q: 如何理解"instance""more general than"?如何直观理解\(x/y\)一定不会more general than \(y/a\)\(\epsilon\)
    A: 直观上,认为替换之前带有变元\(x_i\)的项是更"general"的,替换后把\(x_i\)具体指定为某个项的结果是具体的"instance".
    注:然而实际上,\(x_i\theta\)中变元个数未必比\(x_i\)少。所以这里只是作名称上的理解而已。
    第二问提示:当\(x/y\)后,原来有的\(y\)和新生成的\(y\)不可区分了。
  4. Q: mgu为什么存在唯一?
    A: 注:前提是unifiable.
    存在性:通过对substitution的某种“复杂度”归纳,可以证明如果unifiable,那就一定存在某个不可再泛化的unifier.
    唯一性:首先注意这里的唯一性是说多个mgu间只能通过一些平凡的换名互相转换。
    具体的唯一性说明贯穿本节后面所有过程。即按照本节后面描述的算法可以得到solved form,且solved form和原始问题的mgu相同,且solved form的mgu是strong mgu故根据strong mgu的性质此处唯一显然
  5. Q: \(x\)\(f(x)\)不能被unify. 那么非solved form的公式集一定不能被unify嘛?
    A: 不一定。例如\(x=f(a),y=f(x)\),则只需\(\{x/f(a),y/f(f(a))\}\)即可。注意此处\(x\)除了在\(x=f(a)\)出现,还在其它地方出现,故不是solved form.

solving of CSPs

  1. Q: 把equation \(s=t\)表示成CSP时,\(\mathcal C,\mathcal D\mathcal E\)分别是什么?具体写出对于\(x=f(y)\)\(\mathcal C\)是什么。
    A: 假设\(s,t\)中共出现\(n\)个变元,所有可能的项构成集合\(\mathcal T\),则\(D_i=\mathcal T,\forall i\in [1..n]\).
    约束是\(\mathcal T^n\)的一个子集,即\(\{(x_1\eta,\cdots,x_n\eta)|\eta是s和t的unifier\}\)
    直接看出\(x\)的替换结果最外层是\(f\). 设\(x\)被替换为\(f(t)\),则\(y\)必然被替换为\(t\). 因此\(\mathcal C\)就是\(\{(f(t),t)|t是项\}\).
  2. Q: 尝试直观概括和记忆UNIF.
    A: 提示:最外层如果是函项,则看最外层的函项是否一致。不断拆,直到至少一侧为裸露变元\(x\),不妨设为左侧。现在就看右侧有没有函项符,含不含\(x\).
    注:其实UNIF规则完全可以写成命令式的算法,便于理解和记忆。
  3. Q: \(\theta\) is a unifier of \(x=t\) and \(\theta\) is a unifier of \(E\)
    为什么等价于
    \(\theta\) is a unifier of \(x=t\) and \(\{x/t\}\theta\) is a unifier of \(E\)
    A: 考察单元素集\(E_1:=\{x=t\}\)\(Var(t)\)中没有\(x\).
    回忆之前引理:\(\{x/t\}\)对于\(E_1\)是strong mgu. 即\(\{x/t\}\gamma=\gamma\),其中\(\gamma\)是任意\(x\)\(t\)的unifier.
    (回忆证明:对\(x\)\(x\{x/t\}\gamma=t\gamma=x\gamma\). 而对于其它变元\(y\),有\(y\{x/t\}=y\)
  4. Q: 朴素的UNIF如果顺利停止(closed),那么一定()。原因是根据closed的定义,可以确认停止时的公式集合\(F\)如果不失败,则一定具有()形式,从而停止时的公式集合\(F\)确定了()。再根据证明过的:每条规则都(),就得到()。
    A: (一空一换行)得到正确结果(即失败时得到正确的fail输出,或成功时得到正确的mgu输出)
    solved(具体地,首先根据UNIF其中的3条规则得到左侧是裸露的变元,其次根据2条得到每个右侧不含左侧变元,且最后根据1条得到每个左侧变元只出现一次。一共用完了所有6条规则的closed标准!
    (\(F\)的strong) mgu
    equivalence preserving
    得到的mgu也是原公式集\(E\)的unifier,且也是原公式集\(E\)的mgu(注:equivalence preserving说明规则保持unifier,但并不直接说明规则保持mgu. 但后者倒不难证明
    举例证明的一个部分:如果\(\theta\)\(\{x=t\}\cup E\)的mgu,则\(\{x/t\}\theta=\theta\)也是\(\{x=t\}\cup E\)的mgu(回忆2.中提到的引理)
    则任意\(\{x=t\}\cup E\)的unifier \(\gamma\)\(\{x/t\}\theta\eta=\gamma\)
    则任意\(\{x=t\}\cup E\{x/t\}\)的unifier \(\gamma'\)\(\{x/t\}\gamma'\)\(\{x=t\}\cup E\)的unifier,则\(\{x/t\}\gamma'=\{x/t\}\theta\eta\),这说明\(\gamma'\)\(\theta\eta\)对于\(x\)之外的变量结果相同。
    再考虑\(x\gamma'=t\gamma'=t\theta\eta=x\theta\eta\),这就说明了\(\gamma'=\theta\eta\),即\(\theta\)也是\(\{x=t\}\cup E\{x/t\}\)的mgu.

The Martelli–Montanari algorithm

  1. Q: 朴素的UNIF会造成发散的解决方法是什么?用一句话概括。
    A: 让所有的“代入”(SUBSTITUTION)规则都应用到“全局”。
  2. Q: 证明终止的常见做法是考察程序运行过程中某变量的单调性。但是此处,equation个数不单调,因为()。而()也不单调,因为SUBSTITUTION. 那么应该考虑什么变量的单调性呢?
    A: DECOMPOSITION规则,公式复杂度之和
    考虑按字典序(lexicographic)的三元组\((uns(E),lfun(E),card(E))\),其中

uns(E): the number of variables in E that are unsolved,
lfun(E): the total number of occurrences of function symbols on the left-hand side of an equation in E,
card(E): the number of equations in E.

注:\(lfun(E)\)中需要考虑嵌套的函项符。
注意这里其实对应着命令式程序中循环的结构。比如写一个命令式程序找mgu,你可以最外层循环是SUBSTITUTION(1条),中间一层循环是剥除函项符的规则和左右调换的规则(2条),最内层循环是删除(1条)。(任何地方出现失败就break循环(2条))(用完了6条规则)

  1. Q: 如何理解“In the terminology adopted at the beginning of this chapter it means that this algorithm is a complete constraint solver.”?
    A: 此算法可以将CSP化简成可以直接生成所有解的简单形式(solved form)。
  2. Q: 如何理解“ the number of rule applications used in an execution of the Martelli– Montanari algorithm is not the right measure of the time complexity of this algorithm.”,这对tackle该算法的inefficiency有何启发?
    A: 因为项的表示是字符串,且容易看到\(n\)次规则应用可能得到\(2^n\)长度(指数长度)字符串,处理这些字符串耗时很多。
    但这个复杂度“不本质”。实际上,设法对项做一些内部表示,不要verbatim抄字符串就可以解决这样的问题。