这是过去考试中关于 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 一直查找直到找到解决方案?
这是过去考试中关于 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 一直查找直到找到解决方案?
是的,它确实统一了,它这样做是因为这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)
。
然后,在 match 上调用相同的方法h(c, d) = h(W, d)
,这给了你c = W
,并且没有其他匹配,因此,在W = c
。
统一后返回答案,通常false
在无法匹配/进一步匹配时返回。
正如 CapelliC 所指出的Y
,在统一过程之后,变量 仍然是未绑定的。统一是在未绑定的变量上执行的,这意味着:
h(c, d) = h(W, d)
return的统一h(_) = h(_)
,这允许统一继续,因为h
是一个术语,而不是一个未绑定的 var;
的统一d = d
是术语的匹配,并不形成归属——或约束力;
统一c = W
形成一个属性,并且变量W
绑定到术语c
,因为它之前没有绑定 - 否则将执行比较;
的统一X = g(Y)
只是将未绑定的变量绑定X
到 term g(Y)
,并且g(Y)
是具有未绑定变量的术语,因为没有可用的统一g(Y)
。
问候!