Eli*_*der 26 pattern-matching unification
我以为我理解Scala和Haskell中的模式匹配与Prolog中的统一不同,但我对Prolog的误解很大.一个无法通过另一个解决的简单问题是什么?谢谢
Ale*_*nov 29
简单说明:模式匹配是单向的,统一是双向的.也就是说,在Prolog中,右侧(与之匹配的那个)可以包括未绑定的变量.例如,如果你有两个未绑定的变量X和Y,这将很好地工作:
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对于给定的名单A和B,你需要写3个独立的功能; 在Prolog中,所有这些工作(以及更多!)都是由一个谓词完成的.
小智 6
我认为将概念形式化是有用的,而不是寻找特定的语言.匹配和统一是在模式匹配和序言的更多上下文中使用的基本概念.
举一个例子,我们检查条件s = f(Y,a)和t = f(a,X)其中X,Y是变量,a是常数.s与t不匹配,因为我们不能普遍量化常数a.但是,s和t有一个统一符:phi = {X\a,Y\a}