Prolog中的统一

时间:2012-12-13 22:09:51

标签: prolog unification

这是一篇关于Prolog统一的过去考试的问题。 我们应该说,如果他们统一,然后实例化。

f(a,g(b,a)) and f(X,g(Y,X))

这统一了a = X,g(b,a)= g(Y,X)并且很直接

f(g(Y),h(c,d)) and f(X,h(W,d)) 

我不认为这个因为g(Y)= / X而统一,尽管h(c,d)确实与h(W,d)统一。虽然X = g(Y)是可能的,因为大写X看起来直到找到解决方案?

1 个答案:

答案 0 :(得分:4)

是的,它确实统一了,而且它确实是这样,因为g(Y)是一个要评估的术语,以及a - 在你指出的第一个例子中。

您可以在prolog解释器中查看评估:

?- f(g(Y),h(c,d)) = f(X,h(W,d)).
X = g(Y),
W = c.

统一过程以深度优先的方式运作,统一成员并返回每个可用答案,直到无法进一步组合为止。

这意味着f(g(Y),h(c,d)) = f(X,h(W,d))会调用统一方法,找出可用的匹配项:g(Y) = X, h(c, d) = h(W, d)

然后,统一在g(Y) = X上执行,因为没有进一步可能的减少,返回X = g(Y)

然后,在匹配h(c, d) = h(W, d)时会调用相同的方法,这会为您提供c = W,而不会产生其他匹配,因此会导致W = c

在统一之后,将返回答案,并且通常会返回false以指向不可能匹配/进一步匹配的位置。

正如CapelliC指出的那样,在统一过程之后,变量Y仍然是未绑定的。统一是在未绑定的变量上执行的,这意味着:

  • 统一h(c, d) = h(W, d)会返回h(_) = h(_),这样就可以继续统一,因为h是一个术语,而不是未绑定的var;

    < / LI>
  • d = d的统一是术语的匹配,并不构成归属或约束力;

  • c = W的统一形成了归因,变量W与术语c绑定,因为之前未绑定 - 将执行比较否则;

  • X = g(Y)的统一只是将未绑定的变量X绑定到术语g(Y),而g(Y)是一个带有未绑定变量的术语,因为没有可用于g(Y)的统一。

问候!