统一 - 结果的无限

时间:2010-11-09 20:03:51

标签: java prolog clpfd unification successor-arithmetics

我正在开发(使用Java),这是一个有趣的应用程序,它使用统一算法。

我选择了我的统一算法返回所有可能的统一。例如,如果我尝试解决

add(X,Y)= succ(succ(0))

它返回

{X = succ(succ(0)),Y = 0},{X = succ(0),Y = succ(0)},{X = 0,Y = succ(succ(0))}

但是,在某些情况下,存在无数可能的统一 (例如,X> Y = true)。

有人知道算法是否允许确定是否可能遇到无限数量的统一?

提前致谢

2 个答案:

答案 0 :(得分:8)

在Prolog的背景下,当你说“统一”时,通常意味着句法统一。因此,添加(X,Y)和succ(succ(0)),不统一(作为术语),因为它们的仿函数和arities不同。你似乎指的是统一模理论,其中可以统一诸如add(X,Y)和succ(succ(0))之类的不同术语,只要满足一些额外的方程或谓词。句法统一是可判定的,并且如果在应用最通用的统一者之后,两个术语中仍然存在变量,则可能的统一者的数量是无限的。统一模理论一般不具有决定性。要看到已经基本的问题可以很难考虑,例如统一问题N> 2,整数上的X ^ N + Y ^ N = Z ^ N,如果你可以很容易地在算法上决定是否存在解(即,这些项是否是统一的模整数运算),将立即解决费马的最后定理。还要考虑Matiyasevich的定理和类似的不可判定性结果。

答案 1 :(得分:3)

在某些constraint logic programming systems中,您可以轻松查看解决方案集是否无限。例如,在一些CLP(FD)实现中(即SWI-Prolog,Jekejeke Minlog,其他实现,如GNU Prolog和B-Prolog没有,因为它们假设有限的上/下限),使用无限整数集的某种程度的推理是因此得到支持间隔符号如(SWI-Prolog):

可以看到这一点
?- use_module(library(clpfd)).
true.

?- X #\= 2.
X in inf..1\/3..sup.

但是这些集合存在缺点,它们不能用于CLP(FD)标记,其中枚举集合的元素并且进一步尝试解决实例化的方程。如果可以通常做一些事情来决定CLP(FD)查询,它也会与以下结果背道而驰:

  

" 1900年,为了表彰他们的深度,大卫希尔伯特提出了这个问题   所有丢番图问题的可解性都是他的第十个问题   着名的问题。 1970年,一种新颖的数学逻辑结果   被称为Matiyasevich的定理消极地解决了这个问题:in   一般的丢番图问题是无法解决的。"   (来自维基百科Diophantine equations

另一种通常也可以处理无限解集的约束逻辑编程是CLP(R)。方程之间的推理在那里有点强。例如,CLP(FD)没有检测到以下不一致(取决于系统,这是SWI-Prolog的结果,在Jekejeke Minlog中你会立即看到第二个查询的No,并且GNU Prolog将循环大约4秒然后说不):

?- X #> Y.
Y#=<X+ -1.

?- X #> Y, Y #> X.
X#=<Y+ -1,
Y#=<X+ -1.

另一方面,CLP(R)会找到:

?- use_module(library(clpr)).

?- {X > Y}.
{Y=X-_G5542, _G5542 > 0.0}.

?- {X > Y, Y > X}.
false.

约束系统通过从数论,线性代数,分析等实现算法来工作。取决于它们建模的域,即在符号CLP(*)中表示*。这些算法可以达到quantifier elimination

再见