我最近在Mercury中遇到过这个代码示例:
append(X,Y,Z) :-
X == [],
Z := Y.
append(X,Y,Z) :-
X => [H | T],
append(T,Y,NT),
Z <= [H | NT].
作为一名Prolog程序员,我想知道:正常统一之间有什么区别=
以及在此使用的:=
或=>
?
在Mercury reference中,这些运算符的优先级不同,但它们并没有解释差异。
答案 0 :(得分:4)
首先让我们使用缩进重写代码:
append(X, Y, Z) :-
X == [],
Z := Y.
append(X, Y, Z) :-
X => [H | T],
append(T, Y, NT),
Z <= [H | NT].
您似乎必须将所有代码缩进四个空格,这似乎不适用于评论,我的上述评论应该被忽略(我无法删除它们)。
上面的代码不是真正的Mercury代码,它是伪代码。它作为真正的Mercury代码没有意义,因为<=
和=>
运算符用于类型类(IIRC),而不是统一。另外,我之前没有见过:=
运算符,我不确定它是什么。
在这种伪代码风格(我相信)中,作者试图表明:=
是分配类型的统一,其中X
被赋值为Y
。同样,=>
显示X
的解构,<=
显示Z
的构造。此外,==
显示X
与空列表之间的相等性测试。所有这些操作都是统一的类型。编译器知道应该为谓词的每个模式使用哪种类型的统一。对于此代码,有意义的模式是append(in, in, out)
Mercury在这方面与Prolog不同,它知道使用哪种类型的统一,因此可以生成更高效的代码并确保程序模式正确。
此伪代码的真实 Mercury代码将是:
:- pred append(list(T)::in, list(T)::in, list(T)::out) is det.
append(X, Y, Z) :-
X = [],
Z = Y.
append(X, Y, Z) :-
X = [H | T],
append(T, Y, NT),
Z = [H | NT].
请注意,每个统一都是=
,并且添加了谓词和模式声明。
答案 1 :(得分:3)
在具体的Mercury语法中,运算符:=
用于字段更新。
答案 2 :(得分:1)
也许我们无法使用像&#39;:=&#39; &#39;&LT; =&#39; &#39; = GT;&#39; &#39; ==&#39;根据Nancy Mazur的论文中的描述,在最近的Mercury发布中,实际上这些运算符是专门的统一。 &#39; = GT;&#39;代表解构,例如X =&gt; f(Y1,Y2,...,Yn)其中输入X并输出所有Yn。这是半瘫。 &#39;&LT; =&#39;恰恰相反,而且是det。 &#39; ==&#39;用于双方磨削的情况,并且是半自动的。 &#39;:=&#39;就像使用任何其他语言的常规分配操作符一样,它就是它。在较旧的论文中,我甚至看到他们使用&#39; ==&#39;而不是&#39; =&gt;&#39;进行解构。 (我觉得我的英语很糟糕= x =)