这是一篇关于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看起来直到找到解决方案?
答案 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;
d = d
的统一是术语的匹配,并不构成归属或约束力;
c = W
的统一形成了归因,变量W
与术语c
绑定,因为之前未绑定 - 将执行比较否则;
X = g(Y)
的统一只是将未绑定的变量X
绑定到术语g(Y)
,而g(Y)
是一个带有未绑定变量的术语,因为没有可用于g(Y)
的统一。
问候!