“:=”和“=>”在水星

时间:2011-08-03 16:43:17

标签: unification logic-programming mercury

我最近在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中,这些运算符的优先级不同,但它们并没有解释差异。

3 个答案:

答案 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 =)