模式匹配和统一之间的差异?

Eli*_*der 26 pattern-matching unification

我以为我理解Scala和Haskell中的模式匹配与Prolog中的统一不同,但我对Prolog的误解很大.一个无法通过另一个解决的简单问题是什么?谢谢

Ale*_*nov 29

简单说明:模式匹配是单向的,统一是双向的.也就是说,在Prolog中,右侧(与之匹配的那个)可以包括未绑定的变量.例如,如果你有两个未绑定的变量XY,这将很好地工作:

X = Y,
X = 5,
%% Y = 5 now as well
Run Code Online (Sandbox Code Playgroud)

在Erlang中(使用接近Prolog的语法进行模式匹配),该行将X = Y产生错误:variable 'Y' is unbound.请注意,X未绑定很好:它应该是模式匹配的.

当您想要处理部分定义的值时,这可能很有用.一个很好的例子是差异列表.

这也是允许在多种模式下使用Prolog谓词的原因.例如,在斯卡拉/哈斯克尔/二郎,如果你想1)发现A ++ B,2)解方程A ++ X == B,或3)解方程X ++ A == B对于给定的名单AB,你需要写3个独立的功能; 在Prolog中,所有这些工作(以及更多!)都是由一个谓词完成的.


小智 6

我认为将概念形式化是有用的,而不是寻找特定的语言.匹配和统一是在模式匹配和序言的更多上下文中使用的基本概念.

  • 如果存在替换phi使得phi(s)= t,则术语s匹配t
  • 如果存在替换使得phi(s)= phi(t),则术语s与术语t统一

举一个例子,我们检查条件s = f(Y,a)和t = f(a,X)其中X,Y是变量,a是常数.s与t不匹配,因为我们不能普遍量化常数a.但是,s和t有一个统一符:phi = {X\a,Y\a}